diff --git a/dist/index.js b/dist/index.js index e564a15..f247b81 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1 +1 @@ -(()=>{var __webpack_modules__={5093:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nconst client_1 = __webpack_require__(1295);\n__exportStar(__webpack_require__(3583), exports);\n__exportStar(__webpack_require__(5666), exports);\n__exportStar(__webpack_require__(1295), exports);\nconst client = new client_1.DefaultArtifactClient();\nexports["default"] = client;\n//# sourceMappingURL=artifact.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTA5My5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQ0FBb0M7QUFDbkQ7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxpQkFBaUIsbUJBQU8sQ0FBQyxJQUFtQjtBQUM1QyxhQUFhLG1CQUFPLENBQUMsSUFBOEI7QUFDbkQsYUFBYSxtQkFBTyxDQUFDLElBQTBCO0FBQy9DLGFBQWEsbUJBQU8sQ0FBQyxJQUFtQjtBQUN4QztBQUNBLGtCQUFlO0FBQ2YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9saWIvYXJ0aWZhY3QuanM/YTRmNSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgY2xpZW50XzEgPSByZXF1aXJlKFwiLi9pbnRlcm5hbC9jbGllbnRcIik7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vaW50ZXJuYWwvc2hhcmVkL2ludGVyZmFjZXNcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2ludGVybmFsL3NoYXJlZC9lcnJvcnNcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2ludGVybmFsL2NsaWVudFwiKSwgZXhwb3J0cyk7XG5jb25zdCBjbGllbnQgPSBuZXcgY2xpZW50XzEuRGVmYXVsdEFydGlmYWN0Q2xpZW50KCk7XG5leHBvcnRzLmRlZmF1bHQgPSBjbGllbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcnRpZmFjdC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5093\n')},7214:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval('\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.Timestamp = void 0;\nconst runtime_1 = __webpack_require__(9102);\nconst runtime_2 = __webpack_require__(9102);\nconst runtime_3 = __webpack_require__(9102);\nconst runtime_4 = __webpack_require__(9102);\nconst runtime_5 = __webpack_require__(9102);\nconst runtime_6 = __webpack_require__(9102);\nconst runtime_7 = __webpack_require__(9102);\n// @generated message type with reflection information, may provide speed optimized methods\nclass Timestamp$Type extends runtime_7.MessageType {\n constructor() {\n super("google.protobuf.Timestamp", [\n { no: 1, name: "seconds", kind: "scalar", T: 3 /*ScalarType.INT64*/ },\n { no: 2, name: "nanos", kind: "scalar", T: 5 /*ScalarType.INT32*/ }\n ]);\n }\n /**\n * Creates a new `Timestamp` for the current time.\n */\n now() {\n const msg = this.create();\n const ms = Date.now();\n msg.seconds = runtime_6.PbLong.from(Math.floor(ms / 1000)).toString();\n msg.nanos = (ms % 1000) * 1000000;\n return msg;\n }\n /**\n * Converts a `Timestamp` to a JavaScript Date.\n */\n toDate(message) {\n return new Date(runtime_6.PbLong.from(message.seconds).toNumber() * 1000 + Math.ceil(message.nanos / 1000000));\n }\n /**\n * Converts a JavaScript Date to a `Timestamp`.\n */\n fromDate(date) {\n const msg = this.create();\n const ms = date.getTime();\n msg.seconds = runtime_6.PbLong.from(Math.floor(ms / 1000)).toString();\n msg.nanos = (ms % 1000) * 1000000;\n return msg;\n }\n /**\n * In JSON format, the `Timestamp` type is encoded as a string\n * in the RFC 3339 format.\n */\n internalJsonWrite(message, options) {\n let ms = runtime_6.PbLong.from(message.seconds).toNumber() * 1000;\n if (ms < Date.parse("0001-01-01T00:00:00Z") || ms > Date.parse("9999-12-31T23:59:59Z"))\n throw new Error("Unable to encode Timestamp to JSON. Must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive.");\n if (message.nanos < 0)\n throw new Error("Unable to encode invalid Timestamp to JSON. Nanos must not be negative.");\n let z = "Z";\n if (message.nanos > 0) {\n let nanosStr = (message.nanos + 1000000000).toString().substring(1);\n if (nanosStr.substring(3) === "000000")\n z = "." + nanosStr.substring(0, 3) + "Z";\n else if (nanosStr.substring(6) === "000")\n z = "." + nanosStr.substring(0, 6) + "Z";\n else\n z = "." + nanosStr + "Z";\n }\n return new Date(ms).toISOString().replace(".000Z", z);\n }\n /**\n * In JSON format, the `Timestamp` type is encoded as a string\n * in the RFC 3339 format.\n */\n internalJsonRead(json, options, target) {\n if (typeof json !== "string")\n throw new Error("Unable to parse Timestamp from JSON " + (0, runtime_5.typeofJsonValue)(json) + ".");\n let matches = json.match(/^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(?:Z|\\.([0-9]{3,9})Z|([+-][0-9][0-9]:[0-9][0-9]))$/);\n if (!matches)\n throw new Error("Unable to parse Timestamp from JSON. Invalid format.");\n let ms = Date.parse(matches[1] + "-" + matches[2] + "-" + matches[3] + "T" + matches[4] + ":" + matches[5] + ":" + matches[6] + (matches[8] ? matches[8] : "Z"));\n if (Number.isNaN(ms))\n throw new Error("Unable to parse Timestamp from JSON. Invalid value.");\n if (ms < Date.parse("0001-01-01T00:00:00Z") || ms > Date.parse("9999-12-31T23:59:59Z"))\n throw new globalThis.Error("Unable to parse Timestamp from JSON. Must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive.");\n if (!target)\n target = this.create();\n target.seconds = runtime_6.PbLong.from(ms / 1000).toString();\n target.nanos = 0;\n if (matches[7])\n target.nanos = (parseInt("1" + matches[7] + "0".repeat(9 - matches[7].length)) - 1000000000);\n return target;\n }\n create(value) {\n const message = { seconds: "0", nanos: 0 };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* int64 seconds */ 1:\n message.seconds = reader.int64().toString();\n break;\n case /* int32 nanos */ 2:\n message.nanos = reader.int32();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* int64 seconds = 1; */\n if (message.seconds !== "0")\n writer.tag(1, runtime_1.WireType.Varint).int64(message.seconds);\n /* int32 nanos = 2; */\n if (message.nanos !== 0)\n writer.tag(2, runtime_1.WireType.Varint).int32(message.nanos);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message google.protobuf.Timestamp\n */\nexports.Timestamp = new Timestamp$Type();\n//# sourceMappingURL=timestamp.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzIxNC5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxpQkFBaUI7QUFDakIsa0JBQWtCLG1CQUFPLENBQUMsSUFBc0I7QUFDaEQsa0JBQWtCLG1CQUFPLENBQUMsSUFBc0I7QUFDaEQsa0JBQWtCLG1CQUFPLENBQUMsSUFBc0I7QUFDaEQsa0JBQWtCLG1CQUFPLENBQUMsSUFBc0I7QUFDaEQsa0JBQWtCLG1CQUFPLENBQUMsSUFBc0I7QUFDaEQsa0JBQWtCLG1CQUFPLENBQUMsSUFBc0I7QUFDaEQsa0JBQWtCLG1CQUFPLENBQUMsSUFBc0I7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLG1FQUFtRTtBQUNqRixjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxlQUFlLElBQUk7QUFDdEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUIsNEVBQTRFLGdDQUFnQztBQUM1RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvRUFBb0UsU0FBUyxhQUFhLFNBQVMsUUFBUSxjQUFjO0FBQ3pIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2dlbmVyYXRlZC9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLmpzP2ZjN2QiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlRpbWVzdGFtcCA9IHZvaWQgMDtcbmNvbnN0IHJ1bnRpbWVfMSA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfMiA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfMyA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfNCA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfNSA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfNiA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfNyA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIFRpbWVzdGFtcCRUeXBlIGV4dGVuZHMgcnVudGltZV83Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnb29nbGUucHJvdG9idWYuVGltZXN0YW1wXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwic2Vjb25kc1wiLCBraW5kOiBcInNjYWxhclwiLCBUOiAzIC8qU2NhbGFyVHlwZS5JTlQ2NCovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcIm5hbm9zXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDUgLypTY2FsYXJUeXBlLklOVDMyKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBgVGltZXN0YW1wYCBmb3IgdGhlIGN1cnJlbnQgdGltZS5cbiAgICAgKi9cbiAgICBub3coKSB7XG4gICAgICAgIGNvbnN0IG1zZyA9IHRoaXMuY3JlYXRlKCk7XG4gICAgICAgIGNvbnN0IG1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbXNnLnNlY29uZHMgPSBydW50aW1lXzYuUGJMb25nLmZyb20oTWF0aC5mbG9vcihtcyAvIDEwMDApKS50b1N0cmluZygpO1xuICAgICAgICBtc2cubmFub3MgPSAobXMgJSAxMDAwKSAqIDEwMDAwMDA7XG4gICAgICAgIHJldHVybiBtc2c7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgYFRpbWVzdGFtcGAgdG8gYSBKYXZhU2NyaXB0IERhdGUuXG4gICAgICovXG4gICAgdG9EYXRlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHJ1bnRpbWVfNi5QYkxvbmcuZnJvbShtZXNzYWdlLnNlY29uZHMpLnRvTnVtYmVyKCkgKiAxMDAwICsgTWF0aC5jZWlsKG1lc3NhZ2UubmFub3MgLyAxMDAwMDAwKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgSmF2YVNjcmlwdCBEYXRlIHRvIGEgYFRpbWVzdGFtcGAuXG4gICAgICovXG4gICAgZnJvbURhdGUoZGF0ZSkge1xuICAgICAgICBjb25zdCBtc2cgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICBjb25zdCBtcyA9IGRhdGUuZ2V0VGltZSgpO1xuICAgICAgICBtc2cuc2Vjb25kcyA9IHJ1bnRpbWVfNi5QYkxvbmcuZnJvbShNYXRoLmZsb29yKG1zIC8gMTAwMCkpLnRvU3RyaW5nKCk7XG4gICAgICAgIG1zZy5uYW5vcyA9IChtcyAlIDEwMDApICogMTAwMDAwMDtcbiAgICAgICAgcmV0dXJuIG1zZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW4gSlNPTiBmb3JtYXQsIHRoZSBgVGltZXN0YW1wYCB0eXBlIGlzIGVuY29kZWQgYXMgYSBzdHJpbmdcbiAgICAgKiBpbiB0aGUgUkZDIDMzMzkgZm9ybWF0LlxuICAgICAqL1xuICAgIGludGVybmFsSnNvbldyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IG1zID0gcnVudGltZV82LlBiTG9uZy5mcm9tKG1lc3NhZ2Uuc2Vjb25kcykudG9OdW1iZXIoKSAqIDEwMDA7XG4gICAgICAgIGlmIChtcyA8IERhdGUucGFyc2UoXCIwMDAxLTAxLTAxVDAwOjAwOjAwWlwiKSB8fCBtcyA+IERhdGUucGFyc2UoXCI5OTk5LTEyLTMxVDIzOjU5OjU5WlwiKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBlbmNvZGUgVGltZXN0YW1wIHRvIEpTT04uIE11c3QgYmUgZnJvbSAwMDAxLTAxLTAxVDAwOjAwOjAwWiB0byA5OTk5LTEyLTMxVDIzOjU5OjU5WiBpbmNsdXNpdmUuXCIpO1xuICAgICAgICBpZiAobWVzc2FnZS5uYW5vcyA8IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gZW5jb2RlIGludmFsaWQgVGltZXN0YW1wIHRvIEpTT04uIE5hbm9zIG11c3Qgbm90IGJlIG5lZ2F0aXZlLlwiKTtcbiAgICAgICAgbGV0IHogPSBcIlpcIjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubmFub3MgPiAwKSB7XG4gICAgICAgICAgICBsZXQgbmFub3NTdHIgPSAobWVzc2FnZS5uYW5vcyArIDEwMDAwMDAwMDApLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgaWYgKG5hbm9zU3RyLnN1YnN0cmluZygzKSA9PT0gXCIwMDAwMDBcIilcbiAgICAgICAgICAgICAgICB6ID0gXCIuXCIgKyBuYW5vc1N0ci5zdWJzdHJpbmcoMCwgMykgKyBcIlpcIjtcbiAgICAgICAgICAgIGVsc2UgaWYgKG5hbm9zU3RyLnN1YnN0cmluZyg2KSA9PT0gXCIwMDBcIilcbiAgICAgICAgICAgICAgICB6ID0gXCIuXCIgKyBuYW5vc1N0ci5zdWJzdHJpbmcoMCwgNikgKyBcIlpcIjtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB6ID0gXCIuXCIgKyBuYW5vc1N0ciArIFwiWlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShtcykudG9JU09TdHJpbmcoKS5yZXBsYWNlKFwiLjAwMFpcIiwgeik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluIEpTT04gZm9ybWF0LCB0aGUgYFRpbWVzdGFtcGAgdHlwZSBpcyBlbmNvZGVkIGFzIGEgc3RyaW5nXG4gICAgICogaW4gdGhlIFJGQyAzMzM5IGZvcm1hdC5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEpzb25SZWFkKGpzb24sIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBpZiAodHlwZW9mIGpzb24gIT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcGFyc2UgVGltZXN0YW1wIGZyb20gSlNPTiBcIiArICgwLCBydW50aW1lXzUudHlwZW9mSnNvblZhbHVlKShqc29uKSArIFwiLlwiKTtcbiAgICAgICAgbGV0IG1hdGNoZXMgPSBqc29uLm1hdGNoKC9eKFswLTldezR9KS0oWzAtOV17Mn0pLShbMC05XXsyfSlUKFswLTldezJ9KTooWzAtOV17Mn0pOihbMC05XXsyfSkoPzpafFxcLihbMC05XXszLDl9KVp8KFsrLV1bMC05XVswLTldOlswLTldWzAtOV0pKSQvKTtcbiAgICAgICAgaWYgKCFtYXRjaGVzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIHBhcnNlIFRpbWVzdGFtcCBmcm9tIEpTT04uIEludmFsaWQgZm9ybWF0LlwiKTtcbiAgICAgICAgbGV0IG1zID0gRGF0ZS5wYXJzZShtYXRjaGVzWzFdICsgXCItXCIgKyBtYXRjaGVzWzJdICsgXCItXCIgKyBtYXRjaGVzWzNdICsgXCJUXCIgKyBtYXRjaGVzWzRdICsgXCI6XCIgKyBtYXRjaGVzWzVdICsgXCI6XCIgKyBtYXRjaGVzWzZdICsgKG1hdGNoZXNbOF0gPyBtYXRjaGVzWzhdIDogXCJaXCIpKTtcbiAgICAgICAgaWYgKE51bWJlci5pc05hTihtcykpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcGFyc2UgVGltZXN0YW1wIGZyb20gSlNPTi4gSW52YWxpZCB2YWx1ZS5cIik7XG4gICAgICAgIGlmIChtcyA8IERhdGUucGFyc2UoXCIwMDAxLTAxLTAxVDAwOjAwOjAwWlwiKSB8fCBtcyA+IERhdGUucGFyc2UoXCI5OTk5LTEyLTMxVDIzOjU5OjU5WlwiKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKFwiVW5hYmxlIHRvIHBhcnNlIFRpbWVzdGFtcCBmcm9tIEpTT04uIE11c3QgYmUgZnJvbSAwMDAxLTAxLTAxVDAwOjAwOjAwWiB0byA5OTk5LTEyLTMxVDIzOjU5OjU5WiBpbmNsdXNpdmUuXCIpO1xuICAgICAgICBpZiAoIXRhcmdldClcbiAgICAgICAgICAgIHRhcmdldCA9IHRoaXMuY3JlYXRlKCk7XG4gICAgICAgIHRhcmdldC5zZWNvbmRzID0gcnVudGltZV82LlBiTG9uZy5mcm9tKG1zIC8gMTAwMCkudG9TdHJpbmcoKTtcbiAgICAgICAgdGFyZ2V0Lm5hbm9zID0gMDtcbiAgICAgICAgaWYgKG1hdGNoZXNbN10pXG4gICAgICAgICAgICB0YXJnZXQubmFub3MgPSAocGFyc2VJbnQoXCIxXCIgKyBtYXRjaGVzWzddICsgXCIwXCIucmVwZWF0KDkgLSBtYXRjaGVzWzddLmxlbmd0aCkpIC0gMTAwMDAwMDAwMCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0geyBzZWNvbmRzOiBcIjBcIiwgbmFub3M6IDAgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV80Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfMy5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogaW50NjQgc2Vjb25kcyAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlY29uZHMgPSByZWFkZXIuaW50NjQoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDMyIG5hbm9zICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFub3MgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IHJ1bnRpbWVfMi5Vbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogaW50NjQgc2Vjb25kcyA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnNlY29uZHMgIT09IFwiMFwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzEuV2lyZVR5cGUuVmFyaW50KS5pbnQ2NChtZXNzYWdlLnNlY29uZHMpO1xuICAgICAgICAvKiBpbnQzMiBuYW5vcyA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLm5hbm9zICE9PSAwKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBydW50aW1lXzEuV2lyZVR5cGUuVmFyaW50KS5pbnQzMihtZXNzYWdlLm5hbm9zKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfMi5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wXG4gKi9cbmV4cG9ydHMuVGltZXN0YW1wID0gbmV3IFRpbWVzdGFtcCRUeXBlKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aW1lc3RhbXAuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7214\n')},2965:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval('\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.BytesValue = exports.StringValue = exports.BoolValue = exports.UInt32Value = exports.Int32Value = exports.UInt64Value = exports.Int64Value = exports.FloatValue = exports.DoubleValue = void 0;\n// @generated by protobuf-ts 2.9.1 with parameter long_type_string,client_none,generate_dependencies\n// @generated from protobuf file "google/protobuf/wrappers.proto" (package "google.protobuf", syntax proto3)\n// tslint:disable\n//\n// Protocol Buffers - Google\'s data interchange format\n// Copyright 2008 Google Inc. All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n// * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n// * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n//\n// Wrappers for primitive (non-message) types. These types are useful\n// for embedding primitives in the `google.protobuf.Any` type and for places\n// where we need to distinguish between the absence of a primitive\n// typed field and its default value.\n//\nconst runtime_1 = __webpack_require__(9102);\nconst runtime_2 = __webpack_require__(9102);\nconst runtime_3 = __webpack_require__(9102);\nconst runtime_4 = __webpack_require__(9102);\nconst runtime_5 = __webpack_require__(9102);\nconst runtime_6 = __webpack_require__(9102);\nconst runtime_7 = __webpack_require__(9102);\n// @generated message type with reflection information, may provide speed optimized methods\nclass DoubleValue$Type extends runtime_7.MessageType {\n constructor() {\n super("google.protobuf.DoubleValue", [\n { no: 1, name: "value", kind: "scalar", T: 1 /*ScalarType.DOUBLE*/ }\n ]);\n }\n /**\n * Encode `DoubleValue` to JSON number.\n */\n internalJsonWrite(message, options) {\n return this.refJsonWriter.scalar(2, message.value, "value", false, true);\n }\n /**\n * Decode `DoubleValue` from JSON number.\n */\n internalJsonRead(json, options, target) {\n if (!target)\n target = this.create();\n target.value = this.refJsonReader.scalar(json, 1, undefined, "value");\n return target;\n }\n create(value) {\n const message = { value: 0 };\n globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_5.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* double value */ 1:\n message.value = reader.double();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* double value = 1; */\n if (message.value !== 0)\n writer.tag(1, runtime_3.WireType.Bit64).double(message.value);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message google.protobuf.DoubleValue\n */\nexports.DoubleValue = new DoubleValue$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass FloatValue$Type extends runtime_7.MessageType {\n constructor() {\n super("google.protobuf.FloatValue", [\n { no: 1, name: "value", kind: "scalar", T: 2 /*ScalarType.FLOAT*/ }\n ]);\n }\n /**\n * Encode `FloatValue` to JSON number.\n */\n internalJsonWrite(message, options) {\n return this.refJsonWriter.scalar(1, message.value, "value", false, true);\n }\n /**\n * Decode `FloatValue` from JSON number.\n */\n internalJsonRead(json, options, target) {\n if (!target)\n target = this.create();\n target.value = this.refJsonReader.scalar(json, 1, undefined, "value");\n return target;\n }\n create(value) {\n const message = { value: 0 };\n globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_5.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* float value */ 1:\n message.value = reader.float();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* float value = 1; */\n if (message.value !== 0)\n writer.tag(1, runtime_3.WireType.Bit32).float(message.value);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message google.protobuf.FloatValue\n */\nexports.FloatValue = new FloatValue$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass Int64Value$Type extends runtime_7.MessageType {\n constructor() {\n super("google.protobuf.Int64Value", [\n { no: 1, name: "value", kind: "scalar", T: 3 /*ScalarType.INT64*/ }\n ]);\n }\n /**\n * Encode `Int64Value` to JSON string.\n */\n internalJsonWrite(message, options) {\n return this.refJsonWriter.scalar(runtime_1.ScalarType.INT64, message.value, "value", false, true);\n }\n /**\n * Decode `Int64Value` from JSON string.\n */\n internalJsonRead(json, options, target) {\n if (!target)\n target = this.create();\n target.value = this.refJsonReader.scalar(json, runtime_1.ScalarType.INT64, runtime_2.LongType.STRING, "value");\n return target;\n }\n create(value) {\n const message = { value: "0" };\n globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_5.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* int64 value */ 1:\n message.value = reader.int64().toString();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* int64 value = 1; */\n if (message.value !== "0")\n writer.tag(1, runtime_3.WireType.Varint).int64(message.value);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message google.protobuf.Int64Value\n */\nexports.Int64Value = new Int64Value$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass UInt64Value$Type extends runtime_7.MessageType {\n constructor() {\n super("google.protobuf.UInt64Value", [\n { no: 1, name: "value", kind: "scalar", T: 4 /*ScalarType.UINT64*/ }\n ]);\n }\n /**\n * Encode `UInt64Value` to JSON string.\n */\n internalJsonWrite(message, options) {\n return this.refJsonWriter.scalar(runtime_1.ScalarType.UINT64, message.value, "value", false, true);\n }\n /**\n * Decode `UInt64Value` from JSON string.\n */\n internalJsonRead(json, options, target) {\n if (!target)\n target = this.create();\n target.value = this.refJsonReader.scalar(json, runtime_1.ScalarType.UINT64, runtime_2.LongType.STRING, "value");\n return target;\n }\n create(value) {\n const message = { value: "0" };\n globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_5.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* uint64 value */ 1:\n message.value = reader.uint64().toString();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* uint64 value = 1; */\n if (message.value !== "0")\n writer.tag(1, runtime_3.WireType.Varint).uint64(message.value);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message google.protobuf.UInt64Value\n */\nexports.UInt64Value = new UInt64Value$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass Int32Value$Type extends runtime_7.MessageType {\n constructor() {\n super("google.protobuf.Int32Value", [\n { no: 1, name: "value", kind: "scalar", T: 5 /*ScalarType.INT32*/ }\n ]);\n }\n /**\n * Encode `Int32Value` to JSON string.\n */\n internalJsonWrite(message, options) {\n return this.refJsonWriter.scalar(5, message.value, "value", false, true);\n }\n /**\n * Decode `Int32Value` from JSON string.\n */\n internalJsonRead(json, options, target) {\n if (!target)\n target = this.create();\n target.value = this.refJsonReader.scalar(json, 5, undefined, "value");\n return target;\n }\n create(value) {\n const message = { value: 0 };\n globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_5.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* int32 value */ 1:\n message.value = reader.int32();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* int32 value = 1; */\n if (message.value !== 0)\n writer.tag(1, runtime_3.WireType.Varint).int32(message.value);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message google.protobuf.Int32Value\n */\nexports.Int32Value = new Int32Value$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass UInt32Value$Type extends runtime_7.MessageType {\n constructor() {\n super("google.protobuf.UInt32Value", [\n { no: 1, name: "value", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }\n ]);\n }\n /**\n * Encode `UInt32Value` to JSON string.\n */\n internalJsonWrite(message, options) {\n return this.refJsonWriter.scalar(13, message.value, "value", false, true);\n }\n /**\n * Decode `UInt32Value` from JSON string.\n */\n internalJsonRead(json, options, target) {\n if (!target)\n target = this.create();\n target.value = this.refJsonReader.scalar(json, 13, undefined, "value");\n return target;\n }\n create(value) {\n const message = { value: 0 };\n globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_5.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* uint32 value */ 1:\n message.value = reader.uint32();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* uint32 value = 1; */\n if (message.value !== 0)\n writer.tag(1, runtime_3.WireType.Varint).uint32(message.value);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message google.protobuf.UInt32Value\n */\nexports.UInt32Value = new UInt32Value$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass BoolValue$Type extends runtime_7.MessageType {\n constructor() {\n super("google.protobuf.BoolValue", [\n { no: 1, name: "value", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }\n ]);\n }\n /**\n * Encode `BoolValue` to JSON bool.\n */\n internalJsonWrite(message, options) {\n return message.value;\n }\n /**\n * Decode `BoolValue` from JSON bool.\n */\n internalJsonRead(json, options, target) {\n if (!target)\n target = this.create();\n target.value = this.refJsonReader.scalar(json, 8, undefined, "value");\n return target;\n }\n create(value) {\n const message = { value: false };\n globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_5.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* bool value */ 1:\n message.value = reader.bool();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* bool value = 1; */\n if (message.value !== false)\n writer.tag(1, runtime_3.WireType.Varint).bool(message.value);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message google.protobuf.BoolValue\n */\nexports.BoolValue = new BoolValue$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass StringValue$Type extends runtime_7.MessageType {\n constructor() {\n super("google.protobuf.StringValue", [\n { no: 1, name: "value", kind: "scalar", T: 9 /*ScalarType.STRING*/ }\n ]);\n }\n /**\n * Encode `StringValue` to JSON string.\n */\n internalJsonWrite(message, options) {\n return message.value;\n }\n /**\n * Decode `StringValue` from JSON string.\n */\n internalJsonRead(json, options, target) {\n if (!target)\n target = this.create();\n target.value = this.refJsonReader.scalar(json, 9, undefined, "value");\n return target;\n }\n create(value) {\n const message = { value: "" };\n globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_5.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* string value */ 1:\n message.value = reader.string();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* string value = 1; */\n if (message.value !== "")\n writer.tag(1, runtime_3.WireType.LengthDelimited).string(message.value);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message google.protobuf.StringValue\n */\nexports.StringValue = new StringValue$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass BytesValue$Type extends runtime_7.MessageType {\n constructor() {\n super("google.protobuf.BytesValue", [\n { no: 1, name: "value", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }\n ]);\n }\n /**\n * Encode `BytesValue` to JSON string.\n */\n internalJsonWrite(message, options) {\n return this.refJsonWriter.scalar(12, message.value, "value", false, true);\n }\n /**\n * Decode `BytesValue` from JSON string.\n */\n internalJsonRead(json, options, target) {\n if (!target)\n target = this.create();\n target.value = this.refJsonReader.scalar(json, 12, undefined, "value");\n return target;\n }\n create(value) {\n const message = { value: new Uint8Array(0) };\n globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_5.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* bytes value */ 1:\n message.value = reader.bytes();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* bytes value = 1; */\n if (message.value.length)\n writer.tag(1, runtime_3.WireType.LengthDelimited).bytes(message.value);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message google.protobuf.BytesValue\n */\nexports.BytesValue = new BytesValue$Type();\n//# sourceMappingURL=wrappers.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjk2NS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxrQkFBa0IsR0FBRyxtQkFBbUIsR0FBRyxpQkFBaUIsR0FBRyxtQkFBbUIsR0FBRyxrQkFBa0IsR0FBRyxtQkFBbUIsR0FBRyxrQkFBa0IsR0FBRyxrQkFBa0IsR0FBRyxtQkFBbUI7QUFDN0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQ7QUFDNUQscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG1CQUFPLENBQUMsSUFBc0I7QUFDaEQsa0JBQWtCLG1CQUFPLENBQUMsSUFBc0I7QUFDaEQsa0JBQWtCLG1CQUFPLENBQUMsSUFBc0I7QUFDaEQsa0JBQWtCLG1CQUFPLENBQUMsSUFBc0I7QUFDaEQsa0JBQWtCLG1CQUFPLENBQUMsSUFBc0I7QUFDaEQsa0JBQWtCLG1CQUFPLENBQUMsSUFBc0I7QUFDaEQsa0JBQWtCLG1CQUFPLENBQUMsSUFBc0I7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLDRFQUE0RSxnQ0FBZ0M7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLFNBQVMsYUFBYSxTQUFTLFFBQVEsY0FBYztBQUN6SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLDRFQUE0RSxnQ0FBZ0M7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLFNBQVMsYUFBYSxTQUFTLFFBQVEsY0FBYztBQUN6SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLDRFQUE0RSxnQ0FBZ0M7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLFNBQVMsYUFBYSxTQUFTLFFBQVEsY0FBYztBQUN6SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLDRFQUE0RSxnQ0FBZ0M7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLFNBQVMsYUFBYSxTQUFTLFFBQVEsY0FBYztBQUN6SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLDRFQUE0RSxnQ0FBZ0M7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLFNBQVMsYUFBYSxTQUFTLFFBQVEsY0FBYztBQUN6SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLDRFQUE0RSxnQ0FBZ0M7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLFNBQVMsYUFBYSxTQUFTLFFBQVEsY0FBYztBQUN6SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLDRFQUE0RSxnQ0FBZ0M7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLFNBQVMsYUFBYSxTQUFTLFFBQVEsY0FBYztBQUN6SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLDRFQUE0RSxnQ0FBZ0M7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLFNBQVMsYUFBYSxTQUFTLFFBQVEsY0FBYztBQUN6SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLDRFQUE0RSxnQ0FBZ0M7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLFNBQVMsYUFBYSxTQUFTLFFBQVEsY0FBYztBQUN6SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9saWIvZ2VuZXJhdGVkL2dvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5qcz84MmU5Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5CeXRlc1ZhbHVlID0gZXhwb3J0cy5TdHJpbmdWYWx1ZSA9IGV4cG9ydHMuQm9vbFZhbHVlID0gZXhwb3J0cy5VSW50MzJWYWx1ZSA9IGV4cG9ydHMuSW50MzJWYWx1ZSA9IGV4cG9ydHMuVUludDY0VmFsdWUgPSBleHBvcnRzLkludDY0VmFsdWUgPSBleHBvcnRzLkZsb2F0VmFsdWUgPSBleHBvcnRzLkRvdWJsZVZhbHVlID0gdm9pZCAwO1xuLy8gQGdlbmVyYXRlZCBieSBwcm90b2J1Zi10cyAyLjkuMSB3aXRoIHBhcmFtZXRlciBsb25nX3R5cGVfc3RyaW5nLGNsaWVudF9ub25lLGdlbmVyYXRlX2RlcGVuZGVuY2llc1xuLy8gQGdlbmVyYXRlZCBmcm9tIHByb3RvYnVmIGZpbGUgXCJnb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG9cIiAocGFja2FnZSBcImdvb2dsZS5wcm90b2J1ZlwiLCBzeW50YXggcHJvdG8zKVxuLy8gdHNsaW50OmRpc2FibGVcbi8vXG4vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXRcbi8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9cbi8vXG4vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbi8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbi8vIG1ldDpcbi8vXG4vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lclxuLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuLy8gZGlzdHJpYnV0aW9uLlxuLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbi8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4vL1xuLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuLy8gXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UXG4vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbi8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuLy9cbi8vXG4vLyBXcmFwcGVycyBmb3IgcHJpbWl0aXZlIChub24tbWVzc2FnZSkgdHlwZXMuIFRoZXNlIHR5cGVzIGFyZSB1c2VmdWxcbi8vIGZvciBlbWJlZGRpbmcgcHJpbWl0aXZlcyBpbiB0aGUgYGdvb2dsZS5wcm90b2J1Zi5BbnlgIHR5cGUgYW5kIGZvciBwbGFjZXNcbi8vIHdoZXJlIHdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgYWJzZW5jZSBvZiBhIHByaW1pdGl2ZVxuLy8gdHlwZWQgZmllbGQgYW5kIGl0cyBkZWZhdWx0IHZhbHVlLlxuLy9cbmNvbnN0IHJ1bnRpbWVfMSA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfMiA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfMyA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfNCA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfNSA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfNiA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfNyA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIERvdWJsZVZhbHVlJFR5cGUgZXh0ZW5kcyBydW50aW1lXzcuTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInZhbHVlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDEgLypTY2FsYXJUeXBlLkRPVUJMRSovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuY29kZSBgRG91YmxlVmFsdWVgIHRvIEpTT04gbnVtYmVyLlxuICAgICAqL1xuICAgIGludGVybmFsSnNvbldyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmSnNvbldyaXRlci5zY2FsYXIoMiwgbWVzc2FnZS52YWx1ZSwgXCJ2YWx1ZVwiLCBmYWxzZSwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlY29kZSBgRG91YmxlVmFsdWVgIGZyb20gSlNPTiBudW1iZXIuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uUmVhZChqc29uLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICB0YXJnZXQgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICB0YXJnZXQudmFsdWUgPSB0aGlzLnJlZkpzb25SZWFkZXIuc2NhbGFyKGpzb24sIDEsIHVuZGVmaW5lZCwgXCJ2YWx1ZVwiKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHZhbHVlOiAwIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNi5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzUucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGRvdWJsZSB2YWx1ZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbHVlID0gcmVhZGVyLmRvdWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV80LlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBkb3VibGUgdmFsdWUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS52YWx1ZSAhPT0gMClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgcnVudGltZV8zLldpcmVUeXBlLkJpdDY0KS5kb3VibGUobWVzc2FnZS52YWx1ZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBydW50aW1lXzQuVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlXG4gKi9cbmV4cG9ydHMuRG91YmxlVmFsdWUgPSBuZXcgRG91YmxlVmFsdWUkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgRmxvYXRWYWx1ZSRUeXBlIGV4dGVuZHMgcnVudGltZV83Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInZhbHVlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDIgLypTY2FsYXJUeXBlLkZMT0FUKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlIGBGbG9hdFZhbHVlYCB0byBKU09OIG51bWJlci5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEpzb25Xcml0ZShtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZkpzb25Xcml0ZXIuc2NhbGFyKDEsIG1lc3NhZ2UudmFsdWUsIFwidmFsdWVcIiwgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNvZGUgYEZsb2F0VmFsdWVgIGZyb20gSlNPTiBudW1iZXIuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uUmVhZChqc29uLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICB0YXJnZXQgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICB0YXJnZXQudmFsdWUgPSB0aGlzLnJlZkpzb25SZWFkZXIuc2NhbGFyKGpzb24sIDEsIHVuZGVmaW5lZCwgXCJ2YWx1ZVwiKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHZhbHVlOiAwIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNi5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzUucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGZsb2F0IHZhbHVlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IHJ1bnRpbWVfNC5Vbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogZmxvYXQgdmFsdWUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS52YWx1ZSAhPT0gMClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgcnVudGltZV8zLldpcmVUeXBlLkJpdDMyKS5mbG9hdChtZXNzYWdlLnZhbHVlKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfNC5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZVxuICovXG5leHBvcnRzLkZsb2F0VmFsdWUgPSBuZXcgRmxvYXRWYWx1ZSRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBJbnQ2NFZhbHVlJFR5cGUgZXh0ZW5kcyBydW50aW1lXzcuTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidmFsdWVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogMyAvKlNjYWxhclR5cGUuSU5UNjQqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGUgYEludDY0VmFsdWVgIHRvIEpTT04gc3RyaW5nLlxuICAgICAqL1xuICAgIGludGVybmFsSnNvbldyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmSnNvbldyaXRlci5zY2FsYXIocnVudGltZV8xLlNjYWxhclR5cGUuSU5UNjQsIG1lc3NhZ2UudmFsdWUsIFwidmFsdWVcIiwgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNvZGUgYEludDY0VmFsdWVgIGZyb20gSlNPTiBzdHJpbmcuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uUmVhZChqc29uLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICB0YXJnZXQgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICB0YXJnZXQudmFsdWUgPSB0aGlzLnJlZkpzb25SZWFkZXIuc2NhbGFyKGpzb24sIHJ1bnRpbWVfMS5TY2FsYXJUeXBlLklOVDY0LCBydW50aW1lXzIuTG9uZ1R5cGUuU1RSSU5HLCBcInZhbHVlXCIpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgdmFsdWU6IFwiMFwiIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNi5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzUucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDY0IHZhbHVlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSByZWFkZXIuaW50NjQoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV80LlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBpbnQ2NCB2YWx1ZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnZhbHVlICE9PSBcIjBcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgcnVudGltZV8zLldpcmVUeXBlLlZhcmludCkuaW50NjQobWVzc2FnZS52YWx1ZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBydW50aW1lXzQuVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWVcbiAqL1xuZXhwb3J0cy5JbnQ2NFZhbHVlID0gbmV3IEludDY0VmFsdWUkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgVUludDY0VmFsdWUkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNy5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidmFsdWVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogNCAvKlNjYWxhclR5cGUuVUlOVDY0Ki8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlIGBVSW50NjRWYWx1ZWAgdG8gSlNPTiBzdHJpbmcuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uV3JpdGUobWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZKc29uV3JpdGVyLnNjYWxhcihydW50aW1lXzEuU2NhbGFyVHlwZS5VSU5UNjQsIG1lc3NhZ2UudmFsdWUsIFwidmFsdWVcIiwgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNvZGUgYFVJbnQ2NFZhbHVlYCBmcm9tIEpTT04gc3RyaW5nLlxuICAgICAqL1xuICAgIGludGVybmFsSnNvblJlYWQoanNvbiwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGlmICghdGFyZ2V0KVxuICAgICAgICAgICAgdGFyZ2V0ID0gdGhpcy5jcmVhdGUoKTtcbiAgICAgICAgdGFyZ2V0LnZhbHVlID0gdGhpcy5yZWZKc29uUmVhZGVyLnNjYWxhcihqc29uLCBydW50aW1lXzEuU2NhbGFyVHlwZS5VSU5UNjQsIHJ1bnRpbWVfMi5Mb25nVHlwZS5TVFJJTkcsIFwidmFsdWVcIik7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0geyB2YWx1ZTogXCIwXCIgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV82Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfNS5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogdWludDY0IHZhbHVlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSByZWFkZXIudWludDY0KCkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IHJ1bnRpbWVfNC5Vbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogdWludDY0IHZhbHVlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudmFsdWUgIT09IFwiMFwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzMuV2lyZVR5cGUuVmFyaW50KS51aW50NjQobWVzc2FnZS52YWx1ZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBydW50aW1lXzQuVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlXG4gKi9cbmV4cG9ydHMuVUludDY0VmFsdWUgPSBuZXcgVUludDY0VmFsdWUkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgSW50MzJWYWx1ZSRUeXBlIGV4dGVuZHMgcnVudGltZV83Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInZhbHVlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDUgLypTY2FsYXJUeXBlLklOVDMyKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlIGBJbnQzMlZhbHVlYCB0byBKU09OIHN0cmluZy5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEpzb25Xcml0ZShtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZkpzb25Xcml0ZXIuc2NhbGFyKDUsIG1lc3NhZ2UudmFsdWUsIFwidmFsdWVcIiwgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNvZGUgYEludDMyVmFsdWVgIGZyb20gSlNPTiBzdHJpbmcuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uUmVhZChqc29uLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICB0YXJnZXQgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICB0YXJnZXQudmFsdWUgPSB0aGlzLnJlZkpzb25SZWFkZXIuc2NhbGFyKGpzb24sIDUsIHVuZGVmaW5lZCwgXCJ2YWx1ZVwiKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHZhbHVlOiAwIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNi5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzUucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDMyIHZhbHVlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IHJ1bnRpbWVfNC5Vbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogaW50MzIgdmFsdWUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS52YWx1ZSAhPT0gMClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgcnVudGltZV8zLldpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS52YWx1ZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBydW50aW1lXzQuVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWVcbiAqL1xuZXhwb3J0cy5JbnQzMlZhbHVlID0gbmV3IEludDMyVmFsdWUkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgVUludDMyVmFsdWUkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNy5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidmFsdWVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogMTMgLypTY2FsYXJUeXBlLlVJTlQzMiovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuY29kZSBgVUludDMyVmFsdWVgIHRvIEpTT04gc3RyaW5nLlxuICAgICAqL1xuICAgIGludGVybmFsSnNvbldyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmSnNvbldyaXRlci5zY2FsYXIoMTMsIG1lc3NhZ2UudmFsdWUsIFwidmFsdWVcIiwgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNvZGUgYFVJbnQzMlZhbHVlYCBmcm9tIEpTT04gc3RyaW5nLlxuICAgICAqL1xuICAgIGludGVybmFsSnNvblJlYWQoanNvbiwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGlmICghdGFyZ2V0KVxuICAgICAgICAgICAgdGFyZ2V0ID0gdGhpcy5jcmVhdGUoKTtcbiAgICAgICAgdGFyZ2V0LnZhbHVlID0gdGhpcy5yZWZKc29uUmVhZGVyLnNjYWxhcihqc29uLCAxMywgdW5kZWZpbmVkLCBcInZhbHVlXCIpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgdmFsdWU6IDAgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV82Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfNS5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogdWludDMyIHZhbHVlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzQuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHVpbnQzMiB2YWx1ZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnZhbHVlICE9PSAwKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzMuV2lyZVR5cGUuVmFyaW50KS51aW50MzIobWVzc2FnZS52YWx1ZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBydW50aW1lXzQuVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlXG4gKi9cbmV4cG9ydHMuVUludDMyVmFsdWUgPSBuZXcgVUludDMyVmFsdWUkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgQm9vbFZhbHVlJFR5cGUgZXh0ZW5kcyBydW50aW1lXzcuTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ2YWx1ZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA4IC8qU2NhbGFyVHlwZS5CT09MKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlIGBCb29sVmFsdWVgIHRvIEpTT04gYm9vbC5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEpzb25Xcml0ZShtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlLnZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNvZGUgYEJvb2xWYWx1ZWAgZnJvbSBKU09OIGJvb2wuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uUmVhZChqc29uLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICB0YXJnZXQgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICB0YXJnZXQudmFsdWUgPSB0aGlzLnJlZkpzb25SZWFkZXIuc2NhbGFyKGpzb24sIDgsIHVuZGVmaW5lZCwgXCJ2YWx1ZVwiKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHZhbHVlOiBmYWxzZSB9O1xuICAgICAgICBnbG9iYWxUaGlzLk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtZXNzYWdlLCBydW50aW1lXzYuTUVTU0FHRV9UWVBFLCB7IGVudW1lcmFibGU6IGZhbHNlLCB2YWx1ZTogdGhpcyB9KTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAoMCwgcnVudGltZV81LnJlZmxlY3Rpb25NZXJnZVBhcnRpYWwpKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBib29sIHZhbHVlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV80LlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBib29sIHZhbHVlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudmFsdWUgIT09IGZhbHNlKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzMuV2lyZVR5cGUuVmFyaW50KS5ib29sKG1lc3NhZ2UudmFsdWUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV80LlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVcbiAqL1xuZXhwb3J0cy5Cb29sVmFsdWUgPSBuZXcgQm9vbFZhbHVlJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIFN0cmluZ1ZhbHVlJFR5cGUgZXh0ZW5kcyBydW50aW1lXzcuTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInZhbHVlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuY29kZSBgU3RyaW5nVmFsdWVgIHRvIEpTT04gc3RyaW5nLlxuICAgICAqL1xuICAgIGludGVybmFsSnNvbldyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2UudmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlY29kZSBgU3RyaW5nVmFsdWVgIGZyb20gSlNPTiBzdHJpbmcuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uUmVhZChqc29uLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICB0YXJnZXQgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICB0YXJnZXQudmFsdWUgPSB0aGlzLnJlZkpzb25SZWFkZXIuc2NhbGFyKGpzb24sIDksIHVuZGVmaW5lZCwgXCJ2YWx1ZVwiKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHZhbHVlOiBcIlwiIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNi5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzUucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB2YWx1ZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbHVlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV80LlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdmFsdWUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS52YWx1ZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgcnVudGltZV8zLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudmFsdWUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV80LlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVxuICovXG5leHBvcnRzLlN0cmluZ1ZhbHVlID0gbmV3IFN0cmluZ1ZhbHVlJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIEJ5dGVzVmFsdWUkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNy5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ29vZ2xlLnByb3RvYnVmLkJ5dGVzVmFsdWVcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ2YWx1ZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiAxMiAvKlNjYWxhclR5cGUuQllURVMqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGUgYEJ5dGVzVmFsdWVgIHRvIEpTT04gc3RyaW5nLlxuICAgICAqL1xuICAgIGludGVybmFsSnNvbldyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmSnNvbldyaXRlci5zY2FsYXIoMTIsIG1lc3NhZ2UudmFsdWUsIFwidmFsdWVcIiwgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNvZGUgYEJ5dGVzVmFsdWVgIGZyb20gSlNPTiBzdHJpbmcuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uUmVhZChqc29uLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICB0YXJnZXQgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICB0YXJnZXQudmFsdWUgPSB0aGlzLnJlZkpzb25SZWFkZXIuc2NhbGFyKGpzb24sIDEyLCB1bmRlZmluZWQsIFwidmFsdWVcIik7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0geyB2YWx1ZTogbmV3IFVpbnQ4QXJyYXkoMCkgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV82Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfNS5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogYnl0ZXMgdmFsdWUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52YWx1ZSA9IHJlYWRlci5ieXRlcygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV80LlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBieXRlcyB2YWx1ZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnZhbHVlLmxlbmd0aClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgcnVudGltZV8zLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuYnl0ZXMobWVzc2FnZS52YWx1ZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBydW50aW1lXzQuVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgZ29vZ2xlLnByb3RvYnVmLkJ5dGVzVmFsdWVcbiAqL1xuZXhwb3J0cy5CeXRlc1ZhbHVlID0gbmV3IEJ5dGVzVmFsdWUkVHlwZSgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d3JhcHBlcnMuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2965\n')},2330:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\n__exportStar(__webpack_require__(7214), exports);\n__exportStar(__webpack_require__(2965), exports);\n__exportStar(__webpack_require__(5812), exports);\n__exportStar(__webpack_require__(5444), exports);\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMzMC5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQ0FBb0M7QUFDbkQ7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxhQUFhLG1CQUFPLENBQUMsSUFBNkI7QUFDbEQsYUFBYSxtQkFBTyxDQUFDLElBQTRCO0FBQ2pELGFBQWEsbUJBQU8sQ0FBQyxJQUEyQjtBQUNoRCxhQUFhLG1CQUFPLENBQUMsSUFBaUM7QUFDdEQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9saWIvZ2VuZXJhdGVkL2luZGV4LmpzPzM2NGYiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9nb29nbGUvcHJvdG9idWYvd3JhcHBlcnNcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3Jlc3VsdHMvYXBpL3YxL2FydGlmYWN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9yZXN1bHRzL2FwaS92MS9hcnRpZmFjdC50d2lycFwiKSwgZXhwb3J0cyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2330\n')},5812:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval('\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.ArtifactService = exports.DeleteArtifactResponse = exports.DeleteArtifactRequest = exports.GetSignedArtifactURLResponse = exports.GetSignedArtifactURLRequest = exports.ListArtifactsResponse_MonolithArtifact = exports.ListArtifactsResponse = exports.ListArtifactsRequest = exports.FinalizeArtifactResponse = exports.FinalizeArtifactRequest = exports.CreateArtifactResponse = exports.CreateArtifactRequest = void 0;\n// @generated by protobuf-ts 2.9.1 with parameter long_type_string,client_none,generate_dependencies\n// @generated from protobuf file "results/api/v1/artifact.proto" (package "github.actions.results.api.v1", syntax proto3)\n// tslint:disable\nconst runtime_rpc_1 = __webpack_require__(906);\nconst runtime_1 = __webpack_require__(9102);\nconst runtime_2 = __webpack_require__(9102);\nconst runtime_3 = __webpack_require__(9102);\nconst runtime_4 = __webpack_require__(9102);\nconst runtime_5 = __webpack_require__(9102);\nconst wrappers_1 = __webpack_require__(2965);\nconst wrappers_2 = __webpack_require__(2965);\nconst timestamp_1 = __webpack_require__(7214);\n// @generated message type with reflection information, may provide speed optimized methods\nclass CreateArtifactRequest$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.CreateArtifactRequest", [\n { no: 1, name: "workflow_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 2, name: "workflow_job_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 3, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 4, name: "expires_at", kind: "message", T: () => timestamp_1.Timestamp },\n { no: 5, name: "version", kind: "scalar", T: 5 /*ScalarType.INT32*/ }\n ]);\n }\n create(value) {\n const message = { workflowRunBackendId: "", workflowJobRunBackendId: "", name: "", version: 0 };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* string workflow_run_backend_id */ 1:\n message.workflowRunBackendId = reader.string();\n break;\n case /* string workflow_job_run_backend_id */ 2:\n message.workflowJobRunBackendId = reader.string();\n break;\n case /* string name */ 3:\n message.name = reader.string();\n break;\n case /* google.protobuf.Timestamp expires_at */ 4:\n message.expiresAt = timestamp_1.Timestamp.internalBinaryRead(reader, reader.uint32(), options, message.expiresAt);\n break;\n case /* int32 version */ 5:\n message.version = reader.int32();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* string workflow_run_backend_id = 1; */\n if (message.workflowRunBackendId !== "")\n writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.workflowRunBackendId);\n /* string workflow_job_run_backend_id = 2; */\n if (message.workflowJobRunBackendId !== "")\n writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.workflowJobRunBackendId);\n /* string name = 3; */\n if (message.name !== "")\n writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.name);\n /* google.protobuf.Timestamp expires_at = 4; */\n if (message.expiresAt)\n timestamp_1.Timestamp.internalBinaryWrite(message.expiresAt, writer.tag(4, runtime_1.WireType.LengthDelimited).fork(), options).join();\n /* int32 version = 5; */\n if (message.version !== 0)\n writer.tag(5, runtime_1.WireType.Varint).int32(message.version);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.CreateArtifactRequest\n */\nexports.CreateArtifactRequest = new CreateArtifactRequest$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass CreateArtifactResponse$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.CreateArtifactResponse", [\n { no: 1, name: "ok", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },\n { no: 2, name: "signed_upload_url", kind: "scalar", T: 9 /*ScalarType.STRING*/ }\n ]);\n }\n create(value) {\n const message = { ok: false, signedUploadUrl: "" };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* bool ok */ 1:\n message.ok = reader.bool();\n break;\n case /* string signed_upload_url */ 2:\n message.signedUploadUrl = reader.string();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* bool ok = 1; */\n if (message.ok !== false)\n writer.tag(1, runtime_1.WireType.Varint).bool(message.ok);\n /* string signed_upload_url = 2; */\n if (message.signedUploadUrl !== "")\n writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.signedUploadUrl);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.CreateArtifactResponse\n */\nexports.CreateArtifactResponse = new CreateArtifactResponse$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass FinalizeArtifactRequest$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.FinalizeArtifactRequest", [\n { no: 1, name: "workflow_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 2, name: "workflow_job_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 3, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 4, name: "size", kind: "scalar", T: 3 /*ScalarType.INT64*/ },\n { no: 5, name: "hash", kind: "message", T: () => wrappers_2.StringValue }\n ]);\n }\n create(value) {\n const message = { workflowRunBackendId: "", workflowJobRunBackendId: "", name: "", size: "0" };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* string workflow_run_backend_id */ 1:\n message.workflowRunBackendId = reader.string();\n break;\n case /* string workflow_job_run_backend_id */ 2:\n message.workflowJobRunBackendId = reader.string();\n break;\n case /* string name */ 3:\n message.name = reader.string();\n break;\n case /* int64 size */ 4:\n message.size = reader.int64().toString();\n break;\n case /* google.protobuf.StringValue hash */ 5:\n message.hash = wrappers_2.StringValue.internalBinaryRead(reader, reader.uint32(), options, message.hash);\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* string workflow_run_backend_id = 1; */\n if (message.workflowRunBackendId !== "")\n writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.workflowRunBackendId);\n /* string workflow_job_run_backend_id = 2; */\n if (message.workflowJobRunBackendId !== "")\n writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.workflowJobRunBackendId);\n /* string name = 3; */\n if (message.name !== "")\n writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.name);\n /* int64 size = 4; */\n if (message.size !== "0")\n writer.tag(4, runtime_1.WireType.Varint).int64(message.size);\n /* google.protobuf.StringValue hash = 5; */\n if (message.hash)\n wrappers_2.StringValue.internalBinaryWrite(message.hash, writer.tag(5, runtime_1.WireType.LengthDelimited).fork(), options).join();\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.FinalizeArtifactRequest\n */\nexports.FinalizeArtifactRequest = new FinalizeArtifactRequest$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass FinalizeArtifactResponse$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.FinalizeArtifactResponse", [\n { no: 1, name: "ok", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },\n { no: 2, name: "artifact_id", kind: "scalar", T: 3 /*ScalarType.INT64*/ }\n ]);\n }\n create(value) {\n const message = { ok: false, artifactId: "0" };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* bool ok */ 1:\n message.ok = reader.bool();\n break;\n case /* int64 artifact_id */ 2:\n message.artifactId = reader.int64().toString();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* bool ok = 1; */\n if (message.ok !== false)\n writer.tag(1, runtime_1.WireType.Varint).bool(message.ok);\n /* int64 artifact_id = 2; */\n if (message.artifactId !== "0")\n writer.tag(2, runtime_1.WireType.Varint).int64(message.artifactId);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.FinalizeArtifactResponse\n */\nexports.FinalizeArtifactResponse = new FinalizeArtifactResponse$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass ListArtifactsRequest$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.ListArtifactsRequest", [\n { no: 1, name: "workflow_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 2, name: "workflow_job_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 3, name: "name_filter", kind: "message", T: () => wrappers_2.StringValue },\n { no: 4, name: "id_filter", kind: "message", T: () => wrappers_1.Int64Value }\n ]);\n }\n create(value) {\n const message = { workflowRunBackendId: "", workflowJobRunBackendId: "" };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* string workflow_run_backend_id */ 1:\n message.workflowRunBackendId = reader.string();\n break;\n case /* string workflow_job_run_backend_id */ 2:\n message.workflowJobRunBackendId = reader.string();\n break;\n case /* google.protobuf.StringValue name_filter */ 3:\n message.nameFilter = wrappers_2.StringValue.internalBinaryRead(reader, reader.uint32(), options, message.nameFilter);\n break;\n case /* google.protobuf.Int64Value id_filter */ 4:\n message.idFilter = wrappers_1.Int64Value.internalBinaryRead(reader, reader.uint32(), options, message.idFilter);\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* string workflow_run_backend_id = 1; */\n if (message.workflowRunBackendId !== "")\n writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.workflowRunBackendId);\n /* string workflow_job_run_backend_id = 2; */\n if (message.workflowJobRunBackendId !== "")\n writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.workflowJobRunBackendId);\n /* google.protobuf.StringValue name_filter = 3; */\n if (message.nameFilter)\n wrappers_2.StringValue.internalBinaryWrite(message.nameFilter, writer.tag(3, runtime_1.WireType.LengthDelimited).fork(), options).join();\n /* google.protobuf.Int64Value id_filter = 4; */\n if (message.idFilter)\n wrappers_1.Int64Value.internalBinaryWrite(message.idFilter, writer.tag(4, runtime_1.WireType.LengthDelimited).fork(), options).join();\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.ListArtifactsRequest\n */\nexports.ListArtifactsRequest = new ListArtifactsRequest$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass ListArtifactsResponse$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.ListArtifactsResponse", [\n { no: 1, name: "artifacts", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => exports.ListArtifactsResponse_MonolithArtifact }\n ]);\n }\n create(value) {\n const message = { artifacts: [] };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* repeated github.actions.results.api.v1.ListArtifactsResponse.MonolithArtifact artifacts */ 1:\n message.artifacts.push(exports.ListArtifactsResponse_MonolithArtifact.internalBinaryRead(reader, reader.uint32(), options));\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* repeated github.actions.results.api.v1.ListArtifactsResponse.MonolithArtifact artifacts = 1; */\n for (let i = 0; i < message.artifacts.length; i++)\n exports.ListArtifactsResponse_MonolithArtifact.internalBinaryWrite(message.artifacts[i], writer.tag(1, runtime_1.WireType.LengthDelimited).fork(), options).join();\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.ListArtifactsResponse\n */\nexports.ListArtifactsResponse = new ListArtifactsResponse$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass ListArtifactsResponse_MonolithArtifact$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.ListArtifactsResponse.MonolithArtifact", [\n { no: 1, name: "workflow_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 2, name: "workflow_job_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 3, name: "database_id", kind: "scalar", T: 3 /*ScalarType.INT64*/ },\n { no: 4, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 5, name: "size", kind: "scalar", T: 3 /*ScalarType.INT64*/ },\n { no: 6, name: "created_at", kind: "message", T: () => timestamp_1.Timestamp }\n ]);\n }\n create(value) {\n const message = { workflowRunBackendId: "", workflowJobRunBackendId: "", databaseId: "0", name: "", size: "0" };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* string workflow_run_backend_id */ 1:\n message.workflowRunBackendId = reader.string();\n break;\n case /* string workflow_job_run_backend_id */ 2:\n message.workflowJobRunBackendId = reader.string();\n break;\n case /* int64 database_id */ 3:\n message.databaseId = reader.int64().toString();\n break;\n case /* string name */ 4:\n message.name = reader.string();\n break;\n case /* int64 size */ 5:\n message.size = reader.int64().toString();\n break;\n case /* google.protobuf.Timestamp created_at */ 6:\n message.createdAt = timestamp_1.Timestamp.internalBinaryRead(reader, reader.uint32(), options, message.createdAt);\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* string workflow_run_backend_id = 1; */\n if (message.workflowRunBackendId !== "")\n writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.workflowRunBackendId);\n /* string workflow_job_run_backend_id = 2; */\n if (message.workflowJobRunBackendId !== "")\n writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.workflowJobRunBackendId);\n /* int64 database_id = 3; */\n if (message.databaseId !== "0")\n writer.tag(3, runtime_1.WireType.Varint).int64(message.databaseId);\n /* string name = 4; */\n if (message.name !== "")\n writer.tag(4, runtime_1.WireType.LengthDelimited).string(message.name);\n /* int64 size = 5; */\n if (message.size !== "0")\n writer.tag(5, runtime_1.WireType.Varint).int64(message.size);\n /* google.protobuf.Timestamp created_at = 6; */\n if (message.createdAt)\n timestamp_1.Timestamp.internalBinaryWrite(message.createdAt, writer.tag(6, runtime_1.WireType.LengthDelimited).fork(), options).join();\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.ListArtifactsResponse.MonolithArtifact\n */\nexports.ListArtifactsResponse_MonolithArtifact = new ListArtifactsResponse_MonolithArtifact$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass GetSignedArtifactURLRequest$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.GetSignedArtifactURLRequest", [\n { no: 1, name: "workflow_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 2, name: "workflow_job_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 3, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/ }\n ]);\n }\n create(value) {\n const message = { workflowRunBackendId: "", workflowJobRunBackendId: "", name: "" };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* string workflow_run_backend_id */ 1:\n message.workflowRunBackendId = reader.string();\n break;\n case /* string workflow_job_run_backend_id */ 2:\n message.workflowJobRunBackendId = reader.string();\n break;\n case /* string name */ 3:\n message.name = reader.string();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* string workflow_run_backend_id = 1; */\n if (message.workflowRunBackendId !== "")\n writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.workflowRunBackendId);\n /* string workflow_job_run_backend_id = 2; */\n if (message.workflowJobRunBackendId !== "")\n writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.workflowJobRunBackendId);\n /* string name = 3; */\n if (message.name !== "")\n writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.name);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.GetSignedArtifactURLRequest\n */\nexports.GetSignedArtifactURLRequest = new GetSignedArtifactURLRequest$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass GetSignedArtifactURLResponse$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.GetSignedArtifactURLResponse", [\n { no: 1, name: "signed_url", kind: "scalar", T: 9 /*ScalarType.STRING*/ }\n ]);\n }\n create(value) {\n const message = { signedUrl: "" };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* string signed_url */ 1:\n message.signedUrl = reader.string();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* string signed_url = 1; */\n if (message.signedUrl !== "")\n writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.signedUrl);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.GetSignedArtifactURLResponse\n */\nexports.GetSignedArtifactURLResponse = new GetSignedArtifactURLResponse$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass DeleteArtifactRequest$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.DeleteArtifactRequest", [\n { no: 1, name: "workflow_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 2, name: "workflow_job_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 3, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/ }\n ]);\n }\n create(value) {\n const message = { workflowRunBackendId: "", workflowJobRunBackendId: "", name: "" };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* string workflow_run_backend_id */ 1:\n message.workflowRunBackendId = reader.string();\n break;\n case /* string workflow_job_run_backend_id */ 2:\n message.workflowJobRunBackendId = reader.string();\n break;\n case /* string name */ 3:\n message.name = reader.string();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* string workflow_run_backend_id = 1; */\n if (message.workflowRunBackendId !== "")\n writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.workflowRunBackendId);\n /* string workflow_job_run_backend_id = 2; */\n if (message.workflowJobRunBackendId !== "")\n writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.workflowJobRunBackendId);\n /* string name = 3; */\n if (message.name !== "")\n writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.name);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.DeleteArtifactRequest\n */\nexports.DeleteArtifactRequest = new DeleteArtifactRequest$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass DeleteArtifactResponse$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.DeleteArtifactResponse", [\n { no: 1, name: "ok", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },\n { no: 2, name: "artifact_id", kind: "scalar", T: 3 /*ScalarType.INT64*/ }\n ]);\n }\n create(value) {\n const message = { ok: false, artifactId: "0" };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* bool ok */ 1:\n message.ok = reader.bool();\n break;\n case /* int64 artifact_id */ 2:\n message.artifactId = reader.int64().toString();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* bool ok = 1; */\n if (message.ok !== false)\n writer.tag(1, runtime_1.WireType.Varint).bool(message.ok);\n /* int64 artifact_id = 2; */\n if (message.artifactId !== "0")\n writer.tag(2, runtime_1.WireType.Varint).int64(message.artifactId);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.DeleteArtifactResponse\n */\nexports.DeleteArtifactResponse = new DeleteArtifactResponse$Type();\n/**\n * @generated ServiceType for protobuf service github.actions.results.api.v1.ArtifactService\n */\nexports.ArtifactService = new runtime_rpc_1.ServiceType("github.actions.results.api.v1.ArtifactService", [\n { name: "CreateArtifact", options: {}, I: exports.CreateArtifactRequest, O: exports.CreateArtifactResponse },\n { name: "FinalizeArtifact", options: {}, I: exports.FinalizeArtifactRequest, O: exports.FinalizeArtifactResponse },\n { name: "ListArtifacts", options: {}, I: exports.ListArtifactsRequest, O: exports.ListArtifactsResponse },\n { name: "GetSignedArtifactURL", options: {}, I: exports.GetSignedArtifactURLRequest, O: exports.GetSignedArtifactURLResponse },\n { name: "DeleteArtifact", options: {}, I: exports.DeleteArtifactRequest, O: exports.DeleteArtifactResponse }\n]);\n//# sourceMappingURL=artifact.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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dXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9nZW5lcmF0ZWQvcmVzdWx0cy9hcGkvdjEvYXJ0aWZhY3QuanM/YmEzMSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQXJ0aWZhY3RTZXJ2aWNlID0gZXhwb3J0cy5EZWxldGVBcnRpZmFjdFJlc3BvbnNlID0gZXhwb3J0cy5EZWxldGVBcnRpZmFjdFJlcXVlc3QgPSBleHBvcnRzLkdldFNpZ25lZEFydGlmYWN0VVJMUmVzcG9uc2UgPSBleHBvcnRzLkdldFNpZ25lZEFydGlmYWN0VVJMUmVxdWVzdCA9IGV4cG9ydHMuTGlzdEFydGlmYWN0c1Jlc3BvbnNlX01vbm9saXRoQXJ0aWZhY3QgPSBleHBvcnRzLkxpc3RBcnRpZmFjdHNSZXNwb25zZSA9IGV4cG9ydHMuTGlzdEFydGlmYWN0c1JlcXVlc3QgPSBleHBvcnRzLkZpbmFsaXplQXJ0aWZhY3RSZXNwb25zZSA9IGV4cG9ydHMuRmluYWxpemVBcnRpZmFjdFJlcXVlc3QgPSBleHBvcnRzLkNyZWF0ZUFydGlmYWN0UmVzcG9uc2UgPSBleHBvcnRzLkNyZWF0ZUFydGlmYWN0UmVxdWVzdCA9IHZvaWQgMDtcbi8vIEBnZW5lcmF0ZWQgYnkgcHJvdG9idWYtdHMgMi45LjEgd2l0aCBwYXJhbWV0ZXIgbG9uZ190eXBlX3N0cmluZyxjbGllbnRfbm9uZSxnZW5lcmF0ZV9kZXBlbmRlbmNpZXNcbi8vIEBnZW5lcmF0ZWQgZnJvbSBwcm90b2J1ZiBmaWxlIFwicmVzdWx0cy9hcGkvdjEvYXJ0aWZhY3QucHJvdG9cIiAocGFja2FnZSBcImdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxXCIsIHN5bnRheCBwcm90bzMpXG4vLyB0c2xpbnQ6ZGlzYWJsZVxuY29uc3QgcnVudGltZV9ycGNfMSA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZS1ycGNcIik7XG5jb25zdCBydW50aW1lXzEgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCBydW50aW1lXzIgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCBydW50aW1lXzMgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCBydW50aW1lXzQgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCBydW50aW1lXzUgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCB3cmFwcGVyc18xID0gcmVxdWlyZShcIi4uLy4uLy4uL2dvb2dsZS9wcm90b2J1Zi93cmFwcGVyc1wiKTtcbmNvbnN0IHdyYXBwZXJzXzIgPSByZXF1aXJlKFwiLi4vLi4vLi4vZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzXCIpO1xuY29uc3QgdGltZXN0YW1wXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcFwiKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIENyZWF0ZUFydGlmYWN0UmVxdWVzdCRUeXBlIGV4dGVuZHMgcnVudGltZV81Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5DcmVhdGVBcnRpZmFjdFJlcXVlc3RcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ3b3JrZmxvd19ydW5fYmFja2VuZF9pZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJ3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwibmFtZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogNCwgbmFtZTogXCJleHBpcmVzX2F0XCIsIGtpbmQ6IFwibWVzc2FnZVwiLCBUOiAoKSA9PiB0aW1lc3RhbXBfMS5UaW1lc3RhbXAgfSxcbiAgICAgICAgICAgIHsgbm86IDUsIG5hbWU6IFwidmVyc2lvblwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA1IC8qU2NhbGFyVHlwZS5JTlQzMiovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0geyB3b3JrZmxvd1J1bkJhY2tlbmRJZDogXCJcIiwgd29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQ6IFwiXCIsIG5hbWU6IFwiXCIsIHZlcnNpb246IDAgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV80Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfMy5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHdvcmtmbG93X3J1bl9iYWNrZW5kX2lkICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud29ya2Zsb3dSdW5CYWNrZW5kSWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHdvcmtmbG93X2pvYl9ydW5fYmFja2VuZF9pZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndvcmtmbG93Sm9iUnVuQmFja2VuZElkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBuYW1lICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIGV4cGlyZXNfYXQgKi8gNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5leHBpcmVzQXQgPSB0aW1lc3RhbXBfMS5UaW1lc3RhbXAuaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpLCBvcHRpb25zLCBtZXNzYWdlLmV4cGlyZXNBdCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogaW50MzIgdmVyc2lvbiAqLyA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZlcnNpb24gPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IHJ1bnRpbWVfMi5Vbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHdvcmtmbG93X3J1bl9iYWNrZW5kX2lkID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uud29ya2Zsb3dSdW5CYWNrZW5kSWQgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkKTtcbiAgICAgICAgLyogc3RyaW5nIHdvcmtmbG93X2pvYl9ydW5fYmFja2VuZF9pZCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLndvcmtmbG93Sm9iUnVuQmFja2VuZElkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCk7XG4gICAgICAgIC8qIHN0cmluZyBuYW1lID0gMzsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UubmFtZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMywgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UubmFtZSk7XG4gICAgICAgIC8qIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgZXhwaXJlc19hdCA9IDQ7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLmV4cGlyZXNBdClcbiAgICAgICAgICAgIHRpbWVzdGFtcF8xLlRpbWVzdGFtcC5pbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UuZXhwaXJlc0F0LCB3cml0ZXIudGFnKDQsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLmZvcmsoKSwgb3B0aW9ucykuam9pbigpO1xuICAgICAgICAvKiBpbnQzMiB2ZXJzaW9uID0gNTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudmVyc2lvbiAhPT0gMClcbiAgICAgICAgICAgIHdyaXRlci50YWcoNSwgcnVudGltZV8xLldpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS52ZXJzaW9uKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfMi5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5DcmVhdGVBcnRpZmFjdFJlcXVlc3RcbiAqL1xuZXhwb3J0cy5DcmVhdGVBcnRpZmFjdFJlcXVlc3QgPSBuZXcgQ3JlYXRlQXJ0aWZhY3RSZXF1ZXN0JFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIENyZWF0ZUFydGlmYWN0UmVzcG9uc2UkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNS5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuQ3JlYXRlQXJ0aWZhY3RSZXNwb25zZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcIm9rXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDggLypTY2FsYXJUeXBlLkJPT0wqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJzaWduZWRfdXBsb2FkX3VybFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgb2s6IGZhbHNlLCBzaWduZWRVcGxvYWRVcmw6IFwiXCIgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV80Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfMy5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogYm9vbCBvayAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9rID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgc2lnbmVkX3VwbG9hZF91cmwgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zaWduZWRVcGxvYWRVcmwgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzIuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIGJvb2wgb2sgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5vayAhPT0gZmFsc2UpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIHJ1bnRpbWVfMS5XaXJlVHlwZS5WYXJpbnQpLmJvb2wobWVzc2FnZS5vayk7XG4gICAgICAgIC8qIHN0cmluZyBzaWduZWRfdXBsb2FkX3VybCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnNpZ25lZFVwbG9hZFVybCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uuc2lnbmVkVXBsb2FkVXJsKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfMi5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5DcmVhdGVBcnRpZmFjdFJlc3BvbnNlXG4gKi9cbmV4cG9ydHMuQ3JlYXRlQXJ0aWZhY3RSZXNwb25zZSA9IG5ldyBDcmVhdGVBcnRpZmFjdFJlc3BvbnNlJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIEZpbmFsaXplQXJ0aWZhY3RSZXF1ZXN0JFR5cGUgZXh0ZW5kcyBydW50aW1lXzUuTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkZpbmFsaXplQXJ0aWZhY3RSZXF1ZXN0XCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwid29ya2Zsb3dfcnVuX2JhY2tlbmRfaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwid29ya2Zsb3dfam9iX3J1bl9iYWNrZW5kX2lkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAzLCBuYW1lOiBcIm5hbWVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDQsIG5hbWU6IFwic2l6ZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiAzIC8qU2NhbGFyVHlwZS5JTlQ2NCovIH0sXG4gICAgICAgICAgICB7IG5vOiA1LCBuYW1lOiBcImhhc2hcIiwga2luZDogXCJtZXNzYWdlXCIsIFQ6ICgpID0+IHdyYXBwZXJzXzIuU3RyaW5nVmFsdWUgfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHdvcmtmbG93UnVuQmFja2VuZElkOiBcIlwiLCB3b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZDogXCJcIiwgbmFtZTogXCJcIiwgc2l6ZTogXCIwXCIgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV80Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfMy5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHdvcmtmbG93X3J1bl9iYWNrZW5kX2lkICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud29ya2Zsb3dSdW5CYWNrZW5kSWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHdvcmtmbG93X2pvYl9ydW5fYmFja2VuZF9pZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndvcmtmbG93Sm9iUnVuQmFja2VuZElkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBuYW1lICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBpbnQ2NCBzaXplICovIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2l6ZSA9IHJlYWRlci5pbnQ2NCgpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlIGhhc2ggKi8gNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5oYXNoID0gd3JhcHBlcnNfMi5TdHJpbmdWYWx1ZS5pbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCByZWFkZXIudWludDMyKCksIG9wdGlvbnMsIG1lc3NhZ2UuaGFzaCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzIuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19ydW5fYmFja2VuZF9pZCA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS53b3JrZmxvd1J1bkJhY2tlbmRJZCk7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWQgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQpO1xuICAgICAgICAvKiBzdHJpbmcgbmFtZSA9IDM7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLm5hbWUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDMsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLm5hbWUpO1xuICAgICAgICAvKiBpbnQ2NCBzaXplID0gNDsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2l6ZSAhPT0gXCIwXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDQsIHJ1bnRpbWVfMS5XaXJlVHlwZS5WYXJpbnQpLmludDY0KG1lc3NhZ2Uuc2l6ZSk7XG4gICAgICAgIC8qIGdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZSBoYXNoID0gNTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UuaGFzaClcbiAgICAgICAgICAgIHdyYXBwZXJzXzIuU3RyaW5nVmFsdWUuaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLmhhc2gsIHdyaXRlci50YWcoNSwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuZm9yaygpLCBvcHRpb25zKS5qb2luKCk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBydW50aW1lXzIuVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuRmluYWxpemVBcnRpZmFjdFJlcXVlc3RcbiAqL1xuZXhwb3J0cy5GaW5hbGl6ZUFydGlmYWN0UmVxdWVzdCA9IG5ldyBGaW5hbGl6ZUFydGlmYWN0UmVxdWVzdCRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBGaW5hbGl6ZUFydGlmYWN0UmVzcG9uc2UkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNS5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuRmluYWxpemVBcnRpZmFjdFJlc3BvbnNlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwib2tcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOCAvKlNjYWxhclR5cGUuQk9PTCovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcImFydGlmYWN0X2lkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDMgLypTY2FsYXJUeXBlLklOVDY0Ki8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IG9rOiBmYWxzZSwgYXJ0aWZhY3RJZDogXCIwXCIgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV80Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfMy5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogYm9vbCBvayAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9rID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBpbnQ2NCBhcnRpZmFjdF9pZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFydGlmYWN0SWQgPSByZWFkZXIuaW50NjQoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBib29sIG9rID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uub2sgIT09IGZhbHNlKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzEuV2lyZVR5cGUuVmFyaW50KS5ib29sKG1lc3NhZ2Uub2spO1xuICAgICAgICAvKiBpbnQ2NCBhcnRpZmFjdF9pZCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLmFydGlmYWN0SWQgIT09IFwiMFwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBydW50aW1lXzEuV2lyZVR5cGUuVmFyaW50KS5pbnQ2NChtZXNzYWdlLmFydGlmYWN0SWQpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkZpbmFsaXplQXJ0aWZhY3RSZXNwb25zZVxuICovXG5leHBvcnRzLkZpbmFsaXplQXJ0aWZhY3RSZXNwb25zZSA9IG5ldyBGaW5hbGl6ZUFydGlmYWN0UmVzcG9uc2UkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgTGlzdEFydGlmYWN0c1JlcXVlc3QkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNS5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuTGlzdEFydGlmYWN0c1JlcXVlc3RcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ3b3JrZmxvd19ydW5fYmFja2VuZF9pZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJ3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwibmFtZV9maWx0ZXJcIiwga2luZDogXCJtZXNzYWdlXCIsIFQ6ICgpID0+IHdyYXBwZXJzXzIuU3RyaW5nVmFsdWUgfSxcbiAgICAgICAgICAgIHsgbm86IDQsIG5hbWU6IFwiaWRfZmlsdGVyXCIsIGtpbmQ6IFwibWVzc2FnZVwiLCBUOiAoKSA9PiB3cmFwcGVyc18xLkludDY0VmFsdWUgfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHdvcmtmbG93UnVuQmFja2VuZElkOiBcIlwiLCB3b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZDogXCJcIiB9O1xuICAgICAgICBnbG9iYWxUaGlzLk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtZXNzYWdlLCBydW50aW1lXzQuTUVTU0FHRV9UWVBFLCB7IGVudW1lcmFibGU6IGZhbHNlLCB2YWx1ZTogdGhpcyB9KTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAoMCwgcnVudGltZV8zLnJlZmxlY3Rpb25NZXJnZVBhcnRpYWwpKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgd29ya2Zsb3dfcnVuX2JhY2tlbmRfaWQgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS53b3JrZmxvd1J1bkJhY2tlbmRJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgd29ya2Zsb3dfam9iX3J1bl9iYWNrZW5kX2lkICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlIG5hbWVfZmlsdGVyICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFtZUZpbHRlciA9IHdyYXBwZXJzXzIuU3RyaW5nVmFsdWUuaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpLCBvcHRpb25zLCBtZXNzYWdlLm5hbWVGaWx0ZXIpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlIGlkX2ZpbHRlciAqLyA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlkRmlsdGVyID0gd3JhcHBlcnNfMS5JbnQ2NFZhbHVlLmludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIHJlYWRlci51aW50MzIoKSwgb3B0aW9ucywgbWVzc2FnZS5pZEZpbHRlcik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzIuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19ydW5fYmFja2VuZF9pZCA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS53b3JrZmxvd1J1bkJhY2tlbmRJZCk7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWQgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQpO1xuICAgICAgICAvKiBnb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUgbmFtZV9maWx0ZXIgPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5uYW1lRmlsdGVyKVxuICAgICAgICAgICAgd3JhcHBlcnNfMi5TdHJpbmdWYWx1ZS5pbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UubmFtZUZpbHRlciwgd3JpdGVyLnRhZygzLCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5mb3JrKCksIG9wdGlvbnMpLmpvaW4oKTtcbiAgICAgICAgLyogZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUgaWRfZmlsdGVyID0gNDsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UuaWRGaWx0ZXIpXG4gICAgICAgICAgICB3cmFwcGVyc18xLkludDY0VmFsdWUuaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLmlkRmlsdGVyLCB3cml0ZXIudGFnKDQsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLmZvcmsoKSwgb3B0aW9ucykuam9pbigpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkxpc3RBcnRpZmFjdHNSZXF1ZXN0XG4gKi9cbmV4cG9ydHMuTGlzdEFydGlmYWN0c1JlcXVlc3QgPSBuZXcgTGlzdEFydGlmYWN0c1JlcXVlc3QkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgTGlzdEFydGlmYWN0c1Jlc3BvbnNlJFR5cGUgZXh0ZW5kcyBydW50aW1lXzUuTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkxpc3RBcnRpZmFjdHNSZXNwb25zZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcImFydGlmYWN0c1wiLCBraW5kOiBcIm1lc3NhZ2VcIiwgcmVwZWF0OiAxIC8qUmVwZWF0VHlwZS5QQUNLRUQqLywgVDogKCkgPT4gZXhwb3J0cy5MaXN0QXJ0aWZhY3RzUmVzcG9uc2VfTW9ub2xpdGhBcnRpZmFjdCB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgYXJ0aWZhY3RzOiBbXSB9O1xuICAgICAgICBnbG9iYWxUaGlzLk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtZXNzYWdlLCBydW50aW1lXzQuTUVTU0FHRV9UWVBFLCB7IGVudW1lcmFibGU6IGZhbHNlLCB2YWx1ZTogdGhpcyB9KTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAoMCwgcnVudGltZV8zLnJlZmxlY3Rpb25NZXJnZVBhcnRpYWwpKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiByZXBlYXRlZCBnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5MaXN0QXJ0aWZhY3RzUmVzcG9uc2UuTW9ub2xpdGhBcnRpZmFjdCBhcnRpZmFjdHMgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hcnRpZmFjdHMucHVzaChleHBvcnRzLkxpc3RBcnRpZmFjdHNSZXNwb25zZV9Nb25vbGl0aEFydGlmYWN0LmludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIHJlYWRlci51aW50MzIoKSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiByZXBlYXRlZCBnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5MaXN0QXJ0aWZhY3RzUmVzcG9uc2UuTW9ub2xpdGhBcnRpZmFjdCBhcnRpZmFjdHMgPSAxOyAqL1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lc3NhZ2UuYXJ0aWZhY3RzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgZXhwb3J0cy5MaXN0QXJ0aWZhY3RzUmVzcG9uc2VfTW9ub2xpdGhBcnRpZmFjdC5pbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UuYXJ0aWZhY3RzW2ldLCB3cml0ZXIudGFnKDEsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLmZvcmsoKSwgb3B0aW9ucykuam9pbigpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkxpc3RBcnRpZmFjdHNSZXNwb25zZVxuICovXG5leHBvcnRzLkxpc3RBcnRpZmFjdHNSZXNwb25zZSA9IG5ldyBMaXN0QXJ0aWZhY3RzUmVzcG9uc2UkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgTGlzdEFydGlmYWN0c1Jlc3BvbnNlX01vbm9saXRoQXJ0aWZhY3QkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNS5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuTGlzdEFydGlmYWN0c1Jlc3BvbnNlLk1vbm9saXRoQXJ0aWZhY3RcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ3b3JrZmxvd19ydW5fYmFja2VuZF9pZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJ3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwiZGF0YWJhc2VfaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogMyAvKlNjYWxhclR5cGUuSU5UNjQqLyB9LFxuICAgICAgICAgICAgeyBubzogNCwgbmFtZTogXCJuYW1lXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiA1LCBuYW1lOiBcInNpemVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogMyAvKlNjYWxhclR5cGUuSU5UNjQqLyB9LFxuICAgICAgICAgICAgeyBubzogNiwgbmFtZTogXCJjcmVhdGVkX2F0XCIsIGtpbmQ6IFwibWVzc2FnZVwiLCBUOiAoKSA9PiB0aW1lc3RhbXBfMS5UaW1lc3RhbXAgfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHdvcmtmbG93UnVuQmFja2VuZElkOiBcIlwiLCB3b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZDogXCJcIiwgZGF0YWJhc2VJZDogXCIwXCIsIG5hbWU6IFwiXCIsIHNpemU6IFwiMFwiIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNC5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzMucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB3b3JrZmxvd19ydW5fYmFja2VuZF9pZCAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWQgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBpbnQ2NCBkYXRhYmFzZV9pZCAqLyAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGFiYXNlSWQgPSByZWFkZXIuaW50NjQoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBuYW1lICovIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBpbnQ2NCBzaXplICovIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2l6ZSA9IHJlYWRlci5pbnQ2NCgpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCBjcmVhdGVkX2F0ICovIDY6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY3JlYXRlZEF0ID0gdGltZXN0YW1wXzEuVGltZXN0YW1wLmludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIHJlYWRlci51aW50MzIoKSwgb3B0aW9ucywgbWVzc2FnZS5jcmVhdGVkQXQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgd29ya2Zsb3dfcnVuX2JhY2tlbmRfaWQgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS53b3JrZmxvd1J1bkJhY2tlbmRJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uud29ya2Zsb3dSdW5CYWNrZW5kSWQpO1xuICAgICAgICAvKiBzdHJpbmcgd29ya2Zsb3dfam9iX3J1bl9iYWNrZW5kX2lkID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLndvcmtmbG93Sm9iUnVuQmFja2VuZElkKTtcbiAgICAgICAgLyogaW50NjQgZGF0YWJhc2VfaWQgPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5kYXRhYmFzZUlkICE9PSBcIjBcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMywgcnVudGltZV8xLldpcmVUeXBlLlZhcmludCkuaW50NjQobWVzc2FnZS5kYXRhYmFzZUlkKTtcbiAgICAgICAgLyogc3RyaW5nIG5hbWUgPSA0OyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5uYW1lICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZyg0LCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5uYW1lKTtcbiAgICAgICAgLyogaW50NjQgc2l6ZSA9IDU7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnNpemUgIT09IFwiMFwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZyg1LCBydW50aW1lXzEuV2lyZVR5cGUuVmFyaW50KS5pbnQ2NChtZXNzYWdlLnNpemUpO1xuICAgICAgICAvKiBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIGNyZWF0ZWRfYXQgPSA2OyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5jcmVhdGVkQXQpXG4gICAgICAgICAgICB0aW1lc3RhbXBfMS5UaW1lc3RhbXAuaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLmNyZWF0ZWRBdCwgd3JpdGVyLnRhZyg2LCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5mb3JrKCksIG9wdGlvbnMpLmpvaW4oKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfMi5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5MaXN0QXJ0aWZhY3RzUmVzcG9uc2UuTW9ub2xpdGhBcnRpZmFjdFxuICovXG5leHBvcnRzLkxpc3RBcnRpZmFjdHNSZXNwb25zZV9Nb25vbGl0aEFydGlmYWN0ID0gbmV3IExpc3RBcnRpZmFjdHNSZXNwb25zZV9Nb25vbGl0aEFydGlmYWN0JFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIEdldFNpZ25lZEFydGlmYWN0VVJMUmVxdWVzdCRUeXBlIGV4dGVuZHMgcnVudGltZV81Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5HZXRTaWduZWRBcnRpZmFjdFVSTFJlcXVlc3RcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ3b3JrZmxvd19ydW5fYmFja2VuZF9pZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJ3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwibmFtZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgd29ya2Zsb3dSdW5CYWNrZW5kSWQ6IFwiXCIsIHdvcmtmbG93Sm9iUnVuQmFja2VuZElkOiBcIlwiLCBuYW1lOiBcIlwiIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNC5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzMucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB3b3JrZmxvd19ydW5fYmFja2VuZF9pZCAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWQgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgbmFtZSAqLyAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5hbWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzIuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19ydW5fYmFja2VuZF9pZCA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS53b3JrZmxvd1J1bkJhY2tlbmRJZCk7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWQgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQpO1xuICAgICAgICAvKiBzdHJpbmcgbmFtZSA9IDM7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLm5hbWUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDMsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLm5hbWUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkdldFNpZ25lZEFydGlmYWN0VVJMUmVxdWVzdFxuICovXG5leHBvcnRzLkdldFNpZ25lZEFydGlmYWN0VVJMUmVxdWVzdCA9IG5ldyBHZXRTaWduZWRBcnRpZmFjdFVSTFJlcXVlc3QkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgR2V0U2lnbmVkQXJ0aWZhY3RVUkxSZXNwb25zZSRUeXBlIGV4dGVuZHMgcnVudGltZV81Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5HZXRTaWduZWRBcnRpZmFjdFVSTFJlc3BvbnNlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwic2lnbmVkX3VybFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgc2lnbmVkVXJsOiBcIlwiIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNC5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzMucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBzaWduZWRfdXJsICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2lnbmVkVXJsID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgc2lnbmVkX3VybCA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnNpZ25lZFVybCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uuc2lnbmVkVXJsKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfMi5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5HZXRTaWduZWRBcnRpZmFjdFVSTFJlc3BvbnNlXG4gKi9cbmV4cG9ydHMuR2V0U2lnbmVkQXJ0aWZhY3RVUkxSZXNwb25zZSA9IG5ldyBHZXRTaWduZWRBcnRpZmFjdFVSTFJlc3BvbnNlJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIERlbGV0ZUFydGlmYWN0UmVxdWVzdCRUeXBlIGV4dGVuZHMgcnVudGltZV81Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5EZWxldGVBcnRpZmFjdFJlcXVlc3RcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ3b3JrZmxvd19ydW5fYmFja2VuZF9pZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJ3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwibmFtZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgd29ya2Zsb3dSdW5CYWNrZW5kSWQ6IFwiXCIsIHdvcmtmbG93Sm9iUnVuQmFja2VuZElkOiBcIlwiLCBuYW1lOiBcIlwiIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNC5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzMucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB3b3JrZmxvd19ydW5fYmFja2VuZF9pZCAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWQgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgbmFtZSAqLyAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5hbWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzIuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19ydW5fYmFja2VuZF9pZCA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS53b3JrZmxvd1J1bkJhY2tlbmRJZCk7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWQgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQpO1xuICAgICAgICAvKiBzdHJpbmcgbmFtZSA9IDM7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLm5hbWUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDMsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLm5hbWUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkRlbGV0ZUFydGlmYWN0UmVxdWVzdFxuICovXG5leHBvcnRzLkRlbGV0ZUFydGlmYWN0UmVxdWVzdCA9IG5ldyBEZWxldGVBcnRpZmFjdFJlcXVlc3QkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgRGVsZXRlQXJ0aWZhY3RSZXNwb25zZSRUeXBlIGV4dGVuZHMgcnVudGltZV81Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5EZWxldGVBcnRpZmFjdFJlc3BvbnNlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwib2tcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOCAvKlNjYWxhclR5cGUuQk9PTCovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcImFydGlmYWN0X2lkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDMgLypTY2FsYXJUeXBlLklOVDY0Ki8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IG9rOiBmYWxzZSwgYXJ0aWZhY3RJZDogXCIwXCIgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV80Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfMy5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogYm9vbCBvayAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9rID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBpbnQ2NCBhcnRpZmFjdF9pZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFydGlmYWN0SWQgPSByZWFkZXIuaW50NjQoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBib29sIG9rID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uub2sgIT09IGZhbHNlKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzEuV2lyZVR5cGUuVmFyaW50KS5ib29sKG1lc3NhZ2Uub2spO1xuICAgICAgICAvKiBpbnQ2NCBhcnRpZmFjdF9pZCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLmFydGlmYWN0SWQgIT09IFwiMFwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBydW50aW1lXzEuV2lyZVR5cGUuVmFyaW50KS5pbnQ2NChtZXNzYWdlLmFydGlmYWN0SWQpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkRlbGV0ZUFydGlmYWN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0cy5EZWxldGVBcnRpZmFjdFJlc3BvbnNlID0gbmV3IERlbGV0ZUFydGlmYWN0UmVzcG9uc2UkVHlwZSgpO1xuLyoqXG4gKiBAZ2VuZXJhdGVkIFNlcnZpY2VUeXBlIGZvciBwcm90b2J1ZiBzZXJ2aWNlIGdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkFydGlmYWN0U2VydmljZVxuICovXG5leHBvcnRzLkFydGlmYWN0U2VydmljZSA9IG5ldyBydW50aW1lX3JwY18xLlNlcnZpY2VUeXBlKFwiZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuQXJ0aWZhY3RTZXJ2aWNlXCIsIFtcbiAgICB7IG5hbWU6IFwiQ3JlYXRlQXJ0aWZhY3RcIiwgb3B0aW9uczoge30sIEk6IGV4cG9ydHMuQ3JlYXRlQXJ0aWZhY3RSZXF1ZXN0LCBPOiBleHBvcnRzLkNyZWF0ZUFydGlmYWN0UmVzcG9uc2UgfSxcbiAgICB7IG5hbWU6IFwiRmluYWxpemVBcnRpZmFjdFwiLCBvcHRpb25zOiB7fSwgSTogZXhwb3J0cy5GaW5hbGl6ZUFydGlmYWN0UmVxdWVzdCwgTzogZXhwb3J0cy5GaW5hbGl6ZUFydGlmYWN0UmVzcG9uc2UgfSxcbiAgICB7IG5hbWU6IFwiTGlzdEFydGlmYWN0c1wiLCBvcHRpb25zOiB7fSwgSTogZXhwb3J0cy5MaXN0QXJ0aWZhY3RzUmVxdWVzdCwgTzogZXhwb3J0cy5MaXN0QXJ0aWZhY3RzUmVzcG9uc2UgfSxcbiAgICB7IG5hbWU6IFwiR2V0U2lnbmVkQXJ0aWZhY3RVUkxcIiwgb3B0aW9uczoge30sIEk6IGV4cG9ydHMuR2V0U2lnbmVkQXJ0aWZhY3RVUkxSZXF1ZXN0LCBPOiBleHBvcnRzLkdldFNpZ25lZEFydGlmYWN0VVJMUmVzcG9uc2UgfSxcbiAgICB7IG5hbWU6IFwiRGVsZXRlQXJ0aWZhY3RcIiwgb3B0aW9uczoge30sIEk6IGV4cG9ydHMuRGVsZXRlQXJ0aWZhY3RSZXF1ZXN0LCBPOiBleHBvcnRzLkRlbGV0ZUFydGlmYWN0UmVzcG9uc2UgfVxuXSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcnRpZmFjdC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5812\n')},5444:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.createArtifactServiceServer = exports.ArtifactServiceMethodList = exports.ArtifactServiceMethod = exports.ArtifactServiceClientProtobuf = exports.ArtifactServiceClientJSON = void 0;\nconst twirp_ts_1 = __webpack_require__(3412);\nconst artifact_1 = __webpack_require__(5812);\nclass ArtifactServiceClientJSON {\n constructor(rpc) {\n this.rpc = rpc;\n this.CreateArtifact.bind(this);\n this.FinalizeArtifact.bind(this);\n this.ListArtifacts.bind(this);\n this.GetSignedArtifactURL.bind(this);\n this.DeleteArtifact.bind(this);\n }\n CreateArtifact(request) {\n const data = artifact_1.CreateArtifactRequest.toJson(request, {\n useProtoFieldName: true,\n emitDefaultValues: false,\n });\n const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "CreateArtifact", "application/json", data);\n return promise.then((data) => artifact_1.CreateArtifactResponse.fromJson(data, {\n ignoreUnknownFields: true,\n }));\n }\n FinalizeArtifact(request) {\n const data = artifact_1.FinalizeArtifactRequest.toJson(request, {\n useProtoFieldName: true,\n emitDefaultValues: false,\n });\n const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "FinalizeArtifact", "application/json", data);\n return promise.then((data) => artifact_1.FinalizeArtifactResponse.fromJson(data, {\n ignoreUnknownFields: true,\n }));\n }\n ListArtifacts(request) {\n const data = artifact_1.ListArtifactsRequest.toJson(request, {\n useProtoFieldName: true,\n emitDefaultValues: false,\n });\n const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "ListArtifacts", "application/json", data);\n return promise.then((data) => artifact_1.ListArtifactsResponse.fromJson(data, { ignoreUnknownFields: true }));\n }\n GetSignedArtifactURL(request) {\n const data = artifact_1.GetSignedArtifactURLRequest.toJson(request, {\n useProtoFieldName: true,\n emitDefaultValues: false,\n });\n const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "GetSignedArtifactURL", "application/json", data);\n return promise.then((data) => artifact_1.GetSignedArtifactURLResponse.fromJson(data, {\n ignoreUnknownFields: true,\n }));\n }\n DeleteArtifact(request) {\n const data = artifact_1.DeleteArtifactRequest.toJson(request, {\n useProtoFieldName: true,\n emitDefaultValues: false,\n });\n const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "DeleteArtifact", "application/json", data);\n return promise.then((data) => artifact_1.DeleteArtifactResponse.fromJson(data, {\n ignoreUnknownFields: true,\n }));\n }\n}\nexports.ArtifactServiceClientJSON = ArtifactServiceClientJSON;\nclass ArtifactServiceClientProtobuf {\n constructor(rpc) {\n this.rpc = rpc;\n this.CreateArtifact.bind(this);\n this.FinalizeArtifact.bind(this);\n this.ListArtifacts.bind(this);\n this.GetSignedArtifactURL.bind(this);\n this.DeleteArtifact.bind(this);\n }\n CreateArtifact(request) {\n const data = artifact_1.CreateArtifactRequest.toBinary(request);\n const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "CreateArtifact", "application/protobuf", data);\n return promise.then((data) => artifact_1.CreateArtifactResponse.fromBinary(data));\n }\n FinalizeArtifact(request) {\n const data = artifact_1.FinalizeArtifactRequest.toBinary(request);\n const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "FinalizeArtifact", "application/protobuf", data);\n return promise.then((data) => artifact_1.FinalizeArtifactResponse.fromBinary(data));\n }\n ListArtifacts(request) {\n const data = artifact_1.ListArtifactsRequest.toBinary(request);\n const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "ListArtifacts", "application/protobuf", data);\n return promise.then((data) => artifact_1.ListArtifactsResponse.fromBinary(data));\n }\n GetSignedArtifactURL(request) {\n const data = artifact_1.GetSignedArtifactURLRequest.toBinary(request);\n const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "GetSignedArtifactURL", "application/protobuf", data);\n return promise.then((data) => artifact_1.GetSignedArtifactURLResponse.fromBinary(data));\n }\n DeleteArtifact(request) {\n const data = artifact_1.DeleteArtifactRequest.toBinary(request);\n const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "DeleteArtifact", "application/protobuf", data);\n return promise.then((data) => artifact_1.DeleteArtifactResponse.fromBinary(data));\n }\n}\nexports.ArtifactServiceClientProtobuf = ArtifactServiceClientProtobuf;\nvar ArtifactServiceMethod;\n(function (ArtifactServiceMethod) {\n ArtifactServiceMethod["CreateArtifact"] = "CreateArtifact";\n ArtifactServiceMethod["FinalizeArtifact"] = "FinalizeArtifact";\n ArtifactServiceMethod["ListArtifacts"] = "ListArtifacts";\n ArtifactServiceMethod["GetSignedArtifactURL"] = "GetSignedArtifactURL";\n ArtifactServiceMethod["DeleteArtifact"] = "DeleteArtifact";\n})(ArtifactServiceMethod || (exports.ArtifactServiceMethod = ArtifactServiceMethod = {}));\nexports.ArtifactServiceMethodList = [\n ArtifactServiceMethod.CreateArtifact,\n ArtifactServiceMethod.FinalizeArtifact,\n ArtifactServiceMethod.ListArtifacts,\n ArtifactServiceMethod.GetSignedArtifactURL,\n ArtifactServiceMethod.DeleteArtifact,\n];\nfunction createArtifactServiceServer(service) {\n return new twirp_ts_1.TwirpServer({\n service,\n packageName: "github.actions.results.api.v1",\n serviceName: "ArtifactService",\n methodList: exports.ArtifactServiceMethodList,\n matchRoute: matchArtifactServiceRoute,\n });\n}\nexports.createArtifactServiceServer = createArtifactServiceServer;\nfunction matchArtifactServiceRoute(method, events) {\n switch (method) {\n case "CreateArtifact":\n return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {\n ctx = Object.assign(Object.assign({}, ctx), { methodName: "CreateArtifact" });\n yield events.onMatch(ctx);\n return handleArtifactServiceCreateArtifactRequest(ctx, service, data, interceptors);\n });\n case "FinalizeArtifact":\n return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {\n ctx = Object.assign(Object.assign({}, ctx), { methodName: "FinalizeArtifact" });\n yield events.onMatch(ctx);\n return handleArtifactServiceFinalizeArtifactRequest(ctx, service, data, interceptors);\n });\n case "ListArtifacts":\n return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {\n ctx = Object.assign(Object.assign({}, ctx), { methodName: "ListArtifacts" });\n yield events.onMatch(ctx);\n return handleArtifactServiceListArtifactsRequest(ctx, service, data, interceptors);\n });\n case "GetSignedArtifactURL":\n return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {\n ctx = Object.assign(Object.assign({}, ctx), { methodName: "GetSignedArtifactURL" });\n yield events.onMatch(ctx);\n return handleArtifactServiceGetSignedArtifactURLRequest(ctx, service, data, interceptors);\n });\n case "DeleteArtifact":\n return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {\n ctx = Object.assign(Object.assign({}, ctx), { methodName: "DeleteArtifact" });\n yield events.onMatch(ctx);\n return handleArtifactServiceDeleteArtifactRequest(ctx, service, data, interceptors);\n });\n default:\n events.onNotFound();\n const msg = `no handler found`;\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);\n }\n}\nfunction handleArtifactServiceCreateArtifactRequest(ctx, service, data, interceptors) {\n switch (ctx.contentType) {\n case twirp_ts_1.TwirpContentType.JSON:\n return handleArtifactServiceCreateArtifactJSON(ctx, service, data, interceptors);\n case twirp_ts_1.TwirpContentType.Protobuf:\n return handleArtifactServiceCreateArtifactProtobuf(ctx, service, data, interceptors);\n default:\n const msg = "unexpected Content-Type";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);\n }\n}\nfunction handleArtifactServiceFinalizeArtifactRequest(ctx, service, data, interceptors) {\n switch (ctx.contentType) {\n case twirp_ts_1.TwirpContentType.JSON:\n return handleArtifactServiceFinalizeArtifactJSON(ctx, service, data, interceptors);\n case twirp_ts_1.TwirpContentType.Protobuf:\n return handleArtifactServiceFinalizeArtifactProtobuf(ctx, service, data, interceptors);\n default:\n const msg = "unexpected Content-Type";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);\n }\n}\nfunction handleArtifactServiceListArtifactsRequest(ctx, service, data, interceptors) {\n switch (ctx.contentType) {\n case twirp_ts_1.TwirpContentType.JSON:\n return handleArtifactServiceListArtifactsJSON(ctx, service, data, interceptors);\n case twirp_ts_1.TwirpContentType.Protobuf:\n return handleArtifactServiceListArtifactsProtobuf(ctx, service, data, interceptors);\n default:\n const msg = "unexpected Content-Type";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);\n }\n}\nfunction handleArtifactServiceGetSignedArtifactURLRequest(ctx, service, data, interceptors) {\n switch (ctx.contentType) {\n case twirp_ts_1.TwirpContentType.JSON:\n return handleArtifactServiceGetSignedArtifactURLJSON(ctx, service, data, interceptors);\n case twirp_ts_1.TwirpContentType.Protobuf:\n return handleArtifactServiceGetSignedArtifactURLProtobuf(ctx, service, data, interceptors);\n default:\n const msg = "unexpected Content-Type";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);\n }\n}\nfunction handleArtifactServiceDeleteArtifactRequest(ctx, service, data, interceptors) {\n switch (ctx.contentType) {\n case twirp_ts_1.TwirpContentType.JSON:\n return handleArtifactServiceDeleteArtifactJSON(ctx, service, data, interceptors);\n case twirp_ts_1.TwirpContentType.Protobuf:\n return handleArtifactServiceDeleteArtifactProtobuf(ctx, service, data, interceptors);\n default:\n const msg = "unexpected Content-Type";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);\n }\n}\nfunction handleArtifactServiceCreateArtifactJSON(ctx, service, data, interceptors) {\n return __awaiter(this, void 0, void 0, function* () {\n let request;\n let response;\n try {\n const body = JSON.parse(data.toString() || "{}");\n request = artifact_1.CreateArtifactRequest.fromJson(body, {\n ignoreUnknownFields: true,\n });\n }\n catch (e) {\n if (e instanceof Error) {\n const msg = "the json request could not be decoded";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);\n }\n }\n if (interceptors && interceptors.length > 0) {\n const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);\n response = yield interceptor(ctx, request, (ctx, inputReq) => {\n return service.CreateArtifact(ctx, inputReq);\n });\n }\n else {\n response = yield service.CreateArtifact(ctx, request);\n }\n return JSON.stringify(artifact_1.CreateArtifactResponse.toJson(response, {\n useProtoFieldName: true,\n emitDefaultValues: false,\n }));\n });\n}\nfunction handleArtifactServiceFinalizeArtifactJSON(ctx, service, data, interceptors) {\n return __awaiter(this, void 0, void 0, function* () {\n let request;\n let response;\n try {\n const body = JSON.parse(data.toString() || "{}");\n request = artifact_1.FinalizeArtifactRequest.fromJson(body, {\n ignoreUnknownFields: true,\n });\n }\n catch (e) {\n if (e instanceof Error) {\n const msg = "the json request could not be decoded";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);\n }\n }\n if (interceptors && interceptors.length > 0) {\n const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);\n response = yield interceptor(ctx, request, (ctx, inputReq) => {\n return service.FinalizeArtifact(ctx, inputReq);\n });\n }\n else {\n response = yield service.FinalizeArtifact(ctx, request);\n }\n return JSON.stringify(artifact_1.FinalizeArtifactResponse.toJson(response, {\n useProtoFieldName: true,\n emitDefaultValues: false,\n }));\n });\n}\nfunction handleArtifactServiceListArtifactsJSON(ctx, service, data, interceptors) {\n return __awaiter(this, void 0, void 0, function* () {\n let request;\n let response;\n try {\n const body = JSON.parse(data.toString() || "{}");\n request = artifact_1.ListArtifactsRequest.fromJson(body, {\n ignoreUnknownFields: true,\n });\n }\n catch (e) {\n if (e instanceof Error) {\n const msg = "the json request could not be decoded";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);\n }\n }\n if (interceptors && interceptors.length > 0) {\n const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);\n response = yield interceptor(ctx, request, (ctx, inputReq) => {\n return service.ListArtifacts(ctx, inputReq);\n });\n }\n else {\n response = yield service.ListArtifacts(ctx, request);\n }\n return JSON.stringify(artifact_1.ListArtifactsResponse.toJson(response, {\n useProtoFieldName: true,\n emitDefaultValues: false,\n }));\n });\n}\nfunction handleArtifactServiceGetSignedArtifactURLJSON(ctx, service, data, interceptors) {\n return __awaiter(this, void 0, void 0, function* () {\n let request;\n let response;\n try {\n const body = JSON.parse(data.toString() || "{}");\n request = artifact_1.GetSignedArtifactURLRequest.fromJson(body, {\n ignoreUnknownFields: true,\n });\n }\n catch (e) {\n if (e instanceof Error) {\n const msg = "the json request could not be decoded";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);\n }\n }\n if (interceptors && interceptors.length > 0) {\n const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);\n response = yield interceptor(ctx, request, (ctx, inputReq) => {\n return service.GetSignedArtifactURL(ctx, inputReq);\n });\n }\n else {\n response = yield service.GetSignedArtifactURL(ctx, request);\n }\n return JSON.stringify(artifact_1.GetSignedArtifactURLResponse.toJson(response, {\n useProtoFieldName: true,\n emitDefaultValues: false,\n }));\n });\n}\nfunction handleArtifactServiceDeleteArtifactJSON(ctx, service, data, interceptors) {\n return __awaiter(this, void 0, void 0, function* () {\n let request;\n let response;\n try {\n const body = JSON.parse(data.toString() || "{}");\n request = artifact_1.DeleteArtifactRequest.fromJson(body, {\n ignoreUnknownFields: true,\n });\n }\n catch (e) {\n if (e instanceof Error) {\n const msg = "the json request could not be decoded";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);\n }\n }\n if (interceptors && interceptors.length > 0) {\n const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);\n response = yield interceptor(ctx, request, (ctx, inputReq) => {\n return service.DeleteArtifact(ctx, inputReq);\n });\n }\n else {\n response = yield service.DeleteArtifact(ctx, request);\n }\n return JSON.stringify(artifact_1.DeleteArtifactResponse.toJson(response, {\n useProtoFieldName: true,\n emitDefaultValues: false,\n }));\n });\n}\nfunction handleArtifactServiceCreateArtifactProtobuf(ctx, service, data, interceptors) {\n return __awaiter(this, void 0, void 0, function* () {\n let request;\n let response;\n try {\n request = artifact_1.CreateArtifactRequest.fromBinary(data);\n }\n catch (e) {\n if (e instanceof Error) {\n const msg = "the protobuf request could not be decoded";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);\n }\n }\n if (interceptors && interceptors.length > 0) {\n const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);\n response = yield interceptor(ctx, request, (ctx, inputReq) => {\n return service.CreateArtifact(ctx, inputReq);\n });\n }\n else {\n response = yield service.CreateArtifact(ctx, request);\n }\n return Buffer.from(artifact_1.CreateArtifactResponse.toBinary(response));\n });\n}\nfunction handleArtifactServiceFinalizeArtifactProtobuf(ctx, service, data, interceptors) {\n return __awaiter(this, void 0, void 0, function* () {\n let request;\n let response;\n try {\n request = artifact_1.FinalizeArtifactRequest.fromBinary(data);\n }\n catch (e) {\n if (e instanceof Error) {\n const msg = "the protobuf request could not be decoded";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);\n }\n }\n if (interceptors && interceptors.length > 0) {\n const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);\n response = yield interceptor(ctx, request, (ctx, inputReq) => {\n return service.FinalizeArtifact(ctx, inputReq);\n });\n }\n else {\n response = yield service.FinalizeArtifact(ctx, request);\n }\n return Buffer.from(artifact_1.FinalizeArtifactResponse.toBinary(response));\n });\n}\nfunction handleArtifactServiceListArtifactsProtobuf(ctx, service, data, interceptors) {\n return __awaiter(this, void 0, void 0, function* () {\n let request;\n let response;\n try {\n request = artifact_1.ListArtifactsRequest.fromBinary(data);\n }\n catch (e) {\n if (e instanceof Error) {\n const msg = "the protobuf request could not be decoded";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);\n }\n }\n if (interceptors && interceptors.length > 0) {\n const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);\n response = yield interceptor(ctx, request, (ctx, inputReq) => {\n return service.ListArtifacts(ctx, inputReq);\n });\n }\n else {\n response = yield service.ListArtifacts(ctx, request);\n }\n return Buffer.from(artifact_1.ListArtifactsResponse.toBinary(response));\n });\n}\nfunction handleArtifactServiceGetSignedArtifactURLProtobuf(ctx, service, data, interceptors) {\n return __awaiter(this, void 0, void 0, function* () {\n let request;\n let response;\n try {\n request = artifact_1.GetSignedArtifactURLRequest.fromBinary(data);\n }\n catch (e) {\n if (e instanceof Error) {\n const msg = "the protobuf request could not be decoded";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);\n }\n }\n if (interceptors && interceptors.length > 0) {\n const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);\n response = yield interceptor(ctx, request, (ctx, inputReq) => {\n return service.GetSignedArtifactURL(ctx, inputReq);\n });\n }\n else {\n response = yield service.GetSignedArtifactURL(ctx, request);\n }\n return Buffer.from(artifact_1.GetSignedArtifactURLResponse.toBinary(response));\n });\n}\nfunction handleArtifactServiceDeleteArtifactProtobuf(ctx, service, data, interceptors) {\n return __awaiter(this, void 0, void 0, function* () {\n let request;\n let response;\n try {\n request = artifact_1.DeleteArtifactRequest.fromBinary(data);\n }\n catch (e) {\n if (e instanceof Error) {\n const msg = "the protobuf request could not be decoded";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);\n }\n }\n if (interceptors && interceptors.length > 0) {\n const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);\n response = yield interceptor(ctx, request, (ctx, inputReq) => {\n return service.DeleteArtifact(ctx, inputReq);\n });\n }\n else {\n response = yield service.DeleteArtifact(ctx, request);\n }\n return Buffer.from(artifact_1.DeleteArtifactResponse.toBinary(response));\n });\n}\n//# sourceMappingURL=artifact.twirp.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9nZW5lcmF0ZWQvcmVzdWx0cy9hcGkvdjEvYXJ0aWZhY3QudHdpcnAuanM/Y2FkMSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jcmVhdGVBcnRpZmFjdFNlcnZpY2VTZXJ2ZXIgPSBleHBvcnRzLkFydGlmYWN0U2VydmljZU1ldGhvZExpc3QgPSBleHBvcnRzLkFydGlmYWN0U2VydmljZU1ldGhvZCA9IGV4cG9ydHMuQXJ0aWZhY3RTZXJ2aWNlQ2xpZW50UHJvdG9idWYgPSBleHBvcnRzLkFydGlmYWN0U2VydmljZUNsaWVudEpTT04gPSB2b2lkIDA7XG5jb25zdCB0d2lycF90c18xID0gcmVxdWlyZShcInR3aXJwLXRzXCIpO1xuY29uc3QgYXJ0aWZhY3RfMSA9IHJlcXVpcmUoXCIuL2FydGlmYWN0XCIpO1xuY2xhc3MgQXJ0aWZhY3RTZXJ2aWNlQ2xpZW50SlNPTiB7XG4gICAgY29uc3RydWN0b3IocnBjKSB7XG4gICAgICAgIHRoaXMucnBjID0gcnBjO1xuICAgICAgICB0aGlzLkNyZWF0ZUFydGlmYWN0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuRmluYWxpemVBcnRpZmFjdC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLkxpc3RBcnRpZmFjdHMuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5HZXRTaWduZWRBcnRpZmFjdFVSTC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLkRlbGV0ZUFydGlmYWN0LmJpbmQodGhpcyk7XG4gICAgfVxuICAgIENyZWF0ZUFydGlmYWN0KHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGFydGlmYWN0XzEuQ3JlYXRlQXJ0aWZhY3RSZXF1ZXN0LnRvSnNvbihyZXF1ZXN0LCB7XG4gICAgICAgICAgICB1c2VQcm90b0ZpZWxkTmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGVtaXREZWZhdWx0VmFsdWVzOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLnJwYy5yZXF1ZXN0KFwiZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuQXJ0aWZhY3RTZXJ2aWNlXCIsIFwiQ3JlYXRlQXJ0aWZhY3RcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIsIGRhdGEpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKChkYXRhKSA9PiBhcnRpZmFjdF8xLkNyZWF0ZUFydGlmYWN0UmVzcG9uc2UuZnJvbUpzb24oZGF0YSwge1xuICAgICAgICAgICAgaWdub3JlVW5rbm93bkZpZWxkczogdHJ1ZSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBGaW5hbGl6ZUFydGlmYWN0KHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGFydGlmYWN0XzEuRmluYWxpemVBcnRpZmFjdFJlcXVlc3QudG9Kc29uKHJlcXVlc3QsIHtcbiAgICAgICAgICAgIHVzZVByb3RvRmllbGROYW1lOiB0cnVlLFxuICAgICAgICAgICAgZW1pdERlZmF1bHRWYWx1ZXM6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucnBjLnJlcXVlc3QoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5BcnRpZmFjdFNlcnZpY2VcIiwgXCJGaW5hbGl6ZUFydGlmYWN0XCIsIFwiYXBwbGljYXRpb24vanNvblwiLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbigoZGF0YSkgPT4gYXJ0aWZhY3RfMS5GaW5hbGl6ZUFydGlmYWN0UmVzcG9uc2UuZnJvbUpzb24oZGF0YSwge1xuICAgICAgICAgICAgaWdub3JlVW5rbm93bkZpZWxkczogdHJ1ZSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBMaXN0QXJ0aWZhY3RzKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGFydGlmYWN0XzEuTGlzdEFydGlmYWN0c1JlcXVlc3QudG9Kc29uKHJlcXVlc3QsIHtcbiAgICAgICAgICAgIHVzZVByb3RvRmllbGROYW1lOiB0cnVlLFxuICAgICAgICAgICAgZW1pdERlZmF1bHRWYWx1ZXM6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucnBjLnJlcXVlc3QoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5BcnRpZmFjdFNlcnZpY2VcIiwgXCJMaXN0QXJ0aWZhY3RzXCIsIFwiYXBwbGljYXRpb24vanNvblwiLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbigoZGF0YSkgPT4gYXJ0aWZhY3RfMS5MaXN0QXJ0aWZhY3RzUmVzcG9uc2UuZnJvbUpzb24oZGF0YSwgeyBpZ25vcmVVbmtub3duRmllbGRzOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgR2V0U2lnbmVkQXJ0aWZhY3RVUkwocmVxdWVzdCkge1xuICAgICAgICBjb25zdCBkYXRhID0gYXJ0aWZhY3RfMS5HZXRTaWduZWRBcnRpZmFjdFVSTFJlcXVlc3QudG9Kc29uKHJlcXVlc3QsIHtcbiAgICAgICAgICAgIHVzZVByb3RvRmllbGROYW1lOiB0cnVlLFxuICAgICAgICAgICAgZW1pdERlZmF1bHRWYWx1ZXM6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucnBjLnJlcXVlc3QoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5BcnRpZmFjdFNlcnZpY2VcIiwgXCJHZXRTaWduZWRBcnRpZmFjdFVSTFwiLCBcImFwcGxpY2F0aW9uL2pzb25cIiwgZGF0YSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKGRhdGEpID0+IGFydGlmYWN0XzEuR2V0U2lnbmVkQXJ0aWZhY3RVUkxSZXNwb25zZS5mcm9tSnNvbihkYXRhLCB7XG4gICAgICAgICAgICBpZ25vcmVVbmtub3duRmllbGRzOiB0cnVlLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIERlbGV0ZUFydGlmYWN0KHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGFydGlmYWN0XzEuRGVsZXRlQXJ0aWZhY3RSZXF1ZXN0LnRvSnNvbihyZXF1ZXN0LCB7XG4gICAgICAgICAgICB1c2VQcm90b0ZpZWxkTmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGVtaXREZWZhdWx0VmFsdWVzOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLnJwYy5yZXF1ZXN0KFwiZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuQXJ0aWZhY3RTZXJ2aWNlXCIsIFwiRGVsZXRlQXJ0aWZhY3RcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIsIGRhdGEpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKChkYXRhKSA9PiBhcnRpZmFjdF8xLkRlbGV0ZUFydGlmYWN0UmVzcG9uc2UuZnJvbUpzb24oZGF0YSwge1xuICAgICAgICAgICAgaWdub3JlVW5rbm93bkZpZWxkczogdHJ1ZSxcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cbmV4cG9ydHMuQXJ0aWZhY3RTZXJ2aWNlQ2xpZW50SlNPTiA9IEFydGlmYWN0U2VydmljZUNsaWVudEpTT047XG5jbGFzcyBBcnRpZmFjdFNlcnZpY2VDbGllbnRQcm90b2J1ZiB7XG4gICAgY29uc3RydWN0b3IocnBjKSB7XG4gICAgICAgIHRoaXMucnBjID0gcnBjO1xuICAgICAgICB0aGlzLkNyZWF0ZUFydGlmYWN0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuRmluYWxpemVBcnRpZmFjdC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLkxpc3RBcnRpZmFjdHMuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5HZXRTaWduZWRBcnRpZmFjdFVSTC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLkRlbGV0ZUFydGlmYWN0LmJpbmQodGhpcyk7XG4gICAgfVxuICAgIENyZWF0ZUFydGlmYWN0KHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGFydGlmYWN0XzEuQ3JlYXRlQXJ0aWZhY3RSZXF1ZXN0LnRvQmluYXJ5KHJlcXVlc3QpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5ycGMucmVxdWVzdChcImdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkFydGlmYWN0U2VydmljZVwiLCBcIkNyZWF0ZUFydGlmYWN0XCIsIFwiYXBwbGljYXRpb24vcHJvdG9idWZcIiwgZGF0YSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKGRhdGEpID0+IGFydGlmYWN0XzEuQ3JlYXRlQXJ0aWZhY3RSZXNwb25zZS5mcm9tQmluYXJ5KGRhdGEpKTtcbiAgICB9XG4gICAgRmluYWxpemVBcnRpZmFjdChyZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhcnRpZmFjdF8xLkZpbmFsaXplQXJ0aWZhY3RSZXF1ZXN0LnRvQmluYXJ5KHJlcXVlc3QpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5ycGMucmVxdWVzdChcImdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkFydGlmYWN0U2VydmljZVwiLCBcIkZpbmFsaXplQXJ0aWZhY3RcIiwgXCJhcHBsaWNhdGlvbi9wcm90b2J1ZlwiLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbigoZGF0YSkgPT4gYXJ0aWZhY3RfMS5GaW5hbGl6ZUFydGlmYWN0UmVzcG9uc2UuZnJvbUJpbmFyeShkYXRhKSk7XG4gICAgfVxuICAgIExpc3RBcnRpZmFjdHMocmVxdWVzdCkge1xuICAgICAgICBjb25zdCBkYXRhID0gYXJ0aWZhY3RfMS5MaXN0QXJ0aWZhY3RzUmVxdWVzdC50b0JpbmFyeShyZXF1ZXN0KTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucnBjLnJlcXVlc3QoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5BcnRpZmFjdFNlcnZpY2VcIiwgXCJMaXN0QXJ0aWZhY3RzXCIsIFwiYXBwbGljYXRpb24vcHJvdG9idWZcIiwgZGF0YSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKGRhdGEpID0+IGFydGlmYWN0XzEuTGlzdEFydGlmYWN0c1Jlc3BvbnNlLmZyb21CaW5hcnkoZGF0YSkpO1xuICAgIH1cbiAgICBHZXRTaWduZWRBcnRpZmFjdFVSTChyZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhcnRpZmFjdF8xLkdldFNpZ25lZEFydGlmYWN0VVJMUmVxdWVzdC50b0JpbmFyeShyZXF1ZXN0KTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucnBjLnJlcXVlc3QoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5BcnRpZmFjdFNlcnZpY2VcIiwgXCJHZXRTaWduZWRBcnRpZmFjdFVSTFwiLCBcImFwcGxpY2F0aW9uL3Byb3RvYnVmXCIsIGRhdGEpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKChkYXRhKSA9PiBhcnRpZmFjdF8xLkdldFNpZ25lZEFydGlmYWN0VVJMUmVzcG9uc2UuZnJvbUJpbmFyeShkYXRhKSk7XG4gICAgfVxuICAgIERlbGV0ZUFydGlmYWN0KHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGFydGlmYWN0XzEuRGVsZXRlQXJ0aWZhY3RSZXF1ZXN0LnRvQmluYXJ5KHJlcXVlc3QpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5ycGMucmVxdWVzdChcImdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkFydGlmYWN0U2VydmljZVwiLCBcIkRlbGV0ZUFydGlmYWN0XCIsIFwiYXBwbGljYXRpb24vcHJvdG9idWZcIiwgZGF0YSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKGRhdGEpID0+IGFydGlmYWN0XzEuRGVsZXRlQXJ0aWZhY3RSZXNwb25zZS5mcm9tQmluYXJ5KGRhdGEpKTtcbiAgICB9XG59XG5leHBvcnRzLkFydGlmYWN0U2VydmljZUNsaWVudFByb3RvYnVmID0gQXJ0aWZhY3RTZXJ2aWNlQ2xpZW50UHJvdG9idWY7XG52YXIgQXJ0aWZhY3RTZXJ2aWNlTWV0aG9kO1xuKGZ1bmN0aW9uIChBcnRpZmFjdFNlcnZpY2VNZXRob2QpIHtcbiAgICBBcnRpZmFjdFNlcnZpY2VNZXRob2RbXCJDcmVhdGVBcnRpZmFjdFwiXSA9IFwiQ3JlYXRlQXJ0aWZhY3RcIjtcbiAgICBBcnRpZmFjdFNlcnZpY2VNZXRob2RbXCJGaW5hbGl6ZUFydGlmYWN0XCJdID0gXCJGaW5hbGl6ZUFydGlmYWN0XCI7XG4gICAgQXJ0aWZhY3RTZXJ2aWNlTWV0aG9kW1wiTGlzdEFydGlmYWN0c1wiXSA9IFwiTGlzdEFydGlmYWN0c1wiO1xuICAgIEFydGlmYWN0U2VydmljZU1ldGhvZFtcIkdldFNpZ25lZEFydGlmYWN0VVJMXCJdID0gXCJHZXRTaWduZWRBcnRpZmFjdFVSTFwiO1xuICAgIEFydGlmYWN0U2VydmljZU1ldGhvZFtcIkRlbGV0ZUFydGlmYWN0XCJdID0gXCJEZWxldGVBcnRpZmFjdFwiO1xufSkoQXJ0aWZhY3RTZXJ2aWNlTWV0aG9kIHx8IChleHBvcnRzLkFydGlmYWN0U2VydmljZU1ldGhvZCA9IEFydGlmYWN0U2VydmljZU1ldGhvZCA9IHt9KSk7XG5leHBvcnRzLkFydGlmYWN0U2VydmljZU1ldGhvZExpc3QgPSBbXG4gICAgQXJ0aWZhY3RTZXJ2aWNlTWV0aG9kLkNyZWF0ZUFydGlmYWN0LFxuICAgIEFydGlmYWN0U2VydmljZU1ldGhvZC5GaW5hbGl6ZUFydGlmYWN0LFxuICAgIEFydGlmYWN0U2VydmljZU1ldGhvZC5MaXN0QXJ0aWZhY3RzLFxuICAgIEFydGlmYWN0U2VydmljZU1ldGhvZC5HZXRTaWduZWRBcnRpZmFjdFVSTCxcbiAgICBBcnRpZmFjdFNlcnZpY2VNZXRob2QuRGVsZXRlQXJ0aWZhY3QsXG5dO1xuZnVuY3Rpb24gY3JlYXRlQXJ0aWZhY3RTZXJ2aWNlU2VydmVyKHNlcnZpY2UpIHtcbiAgICByZXR1cm4gbmV3IHR3aXJwX3RzXzEuVHdpcnBTZXJ2ZXIoe1xuICAgICAgICBzZXJ2aWNlLFxuICAgICAgICBwYWNrYWdlTmFtZTogXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MVwiLFxuICAgICAgICBzZXJ2aWNlTmFtZTogXCJBcnRpZmFjdFNlcnZpY2VcIixcbiAgICAgICAgbWV0aG9kTGlzdDogZXhwb3J0cy5BcnRpZmFjdFNlcnZpY2VNZXRob2RMaXN0LFxuICAgICAgICBtYXRjaFJvdXRlOiBtYXRjaEFydGlmYWN0U2VydmljZVJvdXRlLFxuICAgIH0pO1xufVxuZXhwb3J0cy5jcmVhdGVBcnRpZmFjdFNlcnZpY2VTZXJ2ZXIgPSBjcmVhdGVBcnRpZmFjdFNlcnZpY2VTZXJ2ZXI7XG5mdW5jdGlvbiBtYXRjaEFydGlmYWN0U2VydmljZVJvdXRlKG1ldGhvZCwgZXZlbnRzKSB7XG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgICAgY2FzZSBcIkNyZWF0ZUFydGlmYWN0XCI6XG4gICAgICAgICAgICByZXR1cm4gKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY3R4ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjdHgpLCB7IG1ldGhvZE5hbWU6IFwiQ3JlYXRlQXJ0aWZhY3RcIiB9KTtcbiAgICAgICAgICAgICAgICB5aWVsZCBldmVudHMub25NYXRjaChjdHgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VDcmVhdGVBcnRpZmFjdFJlcXVlc3QoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgXCJGaW5hbGl6ZUFydGlmYWN0XCI6XG4gICAgICAgICAgICByZXR1cm4gKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY3R4ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjdHgpLCB7IG1ldGhvZE5hbWU6IFwiRmluYWxpemVBcnRpZmFjdFwiIH0pO1xuICAgICAgICAgICAgICAgIHlpZWxkIGV2ZW50cy5vbk1hdGNoKGN0eCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFydGlmYWN0U2VydmljZUZpbmFsaXplQXJ0aWZhY3RSZXF1ZXN0KGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIFwiTGlzdEFydGlmYWN0c1wiOlxuICAgICAgICAgICAgcmV0dXJuIChjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGN0eCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY3R4KSwgeyBtZXRob2ROYW1lOiBcIkxpc3RBcnRpZmFjdHNcIiB9KTtcbiAgICAgICAgICAgICAgICB5aWVsZCBldmVudHMub25NYXRjaChjdHgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VMaXN0QXJ0aWZhY3RzUmVxdWVzdChjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2FzZSBcIkdldFNpZ25lZEFydGlmYWN0VVJMXCI6XG4gICAgICAgICAgICByZXR1cm4gKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY3R4ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjdHgpLCB7IG1ldGhvZE5hbWU6IFwiR2V0U2lnbmVkQXJ0aWZhY3RVUkxcIiB9KTtcbiAgICAgICAgICAgICAgICB5aWVsZCBldmVudHMub25NYXRjaChjdHgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VHZXRTaWduZWRBcnRpZmFjdFVSTFJlcXVlc3QoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgXCJEZWxldGVBcnRpZmFjdFwiOlxuICAgICAgICAgICAgcmV0dXJuIChjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGN0eCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY3R4KSwgeyBtZXRob2ROYW1lOiBcIkRlbGV0ZUFydGlmYWN0XCIgfSk7XG4gICAgICAgICAgICAgICAgeWllbGQgZXZlbnRzLm9uTWF0Y2goY3R4KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlRGVsZXRlQXJ0aWZhY3RSZXF1ZXN0KGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZXZlbnRzLm9uTm90Rm91bmQoKTtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGBubyBoYW5kbGVyIGZvdW5kYDtcbiAgICAgICAgICAgIHRocm93IG5ldyB0d2lycF90c18xLlR3aXJwRXJyb3IodHdpcnBfdHNfMS5Ud2lycEVycm9yQ29kZS5CYWRSb3V0ZSwgbXNnKTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VDcmVhdGVBcnRpZmFjdFJlcXVlc3QoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICBzd2l0Y2ggKGN0eC5jb250ZW50VHlwZSkge1xuICAgICAgICBjYXNlIHR3aXJwX3RzXzEuVHdpcnBDb250ZW50VHlwZS5KU09OOlxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFydGlmYWN0U2VydmljZUNyZWF0ZUFydGlmYWN0SlNPTihjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycyk7XG4gICAgICAgIGNhc2UgdHdpcnBfdHNfMS5Ud2lycENvbnRlbnRUeXBlLlByb3RvYnVmOlxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFydGlmYWN0U2VydmljZUNyZWF0ZUFydGlmYWN0UHJvdG9idWYoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29uc3QgbXNnID0gXCJ1bmV4cGVjdGVkIENvbnRlbnQtVHlwZVwiO1xuICAgICAgICAgICAgdGhyb3cgbmV3IHR3aXJwX3RzXzEuVHdpcnBFcnJvcih0d2lycF90c18xLlR3aXJwRXJyb3JDb2RlLkJhZFJvdXRlLCBtc2cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZUFydGlmYWN0U2VydmljZUZpbmFsaXplQXJ0aWZhY3RSZXF1ZXN0KGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSB7XG4gICAgc3dpdGNoIChjdHguY29udGVudFR5cGUpIHtcbiAgICAgICAgY2FzZSB0d2lycF90c18xLlR3aXJwQ29udGVudFR5cGUuSlNPTjpcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VGaW5hbGl6ZUFydGlmYWN0SlNPTihjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycyk7XG4gICAgICAgIGNhc2UgdHdpcnBfdHNfMS5Ud2lycENvbnRlbnRUeXBlLlByb3RvYnVmOlxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFydGlmYWN0U2VydmljZUZpbmFsaXplQXJ0aWZhY3RQcm90b2J1ZihjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBcInVuZXhwZWN0ZWQgQ29udGVudC1UeXBlXCI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgdHdpcnBfdHNfMS5Ud2lycEVycm9yKHR3aXJwX3RzXzEuVHdpcnBFcnJvckNvZGUuQmFkUm91dGUsIG1zZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlTGlzdEFydGlmYWN0c1JlcXVlc3QoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICBzd2l0Y2ggKGN0eC5jb250ZW50VHlwZSkge1xuICAgICAgICBjYXNlIHR3aXJwX3RzXzEuVHdpcnBDb250ZW50VHlwZS5KU09OOlxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFydGlmYWN0U2VydmljZUxpc3RBcnRpZmFjdHNKU09OKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgY2FzZSB0d2lycF90c18xLlR3aXJwQ29udGVudFR5cGUuUHJvdG9idWY6XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlTGlzdEFydGlmYWN0c1Byb3RvYnVmKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IFwidW5leHBlY3RlZCBDb250ZW50LVR5cGVcIjtcbiAgICAgICAgICAgIHRocm93IG5ldyB0d2lycF90c18xLlR3aXJwRXJyb3IodHdpcnBfdHNfMS5Ud2lycEVycm9yQ29kZS5CYWRSb3V0ZSwgbXNnKTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VHZXRTaWduZWRBcnRpZmFjdFVSTFJlcXVlc3QoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICBzd2l0Y2ggKGN0eC5jb250ZW50VHlwZSkge1xuICAgICAgICBjYXNlIHR3aXJwX3RzXzEuVHdpcnBDb250ZW50VHlwZS5KU09OOlxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFydGlmYWN0U2VydmljZUdldFNpZ25lZEFydGlmYWN0VVJMSlNPTihjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycyk7XG4gICAgICAgIGNhc2UgdHdpcnBfdHNfMS5Ud2lycENvbnRlbnRUeXBlLlByb3RvYnVmOlxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFydGlmYWN0U2VydmljZUdldFNpZ25lZEFydGlmYWN0VVJMUHJvdG9idWYoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29uc3QgbXNnID0gXCJ1bmV4cGVjdGVkIENvbnRlbnQtVHlwZVwiO1xuICAgICAgICAgICAgdGhyb3cgbmV3IHR3aXJwX3RzXzEuVHdpcnBFcnJvcih0d2lycF90c18xLlR3aXJwRXJyb3JDb2RlLkJhZFJvdXRlLCBtc2cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZUFydGlmYWN0U2VydmljZURlbGV0ZUFydGlmYWN0UmVxdWVzdChjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycykge1xuICAgIHN3aXRjaCAoY3R4LmNvbnRlbnRUeXBlKSB7XG4gICAgICAgIGNhc2UgdHdpcnBfdHNfMS5Ud2lycENvbnRlbnRUeXBlLkpTT046XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlRGVsZXRlQXJ0aWZhY3RKU09OKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgY2FzZSB0d2lycF90c18xLlR3aXJwQ29udGVudFR5cGUuUHJvdG9idWY6XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlRGVsZXRlQXJ0aWZhY3RQcm90b2J1ZihjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBcInVuZXhwZWN0ZWQgQ29udGVudC1UeXBlXCI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgdHdpcnBfdHNfMS5Ud2lycEVycm9yKHR3aXJwX3RzXzEuVHdpcnBFcnJvckNvZGUuQmFkUm91dGUsIG1zZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlQ3JlYXRlQXJ0aWZhY3RKU09OKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlcXVlc3Q7XG4gICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnBhcnNlKGRhdGEudG9TdHJpbmcoKSB8fCBcInt9XCIpO1xuICAgICAgICAgICAgcmVxdWVzdCA9IGFydGlmYWN0XzEuQ3JlYXRlQXJ0aWZhY3RSZXF1ZXN0LmZyb21Kc29uKGJvZHksIHtcbiAgICAgICAgICAgICAgICBpZ25vcmVVbmtub3duRmllbGRzOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBcInRoZSBqc29uIHJlcXVlc3QgY291bGQgbm90IGJlIGRlY29kZWRcIjtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgdHdpcnBfdHNfMS5Ud2lycEVycm9yKHR3aXJwX3RzXzEuVHdpcnBFcnJvckNvZGUuTWFsZm9ybWVkLCBtc2cpLndpdGhDYXVzZShlLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZXJjZXB0b3JzICYmIGludGVyY2VwdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBpbnRlcmNlcHRvciA9ICgwLCB0d2lycF90c18xLmNoYWluSW50ZXJjZXB0b3JzKSguLi5pbnRlcmNlcHRvcnMpO1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBpbnRlcmNlcHRvcihjdHgsIHJlcXVlc3QsIChjdHgsIGlucHV0UmVxKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UuQ3JlYXRlQXJ0aWZhY3QoY3R4LCBpbnB1dFJlcSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgc2VydmljZS5DcmVhdGVBcnRpZmFjdChjdHgsIHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcnRpZmFjdF8xLkNyZWF0ZUFydGlmYWN0UmVzcG9uc2UudG9Kc29uKHJlc3BvbnNlLCB7XG4gICAgICAgICAgICB1c2VQcm90b0ZpZWxkTmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGVtaXREZWZhdWx0VmFsdWVzOiBmYWxzZSxcbiAgICAgICAgfSkpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlRmluYWxpemVBcnRpZmFjdEpTT04oY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVxdWVzdDtcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UoZGF0YS50b1N0cmluZygpIHx8IFwie31cIik7XG4gICAgICAgICAgICByZXF1ZXN0ID0gYXJ0aWZhY3RfMS5GaW5hbGl6ZUFydGlmYWN0UmVxdWVzdC5mcm9tSnNvbihib2R5LCB7XG4gICAgICAgICAgICAgICAgaWdub3JlVW5rbm93bkZpZWxkczogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gXCJ0aGUganNvbiByZXF1ZXN0IGNvdWxkIG5vdCBiZSBkZWNvZGVkXCI7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IHR3aXJwX3RzXzEuVHdpcnBFcnJvcih0d2lycF90c18xLlR3aXJwRXJyb3JDb2RlLk1hbGZvcm1lZCwgbXNnKS53aXRoQ2F1c2UoZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVyY2VwdG9ycyAmJiBpbnRlcmNlcHRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJjZXB0b3IgPSAoMCwgdHdpcnBfdHNfMS5jaGFpbkludGVyY2VwdG9ycykoLi4uaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgaW50ZXJjZXB0b3IoY3R4LCByZXF1ZXN0LCAoY3R4LCBpbnB1dFJlcSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLkZpbmFsaXplQXJ0aWZhY3QoY3R4LCBpbnB1dFJlcSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgc2VydmljZS5GaW5hbGl6ZUFydGlmYWN0KGN0eCwgcmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFydGlmYWN0XzEuRmluYWxpemVBcnRpZmFjdFJlc3BvbnNlLnRvSnNvbihyZXNwb25zZSwge1xuICAgICAgICAgICAgdXNlUHJvdG9GaWVsZE5hbWU6IHRydWUsXG4gICAgICAgICAgICBlbWl0RGVmYXVsdFZhbHVlczogZmFsc2UsXG4gICAgICAgIH0pKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUFydGlmYWN0U2VydmljZUxpc3RBcnRpZmFjdHNKU09OKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlcXVlc3Q7XG4gICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnBhcnNlKGRhdGEudG9TdHJpbmcoKSB8fCBcInt9XCIpO1xuICAgICAgICAgICAgcmVxdWVzdCA9IGFydGlmYWN0XzEuTGlzdEFydGlmYWN0c1JlcXVlc3QuZnJvbUpzb24oYm9keSwge1xuICAgICAgICAgICAgICAgIGlnbm9yZVVua25vd25GaWVsZHM6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IFwidGhlIGpzb24gcmVxdWVzdCBjb3VsZCBub3QgYmUgZGVjb2RlZFwiO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyB0d2lycF90c18xLlR3aXJwRXJyb3IodHdpcnBfdHNfMS5Ud2lycEVycm9yQ29kZS5NYWxmb3JtZWQsIG1zZykud2l0aENhdXNlKGUsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdG9yID0gKDAsIHR3aXJwX3RzXzEuY2hhaW5JbnRlcmNlcHRvcnMpKC4uLmludGVyY2VwdG9ycyk7XG4gICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIGludGVyY2VwdG9yKGN0eCwgcmVxdWVzdCwgKGN0eCwgaW5wdXRSZXEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5MaXN0QXJ0aWZhY3RzKGN0eCwgaW5wdXRSZXEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIHNlcnZpY2UuTGlzdEFydGlmYWN0cyhjdHgsIHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcnRpZmFjdF8xLkxpc3RBcnRpZmFjdHNSZXNwb25zZS50b0pzb24ocmVzcG9uc2UsIHtcbiAgICAgICAgICAgIHVzZVByb3RvRmllbGROYW1lOiB0cnVlLFxuICAgICAgICAgICAgZW1pdERlZmF1bHRWYWx1ZXM6IGZhbHNlLFxuICAgICAgICB9KSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VHZXRTaWduZWRBcnRpZmFjdFVSTEpTT04oY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVxdWVzdDtcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UoZGF0YS50b1N0cmluZygpIHx8IFwie31cIik7XG4gICAgICAgICAgICByZXF1ZXN0ID0gYXJ0aWZhY3RfMS5HZXRTaWduZWRBcnRpZmFjdFVSTFJlcXVlc3QuZnJvbUpzb24oYm9keSwge1xuICAgICAgICAgICAgICAgIGlnbm9yZVVua25vd25GaWVsZHM6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IFwidGhlIGpzb24gcmVxdWVzdCBjb3VsZCBub3QgYmUgZGVjb2RlZFwiO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyB0d2lycF90c18xLlR3aXJwRXJyb3IodHdpcnBfdHNfMS5Ud2lycEVycm9yQ29kZS5NYWxmb3JtZWQsIG1zZykud2l0aENhdXNlKGUsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdG9yID0gKDAsIHR3aXJwX3RzXzEuY2hhaW5JbnRlcmNlcHRvcnMpKC4uLmludGVyY2VwdG9ycyk7XG4gICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIGludGVyY2VwdG9yKGN0eCwgcmVxdWVzdCwgKGN0eCwgaW5wdXRSZXEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5HZXRTaWduZWRBcnRpZmFjdFVSTChjdHgsIGlucHV0UmVxKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBzZXJ2aWNlLkdldFNpZ25lZEFydGlmYWN0VVJMKGN0eCwgcmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFydGlmYWN0XzEuR2V0U2lnbmVkQXJ0aWZhY3RVUkxSZXNwb25zZS50b0pzb24ocmVzcG9uc2UsIHtcbiAgICAgICAgICAgIHVzZVByb3RvRmllbGROYW1lOiB0cnVlLFxuICAgICAgICAgICAgZW1pdERlZmF1bHRWYWx1ZXM6IGZhbHNlLFxuICAgICAgICB9KSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VEZWxldGVBcnRpZmFjdEpTT04oY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVxdWVzdDtcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UoZGF0YS50b1N0cmluZygpIHx8IFwie31cIik7XG4gICAgICAgICAgICByZXF1ZXN0ID0gYXJ0aWZhY3RfMS5EZWxldGVBcnRpZmFjdFJlcXVlc3QuZnJvbUpzb24oYm9keSwge1xuICAgICAgICAgICAgICAgIGlnbm9yZVVua25vd25GaWVsZHM6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IFwidGhlIGpzb24gcmVxdWVzdCBjb3VsZCBub3QgYmUgZGVjb2RlZFwiO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyB0d2lycF90c18xLlR3aXJwRXJyb3IodHdpcnBfdHNfMS5Ud2lycEVycm9yQ29kZS5NYWxmb3JtZWQsIG1zZykud2l0aENhdXNlKGUsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdG9yID0gKDAsIHR3aXJwX3RzXzEuY2hhaW5JbnRlcmNlcHRvcnMpKC4uLmludGVyY2VwdG9ycyk7XG4gICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIGludGVyY2VwdG9yKGN0eCwgcmVxdWVzdCwgKGN0eCwgaW5wdXRSZXEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5EZWxldGVBcnRpZmFjdChjdHgsIGlucHV0UmVxKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBzZXJ2aWNlLkRlbGV0ZUFydGlmYWN0KGN0eCwgcmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFydGlmYWN0XzEuRGVsZXRlQXJ0aWZhY3RSZXNwb25zZS50b0pzb24ocmVzcG9uc2UsIHtcbiAgICAgICAgICAgIHVzZVByb3RvRmllbGROYW1lOiB0cnVlLFxuICAgICAgICAgICAgZW1pdERlZmF1bHRWYWx1ZXM6IGZhbHNlLFxuICAgICAgICB9KSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VDcmVhdGVBcnRpZmFjdFByb3RvYnVmKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlcXVlc3Q7XG4gICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlcXVlc3QgPSBhcnRpZmFjdF8xLkNyZWF0ZUFydGlmYWN0UmVxdWVzdC5mcm9tQmluYXJ5KGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gXCJ0aGUgcHJvdG9idWYgcmVxdWVzdCBjb3VsZCBub3QgYmUgZGVjb2RlZFwiO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyB0d2lycF90c18xLlR3aXJwRXJyb3IodHdpcnBfdHNfMS5Ud2lycEVycm9yQ29kZS5NYWxmb3JtZWQsIG1zZykud2l0aENhdXNlKGUsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdG9yID0gKDAsIHR3aXJwX3RzXzEuY2hhaW5JbnRlcmNlcHRvcnMpKC4uLmludGVyY2VwdG9ycyk7XG4gICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIGludGVyY2VwdG9yKGN0eCwgcmVxdWVzdCwgKGN0eCwgaW5wdXRSZXEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5DcmVhdGVBcnRpZmFjdChjdHgsIGlucHV0UmVxKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBzZXJ2aWNlLkNyZWF0ZUFydGlmYWN0KGN0eCwgcmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFydGlmYWN0XzEuQ3JlYXRlQXJ0aWZhY3RSZXNwb25zZS50b0JpbmFyeShyZXNwb25zZSkpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlRmluYWxpemVBcnRpZmFjdFByb3RvYnVmKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlcXVlc3Q7XG4gICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlcXVlc3QgPSBhcnRpZmFjdF8xLkZpbmFsaXplQXJ0aWZhY3RSZXF1ZXN0LmZyb21CaW5hcnkoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBcInRoZSBwcm90b2J1ZiByZXF1ZXN0IGNvdWxkIG5vdCBiZSBkZWNvZGVkXCI7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IHR3aXJwX3RzXzEuVHdpcnBFcnJvcih0d2lycF90c18xLlR3aXJwRXJyb3JDb2RlLk1hbGZvcm1lZCwgbXNnKS53aXRoQ2F1c2UoZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVyY2VwdG9ycyAmJiBpbnRlcmNlcHRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJjZXB0b3IgPSAoMCwgdHdpcnBfdHNfMS5jaGFpbkludGVyY2VwdG9ycykoLi4uaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgaW50ZXJjZXB0b3IoY3R4LCByZXF1ZXN0LCAoY3R4LCBpbnB1dFJlcSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLkZpbmFsaXplQXJ0aWZhY3QoY3R4LCBpbnB1dFJlcSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgc2VydmljZS5GaW5hbGl6ZUFydGlmYWN0KGN0eCwgcmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFydGlmYWN0XzEuRmluYWxpemVBcnRpZmFjdFJlc3BvbnNlLnRvQmluYXJ5KHJlc3BvbnNlKSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VMaXN0QXJ0aWZhY3RzUHJvdG9idWYoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVxdWVzdDtcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVxdWVzdCA9IGFydGlmYWN0XzEuTGlzdEFydGlmYWN0c1JlcXVlc3QuZnJvbUJpbmFyeShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IFwidGhlIHByb3RvYnVmIHJlcXVlc3QgY291bGQgbm90IGJlIGRlY29kZWRcIjtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgdHdpcnBfdHNfMS5Ud2lycEVycm9yKHR3aXJwX3RzXzEuVHdpcnBFcnJvckNvZGUuTWFsZm9ybWVkLCBtc2cpLndpdGhDYXVzZShlLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZXJjZXB0b3JzICYmIGludGVyY2VwdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBpbnRlcmNlcHRvciA9ICgwLCB0d2lycF90c18xLmNoYWluSW50ZXJjZXB0b3JzKSguLi5pbnRlcmNlcHRvcnMpO1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBpbnRlcmNlcHRvcihjdHgsIHJlcXVlc3QsIChjdHgsIGlucHV0UmVxKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UuTGlzdEFydGlmYWN0cyhjdHgsIGlucHV0UmVxKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBzZXJ2aWNlLkxpc3RBcnRpZmFjdHMoY3R4LCByZXF1ZXN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYXJ0aWZhY3RfMS5MaXN0QXJ0aWZhY3RzUmVzcG9uc2UudG9CaW5hcnkocmVzcG9uc2UpKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUFydGlmYWN0U2VydmljZUdldFNpZ25lZEFydGlmYWN0VVJMUHJvdG9idWYoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVxdWVzdDtcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVxdWVzdCA9IGFydGlmYWN0XzEuR2V0U2lnbmVkQXJ0aWZhY3RVUkxSZXF1ZXN0LmZyb21CaW5hcnkoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBcInRoZSBwcm90b2J1ZiByZXF1ZXN0IGNvdWxkIG5vdCBiZSBkZWNvZGVkXCI7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IHR3aXJwX3RzXzEuVHdpcnBFcnJvcih0d2lycF90c18xLlR3aXJwRXJyb3JDb2RlLk1hbGZvcm1lZCwgbXNnKS53aXRoQ2F1c2UoZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVyY2VwdG9ycyAmJiBpbnRlcmNlcHRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJjZXB0b3IgPSAoMCwgdHdpcnBfdHNfMS5jaGFpbkludGVyY2VwdG9ycykoLi4uaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgaW50ZXJjZXB0b3IoY3R4LCByZXF1ZXN0LCAoY3R4LCBpbnB1dFJlcSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLkdldFNpZ25lZEFydGlmYWN0VVJMKGN0eCwgaW5wdXRSZXEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIHNlcnZpY2UuR2V0U2lnbmVkQXJ0aWZhY3RVUkwoY3R4LCByZXF1ZXN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYXJ0aWZhY3RfMS5HZXRTaWduZWRBcnRpZmFjdFVSTFJlc3BvbnNlLnRvQmluYXJ5KHJlc3BvbnNlKSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VEZWxldGVBcnRpZmFjdFByb3RvYnVmKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlcXVlc3Q7XG4gICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlcXVlc3QgPSBhcnRpZmFjdF8xLkRlbGV0ZUFydGlmYWN0UmVxdWVzdC5mcm9tQmluYXJ5KGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gXCJ0aGUgcHJvdG9idWYgcmVxdWVzdCBjb3VsZCBub3QgYmUgZGVjb2RlZFwiO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyB0d2lycF90c18xLlR3aXJwRXJyb3IodHdpcnBfdHNfMS5Ud2lycEVycm9yQ29kZS5NYWxmb3JtZWQsIG1zZykud2l0aENhdXNlKGUsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdG9yID0gKDAsIHR3aXJwX3RzXzEuY2hhaW5JbnRlcmNlcHRvcnMpKC4uLmludGVyY2VwdG9ycyk7XG4gICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIGludGVyY2VwdG9yKGN0eCwgcmVxdWVzdCwgKGN0eCwgaW5wdXRSZXEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5EZWxldGVBcnRpZmFjdChjdHgsIGlucHV0UmVxKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBzZXJ2aWNlLkRlbGV0ZUFydGlmYWN0KGN0eCwgcmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFydGlmYWN0XzEuRGVsZXRlQXJ0aWZhY3RSZXNwb25zZS50b0JpbmFyeShyZXNwb25zZSkpO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJ0aWZhY3QudHdpcnAuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5444\n')},1295:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === "function")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.DefaultArtifactClient = void 0;\nconst core_1 = __webpack_require__(2225);\nconst config_1 = __webpack_require__(1020);\nconst upload_artifact_1 = __webpack_require__(1101);\nconst download_artifact_1 = __webpack_require__(6394);\nconst delete_artifact_1 = __webpack_require__(7338);\nconst get_artifact_1 = __webpack_require__(1755);\nconst list_artifacts_1 = __webpack_require__(4041);\nconst errors_1 = __webpack_require__(5666);\n/**\n * The default artifact client that is used by the artifact action(s).\n */\nclass DefaultArtifactClient {\n uploadArtifact(name, files, rootDirectory, options) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n if ((0, config_1.isGhes)()) {\n throw new errors_1.GHESNotSupportedError();\n }\n return (0, upload_artifact_1.uploadArtifact)(name, files, rootDirectory, options);\n }\n catch (error) {\n (0, core_1.warning)(`Artifact upload failed with error: ${error}.\n\nErrors can be temporary, so please try again and optionally run the action with debug mode enabled for more information.\n\nIf the error persists, please check whether Actions is operating normally at [https://githubstatus.com](https://www.githubstatus.com).`);\n throw error;\n }\n });\n }\n downloadArtifact(artifactId, options) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n if ((0, config_1.isGhes)()) {\n throw new errors_1.GHESNotSupportedError();\n }\n if (options === null || options === void 0 ? void 0 : options.findBy) {\n const { findBy: { repositoryOwner, repositoryName, token } } = options, downloadOptions = __rest(options, ["findBy"]);\n return (0, download_artifact_1.downloadArtifactPublic)(artifactId, repositoryOwner, repositoryName, token, downloadOptions);\n }\n return (0, download_artifact_1.downloadArtifactInternal)(artifactId, options);\n }\n catch (error) {\n (0, core_1.warning)(`Download Artifact failed with error: ${error}.\n\nErrors can be temporary, so please try again and optionally run the action with debug mode enabled for more information.\n\nIf the error persists, please check whether Actions and API requests are operating normally at [https://githubstatus.com](https://www.githubstatus.com).`);\n throw error;\n }\n });\n }\n listArtifacts(options) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n if ((0, config_1.isGhes)()) {\n throw new errors_1.GHESNotSupportedError();\n }\n if (options === null || options === void 0 ? void 0 : options.findBy) {\n const { findBy: { workflowRunId, repositoryOwner, repositoryName, token } } = options;\n return (0, list_artifacts_1.listArtifactsPublic)(workflowRunId, repositoryOwner, repositoryName, token, options === null || options === void 0 ? void 0 : options.latest);\n }\n return (0, list_artifacts_1.listArtifactsInternal)(options === null || options === void 0 ? void 0 : options.latest);\n }\n catch (error) {\n (0, core_1.warning)(`Listing Artifacts failed with error: ${error}.\n\nErrors can be temporary, so please try again and optionally run the action with debug mode enabled for more information.\n\nIf the error persists, please check whether Actions and API requests are operating normally at [https://githubstatus.com](https://www.githubstatus.com).`);\n throw error;\n }\n });\n }\n getArtifact(artifactName, options) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n if ((0, config_1.isGhes)()) {\n throw new errors_1.GHESNotSupportedError();\n }\n if (options === null || options === void 0 ? void 0 : options.findBy) {\n const { findBy: { workflowRunId, repositoryOwner, repositoryName, token } } = options;\n return (0, get_artifact_1.getArtifactPublic)(artifactName, workflowRunId, repositoryOwner, repositoryName, token);\n }\n return (0, get_artifact_1.getArtifactInternal)(artifactName);\n }\n catch (error) {\n (0, core_1.warning)(`Get Artifact failed with error: ${error}.\n\nErrors can be temporary, so please try again and optionally run the action with debug mode enabled for more information.\n\nIf the error persists, please check whether Actions and API requests are operating normally at [https://githubstatus.com](https://www.githubstatus.com).`);\n throw error;\n }\n });\n }\n deleteArtifact(artifactName, options) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n if ((0, config_1.isGhes)()) {\n throw new errors_1.GHESNotSupportedError();\n }\n if (options === null || options === void 0 ? void 0 : options.findBy) {\n const { findBy: { repositoryOwner, repositoryName, workflowRunId, token } } = options;\n return (0, delete_artifact_1.deleteArtifactPublic)(artifactName, workflowRunId, repositoryOwner, repositoryName, token);\n }\n return (0, delete_artifact_1.deleteArtifactInternal)(artifactName);\n }\n catch (error) {\n (0, core_1.warning)(`Delete Artifact failed with error: ${error}.\n\nErrors can be temporary, so please try again and optionally run the action with debug mode enabled for more information.\n\nIf the error persists, please check whether Actions and API requests are operating normally at [https://githubstatus.com](https://www.githubstatus.com).`);\n throw error;\n }\n });\n }\n}\nexports.DefaultArtifactClient = DefaultArtifactClient;\n//# sourceMappingURL=client.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI5NS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0EsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZELGNBQWM7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCw2QkFBNkI7QUFDN0IsZUFBZSxtQkFBTyxDQUFDLElBQWU7QUFDdEMsaUJBQWlCLG1CQUFPLENBQUMsSUFBaUI7QUFDMUMsMEJBQTBCLG1CQUFPLENBQUMsSUFBMEI7QUFDNUQsNEJBQTRCLG1CQUFPLENBQUMsSUFBOEI7QUFDbEUsMEJBQTBCLG1CQUFPLENBQUMsSUFBMEI7QUFDNUQsdUJBQXVCLG1CQUFPLENBQUMsSUFBcUI7QUFDcEQseUJBQXlCLG1CQUFPLENBQUMsSUFBdUI7QUFDeEQsaUJBQWlCLG1CQUFPLENBQUMsSUFBaUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEUsTUFBTTs7QUFFaEY7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsVUFBVSwyQ0FBMkM7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRFQUE0RSxNQUFNOztBQUVsRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixVQUFVLDBEQUEwRDtBQUNoRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEVBQTRFLE1BQU07O0FBRWxGOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFVBQVUsMERBQTBEO0FBQ2hHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUUsTUFBTTs7QUFFN0U7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsVUFBVSwwREFBMEQ7QUFDaEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBFQUEwRSxNQUFNOztBQUVoRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QiIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9pbnRlcm5hbC9jbGllbnQuanM/M2M0ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9fcmVzdCA9ICh0aGlzICYmIHRoaXMuX19yZXN0KSB8fCBmdW5jdGlvbiAocywgZSkge1xuICAgIHZhciB0ID0ge307XG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICAgIHRbcF0gPSBzW3BdO1xuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EZWZhdWx0QXJ0aWZhY3RDbGllbnQgPSB2b2lkIDA7XG5jb25zdCBjb3JlXzEgPSByZXF1aXJlKFwiQGFjdGlvbnMvY29yZVwiKTtcbmNvbnN0IGNvbmZpZ18xID0gcmVxdWlyZShcIi4vc2hhcmVkL2NvbmZpZ1wiKTtcbmNvbnN0IHVwbG9hZF9hcnRpZmFjdF8xID0gcmVxdWlyZShcIi4vdXBsb2FkL3VwbG9hZC1hcnRpZmFjdFwiKTtcbmNvbnN0IGRvd25sb2FkX2FydGlmYWN0XzEgPSByZXF1aXJlKFwiLi9kb3dubG9hZC9kb3dubG9hZC1hcnRpZmFjdFwiKTtcbmNvbnN0IGRlbGV0ZV9hcnRpZmFjdF8xID0gcmVxdWlyZShcIi4vZGVsZXRlL2RlbGV0ZS1hcnRpZmFjdFwiKTtcbmNvbnN0IGdldF9hcnRpZmFjdF8xID0gcmVxdWlyZShcIi4vZmluZC9nZXQtYXJ0aWZhY3RcIik7XG5jb25zdCBsaXN0X2FydGlmYWN0c18xID0gcmVxdWlyZShcIi4vZmluZC9saXN0LWFydGlmYWN0c1wiKTtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4vc2hhcmVkL2Vycm9yc1wiKTtcbi8qKlxuICogVGhlIGRlZmF1bHQgYXJ0aWZhY3QgY2xpZW50IHRoYXQgaXMgdXNlZCBieSB0aGUgYXJ0aWZhY3QgYWN0aW9uKHMpLlxuICovXG5jbGFzcyBEZWZhdWx0QXJ0aWZhY3RDbGllbnQge1xuICAgIHVwbG9hZEFydGlmYWN0KG5hbWUsIGZpbGVzLCByb290RGlyZWN0b3J5LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICgoMCwgY29uZmlnXzEuaXNHaGVzKSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5HSEVTTm90U3VwcG9ydGVkRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICgwLCB1cGxvYWRfYXJ0aWZhY3RfMS51cGxvYWRBcnRpZmFjdCkobmFtZSwgZmlsZXMsIHJvb3REaXJlY3RvcnksIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgKDAsIGNvcmVfMS53YXJuaW5nKShgQXJ0aWZhY3QgdXBsb2FkIGZhaWxlZCB3aXRoIGVycm9yOiAke2Vycm9yfS5cblxuRXJyb3JzIGNhbiBiZSB0ZW1wb3JhcnksIHNvIHBsZWFzZSB0cnkgYWdhaW4gYW5kIG9wdGlvbmFsbHkgcnVuIHRoZSBhY3Rpb24gd2l0aCBkZWJ1ZyBtb2RlIGVuYWJsZWQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbklmIHRoZSBlcnJvciBwZXJzaXN0cywgcGxlYXNlIGNoZWNrIHdoZXRoZXIgQWN0aW9ucyBpcyBvcGVyYXRpbmcgbm9ybWFsbHkgYXQgW2h0dHBzOi8vZ2l0aHVic3RhdHVzLmNvbV0oaHR0cHM6Ly93d3cuZ2l0aHVic3RhdHVzLmNvbSkuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkb3dubG9hZEFydGlmYWN0KGFydGlmYWN0SWQsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCgwLCBjb25maWdfMS5pc0doZXMpKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkdIRVNOb3RTdXBwb3J0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmZpbmRCeSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGZpbmRCeTogeyByZXBvc2l0b3J5T3duZXIsIHJlcG9zaXRvcnlOYW1lLCB0b2tlbiB9IH0gPSBvcHRpb25zLCBkb3dubG9hZE9wdGlvbnMgPSBfX3Jlc3Qob3B0aW9ucywgW1wiZmluZEJ5XCJdKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBkb3dubG9hZF9hcnRpZmFjdF8xLmRvd25sb2FkQXJ0aWZhY3RQdWJsaWMpKGFydGlmYWN0SWQsIHJlcG9zaXRvcnlPd25lciwgcmVwb3NpdG9yeU5hbWUsIHRva2VuLCBkb3dubG9hZE9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGRvd25sb2FkX2FydGlmYWN0XzEuZG93bmxvYWRBcnRpZmFjdEludGVybmFsKShhcnRpZmFjdElkLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICgwLCBjb3JlXzEud2FybmluZykoYERvd25sb2FkIEFydGlmYWN0IGZhaWxlZCB3aXRoIGVycm9yOiAke2Vycm9yfS5cblxuRXJyb3JzIGNhbiBiZSB0ZW1wb3JhcnksIHNvIHBsZWFzZSB0cnkgYWdhaW4gYW5kIG9wdGlvbmFsbHkgcnVuIHRoZSBhY3Rpb24gd2l0aCBkZWJ1ZyBtb2RlIGVuYWJsZWQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbklmIHRoZSBlcnJvciBwZXJzaXN0cywgcGxlYXNlIGNoZWNrIHdoZXRoZXIgQWN0aW9ucyBhbmQgQVBJIHJlcXVlc3RzIGFyZSBvcGVyYXRpbmcgbm9ybWFsbHkgYXQgW2h0dHBzOi8vZ2l0aHVic3RhdHVzLmNvbV0oaHR0cHM6Ly93d3cuZ2l0aHVic3RhdHVzLmNvbSkuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsaXN0QXJ0aWZhY3RzKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCgwLCBjb25maWdfMS5pc0doZXMpKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkdIRVNOb3RTdXBwb3J0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmZpbmRCeSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGZpbmRCeTogeyB3b3JrZmxvd1J1bklkLCByZXBvc2l0b3J5T3duZXIsIHJlcG9zaXRvcnlOYW1lLCB0b2tlbiB9IH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGxpc3RfYXJ0aWZhY3RzXzEubGlzdEFydGlmYWN0c1B1YmxpYykod29ya2Zsb3dSdW5JZCwgcmVwb3NpdG9yeU93bmVyLCByZXBvc2l0b3J5TmFtZSwgdG9rZW4sIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5sYXRlc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGxpc3RfYXJ0aWZhY3RzXzEubGlzdEFydGlmYWN0c0ludGVybmFsKShvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubGF0ZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICgwLCBjb3JlXzEud2FybmluZykoYExpc3RpbmcgQXJ0aWZhY3RzIGZhaWxlZCB3aXRoIGVycm9yOiAke2Vycm9yfS5cblxuRXJyb3JzIGNhbiBiZSB0ZW1wb3JhcnksIHNvIHBsZWFzZSB0cnkgYWdhaW4gYW5kIG9wdGlvbmFsbHkgcnVuIHRoZSBhY3Rpb24gd2l0aCBkZWJ1ZyBtb2RlIGVuYWJsZWQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbklmIHRoZSBlcnJvciBwZXJzaXN0cywgcGxlYXNlIGNoZWNrIHdoZXRoZXIgQWN0aW9ucyBhbmQgQVBJIHJlcXVlc3RzIGFyZSBvcGVyYXRpbmcgbm9ybWFsbHkgYXQgW2h0dHBzOi8vZ2l0aHVic3RhdHVzLmNvbV0oaHR0cHM6Ly93d3cuZ2l0aHVic3RhdHVzLmNvbSkuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRBcnRpZmFjdChhcnRpZmFjdE5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCgwLCBjb25maWdfMS5pc0doZXMpKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkdIRVNOb3RTdXBwb3J0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmZpbmRCeSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGZpbmRCeTogeyB3b3JrZmxvd1J1bklkLCByZXBvc2l0b3J5T3duZXIsIHJlcG9zaXRvcnlOYW1lLCB0b2tlbiB9IH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGdldF9hcnRpZmFjdF8xLmdldEFydGlmYWN0UHVibGljKShhcnRpZmFjdE5hbWUsIHdvcmtmbG93UnVuSWQsIHJlcG9zaXRvcnlPd25lciwgcmVwb3NpdG9yeU5hbWUsIHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICgwLCBnZXRfYXJ0aWZhY3RfMS5nZXRBcnRpZmFjdEludGVybmFsKShhcnRpZmFjdE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgKDAsIGNvcmVfMS53YXJuaW5nKShgR2V0IEFydGlmYWN0IGZhaWxlZCB3aXRoIGVycm9yOiAke2Vycm9yfS5cblxuRXJyb3JzIGNhbiBiZSB0ZW1wb3JhcnksIHNvIHBsZWFzZSB0cnkgYWdhaW4gYW5kIG9wdGlvbmFsbHkgcnVuIHRoZSBhY3Rpb24gd2l0aCBkZWJ1ZyBtb2RlIGVuYWJsZWQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbklmIHRoZSBlcnJvciBwZXJzaXN0cywgcGxlYXNlIGNoZWNrIHdoZXRoZXIgQWN0aW9ucyBhbmQgQVBJIHJlcXVlc3RzIGFyZSBvcGVyYXRpbmcgbm9ybWFsbHkgYXQgW2h0dHBzOi8vZ2l0aHVic3RhdHVzLmNvbV0oaHR0cHM6Ly93d3cuZ2l0aHVic3RhdHVzLmNvbSkuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkZWxldGVBcnRpZmFjdChhcnRpZmFjdE5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCgwLCBjb25maWdfMS5pc0doZXMpKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkdIRVNOb3RTdXBwb3J0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmZpbmRCeSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGZpbmRCeTogeyByZXBvc2l0b3J5T3duZXIsIHJlcG9zaXRvcnlOYW1lLCB3b3JrZmxvd1J1bklkLCB0b2tlbiB9IH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGRlbGV0ZV9hcnRpZmFjdF8xLmRlbGV0ZUFydGlmYWN0UHVibGljKShhcnRpZmFjdE5hbWUsIHdvcmtmbG93UnVuSWQsIHJlcG9zaXRvcnlPd25lciwgcmVwb3NpdG9yeU5hbWUsIHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICgwLCBkZWxldGVfYXJ0aWZhY3RfMS5kZWxldGVBcnRpZmFjdEludGVybmFsKShhcnRpZmFjdE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgKDAsIGNvcmVfMS53YXJuaW5nKShgRGVsZXRlIEFydGlmYWN0IGZhaWxlZCB3aXRoIGVycm9yOiAke2Vycm9yfS5cblxuRXJyb3JzIGNhbiBiZSB0ZW1wb3JhcnksIHNvIHBsZWFzZSB0cnkgYWdhaW4gYW5kIG9wdGlvbmFsbHkgcnVuIHRoZSBhY3Rpb24gd2l0aCBkZWJ1ZyBtb2RlIGVuYWJsZWQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbklmIHRoZSBlcnJvciBwZXJzaXN0cywgcGxlYXNlIGNoZWNrIHdoZXRoZXIgQWN0aW9ucyBhbmQgQVBJIHJlcXVlc3RzIGFyZSBvcGVyYXRpbmcgbm9ybWFsbHkgYXQgW2h0dHBzOi8vZ2l0aHVic3RhdHVzLmNvbV0oaHR0cHM6Ly93d3cuZ2l0aHVic3RhdHVzLmNvbSkuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuRGVmYXVsdEFydGlmYWN0Q2xpZW50ID0gRGVmYXVsdEFydGlmYWN0Q2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2xpZW50LmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1295\n')},7338:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.deleteArtifactInternal = exports.deleteArtifactPublic = void 0;\nconst core_1 = __webpack_require__(2225);\nconst github_1 = __webpack_require__(5946);\nconst user_agent_1 = __webpack_require__(5270);\nconst retry_options_1 = __webpack_require__(666);\nconst utils_1 = __webpack_require__(5362);\nconst plugin_request_log_1 = __webpack_require__(9083);\nconst plugin_retry_1 = __webpack_require__(6964);\nconst artifact_twirp_client_1 = __webpack_require__(2445);\nconst util_1 = __webpack_require__(3379);\nconst generated_1 = __webpack_require__(2330);\nconst get_artifact_1 = __webpack_require__(1755);\nconst errors_1 = __webpack_require__(5666);\nfunction deleteArtifactPublic(artifactName, workflowRunId, repositoryOwner, repositoryName, token) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const [retryOpts, requestOpts] = (0, retry_options_1.getRetryOptions)(utils_1.defaults);\n const opts = {\n log: undefined,\n userAgent: (0, user_agent_1.getUserAgentString)(),\n previews: undefined,\n retry: retryOpts,\n request: requestOpts\n };\n const github = (0, github_1.getOctokit)(token, opts, plugin_retry_1.retry, plugin_request_log_1.requestLog);\n const getArtifactResp = yield (0, get_artifact_1.getArtifactPublic)(artifactName, workflowRunId, repositoryOwner, repositoryName, token);\n const deleteArtifactResp = yield github.rest.actions.deleteArtifact({\n owner: repositoryOwner,\n repo: repositoryName,\n artifact_id: getArtifactResp.artifact.id\n });\n if (deleteArtifactResp.status !== 204) {\n throw new errors_1.InvalidResponseError(`Invalid response from GitHub API: ${deleteArtifactResp.status} (${(_a = deleteArtifactResp === null || deleteArtifactResp === void 0 ? void 0 : deleteArtifactResp.headers) === null || _a === void 0 ? void 0 : _a['x-github-request-id']})`);\n }\n return {\n id: getArtifactResp.artifact.id\n };\n });\n}\nexports.deleteArtifactPublic = deleteArtifactPublic;\nfunction deleteArtifactInternal(artifactName) {\n return __awaiter(this, void 0, void 0, function* () {\n const artifactClient = (0, artifact_twirp_client_1.internalArtifactTwirpClient)();\n const { workflowRunBackendId, workflowJobRunBackendId } = (0, util_1.getBackendIdsFromToken)();\n const listReq = {\n workflowRunBackendId,\n workflowJobRunBackendId,\n nameFilter: generated_1.StringValue.create({ value: artifactName })\n };\n const listRes = yield artifactClient.ListArtifacts(listReq);\n if (listRes.artifacts.length === 0) {\n throw new errors_1.ArtifactNotFoundError(`Artifact not found for name: ${artifactName}`);\n }\n let artifact = listRes.artifacts[0];\n if (listRes.artifacts.length > 1) {\n artifact = listRes.artifacts.sort((a, b) => Number(b.databaseId) - Number(a.databaseId))[0];\n (0, core_1.debug)(`More than one artifact found for a single name, returning newest (id: ${artifact.databaseId})`);\n }\n const req = {\n workflowRunBackendId: artifact.workflowRunBackendId,\n workflowJobRunBackendId: artifact.workflowJobRunBackendId,\n name: artifact.name\n };\n const res = yield artifactClient.DeleteArtifact(req);\n (0, core_1.info)(`Artifact '${artifactName}' (ID: ${res.artifactId}) deleted`);\n return {\n id: Number(res.artifactId)\n };\n });\n}\nexports.deleteArtifactInternal = deleteArtifactInternal;\n//# sourceMappingURL=delete-artifact.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzMzOC5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0EsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsOEJBQThCLEdBQUcsNEJBQTRCO0FBQzdELGVBQWUsbUJBQU8sQ0FBQyxJQUFlO0FBQ3RDLGlCQUFpQixtQkFBTyxDQUFDLElBQWlCO0FBQzFDLHFCQUFxQixtQkFBTyxDQUFDLElBQXNCO0FBQ25ELHdCQUF3QixtQkFBTyxDQUFDLEdBQXVCO0FBQ3ZELGdCQUFnQixtQkFBTyxDQUFDLElBQTJCO0FBQ25ELDZCQUE2QixtQkFBTyxDQUFDLElBQTZCO0FBQ2xFLHVCQUF1QixtQkFBTyxDQUFDLElBQXVCO0FBQ3RELGdDQUFnQyxtQkFBTyxDQUFDLElBQWlDO0FBQ3pFLGVBQWUsbUJBQU8sQ0FBQyxJQUFnQjtBQUN2QyxvQkFBb0IsbUJBQU8sQ0FBQyxJQUFpQjtBQUM3Qyx1QkFBdUIsbUJBQU8sQ0FBQyxJQUFzQjtBQUNyRCxpQkFBaUIsbUJBQU8sQ0FBQyxJQUFrQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EseUZBQXlGLDJCQUEyQixHQUFHLHlLQUF5SztBQUNoUztBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsZ0RBQWdEO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCxxQkFBcUI7QUFDOUU7QUFDQTtBQUNBO0FBQ0EscUZBQXFGLGFBQWE7QUFDbEc7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1R0FBdUcsb0JBQW9CO0FBQzNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLGFBQWEsU0FBUyxlQUFlO0FBQzNFO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLDhCQUE4QjtBQUM5QiIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9pbnRlcm5hbC9kZWxldGUvZGVsZXRlLWFydGlmYWN0LmpzP2ZjYmIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVsZXRlQXJ0aWZhY3RJbnRlcm5hbCA9IGV4cG9ydHMuZGVsZXRlQXJ0aWZhY3RQdWJsaWMgPSB2b2lkIDA7XG5jb25zdCBjb3JlXzEgPSByZXF1aXJlKFwiQGFjdGlvbnMvY29yZVwiKTtcbmNvbnN0IGdpdGh1Yl8xID0gcmVxdWlyZShcIkBhY3Rpb25zL2dpdGh1YlwiKTtcbmNvbnN0IHVzZXJfYWdlbnRfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvdXNlci1hZ2VudFwiKTtcbmNvbnN0IHJldHJ5X29wdGlvbnNfMSA9IHJlcXVpcmUoXCIuLi9maW5kL3JldHJ5LW9wdGlvbnNcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIkBhY3Rpb25zL2dpdGh1Yi9saWIvdXRpbHNcIik7XG5jb25zdCBwbHVnaW5fcmVxdWVzdF9sb2dfMSA9IHJlcXVpcmUoXCJAb2N0b2tpdC9wbHVnaW4tcmVxdWVzdC1sb2dcIik7XG5jb25zdCBwbHVnaW5fcmV0cnlfMSA9IHJlcXVpcmUoXCJAb2N0b2tpdC9wbHVnaW4tcmV0cnlcIik7XG5jb25zdCBhcnRpZmFjdF90d2lycF9jbGllbnRfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvYXJ0aWZhY3QtdHdpcnAtY2xpZW50XCIpO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4uL3NoYXJlZC91dGlsXCIpO1xuY29uc3QgZ2VuZXJhdGVkXzEgPSByZXF1aXJlKFwiLi4vLi4vZ2VuZXJhdGVkXCIpO1xuY29uc3QgZ2V0X2FydGlmYWN0XzEgPSByZXF1aXJlKFwiLi4vZmluZC9nZXQtYXJ0aWZhY3RcIik7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvZXJyb3JzXCIpO1xuZnVuY3Rpb24gZGVsZXRlQXJ0aWZhY3RQdWJsaWMoYXJ0aWZhY3ROYW1lLCB3b3JrZmxvd1J1bklkLCByZXBvc2l0b3J5T3duZXIsIHJlcG9zaXRvcnlOYW1lLCB0b2tlbikge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBbcmV0cnlPcHRzLCByZXF1ZXN0T3B0c10gPSAoMCwgcmV0cnlfb3B0aW9uc18xLmdldFJldHJ5T3B0aW9ucykodXRpbHNfMS5kZWZhdWx0cyk7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgICAgICBsb2c6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHVzZXJBZ2VudDogKDAsIHVzZXJfYWdlbnRfMS5nZXRVc2VyQWdlbnRTdHJpbmcpKCksXG4gICAgICAgICAgICBwcmV2aWV3czogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcmV0cnk6IHJldHJ5T3B0cyxcbiAgICAgICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RPcHRzXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGdpdGh1YiA9ICgwLCBnaXRodWJfMS5nZXRPY3Rva2l0KSh0b2tlbiwgb3B0cywgcGx1Z2luX3JldHJ5XzEucmV0cnksIHBsdWdpbl9yZXF1ZXN0X2xvZ18xLnJlcXVlc3RMb2cpO1xuICAgICAgICBjb25zdCBnZXRBcnRpZmFjdFJlc3AgPSB5aWVsZCAoMCwgZ2V0X2FydGlmYWN0XzEuZ2V0QXJ0aWZhY3RQdWJsaWMpKGFydGlmYWN0TmFtZSwgd29ya2Zsb3dSdW5JZCwgcmVwb3NpdG9yeU93bmVyLCByZXBvc2l0b3J5TmFtZSwgdG9rZW4pO1xuICAgICAgICBjb25zdCBkZWxldGVBcnRpZmFjdFJlc3AgPSB5aWVsZCBnaXRodWIucmVzdC5hY3Rpb25zLmRlbGV0ZUFydGlmYWN0KHtcbiAgICAgICAgICAgIG93bmVyOiByZXBvc2l0b3J5T3duZXIsXG4gICAgICAgICAgICByZXBvOiByZXBvc2l0b3J5TmFtZSxcbiAgICAgICAgICAgIGFydGlmYWN0X2lkOiBnZXRBcnRpZmFjdFJlc3AuYXJ0aWZhY3QuaWRcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChkZWxldGVBcnRpZmFjdFJlc3Auc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5JbnZhbGlkUmVzcG9uc2VFcnJvcihgSW52YWxpZCByZXNwb25zZSBmcm9tIEdpdEh1YiBBUEk6ICR7ZGVsZXRlQXJ0aWZhY3RSZXNwLnN0YXR1c30gKCR7KF9hID0gZGVsZXRlQXJ0aWZhY3RSZXNwID09PSBudWxsIHx8IGRlbGV0ZUFydGlmYWN0UmVzcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVsZXRlQXJ0aWZhY3RSZXNwLmhlYWRlcnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYVsneC1naXRodWItcmVxdWVzdC1pZCddfSlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGdldEFydGlmYWN0UmVzcC5hcnRpZmFjdC5pZFxuICAgICAgICB9O1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWxldGVBcnRpZmFjdFB1YmxpYyA9IGRlbGV0ZUFydGlmYWN0UHVibGljO1xuZnVuY3Rpb24gZGVsZXRlQXJ0aWZhY3RJbnRlcm5hbChhcnRpZmFjdE5hbWUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBhcnRpZmFjdENsaWVudCA9ICgwLCBhcnRpZmFjdF90d2lycF9jbGllbnRfMS5pbnRlcm5hbEFydGlmYWN0VHdpcnBDbGllbnQpKCk7XG4gICAgICAgIGNvbnN0IHsgd29ya2Zsb3dSdW5CYWNrZW5kSWQsIHdvcmtmbG93Sm9iUnVuQmFja2VuZElkIH0gPSAoMCwgdXRpbF8xLmdldEJhY2tlbmRJZHNGcm9tVG9rZW4pKCk7XG4gICAgICAgIGNvbnN0IGxpc3RSZXEgPSB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bkJhY2tlbmRJZCxcbiAgICAgICAgICAgIHdvcmtmbG93Sm9iUnVuQmFja2VuZElkLFxuICAgICAgICAgICAgbmFtZUZpbHRlcjogZ2VuZXJhdGVkXzEuU3RyaW5nVmFsdWUuY3JlYXRlKHsgdmFsdWU6IGFydGlmYWN0TmFtZSB9KVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBsaXN0UmVzID0geWllbGQgYXJ0aWZhY3RDbGllbnQuTGlzdEFydGlmYWN0cyhsaXN0UmVxKTtcbiAgICAgICAgaWYgKGxpc3RSZXMuYXJ0aWZhY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkFydGlmYWN0Tm90Rm91bmRFcnJvcihgQXJ0aWZhY3Qgbm90IGZvdW5kIGZvciBuYW1lOiAke2FydGlmYWN0TmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYXJ0aWZhY3QgPSBsaXN0UmVzLmFydGlmYWN0c1swXTtcbiAgICAgICAgaWYgKGxpc3RSZXMuYXJ0aWZhY3RzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGFydGlmYWN0ID0gbGlzdFJlcy5hcnRpZmFjdHMuc29ydCgoYSwgYikgPT4gTnVtYmVyKGIuZGF0YWJhc2VJZCkgLSBOdW1iZXIoYS5kYXRhYmFzZUlkKSlbMF07XG4gICAgICAgICAgICAoMCwgY29yZV8xLmRlYnVnKShgTW9yZSB0aGFuIG9uZSBhcnRpZmFjdCBmb3VuZCBmb3IgYSBzaW5nbGUgbmFtZSwgcmV0dXJuaW5nIG5ld2VzdCAoaWQ6ICR7YXJ0aWZhY3QuZGF0YWJhc2VJZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxID0ge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5CYWNrZW5kSWQ6IGFydGlmYWN0LndvcmtmbG93UnVuQmFja2VuZElkLFxuICAgICAgICAgICAgd29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQ6IGFydGlmYWN0LndvcmtmbG93Sm9iUnVuQmFja2VuZElkLFxuICAgICAgICAgICAgbmFtZTogYXJ0aWZhY3QubmFtZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXMgPSB5aWVsZCBhcnRpZmFjdENsaWVudC5EZWxldGVBcnRpZmFjdChyZXEpO1xuICAgICAgICAoMCwgY29yZV8xLmluZm8pKGBBcnRpZmFjdCAnJHthcnRpZmFjdE5hbWV9JyAoSUQ6ICR7cmVzLmFydGlmYWN0SWR9KSBkZWxldGVkYCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogTnVtYmVyKHJlcy5hcnRpZmFjdElkKVxuICAgICAgICB9O1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWxldGVBcnRpZmFjdEludGVybmFsID0gZGVsZXRlQXJ0aWZhY3RJbnRlcm5hbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlbGV0ZS1hcnRpZmFjdC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7338\n")},6394:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.downloadArtifactInternal = exports.downloadArtifactPublic = exports.streamExtractExternal = void 0;\nconst promises_1 = __importDefault(__webpack_require__(3292));\nconst github = __importStar(__webpack_require__(5946));\nconst core = __importStar(__webpack_require__(2225));\nconst httpClient = __importStar(__webpack_require__(4635));\nconst unzip_stream_1 = __importDefault(__webpack_require__(9367));\nconst user_agent_1 = __webpack_require__(5270);\nconst config_1 = __webpack_require__(1020);\nconst artifact_twirp_client_1 = __webpack_require__(2445);\nconst generated_1 = __webpack_require__(2330);\nconst util_1 = __webpack_require__(3379);\nconst errors_1 = __webpack_require__(5666);\nconst scrubQueryParameters = (url) => {\n const parsed = new URL(url);\n parsed.search = '';\n return parsed.toString();\n};\nfunction exists(path) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n yield promises_1.default.access(path);\n return true;\n }\n catch (error) {\n if (error.code === 'ENOENT') {\n return false;\n }\n else {\n throw error;\n }\n }\n });\n}\nfunction streamExtract(url, directory) {\n return __awaiter(this, void 0, void 0, function* () {\n let retryCount = 0;\n while (retryCount < 5) {\n try {\n yield streamExtractExternal(url, directory);\n return;\n }\n catch (error) {\n retryCount++;\n core.debug(`Failed to download artifact after ${retryCount} retries due to ${error.message}. Retrying in 5 seconds...`);\n // wait 5 seconds before retrying\n yield new Promise(resolve => setTimeout(resolve, 5000));\n }\n }\n throw new Error(`Artifact download failed after ${retryCount} retries.`);\n });\n}\nfunction streamExtractExternal(url, directory) {\n return __awaiter(this, void 0, void 0, function* () {\n const client = new httpClient.HttpClient((0, user_agent_1.getUserAgentString)());\n const response = yield client.get(url);\n if (response.message.statusCode !== 200) {\n throw new Error(`Unexpected HTTP response from blob storage: ${response.message.statusCode} ${response.message.statusMessage}`);\n }\n const timeout = 30 * 1000; // 30 seconds\n return new Promise((resolve, reject) => {\n const timerFn = () => {\n response.message.destroy(new Error(`Blob storage chunk did not respond in ${timeout}ms`));\n };\n const timer = setTimeout(timerFn, timeout);\n response.message\n .on('data', () => {\n timer.refresh();\n })\n .on('error', (error) => {\n core.debug(`response.message: Artifact download failed: ${error.message}`);\n clearTimeout(timer);\n reject(error);\n })\n .pipe(unzip_stream_1.default.Extract({ path: directory }))\n .on('close', () => {\n clearTimeout(timer);\n resolve();\n })\n .on('error', (error) => {\n reject(error);\n });\n });\n });\n}\nexports.streamExtractExternal = streamExtractExternal;\nfunction downloadArtifactPublic(artifactId, repositoryOwner, repositoryName, token, options) {\n return __awaiter(this, void 0, void 0, function* () {\n const downloadPath = yield resolveOrCreateDirectory(options === null || options === void 0 ? void 0 : options.path);\n const api = github.getOctokit(token);\n core.info(`Downloading artifact '${artifactId}' from '${repositoryOwner}/${repositoryName}'`);\n const { headers, status } = yield api.rest.actions.downloadArtifact({\n owner: repositoryOwner,\n repo: repositoryName,\n artifact_id: artifactId,\n archive_format: 'zip',\n request: {\n redirect: 'manual'\n }\n });\n if (status !== 302) {\n throw new Error(`Unable to download artifact. Unexpected status: ${status}`);\n }\n const { location } = headers;\n if (!location) {\n throw new Error(`Unable to redirect to artifact download url`);\n }\n core.info(`Redirecting to blob download url: ${scrubQueryParameters(location)}`);\n try {\n core.info(`Starting download of artifact to: ${downloadPath}`);\n yield streamExtract(location, downloadPath);\n core.info(`Artifact download completed successfully.`);\n }\n catch (error) {\n throw new Error(`Unable to download and extract artifact: ${error.message}`);\n }\n return { downloadPath };\n });\n}\nexports.downloadArtifactPublic = downloadArtifactPublic;\nfunction downloadArtifactInternal(artifactId, options) {\n return __awaiter(this, void 0, void 0, function* () {\n const downloadPath = yield resolveOrCreateDirectory(options === null || options === void 0 ? void 0 : options.path);\n const artifactClient = (0, artifact_twirp_client_1.internalArtifactTwirpClient)();\n const { workflowRunBackendId, workflowJobRunBackendId } = (0, util_1.getBackendIdsFromToken)();\n const listReq = {\n workflowRunBackendId,\n workflowJobRunBackendId,\n idFilter: generated_1.Int64Value.create({ value: artifactId.toString() })\n };\n const { artifacts } = yield artifactClient.ListArtifacts(listReq);\n if (artifacts.length === 0) {\n throw new errors_1.ArtifactNotFoundError(`No artifacts found for ID: ${artifactId}\\nAre you trying to download from a different run? Try specifying a github-token with \\`actions:read\\` scope.`);\n }\n if (artifacts.length > 1) {\n core.warning('Multiple artifacts found, defaulting to first.');\n }\n const signedReq = {\n workflowRunBackendId: artifacts[0].workflowRunBackendId,\n workflowJobRunBackendId: artifacts[0].workflowJobRunBackendId,\n name: artifacts[0].name\n };\n const { signedUrl } = yield artifactClient.GetSignedArtifactURL(signedReq);\n core.info(`Redirecting to blob download url: ${scrubQueryParameters(signedUrl)}`);\n try {\n core.info(`Starting download of artifact to: ${downloadPath}`);\n yield streamExtract(signedUrl, downloadPath);\n core.info(`Artifact download completed successfully.`);\n }\n catch (error) {\n throw new Error(`Unable to download and extract artifact: ${error.message}`);\n }\n return { downloadPath };\n });\n}\nexports.downloadArtifactInternal = downloadArtifactInternal;\nfunction resolveOrCreateDirectory(downloadPath = (0, config_1.getGitHubWorkspaceDir)()) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!(yield exists(downloadPath))) {\n core.debug(`Artifact destination folder does not exist, creating: ${downloadPath}`);\n yield promises_1.default.mkdir(downloadPath, { recursive: true });\n }\n else {\n core.debug(`Artifact destination folder already exists: ${downloadPath}`);\n }\n return downloadPath;\n });\n}\n//# sourceMappingURL=download-artifact.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RjtBQUNBLDJEQUEyRCxhQUFhO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFLGNBQWM7QUFDdEY7QUFDQSxpQkFBaUI7QUFDakIsS0FBSztBQUNMO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBLGdGQUFnRixhQUFhO0FBQzdGLDJEQUEyRCxpQkFBaUI7QUFDNUU7QUFDQTtBQUNBLHNFQUFzRSxhQUFhO0FBQ25GO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9pbnRlcm5hbC9kb3dubG9hZC9kb3dubG9hZC1hcnRpZmFjdC5qcz8xOGRiIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZG93bmxvYWRBcnRpZmFjdEludGVybmFsID0gZXhwb3J0cy5kb3dubG9hZEFydGlmYWN0UHVibGljID0gZXhwb3J0cy5zdHJlYW1FeHRyYWN0RXh0ZXJuYWwgPSB2b2lkIDA7XG5jb25zdCBwcm9taXNlc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJmcy9wcm9taXNlc1wiKSk7XG5jb25zdCBnaXRodWIgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIkBhY3Rpb25zL2dpdGh1YlwiKSk7XG5jb25zdCBjb3JlID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJAYWN0aW9ucy9jb3JlXCIpKTtcbmNvbnN0IGh0dHBDbGllbnQgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIkBhY3Rpb25zL2h0dHAtY2xpZW50XCIpKTtcbmNvbnN0IHVuemlwX3N0cmVhbV8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJ1bnppcC1zdHJlYW1cIikpO1xuY29uc3QgdXNlcl9hZ2VudF8xID0gcmVxdWlyZShcIi4uL3NoYXJlZC91c2VyLWFnZW50XCIpO1xuY29uc3QgY29uZmlnXzEgPSByZXF1aXJlKFwiLi4vc2hhcmVkL2NvbmZpZ1wiKTtcbmNvbnN0IGFydGlmYWN0X3R3aXJwX2NsaWVudF8xID0gcmVxdWlyZShcIi4uL3NoYXJlZC9hcnRpZmFjdC10d2lycC1jbGllbnRcIik7XG5jb25zdCBnZW5lcmF0ZWRfMSA9IHJlcXVpcmUoXCIuLi8uLi9nZW5lcmF0ZWRcIik7XG5jb25zdCB1dGlsXzEgPSByZXF1aXJlKFwiLi4vc2hhcmVkL3V0aWxcIik7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvZXJyb3JzXCIpO1xuY29uc3Qgc2NydWJRdWVyeVBhcmFtZXRlcnMgPSAodXJsKSA9PiB7XG4gICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTCh1cmwpO1xuICAgIHBhcnNlZC5zZWFyY2ggPSAnJztcbiAgICByZXR1cm4gcGFyc2VkLnRvU3RyaW5nKCk7XG59O1xuZnVuY3Rpb24gZXhpc3RzKHBhdGgpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgeWllbGQgcHJvbWlzZXNfMS5kZWZhdWx0LmFjY2VzcyhwYXRoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHN0cmVhbUV4dHJhY3QodXJsLCBkaXJlY3RvcnkpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmV0cnlDb3VudCA9IDA7XG4gICAgICAgIHdoaWxlIChyZXRyeUNvdW50IDwgNSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB5aWVsZCBzdHJlYW1FeHRyYWN0RXh0ZXJuYWwodXJsLCBkaXJlY3RvcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHJ5Q291bnQrKztcbiAgICAgICAgICAgICAgICBjb3JlLmRlYnVnKGBGYWlsZWQgdG8gZG93bmxvYWQgYXJ0aWZhY3QgYWZ0ZXIgJHtyZXRyeUNvdW50fSByZXRyaWVzIGR1ZSB0byAke2Vycm9yLm1lc3NhZ2V9LiBSZXRyeWluZyBpbiA1IHNlY29uZHMuLi5gKTtcbiAgICAgICAgICAgICAgICAvLyB3YWl0IDUgc2Vjb25kcyBiZWZvcmUgcmV0cnlpbmdcbiAgICAgICAgICAgICAgICB5aWVsZCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTAwMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXJ0aWZhY3QgZG93bmxvYWQgZmFpbGVkIGFmdGVyICR7cmV0cnlDb3VudH0gcmV0cmllcy5gKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHN0cmVhbUV4dHJhY3RFeHRlcm5hbCh1cmwsIGRpcmVjdG9yeSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IG5ldyBodHRwQ2xpZW50Lkh0dHBDbGllbnQoKDAsIHVzZXJfYWdlbnRfMS5nZXRVc2VyQWdlbnRTdHJpbmcpKCkpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGNsaWVudC5nZXQodXJsKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLm1lc3NhZ2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgSFRUUCByZXNwb25zZSBmcm9tIGJsb2Igc3RvcmFnZTogJHtyZXNwb25zZS5tZXNzYWdlLnN0YXR1c0NvZGV9ICR7cmVzcG9uc2UubWVzc2FnZS5zdGF0dXNNZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSAzMCAqIDEwMDA7IC8vIDMwIHNlY29uZHNcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVyRm4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZS5kZXN0cm95KG5ldyBFcnJvcihgQmxvYiBzdG9yYWdlIGNodW5rIGRpZCBub3QgcmVzcG9uZCBpbiAke3RpbWVvdXR9bXNgKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KHRpbWVyRm4sIHRpbWVvdXQpO1xuICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZVxuICAgICAgICAgICAgICAgIC5vbignZGF0YScsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aW1lci5yZWZyZXNoKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb3JlLmRlYnVnKGByZXNwb25zZS5tZXNzYWdlOiBBcnRpZmFjdCBkb3dubG9hZCBmYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5waXBlKHVuemlwX3N0cmVhbV8xLmRlZmF1bHQuRXh0cmFjdCh7IHBhdGg6IGRpcmVjdG9yeSB9KSlcbiAgICAgICAgICAgICAgICAub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuc3RyZWFtRXh0cmFjdEV4dGVybmFsID0gc3RyZWFtRXh0cmFjdEV4dGVybmFsO1xuZnVuY3Rpb24gZG93bmxvYWRBcnRpZmFjdFB1YmxpYyhhcnRpZmFjdElkLCByZXBvc2l0b3J5T3duZXIsIHJlcG9zaXRvcnlOYW1lLCB0b2tlbiwgb3B0aW9ucykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGRvd25sb2FkUGF0aCA9IHlpZWxkIHJlc29sdmVPckNyZWF0ZURpcmVjdG9yeShvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucGF0aCk7XG4gICAgICAgIGNvbnN0IGFwaSA9IGdpdGh1Yi5nZXRPY3Rva2l0KHRva2VuKTtcbiAgICAgICAgY29yZS5pbmZvKGBEb3dubG9hZGluZyBhcnRpZmFjdCAnJHthcnRpZmFjdElkfScgZnJvbSAnJHtyZXBvc2l0b3J5T3duZXJ9LyR7cmVwb3NpdG9yeU5hbWV9J2ApO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMsIHN0YXR1cyB9ID0geWllbGQgYXBpLnJlc3QuYWN0aW9ucy5kb3dubG9hZEFydGlmYWN0KHtcbiAgICAgICAgICAgIG93bmVyOiByZXBvc2l0b3J5T3duZXIsXG4gICAgICAgICAgICByZXBvOiByZXBvc2l0b3J5TmFtZSxcbiAgICAgICAgICAgIGFydGlmYWN0X2lkOiBhcnRpZmFjdElkLFxuICAgICAgICAgICAgYXJjaGl2ZV9mb3JtYXQ6ICd6aXAnLFxuICAgICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnbWFudWFsJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHN0YXR1cyAhPT0gMzAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBkb3dubG9hZCBhcnRpZmFjdC4gVW5leHBlY3RlZCBzdGF0dXM6ICR7c3RhdHVzfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgbG9jYXRpb24gfSA9IGhlYWRlcnM7XG4gICAgICAgIGlmICghbG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHJlZGlyZWN0IHRvIGFydGlmYWN0IGRvd25sb2FkIHVybGApO1xuICAgICAgICB9XG4gICAgICAgIGNvcmUuaW5mbyhgUmVkaXJlY3RpbmcgdG8gYmxvYiBkb3dubG9hZCB1cmw6ICR7c2NydWJRdWVyeVBhcmFtZXRlcnMobG9jYXRpb24pfWApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29yZS5pbmZvKGBTdGFydGluZyBkb3dubG9hZCBvZiBhcnRpZmFjdCB0bzogJHtkb3dubG9hZFBhdGh9YCk7XG4gICAgICAgICAgICB5aWVsZCBzdHJlYW1FeHRyYWN0KGxvY2F0aW9uLCBkb3dubG9hZFBhdGgpO1xuICAgICAgICAgICAgY29yZS5pbmZvKGBBcnRpZmFjdCBkb3dubG9hZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LmApO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZG93bmxvYWQgYW5kIGV4dHJhY3QgYXJ0aWZhY3Q6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkb3dubG9hZFBhdGggfTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZG93bmxvYWRBcnRpZmFjdFB1YmxpYyA9IGRvd25sb2FkQXJ0aWZhY3RQdWJsaWM7XG5mdW5jdGlvbiBkb3dubG9hZEFydGlmYWN0SW50ZXJuYWwoYXJ0aWZhY3RJZCwgb3B0aW9ucykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGRvd25sb2FkUGF0aCA9IHlpZWxkIHJlc29sdmVPckNyZWF0ZURpcmVjdG9yeShvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucGF0aCk7XG4gICAgICAgIGNvbnN0IGFydGlmYWN0Q2xpZW50ID0gKDAsIGFydGlmYWN0X3R3aXJwX2NsaWVudF8xLmludGVybmFsQXJ0aWZhY3RUd2lycENsaWVudCkoKTtcbiAgICAgICAgY29uc3QgeyB3b3JrZmxvd1J1bkJhY2tlbmRJZCwgd29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQgfSA9ICgwLCB1dGlsXzEuZ2V0QmFja2VuZElkc0Zyb21Ub2tlbikoKTtcbiAgICAgICAgY29uc3QgbGlzdFJlcSA9IHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuQmFja2VuZElkLFxuICAgICAgICAgICAgd29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQsXG4gICAgICAgICAgICBpZEZpbHRlcjogZ2VuZXJhdGVkXzEuSW50NjRWYWx1ZS5jcmVhdGUoeyB2YWx1ZTogYXJ0aWZhY3RJZC50b1N0cmluZygpIH0pXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHsgYXJ0aWZhY3RzIH0gPSB5aWVsZCBhcnRpZmFjdENsaWVudC5MaXN0QXJ0aWZhY3RzKGxpc3RSZXEpO1xuICAgICAgICBpZiAoYXJ0aWZhY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkFydGlmYWN0Tm90Rm91bmRFcnJvcihgTm8gYXJ0aWZhY3RzIGZvdW5kIGZvciBJRDogJHthcnRpZmFjdElkfVxcbkFyZSB5b3UgdHJ5aW5nIHRvIGRvd25sb2FkIGZyb20gYSBkaWZmZXJlbnQgcnVuPyBUcnkgc3BlY2lmeWluZyBhIGdpdGh1Yi10b2tlbiB3aXRoIFxcYGFjdGlvbnM6cmVhZFxcYCBzY29wZS5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJ0aWZhY3RzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGNvcmUud2FybmluZygnTXVsdGlwbGUgYXJ0aWZhY3RzIGZvdW5kLCBkZWZhdWx0aW5nIHRvIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNpZ25lZFJlcSA9IHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuQmFja2VuZElkOiBhcnRpZmFjdHNbMF0ud29ya2Zsb3dSdW5CYWNrZW5kSWQsXG4gICAgICAgICAgICB3b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZDogYXJ0aWZhY3RzWzBdLndvcmtmbG93Sm9iUnVuQmFja2VuZElkLFxuICAgICAgICAgICAgbmFtZTogYXJ0aWZhY3RzWzBdLm5hbWVcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgeyBzaWduZWRVcmwgfSA9IHlpZWxkIGFydGlmYWN0Q2xpZW50LkdldFNpZ25lZEFydGlmYWN0VVJMKHNpZ25lZFJlcSk7XG4gICAgICAgIGNvcmUuaW5mbyhgUmVkaXJlY3RpbmcgdG8gYmxvYiBkb3dubG9hZCB1cmw6ICR7c2NydWJRdWVyeVBhcmFtZXRlcnMoc2lnbmVkVXJsKX1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvcmUuaW5mbyhgU3RhcnRpbmcgZG93bmxvYWQgb2YgYXJ0aWZhY3QgdG86ICR7ZG93bmxvYWRQYXRofWApO1xuICAgICAgICAgICAgeWllbGQgc3RyZWFtRXh0cmFjdChzaWduZWRVcmwsIGRvd25sb2FkUGF0aCk7XG4gICAgICAgICAgICBjb3JlLmluZm8oYEFydGlmYWN0IGRvd25sb2FkIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuYCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBkb3dubG9hZCBhbmQgZXh0cmFjdCBhcnRpZmFjdDogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRvd25sb2FkUGF0aCB9O1xuICAgIH0pO1xufVxuZXhwb3J0cy5kb3dubG9hZEFydGlmYWN0SW50ZXJuYWwgPSBkb3dubG9hZEFydGlmYWN0SW50ZXJuYWw7XG5mdW5jdGlvbiByZXNvbHZlT3JDcmVhdGVEaXJlY3RvcnkoZG93bmxvYWRQYXRoID0gKDAsIGNvbmZpZ18xLmdldEdpdEh1YldvcmtzcGFjZURpcikoKSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmICghKHlpZWxkIGV4aXN0cyhkb3dubG9hZFBhdGgpKSkge1xuICAgICAgICAgICAgY29yZS5kZWJ1ZyhgQXJ0aWZhY3QgZGVzdGluYXRpb24gZm9sZGVyIGRvZXMgbm90IGV4aXN0LCBjcmVhdGluZzogJHtkb3dubG9hZFBhdGh9YCk7XG4gICAgICAgICAgICB5aWVsZCBwcm9taXNlc18xLmRlZmF1bHQubWtkaXIoZG93bmxvYWRQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvcmUuZGVidWcoYEFydGlmYWN0IGRlc3RpbmF0aW9uIGZvbGRlciBhbHJlYWR5IGV4aXN0czogJHtkb3dubG9hZFBhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRvd25sb2FkUGF0aDtcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRvd25sb2FkLWFydGlmYWN0LmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6394\n")},1755:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.getArtifactInternal = exports.getArtifactPublic = void 0;\nconst github_1 = __webpack_require__(5946);\nconst plugin_retry_1 = __webpack_require__(6964);\nconst core = __importStar(__webpack_require__(2225));\nconst utils_1 = __webpack_require__(5362);\nconst retry_options_1 = __webpack_require__(666);\nconst plugin_request_log_1 = __webpack_require__(9083);\nconst util_1 = __webpack_require__(3379);\nconst user_agent_1 = __webpack_require__(5270);\nconst artifact_twirp_client_1 = __webpack_require__(2445);\nconst generated_1 = __webpack_require__(2330);\nconst errors_1 = __webpack_require__(5666);\nfunction getArtifactPublic(artifactName, workflowRunId, repositoryOwner, repositoryName, token) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const [retryOpts, requestOpts] = (0, retry_options_1.getRetryOptions)(utils_1.defaults);\n const opts = {\n log: undefined,\n userAgent: (0, user_agent_1.getUserAgentString)(),\n previews: undefined,\n retry: retryOpts,\n request: requestOpts\n };\n const github = (0, github_1.getOctokit)(token, opts, plugin_retry_1.retry, plugin_request_log_1.requestLog);\n const getArtifactResp = yield github.request(\'GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts{?name}\', {\n owner: repositoryOwner,\n repo: repositoryName,\n run_id: workflowRunId,\n name: artifactName\n });\n if (getArtifactResp.status !== 200) {\n throw new errors_1.InvalidResponseError(`Invalid response from GitHub API: ${getArtifactResp.status} (${(_a = getArtifactResp === null || getArtifactResp === void 0 ? void 0 : getArtifactResp.headers) === null || _a === void 0 ? void 0 : _a[\'x-github-request-id\']})`);\n }\n if (getArtifactResp.data.artifacts.length === 0) {\n throw new errors_1.ArtifactNotFoundError(`Artifact not found for name: ${artifactName}\n Please ensure that your artifact is not expired and the artifact was uploaded using a compatible version of toolkit/upload-artifact.\n For more information, visit the GitHub Artifacts FAQ: https://github.com/actions/toolkit/blob/main/packages/artifact/docs/faq.md`);\n }\n let artifact = getArtifactResp.data.artifacts[0];\n if (getArtifactResp.data.artifacts.length > 1) {\n artifact = getArtifactResp.data.artifacts.sort((a, b) => b.id - a.id)[0];\n core.debug(`More than one artifact found for a single name, returning newest (id: ${artifact.id})`);\n }\n return {\n artifact: {\n name: artifact.name,\n id: artifact.id,\n size: artifact.size_in_bytes,\n createdAt: artifact.created_at ? new Date(artifact.created_at) : undefined\n }\n };\n });\n}\nexports.getArtifactPublic = getArtifactPublic;\nfunction getArtifactInternal(artifactName) {\n return __awaiter(this, void 0, void 0, function* () {\n const artifactClient = (0, artifact_twirp_client_1.internalArtifactTwirpClient)();\n const { workflowRunBackendId, workflowJobRunBackendId } = (0, util_1.getBackendIdsFromToken)();\n const req = {\n workflowRunBackendId,\n workflowJobRunBackendId,\n nameFilter: generated_1.StringValue.create({ value: artifactName })\n };\n const res = yield artifactClient.ListArtifacts(req);\n if (res.artifacts.length === 0) {\n throw new errors_1.ArtifactNotFoundError(`Artifact not found for name: ${artifactName}\n Please ensure that your artifact is not expired and the artifact was uploaded using a compatible version of toolkit/upload-artifact.\n For more information, visit the GitHub Artifacts FAQ: https://github.com/actions/toolkit/blob/main/packages/artifact/docs/faq.md`);\n }\n let artifact = res.artifacts[0];\n if (res.artifacts.length > 1) {\n artifact = res.artifacts.sort((a, b) => Number(b.databaseId) - Number(a.databaseId))[0];\n core.debug(`More than one artifact found for a single name, returning newest (id: ${artifact.databaseId})`);\n }\n return {\n artifact: {\n name: artifact.name,\n id: Number(artifact.databaseId),\n size: Number(artifact.size),\n createdAt: artifact.createdAt\n ? generated_1.Timestamp.toDate(artifact.createdAt)\n : undefined\n }\n };\n });\n}\nexports.getArtifactInternal = getArtifactInternal;\n//# sourceMappingURL=get-artifact.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc1NS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQ0FBb0M7QUFDbkQ7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsMENBQTBDLDRCQUE0QjtBQUN0RSxDQUFDO0FBQ0Q7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELDJCQUEyQixHQUFHLHlCQUF5QjtBQUN2RCxpQkFBaUIsbUJBQU8sQ0FBQyxJQUFpQjtBQUMxQyx1QkFBdUIsbUJBQU8sQ0FBQyxJQUF1QjtBQUN0RCwwQkFBMEIsbUJBQU8sQ0FBQyxJQUFlO0FBQ2pELGdCQUFnQixtQkFBTyxDQUFDLElBQTJCO0FBQ25ELHdCQUF3QixtQkFBTyxDQUFDLEdBQWlCO0FBQ2pELDZCQUE2QixtQkFBTyxDQUFDLElBQTZCO0FBQ2xFLGVBQWUsbUJBQU8sQ0FBQyxJQUFnQjtBQUN2QyxxQkFBcUIsbUJBQU8sQ0FBQyxJQUFzQjtBQUNuRCxnQ0FBZ0MsbUJBQU8sQ0FBQyxJQUFpQztBQUN6RSxvQkFBb0IsbUJBQU8sQ0FBQyxJQUFpQjtBQUM3QyxpQkFBaUIsbUJBQU8sQ0FBQyxJQUFrQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0UsTUFBTSxFQUFFLEtBQUssZUFBZSxPQUFPLFdBQVcsTUFBTTtBQUN0SDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLHlGQUF5Rix3QkFBd0IsR0FBRyxnS0FBZ0s7QUFDcFI7QUFDQTtBQUNBLHFGQUFxRjtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnR0FBZ0csWUFBWTtBQUM1RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGdEQUFnRDtBQUNoRTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQscUJBQXFCO0FBQzlFO0FBQ0E7QUFDQTtBQUNBLHFGQUFxRjtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnR0FBZ0csb0JBQW9CO0FBQ3BIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSwyQkFBMkI7QUFDM0IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9saWIvaW50ZXJuYWwvZmluZC9nZXQtYXJ0aWZhY3QuanM/NjhkYyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldEFydGlmYWN0SW50ZXJuYWwgPSBleHBvcnRzLmdldEFydGlmYWN0UHVibGljID0gdm9pZCAwO1xuY29uc3QgZ2l0aHViXzEgPSByZXF1aXJlKFwiQGFjdGlvbnMvZ2l0aHViXCIpO1xuY29uc3QgcGx1Z2luX3JldHJ5XzEgPSByZXF1aXJlKFwiQG9jdG9raXQvcGx1Z2luLXJldHJ5XCIpO1xuY29uc3QgY29yZSA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvY29yZVwiKSk7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIkBhY3Rpb25zL2dpdGh1Yi9saWIvdXRpbHNcIik7XG5jb25zdCByZXRyeV9vcHRpb25zXzEgPSByZXF1aXJlKFwiLi9yZXRyeS1vcHRpb25zXCIpO1xuY29uc3QgcGx1Z2luX3JlcXVlc3RfbG9nXzEgPSByZXF1aXJlKFwiQG9jdG9raXQvcGx1Z2luLXJlcXVlc3QtbG9nXCIpO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4uL3NoYXJlZC91dGlsXCIpO1xuY29uc3QgdXNlcl9hZ2VudF8xID0gcmVxdWlyZShcIi4uL3NoYXJlZC91c2VyLWFnZW50XCIpO1xuY29uc3QgYXJ0aWZhY3RfdHdpcnBfY2xpZW50XzEgPSByZXF1aXJlKFwiLi4vc2hhcmVkL2FydGlmYWN0LXR3aXJwLWNsaWVudFwiKTtcbmNvbnN0IGdlbmVyYXRlZF8xID0gcmVxdWlyZShcIi4uLy4uL2dlbmVyYXRlZFwiKTtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4uL3NoYXJlZC9lcnJvcnNcIik7XG5mdW5jdGlvbiBnZXRBcnRpZmFjdFB1YmxpYyhhcnRpZmFjdE5hbWUsIHdvcmtmbG93UnVuSWQsIHJlcG9zaXRvcnlPd25lciwgcmVwb3NpdG9yeU5hbWUsIHRva2VuKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IFtyZXRyeU9wdHMsIHJlcXVlc3RPcHRzXSA9ICgwLCByZXRyeV9vcHRpb25zXzEuZ2V0UmV0cnlPcHRpb25zKSh1dGlsc18xLmRlZmF1bHRzKTtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgICAgICAgIGxvZzogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdXNlckFnZW50OiAoMCwgdXNlcl9hZ2VudF8xLmdldFVzZXJBZ2VudFN0cmluZykoKSxcbiAgICAgICAgICAgIHByZXZpZXdzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICByZXRyeTogcmV0cnlPcHRzLFxuICAgICAgICAgICAgcmVxdWVzdDogcmVxdWVzdE9wdHNcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZ2l0aHViID0gKDAsIGdpdGh1Yl8xLmdldE9jdG9raXQpKHRva2VuLCBvcHRzLCBwbHVnaW5fcmV0cnlfMS5yZXRyeSwgcGx1Z2luX3JlcXVlc3RfbG9nXzEucmVxdWVzdExvZyk7XG4gICAgICAgIGNvbnN0IGdldEFydGlmYWN0UmVzcCA9IHlpZWxkIGdpdGh1Yi5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hcnRpZmFjdHN7P25hbWV9Jywge1xuICAgICAgICAgICAgb3duZXI6IHJlcG9zaXRvcnlPd25lcixcbiAgICAgICAgICAgIHJlcG86IHJlcG9zaXRvcnlOYW1lLFxuICAgICAgICAgICAgcnVuX2lkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgbmFtZTogYXJ0aWZhY3ROYW1lXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZ2V0QXJ0aWZhY3RSZXNwLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzXzEuSW52YWxpZFJlc3BvbnNlRXJyb3IoYEludmFsaWQgcmVzcG9uc2UgZnJvbSBHaXRIdWIgQVBJOiAke2dldEFydGlmYWN0UmVzcC5zdGF0dXN9ICgkeyhfYSA9IGdldEFydGlmYWN0UmVzcCA9PT0gbnVsbCB8fCBnZXRBcnRpZmFjdFJlc3AgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGdldEFydGlmYWN0UmVzcC5oZWFkZXJzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbJ3gtZ2l0aHViLXJlcXVlc3QtaWQnXX0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdldEFydGlmYWN0UmVzcC5kYXRhLmFydGlmYWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5BcnRpZmFjdE5vdEZvdW5kRXJyb3IoYEFydGlmYWN0IG5vdCBmb3VuZCBmb3IgbmFtZTogJHthcnRpZmFjdE5hbWV9XG4gICAgICAgIFBsZWFzZSBlbnN1cmUgdGhhdCB5b3VyIGFydGlmYWN0IGlzIG5vdCBleHBpcmVkIGFuZCB0aGUgYXJ0aWZhY3Qgd2FzIHVwbG9hZGVkIHVzaW5nIGEgY29tcGF0aWJsZSB2ZXJzaW9uIG9mIHRvb2xraXQvdXBsb2FkLWFydGlmYWN0LlxuICAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgdmlzaXQgdGhlIEdpdEh1YiBBcnRpZmFjdHMgRkFROiBodHRwczovL2dpdGh1Yi5jb20vYWN0aW9ucy90b29sa2l0L2Jsb2IvbWFpbi9wYWNrYWdlcy9hcnRpZmFjdC9kb2NzL2ZhcS5tZGApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhcnRpZmFjdCA9IGdldEFydGlmYWN0UmVzcC5kYXRhLmFydGlmYWN0c1swXTtcbiAgICAgICAgaWYgKGdldEFydGlmYWN0UmVzcC5kYXRhLmFydGlmYWN0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBhcnRpZmFjdCA9IGdldEFydGlmYWN0UmVzcC5kYXRhLmFydGlmYWN0cy5zb3J0KChhLCBiKSA9PiBiLmlkIC0gYS5pZClbMF07XG4gICAgICAgICAgICBjb3JlLmRlYnVnKGBNb3JlIHRoYW4gb25lIGFydGlmYWN0IGZvdW5kIGZvciBhIHNpbmdsZSBuYW1lLCByZXR1cm5pbmcgbmV3ZXN0IChpZDogJHthcnRpZmFjdC5pZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFydGlmYWN0OiB7XG4gICAgICAgICAgICAgICAgbmFtZTogYXJ0aWZhY3QubmFtZSxcbiAgICAgICAgICAgICAgICBpZDogYXJ0aWZhY3QuaWQsXG4gICAgICAgICAgICAgICAgc2l6ZTogYXJ0aWZhY3Quc2l6ZV9pbl9ieXRlcyxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGFydGlmYWN0LmNyZWF0ZWRfYXQgPyBuZXcgRGF0ZShhcnRpZmFjdC5jcmVhdGVkX2F0KSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRBcnRpZmFjdFB1YmxpYyA9IGdldEFydGlmYWN0UHVibGljO1xuZnVuY3Rpb24gZ2V0QXJ0aWZhY3RJbnRlcm5hbChhcnRpZmFjdE5hbWUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBhcnRpZmFjdENsaWVudCA9ICgwLCBhcnRpZmFjdF90d2lycF9jbGllbnRfMS5pbnRlcm5hbEFydGlmYWN0VHdpcnBDbGllbnQpKCk7XG4gICAgICAgIGNvbnN0IHsgd29ya2Zsb3dSdW5CYWNrZW5kSWQsIHdvcmtmbG93Sm9iUnVuQmFja2VuZElkIH0gPSAoMCwgdXRpbF8xLmdldEJhY2tlbmRJZHNGcm9tVG9rZW4pKCk7XG4gICAgICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuQmFja2VuZElkLFxuICAgICAgICAgICAgd29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQsXG4gICAgICAgICAgICBuYW1lRmlsdGVyOiBnZW5lcmF0ZWRfMS5TdHJpbmdWYWx1ZS5jcmVhdGUoeyB2YWx1ZTogYXJ0aWZhY3ROYW1lIH0pXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlcyA9IHlpZWxkIGFydGlmYWN0Q2xpZW50Lkxpc3RBcnRpZmFjdHMocmVxKTtcbiAgICAgICAgaWYgKHJlcy5hcnRpZmFjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzXzEuQXJ0aWZhY3ROb3RGb3VuZEVycm9yKGBBcnRpZmFjdCBub3QgZm91bmQgZm9yIG5hbWU6ICR7YXJ0aWZhY3ROYW1lfVxuICAgICAgICBQbGVhc2UgZW5zdXJlIHRoYXQgeW91ciBhcnRpZmFjdCBpcyBub3QgZXhwaXJlZCBhbmQgdGhlIGFydGlmYWN0IHdhcyB1cGxvYWRlZCB1c2luZyBhIGNvbXBhdGlibGUgdmVyc2lvbiBvZiB0b29sa2l0L3VwbG9hZC1hcnRpZmFjdC5cbiAgICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHZpc2l0IHRoZSBHaXRIdWIgQXJ0aWZhY3RzIEZBUTogaHR0cHM6Ly9naXRodWIuY29tL2FjdGlvbnMvdG9vbGtpdC9ibG9iL21haW4vcGFja2FnZXMvYXJ0aWZhY3QvZG9jcy9mYXEubWRgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYXJ0aWZhY3QgPSByZXMuYXJ0aWZhY3RzWzBdO1xuICAgICAgICBpZiAocmVzLmFydGlmYWN0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBhcnRpZmFjdCA9IHJlcy5hcnRpZmFjdHMuc29ydCgoYSwgYikgPT4gTnVtYmVyKGIuZGF0YWJhc2VJZCkgLSBOdW1iZXIoYS5kYXRhYmFzZUlkKSlbMF07XG4gICAgICAgICAgICBjb3JlLmRlYnVnKGBNb3JlIHRoYW4gb25lIGFydGlmYWN0IGZvdW5kIGZvciBhIHNpbmdsZSBuYW1lLCByZXR1cm5pbmcgbmV3ZXN0IChpZDogJHthcnRpZmFjdC5kYXRhYmFzZUlkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYXJ0aWZhY3Q6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBhcnRpZmFjdC5uYW1lLFxuICAgICAgICAgICAgICAgIGlkOiBOdW1iZXIoYXJ0aWZhY3QuZGF0YWJhc2VJZCksXG4gICAgICAgICAgICAgICAgc2l6ZTogTnVtYmVyKGFydGlmYWN0LnNpemUpLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogYXJ0aWZhY3QuY3JlYXRlZEF0XG4gICAgICAgICAgICAgICAgICAgID8gZ2VuZXJhdGVkXzEuVGltZXN0YW1wLnRvRGF0ZShhcnRpZmFjdC5jcmVhdGVkQXQpXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEFydGlmYWN0SW50ZXJuYWwgPSBnZXRBcnRpZmFjdEludGVybmFsO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0LWFydGlmYWN0LmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1755\n')},4041:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.listArtifactsInternal = exports.listArtifactsPublic = void 0;\nconst core_1 = __webpack_require__(2225);\nconst github_1 = __webpack_require__(5946);\nconst user_agent_1 = __webpack_require__(5270);\nconst retry_options_1 = __webpack_require__(666);\nconst utils_1 = __webpack_require__(5362);\nconst plugin_request_log_1 = __webpack_require__(9083);\nconst plugin_retry_1 = __webpack_require__(6964);\nconst artifact_twirp_client_1 = __webpack_require__(2445);\nconst util_1 = __webpack_require__(3379);\nconst generated_1 = __webpack_require__(2330);\n// Limiting to 1000 for perf reasons\nconst maximumArtifactCount = 1000;\nconst paginationCount = 100;\nconst maxNumberOfPages = maximumArtifactCount / paginationCount;\nfunction listArtifactsPublic(workflowRunId, repositoryOwner, repositoryName, token, latest = false) {\n return __awaiter(this, void 0, void 0, function* () {\n (0, core_1.info)(`Fetching artifact list for workflow run ${workflowRunId} in repository ${repositoryOwner}/${repositoryName}`);\n let artifacts = [];\n const [retryOpts, requestOpts] = (0, retry_options_1.getRetryOptions)(utils_1.defaults);\n const opts = {\n log: undefined,\n userAgent: (0, user_agent_1.getUserAgentString)(),\n previews: undefined,\n retry: retryOpts,\n request: requestOpts\n };\n const github = (0, github_1.getOctokit)(token, opts, plugin_retry_1.retry, plugin_request_log_1.requestLog);\n let currentPageNumber = 1;\n const { data: listArtifactResponse } = yield github.rest.actions.listWorkflowRunArtifacts({\n owner: repositoryOwner,\n repo: repositoryName,\n run_id: workflowRunId,\n per_page: paginationCount,\n page: currentPageNumber\n });\n let numberOfPages = Math.ceil(listArtifactResponse.total_count / paginationCount);\n const totalArtifactCount = listArtifactResponse.total_count;\n if (totalArtifactCount > maximumArtifactCount) {\n (0, core_1.warning)(`Workflow run ${workflowRunId} has more than 1000 artifacts. Results will be incomplete as only the first ${maximumArtifactCount} artifacts will be returned`);\n numberOfPages = maxNumberOfPages;\n }\n // Iterate over the first page\n for (const artifact of listArtifactResponse.artifacts) {\n artifacts.push({\n name: artifact.name,\n id: artifact.id,\n size: artifact.size_in_bytes,\n createdAt: artifact.created_at ? new Date(artifact.created_at) : undefined\n });\n }\n // Iterate over any remaining pages\n for (currentPageNumber; currentPageNumber < numberOfPages; currentPageNumber++) {\n currentPageNumber++;\n (0, core_1.debug)(`Fetching page ${currentPageNumber} of artifact list`);\n const { data: listArtifactResponse } = yield github.rest.actions.listWorkflowRunArtifacts({\n owner: repositoryOwner,\n repo: repositoryName,\n run_id: workflowRunId,\n per_page: paginationCount,\n page: currentPageNumber\n });\n for (const artifact of listArtifactResponse.artifacts) {\n artifacts.push({\n name: artifact.name,\n id: artifact.id,\n size: artifact.size_in_bytes,\n createdAt: artifact.created_at\n ? new Date(artifact.created_at)\n : undefined\n });\n }\n }\n if (latest) {\n artifacts = filterLatest(artifacts);\n }\n (0, core_1.info)(`Found ${artifacts.length} artifact(s)`);\n return {\n artifacts\n };\n });\n}\nexports.listArtifactsPublic = listArtifactsPublic;\nfunction listArtifactsInternal(latest = false) {\n return __awaiter(this, void 0, void 0, function* () {\n const artifactClient = (0, artifact_twirp_client_1.internalArtifactTwirpClient)();\n const { workflowRunBackendId, workflowJobRunBackendId } = (0, util_1.getBackendIdsFromToken)();\n const req = {\n workflowRunBackendId,\n workflowJobRunBackendId\n };\n const res = yield artifactClient.ListArtifacts(req);\n let artifacts = res.artifacts.map(artifact => ({\n name: artifact.name,\n id: Number(artifact.databaseId),\n size: Number(artifact.size),\n createdAt: artifact.createdAt\n ? generated_1.Timestamp.toDate(artifact.createdAt)\n : undefined\n }));\n if (latest) {\n artifacts = filterLatest(artifacts);\n }\n (0, core_1.info)(`Found ${artifacts.length} artifact(s)`);\n return {\n artifacts\n };\n });\n}\nexports.listArtifactsInternal = listArtifactsInternal;\n/**\n * Filters a list of artifacts to only include the latest artifact for each name\n * @param artifacts The artifacts to filter\n * @returns The filtered list of artifacts\n */\nfunction filterLatest(artifacts) {\n artifacts.sort((a, b) => b.id - a.id);\n const latestArtifacts = [];\n const seenArtifactNames = new Set();\n for (const artifact of artifacts) {\n if (!seenArtifactNames.has(artifact.name)) {\n latestArtifacts.push(artifact);\n seenArtifactNames.add(artifact.name);\n }\n }\n return latestArtifacts;\n}\n//# sourceMappingURL=list-artifacts.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA0MS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0EsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsNkJBQTZCLEdBQUcsMkJBQTJCO0FBQzNELGVBQWUsbUJBQU8sQ0FBQyxJQUFlO0FBQ3RDLGlCQUFpQixtQkFBTyxDQUFDLElBQWlCO0FBQzFDLHFCQUFxQixtQkFBTyxDQUFDLElBQXNCO0FBQ25ELHdCQUF3QixtQkFBTyxDQUFDLEdBQWlCO0FBQ2pELGdCQUFnQixtQkFBTyxDQUFDLElBQTJCO0FBQ25ELDZCQUE2QixtQkFBTyxDQUFDLElBQTZCO0FBQ2xFLHVCQUF1QixtQkFBTyxDQUFDLElBQXVCO0FBQ3RELGdDQUFnQyxtQkFBTyxDQUFDLElBQWlDO0FBQ3pFLGVBQWUsbUJBQU8sQ0FBQyxJQUFnQjtBQUN2QyxvQkFBb0IsbUJBQU8sQ0FBQyxJQUFpQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvRUFBb0UsZUFBZSxnQkFBZ0IsZ0JBQWdCLEdBQUcsZUFBZTtBQUNySTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLDZCQUE2QjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxlQUFlLDZFQUE2RSxzQkFBc0I7QUFDbEs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxnQ0FBZ0MsbUNBQW1DO0FBQ25FO0FBQ0EsK0NBQStDLG1CQUFtQjtBQUNsRSxvQkFBb0IsNkJBQTZCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLGtCQUFrQjtBQUNwRDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGdEQUFnRDtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLGtCQUFrQjtBQUNwRDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2ludGVybmFsL2ZpbmQvbGlzdC1hcnRpZmFjdHMuanM/MTg3MyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5saXN0QXJ0aWZhY3RzSW50ZXJuYWwgPSBleHBvcnRzLmxpc3RBcnRpZmFjdHNQdWJsaWMgPSB2b2lkIDA7XG5jb25zdCBjb3JlXzEgPSByZXF1aXJlKFwiQGFjdGlvbnMvY29yZVwiKTtcbmNvbnN0IGdpdGh1Yl8xID0gcmVxdWlyZShcIkBhY3Rpb25zL2dpdGh1YlwiKTtcbmNvbnN0IHVzZXJfYWdlbnRfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvdXNlci1hZ2VudFwiKTtcbmNvbnN0IHJldHJ5X29wdGlvbnNfMSA9IHJlcXVpcmUoXCIuL3JldHJ5LW9wdGlvbnNcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIkBhY3Rpb25zL2dpdGh1Yi9saWIvdXRpbHNcIik7XG5jb25zdCBwbHVnaW5fcmVxdWVzdF9sb2dfMSA9IHJlcXVpcmUoXCJAb2N0b2tpdC9wbHVnaW4tcmVxdWVzdC1sb2dcIik7XG5jb25zdCBwbHVnaW5fcmV0cnlfMSA9IHJlcXVpcmUoXCJAb2N0b2tpdC9wbHVnaW4tcmV0cnlcIik7XG5jb25zdCBhcnRpZmFjdF90d2lycF9jbGllbnRfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvYXJ0aWZhY3QtdHdpcnAtY2xpZW50XCIpO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4uL3NoYXJlZC91dGlsXCIpO1xuY29uc3QgZ2VuZXJhdGVkXzEgPSByZXF1aXJlKFwiLi4vLi4vZ2VuZXJhdGVkXCIpO1xuLy8gTGltaXRpbmcgdG8gMTAwMCBmb3IgcGVyZiByZWFzb25zXG5jb25zdCBtYXhpbXVtQXJ0aWZhY3RDb3VudCA9IDEwMDA7XG5jb25zdCBwYWdpbmF0aW9uQ291bnQgPSAxMDA7XG5jb25zdCBtYXhOdW1iZXJPZlBhZ2VzID0gbWF4aW11bUFydGlmYWN0Q291bnQgLyBwYWdpbmF0aW9uQ291bnQ7XG5mdW5jdGlvbiBsaXN0QXJ0aWZhY3RzUHVibGljKHdvcmtmbG93UnVuSWQsIHJlcG9zaXRvcnlPd25lciwgcmVwb3NpdG9yeU5hbWUsIHRva2VuLCBsYXRlc3QgPSBmYWxzZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICgwLCBjb3JlXzEuaW5mbykoYEZldGNoaW5nIGFydGlmYWN0IGxpc3QgZm9yIHdvcmtmbG93IHJ1biAke3dvcmtmbG93UnVuSWR9IGluIHJlcG9zaXRvcnkgJHtyZXBvc2l0b3J5T3duZXJ9LyR7cmVwb3NpdG9yeU5hbWV9YCk7XG4gICAgICAgIGxldCBhcnRpZmFjdHMgPSBbXTtcbiAgICAgICAgY29uc3QgW3JldHJ5T3B0cywgcmVxdWVzdE9wdHNdID0gKDAsIHJldHJ5X29wdGlvbnNfMS5nZXRSZXRyeU9wdGlvbnMpKHV0aWxzXzEuZGVmYXVsdHMpO1xuICAgICAgICBjb25zdCBvcHRzID0ge1xuICAgICAgICAgICAgbG9nOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB1c2VyQWdlbnQ6ICgwLCB1c2VyX2FnZW50XzEuZ2V0VXNlckFnZW50U3RyaW5nKSgpLFxuICAgICAgICAgICAgcHJldmlld3M6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHJldHJ5OiByZXRyeU9wdHMsXG4gICAgICAgICAgICByZXF1ZXN0OiByZXF1ZXN0T3B0c1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBnaXRodWIgPSAoMCwgZ2l0aHViXzEuZ2V0T2N0b2tpdCkodG9rZW4sIG9wdHMsIHBsdWdpbl9yZXRyeV8xLnJldHJ5LCBwbHVnaW5fcmVxdWVzdF9sb2dfMS5yZXF1ZXN0TG9nKTtcbiAgICAgICAgbGV0IGN1cnJlbnRQYWdlTnVtYmVyID0gMTtcbiAgICAgICAgY29uc3QgeyBkYXRhOiBsaXN0QXJ0aWZhY3RSZXNwb25zZSB9ID0geWllbGQgZ2l0aHViLnJlc3QuYWN0aW9ucy5saXN0V29ya2Zsb3dSdW5BcnRpZmFjdHMoe1xuICAgICAgICAgICAgb3duZXI6IHJlcG9zaXRvcnlPd25lcixcbiAgICAgICAgICAgIHJlcG86IHJlcG9zaXRvcnlOYW1lLFxuICAgICAgICAgICAgcnVuX2lkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgcGVyX3BhZ2U6IHBhZ2luYXRpb25Db3VudCxcbiAgICAgICAgICAgIHBhZ2U6IGN1cnJlbnRQYWdlTnVtYmVyXG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgbnVtYmVyT2ZQYWdlcyA9IE1hdGguY2VpbChsaXN0QXJ0aWZhY3RSZXNwb25zZS50b3RhbF9jb3VudCAvIHBhZ2luYXRpb25Db3VudCk7XG4gICAgICAgIGNvbnN0IHRvdGFsQXJ0aWZhY3RDb3VudCA9IGxpc3RBcnRpZmFjdFJlc3BvbnNlLnRvdGFsX2NvdW50O1xuICAgICAgICBpZiAodG90YWxBcnRpZmFjdENvdW50ID4gbWF4aW11bUFydGlmYWN0Q291bnQpIHtcbiAgICAgICAgICAgICgwLCBjb3JlXzEud2FybmluZykoYFdvcmtmbG93IHJ1biAke3dvcmtmbG93UnVuSWR9IGhhcyBtb3JlIHRoYW4gMTAwMCBhcnRpZmFjdHMuIFJlc3VsdHMgd2lsbCBiZSBpbmNvbXBsZXRlIGFzIG9ubHkgdGhlIGZpcnN0ICR7bWF4aW11bUFydGlmYWN0Q291bnR9IGFydGlmYWN0cyB3aWxsIGJlIHJldHVybmVkYCk7XG4gICAgICAgICAgICBudW1iZXJPZlBhZ2VzID0gbWF4TnVtYmVyT2ZQYWdlcztcbiAgICAgICAgfVxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGZpcnN0IHBhZ2VcbiAgICAgICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBsaXN0QXJ0aWZhY3RSZXNwb25zZS5hcnRpZmFjdHMpIHtcbiAgICAgICAgICAgIGFydGlmYWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBhcnRpZmFjdC5uYW1lLFxuICAgICAgICAgICAgICAgIGlkOiBhcnRpZmFjdC5pZCxcbiAgICAgICAgICAgICAgICBzaXplOiBhcnRpZmFjdC5zaXplX2luX2J5dGVzLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogYXJ0aWZhY3QuY3JlYXRlZF9hdCA/IG5ldyBEYXRlKGFydGlmYWN0LmNyZWF0ZWRfYXQpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYW55IHJlbWFpbmluZyBwYWdlc1xuICAgICAgICBmb3IgKGN1cnJlbnRQYWdlTnVtYmVyOyBjdXJyZW50UGFnZU51bWJlciA8IG51bWJlck9mUGFnZXM7IGN1cnJlbnRQYWdlTnVtYmVyKyspIHtcbiAgICAgICAgICAgIGN1cnJlbnRQYWdlTnVtYmVyKys7XG4gICAgICAgICAgICAoMCwgY29yZV8xLmRlYnVnKShgRmV0Y2hpbmcgcGFnZSAke2N1cnJlbnRQYWdlTnVtYmVyfSBvZiBhcnRpZmFjdCBsaXN0YCk7XG4gICAgICAgICAgICBjb25zdCB7IGRhdGE6IGxpc3RBcnRpZmFjdFJlc3BvbnNlIH0gPSB5aWVsZCBnaXRodWIucmVzdC5hY3Rpb25zLmxpc3RXb3JrZmxvd1J1bkFydGlmYWN0cyh7XG4gICAgICAgICAgICAgICAgb3duZXI6IHJlcG9zaXRvcnlPd25lcixcbiAgICAgICAgICAgICAgICByZXBvOiByZXBvc2l0b3J5TmFtZSxcbiAgICAgICAgICAgICAgICBydW5faWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgcGVyX3BhZ2U6IHBhZ2luYXRpb25Db3VudCxcbiAgICAgICAgICAgICAgICBwYWdlOiBjdXJyZW50UGFnZU51bWJlclxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIGxpc3RBcnRpZmFjdFJlc3BvbnNlLmFydGlmYWN0cykge1xuICAgICAgICAgICAgICAgIGFydGlmYWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogYXJ0aWZhY3QubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGFydGlmYWN0LmlkLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiBhcnRpZmFjdC5zaXplX2luX2J5dGVzLFxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGFydGlmYWN0LmNyZWF0ZWRfYXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IERhdGUoYXJ0aWZhY3QuY3JlYXRlZF9hdClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhdGVzdCkge1xuICAgICAgICAgICAgYXJ0aWZhY3RzID0gZmlsdGVyTGF0ZXN0KGFydGlmYWN0cyk7XG4gICAgICAgIH1cbiAgICAgICAgKDAsIGNvcmVfMS5pbmZvKShgRm91bmQgJHthcnRpZmFjdHMubGVuZ3RofSBhcnRpZmFjdChzKWApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYXJ0aWZhY3RzXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5leHBvcnRzLmxpc3RBcnRpZmFjdHNQdWJsaWMgPSBsaXN0QXJ0aWZhY3RzUHVibGljO1xuZnVuY3Rpb24gbGlzdEFydGlmYWN0c0ludGVybmFsKGxhdGVzdCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYXJ0aWZhY3RDbGllbnQgPSAoMCwgYXJ0aWZhY3RfdHdpcnBfY2xpZW50XzEuaW50ZXJuYWxBcnRpZmFjdFR3aXJwQ2xpZW50KSgpO1xuICAgICAgICBjb25zdCB7IHdvcmtmbG93UnVuQmFja2VuZElkLCB3b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCB9ID0gKDAsIHV0aWxfMS5nZXRCYWNrZW5kSWRzRnJvbVRva2VuKSgpO1xuICAgICAgICBjb25zdCByZXEgPSB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bkJhY2tlbmRJZCxcbiAgICAgICAgICAgIHdvcmtmbG93Sm9iUnVuQmFja2VuZElkXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlcyA9IHlpZWxkIGFydGlmYWN0Q2xpZW50Lkxpc3RBcnRpZmFjdHMocmVxKTtcbiAgICAgICAgbGV0IGFydGlmYWN0cyA9IHJlcy5hcnRpZmFjdHMubWFwKGFydGlmYWN0ID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBhcnRpZmFjdC5uYW1lLFxuICAgICAgICAgICAgaWQ6IE51bWJlcihhcnRpZmFjdC5kYXRhYmFzZUlkKSxcbiAgICAgICAgICAgIHNpemU6IE51bWJlcihhcnRpZmFjdC5zaXplKSxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogYXJ0aWZhY3QuY3JlYXRlZEF0XG4gICAgICAgICAgICAgICAgPyBnZW5lcmF0ZWRfMS5UaW1lc3RhbXAudG9EYXRlKGFydGlmYWN0LmNyZWF0ZWRBdClcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICB9KSk7XG4gICAgICAgIGlmIChsYXRlc3QpIHtcbiAgICAgICAgICAgIGFydGlmYWN0cyA9IGZpbHRlckxhdGVzdChhcnRpZmFjdHMpO1xuICAgICAgICB9XG4gICAgICAgICgwLCBjb3JlXzEuaW5mbykoYEZvdW5kICR7YXJ0aWZhY3RzLmxlbmd0aH0gYXJ0aWZhY3QocylgKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFydGlmYWN0c1xuICAgICAgICB9O1xuICAgIH0pO1xufVxuZXhwb3J0cy5saXN0QXJ0aWZhY3RzSW50ZXJuYWwgPSBsaXN0QXJ0aWZhY3RzSW50ZXJuYWw7XG4vKipcbiAqIEZpbHRlcnMgYSBsaXN0IG9mIGFydGlmYWN0cyB0byBvbmx5IGluY2x1ZGUgdGhlIGxhdGVzdCBhcnRpZmFjdCBmb3IgZWFjaCBuYW1lXG4gKiBAcGFyYW0gYXJ0aWZhY3RzIFRoZSBhcnRpZmFjdHMgdG8gZmlsdGVyXG4gKiBAcmV0dXJucyBUaGUgZmlsdGVyZWQgbGlzdCBvZiBhcnRpZmFjdHNcbiAqL1xuZnVuY3Rpb24gZmlsdGVyTGF0ZXN0KGFydGlmYWN0cykge1xuICAgIGFydGlmYWN0cy5zb3J0KChhLCBiKSA9PiBiLmlkIC0gYS5pZCk7XG4gICAgY29uc3QgbGF0ZXN0QXJ0aWZhY3RzID0gW107XG4gICAgY29uc3Qgc2VlbkFydGlmYWN0TmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBhcnRpZmFjdHMpIHtcbiAgICAgICAgaWYgKCFzZWVuQXJ0aWZhY3ROYW1lcy5oYXMoYXJ0aWZhY3QubmFtZSkpIHtcbiAgICAgICAgICAgIGxhdGVzdEFydGlmYWN0cy5wdXNoKGFydGlmYWN0KTtcbiAgICAgICAgICAgIHNlZW5BcnRpZmFjdE5hbWVzLmFkZChhcnRpZmFjdC5uYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGF0ZXN0QXJ0aWZhY3RzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGlzdC1hcnRpZmFjdHMuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4041\n')},666:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.getRetryOptions = void 0;\nconst core = __importStar(__webpack_require__(2225));\n// Defaults for fetching artifacts\nconst defaultMaxRetryNumber = 5;\nconst defaultExemptStatusCodes = [400, 401, 403, 404, 422]; // https://github.com/octokit/plugin-retry.js/blob/9a2443746c350b3beedec35cf26e197ea318a261/src/index.ts#L14\nfunction getRetryOptions(defaultOptions, retries = defaultMaxRetryNumber, exemptStatusCodes = defaultExemptStatusCodes) {\n var _a;\n if (retries <= 0) {\n return [{ enabled: false }, defaultOptions.request];\n }\n const retryOptions = {\n enabled: true\n };\n if (exemptStatusCodes.length > 0) {\n retryOptions.doNotRetry = exemptStatusCodes;\n }\n // The GitHub type has some defaults for `options.request`\n // see: https://github.com/actions/toolkit/blob/4fbc5c941a57249b19562015edbd72add14be93d/packages/github/src/utils.ts#L15\n // We pass these in here so they are not overridden.\n const requestOptions = Object.assign(Object.assign({}, defaultOptions.request), { retries });\n core.debug(`GitHub client configured with: (retries: ${requestOptions.retries}, retry-exempt-status-code: ${(_a = retryOptions.doNotRetry) !== null && _a !== void 0 ? _a : \'octokit default: [400, 401, 403, 404, 422]\'})`);\n return [retryOptions, requestOptions];\n}\nexports.getRetryOptions = getRetryOptions;\n//# sourceMappingURL=retry-options.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjY2LmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG9DQUFvQztBQUNuRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSwwQ0FBMEMsNEJBQTRCO0FBQ3RFLENBQUM7QUFDRDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCx1QkFBdUI7QUFDdkIsMEJBQTBCLG1CQUFPLENBQUMsSUFBZTtBQUNqRDtBQUNBO0FBQ0EsNERBQTREO0FBQzVEO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQsNkJBQTZCLFNBQVM7QUFDL0YsMkRBQTJELHVCQUF1Qiw4QkFBOEIsNkdBQTZHO0FBQzdOO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9saWIvaW50ZXJuYWwvZmluZC9yZXRyeS1vcHRpb25zLmpzP2UwYzciXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0UmV0cnlPcHRpb25zID0gdm9pZCAwO1xuY29uc3QgY29yZSA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvY29yZVwiKSk7XG4vLyBEZWZhdWx0cyBmb3IgZmV0Y2hpbmcgYXJ0aWZhY3RzXG5jb25zdCBkZWZhdWx0TWF4UmV0cnlOdW1iZXIgPSA1O1xuY29uc3QgZGVmYXVsdEV4ZW1wdFN0YXR1c0NvZGVzID0gWzQwMCwgNDAxLCA0MDMsIDQwNCwgNDIyXTsgLy8gaHR0cHM6Ly9naXRodWIuY29tL29jdG9raXQvcGx1Z2luLXJldHJ5LmpzL2Jsb2IvOWEyNDQzNzQ2YzM1MGIzYmVlZGVjMzVjZjI2ZTE5N2VhMzE4YTI2MS9zcmMvaW5kZXgudHMjTDE0XG5mdW5jdGlvbiBnZXRSZXRyeU9wdGlvbnMoZGVmYXVsdE9wdGlvbnMsIHJldHJpZXMgPSBkZWZhdWx0TWF4UmV0cnlOdW1iZXIsIGV4ZW1wdFN0YXR1c0NvZGVzID0gZGVmYXVsdEV4ZW1wdFN0YXR1c0NvZGVzKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmIChyZXRyaWVzIDw9IDApIHtcbiAgICAgICAgcmV0dXJuIFt7IGVuYWJsZWQ6IGZhbHNlIH0sIGRlZmF1bHRPcHRpb25zLnJlcXVlc3RdO1xuICAgIH1cbiAgICBjb25zdCByZXRyeU9wdGlvbnMgPSB7XG4gICAgICAgIGVuYWJsZWQ6IHRydWVcbiAgICB9O1xuICAgIGlmIChleGVtcHRTdGF0dXNDb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHJ5T3B0aW9ucy5kb05vdFJldHJ5ID0gZXhlbXB0U3RhdHVzQ29kZXM7XG4gICAgfVxuICAgIC8vIFRoZSBHaXRIdWIgdHlwZSBoYXMgc29tZSBkZWZhdWx0cyBmb3IgYG9wdGlvbnMucmVxdWVzdGBcbiAgICAvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hY3Rpb25zL3Rvb2xraXQvYmxvYi80ZmJjNWM5NDFhNTcyNDliMTk1NjIwMTVlZGJkNzJhZGQxNGJlOTNkL3BhY2thZ2VzL2dpdGh1Yi9zcmMvdXRpbHMudHMjTDE1XG4gICAgLy8gV2UgcGFzcyB0aGVzZSBpbiBoZXJlIHNvIHRoZXkgYXJlIG5vdCBvdmVycmlkZGVuLlxuICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0T3B0aW9ucy5yZXF1ZXN0KSwgeyByZXRyaWVzIH0pO1xuICAgIGNvcmUuZGVidWcoYEdpdEh1YiBjbGllbnQgY29uZmlndXJlZCB3aXRoOiAocmV0cmllczogJHtyZXF1ZXN0T3B0aW9ucy5yZXRyaWVzfSwgcmV0cnktZXhlbXB0LXN0YXR1cy1jb2RlOiAkeyhfYSA9IHJldHJ5T3B0aW9ucy5kb05vdFJldHJ5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnb2N0b2tpdCBkZWZhdWx0OiBbNDAwLCA0MDEsIDQwMywgNDA0LCA0MjJdJ30pYCk7XG4gICAgcmV0dXJuIFtyZXRyeU9wdGlvbnMsIHJlcXVlc3RPcHRpb25zXTtcbn1cbmV4cG9ydHMuZ2V0UmV0cnlPcHRpb25zID0gZ2V0UmV0cnlPcHRpb25zO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmV0cnktb3B0aW9ucy5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///666\n')},2445:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.internalArtifactTwirpClient = void 0;\nconst http_client_1 = __webpack_require__(4635);\nconst auth_1 = __webpack_require__(2429);\nconst core_1 = __webpack_require__(2225);\nconst generated_1 = __webpack_require__(2330);\nconst config_1 = __webpack_require__(1020);\nconst user_agent_1 = __webpack_require__(5270);\nconst errors_1 = __webpack_require__(5666);\nclass ArtifactHttpClient {\n constructor(userAgent, maxAttempts, baseRetryIntervalMilliseconds, retryMultiplier) {\n this.maxAttempts = 5;\n this.baseRetryIntervalMilliseconds = 3000;\n this.retryMultiplier = 1.5;\n const token = (0, config_1.getRuntimeToken)();\n this.baseUrl = (0, config_1.getResultsServiceUrl)();\n if (maxAttempts) {\n this.maxAttempts = maxAttempts;\n }\n if (baseRetryIntervalMilliseconds) {\n this.baseRetryIntervalMilliseconds = baseRetryIntervalMilliseconds;\n }\n if (retryMultiplier) {\n this.retryMultiplier = retryMultiplier;\n }\n this.httpClient = new http_client_1.HttpClient(userAgent, [\n new auth_1.BearerCredentialHandler(token)\n ]);\n }\n // This function satisfies the Rpc interface. It is compatible with the JSON\n // JSON generated client.\n request(service, method, contentType, data) {\n return __awaiter(this, void 0, void 0, function* () {\n const url = new URL(`/twirp/${service}/${method}`, this.baseUrl).href;\n (0, core_1.debug)(`[Request] ${method} ${url}`);\n const headers = {\n 'Content-Type': contentType\n };\n try {\n const { body } = yield this.retryableRequest(() => __awaiter(this, void 0, void 0, function* () { return this.httpClient.post(url, JSON.stringify(data), headers); }));\n return body;\n }\n catch (error) {\n throw new Error(`Failed to ${method}: ${error.message}`);\n }\n });\n }\n retryableRequest(operation) {\n return __awaiter(this, void 0, void 0, function* () {\n let attempt = 0;\n let errorMessage = '';\n let rawBody = '';\n while (attempt < this.maxAttempts) {\n let isRetryable = false;\n try {\n const response = yield operation();\n const statusCode = response.message.statusCode;\n rawBody = yield response.readBody();\n (0, core_1.debug)(`[Response] - ${response.message.statusCode}`);\n (0, core_1.debug)(`Headers: ${JSON.stringify(response.message.headers, null, 2)}`);\n const body = JSON.parse(rawBody);\n (0, core_1.debug)(`Body: ${JSON.stringify(body, null, 2)}`);\n if (this.isSuccessStatusCode(statusCode)) {\n return { response, body };\n }\n isRetryable = this.isRetryableHttpStatusCode(statusCode);\n errorMessage = `Failed request: (${statusCode}) ${response.message.statusMessage}`;\n if (body.msg) {\n if (errors_1.UsageError.isUsageErrorMessage(body.msg)) {\n throw new errors_1.UsageError();\n }\n errorMessage = `${errorMessage}: ${body.msg}`;\n }\n }\n catch (error) {\n if (error instanceof SyntaxError) {\n (0, core_1.debug)(`Raw Body: ${rawBody}`);\n throw error;\n }\n if (error instanceof errors_1.UsageError) {\n throw error;\n }\n if (errors_1.NetworkError.isNetworkErrorCode(error === null || error === void 0 ? void 0 : error.code)) {\n throw new errors_1.NetworkError(error === null || error === void 0 ? void 0 : error.code);\n }\n isRetryable = true;\n errorMessage = error.message;\n }\n if (!isRetryable) {\n throw new Error(`Received non-retryable error: ${errorMessage}`);\n }\n if (attempt + 1 === this.maxAttempts) {\n throw new Error(`Failed to make request after ${this.maxAttempts} attempts: ${errorMessage}`);\n }\n const retryTimeMilliseconds = this.getExponentialRetryTimeMilliseconds(attempt);\n (0, core_1.info)(`Attempt ${attempt + 1} of ${this.maxAttempts} failed with error: ${errorMessage}. Retrying request in ${retryTimeMilliseconds} ms...`);\n yield this.sleep(retryTimeMilliseconds);\n attempt++;\n }\n throw new Error(`Request failed`);\n });\n }\n isSuccessStatusCode(statusCode) {\n if (!statusCode)\n return false;\n return statusCode >= 200 && statusCode < 300;\n }\n isRetryableHttpStatusCode(statusCode) {\n if (!statusCode)\n return false;\n const retryableStatusCodes = [\n http_client_1.HttpCodes.BadGateway,\n http_client_1.HttpCodes.GatewayTimeout,\n http_client_1.HttpCodes.InternalServerError,\n http_client_1.HttpCodes.ServiceUnavailable,\n http_client_1.HttpCodes.TooManyRequests\n ];\n return retryableStatusCodes.includes(statusCode);\n }\n sleep(milliseconds) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise(resolve => setTimeout(resolve, milliseconds));\n });\n }\n getExponentialRetryTimeMilliseconds(attempt) {\n if (attempt < 0) {\n throw new Error('attempt should be a positive integer');\n }\n if (attempt === 0) {\n return this.baseRetryIntervalMilliseconds;\n }\n const minTime = this.baseRetryIntervalMilliseconds * Math.pow(this.retryMultiplier, attempt);\n const maxTime = minTime * this.retryMultiplier;\n // returns a random number between minTime and maxTime (exclusive)\n return Math.trunc(Math.random() * (maxTime - minTime) + minTime);\n }\n}\nfunction internalArtifactTwirpClient(options) {\n const client = new ArtifactHttpClient((0, user_agent_1.getUserAgentString)(), options === null || options === void 0 ? void 0 : options.maxAttempts, options === null || options === void 0 ? void 0 : options.retryIntervalMs, options === null || options === void 0 ? void 0 : options.retryMultiplier);\n return new generated_1.ArtifactServiceClientJSON(client);\n}\nexports.internalArtifactTwirpClient = internalArtifactTwirpClient;\n//# sourceMappingURL=artifact-twirp-client.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ0NS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0EsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsbUNBQW1DO0FBQ25DLHNCQUFzQixtQkFBTyxDQUFDLElBQXNCO0FBQ3BELGVBQWUsbUJBQU8sQ0FBQyxJQUErQjtBQUN0RCxlQUFlLG1CQUFPLENBQUMsSUFBZTtBQUN0QyxvQkFBb0IsbUJBQU8sQ0FBQyxJQUFpQjtBQUM3QyxpQkFBaUIsbUJBQU8sQ0FBQyxJQUFVO0FBQ25DLHFCQUFxQixtQkFBTyxDQUFDLElBQWM7QUFDM0MsaUJBQWlCLG1CQUFPLENBQUMsSUFBVTtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsUUFBUSxHQUFHLE9BQU87QUFDNUQsMkNBQTJDLFFBQVEsRUFBRSxJQUFJO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLE9BQU8sbUZBQW1GLGtFQUFrRTtBQUNwTDtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsT0FBTyxJQUFJLGNBQWM7QUFDdEU7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELDRCQUE0QjtBQUNsRixrREFBa0Qsa0RBQWtEO0FBQ3BHO0FBQ0EsK0NBQStDLDhCQUE4QjtBQUM3RTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0EsdURBQXVELFdBQVcsSUFBSSwrQkFBK0I7QUFDckc7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsYUFBYSxJQUFJLFNBQVM7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsUUFBUTtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUUsYUFBYTtBQUNsRjtBQUNBO0FBQ0Esb0VBQW9FLGtCQUFrQixZQUFZLGFBQWE7QUFDL0c7QUFDQTtBQUNBLDRDQUE0QyxhQUFhLEtBQUssa0JBQWtCLHFCQUFxQixhQUFhLHdCQUF3Qix1QkFBdUI7QUFDaks7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQyIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9pbnRlcm5hbC9zaGFyZWQvYXJ0aWZhY3QtdHdpcnAtY2xpZW50LmpzPzQ2ZWEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaW50ZXJuYWxBcnRpZmFjdFR3aXJwQ2xpZW50ID0gdm9pZCAwO1xuY29uc3QgaHR0cF9jbGllbnRfMSA9IHJlcXVpcmUoXCJAYWN0aW9ucy9odHRwLWNsaWVudFwiKTtcbmNvbnN0IGF1dGhfMSA9IHJlcXVpcmUoXCJAYWN0aW9ucy9odHRwLWNsaWVudC9saWIvYXV0aFwiKTtcbmNvbnN0IGNvcmVfMSA9IHJlcXVpcmUoXCJAYWN0aW9ucy9jb3JlXCIpO1xuY29uc3QgZ2VuZXJhdGVkXzEgPSByZXF1aXJlKFwiLi4vLi4vZ2VuZXJhdGVkXCIpO1xuY29uc3QgY29uZmlnXzEgPSByZXF1aXJlKFwiLi9jb25maWdcIik7XG5jb25zdCB1c2VyX2FnZW50XzEgPSByZXF1aXJlKFwiLi91c2VyLWFnZW50XCIpO1xuY29uc3QgZXJyb3JzXzEgPSByZXF1aXJlKFwiLi9lcnJvcnNcIik7XG5jbGFzcyBBcnRpZmFjdEh0dHBDbGllbnQge1xuICAgIGNvbnN0cnVjdG9yKHVzZXJBZ2VudCwgbWF4QXR0ZW1wdHMsIGJhc2VSZXRyeUludGVydmFsTWlsbGlzZWNvbmRzLCByZXRyeU11bHRpcGxpZXIpIHtcbiAgICAgICAgdGhpcy5tYXhBdHRlbXB0cyA9IDU7XG4gICAgICAgIHRoaXMuYmFzZVJldHJ5SW50ZXJ2YWxNaWxsaXNlY29uZHMgPSAzMDAwO1xuICAgICAgICB0aGlzLnJldHJ5TXVsdGlwbGllciA9IDEuNTtcbiAgICAgICAgY29uc3QgdG9rZW4gPSAoMCwgY29uZmlnXzEuZ2V0UnVudGltZVRva2VuKSgpO1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSAoMCwgY29uZmlnXzEuZ2V0UmVzdWx0c1NlcnZpY2VVcmwpKCk7XG4gICAgICAgIGlmIChtYXhBdHRlbXB0cykge1xuICAgICAgICAgICAgdGhpcy5tYXhBdHRlbXB0cyA9IG1heEF0dGVtcHRzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYXNlUmV0cnlJbnRlcnZhbE1pbGxpc2Vjb25kcykge1xuICAgICAgICAgICAgdGhpcy5iYXNlUmV0cnlJbnRlcnZhbE1pbGxpc2Vjb25kcyA9IGJhc2VSZXRyeUludGVydmFsTWlsbGlzZWNvbmRzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXRyeU11bHRpcGxpZXIpIHtcbiAgICAgICAgICAgIHRoaXMucmV0cnlNdWx0aXBsaWVyID0gcmV0cnlNdWx0aXBsaWVyO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaHR0cENsaWVudCA9IG5ldyBodHRwX2NsaWVudF8xLkh0dHBDbGllbnQodXNlckFnZW50LCBbXG4gICAgICAgICAgICBuZXcgYXV0aF8xLkJlYXJlckNyZWRlbnRpYWxIYW5kbGVyKHRva2VuKVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLy8gVGhpcyBmdW5jdGlvbiBzYXRpc2ZpZXMgdGhlIFJwYyBpbnRlcmZhY2UuIEl0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgSlNPTlxuICAgIC8vIEpTT04gZ2VuZXJhdGVkIGNsaWVudC5cbiAgICByZXF1ZXN0KHNlcnZpY2UsIG1ldGhvZCwgY29udGVudFR5cGUsIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYC90d2lycC8ke3NlcnZpY2V9LyR7bWV0aG9kfWAsIHRoaXMuYmFzZVVybCkuaHJlZjtcbiAgICAgICAgICAgICgwLCBjb3JlXzEuZGVidWcpKGBbUmVxdWVzdF0gJHttZXRob2R9ICR7dXJsfWApO1xuICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogY29udGVudFR5cGVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgYm9keSB9ID0geWllbGQgdGhpcy5yZXRyeWFibGVSZXF1ZXN0KCgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0KHVybCwgSlNPTi5zdHJpbmdpZnkoZGF0YSksIGhlYWRlcnMpOyB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byAke21ldGhvZH06ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHJ5YWJsZVJlcXVlc3Qob3BlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgICAgICAgICBsZXQgcmF3Qm9keSA9ICcnO1xuICAgICAgICAgICAgd2hpbGUgKGF0dGVtcHQgPCB0aGlzLm1heEF0dGVtcHRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlzUmV0cnlhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBvcGVyYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IHJlc3BvbnNlLm1lc3NhZ2Uuc3RhdHVzQ29kZTtcbiAgICAgICAgICAgICAgICAgICAgcmF3Qm9keSA9IHlpZWxkIHJlc3BvbnNlLnJlYWRCb2R5KCk7XG4gICAgICAgICAgICAgICAgICAgICgwLCBjb3JlXzEuZGVidWcpKGBbUmVzcG9uc2VdIC0gJHtyZXNwb25zZS5tZXNzYWdlLnN0YXR1c0NvZGV9YCk7XG4gICAgICAgICAgICAgICAgICAgICgwLCBjb3JlXzEuZGVidWcpKGBIZWFkZXJzOiAke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlLm1lc3NhZ2UuaGVhZGVycywgbnVsbCwgMil9YCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnBhcnNlKHJhd0JvZHkpO1xuICAgICAgICAgICAgICAgICAgICAoMCwgY29yZV8xLmRlYnVnKShgQm9keTogJHtKU09OLnN0cmluZ2lmeShib2R5LCBudWxsLCAyKX1gKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTdWNjZXNzU3RhdHVzQ29kZShzdGF0dXNDb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcmVzcG9uc2UsIGJvZHkgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpc1JldHJ5YWJsZSA9IHRoaXMuaXNSZXRyeWFibGVIdHRwU3RhdHVzQ29kZShzdGF0dXNDb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gYEZhaWxlZCByZXF1ZXN0OiAoJHtzdGF0dXNDb2RlfSkgJHtyZXNwb25zZS5tZXNzYWdlLnN0YXR1c01lc3NhZ2V9YDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHkubXNnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JzXzEuVXNhZ2VFcnJvci5pc1VzYWdlRXJyb3JNZXNzYWdlKGJvZHkubXNnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5Vc2FnZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBgJHtlcnJvck1lc3NhZ2V9OiAke2JvZHkubXNnfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAoMCwgY29yZV8xLmRlYnVnKShgUmF3IEJvZHk6ICR7cmF3Qm9keX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIGVycm9yc18xLlVzYWdlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnNfMS5OZXR3b3JrRXJyb3IuaXNOZXR3b3JrRXJyb3JDb2RlKGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvci5jb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLk5ldHdvcmtFcnJvcihlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3IuY29kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaXNSZXRyeWFibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWlzUmV0cnlhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgbm9uLXJldHJ5YWJsZSBlcnJvcjogJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhdHRlbXB0ICsgMSA9PT0gdGhpcy5tYXhBdHRlbXB0cykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBtYWtlIHJlcXVlc3QgYWZ0ZXIgJHt0aGlzLm1heEF0dGVtcHRzfSBhdHRlbXB0czogJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJldHJ5VGltZU1pbGxpc2Vjb25kcyA9IHRoaXMuZ2V0RXhwb25lbnRpYWxSZXRyeVRpbWVNaWxsaXNlY29uZHMoYXR0ZW1wdCk7XG4gICAgICAgICAgICAgICAgKDAsIGNvcmVfMS5pbmZvKShgQXR0ZW1wdCAke2F0dGVtcHQgKyAxfSBvZiAke3RoaXMubWF4QXR0ZW1wdHN9IGZhaWxlZCB3aXRoIGVycm9yOiAke2Vycm9yTWVzc2FnZX0uIFJldHJ5aW5nIHJlcXVlc3QgaW4gJHtyZXRyeVRpbWVNaWxsaXNlY29uZHN9IG1zLi4uYCk7XG4gICAgICAgICAgICAgICAgeWllbGQgdGhpcy5zbGVlcChyZXRyeVRpbWVNaWxsaXNlY29uZHMpO1xuICAgICAgICAgICAgICAgIGF0dGVtcHQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWVzdCBmYWlsZWRgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlzU3VjY2Vzc1N0YXR1c0NvZGUoc3RhdHVzQ29kZSkge1xuICAgICAgICBpZiAoIXN0YXR1c0NvZGUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBzdGF0dXNDb2RlID49IDIwMCAmJiBzdGF0dXNDb2RlIDwgMzAwO1xuICAgIH1cbiAgICBpc1JldHJ5YWJsZUh0dHBTdGF0dXNDb2RlKHN0YXR1c0NvZGUpIHtcbiAgICAgICAgaWYgKCFzdGF0dXNDb2RlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCByZXRyeWFibGVTdGF0dXNDb2RlcyA9IFtcbiAgICAgICAgICAgIGh0dHBfY2xpZW50XzEuSHR0cENvZGVzLkJhZEdhdGV3YXksXG4gICAgICAgICAgICBodHRwX2NsaWVudF8xLkh0dHBDb2Rlcy5HYXRld2F5VGltZW91dCxcbiAgICAgICAgICAgIGh0dHBfY2xpZW50XzEuSHR0cENvZGVzLkludGVybmFsU2VydmVyRXJyb3IsXG4gICAgICAgICAgICBodHRwX2NsaWVudF8xLkh0dHBDb2Rlcy5TZXJ2aWNlVW5hdmFpbGFibGUsXG4gICAgICAgICAgICBodHRwX2NsaWVudF8xLkh0dHBDb2Rlcy5Ub29NYW55UmVxdWVzdHNcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIHJldHJ5YWJsZVN0YXR1c0NvZGVzLmluY2x1ZGVzKHN0YXR1c0NvZGUpO1xuICAgIH1cbiAgICBzbGVlcChtaWxsaXNlY29uZHMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmRzKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRFeHBvbmVudGlhbFJldHJ5VGltZU1pbGxpc2Vjb25kcyhhdHRlbXB0KSB7XG4gICAgICAgIGlmIChhdHRlbXB0IDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhdHRlbXB0IHNob3VsZCBiZSBhIHBvc2l0aXZlIGludGVnZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXR0ZW1wdCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVJldHJ5SW50ZXJ2YWxNaWxsaXNlY29uZHM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWluVGltZSA9IHRoaXMuYmFzZVJldHJ5SW50ZXJ2YWxNaWxsaXNlY29uZHMgKiBNYXRoLnBvdyh0aGlzLnJldHJ5TXVsdGlwbGllciwgYXR0ZW1wdCk7XG4gICAgICAgIGNvbnN0IG1heFRpbWUgPSBtaW5UaW1lICogdGhpcy5yZXRyeU11bHRpcGxpZXI7XG4gICAgICAgIC8vIHJldHVybnMgYSByYW5kb20gbnVtYmVyIGJldHdlZW4gbWluVGltZSBhbmQgbWF4VGltZSAoZXhjbHVzaXZlKVxuICAgICAgICByZXR1cm4gTWF0aC50cnVuYyhNYXRoLnJhbmRvbSgpICogKG1heFRpbWUgLSBtaW5UaW1lKSArIG1pblRpbWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGludGVybmFsQXJ0aWZhY3RUd2lycENsaWVudChvcHRpb25zKSB7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IEFydGlmYWN0SHR0cENsaWVudCgoMCwgdXNlcl9hZ2VudF8xLmdldFVzZXJBZ2VudFN0cmluZykoKSwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm1heEF0dGVtcHRzLCBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucmV0cnlJbnRlcnZhbE1zLCBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucmV0cnlNdWx0aXBsaWVyKTtcbiAgICByZXR1cm4gbmV3IGdlbmVyYXRlZF8xLkFydGlmYWN0U2VydmljZUNsaWVudEpTT04oY2xpZW50KTtcbn1cbmV4cG9ydHMuaW50ZXJuYWxBcnRpZmFjdFR3aXJwQ2xpZW50ID0gaW50ZXJuYWxBcnRpZmFjdFR3aXJwQ2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJ0aWZhY3QtdHdpcnAtY2xpZW50LmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2445\n")},1020:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.getConcurrency = exports.getGitHubWorkspaceDir = exports.isGhes = exports.getResultsServiceUrl = exports.getRuntimeToken = exports.getUploadChunkSize = void 0;\nconst os_1 = __importDefault(__webpack_require__(2037));\n// Used for controlling the highWaterMark value of the zip that is being streamed\n// The same value is used as the chunk size that is use during upload to blob storage\nfunction getUploadChunkSize() {\n return 8 * 1024 * 1024; // 8 MB Chunks\n}\nexports.getUploadChunkSize = getUploadChunkSize;\nfunction getRuntimeToken() {\n const token = process.env['ACTIONS_RUNTIME_TOKEN'];\n if (!token) {\n throw new Error('Unable to get the ACTIONS_RUNTIME_TOKEN env variable');\n }\n return token;\n}\nexports.getRuntimeToken = getRuntimeToken;\nfunction getResultsServiceUrl() {\n const resultsUrl = process.env['ACTIONS_RESULTS_URL'];\n if (!resultsUrl) {\n throw new Error('Unable to get the ACTIONS_RESULTS_URL env variable');\n }\n return new URL(resultsUrl).origin;\n}\nexports.getResultsServiceUrl = getResultsServiceUrl;\nfunction isGhes() {\n const ghUrl = new URL(process.env['GITHUB_SERVER_URL'] || 'https://github.com');\n return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM';\n}\nexports.isGhes = isGhes;\nfunction getGitHubWorkspaceDir() {\n const ghWorkspaceDir = process.env['GITHUB_WORKSPACE'];\n if (!ghWorkspaceDir) {\n throw new Error('Unable to get the GITHUB_WORKSPACE env variable');\n }\n return ghWorkspaceDir;\n}\nexports.getGitHubWorkspaceDir = getGitHubWorkspaceDir;\n// Mimics behavior of azcopy: https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-optimize\n// If your machine has fewer than 5 CPUs, then the value of this variable is set to 32.\n// Otherwise, the default value is equal to 16 multiplied by the number of CPUs. The maximum value of this variable is 300.\nfunction getConcurrency() {\n const numCPUs = os_1.default.cpus().length;\n if (numCPUs <= 4) {\n return 32;\n }\n const concurrency = 16 * numCPUs;\n return concurrency > 300 ? 300 : concurrency;\n}\nexports.getConcurrency = getConcurrency;\n//# sourceMappingURL=config.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAyMC5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHNCQUFzQixHQUFHLDZCQUE2QixHQUFHLGNBQWMsR0FBRyw0QkFBNEIsR0FBRyx1QkFBdUIsR0FBRywwQkFBMEI7QUFDN0osNkJBQTZCLG1CQUFPLENBQUMsSUFBSTtBQUN6QztBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QiIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9pbnRlcm5hbC9zaGFyZWQvY29uZmlnLmpzP2VmMzYiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldENvbmN1cnJlbmN5ID0gZXhwb3J0cy5nZXRHaXRIdWJXb3Jrc3BhY2VEaXIgPSBleHBvcnRzLmlzR2hlcyA9IGV4cG9ydHMuZ2V0UmVzdWx0c1NlcnZpY2VVcmwgPSBleHBvcnRzLmdldFJ1bnRpbWVUb2tlbiA9IGV4cG9ydHMuZ2V0VXBsb2FkQ2h1bmtTaXplID0gdm9pZCAwO1xuY29uc3Qgb3NfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwib3NcIikpO1xuLy8gVXNlZCBmb3IgY29udHJvbGxpbmcgdGhlIGhpZ2hXYXRlck1hcmsgdmFsdWUgb2YgdGhlIHppcCB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4vLyBUaGUgc2FtZSB2YWx1ZSBpcyB1c2VkIGFzIHRoZSBjaHVuayBzaXplIHRoYXQgaXMgdXNlIGR1cmluZyB1cGxvYWQgdG8gYmxvYiBzdG9yYWdlXG5mdW5jdGlvbiBnZXRVcGxvYWRDaHVua1NpemUoKSB7XG4gICAgcmV0dXJuIDggKiAxMDI0ICogMTAyNDsgLy8gOCBNQiBDaHVua3Ncbn1cbmV4cG9ydHMuZ2V0VXBsb2FkQ2h1bmtTaXplID0gZ2V0VXBsb2FkQ2h1bmtTaXplO1xuZnVuY3Rpb24gZ2V0UnVudGltZVRva2VuKCkge1xuICAgIGNvbnN0IHRva2VuID0gcHJvY2Vzcy5lbnZbJ0FDVElPTlNfUlVOVElNRV9UT0tFTiddO1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZ2V0IHRoZSBBQ1RJT05TX1JVTlRJTUVfVE9LRU4gZW52IHZhcmlhYmxlJyk7XG4gICAgfVxuICAgIHJldHVybiB0b2tlbjtcbn1cbmV4cG9ydHMuZ2V0UnVudGltZVRva2VuID0gZ2V0UnVudGltZVRva2VuO1xuZnVuY3Rpb24gZ2V0UmVzdWx0c1NlcnZpY2VVcmwoKSB7XG4gICAgY29uc3QgcmVzdWx0c1VybCA9IHByb2Nlc3MuZW52WydBQ1RJT05TX1JFU1VMVFNfVVJMJ107XG4gICAgaWYgKCFyZXN1bHRzVXJsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGdldCB0aGUgQUNUSU9OU19SRVNVTFRTX1VSTCBlbnYgdmFyaWFibGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBVUkwocmVzdWx0c1VybCkub3JpZ2luO1xufVxuZXhwb3J0cy5nZXRSZXN1bHRzU2VydmljZVVybCA9IGdldFJlc3VsdHNTZXJ2aWNlVXJsO1xuZnVuY3Rpb24gaXNHaGVzKCkge1xuICAgIGNvbnN0IGdoVXJsID0gbmV3IFVSTChwcm9jZXNzLmVudlsnR0lUSFVCX1NFUlZFUl9VUkwnXSB8fCAnaHR0cHM6Ly9naXRodWIuY29tJyk7XG4gICAgcmV0dXJuIGdoVXJsLmhvc3RuYW1lLnRvVXBwZXJDYXNlKCkgIT09ICdHSVRIVUIuQ09NJztcbn1cbmV4cG9ydHMuaXNHaGVzID0gaXNHaGVzO1xuZnVuY3Rpb24gZ2V0R2l0SHViV29ya3NwYWNlRGlyKCkge1xuICAgIGNvbnN0IGdoV29ya3NwYWNlRGlyID0gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9XT1JLU1BBQ0UnXTtcbiAgICBpZiAoIWdoV29ya3NwYWNlRGlyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGdldCB0aGUgR0lUSFVCX1dPUktTUEFDRSBlbnYgdmFyaWFibGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIGdoV29ya3NwYWNlRGlyO1xufVxuZXhwb3J0cy5nZXRHaXRIdWJXb3Jrc3BhY2VEaXIgPSBnZXRHaXRIdWJXb3Jrc3BhY2VEaXI7XG4vLyBNaW1pY3MgYmVoYXZpb3Igb2YgYXpjb3B5OiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS11c2UtYXpjb3B5LW9wdGltaXplXG4vLyBJZiB5b3VyIG1hY2hpbmUgaGFzIGZld2VyIHRoYW4gNSBDUFVzLCB0aGVuIHRoZSB2YWx1ZSBvZiB0aGlzIHZhcmlhYmxlIGlzIHNldCB0byAzMi5cbi8vIE90aGVyd2lzZSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgZXF1YWwgdG8gMTYgbXVsdGlwbGllZCBieSB0aGUgbnVtYmVyIG9mIENQVXMuIFRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoaXMgdmFyaWFibGUgaXMgMzAwLlxuZnVuY3Rpb24gZ2V0Q29uY3VycmVuY3koKSB7XG4gICAgY29uc3QgbnVtQ1BVcyA9IG9zXzEuZGVmYXVsdC5jcHVzKCkubGVuZ3RoO1xuICAgIGlmIChudW1DUFVzIDw9IDQpIHtcbiAgICAgICAgcmV0dXJuIDMyO1xuICAgIH1cbiAgICBjb25zdCBjb25jdXJyZW5jeSA9IDE2ICogbnVtQ1BVcztcbiAgICByZXR1cm4gY29uY3VycmVuY3kgPiAzMDAgPyAzMDAgOiBjb25jdXJyZW5jeTtcbn1cbmV4cG9ydHMuZ2V0Q29uY3VycmVuY3kgPSBnZXRDb25jdXJyZW5jeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmZpZy5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1020\n")},5666:(__unused_webpack_module,exports)=>{"use strict";eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.UsageError = exports.NetworkError = exports.GHESNotSupportedError = exports.ArtifactNotFoundError = exports.InvalidResponseError = exports.FilesNotFoundError = void 0;\nclass FilesNotFoundError extends Error {\n constructor(files = []) {\n let message = 'No files were found to upload';\n if (files.length > 0) {\n message += `: ${files.join(', ')}`;\n }\n super(message);\n this.files = files;\n this.name = 'FilesNotFoundError';\n }\n}\nexports.FilesNotFoundError = FilesNotFoundError;\nclass InvalidResponseError extends Error {\n constructor(message) {\n super(message);\n this.name = 'InvalidResponseError';\n }\n}\nexports.InvalidResponseError = InvalidResponseError;\nclass ArtifactNotFoundError extends Error {\n constructor(message = 'Artifact not found') {\n super(message);\n this.name = 'ArtifactNotFoundError';\n }\n}\nexports.ArtifactNotFoundError = ArtifactNotFoundError;\nclass GHESNotSupportedError extends Error {\n constructor(message = '@actions/artifact v2.0.0+, upload-artifact@v4+ and download-artifact@v4+ are not currently supported on GHES.') {\n super(message);\n this.name = 'GHESNotSupportedError';\n }\n}\nexports.GHESNotSupportedError = GHESNotSupportedError;\nclass NetworkError extends Error {\n constructor(code) {\n const message = `Unable to make request: ${code}\\nIf you are using self-hosted runners, please make sure your runner has access to all GitHub endpoints: https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners#communication-between-self-hosted-runners-and-github`;\n super(message);\n this.code = code;\n this.name = 'NetworkError';\n }\n}\nexports.NetworkError = NetworkError;\nNetworkError.isNetworkErrorCode = (code) => {\n if (!code)\n return false;\n return [\n 'ECONNRESET',\n 'ENOTFOUND',\n 'ETIMEDOUT',\n 'ECONNREFUSED',\n 'EHOSTUNREACH'\n ].includes(code);\n};\nclass UsageError extends Error {\n constructor() {\n const message = `Artifact storage quota has been hit. Unable to upload any new artifacts. Usage is recalculated every 6-12 hours.\\nMore info on storage limits: https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions#calculating-minute-and-storage-spending`;\n super(message);\n this.name = 'UsageError';\n }\n}\nexports.UsageError = UsageError;\nUsageError.isUsageErrorMessage = (msg) => {\n if (!msg)\n return false;\n return msg.includes('insufficient usage');\n};\n//# sourceMappingURL=errors.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY2Ni5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxrQkFBa0IsR0FBRyxvQkFBb0IsR0FBRyw2QkFBNkIsR0FBRyw2QkFBNkIsR0FBRyw0QkFBNEIsR0FBRywwQkFBMEI7QUFDcks7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsaUJBQWlCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0EsbURBQW1ELEtBQUs7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2ludGVybmFsL3NoYXJlZC9lcnJvcnMuanM/Nzk5YyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVXNhZ2VFcnJvciA9IGV4cG9ydHMuTmV0d29ya0Vycm9yID0gZXhwb3J0cy5HSEVTTm90U3VwcG9ydGVkRXJyb3IgPSBleHBvcnRzLkFydGlmYWN0Tm90Rm91bmRFcnJvciA9IGV4cG9ydHMuSW52YWxpZFJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkZpbGVzTm90Rm91bmRFcnJvciA9IHZvaWQgMDtcbmNsYXNzIEZpbGVzTm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihmaWxlcyA9IFtdKSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gJ05vIGZpbGVzIHdlcmUgZm91bmQgdG8gdXBsb2FkJztcbiAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgKz0gYDogJHtmaWxlcy5qb2luKCcsICcpfWA7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuZmlsZXMgPSBmaWxlcztcbiAgICAgICAgdGhpcy5uYW1lID0gJ0ZpbGVzTm90Rm91bmRFcnJvcic7XG4gICAgfVxufVxuZXhwb3J0cy5GaWxlc05vdEZvdW5kRXJyb3IgPSBGaWxlc05vdEZvdW5kRXJyb3I7XG5jbGFzcyBJbnZhbGlkUmVzcG9uc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSAnSW52YWxpZFJlc3BvbnNlRXJyb3InO1xuICAgIH1cbn1cbmV4cG9ydHMuSW52YWxpZFJlc3BvbnNlRXJyb3IgPSBJbnZhbGlkUmVzcG9uc2VFcnJvcjtcbmNsYXNzIEFydGlmYWN0Tm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gJ0FydGlmYWN0IG5vdCBmb3VuZCcpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdBcnRpZmFjdE5vdEZvdW5kRXJyb3InO1xuICAgIH1cbn1cbmV4cG9ydHMuQXJ0aWZhY3ROb3RGb3VuZEVycm9yID0gQXJ0aWZhY3ROb3RGb3VuZEVycm9yO1xuY2xhc3MgR0hFU05vdFN1cHBvcnRlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSAnQGFjdGlvbnMvYXJ0aWZhY3QgdjIuMC4wKywgdXBsb2FkLWFydGlmYWN0QHY0KyBhbmQgZG93bmxvYWQtYXJ0aWZhY3RAdjQrIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBvbiBHSEVTLicpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdHSEVTTm90U3VwcG9ydGVkRXJyb3InO1xuICAgIH1cbn1cbmV4cG9ydHMuR0hFU05vdFN1cHBvcnRlZEVycm9yID0gR0hFU05vdFN1cHBvcnRlZEVycm9yO1xuY2xhc3MgTmV0d29ya0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGBVbmFibGUgdG8gbWFrZSByZXF1ZXN0OiAke2NvZGV9XFxuSWYgeW91IGFyZSB1c2luZyBzZWxmLWhvc3RlZCBydW5uZXJzLCBwbGVhc2UgbWFrZSBzdXJlIHlvdXIgcnVubmVyIGhhcyBhY2Nlc3MgdG8gYWxsIEdpdEh1YiBlbmRwb2ludHM6IGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvaG9zdGluZy15b3VyLW93bi1ydW5uZXJzL21hbmFnaW5nLXNlbGYtaG9zdGVkLXJ1bm5lcnMvYWJvdXQtc2VsZi1ob3N0ZWQtcnVubmVycyNjb21tdW5pY2F0aW9uLWJldHdlZW4tc2VsZi1ob3N0ZWQtcnVubmVycy1hbmQtZ2l0aHViYDtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIHRoaXMubmFtZSA9ICdOZXR3b3JrRXJyb3InO1xuICAgIH1cbn1cbmV4cG9ydHMuTmV0d29ya0Vycm9yID0gTmV0d29ya0Vycm9yO1xuTmV0d29ya0Vycm9yLmlzTmV0d29ya0Vycm9yQ29kZSA9IChjb2RlKSA9PiB7XG4gICAgaWYgKCFjb2RlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgJ0VDT05OUkVTRVQnLFxuICAgICAgICAnRU5PVEZPVU5EJyxcbiAgICAgICAgJ0VUSU1FRE9VVCcsXG4gICAgICAgICdFQ09OTlJFRlVTRUQnLFxuICAgICAgICAnRUhPU1RVTlJFQUNIJ1xuICAgIF0uaW5jbHVkZXMoY29kZSk7XG59O1xuY2xhc3MgVXNhZ2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGBBcnRpZmFjdCBzdG9yYWdlIHF1b3RhIGhhcyBiZWVuIGhpdC4gVW5hYmxlIHRvIHVwbG9hZCBhbnkgbmV3IGFydGlmYWN0cy4gVXNhZ2UgaXMgcmVjYWxjdWxhdGVkIGV2ZXJ5IDYtMTIgaG91cnMuXFxuTW9yZSBpbmZvIG9uIHN0b3JhZ2UgbGltaXRzOiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9iaWxsaW5nL21hbmFnaW5nLWJpbGxpbmctZm9yLWdpdGh1Yi1hY3Rpb25zL2Fib3V0LWJpbGxpbmctZm9yLWdpdGh1Yi1hY3Rpb25zI2NhbGN1bGF0aW5nLW1pbnV0ZS1hbmQtc3RvcmFnZS1zcGVuZGluZ2A7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSAnVXNhZ2VFcnJvcic7XG4gICAgfVxufVxuZXhwb3J0cy5Vc2FnZUVycm9yID0gVXNhZ2VFcnJvcjtcblVzYWdlRXJyb3IuaXNVc2FnZUVycm9yTWVzc2FnZSA9IChtc2cpID0+IHtcbiAgICBpZiAoIW1zZylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBtc2cuaW5jbHVkZXMoJ2luc3VmZmljaWVudCB1c2FnZScpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVycm9ycy5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5666\n")},3583:(__unused_webpack_module,exports)=>{"use strict";eval('\nObject.defineProperty(exports, "__esModule", ({ value: true }));\n//# sourceMappingURL=interfaces.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU4My5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9pbnRlcm5hbC9zaGFyZWQvaW50ZXJmYWNlcy5qcz8wODFmIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW50ZXJmYWNlcy5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3583\n')},5270:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval('\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.getUserAgentString = void 0;\n// eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports\nconst packageJson = __webpack_require__(9839);\n/**\n * Ensure that this User Agent String is used in all HTTP calls so that we can monitor telemetry between different versions of this package\n */\nfunction getUserAgentString() {\n return `@actions/artifact-${packageJson.version}`;\n}\nexports.getUserAgentString = getUserAgentString;\n//# sourceMappingURL=user-agent.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI3MC5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCwwQkFBMEI7QUFDMUI7QUFDQSxvQkFBb0IsbUJBQU8sQ0FBQyxJQUF1QjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxvQkFBb0I7QUFDcEQ7QUFDQSwwQkFBMEI7QUFDMUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9saWIvaW50ZXJuYWwvc2hhcmVkL3VzZXItYWdlbnQuanM/MzlhNSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0VXNlckFnZW50U3RyaW5nID0gdm9pZCAwO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXMsIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IHBhY2thZ2VKc29uID0gcmVxdWlyZSgnLi4vLi4vLi4vcGFja2FnZS5qc29uJyk7XG4vKipcbiAqIEVuc3VyZSB0aGF0IHRoaXMgVXNlciBBZ2VudCBTdHJpbmcgaXMgdXNlZCBpbiBhbGwgSFRUUCBjYWxscyBzbyB0aGF0IHdlIGNhbiBtb25pdG9yIHRlbGVtZXRyeSBiZXR3ZWVuIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGlzIHBhY2thZ2VcbiAqL1xuZnVuY3Rpb24gZ2V0VXNlckFnZW50U3RyaW5nKCkge1xuICAgIHJldHVybiBgQGFjdGlvbnMvYXJ0aWZhY3QtJHtwYWNrYWdlSnNvbi52ZXJzaW9ufWA7XG59XG5leHBvcnRzLmdldFVzZXJBZ2VudFN0cmluZyA9IGdldFVzZXJBZ2VudFN0cmluZztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZXItYWdlbnQuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5270\n')},3379:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { "default": mod };\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.getBackendIdsFromToken = void 0;\nconst core = __importStar(__webpack_require__(2225));\nconst config_1 = __webpack_require__(1020);\nconst jwt_decode_1 = __importDefault(__webpack_require__(6245));\nconst InvalidJwtError = new Error(\'Failed to get backend IDs: The provided JWT token is invalid and/or missing claims\');\n// uses the JWT token claims to get the\n// workflow run and workflow job run backend ids\nfunction getBackendIdsFromToken() {\n const token = (0, config_1.getRuntimeToken)();\n const decoded = (0, jwt_decode_1.default)(token);\n if (!decoded.scp) {\n throw InvalidJwtError;\n }\n /*\n * example decoded:\n * {\n * scp: "Actions.ExampleScope Actions.Results:ce7f54c7-61c7-4aae-887f-30da475f5f1a:ca395085-040a-526b-2ce8-bdc85f692774"\n * }\n */\n const scpParts = decoded.scp.split(\' \');\n if (scpParts.length === 0) {\n throw InvalidJwtError;\n }\n /*\n * example scpParts:\n * ["Actions.ExampleScope", "Actions.Results:ce7f54c7-61c7-4aae-887f-30da475f5f1a:ca395085-040a-526b-2ce8-bdc85f692774"]\n */\n for (const scopes of scpParts) {\n const scopeParts = scopes.split(\':\');\n if ((scopeParts === null || scopeParts === void 0 ? void 0 : scopeParts[0]) !== \'Actions.Results\') {\n // not the Actions.Results scope\n continue;\n }\n /*\n * example scopeParts:\n * ["Actions.Results", "ce7f54c7-61c7-4aae-887f-30da475f5f1a", "ca395085-040a-526b-2ce8-bdc85f692774"]\n */\n if (scopeParts.length !== 3) {\n // missing expected number of claims\n throw InvalidJwtError;\n }\n const ids = {\n workflowRunBackendId: scopeParts[1],\n workflowJobRunBackendId: scopeParts[2]\n };\n core.debug(`Workflow Run Backend ID: ${ids.workflowRunBackendId}`);\n core.debug(`Workflow Job Run Backend ID: ${ids.workflowJobRunBackendId}`);\n return ids;\n }\n throw InvalidJwtError;\n}\nexports.getBackendIdsFromToken = getBackendIdsFromToken;\n//# sourceMappingURL=util.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzM3OS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQ0FBb0M7QUFDbkQ7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsMENBQTBDLDRCQUE0QjtBQUN0RSxDQUFDO0FBQ0Q7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCw4QkFBOEI7QUFDOUIsMEJBQTBCLG1CQUFPLENBQUMsSUFBZTtBQUNqRCxpQkFBaUIsbUJBQU8sQ0FBQyxJQUFVO0FBQ25DLHFDQUFxQyxtQkFBTyxDQUFDLElBQVk7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyx5QkFBeUI7QUFDeEUsbURBQW1ELDRCQUE0QjtBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QiIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9pbnRlcm5hbC9zaGFyZWQvdXRpbC5qcz80MDg3Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldEJhY2tlbmRJZHNGcm9tVG9rZW4gPSB2b2lkIDA7XG5jb25zdCBjb3JlID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJAYWN0aW9ucy9jb3JlXCIpKTtcbmNvbnN0IGNvbmZpZ18xID0gcmVxdWlyZShcIi4vY29uZmlnXCIpO1xuY29uc3Qgand0X2RlY29kZV8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJqd3QtZGVjb2RlXCIpKTtcbmNvbnN0IEludmFsaWRKd3RFcnJvciA9IG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCBiYWNrZW5kIElEczogVGhlIHByb3ZpZGVkIEpXVCB0b2tlbiBpcyBpbnZhbGlkIGFuZC9vciBtaXNzaW5nIGNsYWltcycpO1xuLy8gdXNlcyB0aGUgSldUIHRva2VuIGNsYWltcyB0byBnZXQgdGhlXG4vLyB3b3JrZmxvdyBydW4gYW5kIHdvcmtmbG93IGpvYiBydW4gYmFja2VuZCBpZHNcbmZ1bmN0aW9uIGdldEJhY2tlbmRJZHNGcm9tVG9rZW4oKSB7XG4gICAgY29uc3QgdG9rZW4gPSAoMCwgY29uZmlnXzEuZ2V0UnVudGltZVRva2VuKSgpO1xuICAgIGNvbnN0IGRlY29kZWQgPSAoMCwgand0X2RlY29kZV8xLmRlZmF1bHQpKHRva2VuKTtcbiAgICBpZiAoIWRlY29kZWQuc2NwKSB7XG4gICAgICAgIHRocm93IEludmFsaWRKd3RFcnJvcjtcbiAgICB9XG4gICAgLypcbiAgICAgKiBleGFtcGxlIGRlY29kZWQ6XG4gICAgICoge1xuICAgICAqICAgc2NwOiBcIkFjdGlvbnMuRXhhbXBsZVNjb3BlIEFjdGlvbnMuUmVzdWx0czpjZTdmNTRjNy02MWM3LTRhYWUtODg3Zi0zMGRhNDc1ZjVmMWE6Y2EzOTUwODUtMDQwYS01MjZiLTJjZTgtYmRjODVmNjkyNzc0XCJcbiAgICAgKiB9XG4gICAgICovXG4gICAgY29uc3Qgc2NwUGFydHMgPSBkZWNvZGVkLnNjcC5zcGxpdCgnICcpO1xuICAgIGlmIChzY3BQYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgSW52YWxpZEp3dEVycm9yO1xuICAgIH1cbiAgICAvKlxuICAgICAqIGV4YW1wbGUgc2NwUGFydHM6XG4gICAgICogW1wiQWN0aW9ucy5FeGFtcGxlU2NvcGVcIiwgXCJBY3Rpb25zLlJlc3VsdHM6Y2U3ZjU0YzctNjFjNy00YWFlLTg4N2YtMzBkYTQ3NWY1ZjFhOmNhMzk1MDg1LTA0MGEtNTI2Yi0yY2U4LWJkYzg1ZjY5Mjc3NFwiXVxuICAgICAqL1xuICAgIGZvciAoY29uc3Qgc2NvcGVzIG9mIHNjcFBhcnRzKSB7XG4gICAgICAgIGNvbnN0IHNjb3BlUGFydHMgPSBzY29wZXMuc3BsaXQoJzonKTtcbiAgICAgICAgaWYgKChzY29wZVBhcnRzID09PSBudWxsIHx8IHNjb3BlUGFydHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNjb3BlUGFydHNbMF0pICE9PSAnQWN0aW9ucy5SZXN1bHRzJykge1xuICAgICAgICAgICAgLy8gbm90IHRoZSBBY3Rpb25zLlJlc3VsdHMgc2NvcGVcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8qXG4gICAgICAgICAqIGV4YW1wbGUgc2NvcGVQYXJ0czpcbiAgICAgICAgICogW1wiQWN0aW9ucy5SZXN1bHRzXCIsIFwiY2U3ZjU0YzctNjFjNy00YWFlLTg4N2YtMzBkYTQ3NWY1ZjFhXCIsIFwiY2EzOTUwODUtMDQwYS01MjZiLTJjZTgtYmRjODVmNjkyNzc0XCJdXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoc2NvcGVQYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgICAgIC8vIG1pc3NpbmcgZXhwZWN0ZWQgbnVtYmVyIG9mIGNsYWltc1xuICAgICAgICAgICAgdGhyb3cgSW52YWxpZEp3dEVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlkcyA9IHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuQmFja2VuZElkOiBzY29wZVBhcnRzWzFdLFxuICAgICAgICAgICAgd29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQ6IHNjb3BlUGFydHNbMl1cbiAgICAgICAgfTtcbiAgICAgICAgY29yZS5kZWJ1ZyhgV29ya2Zsb3cgUnVuIEJhY2tlbmQgSUQ6ICR7aWRzLndvcmtmbG93UnVuQmFja2VuZElkfWApO1xuICAgICAgICBjb3JlLmRlYnVnKGBXb3JrZmxvdyBKb2IgUnVuIEJhY2tlbmQgSUQ6ICR7aWRzLndvcmtmbG93Sm9iUnVuQmFja2VuZElkfWApO1xuICAgICAgICByZXR1cm4gaWRzO1xuICAgIH1cbiAgICB0aHJvdyBJbnZhbGlkSnd0RXJyb3I7XG59XG5leHBvcnRzLmdldEJhY2tlbmRJZHNGcm9tVG9rZW4gPSBnZXRCYWNrZW5kSWRzRnJvbVRva2VuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3379\n')},5111:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.uploadZipToBlobStorage = void 0;\nconst storage_blob_1 = __webpack_require__(5234);\nconst config_1 = __webpack_require__(1020);\nconst core = __importStar(__webpack_require__(2225));\nconst crypto = __importStar(__webpack_require__(6113));\nconst stream = __importStar(__webpack_require__(2781));\nconst errors_1 = __webpack_require__(5666);\nfunction uploadZipToBlobStorage(authenticatedUploadURL, zipUploadStream) {\n return __awaiter(this, void 0, void 0, function* () {\n let uploadByteCount = 0;\n const maxConcurrency = (0, config_1.getConcurrency)();\n const bufferSize = (0, config_1.getUploadChunkSize)();\n const blobClient = new storage_blob_1.BlobClient(authenticatedUploadURL);\n const blockBlobClient = blobClient.getBlockBlobClient();\n core.debug(`Uploading artifact zip to blob storage with maxConcurrency: ${maxConcurrency}, bufferSize: ${bufferSize}`);\n const uploadCallback = (progress) => {\n core.info(`Uploaded bytes ${progress.loadedBytes}`);\n uploadByteCount = progress.loadedBytes;\n };\n const options = {\n blobHTTPHeaders: { blobContentType: \'zip\' },\n onProgress: uploadCallback\n };\n let sha256Hash = undefined;\n const uploadStream = new stream.PassThrough();\n const hashStream = crypto.createHash(\'sha256\');\n zipUploadStream.pipe(uploadStream); // This stream is used for the upload\n zipUploadStream.pipe(hashStream).setEncoding(\'hex\'); // This stream is used to compute a hash of the zip content that gets used. Integrity check\n core.info(\'Beginning upload of artifact content to blob storage\');\n try {\n yield blockBlobClient.uploadStream(uploadStream, bufferSize, maxConcurrency, options);\n }\n catch (error) {\n if (errors_1.NetworkError.isNetworkErrorCode(error === null || error === void 0 ? void 0 : error.code)) {\n throw new errors_1.NetworkError(error === null || error === void 0 ? void 0 : error.code);\n }\n throw error;\n }\n core.info(\'Finished uploading artifact content to blob storage!\');\n hashStream.end();\n sha256Hash = hashStream.read();\n core.info(`SHA256 hash of uploaded artifact zip is ${sha256Hash}`);\n if (uploadByteCount === 0) {\n core.warning(`No data was uploaded to blob storage. Reported upload byte count is 0.`);\n }\n return {\n uploadSize: uploadByteCount,\n sha256Hash\n };\n });\n}\nexports.uploadZipToBlobStorage = uploadZipToBlobStorage;\n//# sourceMappingURL=blob-upload.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTExMS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQ0FBb0M7QUFDbkQ7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsMENBQTBDLDRCQUE0QjtBQUN0RSxDQUFDO0FBQ0Q7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELDhCQUE4QjtBQUM5Qix1QkFBdUIsbUJBQU8sQ0FBQyxJQUFxQjtBQUNwRCxpQkFBaUIsbUJBQU8sQ0FBQyxJQUFrQjtBQUMzQywwQkFBMEIsbUJBQU8sQ0FBQyxJQUFlO0FBQ2pELDRCQUE0QixtQkFBTyxDQUFDLElBQVE7QUFDNUMsNEJBQTRCLG1CQUFPLENBQUMsSUFBUTtBQUM1QyxpQkFBaUIsbUJBQU8sQ0FBQyxJQUFrQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtGQUFrRixlQUFlLGdCQUFnQixXQUFXO0FBQzVIO0FBQ0Esd0NBQXdDLHFCQUFxQjtBQUM3RDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0Isd0JBQXdCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUMsNkRBQTZEO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZELFdBQVc7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSw4QkFBOEI7QUFDOUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9saWIvaW50ZXJuYWwvdXBsb2FkL2Jsb2ItdXBsb2FkLmpzP2QwODkiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy51cGxvYWRaaXBUb0Jsb2JTdG9yYWdlID0gdm9pZCAwO1xuY29uc3Qgc3RvcmFnZV9ibG9iXzEgPSByZXF1aXJlKFwiQGF6dXJlL3N0b3JhZ2UtYmxvYlwiKTtcbmNvbnN0IGNvbmZpZ18xID0gcmVxdWlyZShcIi4uL3NoYXJlZC9jb25maWdcIik7XG5jb25zdCBjb3JlID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJAYWN0aW9ucy9jb3JlXCIpKTtcbmNvbnN0IGNyeXB0byA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiY3J5cHRvXCIpKTtcbmNvbnN0IHN0cmVhbSA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwic3RyZWFtXCIpKTtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4uL3NoYXJlZC9lcnJvcnNcIik7XG5mdW5jdGlvbiB1cGxvYWRaaXBUb0Jsb2JTdG9yYWdlKGF1dGhlbnRpY2F0ZWRVcGxvYWRVUkwsIHppcFVwbG9hZFN0cmVhbSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCB1cGxvYWRCeXRlQ291bnQgPSAwO1xuICAgICAgICBjb25zdCBtYXhDb25jdXJyZW5jeSA9ICgwLCBjb25maWdfMS5nZXRDb25jdXJyZW5jeSkoKTtcbiAgICAgICAgY29uc3QgYnVmZmVyU2l6ZSA9ICgwLCBjb25maWdfMS5nZXRVcGxvYWRDaHVua1NpemUpKCk7XG4gICAgICAgIGNvbnN0IGJsb2JDbGllbnQgPSBuZXcgc3RvcmFnZV9ibG9iXzEuQmxvYkNsaWVudChhdXRoZW50aWNhdGVkVXBsb2FkVVJMKTtcbiAgICAgICAgY29uc3QgYmxvY2tCbG9iQ2xpZW50ID0gYmxvYkNsaWVudC5nZXRCbG9ja0Jsb2JDbGllbnQoKTtcbiAgICAgICAgY29yZS5kZWJ1ZyhgVXBsb2FkaW5nIGFydGlmYWN0IHppcCB0byBibG9iIHN0b3JhZ2Ugd2l0aCBtYXhDb25jdXJyZW5jeTogJHttYXhDb25jdXJyZW5jeX0sIGJ1ZmZlclNpemU6ICR7YnVmZmVyU2l6ZX1gKTtcbiAgICAgICAgY29uc3QgdXBsb2FkQ2FsbGJhY2sgPSAocHJvZ3Jlc3MpID0+IHtcbiAgICAgICAgICAgIGNvcmUuaW5mbyhgVXBsb2FkZWQgYnl0ZXMgJHtwcm9ncmVzcy5sb2FkZWRCeXRlc31gKTtcbiAgICAgICAgICAgIHVwbG9hZEJ5dGVDb3VudCA9IHByb2dyZXNzLmxvYWRlZEJ5dGVzO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgYmxvYkhUVFBIZWFkZXJzOiB7IGJsb2JDb250ZW50VHlwZTogJ3ppcCcgfSxcbiAgICAgICAgICAgIG9uUHJvZ3Jlc3M6IHVwbG9hZENhbGxiYWNrXG4gICAgICAgIH07XG4gICAgICAgIGxldCBzaGEyNTZIYXNoID0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB1cGxvYWRTdHJlYW0gPSBuZXcgc3RyZWFtLlBhc3NUaHJvdWdoKCk7XG4gICAgICAgIGNvbnN0IGhhc2hTdHJlYW0gPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG4gICAgICAgIHppcFVwbG9hZFN0cmVhbS5waXBlKHVwbG9hZFN0cmVhbSk7IC8vIFRoaXMgc3RyZWFtIGlzIHVzZWQgZm9yIHRoZSB1cGxvYWRcbiAgICAgICAgemlwVXBsb2FkU3RyZWFtLnBpcGUoaGFzaFN0cmVhbSkuc2V0RW5jb2RpbmcoJ2hleCcpOyAvLyBUaGlzIHN0cmVhbSBpcyB1c2VkIHRvIGNvbXB1dGUgYSBoYXNoIG9mIHRoZSB6aXAgY29udGVudCB0aGF0IGdldHMgdXNlZC4gSW50ZWdyaXR5IGNoZWNrXG4gICAgICAgIGNvcmUuaW5mbygnQmVnaW5uaW5nIHVwbG9hZCBvZiBhcnRpZmFjdCBjb250ZW50IHRvIGJsb2Igc3RvcmFnZScpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgeWllbGQgYmxvY2tCbG9iQ2xpZW50LnVwbG9hZFN0cmVhbSh1cGxvYWRTdHJlYW0sIGJ1ZmZlclNpemUsIG1heENvbmN1cnJlbmN5LCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcnNfMS5OZXR3b3JrRXJyb3IuaXNOZXR3b3JrRXJyb3JDb2RlKGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvci5jb2RlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5OZXR3b3JrRXJyb3IoZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yLmNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29yZS5pbmZvKCdGaW5pc2hlZCB1cGxvYWRpbmcgYXJ0aWZhY3QgY29udGVudCB0byBibG9iIHN0b3JhZ2UhJyk7XG4gICAgICAgIGhhc2hTdHJlYW0uZW5kKCk7XG4gICAgICAgIHNoYTI1Nkhhc2ggPSBoYXNoU3RyZWFtLnJlYWQoKTtcbiAgICAgICAgY29yZS5pbmZvKGBTSEEyNTYgaGFzaCBvZiB1cGxvYWRlZCBhcnRpZmFjdCB6aXAgaXMgJHtzaGEyNTZIYXNofWApO1xuICAgICAgICBpZiAodXBsb2FkQnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBjb3JlLndhcm5pbmcoYE5vIGRhdGEgd2FzIHVwbG9hZGVkIHRvIGJsb2Igc3RvcmFnZS4gUmVwb3J0ZWQgdXBsb2FkIGJ5dGUgY291bnQgaXMgMC5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXBsb2FkU2l6ZTogdXBsb2FkQnl0ZUNvdW50LFxuICAgICAgICAgICAgc2hhMjU2SGFzaFxuICAgICAgICB9O1xuICAgIH0pO1xufVxuZXhwb3J0cy51cGxvYWRaaXBUb0Jsb2JTdG9yYWdlID0gdXBsb2FkWmlwVG9CbG9iU3RvcmFnZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJsb2ItdXBsb2FkLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5111\n')},8647:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.validateFilePath = exports.validateArtifactName = void 0;\nconst core_1 = __webpack_require__(2225);\n/**\n * Invalid characters that cannot be in the artifact name or an uploaded file. Will be rejected\n * from the server if attempted to be sent over. These characters are not allowed due to limitations with certain\n * file systems such as NTFS. To maintain platform-agnostic behavior, all characters that are not supported by an\n * individual filesystem/platform will not be supported on all fileSystems/platforms\n *\n * FilePaths can include characters such as \\ and / which are not permitted in the artifact name alone\n */\nconst invalidArtifactFilePathCharacters = new Map([\n ['\"', ' Double quote \"'],\n [':', ' Colon :'],\n ['<', ' Less than <'],\n ['>', ' Greater than >'],\n ['|', ' Vertical bar |'],\n ['*', ' Asterisk *'],\n ['?', ' Question mark ?'],\n ['\\r', ' Carriage return \\\\r'],\n ['\\n', ' Line feed \\\\n']\n]);\nconst invalidArtifactNameCharacters = new Map([\n ...invalidArtifactFilePathCharacters,\n ['\\\\', ' Backslash \\\\'],\n ['/', ' Forward slash /']\n]);\n/**\n * Validates the name of the artifact to check to make sure there are no illegal characters\n */\nfunction validateArtifactName(name) {\n if (!name) {\n throw new Error(`Provided artifact name input during validation is empty`);\n }\n for (const [invalidCharacterKey, errorMessageForCharacter] of invalidArtifactNameCharacters) {\n if (name.includes(invalidCharacterKey)) {\n throw new Error(`The artifact name is not valid: ${name}. Contains the following character: ${errorMessageForCharacter}\n \nInvalid characters include: ${Array.from(invalidArtifactNameCharacters.values()).toString()}\n \nThese characters are not allowed in the artifact name due to limitations with certain file systems such as NTFS. To maintain file system agnostic behavior, these characters are intentionally not allowed to prevent potential problems with downloads on different file systems.`);\n }\n }\n (0, core_1.info)(`Artifact name is valid!`);\n}\nexports.validateArtifactName = validateArtifactName;\n/**\n * Validates file paths to check for any illegal characters that can cause problems on different file systems\n */\nfunction validateFilePath(path) {\n if (!path) {\n throw new Error(`Provided file path input during validation is empty`);\n }\n for (const [invalidCharacterKey, errorMessageForCharacter] of invalidArtifactFilePathCharacters) {\n if (path.includes(invalidCharacterKey)) {\n throw new Error(`The path for one of the files in artifact is not valid: ${path}. Contains the following character: ${errorMessageForCharacter}\n \nInvalid characters include: ${Array.from(invalidArtifactFilePathCharacters.values()).toString()}\n \nThe following characters are not allowed in files that are uploaded due to limitations with certain file systems such as NTFS. To maintain file system agnostic behavior, these characters are intentionally not allowed to prevent potential problems with downloads on different file systems.\n `);\n }\n }\n}\nexports.validateFilePath = validateFilePath;\n//# sourceMappingURL=path-and-artifact-name-validation.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODY0Ny5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCx3QkFBd0IsR0FBRyw0QkFBNEI7QUFDdkQsZUFBZSxtQkFBTyxDQUFDLElBQWU7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStELEtBQUssc0NBQXNDO0FBQzFHO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RkFBdUYsS0FBSyxzQ0FBc0M7QUFDbEk7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2ludGVybmFsL3VwbG9hZC9wYXRoLWFuZC1hcnRpZmFjdC1uYW1lLXZhbGlkYXRpb24uanM/MmNlYSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudmFsaWRhdGVGaWxlUGF0aCA9IGV4cG9ydHMudmFsaWRhdGVBcnRpZmFjdE5hbWUgPSB2b2lkIDA7XG5jb25zdCBjb3JlXzEgPSByZXF1aXJlKFwiQGFjdGlvbnMvY29yZVwiKTtcbi8qKlxuICogSW52YWxpZCBjaGFyYWN0ZXJzIHRoYXQgY2Fubm90IGJlIGluIHRoZSBhcnRpZmFjdCBuYW1lIG9yIGFuIHVwbG9hZGVkIGZpbGUuIFdpbGwgYmUgcmVqZWN0ZWRcbiAqIGZyb20gdGhlIHNlcnZlciBpZiBhdHRlbXB0ZWQgdG8gYmUgc2VudCBvdmVyLiBUaGVzZSBjaGFyYWN0ZXJzIGFyZSBub3QgYWxsb3dlZCBkdWUgdG8gbGltaXRhdGlvbnMgd2l0aCBjZXJ0YWluXG4gKiBmaWxlIHN5c3RlbXMgc3VjaCBhcyBOVEZTLiBUbyBtYWludGFpbiBwbGF0Zm9ybS1hZ25vc3RpYyBiZWhhdmlvciwgYWxsIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSBhblxuICogaW5kaXZpZHVhbCBmaWxlc3lzdGVtL3BsYXRmb3JtIHdpbGwgbm90IGJlIHN1cHBvcnRlZCBvbiBhbGwgZmlsZVN5c3RlbXMvcGxhdGZvcm1zXG4gKlxuICogRmlsZVBhdGhzIGNhbiBpbmNsdWRlIGNoYXJhY3RlcnMgc3VjaCBhcyBcXCBhbmQgLyB3aGljaCBhcmUgbm90IHBlcm1pdHRlZCBpbiB0aGUgYXJ0aWZhY3QgbmFtZSBhbG9uZVxuICovXG5jb25zdCBpbnZhbGlkQXJ0aWZhY3RGaWxlUGF0aENoYXJhY3RlcnMgPSBuZXcgTWFwKFtcbiAgICBbJ1wiJywgJyBEb3VibGUgcXVvdGUgXCInXSxcbiAgICBbJzonLCAnIENvbG9uIDonXSxcbiAgICBbJzwnLCAnIExlc3MgdGhhbiA8J10sXG4gICAgWyc+JywgJyBHcmVhdGVyIHRoYW4gPiddLFxuICAgIFsnfCcsICcgVmVydGljYWwgYmFyIHwnXSxcbiAgICBbJyonLCAnIEFzdGVyaXNrIConXSxcbiAgICBbJz8nLCAnIFF1ZXN0aW9uIG1hcmsgPyddLFxuICAgIFsnXFxyJywgJyBDYXJyaWFnZSByZXR1cm4gXFxcXHInXSxcbiAgICBbJ1xcbicsICcgTGluZSBmZWVkIFxcXFxuJ11cbl0pO1xuY29uc3QgaW52YWxpZEFydGlmYWN0TmFtZUNoYXJhY3RlcnMgPSBuZXcgTWFwKFtcbiAgICAuLi5pbnZhbGlkQXJ0aWZhY3RGaWxlUGF0aENoYXJhY3RlcnMsXG4gICAgWydcXFxcJywgJyBCYWNrc2xhc2ggXFxcXCddLFxuICAgIFsnLycsICcgRm9yd2FyZCBzbGFzaCAvJ11cbl0pO1xuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIG5hbWUgb2YgdGhlIGFydGlmYWN0IHRvIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gaWxsZWdhbCBjaGFyYWN0ZXJzXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQXJ0aWZhY3ROYW1lKG5hbWUpIHtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm92aWRlZCBhcnRpZmFjdCBuYW1lIGlucHV0IGR1cmluZyB2YWxpZGF0aW9uIGlzIGVtcHR5YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2ludmFsaWRDaGFyYWN0ZXJLZXksIGVycm9yTWVzc2FnZUZvckNoYXJhY3Rlcl0gb2YgaW52YWxpZEFydGlmYWN0TmFtZUNoYXJhY3RlcnMpIHtcbiAgICAgICAgaWYgKG5hbWUuaW5jbHVkZXMoaW52YWxpZENoYXJhY3RlcktleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGFydGlmYWN0IG5hbWUgaXMgbm90IHZhbGlkOiAke25hbWV9LiBDb250YWlucyB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcjogJHtlcnJvck1lc3NhZ2VGb3JDaGFyYWN0ZXJ9XG4gICAgICAgICAgXG5JbnZhbGlkIGNoYXJhY3RlcnMgaW5jbHVkZTogJHtBcnJheS5mcm9tKGludmFsaWRBcnRpZmFjdE5hbWVDaGFyYWN0ZXJzLnZhbHVlcygpKS50b1N0cmluZygpfVxuICAgICAgICAgIFxuVGhlc2UgY2hhcmFjdGVycyBhcmUgbm90IGFsbG93ZWQgaW4gdGhlIGFydGlmYWN0IG5hbWUgZHVlIHRvIGxpbWl0YXRpb25zIHdpdGggY2VydGFpbiBmaWxlIHN5c3RlbXMgc3VjaCBhcyBOVEZTLiBUbyBtYWludGFpbiBmaWxlIHN5c3RlbSBhZ25vc3RpYyBiZWhhdmlvciwgdGhlc2UgY2hhcmFjdGVycyBhcmUgaW50ZW50aW9uYWxseSBub3QgYWxsb3dlZCB0byBwcmV2ZW50IHBvdGVudGlhbCBwcm9ibGVtcyB3aXRoIGRvd25sb2FkcyBvbiBkaWZmZXJlbnQgZmlsZSBzeXN0ZW1zLmApO1xuICAgICAgICB9XG4gICAgfVxuICAgICgwLCBjb3JlXzEuaW5mbykoYEFydGlmYWN0IG5hbWUgaXMgdmFsaWQhYCk7XG59XG5leHBvcnRzLnZhbGlkYXRlQXJ0aWZhY3ROYW1lID0gdmFsaWRhdGVBcnRpZmFjdE5hbWU7XG4vKipcbiAqIFZhbGlkYXRlcyBmaWxlIHBhdGhzIHRvIGNoZWNrIGZvciBhbnkgaWxsZWdhbCBjaGFyYWN0ZXJzIHRoYXQgY2FuIGNhdXNlIHByb2JsZW1zIG9uIGRpZmZlcmVudCBmaWxlIHN5c3RlbXNcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVGaWxlUGF0aChwYXRoKSB7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvdmlkZWQgZmlsZSBwYXRoIGlucHV0IGR1cmluZyB2YWxpZGF0aW9uIGlzIGVtcHR5YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2ludmFsaWRDaGFyYWN0ZXJLZXksIGVycm9yTWVzc2FnZUZvckNoYXJhY3Rlcl0gb2YgaW52YWxpZEFydGlmYWN0RmlsZVBhdGhDaGFyYWN0ZXJzKSB7XG4gICAgICAgIGlmIChwYXRoLmluY2x1ZGVzKGludmFsaWRDaGFyYWN0ZXJLZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwYXRoIGZvciBvbmUgb2YgdGhlIGZpbGVzIGluIGFydGlmYWN0IGlzIG5vdCB2YWxpZDogJHtwYXRofS4gQ29udGFpbnMgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXI6ICR7ZXJyb3JNZXNzYWdlRm9yQ2hhcmFjdGVyfVxuICAgICAgICAgIFxuSW52YWxpZCBjaGFyYWN0ZXJzIGluY2x1ZGU6ICR7QXJyYXkuZnJvbShpbnZhbGlkQXJ0aWZhY3RGaWxlUGF0aENoYXJhY3RlcnMudmFsdWVzKCkpLnRvU3RyaW5nKCl9XG4gICAgICAgICAgXG5UaGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgYXJlIG5vdCBhbGxvd2VkIGluIGZpbGVzIHRoYXQgYXJlIHVwbG9hZGVkIGR1ZSB0byBsaW1pdGF0aW9ucyB3aXRoIGNlcnRhaW4gZmlsZSBzeXN0ZW1zIHN1Y2ggYXMgTlRGUy4gVG8gbWFpbnRhaW4gZmlsZSBzeXN0ZW0gYWdub3N0aWMgYmVoYXZpb3IsIHRoZXNlIGNoYXJhY3RlcnMgYXJlIGludGVudGlvbmFsbHkgbm90IGFsbG93ZWQgdG8gcHJldmVudCBwb3RlbnRpYWwgcHJvYmxlbXMgd2l0aCBkb3dubG9hZHMgb24gZGlmZmVyZW50IGZpbGUgc3lzdGVtcy5cbiAgICAgICAgICBgKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMudmFsaWRhdGVGaWxlUGF0aCA9IHZhbGlkYXRlRmlsZVBhdGg7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXRoLWFuZC1hcnRpZmFjdC1uYW1lLXZhbGlkYXRpb24uanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8647\n")},9889:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.getExpiration = void 0;\nconst generated_1 = __webpack_require__(2330);\nconst core = __importStar(__webpack_require__(2225));\nfunction getExpiration(retentionDays) {\n if (!retentionDays) {\n return undefined;\n }\n const maxRetentionDays = getRetentionDays();\n if (maxRetentionDays && maxRetentionDays < retentionDays) {\n core.warning(`Retention days cannot be greater than the maximum allowed retention set within the repository. Using ${maxRetentionDays} instead.`);\n retentionDays = maxRetentionDays;\n }\n const expirationDate = new Date();\n expirationDate.setDate(expirationDate.getDate() + retentionDays);\n return generated_1.Timestamp.fromDate(expirationDate);\n}\nexports.getExpiration = getExpiration;\nfunction getRetentionDays() {\n const retentionDays = process.env[\'GITHUB_RETENTION_DAYS\'];\n if (!retentionDays) {\n return undefined;\n }\n const days = parseInt(retentionDays);\n if (isNaN(days)) {\n return undefined;\n }\n return days;\n}\n//# sourceMappingURL=retention.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTg4OS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQ0FBb0M7QUFDbkQ7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsMENBQTBDLDRCQUE0QjtBQUN0RSxDQUFDO0FBQ0Q7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QscUJBQXFCO0FBQ3JCLG9CQUFvQixtQkFBTyxDQUFDLElBQWlCO0FBQzdDLDBCQUEwQixtQkFBTyxDQUFDLElBQWU7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkhBQTZILGtCQUFrQjtBQUMvSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2ludGVybmFsL3VwbG9hZC9yZXRlbnRpb24uanM/OTNlNCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRFeHBpcmF0aW9uID0gdm9pZCAwO1xuY29uc3QgZ2VuZXJhdGVkXzEgPSByZXF1aXJlKFwiLi4vLi4vZ2VuZXJhdGVkXCIpO1xuY29uc3QgY29yZSA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvY29yZVwiKSk7XG5mdW5jdGlvbiBnZXRFeHBpcmF0aW9uKHJldGVudGlvbkRheXMpIHtcbiAgICBpZiAoIXJldGVudGlvbkRheXMpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgbWF4UmV0ZW50aW9uRGF5cyA9IGdldFJldGVudGlvbkRheXMoKTtcbiAgICBpZiAobWF4UmV0ZW50aW9uRGF5cyAmJiBtYXhSZXRlbnRpb25EYXlzIDwgcmV0ZW50aW9uRGF5cykge1xuICAgICAgICBjb3JlLndhcm5pbmcoYFJldGVudGlvbiBkYXlzIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gYWxsb3dlZCByZXRlbnRpb24gc2V0IHdpdGhpbiB0aGUgcmVwb3NpdG9yeS4gVXNpbmcgJHttYXhSZXRlbnRpb25EYXlzfSBpbnN0ZWFkLmApO1xuICAgICAgICByZXRlbnRpb25EYXlzID0gbWF4UmV0ZW50aW9uRGF5cztcbiAgICB9XG4gICAgY29uc3QgZXhwaXJhdGlvbkRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIGV4cGlyYXRpb25EYXRlLnNldERhdGUoZXhwaXJhdGlvbkRhdGUuZ2V0RGF0ZSgpICsgcmV0ZW50aW9uRGF5cyk7XG4gICAgcmV0dXJuIGdlbmVyYXRlZF8xLlRpbWVzdGFtcC5mcm9tRGF0ZShleHBpcmF0aW9uRGF0ZSk7XG59XG5leHBvcnRzLmdldEV4cGlyYXRpb24gPSBnZXRFeHBpcmF0aW9uO1xuZnVuY3Rpb24gZ2V0UmV0ZW50aW9uRGF5cygpIHtcbiAgICBjb25zdCByZXRlbnRpb25EYXlzID0gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9SRVRFTlRJT05fREFZUyddO1xuICAgIGlmICghcmV0ZW50aW9uRGF5cykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBkYXlzID0gcGFyc2VJbnQocmV0ZW50aW9uRGF5cyk7XG4gICAgaWYgKGlzTmFOKGRheXMpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBkYXlzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmV0ZW50aW9uLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9889\n')},1101:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.uploadArtifact = void 0;\nconst core = __importStar(__webpack_require__(2225));\nconst retention_1 = __webpack_require__(9889);\nconst path_and_artifact_name_validation_1 = __webpack_require__(8647);\nconst artifact_twirp_client_1 = __webpack_require__(2445);\nconst upload_zip_specification_1 = __webpack_require__(6397);\nconst util_1 = __webpack_require__(3379);\nconst blob_upload_1 = __webpack_require__(5111);\nconst zip_1 = __webpack_require__(7329);\nconst generated_1 = __webpack_require__(2330);\nconst errors_1 = __webpack_require__(5666);\nfunction uploadArtifact(name, files, rootDirectory, options) {\n return __awaiter(this, void 0, void 0, function* () {\n (0, path_and_artifact_name_validation_1.validateArtifactName)(name);\n (0, upload_zip_specification_1.validateRootDirectory)(rootDirectory);\n const zipSpecification = (0, upload_zip_specification_1.getUploadZipSpecification)(files, rootDirectory);\n if (zipSpecification.length === 0) {\n throw new errors_1.FilesNotFoundError(zipSpecification.flatMap(s => (s.sourcePath ? [s.sourcePath] : [])));\n }\n // get the IDs needed for the artifact creation\n const backendIds = (0, util_1.getBackendIdsFromToken)();\n // create the artifact client\n const artifactClient = (0, artifact_twirp_client_1.internalArtifactTwirpClient)();\n // create the artifact\n const createArtifactReq = {\n workflowRunBackendId: backendIds.workflowRunBackendId,\n workflowJobRunBackendId: backendIds.workflowJobRunBackendId,\n name,\n version: 4\n };\n // if there is a retention period, add it to the request\n const expiresAt = (0, retention_1.getExpiration)(options === null || options === void 0 ? void 0 : options.retentionDays);\n if (expiresAt) {\n createArtifactReq.expiresAt = expiresAt;\n }\n const createArtifactResp = yield artifactClient.CreateArtifact(createArtifactReq);\n if (!createArtifactResp.ok) {\n throw new errors_1.InvalidResponseError(\'CreateArtifact: response from backend was not ok\');\n }\n const zipUploadStream = yield (0, zip_1.createZipUploadStream)(zipSpecification, options === null || options === void 0 ? void 0 : options.compressionLevel);\n // Upload zip to blob storage\n const uploadResult = yield (0, blob_upload_1.uploadZipToBlobStorage)(createArtifactResp.signedUploadUrl, zipUploadStream);\n // finalize the artifact\n const finalizeArtifactReq = {\n workflowRunBackendId: backendIds.workflowRunBackendId,\n workflowJobRunBackendId: backendIds.workflowJobRunBackendId,\n name,\n size: uploadResult.uploadSize ? uploadResult.uploadSize.toString() : \'0\'\n };\n if (uploadResult.sha256Hash) {\n finalizeArtifactReq.hash = generated_1.StringValue.create({\n value: `sha256:${uploadResult.sha256Hash}`\n });\n }\n core.info(`Finalizing artifact upload`);\n const finalizeArtifactResp = yield artifactClient.FinalizeArtifact(finalizeArtifactReq);\n if (!finalizeArtifactResp.ok) {\n throw new errors_1.InvalidResponseError(\'FinalizeArtifact: response from backend was not ok\');\n }\n const artifactId = BigInt(finalizeArtifactResp.artifactId);\n core.info(`Artifact ${name}.zip successfully finalized. Artifact ID ${artifactId}`);\n return {\n size: uploadResult.uploadSize,\n id: Number(artifactId)\n };\n });\n}\nexports.uploadArtifact = uploadArtifact;\n//# sourceMappingURL=upload-artifact.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEwMS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQ0FBb0M7QUFDbkQ7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsMENBQTBDLDRCQUE0QjtBQUN0RSxDQUFDO0FBQ0Q7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHNCQUFzQjtBQUN0QiwwQkFBMEIsbUJBQU8sQ0FBQyxJQUFlO0FBQ2pELG9CQUFvQixtQkFBTyxDQUFDLElBQWE7QUFDekMsNENBQTRDLG1CQUFPLENBQUMsSUFBcUM7QUFDekYsZ0NBQWdDLG1CQUFPLENBQUMsSUFBaUM7QUFDekUsbUNBQW1DLG1CQUFPLENBQUMsSUFBNEI7QUFDdkUsZUFBZSxtQkFBTyxDQUFDLElBQWdCO0FBQ3ZDLHNCQUFzQixtQkFBTyxDQUFDLElBQWU7QUFDN0MsY0FBYyxtQkFBTyxDQUFDLElBQU87QUFDN0Isb0JBQW9CLG1CQUFPLENBQUMsSUFBaUI7QUFDN0MsaUJBQWlCLG1CQUFPLENBQUMsSUFBa0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsd0JBQXdCO0FBQ3pELGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixLQUFLLDJDQUEyQyxXQUFXO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0Esc0JBQXNCO0FBQ3RCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2ludGVybmFsL3VwbG9hZC91cGxvYWQtYXJ0aWZhY3QuanM/YWEyNSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnVwbG9hZEFydGlmYWN0ID0gdm9pZCAwO1xuY29uc3QgY29yZSA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvY29yZVwiKSk7XG5jb25zdCByZXRlbnRpb25fMSA9IHJlcXVpcmUoXCIuL3JldGVudGlvblwiKTtcbmNvbnN0IHBhdGhfYW5kX2FydGlmYWN0X25hbWVfdmFsaWRhdGlvbl8xID0gcmVxdWlyZShcIi4vcGF0aC1hbmQtYXJ0aWZhY3QtbmFtZS12YWxpZGF0aW9uXCIpO1xuY29uc3QgYXJ0aWZhY3RfdHdpcnBfY2xpZW50XzEgPSByZXF1aXJlKFwiLi4vc2hhcmVkL2FydGlmYWN0LXR3aXJwLWNsaWVudFwiKTtcbmNvbnN0IHVwbG9hZF96aXBfc3BlY2lmaWNhdGlvbl8xID0gcmVxdWlyZShcIi4vdXBsb2FkLXppcC1zcGVjaWZpY2F0aW9uXCIpO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4uL3NoYXJlZC91dGlsXCIpO1xuY29uc3QgYmxvYl91cGxvYWRfMSA9IHJlcXVpcmUoXCIuL2Jsb2ItdXBsb2FkXCIpO1xuY29uc3QgemlwXzEgPSByZXF1aXJlKFwiLi96aXBcIik7XG5jb25zdCBnZW5lcmF0ZWRfMSA9IHJlcXVpcmUoXCIuLi8uLi9nZW5lcmF0ZWRcIik7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvZXJyb3JzXCIpO1xuZnVuY3Rpb24gdXBsb2FkQXJ0aWZhY3QobmFtZSwgZmlsZXMsIHJvb3REaXJlY3RvcnksIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAoMCwgcGF0aF9hbmRfYXJ0aWZhY3RfbmFtZV92YWxpZGF0aW9uXzEudmFsaWRhdGVBcnRpZmFjdE5hbWUpKG5hbWUpO1xuICAgICAgICAoMCwgdXBsb2FkX3ppcF9zcGVjaWZpY2F0aW9uXzEudmFsaWRhdGVSb290RGlyZWN0b3J5KShyb290RGlyZWN0b3J5KTtcbiAgICAgICAgY29uc3QgemlwU3BlY2lmaWNhdGlvbiA9ICgwLCB1cGxvYWRfemlwX3NwZWNpZmljYXRpb25fMS5nZXRVcGxvYWRaaXBTcGVjaWZpY2F0aW9uKShmaWxlcywgcm9vdERpcmVjdG9yeSk7XG4gICAgICAgIGlmICh6aXBTcGVjaWZpY2F0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkZpbGVzTm90Rm91bmRFcnJvcih6aXBTcGVjaWZpY2F0aW9uLmZsYXRNYXAocyA9PiAocy5zb3VyY2VQYXRoID8gW3Muc291cmNlUGF0aF0gOiBbXSkpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBnZXQgdGhlIElEcyBuZWVkZWQgZm9yIHRoZSBhcnRpZmFjdCBjcmVhdGlvblxuICAgICAgICBjb25zdCBiYWNrZW5kSWRzID0gKDAsIHV0aWxfMS5nZXRCYWNrZW5kSWRzRnJvbVRva2VuKSgpO1xuICAgICAgICAvLyBjcmVhdGUgdGhlIGFydGlmYWN0IGNsaWVudFxuICAgICAgICBjb25zdCBhcnRpZmFjdENsaWVudCA9ICgwLCBhcnRpZmFjdF90d2lycF9jbGllbnRfMS5pbnRlcm5hbEFydGlmYWN0VHdpcnBDbGllbnQpKCk7XG4gICAgICAgIC8vIGNyZWF0ZSB0aGUgYXJ0aWZhY3RcbiAgICAgICAgY29uc3QgY3JlYXRlQXJ0aWZhY3RSZXEgPSB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bkJhY2tlbmRJZDogYmFja2VuZElkcy53b3JrZmxvd1J1bkJhY2tlbmRJZCxcbiAgICAgICAgICAgIHdvcmtmbG93Sm9iUnVuQmFja2VuZElkOiBiYWNrZW5kSWRzLndvcmtmbG93Sm9iUnVuQmFja2VuZElkLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHZlcnNpb246IDRcbiAgICAgICAgfTtcbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSByZXRlbnRpb24gcGVyaW9kLCBhZGQgaXQgdG8gdGhlIHJlcXVlc3RcbiAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gKDAsIHJldGVudGlvbl8xLmdldEV4cGlyYXRpb24pKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5yZXRlbnRpb25EYXlzKTtcbiAgICAgICAgaWYgKGV4cGlyZXNBdCkge1xuICAgICAgICAgICAgY3JlYXRlQXJ0aWZhY3RSZXEuZXhwaXJlc0F0ID0gZXhwaXJlc0F0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNyZWF0ZUFydGlmYWN0UmVzcCA9IHlpZWxkIGFydGlmYWN0Q2xpZW50LkNyZWF0ZUFydGlmYWN0KGNyZWF0ZUFydGlmYWN0UmVxKTtcbiAgICAgICAgaWYgKCFjcmVhdGVBcnRpZmFjdFJlc3Aub2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5JbnZhbGlkUmVzcG9uc2VFcnJvcignQ3JlYXRlQXJ0aWZhY3Q6IHJlc3BvbnNlIGZyb20gYmFja2VuZCB3YXMgbm90IG9rJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgemlwVXBsb2FkU3RyZWFtID0geWllbGQgKDAsIHppcF8xLmNyZWF0ZVppcFVwbG9hZFN0cmVhbSkoemlwU3BlY2lmaWNhdGlvbiwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNvbXByZXNzaW9uTGV2ZWwpO1xuICAgICAgICAvLyBVcGxvYWQgemlwIHRvIGJsb2Igc3RvcmFnZVxuICAgICAgICBjb25zdCB1cGxvYWRSZXN1bHQgPSB5aWVsZCAoMCwgYmxvYl91cGxvYWRfMS51cGxvYWRaaXBUb0Jsb2JTdG9yYWdlKShjcmVhdGVBcnRpZmFjdFJlc3Auc2lnbmVkVXBsb2FkVXJsLCB6aXBVcGxvYWRTdHJlYW0pO1xuICAgICAgICAvLyBmaW5hbGl6ZSB0aGUgYXJ0aWZhY3RcbiAgICAgICAgY29uc3QgZmluYWxpemVBcnRpZmFjdFJlcSA9IHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuQmFja2VuZElkOiBiYWNrZW5kSWRzLndvcmtmbG93UnVuQmFja2VuZElkLFxuICAgICAgICAgICAgd29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQ6IGJhY2tlbmRJZHMud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgc2l6ZTogdXBsb2FkUmVzdWx0LnVwbG9hZFNpemUgPyB1cGxvYWRSZXN1bHQudXBsb2FkU2l6ZS50b1N0cmluZygpIDogJzAnXG4gICAgICAgIH07XG4gICAgICAgIGlmICh1cGxvYWRSZXN1bHQuc2hhMjU2SGFzaCkge1xuICAgICAgICAgICAgZmluYWxpemVBcnRpZmFjdFJlcS5oYXNoID0gZ2VuZXJhdGVkXzEuU3RyaW5nVmFsdWUuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogYHNoYTI1Njoke3VwbG9hZFJlc3VsdC5zaGEyNTZIYXNofWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvcmUuaW5mbyhgRmluYWxpemluZyBhcnRpZmFjdCB1cGxvYWRgKTtcbiAgICAgICAgY29uc3QgZmluYWxpemVBcnRpZmFjdFJlc3AgPSB5aWVsZCBhcnRpZmFjdENsaWVudC5GaW5hbGl6ZUFydGlmYWN0KGZpbmFsaXplQXJ0aWZhY3RSZXEpO1xuICAgICAgICBpZiAoIWZpbmFsaXplQXJ0aWZhY3RSZXNwLm9rKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzXzEuSW52YWxpZFJlc3BvbnNlRXJyb3IoJ0ZpbmFsaXplQXJ0aWZhY3Q6IHJlc3BvbnNlIGZyb20gYmFja2VuZCB3YXMgbm90IG9rJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJ0aWZhY3RJZCA9IEJpZ0ludChmaW5hbGl6ZUFydGlmYWN0UmVzcC5hcnRpZmFjdElkKTtcbiAgICAgICAgY29yZS5pbmZvKGBBcnRpZmFjdCAke25hbWV9LnppcCBzdWNjZXNzZnVsbHkgZmluYWxpemVkLiBBcnRpZmFjdCBJRCAke2FydGlmYWN0SWR9YCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzaXplOiB1cGxvYWRSZXN1bHQudXBsb2FkU2l6ZSxcbiAgICAgICAgICAgIGlkOiBOdW1iZXIoYXJ0aWZhY3RJZClcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cbmV4cG9ydHMudXBsb2FkQXJ0aWZhY3QgPSB1cGxvYWRBcnRpZmFjdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVwbG9hZC1hcnRpZmFjdC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1101\n')},6397:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.getUploadZipSpecification = exports.validateRootDirectory = void 0;\nconst fs = __importStar(__webpack_require__(7147));\nconst core_1 = __webpack_require__(2225);\nconst path_1 = __webpack_require__(1017);\nconst path_and_artifact_name_validation_1 = __webpack_require__(8647);\n/**\n * Checks if a root directory exists and is valid\n * @param rootDirectory an absolute root directory path common to all input files that that will be trimmed from the final zip structure\n */\nfunction validateRootDirectory(rootDirectory) {\n if (!fs.existsSync(rootDirectory)) {\n throw new Error(`The provided rootDirectory ${rootDirectory} does not exist`);\n }\n if (!fs.statSync(rootDirectory).isDirectory()) {\n throw new Error(`The provided rootDirectory ${rootDirectory} is not a valid directory`);\n }\n (0, core_1.info)(`Root directory input is valid!`);\n}\nexports.validateRootDirectory = validateRootDirectory;\n/**\n * Creates a specification that describes how a zip file will be created for a set of input files\n * @param filesToZip a list of file that should be included in the zip\n * @param rootDirectory an absolute root directory path common to all input files that that will be trimmed from the final zip structure\n */\nfunction getUploadZipSpecification(filesToZip, rootDirectory) {\n const specification = [];\n // Normalize and resolve, this allows for either absolute or relative paths to be used\n rootDirectory = (0, path_1.normalize)(rootDirectory);\n rootDirectory = (0, path_1.resolve)(rootDirectory);\n /*\n Example\n \n Input:\n rootDirectory: '/home/user/files/plz-upload'\n artifactFiles: [\n '/home/user/files/plz-upload/file1.txt',\n '/home/user/files/plz-upload/file2.txt',\n '/home/user/files/plz-upload/dir/file3.txt'\n ]\n \n Output:\n specifications: [\n ['/home/user/files/plz-upload/file1.txt', '/file1.txt'],\n ['/home/user/files/plz-upload/file1.txt', '/file2.txt'],\n ['/home/user/files/plz-upload/file1.txt', '/dir/file3.txt']\n ]\n \n The final zip that is later uploaded will look like this:\n \n my-artifact.zip\n - file.txt\n - file2.txt\n - dir/\n - file3.txt\n */\n for (let file of filesToZip) {\n if (!fs.existsSync(file)) {\n throw new Error(`File ${file} does not exist`);\n }\n if (!fs.statSync(file).isDirectory()) {\n // Normalize and resolve, this allows for either absolute or relative paths to be used\n file = (0, path_1.normalize)(file);\n file = (0, path_1.resolve)(file);\n if (!file.startsWith(rootDirectory)) {\n throw new Error(`The rootDirectory: ${rootDirectory} is not a parent directory of the file: ${file}`);\n }\n // Check for forbidden characters in file paths that may cause ambiguous behavior if downloaded on different file systems\n const uploadPath = file.replace(rootDirectory, '');\n (0, path_and_artifact_name_validation_1.validateFilePath)(uploadPath);\n specification.push({\n sourcePath: file,\n destinationPath: uploadPath\n });\n }\n else {\n // Empty directory\n const directoryPath = file.replace(rootDirectory, '');\n (0, path_and_artifact_name_validation_1.validateFilePath)(directoryPath);\n specification.push({\n sourcePath: null,\n destinationPath: directoryPath\n });\n }\n }\n return specification;\n}\nexports.getUploadZipSpecification = getUploadZipSpecification;\n//# sourceMappingURL=upload-zip-specification.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjM5Ny5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQ0FBb0M7QUFDbkQ7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsMENBQTBDLDRCQUE0QjtBQUN0RSxDQUFDO0FBQ0Q7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsaUNBQWlDLEdBQUcsNkJBQTZCO0FBQ2pFLHdCQUF3QixtQkFBTyxDQUFDLElBQUk7QUFDcEMsZUFBZSxtQkFBTyxDQUFDLElBQWU7QUFDdEMsZUFBZSxtQkFBTyxDQUFDLElBQU07QUFDN0IsNENBQTRDLG1CQUFPLENBQUMsSUFBcUM7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELGVBQWU7QUFDckU7QUFDQTtBQUNBLHNEQUFzRCxlQUFlO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLE1BQU07QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELGVBQWUseUNBQXlDLEtBQUs7QUFDbkg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9pbnRlcm5hbC91cGxvYWQvdXBsb2FkLXppcC1zcGVjaWZpY2F0aW9uLmpzP2MyMjciXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0VXBsb2FkWmlwU3BlY2lmaWNhdGlvbiA9IGV4cG9ydHMudmFsaWRhdGVSb290RGlyZWN0b3J5ID0gdm9pZCAwO1xuY29uc3QgZnMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImZzXCIpKTtcbmNvbnN0IGNvcmVfMSA9IHJlcXVpcmUoXCJAYWN0aW9ucy9jb3JlXCIpO1xuY29uc3QgcGF0aF8xID0gcmVxdWlyZShcInBhdGhcIik7XG5jb25zdCBwYXRoX2FuZF9hcnRpZmFjdF9uYW1lX3ZhbGlkYXRpb25fMSA9IHJlcXVpcmUoXCIuL3BhdGgtYW5kLWFydGlmYWN0LW5hbWUtdmFsaWRhdGlvblwiKTtcbi8qKlxuICogQ2hlY2tzIGlmIGEgcm9vdCBkaXJlY3RvcnkgZXhpc3RzIGFuZCBpcyB2YWxpZFxuICogQHBhcmFtIHJvb3REaXJlY3RvcnkgYW4gYWJzb2x1dGUgcm9vdCBkaXJlY3RvcnkgcGF0aCBjb21tb24gdG8gYWxsIGlucHV0IGZpbGVzIHRoYXQgdGhhdCB3aWxsIGJlIHRyaW1tZWQgZnJvbSB0aGUgZmluYWwgemlwIHN0cnVjdHVyZVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVJvb3REaXJlY3Rvcnkocm9vdERpcmVjdG9yeSkge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhyb290RGlyZWN0b3J5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm92aWRlZCByb290RGlyZWN0b3J5ICR7cm9vdERpcmVjdG9yeX0gZG9lcyBub3QgZXhpc3RgKTtcbiAgICB9XG4gICAgaWYgKCFmcy5zdGF0U3luYyhyb290RGlyZWN0b3J5KS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHByb3ZpZGVkIHJvb3REaXJlY3RvcnkgJHtyb290RGlyZWN0b3J5fSBpcyBub3QgYSB2YWxpZCBkaXJlY3RvcnlgKTtcbiAgICB9XG4gICAgKDAsIGNvcmVfMS5pbmZvKShgUm9vdCBkaXJlY3RvcnkgaW5wdXQgaXMgdmFsaWQhYCk7XG59XG5leHBvcnRzLnZhbGlkYXRlUm9vdERpcmVjdG9yeSA9IHZhbGlkYXRlUm9vdERpcmVjdG9yeTtcbi8qKlxuICogQ3JlYXRlcyBhIHNwZWNpZmljYXRpb24gdGhhdCBkZXNjcmliZXMgaG93IGEgemlwIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGZvciBhIHNldCBvZiBpbnB1dCBmaWxlc1xuICogQHBhcmFtIGZpbGVzVG9aaXAgYSBsaXN0IG9mIGZpbGUgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHppcFxuICogQHBhcmFtIHJvb3REaXJlY3RvcnkgYW4gYWJzb2x1dGUgcm9vdCBkaXJlY3RvcnkgcGF0aCBjb21tb24gdG8gYWxsIGlucHV0IGZpbGVzIHRoYXQgdGhhdCB3aWxsIGJlIHRyaW1tZWQgZnJvbSB0aGUgZmluYWwgemlwIHN0cnVjdHVyZVxuICovXG5mdW5jdGlvbiBnZXRVcGxvYWRaaXBTcGVjaWZpY2F0aW9uKGZpbGVzVG9aaXAsIHJvb3REaXJlY3RvcnkpIHtcbiAgICBjb25zdCBzcGVjaWZpY2F0aW9uID0gW107XG4gICAgLy8gTm9ybWFsaXplIGFuZCByZXNvbHZlLCB0aGlzIGFsbG93cyBmb3IgZWl0aGVyIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHVzZWRcbiAgICByb290RGlyZWN0b3J5ID0gKDAsIHBhdGhfMS5ub3JtYWxpemUpKHJvb3REaXJlY3RvcnkpO1xuICAgIHJvb3REaXJlY3RvcnkgPSAoMCwgcGF0aF8xLnJlc29sdmUpKHJvb3REaXJlY3RvcnkpO1xuICAgIC8qXG4gICAgICAgRXhhbXBsZVxuICAgICAgIFxuICAgICAgIElucHV0OlxuICAgICAgICAgcm9vdERpcmVjdG9yeTogJy9ob21lL3VzZXIvZmlsZXMvcGx6LXVwbG9hZCdcbiAgICAgICAgIGFydGlmYWN0RmlsZXM6IFtcbiAgICAgICAgICAgJy9ob21lL3VzZXIvZmlsZXMvcGx6LXVwbG9hZC9maWxlMS50eHQnLFxuICAgICAgICAgICAnL2hvbWUvdXNlci9maWxlcy9wbHotdXBsb2FkL2ZpbGUyLnR4dCcsXG4gICAgICAgICAgICcvaG9tZS91c2VyL2ZpbGVzL3Bsei11cGxvYWQvZGlyL2ZpbGUzLnR4dCdcbiAgICAgICAgIF1cbiAgICAgICBcbiAgICAgICBPdXRwdXQ6XG4gICAgICAgICBzcGVjaWZpY2F0aW9uczogW1xuICAgICAgICAgICBbJy9ob21lL3VzZXIvZmlsZXMvcGx6LXVwbG9hZC9maWxlMS50eHQnLCAnL2ZpbGUxLnR4dCddLFxuICAgICAgICAgICBbJy9ob21lL3VzZXIvZmlsZXMvcGx6LXVwbG9hZC9maWxlMS50eHQnLCAnL2ZpbGUyLnR4dCddLFxuICAgICAgICAgICBbJy9ob21lL3VzZXIvZmlsZXMvcGx6LXVwbG9hZC9maWxlMS50eHQnLCAnL2Rpci9maWxlMy50eHQnXVxuICAgICAgICAgXVxuICBcbiAgICAgICAgVGhlIGZpbmFsIHppcCB0aGF0IGlzIGxhdGVyIHVwbG9hZGVkIHdpbGwgbG9vayBsaWtlIHRoaXM6XG4gIFxuICAgICAgICBteS1hcnRpZmFjdC56aXBcbiAgICAgICAgICAtIGZpbGUudHh0XG4gICAgICAgICAgLSBmaWxlMi50eHRcbiAgICAgICAgICAtIGRpci9cbiAgICAgICAgICAgIC0gZmlsZTMudHh0XG4gICAgKi9cbiAgICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzVG9aaXApIHtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgJHtmaWxlfSBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZnMuc3RhdFN5bmMoZmlsZSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgLy8gTm9ybWFsaXplIGFuZCByZXNvbHZlLCB0aGlzIGFsbG93cyBmb3IgZWl0aGVyIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHVzZWRcbiAgICAgICAgICAgIGZpbGUgPSAoMCwgcGF0aF8xLm5vcm1hbGl6ZSkoZmlsZSk7XG4gICAgICAgICAgICBmaWxlID0gKDAsIHBhdGhfMS5yZXNvbHZlKShmaWxlKTtcbiAgICAgICAgICAgIGlmICghZmlsZS5zdGFydHNXaXRoKHJvb3REaXJlY3RvcnkpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcm9vdERpcmVjdG9yeTogJHtyb290RGlyZWN0b3J5fSBpcyBub3QgYSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBmaWxlOiAke2ZpbGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgZm9yYmlkZGVuIGNoYXJhY3RlcnMgaW4gZmlsZSBwYXRocyB0aGF0IG1heSBjYXVzZSBhbWJpZ3VvdXMgYmVoYXZpb3IgaWYgZG93bmxvYWRlZCBvbiBkaWZmZXJlbnQgZmlsZSBzeXN0ZW1zXG4gICAgICAgICAgICBjb25zdCB1cGxvYWRQYXRoID0gZmlsZS5yZXBsYWNlKHJvb3REaXJlY3RvcnksICcnKTtcbiAgICAgICAgICAgICgwLCBwYXRoX2FuZF9hcnRpZmFjdF9uYW1lX3ZhbGlkYXRpb25fMS52YWxpZGF0ZUZpbGVQYXRoKSh1cGxvYWRQYXRoKTtcbiAgICAgICAgICAgIHNwZWNpZmljYXRpb24ucHVzaCh7XG4gICAgICAgICAgICAgICAgc291cmNlUGF0aDogZmlsZSxcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblBhdGg6IHVwbG9hZFBhdGhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gRW1wdHkgZGlyZWN0b3J5XG4gICAgICAgICAgICBjb25zdCBkaXJlY3RvcnlQYXRoID0gZmlsZS5yZXBsYWNlKHJvb3REaXJlY3RvcnksICcnKTtcbiAgICAgICAgICAgICgwLCBwYXRoX2FuZF9hcnRpZmFjdF9uYW1lX3ZhbGlkYXRpb25fMS52YWxpZGF0ZUZpbGVQYXRoKShkaXJlY3RvcnlQYXRoKTtcbiAgICAgICAgICAgIHNwZWNpZmljYXRpb24ucHVzaCh7XG4gICAgICAgICAgICAgICAgc291cmNlUGF0aDogbnVsbCxcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblBhdGg6IGRpcmVjdG9yeVBhdGhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzcGVjaWZpY2F0aW9uO1xufVxuZXhwb3J0cy5nZXRVcGxvYWRaaXBTcGVjaWZpY2F0aW9uID0gZ2V0VXBsb2FkWmlwU3BlY2lmaWNhdGlvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVwbG9hZC16aXAtc3BlY2lmaWNhdGlvbi5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6397\n")},7329:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.createZipUploadStream = exports.ZipUploadStream = exports.DEFAULT_COMPRESSION_LEVEL = void 0;\nconst stream = __importStar(__webpack_require__(2781));\nconst archiver = __importStar(__webpack_require__(3861));\nconst core = __importStar(__webpack_require__(2225));\nconst fs_1 = __webpack_require__(7147);\nconst config_1 = __webpack_require__(1020);\nexports.DEFAULT_COMPRESSION_LEVEL = 6;\n// Custom stream transformer so we can set the highWaterMark property\n// See https://github.com/nodejs/node/issues/8855\nclass ZipUploadStream extends stream.Transform {\n constructor(bufferSize) {\n super({\n highWaterMark: bufferSize\n });\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _transform(chunk, enc, cb) {\n cb(null, chunk);\n }\n}\nexports.ZipUploadStream = ZipUploadStream;\nfunction createZipUploadStream(uploadSpecification, compressionLevel = exports.DEFAULT_COMPRESSION_LEVEL) {\n return __awaiter(this, void 0, void 0, function* () {\n core.debug(`Creating Artifact archive with compressionLevel: ${compressionLevel}`);\n const zip = archiver.create('zip', {\n highWaterMark: (0, config_1.getUploadChunkSize)(),\n zlib: { level: compressionLevel }\n });\n // register callbacks for various events during the zip lifecycle\n zip.on('error', zipErrorCallback);\n zip.on('warning', zipWarningCallback);\n zip.on('finish', zipFinishCallback);\n zip.on('end', zipEndCallback);\n for (const file of uploadSpecification) {\n if (file.sourcePath !== null) {\n // Add a normal file to the zip\n zip.append((0, fs_1.createReadStream)(file.sourcePath), {\n name: file.destinationPath\n });\n }\n else {\n // Add a directory to the zip\n zip.append('', { name: file.destinationPath });\n }\n }\n const bufferSize = (0, config_1.getUploadChunkSize)();\n const zipUploadStream = new ZipUploadStream(bufferSize);\n core.debug(`Zip write high watermark value ${zipUploadStream.writableHighWaterMark}`);\n core.debug(`Zip read high watermark value ${zipUploadStream.readableHighWaterMark}`);\n zip.pipe(zipUploadStream);\n zip.finalize();\n return zipUploadStream;\n });\n}\nexports.createZipUploadStream = createZipUploadStream;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst zipErrorCallback = (error) => {\n core.error('An error has occurred while creating the zip file for upload');\n core.info(error);\n throw new Error('An error has occurred during zip creation for the artifact');\n};\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst zipWarningCallback = (error) => {\n if (error.code === 'ENOENT') {\n core.warning('ENOENT warning during artifact zip creation. No such file or directory');\n core.info(error);\n }\n else {\n core.warning(`A non-blocking warning has occurred during artifact zip creation: ${error.code}`);\n core.info(error);\n }\n};\nconst zipFinishCallback = () => {\n core.debug('Zip stream for upload has finished.');\n};\nconst zipEndCallback = () => {\n core.debug('Zip stream for upload has ended.');\n};\n//# sourceMappingURL=zip.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzMyOS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQ0FBb0M7QUFDbkQ7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsMENBQTBDLDRCQUE0QjtBQUN0RSxDQUFDO0FBQ0Q7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELDZCQUE2QixHQUFHLHVCQUF1QixHQUFHLGlDQUFpQztBQUMzRiw0QkFBNEIsbUJBQU8sQ0FBQyxJQUFRO0FBQzVDLDhCQUE4QixtQkFBTyxDQUFDLElBQVU7QUFDaEQsMEJBQTBCLG1CQUFPLENBQUMsSUFBZTtBQUNqRCxhQUFhLG1CQUFPLENBQUMsSUFBSTtBQUN6QixpQkFBaUIsbUJBQU8sQ0FBQyxJQUFrQjtBQUMzQyxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsdUVBQXVFLGlCQUFpQjtBQUN4RjtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsNEJBQTRCO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELHNDQUFzQztBQUMzRixvREFBb0Qsc0NBQXNDO0FBQzFGO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBGQUEwRixXQUFXO0FBQ3JHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2ludGVybmFsL3VwbG9hZC96aXAuanM/ODgyZCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZVppcFVwbG9hZFN0cmVhbSA9IGV4cG9ydHMuWmlwVXBsb2FkU3RyZWFtID0gZXhwb3J0cy5ERUZBVUxUX0NPTVBSRVNTSU9OX0xFVkVMID0gdm9pZCAwO1xuY29uc3Qgc3RyZWFtID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJzdHJlYW1cIikpO1xuY29uc3QgYXJjaGl2ZXIgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImFyY2hpdmVyXCIpKTtcbmNvbnN0IGNvcmUgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIkBhY3Rpb25zL2NvcmVcIikpO1xuY29uc3QgZnNfMSA9IHJlcXVpcmUoXCJmc1wiKTtcbmNvbnN0IGNvbmZpZ18xID0gcmVxdWlyZShcIi4uL3NoYXJlZC9jb25maWdcIik7XG5leHBvcnRzLkRFRkFVTFRfQ09NUFJFU1NJT05fTEVWRUwgPSA2O1xuLy8gQ3VzdG9tIHN0cmVhbSB0cmFuc2Zvcm1lciBzbyB3ZSBjYW4gc2V0IHRoZSBoaWdoV2F0ZXJNYXJrIHByb3BlcnR5XG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy84ODU1XG5jbGFzcyBaaXBVcGxvYWRTdHJlYW0gZXh0ZW5kcyBzdHJlYW0uVHJhbnNmb3JtIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXJTaXplKSB7XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIGhpZ2hXYXRlck1hcms6IGJ1ZmZlclNpemVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgX3RyYW5zZm9ybShjaHVuaywgZW5jLCBjYikge1xuICAgICAgICBjYihudWxsLCBjaHVuayk7XG4gICAgfVxufVxuZXhwb3J0cy5aaXBVcGxvYWRTdHJlYW0gPSBaaXBVcGxvYWRTdHJlYW07XG5mdW5jdGlvbiBjcmVhdGVaaXBVcGxvYWRTdHJlYW0odXBsb2FkU3BlY2lmaWNhdGlvbiwgY29tcHJlc3Npb25MZXZlbCA9IGV4cG9ydHMuREVGQVVMVF9DT01QUkVTU0lPTl9MRVZFTCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvcmUuZGVidWcoYENyZWF0aW5nIEFydGlmYWN0IGFyY2hpdmUgd2l0aCBjb21wcmVzc2lvbkxldmVsOiAke2NvbXByZXNzaW9uTGV2ZWx9YCk7XG4gICAgICAgIGNvbnN0IHppcCA9IGFyY2hpdmVyLmNyZWF0ZSgnemlwJywge1xuICAgICAgICAgICAgaGlnaFdhdGVyTWFyazogKDAsIGNvbmZpZ18xLmdldFVwbG9hZENodW5rU2l6ZSkoKSxcbiAgICAgICAgICAgIHpsaWI6IHsgbGV2ZWw6IGNvbXByZXNzaW9uTGV2ZWwgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gcmVnaXN0ZXIgY2FsbGJhY2tzIGZvciB2YXJpb3VzIGV2ZW50cyBkdXJpbmcgdGhlIHppcCBsaWZlY3ljbGVcbiAgICAgICAgemlwLm9uKCdlcnJvcicsIHppcEVycm9yQ2FsbGJhY2spO1xuICAgICAgICB6aXAub24oJ3dhcm5pbmcnLCB6aXBXYXJuaW5nQ2FsbGJhY2spO1xuICAgICAgICB6aXAub24oJ2ZpbmlzaCcsIHppcEZpbmlzaENhbGxiYWNrKTtcbiAgICAgICAgemlwLm9uKCdlbmQnLCB6aXBFbmRDYWxsYmFjayk7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiB1cGxvYWRTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZmlsZS5zb3VyY2VQYXRoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gQWRkIGEgbm9ybWFsIGZpbGUgdG8gdGhlIHppcFxuICAgICAgICAgICAgICAgIHppcC5hcHBlbmQoKDAsIGZzXzEuY3JlYXRlUmVhZFN0cmVhbSkoZmlsZS5zb3VyY2VQYXRoKSwge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBmaWxlLmRlc3RpbmF0aW9uUGF0aFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSB6aXBcbiAgICAgICAgICAgICAgICB6aXAuYXBwZW5kKCcnLCB7IG5hbWU6IGZpbGUuZGVzdGluYXRpb25QYXRoIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlclNpemUgPSAoMCwgY29uZmlnXzEuZ2V0VXBsb2FkQ2h1bmtTaXplKSgpO1xuICAgICAgICBjb25zdCB6aXBVcGxvYWRTdHJlYW0gPSBuZXcgWmlwVXBsb2FkU3RyZWFtKGJ1ZmZlclNpemUpO1xuICAgICAgICBjb3JlLmRlYnVnKGBaaXAgd3JpdGUgaGlnaCB3YXRlcm1hcmsgdmFsdWUgJHt6aXBVcGxvYWRTdHJlYW0ud3JpdGFibGVIaWdoV2F0ZXJNYXJrfWApO1xuICAgICAgICBjb3JlLmRlYnVnKGBaaXAgcmVhZCBoaWdoIHdhdGVybWFyayB2YWx1ZSAke3ppcFVwbG9hZFN0cmVhbS5yZWFkYWJsZUhpZ2hXYXRlck1hcmt9YCk7XG4gICAgICAgIHppcC5waXBlKHppcFVwbG9hZFN0cmVhbSk7XG4gICAgICAgIHppcC5maW5hbGl6ZSgpO1xuICAgICAgICByZXR1cm4gemlwVXBsb2FkU3RyZWFtO1xuICAgIH0pO1xufVxuZXhwb3J0cy5jcmVhdGVaaXBVcGxvYWRTdHJlYW0gPSBjcmVhdGVaaXBVcGxvYWRTdHJlYW07XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuY29uc3QgemlwRXJyb3JDYWxsYmFjayA9IChlcnJvcikgPT4ge1xuICAgIGNvcmUuZXJyb3IoJ0FuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSBjcmVhdGluZyB0aGUgemlwIGZpbGUgZm9yIHVwbG9hZCcpO1xuICAgIGNvcmUuaW5mbyhlcnJvcik7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBbiBlcnJvciBoYXMgb2NjdXJyZWQgZHVyaW5nIHppcCBjcmVhdGlvbiBmb3IgdGhlIGFydGlmYWN0Jyk7XG59O1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmNvbnN0IHppcFdhcm5pbmdDYWxsYmFjayA9IChlcnJvcikgPT4ge1xuICAgIGlmIChlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICBjb3JlLndhcm5pbmcoJ0VOT0VOVCB3YXJuaW5nIGR1cmluZyBhcnRpZmFjdCB6aXAgY3JlYXRpb24uIE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknKTtcbiAgICAgICAgY29yZS5pbmZvKGVycm9yKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvcmUud2FybmluZyhgQSBub24tYmxvY2tpbmcgd2FybmluZyBoYXMgb2NjdXJyZWQgZHVyaW5nIGFydGlmYWN0IHppcCBjcmVhdGlvbjogJHtlcnJvci5jb2RlfWApO1xuICAgICAgICBjb3JlLmluZm8oZXJyb3IpO1xuICAgIH1cbn07XG5jb25zdCB6aXBGaW5pc2hDYWxsYmFjayA9ICgpID0+IHtcbiAgICBjb3JlLmRlYnVnKCdaaXAgc3RyZWFtIGZvciB1cGxvYWQgaGFzIGZpbmlzaGVkLicpO1xufTtcbmNvbnN0IHppcEVuZENhbGxiYWNrID0gKCkgPT4ge1xuICAgIGNvcmUuZGVidWcoJ1ppcCBzdHJlYW0gZm9yIHVwbG9hZCBoYXMgZW5kZWQuJyk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9emlwLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7329\n")},6503:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.Context = void 0;\nconst fs_1 = __webpack_require__(7147);\nconst os_1 = __webpack_require__(2037);\nclass Context {\n /**\n * Hydrate the context from the environment\n */\n constructor() {\n var _a, _b, _c;\n this.payload = {};\n if (process.env.GITHUB_EVENT_PATH) {\n if (fs_1.existsSync(process.env.GITHUB_EVENT_PATH)) {\n this.payload = JSON.parse(fs_1.readFileSync(process.env.GITHUB_EVENT_PATH, { encoding: 'utf8' }));\n }\n else {\n const path = process.env.GITHUB_EVENT_PATH;\n process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`);\n }\n }\n this.eventName = process.env.GITHUB_EVENT_NAME;\n this.sha = process.env.GITHUB_SHA;\n this.ref = process.env.GITHUB_REF;\n this.workflow = process.env.GITHUB_WORKFLOW;\n this.action = process.env.GITHUB_ACTION;\n this.actor = process.env.GITHUB_ACTOR;\n this.job = process.env.GITHUB_JOB;\n this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10);\n this.runId = parseInt(process.env.GITHUB_RUN_ID, 10);\n this.apiUrl = (_a = process.env.GITHUB_API_URL) !== null && _a !== void 0 ? _a : `https://api.github.com`;\n this.serverUrl = (_b = process.env.GITHUB_SERVER_URL) !== null && _b !== void 0 ? _b : `https://github.com`;\n this.graphqlUrl = (_c = process.env.GITHUB_GRAPHQL_URL) !== null && _c !== void 0 ? _c : `https://api.github.com/graphql`;\n }\n get issue() {\n const payload = this.payload;\n return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number });\n }\n get repo() {\n if (process.env.GITHUB_REPOSITORY) {\n const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/');\n return { owner, repo };\n }\n if (this.payload.repository) {\n return {\n owner: this.payload.repository.owner.login,\n repo: this.payload.repository.name\n };\n }\n throw new Error(\"context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'\");\n }\n}\nexports.Context = Context;\n//# sourceMappingURL=context.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjUwMy5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxlQUFlO0FBQ2YsYUFBYSxtQkFBTyxDQUFDLElBQUk7QUFDekIsYUFBYSxtQkFBTyxDQUFDLElBQUk7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkZBQTZGLGtCQUFrQjtBQUMvRztBQUNBO0FBQ0E7QUFDQSwwREFBMEQsTUFBTSxnQkFBZ0IsU0FBUztBQUN6RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLGdCQUFnQixtRUFBbUU7QUFDaEk7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9ub2RlX21vZHVsZXMvQGFjdGlvbnMvZ2l0aHViL2xpYi9jb250ZXh0LmpzPzk4ZWYiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkNvbnRleHQgPSB2b2lkIDA7XG5jb25zdCBmc18xID0gcmVxdWlyZShcImZzXCIpO1xuY29uc3Qgb3NfMSA9IHJlcXVpcmUoXCJvc1wiKTtcbmNsYXNzIENvbnRleHQge1xuICAgIC8qKlxuICAgICAqIEh5ZHJhdGUgdGhlIGNvbnRleHQgZnJvbSB0aGUgZW52aXJvbm1lbnRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIHRoaXMucGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuR0lUSFVCX0VWRU5UX1BBVEgpIHtcbiAgICAgICAgICAgIGlmIChmc18xLmV4aXN0c1N5bmMocHJvY2Vzcy5lbnYuR0lUSFVCX0VWRU5UX1BBVEgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXlsb2FkID0gSlNPTi5wYXJzZShmc18xLnJlYWRGaWxlU3luYyhwcm9jZXNzLmVudi5HSVRIVUJfRVZFTlRfUEFUSCwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBwcm9jZXNzLmVudi5HSVRIVUJfRVZFTlRfUEFUSDtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgR0lUSFVCX0VWRU5UX1BBVEggJHtwYXRofSBkb2VzIG5vdCBleGlzdCR7b3NfMS5FT0x9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ldmVudE5hbWUgPSBwcm9jZXNzLmVudi5HSVRIVUJfRVZFTlRfTkFNRTtcbiAgICAgICAgdGhpcy5zaGEgPSBwcm9jZXNzLmVudi5HSVRIVUJfU0hBO1xuICAgICAgICB0aGlzLnJlZiA9IHByb2Nlc3MuZW52LkdJVEhVQl9SRUY7XG4gICAgICAgIHRoaXMud29ya2Zsb3cgPSBwcm9jZXNzLmVudi5HSVRIVUJfV09SS0ZMT1c7XG4gICAgICAgIHRoaXMuYWN0aW9uID0gcHJvY2Vzcy5lbnYuR0lUSFVCX0FDVElPTjtcbiAgICAgICAgdGhpcy5hY3RvciA9IHByb2Nlc3MuZW52LkdJVEhVQl9BQ1RPUjtcbiAgICAgICAgdGhpcy5qb2IgPSBwcm9jZXNzLmVudi5HSVRIVUJfSk9CO1xuICAgICAgICB0aGlzLnJ1bk51bWJlciA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkdJVEhVQl9SVU5fTlVNQkVSLCAxMCk7XG4gICAgICAgIHRoaXMucnVuSWQgPSBwYXJzZUludChwcm9jZXNzLmVudi5HSVRIVUJfUlVOX0lELCAxMCk7XG4gICAgICAgIHRoaXMuYXBpVXJsID0gKF9hID0gcHJvY2Vzcy5lbnYuR0lUSFVCX0FQSV9VUkwpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGBodHRwczovL2FwaS5naXRodWIuY29tYDtcbiAgICAgICAgdGhpcy5zZXJ2ZXJVcmwgPSAoX2IgPSBwcm9jZXNzLmVudi5HSVRIVUJfU0VSVkVSX1VSTCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogYGh0dHBzOi8vZ2l0aHViLmNvbWA7XG4gICAgICAgIHRoaXMuZ3JhcGhxbFVybCA9IChfYyA9IHByb2Nlc3MuZW52LkdJVEhVQl9HUkFQSFFMX1VSTCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vZ3JhcGhxbGA7XG4gICAgfVxuICAgIGdldCBpc3N1ZSgpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMucGF5bG9hZDtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5yZXBvKSwgeyBudW1iZXI6IChwYXlsb2FkLmlzc3VlIHx8IHBheWxvYWQucHVsbF9yZXF1ZXN0IHx8IHBheWxvYWQpLm51bWJlciB9KTtcbiAgICB9XG4gICAgZ2V0IHJlcG8oKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5HSVRIVUJfUkVQT1NJVE9SWSkge1xuICAgICAgICAgICAgY29uc3QgW293bmVyLCByZXBvXSA9IHByb2Nlc3MuZW52LkdJVEhVQl9SRVBPU0lUT1JZLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICByZXR1cm4geyBvd25lciwgcmVwbyB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBheWxvYWQucmVwb3NpdG9yeSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBvd25lcjogdGhpcy5wYXlsb2FkLnJlcG9zaXRvcnkub3duZXIubG9naW4sXG4gICAgICAgICAgICAgICAgcmVwbzogdGhpcy5wYXlsb2FkLnJlcG9zaXRvcnkubmFtZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb250ZXh0LnJlcG8gcmVxdWlyZXMgYSBHSVRIVUJfUkVQT1NJVE9SWSBlbnZpcm9ubWVudCB2YXJpYWJsZSBsaWtlICdvd25lci9yZXBvJ1wiKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbnRleHQgPSBDb250ZXh0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udGV4dC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6503\n")},5946:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.getOctokit = exports.context = void 0;\nconst Context = __importStar(__webpack_require__(6503));\nconst utils_1 = __webpack_require__(5362);\nexports.context = new Context.Context();\n/**\n * Returns a hydrated octokit ready to use for GitHub Actions\n *\n * @param token the repo PAT or GITHUB_TOKEN\n * @param options other options to set\n */\nfunction getOctokit(token, options, ...additionalPlugins) {\n const GitHubWithPlugins = utils_1.GitHub.plugin(...additionalPlugins);\n return new GitHubWithPlugins(utils_1.getOctokitOptions(token, options));\n}\nexports.getOctokit = getOctokit;\n//# sourceMappingURL=github.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk0Ni5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQSxtQ0FBbUMsb0NBQW9DLGdCQUFnQjtBQUN2RixDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGtCQUFrQixHQUFHLGVBQWU7QUFDcEMsNkJBQTZCLG1CQUFPLENBQUMsSUFBVztBQUNoRCxnQkFBZ0IsbUJBQU8sQ0FBQyxJQUFTO0FBQ2pDLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQiIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L25vZGVfbW9kdWxlcy9AYWN0aW9ucy9naXRodWIvbGliL2dpdGh1Yi5qcz9mNDRjIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0T2N0b2tpdCA9IGV4cG9ydHMuY29udGV4dCA9IHZvaWQgMDtcbmNvbnN0IENvbnRleHQgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vY29udGV4dFwiKSk7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG5leHBvcnRzLmNvbnRleHQgPSBuZXcgQ29udGV4dC5Db250ZXh0KCk7XG4vKipcbiAqIFJldHVybnMgYSBoeWRyYXRlZCBvY3Rva2l0IHJlYWR5IHRvIHVzZSBmb3IgR2l0SHViIEFjdGlvbnNcbiAqXG4gKiBAcGFyYW0gICAgIHRva2VuICAgIHRoZSByZXBvIFBBVCBvciBHSVRIVUJfVE9LRU5cbiAqIEBwYXJhbSAgICAgb3B0aW9ucyAgb3RoZXIgb3B0aW9ucyB0byBzZXRcbiAqL1xuZnVuY3Rpb24gZ2V0T2N0b2tpdCh0b2tlbiwgb3B0aW9ucywgLi4uYWRkaXRpb25hbFBsdWdpbnMpIHtcbiAgICBjb25zdCBHaXRIdWJXaXRoUGx1Z2lucyA9IHV0aWxzXzEuR2l0SHViLnBsdWdpbiguLi5hZGRpdGlvbmFsUGx1Z2lucyk7XG4gICAgcmV0dXJuIG5ldyBHaXRIdWJXaXRoUGx1Z2lucyh1dGlsc18xLmdldE9jdG9raXRPcHRpb25zKHRva2VuLCBvcHRpb25zKSk7XG59XG5leHBvcnRzLmdldE9jdG9raXQgPSBnZXRPY3Rva2l0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2l0aHViLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5946\n')},138:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.getApiBaseUrl = exports.getProxyAgent = exports.getAuthString = void 0;\nconst httpClient = __importStar(__webpack_require__(4635));\nfunction getAuthString(token, options) {\n if (!token && !options.auth) {\n throw new Error('Parameter token or opts.auth is required');\n }\n else if (token && options.auth) {\n throw new Error('Parameters token and opts.auth may not both be specified');\n }\n return typeof options.auth === 'string' ? options.auth : `token ${token}`;\n}\nexports.getAuthString = getAuthString;\nfunction getProxyAgent(destinationUrl) {\n const hc = new httpClient.HttpClient();\n return hc.getAgent(destinationUrl);\n}\nexports.getProxyAgent = getProxyAgent;\nfunction getApiBaseUrl() {\n return process.env['GITHUB_API_URL'] || 'https://api.github.com';\n}\nexports.getApiBaseUrl = getApiBaseUrl;\n//# sourceMappingURL=utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM4LmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2I7QUFDQTtBQUNBLG1DQUFtQyxvQ0FBb0MsZ0JBQWdCO0FBQ3ZGLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsMENBQTBDLDRCQUE0QjtBQUN0RSxDQUFDO0FBQ0Q7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QscUJBQXFCLEdBQUcscUJBQXFCLEdBQUcscUJBQXFCO0FBQ3JFLGdDQUFnQyxtQkFBTyxDQUFDLElBQXNCO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFLE1BQU07QUFDNUU7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3Qvbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2dpdGh1Yi9saWIvaW50ZXJuYWwvdXRpbHMuanM/NTk2ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldEFwaUJhc2VVcmwgPSBleHBvcnRzLmdldFByb3h5QWdlbnQgPSBleHBvcnRzLmdldEF1dGhTdHJpbmcgPSB2b2lkIDA7XG5jb25zdCBodHRwQ2xpZW50ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJAYWN0aW9ucy9odHRwLWNsaWVudFwiKSk7XG5mdW5jdGlvbiBnZXRBdXRoU3RyaW5nKHRva2VuLCBvcHRpb25zKSB7XG4gICAgaWYgKCF0b2tlbiAmJiAhb3B0aW9ucy5hdXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyYW1ldGVyIHRva2VuIG9yIG9wdHMuYXV0aCBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0b2tlbiAmJiBvcHRpb25zLmF1dGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJhbWV0ZXJzIHRva2VuIGFuZCBvcHRzLmF1dGggbWF5IG5vdCBib3RoIGJlIHNwZWNpZmllZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIG9wdGlvbnMuYXV0aCA9PT0gJ3N0cmluZycgPyBvcHRpb25zLmF1dGggOiBgdG9rZW4gJHt0b2tlbn1gO1xufVxuZXhwb3J0cy5nZXRBdXRoU3RyaW5nID0gZ2V0QXV0aFN0cmluZztcbmZ1bmN0aW9uIGdldFByb3h5QWdlbnQoZGVzdGluYXRpb25VcmwpIHtcbiAgICBjb25zdCBoYyA9IG5ldyBodHRwQ2xpZW50Lkh0dHBDbGllbnQoKTtcbiAgICByZXR1cm4gaGMuZ2V0QWdlbnQoZGVzdGluYXRpb25VcmwpO1xufVxuZXhwb3J0cy5nZXRQcm94eUFnZW50ID0gZ2V0UHJveHlBZ2VudDtcbmZ1bmN0aW9uIGdldEFwaUJhc2VVcmwoKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52WydHSVRIVUJfQVBJX1VSTCddIHx8ICdodHRwczovL2FwaS5naXRodWIuY29tJztcbn1cbmV4cG9ydHMuZ2V0QXBpQmFzZVVybCA9IGdldEFwaUJhc2VVcmw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///138\n")},5362:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0;\nconst Context = __importStar(__webpack_require__(6503));\nconst Utils = __importStar(__webpack_require__(138));\n// octokit + plugins\nconst core_1 = __webpack_require__(4483);\nconst plugin_rest_endpoint_methods_1 = __webpack_require__(9378);\nconst plugin_paginate_rest_1 = __webpack_require__(2009);\nexports.context = new Context.Context();\nconst baseUrl = Utils.getApiBaseUrl();\nexports.defaults = {\n baseUrl,\n request: {\n agent: Utils.getProxyAgent(baseUrl)\n }\n};\nexports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults);\n/**\n * Convience function to correctly format Octokit Options to pass into the constructor.\n *\n * @param token the repo PAT or GITHUB_TOKEN\n * @param options other options to set\n */\nfunction getOctokitOptions(token, options) {\n const opts = Object.assign({}, options || {}); // Shallow clone - don\'t mutate the object provided by the caller\n // Auth\n const auth = Utils.getAuthString(token, opts);\n if (auth) {\n opts.auth = auth;\n }\n return opts;\n}\nexports.getOctokitOptions = getOctokitOptions;\n//# sourceMappingURL=utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTM2Mi5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQSxtQ0FBbUMsb0NBQW9DLGdCQUFnQjtBQUN2RixDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHlCQUF5QixHQUFHLGNBQWMsR0FBRyxnQkFBZ0IsR0FBRyxlQUFlO0FBQy9FLDZCQUE2QixtQkFBTyxDQUFDLElBQVc7QUFDaEQsMkJBQTJCLG1CQUFPLENBQUMsR0FBa0I7QUFDckQ7QUFDQSxlQUFlLG1CQUFPLENBQUMsSUFBZTtBQUN0Qyx1Q0FBdUMsbUJBQU8sQ0FBQyxJQUF1QztBQUN0RiwrQkFBK0IsbUJBQU8sQ0FBQyxJQUErQjtBQUN0RSxlQUFlO0FBQ2Y7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxlQUFlLEdBQUc7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9ub2RlX21vZHVsZXMvQGFjdGlvbnMvZ2l0aHViL2xpYi91dGlscy5qcz9mYmNlIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0T2N0b2tpdE9wdGlvbnMgPSBleHBvcnRzLkdpdEh1YiA9IGV4cG9ydHMuZGVmYXVsdHMgPSBleHBvcnRzLmNvbnRleHQgPSB2b2lkIDA7XG5jb25zdCBDb250ZXh0ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2NvbnRleHRcIikpO1xuY29uc3QgVXRpbHMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vaW50ZXJuYWwvdXRpbHNcIikpO1xuLy8gb2N0b2tpdCArIHBsdWdpbnNcbmNvbnN0IGNvcmVfMSA9IHJlcXVpcmUoXCJAb2N0b2tpdC9jb3JlXCIpO1xuY29uc3QgcGx1Z2luX3Jlc3RfZW5kcG9pbnRfbWV0aG9kc18xID0gcmVxdWlyZShcIkBvY3Rva2l0L3BsdWdpbi1yZXN0LWVuZHBvaW50LW1ldGhvZHNcIik7XG5jb25zdCBwbHVnaW5fcGFnaW5hdGVfcmVzdF8xID0gcmVxdWlyZShcIkBvY3Rva2l0L3BsdWdpbi1wYWdpbmF0ZS1yZXN0XCIpO1xuZXhwb3J0cy5jb250ZXh0ID0gbmV3IENvbnRleHQuQ29udGV4dCgpO1xuY29uc3QgYmFzZVVybCA9IFV0aWxzLmdldEFwaUJhc2VVcmwoKTtcbmV4cG9ydHMuZGVmYXVsdHMgPSB7XG4gICAgYmFzZVVybCxcbiAgICByZXF1ZXN0OiB7XG4gICAgICAgIGFnZW50OiBVdGlscy5nZXRQcm94eUFnZW50KGJhc2VVcmwpXG4gICAgfVxufTtcbmV4cG9ydHMuR2l0SHViID0gY29yZV8xLk9jdG9raXQucGx1Z2luKHBsdWdpbl9yZXN0X2VuZHBvaW50X21ldGhvZHNfMS5yZXN0RW5kcG9pbnRNZXRob2RzLCBwbHVnaW5fcGFnaW5hdGVfcmVzdF8xLnBhZ2luYXRlUmVzdCkuZGVmYXVsdHMoZXhwb3J0cy5kZWZhdWx0cyk7XG4vKipcbiAqIENvbnZpZW5jZSBmdW5jdGlvbiB0byBjb3JyZWN0bHkgZm9ybWF0IE9jdG9raXQgT3B0aW9ucyB0byBwYXNzIGludG8gdGhlIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBwYXJhbSAgICAgdG9rZW4gICAgdGhlIHJlcG8gUEFUIG9yIEdJVEhVQl9UT0tFTlxuICogQHBhcmFtICAgICBvcHRpb25zICBvdGhlciBvcHRpb25zIHRvIHNldFxuICovXG5mdW5jdGlvbiBnZXRPY3Rva2l0T3B0aW9ucyh0b2tlbiwgb3B0aW9ucykge1xuICAgIGNvbnN0IG9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zIHx8IHt9KTsgLy8gU2hhbGxvdyBjbG9uZSAtIGRvbid0IG11dGF0ZSB0aGUgb2JqZWN0IHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXJcbiAgICAvLyBBdXRoXG4gICAgY29uc3QgYXV0aCA9IFV0aWxzLmdldEF1dGhTdHJpbmcodG9rZW4sIG9wdHMpO1xuICAgIGlmIChhdXRoKSB7XG4gICAgICAgIG9wdHMuYXV0aCA9IGF1dGg7XG4gICAgfVxuICAgIHJldHVybiBvcHRzO1xufVxuZXhwb3J0cy5nZXRPY3Rva2l0T3B0aW9ucyA9IGdldE9jdG9raXRPcHRpb25zO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5362\n')},4483:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n Octokit: () => (/* binding */ Octokit)\n});\n\n// EXTERNAL MODULE: ./node_modules/universal-user-agent/dist-web/index.js\nvar dist_web = __webpack_require__(350);\n// EXTERNAL MODULE: ./node_modules/before-after-hook/index.js\nvar before_after_hook = __webpack_require__(5186);\n;// CONCATENATED MODULE: ./node_modules/is-plain-object/dist/is-plain-object.mjs\n/*!\n * is-plain-object \n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nfunction isObject(o) {\n return Object.prototype.toString.call(o) === \'[object Object]\';\n}\n\nfunction isPlainObject(o) {\n var ctor,prot;\n\n if (isObject(o) === false) return false;\n\n // If has modified constructor\n ctor = o.constructor;\n if (ctor === undefined) return true;\n\n // If has modified prototype\n prot = ctor.prototype;\n if (isObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (prot.hasOwnProperty(\'isPrototypeOf\') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n}\n\n\n\n;// CONCATENATED MODULE: ./node_modules/@actions/artifact/node_modules/@octokit/endpoint/dist-web/index.js\n\n\n\nfunction lowercaseKeys(object) {\n if (!object) {\n return {};\n }\n return Object.keys(object).reduce((newObj, key) => {\n newObj[key.toLowerCase()] = object[key];\n return newObj;\n }, {});\n}\n\nfunction mergeDeep(defaults, options) {\n const result = Object.assign({}, defaults);\n Object.keys(options).forEach((key) => {\n if (isPlainObject(options[key])) {\n if (!(key in defaults))\n Object.assign(result, { [key]: options[key] });\n else\n result[key] = mergeDeep(defaults[key], options[key]);\n }\n else {\n Object.assign(result, { [key]: options[key] });\n }\n });\n return result;\n}\n\nfunction removeUndefinedProperties(obj) {\n for (const key in obj) {\n if (obj[key] === undefined) {\n delete obj[key];\n }\n }\n return obj;\n}\n\nfunction merge(defaults, route, options) {\n if (typeof route === "string") {\n let [method, url] = route.split(" ");\n options = Object.assign(url ? { method, url } : { url: method }, options);\n }\n else {\n options = Object.assign({}, route);\n }\n // lowercase header names before merging with defaults to avoid duplicates\n options.headers = lowercaseKeys(options.headers);\n // remove properties with undefined values before merging\n removeUndefinedProperties(options);\n removeUndefinedProperties(options.headers);\n const mergedOptions = mergeDeep(defaults || {}, options);\n // mediaType.previews arrays are merged, instead of overwritten\n if (defaults && defaults.mediaType.previews.length) {\n mergedOptions.mediaType.previews = defaults.mediaType.previews\n .filter((preview) => !mergedOptions.mediaType.previews.includes(preview))\n .concat(mergedOptions.mediaType.previews);\n }\n mergedOptions.mediaType.previews = mergedOptions.mediaType.previews.map((preview) => preview.replace(/-preview/, ""));\n return mergedOptions;\n}\n\nfunction addQueryParameters(url, parameters) {\n const separator = /\\?/.test(url) ? "&" : "?";\n const names = Object.keys(parameters);\n if (names.length === 0) {\n return url;\n }\n return (url +\n separator +\n names\n .map((name) => {\n if (name === "q") {\n return ("q=" + parameters.q.split("+").map(encodeURIComponent).join("+"));\n }\n return `${name}=${encodeURIComponent(parameters[name])}`;\n })\n .join("&"));\n}\n\nconst urlVariableRegex = /\\{[^}]+\\}/g;\nfunction removeNonChars(variableName) {\n return variableName.replace(/^\\W+|\\W+$/g, "").split(/,/);\n}\nfunction extractUrlVariableNames(url) {\n const matches = url.match(urlVariableRegex);\n if (!matches) {\n return [];\n }\n return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []);\n}\n\nfunction omit(object, keysToOmit) {\n return Object.keys(object)\n .filter((option) => !keysToOmit.includes(option))\n .reduce((obj, key) => {\n obj[key] = object[key];\n return obj;\n }, {});\n}\n\n// Based on https://github.com/bramstein/url-template, licensed under BSD\n// TODO: create separate package.\n//\n// Copyright (c) 2012-2014, Bram Stein\n// All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n// 1. Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright\n// notice, this list of conditions and the following disclaimer in the\n// documentation and/or other materials provided with the distribution.\n// 3. The name of the author may not be used to endorse or promote products\n// derived from this software without specific prior written permission.\n// THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED\n// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n// EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n/* istanbul ignore file */\nfunction encodeReserved(str) {\n return str\n .split(/(%[0-9A-Fa-f]{2})/g)\n .map(function (part) {\n if (!/%[0-9A-Fa-f]/.test(part)) {\n part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]");\n }\n return part;\n })\n .join("");\n}\nfunction encodeUnreserved(str) {\n return encodeURIComponent(str).replace(/[!\'()*]/g, function (c) {\n return "%" + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\nfunction encodeValue(operator, value, key) {\n value =\n operator === "+" || operator === "#"\n ? encodeReserved(value)\n : encodeUnreserved(value);\n if (key) {\n return encodeUnreserved(key) + "=" + value;\n }\n else {\n return value;\n }\n}\nfunction isDefined(value) {\n return value !== undefined && value !== null;\n}\nfunction isKeyOperator(operator) {\n return operator === ";" || operator === "&" || operator === "?";\n}\nfunction getValues(context, operator, key, modifier) {\n var value = context[key], result = [];\n if (isDefined(value) && value !== "") {\n if (typeof value === "string" ||\n typeof value === "number" ||\n typeof value === "boolean") {\n value = value.toString();\n if (modifier && modifier !== "*") {\n value = value.substring(0, parseInt(modifier, 10));\n }\n result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : ""));\n }\n else {\n if (modifier === "*") {\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function (value) {\n result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : ""));\n });\n }\n else {\n Object.keys(value).forEach(function (k) {\n if (isDefined(value[k])) {\n result.push(encodeValue(operator, value[k], k));\n }\n });\n }\n }\n else {\n const tmp = [];\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function (value) {\n tmp.push(encodeValue(operator, value));\n });\n }\n else {\n Object.keys(value).forEach(function (k) {\n if (isDefined(value[k])) {\n tmp.push(encodeUnreserved(k));\n tmp.push(encodeValue(operator, value[k].toString()));\n }\n });\n }\n if (isKeyOperator(operator)) {\n result.push(encodeUnreserved(key) + "=" + tmp.join(","));\n }\n else if (tmp.length !== 0) {\n result.push(tmp.join(","));\n }\n }\n }\n }\n else {\n if (operator === ";") {\n if (isDefined(value)) {\n result.push(encodeUnreserved(key));\n }\n }\n else if (value === "" && (operator === "&" || operator === "?")) {\n result.push(encodeUnreserved(key) + "=");\n }\n else if (value === "") {\n result.push("");\n }\n }\n return result;\n}\nfunction parseUrl(template) {\n return {\n expand: expand.bind(null, template),\n };\n}\nfunction expand(template, context) {\n var operators = ["+", "#", ".", "/", ";", "?", "&"];\n return template.replace(/\\{([^\\{\\}]+)\\}|([^\\{\\}]+)/g, function (_, expression, literal) {\n if (expression) {\n let operator = "";\n const values = [];\n if (operators.indexOf(expression.charAt(0)) !== -1) {\n operator = expression.charAt(0);\n expression = expression.substr(1);\n }\n expression.split(/,/g).forEach(function (variable) {\n var tmp = /([^:\\*]*)(?::(\\d+)|(\\*))?/.exec(variable);\n values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));\n });\n if (operator && operator !== "+") {\n var separator = ",";\n if (operator === "?") {\n separator = "&";\n }\n else if (operator !== "#") {\n separator = operator;\n }\n return (values.length !== 0 ? operator : "") + values.join(separator);\n }\n else {\n return values.join(",");\n }\n }\n else {\n return encodeReserved(literal);\n }\n });\n}\n\nfunction parse(options) {\n // https://fetch.spec.whatwg.org/#methods\n let method = options.method.toUpperCase();\n // replace :varname with {varname} to make it RFC 6570 compatible\n let url = (options.url || "/").replace(/:([a-z]\\w+)/g, "{$1}");\n let headers = Object.assign({}, options.headers);\n let body;\n let parameters = omit(options, [\n "method",\n "baseUrl",\n "url",\n "headers",\n "request",\n "mediaType",\n ]);\n // extract variable names from URL to calculate remaining variables later\n const urlVariableNames = extractUrlVariableNames(url);\n url = parseUrl(url).expand(parameters);\n if (!/^http/.test(url)) {\n url = options.baseUrl + url;\n }\n const omittedParameters = Object.keys(options)\n .filter((option) => urlVariableNames.includes(option))\n .concat("baseUrl");\n const remainingParameters = omit(parameters, omittedParameters);\n const isBinaryRequest = /application\\/octet-stream/i.test(headers.accept);\n if (!isBinaryRequest) {\n if (options.mediaType.format) {\n // e.g. application/vnd.github.v3+json => application/vnd.github.v3.raw\n headers.accept = headers.accept\n .split(/,/)\n .map((preview) => preview.replace(/application\\/vnd(\\.\\w+)(\\.v3)?(\\.\\w+)?(\\+json)?$/, `application/vnd$1$2.${options.mediaType.format}`))\n .join(",");\n }\n if (options.mediaType.previews.length) {\n const previewsFromAcceptHeader = headers.accept.match(/[\\w-]+(?=-preview)/g) || [];\n headers.accept = previewsFromAcceptHeader\n .concat(options.mediaType.previews)\n .map((preview) => {\n const format = options.mediaType.format\n ? `.${options.mediaType.format}`\n : "+json";\n return `application/vnd.github.${preview}-preview${format}`;\n })\n .join(",");\n }\n }\n // for GET/HEAD requests, set URL query parameters from remaining parameters\n // for PATCH/POST/PUT/DELETE requests, set request body from remaining parameters\n if (["GET", "HEAD"].includes(method)) {\n url = addQueryParameters(url, remainingParameters);\n }\n else {\n if ("data" in remainingParameters) {\n body = remainingParameters.data;\n }\n else {\n if (Object.keys(remainingParameters).length) {\n body = remainingParameters;\n }\n else {\n headers["content-length"] = 0;\n }\n }\n }\n // default content-type for JSON if body is set\n if (!headers["content-type"] && typeof body !== "undefined") {\n headers["content-type"] = "application/json; charset=utf-8";\n }\n // GitHub expects \'content-length: 0\' header for PUT/PATCH requests without body.\n // fetch does not allow to set `content-length` header, but we can set body to an empty string\n if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") {\n body = "";\n }\n // Only return body/request keys if present\n return Object.assign({ method, url, headers }, typeof body !== "undefined" ? { body } : null, options.request ? { request: options.request } : null);\n}\n\nfunction endpointWithDefaults(defaults, route, options) {\n return parse(merge(defaults, route, options));\n}\n\nfunction withDefaults(oldDefaults, newDefaults) {\n const DEFAULTS = merge(oldDefaults, newDefaults);\n const endpoint = endpointWithDefaults.bind(null, DEFAULTS);\n return Object.assign(endpoint, {\n DEFAULTS,\n defaults: withDefaults.bind(null, DEFAULTS),\n merge: merge.bind(null, DEFAULTS),\n parse,\n });\n}\n\nconst VERSION = "6.0.12";\n\nconst userAgent = `octokit-endpoint.js/${VERSION} ${(0,dist_web/* getUserAgent */.i)()}`;\n// DEFAULTS has all properties set that EndpointOptions has, except url.\n// So we use RequestParameters and add method as additional required property.\nconst DEFAULTS = {\n method: "GET",\n baseUrl: "https://api.github.com",\n headers: {\n accept: "application/vnd.github.v3+json",\n "user-agent": userAgent,\n },\n mediaType: {\n format: "",\n previews: [],\n },\n};\n\nconst endpoint = withDefaults(null, DEFAULTS);\n\n\n//# sourceMappingURL=index.js.map\n\n// EXTERNAL MODULE: ./node_modules/node-fetch/lib/index.mjs\nvar lib = __webpack_require__(6292);\n// EXTERNAL MODULE: ./node_modules/deprecation/dist-web/index.js\nvar deprecation_dist_web = __webpack_require__(2327);\n// EXTERNAL MODULE: ./node_modules/once/once.js\nvar once = __webpack_require__(778);\nvar once_default = /*#__PURE__*/__webpack_require__.n(once);\n;// CONCATENATED MODULE: ./node_modules/@actions/artifact/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-web/index.js\n\n\n\nconst logOnceCode = once_default()((deprecation) => console.warn(deprecation));\nconst logOnceHeaders = once_default()((deprecation) => console.warn(deprecation));\n/**\n * Error with extra properties to help with debugging\n */\nclass RequestError extends Error {\n constructor(message, statusCode, options) {\n super(message);\n // Maintains proper stack trace (only available on V8)\n /* istanbul ignore next */\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n this.name = "HttpError";\n this.status = statusCode;\n let headers;\n if ("headers" in options && typeof options.headers !== "undefined") {\n headers = options.headers;\n }\n if ("response" in options) {\n this.response = options.response;\n headers = options.response.headers;\n }\n // redact request credentials without mutating original request options\n const requestCopy = Object.assign({}, options.request);\n if (options.request.headers.authorization) {\n requestCopy.headers = Object.assign({}, options.request.headers, {\n authorization: options.request.headers.authorization.replace(/ .*$/, " [REDACTED]"),\n });\n }\n requestCopy.url = requestCopy.url\n // client_id & client_secret can be passed as URL query parameters to increase rate limit\n // see https://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications\n .replace(/\\bclient_secret=\\w+/g, "client_secret=[REDACTED]")\n // OAuth tokens can be passed as URL query parameters, although it is not recommended\n // see https://developer.github.com/v3/#oauth2-token-sent-in-a-header\n .replace(/\\baccess_token=\\w+/g, "access_token=[REDACTED]");\n this.request = requestCopy;\n // deprecations\n Object.defineProperty(this, "code", {\n get() {\n logOnceCode(new deprecation_dist_web/* Deprecation */.$("[@octokit/request-error] `error.code` is deprecated, use `error.status`."));\n return statusCode;\n },\n });\n Object.defineProperty(this, "headers", {\n get() {\n logOnceHeaders(new deprecation_dist_web/* Deprecation */.$("[@octokit/request-error] `error.headers` is deprecated, use `error.response.headers`."));\n return headers || {};\n },\n });\n }\n}\n\n\n//# sourceMappingURL=index.js.map\n\n;// CONCATENATED MODULE: ./node_modules/@actions/artifact/node_modules/@octokit/request/dist-web/index.js\n\n\n\n\n\n\nconst dist_web_VERSION = "5.6.3";\n\nfunction getBufferResponse(response) {\n return response.arrayBuffer();\n}\n\nfunction fetchWrapper(requestOptions) {\n const log = requestOptions.request && requestOptions.request.log\n ? requestOptions.request.log\n : console;\n if (isPlainObject(requestOptions.body) ||\n Array.isArray(requestOptions.body)) {\n requestOptions.body = JSON.stringify(requestOptions.body);\n }\n let headers = {};\n let status;\n let url;\n const fetch = (requestOptions.request && requestOptions.request.fetch) || lib/* default */.ZP;\n return fetch(requestOptions.url, Object.assign({\n method: requestOptions.method,\n body: requestOptions.body,\n headers: requestOptions.headers,\n redirect: requestOptions.redirect,\n }, \n // `requestOptions.request.agent` type is incompatible\n // see https://github.com/octokit/types.ts/pull/264\n requestOptions.request))\n .then(async (response) => {\n url = response.url;\n status = response.status;\n for (const keyAndValue of response.headers) {\n headers[keyAndValue[0]] = keyAndValue[1];\n }\n if ("deprecation" in headers) {\n const matches = headers.link && headers.link.match(/<([^>]+)>; rel="deprecation"/);\n const deprecationLink = matches && matches.pop();\n log.warn(`[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${headers.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}`);\n }\n if (status === 204 || status === 205) {\n return;\n }\n // GitHub API returns 200 for HEAD requests\n if (requestOptions.method === "HEAD") {\n if (status < 400) {\n return;\n }\n throw new RequestError(response.statusText, status, {\n response: {\n url,\n status,\n headers,\n data: undefined,\n },\n request: requestOptions,\n });\n }\n if (status === 304) {\n throw new RequestError("Not modified", status, {\n response: {\n url,\n status,\n headers,\n data: await getResponseData(response),\n },\n request: requestOptions,\n });\n }\n if (status >= 400) {\n const data = await getResponseData(response);\n const error = new RequestError(toErrorMessage(data), status, {\n response: {\n url,\n status,\n headers,\n data,\n },\n request: requestOptions,\n });\n throw error;\n }\n return getResponseData(response);\n })\n .then((data) => {\n return {\n status,\n url,\n headers,\n data,\n };\n })\n .catch((error) => {\n if (error instanceof RequestError)\n throw error;\n throw new RequestError(error.message, 500, {\n request: requestOptions,\n });\n });\n}\nasync function getResponseData(response) {\n const contentType = response.headers.get("content-type");\n if (/application\\/json/.test(contentType)) {\n return response.json();\n }\n if (!contentType || /^text\\/|charset=utf-8$/.test(contentType)) {\n return response.text();\n }\n return getBufferResponse(response);\n}\nfunction toErrorMessage(data) {\n if (typeof data === "string")\n return data;\n // istanbul ignore else - just in case\n if ("message" in data) {\n if (Array.isArray(data.errors)) {\n return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}`;\n }\n return data.message;\n }\n // istanbul ignore next - just in case\n return `Unknown error: ${JSON.stringify(data)}`;\n}\n\nfunction dist_web_withDefaults(oldEndpoint, newDefaults) {\n const endpoint = oldEndpoint.defaults(newDefaults);\n const newApi = function (route, parameters) {\n const endpointOptions = endpoint.merge(route, parameters);\n if (!endpointOptions.request || !endpointOptions.request.hook) {\n return fetchWrapper(endpoint.parse(endpointOptions));\n }\n const request = (route, parameters) => {\n return fetchWrapper(endpoint.parse(endpoint.merge(route, parameters)));\n };\n Object.assign(request, {\n endpoint,\n defaults: dist_web_withDefaults.bind(null, endpoint),\n });\n return endpointOptions.request.hook(request, endpointOptions);\n };\n return Object.assign(newApi, {\n endpoint,\n defaults: dist_web_withDefaults.bind(null, endpoint),\n });\n}\n\nconst request = dist_web_withDefaults(endpoint, {\n headers: {\n "user-agent": `octokit-request.js/${dist_web_VERSION} ${(0,dist_web/* getUserAgent */.i)()}`,\n },\n});\n\n\n//# sourceMappingURL=index.js.map\n\n;// CONCATENATED MODULE: ./node_modules/@actions/artifact/node_modules/@octokit/graphql/dist-web/index.js\n\n\n\nconst graphql_dist_web_VERSION = "4.8.0";\n\nfunction _buildMessageForResponseErrors(data) {\n return (`Request failed due to following response errors:\\n` +\n data.errors.map((e) => ` - ${e.message}`).join("\\n"));\n}\nclass GraphqlResponseError extends Error {\n constructor(request, headers, response) {\n super(_buildMessageForResponseErrors(response));\n this.request = request;\n this.headers = headers;\n this.response = response;\n this.name = "GraphqlResponseError";\n // Expose the errors and response data in their shorthand properties.\n this.errors = response.errors;\n this.data = response.data;\n // Maintains proper stack trace (only available on V8)\n /* istanbul ignore next */\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\nconst NON_VARIABLE_OPTIONS = [\n "method",\n "baseUrl",\n "url",\n "headers",\n "request",\n "query",\n "mediaType",\n];\nconst FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"];\nconst GHES_V3_SUFFIX_REGEX = /\\/api\\/v3\\/?$/;\nfunction graphql(request, query, options) {\n if (options) {\n if (typeof query === "string" && "query" in options) {\n return Promise.reject(new Error(`[@octokit/graphql] "query" cannot be used as variable name`));\n }\n for (const key in options) {\n if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key))\n continue;\n return Promise.reject(new Error(`[@octokit/graphql] "${key}" cannot be used as variable name`));\n }\n }\n const parsedOptions = typeof query === "string" ? Object.assign({ query }, options) : query;\n const requestOptions = Object.keys(parsedOptions).reduce((result, key) => {\n if (NON_VARIABLE_OPTIONS.includes(key)) {\n result[key] = parsedOptions[key];\n return result;\n }\n if (!result.variables) {\n result.variables = {};\n }\n result.variables[key] = parsedOptions[key];\n return result;\n }, {});\n // workaround for GitHub Enterprise baseUrl set with /api/v3 suffix\n // https://github.com/octokit/auth-app.js/issues/111#issuecomment-657610451\n const baseUrl = parsedOptions.baseUrl || request.endpoint.DEFAULTS.baseUrl;\n if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) {\n requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql");\n }\n return request(requestOptions).then((response) => {\n if (response.data.errors) {\n const headers = {};\n for (const key of Object.keys(response.headers)) {\n headers[key] = response.headers[key];\n }\n throw new GraphqlResponseError(requestOptions, headers, response.data);\n }\n return response.data.data;\n });\n}\n\nfunction graphql_dist_web_withDefaults(request$1, newDefaults) {\n const newRequest = request$1.defaults(newDefaults);\n const newApi = (query, options) => {\n return graphql(newRequest, query, options);\n };\n return Object.assign(newApi, {\n defaults: graphql_dist_web_withDefaults.bind(null, newRequest),\n endpoint: request.endpoint,\n });\n}\n\nconst graphql$1 = graphql_dist_web_withDefaults(request, {\n headers: {\n "user-agent": `octokit-graphql.js/${graphql_dist_web_VERSION} ${(0,dist_web/* getUserAgent */.i)()}`,\n },\n method: "POST",\n url: "/graphql",\n});\nfunction withCustomRequest(customRequest) {\n return graphql_dist_web_withDefaults(customRequest, {\n method: "POST",\n url: "/graphql",\n });\n}\n\n\n//# sourceMappingURL=index.js.map\n\n;// CONCATENATED MODULE: ./node_modules/@actions/artifact/node_modules/@octokit/auth-token/dist-web/index.js\nconst REGEX_IS_INSTALLATION_LEGACY = /^v1\\./;\nconst REGEX_IS_INSTALLATION = /^ghs_/;\nconst REGEX_IS_USER_TO_SERVER = /^ghu_/;\nasync function auth(token) {\n const isApp = token.split(/\\./).length === 3;\n const isInstallation = REGEX_IS_INSTALLATION_LEGACY.test(token) ||\n REGEX_IS_INSTALLATION.test(token);\n const isUserToServer = REGEX_IS_USER_TO_SERVER.test(token);\n const tokenType = isApp\n ? "app"\n : isInstallation\n ? "installation"\n : isUserToServer\n ? "user-to-server"\n : "oauth";\n return {\n type: "token",\n token: token,\n tokenType,\n };\n}\n\n/**\n * Prefix token for usage in the Authorization header\n *\n * @param token OAuth token or JSON Web Token\n */\nfunction withAuthorizationPrefix(token) {\n if (token.split(/\\./).length === 3) {\n return `bearer ${token}`;\n }\n return `token ${token}`;\n}\n\nasync function hook(token, request, route, parameters) {\n const endpoint = request.endpoint.merge(route, parameters);\n endpoint.headers.authorization = withAuthorizationPrefix(token);\n return request(endpoint);\n}\n\nconst createTokenAuth = function createTokenAuth(token) {\n if (!token) {\n throw new Error("[@octokit/auth-token] No token passed to createTokenAuth");\n }\n if (typeof token !== "string") {\n throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string");\n }\n token = token.replace(/^(token|bearer) +/i, "");\n return Object.assign(auth.bind(null, token), {\n hook: hook.bind(null, token),\n });\n};\n\n\n//# sourceMappingURL=index.js.map\n\n;// CONCATENATED MODULE: ./node_modules/@actions/artifact/node_modules/@octokit/core/dist-web/index.js\n\n\n\n\n\n\nconst core_dist_web_VERSION = "3.6.0";\n\nclass Octokit {\n constructor(options = {}) {\n const hook = new before_after_hook.Collection();\n const requestDefaults = {\n baseUrl: request.endpoint.DEFAULTS.baseUrl,\n headers: {},\n request: Object.assign({}, options.request, {\n // @ts-ignore internal usage only, no need to type\n hook: hook.bind(null, "request"),\n }),\n mediaType: {\n previews: [],\n format: "",\n },\n };\n // prepend default user agent with `options.userAgent` if set\n requestDefaults.headers["user-agent"] = [\n options.userAgent,\n `octokit-core.js/${core_dist_web_VERSION} ${(0,dist_web/* getUserAgent */.i)()}`,\n ]\n .filter(Boolean)\n .join(" ");\n if (options.baseUrl) {\n requestDefaults.baseUrl = options.baseUrl;\n }\n if (options.previews) {\n requestDefaults.mediaType.previews = options.previews;\n }\n if (options.timeZone) {\n requestDefaults.headers["time-zone"] = options.timeZone;\n }\n this.request = request.defaults(requestDefaults);\n this.graphql = withCustomRequest(this.request).defaults(requestDefaults);\n this.log = Object.assign({\n debug: () => { },\n info: () => { },\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n }, options.log);\n this.hook = hook;\n // (1) If neither `options.authStrategy` nor `options.auth` are set, the `octokit` instance\n // is unauthenticated. The `this.auth()` method is a no-op and no request hook is registered.\n // (2) If only `options.auth` is set, use the default token authentication strategy.\n // (3) If `options.authStrategy` is set then use it and pass in `options.auth`. Always pass own request as many strategies accept a custom request instance.\n // TODO: type `options.auth` based on `options.authStrategy`.\n if (!options.authStrategy) {\n if (!options.auth) {\n // (1)\n this.auth = async () => ({\n type: "unauthenticated",\n });\n }\n else {\n // (2)\n const auth = createTokenAuth(options.auth);\n // @ts-ignore ¯\\_(ツ)_/¯\n hook.wrap("request", auth.hook);\n this.auth = auth;\n }\n }\n else {\n const { authStrategy, ...otherOptions } = options;\n const auth = authStrategy(Object.assign({\n request: this.request,\n log: this.log,\n // we pass the current octokit instance as well as its constructor options\n // to allow for authentication strategies that return a new octokit instance\n // that shares the same internal state as the current one. The original\n // requirement for this was the "event-octokit" authentication strategy\n // of https://github.com/probot/octokit-auth-probot.\n octokit: this,\n octokitOptions: otherOptions,\n }, options.auth));\n // @ts-ignore ¯\\_(ツ)_/¯\n hook.wrap("request", auth.hook);\n this.auth = auth;\n }\n // apply plugins\n // https://stackoverflow.com/a/16345172\n const classConstructor = this.constructor;\n classConstructor.plugins.forEach((plugin) => {\n Object.assign(this, plugin(this, options));\n });\n }\n static defaults(defaults) {\n const OctokitWithDefaults = class extends this {\n constructor(...args) {\n const options = args[0] || {};\n if (typeof defaults === "function") {\n super(defaults(options));\n return;\n }\n super(Object.assign({}, defaults, options, options.userAgent && defaults.userAgent\n ? {\n userAgent: `${options.userAgent} ${defaults.userAgent}`,\n }\n : null));\n }\n };\n return OctokitWithDefaults;\n }\n /**\n * Attach a plugin (or many) to your Octokit instance.\n *\n * @example\n * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...)\n */\n static plugin(...newPlugins) {\n var _a;\n const currentPlugins = this.plugins;\n const NewOctokit = (_a = class extends this {\n },\n _a.plugins = currentPlugins.concat(newPlugins.filter((plugin) => !currentPlugins.includes(plugin))),\n _a);\n return NewOctokit;\n }\n}\nOctokit.VERSION = core_dist_web_VERSION;\nOctokit.plugins = [];\n\n\n//# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQ4My5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUV5Qjs7O0FDakN1QjtBQUNJOztBQUVwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssSUFBSTtBQUNUOztBQUVBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0EsWUFBWSxhQUFhO0FBQ3pCO0FBQ0Esd0NBQXdDLHFCQUFxQjtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxxQkFBcUI7QUFDekQ7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxjQUFjLElBQUksYUFBYTtBQUN2RTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsS0FBSyxHQUFHLHFDQUFxQztBQUNuRSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQSw0QkFBNEIsR0FBRyxJQUFJO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssSUFBSTtBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvRUFBb0U7QUFDcEUscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixFQUFFO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQywrQkFBK0IsS0FBSyxFQUFFLEtBQUssTUFBTSxFQUFFO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFNBQVM7QUFDdkMsNkRBQTZELEdBQUc7QUFDaEUsa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkhBQTZILHlCQUF5QjtBQUN0SjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHlCQUF5QjtBQUNuRDtBQUNBLGlEQUFpRCxRQUFRLFVBQVUsT0FBTztBQUMxRSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixzQkFBc0Isa0NBQWtDLE9BQU8sNEJBQTRCLDJCQUEyQjtBQUNqSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQSx5Q0FBeUMsU0FBUyxFQUFFLGdDQUFZLEdBQUc7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7O0FBRW9CO0FBQ3BCOzs7Ozs7Ozs7O0FDNVgwQztBQUNsQjs7QUFFeEIsb0JBQW9CLGNBQUk7QUFDeEIsdUJBQXVCLGNBQUk7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLHVDQUFXO0FBQzNDO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0EsbUNBQW1DLHVDQUFXO0FBQzlDO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBOztBQUV3QjtBQUN4Qjs7O0FDMUQ2QztBQUNPO0FBQ0o7QUFDYjtBQUNtQjs7QUFFdEQsTUFBTSxnQkFBTzs7QUFFYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGFBQWE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEVBQThFLG1CQUFTO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkU7QUFDM0U7QUFDQSw0Q0FBNEMsdUJBQXVCLEVBQUUsbUJBQW1CLG9EQUFvRCxlQUFlLEVBQUUsMkJBQTJCLGdCQUFnQixPQUFPO0FBQy9NO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixZQUFZO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLHNCQUFzQixZQUFZO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFlBQVk7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSw2QkFBNkIsWUFBWTtBQUN6QztBQUNBLGtCQUFrQixZQUFZO0FBQzlCO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGFBQWEsSUFBSSwyQ0FBMkM7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIscUJBQXFCO0FBQ2xEOztBQUVBLFNBQVMscUJBQVk7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixxQkFBWTtBQUNsQyxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IscUJBQVk7QUFDOUIsS0FBSztBQUNMOztBQUVBLGdCQUFnQixxQkFBWSxDQUFDLFFBQVE7QUFDckM7QUFDQSw0Q0FBNEMsZ0JBQU8sRUFBRSxFQUFFLGdDQUFZLEdBQUc7QUFDdEUsS0FBSztBQUNMLENBQUM7O0FBRWtCO0FBQ25COzs7QUM3SjJDO0FBQ1M7O0FBRXBELE1BQU0sd0JBQU87O0FBRWI7QUFDQTtBQUNBLHFDQUFxQyxVQUFVO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRSxJQUFJO0FBQ3ZFO0FBQ0E7QUFDQSxzRUFBc0UsT0FBTztBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssSUFBSTtBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQSxTQUFTLDZCQUFZO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsNkJBQVk7QUFDOUIsa0JBQWtCLE9BQU87QUFDekIsS0FBSztBQUNMOztBQUVBLGtCQUFrQiw2QkFBWSxDQUFDLE9BQU87QUFDdEM7QUFDQSw0Q0FBNEMsd0JBQU8sRUFBRSxFQUFFLGdDQUFZLEdBQUc7QUFDdEUsS0FBSztBQUNMO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxXQUFXLDZCQUFZO0FBQ3ZCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRXlFO0FBQ3pFOzs7QUN6R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLE1BQU07QUFDL0I7QUFDQSxvQkFBb0IsTUFBTTtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUUyQjtBQUMzQjs7O0FDdERvRDtBQUNMO0FBQ0o7QUFDVTtBQUNDOztBQUV0RCxNQUFNLHFCQUFPOztBQUViO0FBQ0EsNEJBQTRCO0FBQzVCLHlCQUF5Qiw0QkFBVTtBQUNuQztBQUNBLHFCQUFxQixPQUFPO0FBQzVCLHVCQUF1QjtBQUN2QixxQ0FBcUM7QUFDckM7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IscUJBQU8sRUFBRSxFQUFFLGdDQUFZLEdBQUc7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLE9BQU87QUFDOUIsdUJBQXVCLGlCQUFpQjtBQUN4QztBQUNBLDRCQUE0QjtBQUM1QiwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixlQUFlO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQ0FBZ0M7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBLHNDQUFzQyxtQkFBbUIsRUFBRSxtQkFBbUI7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixxQkFBTztBQUN6Qjs7QUFFbUI7QUFDbkIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9pcy1wbGFpbi1vYmplY3QvZGlzdC9pcy1wbGFpbi1vYmplY3QubWpzPzAyNDUiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3Qvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2VuZHBvaW50L2Rpc3Qtd2ViL2luZGV4LmpzP2NkNDYiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3Qvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3JlcXVlc3Qvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3JlcXVlc3QtZXJyb3IvZGlzdC13ZWIvaW5kZXguanM/OWU4MyIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9ub2RlX21vZHVsZXMvQG9jdG9raXQvcmVxdWVzdC9kaXN0LXdlYi9pbmRleC5qcz9iODdhIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9ncmFwaHFsL2Rpc3Qtd2ViL2luZGV4LmpzP2M4MjUiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3Qvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2F1dGgtdG9rZW4vZGlzdC13ZWIvaW5kZXguanM/ZGFiNyIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9ub2RlX21vZHVsZXMvQG9jdG9raXQvY29yZS9kaXN0LXdlYi9pbmRleC5qcz8wNDMzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogaXMtcGxhaW4tb2JqZWN0IDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1wbGFpbi1vYmplY3Q+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIEpvbiBTY2hsaW5rZXJ0LlxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbmZ1bmN0aW9uIGlzT2JqZWN0KG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qobykge1xuICB2YXIgY3Rvcixwcm90O1xuXG4gIGlmIChpc09iamVjdChvKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcblxuICAvLyBJZiBoYXMgbW9kaWZpZWQgY29uc3RydWN0b3JcbiAgY3RvciA9IG8uY29uc3RydWN0b3I7XG4gIGlmIChjdG9yID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuXG4gIC8vIElmIGhhcyBtb2RpZmllZCBwcm90b3R5cGVcbiAgcHJvdCA9IGN0b3IucHJvdG90eXBlO1xuICBpZiAoaXNPYmplY3QocHJvdCkgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSWYgY29uc3RydWN0b3IgZG9lcyBub3QgaGF2ZSBhbiBPYmplY3Qtc3BlY2lmaWMgbWV0aG9kXG4gIGlmIChwcm90Lmhhc093blByb3BlcnR5KCdpc1Byb3RvdHlwZU9mJykgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gTW9zdCBsaWtlbHkgYSBwbGFpbiBPYmplY3RcbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCB7IGlzUGxhaW5PYmplY3QgfTtcbiIsImltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tICdpcy1wbGFpbi1vYmplY3QnO1xuaW1wb3J0IHsgZ2V0VXNlckFnZW50IH0gZnJvbSAndW5pdmVyc2FsLXVzZXItYWdlbnQnO1xuXG5mdW5jdGlvbiBsb3dlcmNhc2VLZXlzKG9iamVjdCkge1xuICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCkucmVkdWNlKChuZXdPYmosIGtleSkgPT4ge1xuICAgICAgICBuZXdPYmpba2V5LnRvTG93ZXJDYXNlKCldID0gb2JqZWN0W2tleV07XG4gICAgICAgIHJldHVybiBuZXdPYmo7XG4gICAgfSwge30pO1xufVxuXG5mdW5jdGlvbiBtZXJnZURlZXAoZGVmYXVsdHMsIG9wdGlvbnMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0cyk7XG4gICAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChpc1BsYWluT2JqZWN0KG9wdGlvbnNba2V5XSkpIHtcbiAgICAgICAgICAgIGlmICghKGtleSBpbiBkZWZhdWx0cykpXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQsIHsgW2tleV06IG9wdGlvbnNba2V5XSB9KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IG1lcmdlRGVlcChkZWZhdWx0c1trZXldLCBvcHRpb25zW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQsIHsgW2tleV06IG9wdGlvbnNba2V5XSB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXMob2JqKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkZWxldGUgb2JqW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gbWVyZ2UoZGVmYXVsdHMsIHJvdXRlLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiByb3V0ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBsZXQgW21ldGhvZCwgdXJsXSA9IHJvdXRlLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24odXJsID8geyBtZXRob2QsIHVybCB9IDogeyB1cmw6IG1ldGhvZCB9LCBvcHRpb25zKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCByb3V0ZSk7XG4gICAgfVxuICAgIC8vIGxvd2VyY2FzZSBoZWFkZXIgbmFtZXMgYmVmb3JlIG1lcmdpbmcgd2l0aCBkZWZhdWx0cyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgb3B0aW9ucy5oZWFkZXJzID0gbG93ZXJjYXNlS2V5cyhvcHRpb25zLmhlYWRlcnMpO1xuICAgIC8vIHJlbW92ZSBwcm9wZXJ0aWVzIHdpdGggdW5kZWZpbmVkIHZhbHVlcyBiZWZvcmUgbWVyZ2luZ1xuICAgIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXMob3B0aW9ucyk7XG4gICAgcmVtb3ZlVW5kZWZpbmVkUHJvcGVydGllcyhvcHRpb25zLmhlYWRlcnMpO1xuICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSBtZXJnZURlZXAoZGVmYXVsdHMgfHwge30sIG9wdGlvbnMpO1xuICAgIC8vIG1lZGlhVHlwZS5wcmV2aWV3cyBhcnJheXMgYXJlIG1lcmdlZCwgaW5zdGVhZCBvZiBvdmVyd3JpdHRlblxuICAgIGlmIChkZWZhdWx0cyAmJiBkZWZhdWx0cy5tZWRpYVR5cGUucHJldmlld3MubGVuZ3RoKSB7XG4gICAgICAgIG1lcmdlZE9wdGlvbnMubWVkaWFUeXBlLnByZXZpZXdzID0gZGVmYXVsdHMubWVkaWFUeXBlLnByZXZpZXdzXG4gICAgICAgICAgICAuZmlsdGVyKChwcmV2aWV3KSA9PiAhbWVyZ2VkT3B0aW9ucy5tZWRpYVR5cGUucHJldmlld3MuaW5jbHVkZXMocHJldmlldykpXG4gICAgICAgICAgICAuY29uY2F0KG1lcmdlZE9wdGlvbnMubWVkaWFUeXBlLnByZXZpZXdzKTtcbiAgICB9XG4gICAgbWVyZ2VkT3B0aW9ucy5tZWRpYVR5cGUucHJldmlld3MgPSBtZXJnZWRPcHRpb25zLm1lZGlhVHlwZS5wcmV2aWV3cy5tYXAoKHByZXZpZXcpID0+IHByZXZpZXcucmVwbGFjZSgvLXByZXZpZXcvLCBcIlwiKSk7XG4gICAgcmV0dXJuIG1lcmdlZE9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGFkZFF1ZXJ5UGFyYW1ldGVycyh1cmwsIHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBzZXBhcmF0b3IgPSAvXFw/Ly50ZXN0KHVybCkgPyBcIiZcIiA6IFwiP1wiO1xuICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMocGFyYW1ldGVycyk7XG4gICAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cbiAgICByZXR1cm4gKHVybCArXG4gICAgICAgIHNlcGFyYXRvciArXG4gICAgICAgIG5hbWVzXG4gICAgICAgICAgICAubWFwKChuYW1lKSA9PiB7XG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gXCJxXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFwicT1cIiArIHBhcmFtZXRlcnMucS5zcGxpdChcIitcIikubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbihcIitcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGAke25hbWV9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtZXRlcnNbbmFtZV0pfWA7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbihcIiZcIikpO1xufVxuXG5jb25zdCB1cmxWYXJpYWJsZVJlZ2V4ID0gL1xce1tefV0rXFx9L2c7XG5mdW5jdGlvbiByZW1vdmVOb25DaGFycyh2YXJpYWJsZU5hbWUpIHtcbiAgICByZXR1cm4gdmFyaWFibGVOYW1lLnJlcGxhY2UoL15cXFcrfFxcVyskL2csIFwiXCIpLnNwbGl0KC8sLyk7XG59XG5mdW5jdGlvbiBleHRyYWN0VXJsVmFyaWFibGVOYW1lcyh1cmwpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gdXJsLm1hdGNoKHVybFZhcmlhYmxlUmVnZXgpO1xuICAgIGlmICghbWF0Y2hlcykge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVzLm1hcChyZW1vdmVOb25DaGFycykucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pO1xufVxuXG5mdW5jdGlvbiBvbWl0KG9iamVjdCwga2V5c1RvT21pdCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3QpXG4gICAgICAgIC5maWx0ZXIoKG9wdGlvbikgPT4gIWtleXNUb09taXQuaW5jbHVkZXMob3B0aW9uKSlcbiAgICAgICAgLnJlZHVjZSgob2JqLCBrZXkpID0+IHtcbiAgICAgICAgb2JqW2tleV0gPSBvYmplY3Rba2V5XTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9LCB7fSk7XG59XG5cbi8vIEJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9icmFtc3RlaW4vdXJsLXRlbXBsYXRlLCBsaWNlbnNlZCB1bmRlciBCU0Rcbi8vIFRPRE86IGNyZWF0ZSBzZXBhcmF0ZSBwYWNrYWdlLlxuLy9cbi8vIENvcHlyaWdodCAoYykgMjAxMi0yMDE0LCBCcmFtIFN0ZWluXG4vLyBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnNcbi8vIGFyZSBtZXQ6XG4vLyAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbi8vICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4vLyAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbi8vICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4vLyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbi8vICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHNcbi8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbi8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRURcbi8vIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOT1xuLy8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULFxuLy8gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsXG4vLyBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWVxuLy8gT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbi8vIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcbi8vIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZSAqL1xuZnVuY3Rpb24gZW5jb2RlUmVzZXJ2ZWQoc3RyKSB7XG4gICAgcmV0dXJuIHN0clxuICAgICAgICAuc3BsaXQoLyglWzAtOUEtRmEtZl17Mn0pL2cpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKHBhcnQpIHtcbiAgICAgICAgaWYgKCEvJVswLTlBLUZhLWZdLy50ZXN0KHBhcnQpKSB7XG4gICAgICAgICAgICBwYXJ0ID0gZW5jb2RlVVJJKHBhcnQpLnJlcGxhY2UoLyU1Qi9nLCBcIltcIikucmVwbGFjZSgvJTVEL2csIFwiXVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFydDtcbiAgICB9KVxuICAgICAgICAuam9pbihcIlwiKTtcbn1cbmZ1bmN0aW9uIGVuY29kZVVucmVzZXJ2ZWQoc3RyKSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoL1shJygpKl0vZywgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgcmV0dXJuIFwiJVwiICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZW5jb2RlVmFsdWUob3BlcmF0b3IsIHZhbHVlLCBrZXkpIHtcbiAgICB2YWx1ZSA9XG4gICAgICAgIG9wZXJhdG9yID09PSBcIitcIiB8fCBvcGVyYXRvciA9PT0gXCIjXCJcbiAgICAgICAgICAgID8gZW5jb2RlUmVzZXJ2ZWQodmFsdWUpXG4gICAgICAgICAgICA6IGVuY29kZVVucmVzZXJ2ZWQodmFsdWUpO1xuICAgIGlmIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVVucmVzZXJ2ZWQoa2V5KSArIFwiPVwiICsgdmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNEZWZpbmVkKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGw7XG59XG5mdW5jdGlvbiBpc0tleU9wZXJhdG9yKG9wZXJhdG9yKSB7XG4gICAgcmV0dXJuIG9wZXJhdG9yID09PSBcIjtcIiB8fCBvcGVyYXRvciA9PT0gXCImXCIgfHwgb3BlcmF0b3IgPT09IFwiP1wiO1xufVxuZnVuY3Rpb24gZ2V0VmFsdWVzKGNvbnRleHQsIG9wZXJhdG9yLCBrZXksIG1vZGlmaWVyKSB7XG4gICAgdmFyIHZhbHVlID0gY29udGV4dFtrZXldLCByZXN1bHQgPSBbXTtcbiAgICBpZiAoaXNEZWZpbmVkKHZhbHVlKSAmJiB2YWx1ZSAhPT0gXCJcIikge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGlmIChtb2RpZmllciAmJiBtb2RpZmllciAhPT0gXCIqXCIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCBwYXJzZUludChtb2RpZmllciwgMTApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGVuY29kZVZhbHVlKG9wZXJhdG9yLCB2YWx1ZSwgaXNLZXlPcGVyYXRvcihvcGVyYXRvcikgPyBrZXkgOiBcIlwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAobW9kaWZpZXIgPT09IFwiKlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLmZpbHRlcihpc0RlZmluZWQpLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChlbmNvZGVWYWx1ZShvcGVyYXRvciwgdmFsdWUsIGlzS2V5T3BlcmF0b3Iob3BlcmF0b3IpID8ga2V5IDogXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZWZpbmVkKHZhbHVlW2tdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGVuY29kZVZhbHVlKG9wZXJhdG9yLCB2YWx1ZVtrXSwgaykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0bXAgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuZmlsdGVyKGlzRGVmaW5lZCkuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcC5wdXNoKGVuY29kZVZhbHVlKG9wZXJhdG9yLCB2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZWZpbmVkKHZhbHVlW2tdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcC5wdXNoKGVuY29kZVVucmVzZXJ2ZWQoaykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcC5wdXNoKGVuY29kZVZhbHVlKG9wZXJhdG9yLCB2YWx1ZVtrXS50b1N0cmluZygpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNLZXlPcGVyYXRvcihvcGVyYXRvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZW5jb2RlVW5yZXNlcnZlZChrZXkpICsgXCI9XCIgKyB0bXAuam9pbihcIixcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0bXAubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRtcC5qb2luKFwiLFwiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAob3BlcmF0b3IgPT09IFwiO1wiKSB7XG4gICAgICAgICAgICBpZiAoaXNEZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGVuY29kZVVucmVzZXJ2ZWQoa2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUgPT09IFwiXCIgJiYgKG9wZXJhdG9yID09PSBcIiZcIiB8fCBvcGVyYXRvciA9PT0gXCI/XCIpKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChlbmNvZGVVbnJlc2VydmVkKGtleSkgKyBcIj1cIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFwiXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBwYXJzZVVybCh0ZW1wbGF0ZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGV4cGFuZDogZXhwYW5kLmJpbmQobnVsbCwgdGVtcGxhdGUpLFxuICAgIH07XG59XG5mdW5jdGlvbiBleHBhbmQodGVtcGxhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgb3BlcmF0b3JzID0gW1wiK1wiLCBcIiNcIiwgXCIuXCIsIFwiL1wiLCBcIjtcIiwgXCI/XCIsIFwiJlwiXTtcbiAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgvXFx7KFteXFx7XFx9XSspXFx9fChbXlxce1xcfV0rKS9nLCBmdW5jdGlvbiAoXywgZXhwcmVzc2lvbiwgbGl0ZXJhbCkge1xuICAgICAgICBpZiAoZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgbGV0IG9wZXJhdG9yID0gXCJcIjtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgaWYgKG9wZXJhdG9ycy5pbmRleE9mKGV4cHJlc3Npb24uY2hhckF0KDApKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRvciA9IGV4cHJlc3Npb24uY2hhckF0KDApO1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnN1YnN0cigxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV4cHJlc3Npb24uc3BsaXQoLywvZykuZm9yRWFjaChmdW5jdGlvbiAodmFyaWFibGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG1wID0gLyhbXjpcXCpdKikoPzo6KFxcZCspfChcXCopKT8vLmV4ZWModmFyaWFibGUpO1xuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKGdldFZhbHVlcyhjb250ZXh0LCBvcGVyYXRvciwgdG1wWzFdLCB0bXBbMl0gfHwgdG1wWzNdKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChvcGVyYXRvciAmJiBvcGVyYXRvciAhPT0gXCIrXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2VwYXJhdG9yID0gXCIsXCI7XG4gICAgICAgICAgICAgICAgaWYgKG9wZXJhdG9yID09PSBcIj9cIikge1xuICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3IgPSBcIiZcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob3BlcmF0b3IgIT09IFwiI1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvciA9IG9wZXJhdG9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlcy5sZW5ndGggIT09IDAgPyBvcGVyYXRvciA6IFwiXCIpICsgdmFsdWVzLmpvaW4oc2VwYXJhdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXMuam9pbihcIixcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlUmVzZXJ2ZWQobGl0ZXJhbCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2Uob3B0aW9ucykge1xuICAgIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNtZXRob2RzXG4gICAgbGV0IG1ldGhvZCA9IG9wdGlvbnMubWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gICAgLy8gcmVwbGFjZSA6dmFybmFtZSB3aXRoIHt2YXJuYW1lfSB0byBtYWtlIGl0IFJGQyA2NTcwIGNvbXBhdGlibGVcbiAgICBsZXQgdXJsID0gKG9wdGlvbnMudXJsIHx8IFwiL1wiKS5yZXBsYWNlKC86KFthLXpdXFx3KykvZywgXCJ7JDF9XCIpO1xuICAgIGxldCBoZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5oZWFkZXJzKTtcbiAgICBsZXQgYm9keTtcbiAgICBsZXQgcGFyYW1ldGVycyA9IG9taXQob3B0aW9ucywgW1xuICAgICAgICBcIm1ldGhvZFwiLFxuICAgICAgICBcImJhc2VVcmxcIixcbiAgICAgICAgXCJ1cmxcIixcbiAgICAgICAgXCJoZWFkZXJzXCIsXG4gICAgICAgIFwicmVxdWVzdFwiLFxuICAgICAgICBcIm1lZGlhVHlwZVwiLFxuICAgIF0pO1xuICAgIC8vIGV4dHJhY3QgdmFyaWFibGUgbmFtZXMgZnJvbSBVUkwgdG8gY2FsY3VsYXRlIHJlbWFpbmluZyB2YXJpYWJsZXMgbGF0ZXJcbiAgICBjb25zdCB1cmxWYXJpYWJsZU5hbWVzID0gZXh0cmFjdFVybFZhcmlhYmxlTmFtZXModXJsKTtcbiAgICB1cmwgPSBwYXJzZVVybCh1cmwpLmV4cGFuZChwYXJhbWV0ZXJzKTtcbiAgICBpZiAoIS9eaHR0cC8udGVzdCh1cmwpKSB7XG4gICAgICAgIHVybCA9IG9wdGlvbnMuYmFzZVVybCArIHVybDtcbiAgICB9XG4gICAgY29uc3Qgb21pdHRlZFBhcmFtZXRlcnMgPSBPYmplY3Qua2V5cyhvcHRpb25zKVxuICAgICAgICAuZmlsdGVyKChvcHRpb24pID0+IHVybFZhcmlhYmxlTmFtZXMuaW5jbHVkZXMob3B0aW9uKSlcbiAgICAgICAgLmNvbmNhdChcImJhc2VVcmxcIik7XG4gICAgY29uc3QgcmVtYWluaW5nUGFyYW1ldGVycyA9IG9taXQocGFyYW1ldGVycywgb21pdHRlZFBhcmFtZXRlcnMpO1xuICAgIGNvbnN0IGlzQmluYXJ5UmVxdWVzdCA9IC9hcHBsaWNhdGlvblxcL29jdGV0LXN0cmVhbS9pLnRlc3QoaGVhZGVycy5hY2NlcHQpO1xuICAgIGlmICghaXNCaW5hcnlSZXF1ZXN0KSB7XG4gICAgICAgIGlmIChvcHRpb25zLm1lZGlhVHlwZS5mb3JtYXQpIHtcbiAgICAgICAgICAgIC8vIGUuZy4gYXBwbGljYXRpb24vdm5kLmdpdGh1Yi52Mytqc29uID0+IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMucmF3XG4gICAgICAgICAgICBoZWFkZXJzLmFjY2VwdCA9IGhlYWRlcnMuYWNjZXB0XG4gICAgICAgICAgICAgICAgLnNwbGl0KC8sLylcbiAgICAgICAgICAgICAgICAubWFwKChwcmV2aWV3KSA9PiBwcmV2aWV3LnJlcGxhY2UoL2FwcGxpY2F0aW9uXFwvdm5kKFxcLlxcdyspKFxcLnYzKT8oXFwuXFx3Kyk/KFxcK2pzb24pPyQvLCBgYXBwbGljYXRpb24vdm5kJDEkMi4ke29wdGlvbnMubWVkaWFUeXBlLmZvcm1hdH1gKSlcbiAgICAgICAgICAgICAgICAuam9pbihcIixcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMubWVkaWFUeXBlLnByZXZpZXdzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcHJldmlld3NGcm9tQWNjZXB0SGVhZGVyID0gaGVhZGVycy5hY2NlcHQubWF0Y2goL1tcXHctXSsoPz0tcHJldmlldykvZykgfHwgW107XG4gICAgICAgICAgICBoZWFkZXJzLmFjY2VwdCA9IHByZXZpZXdzRnJvbUFjY2VwdEhlYWRlclxuICAgICAgICAgICAgICAgIC5jb25jYXQob3B0aW9ucy5tZWRpYVR5cGUucHJldmlld3MpXG4gICAgICAgICAgICAgICAgLm1hcCgocHJldmlldykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdCA9IG9wdGlvbnMubWVkaWFUeXBlLmZvcm1hdFxuICAgICAgICAgICAgICAgICAgICA/IGAuJHtvcHRpb25zLm1lZGlhVHlwZS5mb3JtYXR9YFxuICAgICAgICAgICAgICAgICAgICA6IFwiK2pzb25cIjtcbiAgICAgICAgICAgICAgICByZXR1cm4gYGFwcGxpY2F0aW9uL3ZuZC5naXRodWIuJHtwcmV2aWV3fS1wcmV2aWV3JHtmb3JtYXR9YDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oXCIsXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGZvciBHRVQvSEVBRCByZXF1ZXN0cywgc2V0IFVSTCBxdWVyeSBwYXJhbWV0ZXJzIGZyb20gcmVtYWluaW5nIHBhcmFtZXRlcnNcbiAgICAvLyBmb3IgUEFUQ0gvUE9TVC9QVVQvREVMRVRFIHJlcXVlc3RzLCBzZXQgcmVxdWVzdCBib2R5IGZyb20gcmVtYWluaW5nIHBhcmFtZXRlcnNcbiAgICBpZiAoW1wiR0VUXCIsIFwiSEVBRFwiXS5pbmNsdWRlcyhtZXRob2QpKSB7XG4gICAgICAgIHVybCA9IGFkZFF1ZXJ5UGFyYW1ldGVycyh1cmwsIHJlbWFpbmluZ1BhcmFtZXRlcnMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKFwiZGF0YVwiIGluIHJlbWFpbmluZ1BhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIGJvZHkgPSByZW1haW5pbmdQYXJhbWV0ZXJzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMocmVtYWluaW5nUGFyYW1ldGVycykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgYm9keSA9IHJlbWFpbmluZ1BhcmFtZXRlcnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzW1wiY29udGVudC1sZW5ndGhcIl0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGRlZmF1bHQgY29udGVudC10eXBlIGZvciBKU09OIGlmIGJvZHkgaXMgc2V0XG4gICAgaWYgKCFoZWFkZXJzW1wiY29udGVudC10eXBlXCJdICYmIHR5cGVvZiBib2R5ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIjtcbiAgICB9XG4gICAgLy8gR2l0SHViIGV4cGVjdHMgJ2NvbnRlbnQtbGVuZ3RoOiAwJyBoZWFkZXIgZm9yIFBVVC9QQVRDSCByZXF1ZXN0cyB3aXRob3V0IGJvZHkuXG4gICAgLy8gZmV0Y2ggZG9lcyBub3QgYWxsb3cgdG8gc2V0IGBjb250ZW50LWxlbmd0aGAgaGVhZGVyLCBidXQgd2UgY2FuIHNldCBib2R5IHRvIGFuIGVtcHR5IHN0cmluZ1xuICAgIGlmIChbXCJQQVRDSFwiLCBcIlBVVFwiXS5pbmNsdWRlcyhtZXRob2QpICYmIHR5cGVvZiBib2R5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGJvZHkgPSBcIlwiO1xuICAgIH1cbiAgICAvLyBPbmx5IHJldHVybiBib2R5L3JlcXVlc3Qga2V5cyBpZiBwcmVzZW50XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBtZXRob2QsIHVybCwgaGVhZGVycyB9LCB0eXBlb2YgYm9keSAhPT0gXCJ1bmRlZmluZWRcIiA/IHsgYm9keSB9IDogbnVsbCwgb3B0aW9ucy5yZXF1ZXN0ID8geyByZXF1ZXN0OiBvcHRpb25zLnJlcXVlc3QgfSA6IG51bGwpO1xufVxuXG5mdW5jdGlvbiBlbmRwb2ludFdpdGhEZWZhdWx0cyhkZWZhdWx0cywgcm91dGUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gcGFyc2UobWVyZ2UoZGVmYXVsdHMsIHJvdXRlLCBvcHRpb25zKSk7XG59XG5cbmZ1bmN0aW9uIHdpdGhEZWZhdWx0cyhvbGREZWZhdWx0cywgbmV3RGVmYXVsdHMpIHtcbiAgICBjb25zdCBERUZBVUxUUyA9IG1lcmdlKG9sZERlZmF1bHRzLCBuZXdEZWZhdWx0cyk7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBlbmRwb2ludFdpdGhEZWZhdWx0cy5iaW5kKG51bGwsIERFRkFVTFRTKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihlbmRwb2ludCwge1xuICAgICAgICBERUZBVUxUUyxcbiAgICAgICAgZGVmYXVsdHM6IHdpdGhEZWZhdWx0cy5iaW5kKG51bGwsIERFRkFVTFRTKSxcbiAgICAgICAgbWVyZ2U6IG1lcmdlLmJpbmQobnVsbCwgREVGQVVMVFMpLFxuICAgICAgICBwYXJzZSxcbiAgICB9KTtcbn1cblxuY29uc3QgVkVSU0lPTiA9IFwiNi4wLjEyXCI7XG5cbmNvbnN0IHVzZXJBZ2VudCA9IGBvY3Rva2l0LWVuZHBvaW50LmpzLyR7VkVSU0lPTn0gJHtnZXRVc2VyQWdlbnQoKX1gO1xuLy8gREVGQVVMVFMgaGFzIGFsbCBwcm9wZXJ0aWVzIHNldCB0aGF0IEVuZHBvaW50T3B0aW9ucyBoYXMsIGV4Y2VwdCB1cmwuXG4vLyBTbyB3ZSB1c2UgUmVxdWVzdFBhcmFtZXRlcnMgYW5kIGFkZCBtZXRob2QgYXMgYWRkaXRpb25hbCByZXF1aXJlZCBwcm9wZXJ0eS5cbmNvbnN0IERFRkFVTFRTID0ge1xuICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICBiYXNlVXJsOiBcImh0dHBzOi8vYXBpLmdpdGh1Yi5jb21cIixcbiAgICBoZWFkZXJzOiB7XG4gICAgICAgIGFjY2VwdDogXCJhcHBsaWNhdGlvbi92bmQuZ2l0aHViLnYzK2pzb25cIixcbiAgICAgICAgXCJ1c2VyLWFnZW50XCI6IHVzZXJBZ2VudCxcbiAgICB9LFxuICAgIG1lZGlhVHlwZToge1xuICAgICAgICBmb3JtYXQ6IFwiXCIsXG4gICAgICAgIHByZXZpZXdzOiBbXSxcbiAgICB9LFxufTtcblxuY29uc3QgZW5kcG9pbnQgPSB3aXRoRGVmYXVsdHMobnVsbCwgREVGQVVMVFMpO1xuXG5leHBvcnQgeyBlbmRwb2ludCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLCJpbXBvcnQgeyBEZXByZWNhdGlvbiB9IGZyb20gJ2RlcHJlY2F0aW9uJztcbmltcG9ydCBvbmNlIGZyb20gJ29uY2UnO1xuXG5jb25zdCBsb2dPbmNlQ29kZSA9IG9uY2UoKGRlcHJlY2F0aW9uKSA9PiBjb25zb2xlLndhcm4oZGVwcmVjYXRpb24pKTtcbmNvbnN0IGxvZ09uY2VIZWFkZXJzID0gb25jZSgoZGVwcmVjYXRpb24pID0+IGNvbnNvbGUud2FybihkZXByZWNhdGlvbikpO1xuLyoqXG4gKiBFcnJvciB3aXRoIGV4dHJhIHByb3BlcnRpZXMgdG8gaGVscCB3aXRoIGRlYnVnZ2luZ1xuICovXG5jbGFzcyBSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzQ29kZSwgb3B0aW9ucykge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgLy8gTWFpbnRhaW5zIHByb3BlciBzdGFjayB0cmFjZSAob25seSBhdmFpbGFibGUgb24gVjgpXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uYW1lID0gXCJIdHRwRXJyb3JcIjtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXNDb2RlO1xuICAgICAgICBsZXQgaGVhZGVycztcbiAgICAgICAgaWYgKFwiaGVhZGVyc1wiIGluIG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMuaGVhZGVycyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycztcbiAgICAgICAgfVxuICAgICAgICBpZiAoXCJyZXNwb25zZVwiIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2UgPSBvcHRpb25zLnJlc3BvbnNlO1xuICAgICAgICAgICAgaGVhZGVycyA9IG9wdGlvbnMucmVzcG9uc2UuaGVhZGVycztcbiAgICAgICAgfVxuICAgICAgICAvLyByZWRhY3QgcmVxdWVzdCBjcmVkZW50aWFscyB3aXRob3V0IG11dGF0aW5nIG9yaWdpbmFsIHJlcXVlc3Qgb3B0aW9uc1xuICAgICAgICBjb25zdCByZXF1ZXN0Q29weSA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMucmVxdWVzdCk7XG4gICAgICAgIGlmIChvcHRpb25zLnJlcXVlc3QuaGVhZGVycy5hdXRob3JpemF0aW9uKSB7XG4gICAgICAgICAgICByZXF1ZXN0Q29weS5oZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMsIHtcbiAgICAgICAgICAgICAgICBhdXRob3JpemF0aW9uOiBvcHRpb25zLnJlcXVlc3QuaGVhZGVycy5hdXRob3JpemF0aW9uLnJlcGxhY2UoLyAuKiQvLCBcIiBbUkVEQUNURURdXCIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdENvcHkudXJsID0gcmVxdWVzdENvcHkudXJsXG4gICAgICAgICAgICAvLyBjbGllbnRfaWQgJiBjbGllbnRfc2VjcmV0IGNhbiBiZSBwYXNzZWQgYXMgVVJMIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gaW5jcmVhc2UgcmF0ZSBsaW1pdFxuICAgICAgICAgICAgLy8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvI2luY3JlYXNpbmctdGhlLXVuYXV0aGVudGljYXRlZC1yYXRlLWxpbWl0LWZvci1vYXV0aC1hcHBsaWNhdGlvbnNcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXGJjbGllbnRfc2VjcmV0PVxcdysvZywgXCJjbGllbnRfc2VjcmV0PVtSRURBQ1RFRF1cIilcbiAgICAgICAgICAgIC8vIE9BdXRoIHRva2VucyBjYW4gYmUgcGFzc2VkIGFzIFVSTCBxdWVyeSBwYXJhbWV0ZXJzLCBhbHRob3VnaCBpdCBpcyBub3QgcmVjb21tZW5kZWRcbiAgICAgICAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzLyNvYXV0aDItdG9rZW4tc2VudC1pbi1hLWhlYWRlclxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcYmFjY2Vzc190b2tlbj1cXHcrL2csIFwiYWNjZXNzX3Rva2VuPVtSRURBQ1RFRF1cIik7XG4gICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3RDb3B5O1xuICAgICAgICAvLyBkZXByZWNhdGlvbnNcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiY29kZVwiLCB7XG4gICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgbG9nT25jZUNvZGUobmV3IERlcHJlY2F0aW9uKFwiW0BvY3Rva2l0L3JlcXVlc3QtZXJyb3JdIGBlcnJvci5jb2RlYCBpcyBkZXByZWNhdGVkLCB1c2UgYGVycm9yLnN0YXR1c2AuXCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzQ29kZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJoZWFkZXJzXCIsIHtcbiAgICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgICAgICBsb2dPbmNlSGVhZGVycyhuZXcgRGVwcmVjYXRpb24oXCJbQG9jdG9raXQvcmVxdWVzdC1lcnJvcl0gYGVycm9yLmhlYWRlcnNgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgZXJyb3IucmVzcG9uc2UuaGVhZGVyc2AuXCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGVhZGVycyB8fCB7fTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgUmVxdWVzdEVycm9yIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsImltcG9ydCB7IGVuZHBvaW50IH0gZnJvbSAnQG9jdG9raXQvZW5kcG9pbnQnO1xuaW1wb3J0IHsgZ2V0VXNlckFnZW50IH0gZnJvbSAndW5pdmVyc2FsLXVzZXItYWdlbnQnO1xuaW1wb3J0IHsgaXNQbGFpbk9iamVjdCB9IGZyb20gJ2lzLXBsYWluLW9iamVjdCc7XG5pbXBvcnQgbm9kZUZldGNoIGZyb20gJ25vZGUtZmV0Y2gnO1xuaW1wb3J0IHsgUmVxdWVzdEVycm9yIH0gZnJvbSAnQG9jdG9raXQvcmVxdWVzdC1lcnJvcic7XG5cbmNvbnN0IFZFUlNJT04gPSBcIjUuNi4zXCI7XG5cbmZ1bmN0aW9uIGdldEJ1ZmZlclJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XG59XG5cbmZ1bmN0aW9uIGZldGNoV3JhcHBlcihyZXF1ZXN0T3B0aW9ucykge1xuICAgIGNvbnN0IGxvZyA9IHJlcXVlc3RPcHRpb25zLnJlcXVlc3QgJiYgcmVxdWVzdE9wdGlvbnMucmVxdWVzdC5sb2dcbiAgICAgICAgPyByZXF1ZXN0T3B0aW9ucy5yZXF1ZXN0LmxvZ1xuICAgICAgICA6IGNvbnNvbGU7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QocmVxdWVzdE9wdGlvbnMuYm9keSkgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheShyZXF1ZXN0T3B0aW9ucy5ib2R5KSkge1xuICAgICAgICByZXF1ZXN0T3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocmVxdWVzdE9wdGlvbnMuYm9keSk7XG4gICAgfVxuICAgIGxldCBoZWFkZXJzID0ge307XG4gICAgbGV0IHN0YXR1cztcbiAgICBsZXQgdXJsO1xuICAgIGNvbnN0IGZldGNoID0gKHJlcXVlc3RPcHRpb25zLnJlcXVlc3QgJiYgcmVxdWVzdE9wdGlvbnMucmVxdWVzdC5mZXRjaCkgfHwgbm9kZUZldGNoO1xuICAgIHJldHVybiBmZXRjaChyZXF1ZXN0T3B0aW9ucy51cmwsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBtZXRob2Q6IHJlcXVlc3RPcHRpb25zLm1ldGhvZCxcbiAgICAgICAgYm9keTogcmVxdWVzdE9wdGlvbnMuYm9keSxcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdE9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgcmVkaXJlY3Q6IHJlcXVlc3RPcHRpb25zLnJlZGlyZWN0LFxuICAgIH0sIFxuICAgIC8vIGByZXF1ZXN0T3B0aW9ucy5yZXF1ZXN0LmFnZW50YCB0eXBlIGlzIGluY29tcGF0aWJsZVxuICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vb2N0b2tpdC90eXBlcy50cy9wdWxsLzI2NFxuICAgIHJlcXVlc3RPcHRpb25zLnJlcXVlc3QpKVxuICAgICAgICAudGhlbihhc3luYyAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdXJsID0gcmVzcG9uc2UudXJsO1xuICAgICAgICBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGZvciAoY29uc3Qga2V5QW5kVmFsdWUgb2YgcmVzcG9uc2UuaGVhZGVycykge1xuICAgICAgICAgICAgaGVhZGVyc1trZXlBbmRWYWx1ZVswXV0gPSBrZXlBbmRWYWx1ZVsxXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXCJkZXByZWNhdGlvblwiIGluIGhlYWRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBoZWFkZXJzLmxpbmsgJiYgaGVhZGVycy5saW5rLm1hdGNoKC88KFtePl0rKT47IHJlbD1cImRlcHJlY2F0aW9uXCIvKTtcbiAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0aW9uTGluayA9IG1hdGNoZXMgJiYgbWF0Y2hlcy5wb3AoKTtcbiAgICAgICAgICAgIGxvZy53YXJuKGBbQG9jdG9raXQvcmVxdWVzdF0gXCIke3JlcXVlc3RPcHRpb25zLm1ldGhvZH0gJHtyZXF1ZXN0T3B0aW9ucy51cmx9XCIgaXMgZGVwcmVjYXRlZC4gSXQgaXMgc2NoZWR1bGVkIHRvIGJlIHJlbW92ZWQgb24gJHtoZWFkZXJzLnN1bnNldH0ke2RlcHJlY2F0aW9uTGluayA/IGAuIFNlZSAke2RlcHJlY2F0aW9uTGlua31gIDogXCJcIn1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDQgfHwgc3RhdHVzID09PSAyMDUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBHaXRIdWIgQVBJIHJldHVybnMgMjAwIGZvciBIRUFEIHJlcXVlc3RzXG4gICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5tZXRob2QgPT09IFwiSEVBRFwiKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzIDwgNDAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJlcXVlc3RFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0LCBzdGF0dXMsIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVxdWVzdDogcmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdHVzID09PSAzMDQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSZXF1ZXN0RXJyb3IoXCJOb3QgbW9kaWZpZWRcIiwgc3RhdHVzLCB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGF3YWl0IGdldFJlc3BvbnNlRGF0YShyZXNwb25zZSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0OiByZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgZ2V0UmVzcG9uc2VEYXRhKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFJlcXVlc3RFcnJvcih0b0Vycm9yTWVzc2FnZShkYXRhKSwgc3RhdHVzLCB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0OiByZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldFJlc3BvbnNlRGF0YShyZXNwb25zZSk7XG4gICAgfSlcbiAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICB9O1xuICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgUmVxdWVzdEVycm9yKVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIHRocm93IG5ldyBSZXF1ZXN0RXJyb3IoZXJyb3IubWVzc2FnZSwgNTAwLCB7XG4gICAgICAgICAgICByZXF1ZXN0OiByZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRSZXNwb25zZURhdGEocmVzcG9uc2UpIHtcbiAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpO1xuICAgIGlmICgvYXBwbGljYXRpb25cXC9qc29uLy50ZXN0KGNvbnRlbnRUeXBlKSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgIH1cbiAgICBpZiAoIWNvbnRlbnRUeXBlIHx8IC9edGV4dFxcL3xjaGFyc2V0PXV0Zi04JC8udGVzdChjb250ZW50VHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGdldEJ1ZmZlclJlc3BvbnNlKHJlc3BvbnNlKTtcbn1cbmZ1bmN0aW9uIHRvRXJyb3JNZXNzYWdlKGRhdGEpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlIC0ganVzdCBpbiBjYXNlXG4gICAgaWYgKFwibWVzc2FnZVwiIGluIGRhdGEpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YS5lcnJvcnMpKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7ZGF0YS5tZXNzYWdlfTogJHtkYXRhLmVycm9ycy5tYXAoSlNPTi5zdHJpbmdpZnkpLmpvaW4oXCIsIFwiKX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhLm1lc3NhZ2U7XG4gICAgfVxuICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0ganVzdCBpbiBjYXNlXG4gICAgcmV0dXJuIGBVbmtub3duIGVycm9yOiAke0pTT04uc3RyaW5naWZ5KGRhdGEpfWA7XG59XG5cbmZ1bmN0aW9uIHdpdGhEZWZhdWx0cyhvbGRFbmRwb2ludCwgbmV3RGVmYXVsdHMpIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IG9sZEVuZHBvaW50LmRlZmF1bHRzKG5ld0RlZmF1bHRzKTtcbiAgICBjb25zdCBuZXdBcGkgPSBmdW5jdGlvbiAocm91dGUsIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgY29uc3QgZW5kcG9pbnRPcHRpb25zID0gZW5kcG9pbnQubWVyZ2Uocm91dGUsIHBhcmFtZXRlcnMpO1xuICAgICAgICBpZiAoIWVuZHBvaW50T3B0aW9ucy5yZXF1ZXN0IHx8ICFlbmRwb2ludE9wdGlvbnMucmVxdWVzdC5ob29rKSB7XG4gICAgICAgICAgICByZXR1cm4gZmV0Y2hXcmFwcGVyKGVuZHBvaW50LnBhcnNlKGVuZHBvaW50T3B0aW9ucykpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSAocm91dGUsIHBhcmFtZXRlcnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmZXRjaFdyYXBwZXIoZW5kcG9pbnQucGFyc2UoZW5kcG9pbnQubWVyZ2Uocm91dGUsIHBhcmFtZXRlcnMpKSk7XG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocmVxdWVzdCwge1xuICAgICAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgICAgICBkZWZhdWx0czogd2l0aERlZmF1bHRzLmJpbmQobnVsbCwgZW5kcG9pbnQpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGVuZHBvaW50T3B0aW9ucy5yZXF1ZXN0Lmhvb2socmVxdWVzdCwgZW5kcG9pbnRPcHRpb25zKTtcbiAgICB9O1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ld0FwaSwge1xuICAgICAgICBlbmRwb2ludCxcbiAgICAgICAgZGVmYXVsdHM6IHdpdGhEZWZhdWx0cy5iaW5kKG51bGwsIGVuZHBvaW50KSxcbiAgICB9KTtcbn1cblxuY29uc3QgcmVxdWVzdCA9IHdpdGhEZWZhdWx0cyhlbmRwb2ludCwge1xuICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJ1c2VyLWFnZW50XCI6IGBvY3Rva2l0LXJlcXVlc3QuanMvJHtWRVJTSU9OfSAke2dldFVzZXJBZ2VudCgpfWAsXG4gICAgfSxcbn0pO1xuXG5leHBvcnQgeyByZXF1ZXN0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsImltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICdAb2N0b2tpdC9yZXF1ZXN0JztcbmltcG9ydCB7IGdldFVzZXJBZ2VudCB9IGZyb20gJ3VuaXZlcnNhbC11c2VyLWFnZW50JztcblxuY29uc3QgVkVSU0lPTiA9IFwiNC44LjBcIjtcblxuZnVuY3Rpb24gX2J1aWxkTWVzc2FnZUZvclJlc3BvbnNlRXJyb3JzKGRhdGEpIHtcbiAgICByZXR1cm4gKGBSZXF1ZXN0IGZhaWxlZCBkdWUgdG8gZm9sbG93aW5nIHJlc3BvbnNlIGVycm9yczpcXG5gICtcbiAgICAgICAgZGF0YS5lcnJvcnMubWFwKChlKSA9PiBgIC0gJHtlLm1lc3NhZ2V9YCkuam9pbihcIlxcblwiKSk7XG59XG5jbGFzcyBHcmFwaHFsUmVzcG9uc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihyZXF1ZXN0LCBoZWFkZXJzLCByZXNwb25zZSkge1xuICAgICAgICBzdXBlcihfYnVpbGRNZXNzYWdlRm9yUmVzcG9uc2VFcnJvcnMocmVzcG9uc2UpKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkdyYXBocWxSZXNwb25zZUVycm9yXCI7XG4gICAgICAgIC8vIEV4cG9zZSB0aGUgZXJyb3JzIGFuZCByZXNwb25zZSBkYXRhIGluIHRoZWlyIHNob3J0aGFuZCBwcm9wZXJ0aWVzLlxuICAgICAgICB0aGlzLmVycm9ycyA9IHJlc3BvbnNlLmVycm9ycztcbiAgICAgICAgdGhpcy5kYXRhID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgLy8gTWFpbnRhaW5zIHByb3BlciBzdGFjayB0cmFjZSAob25seSBhdmFpbGFibGUgb24gVjgpXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNvbnN0IE5PTl9WQVJJQUJMRV9PUFRJT05TID0gW1xuICAgIFwibWV0aG9kXCIsXG4gICAgXCJiYXNlVXJsXCIsXG4gICAgXCJ1cmxcIixcbiAgICBcImhlYWRlcnNcIixcbiAgICBcInJlcXVlc3RcIixcbiAgICBcInF1ZXJ5XCIsXG4gICAgXCJtZWRpYVR5cGVcIixcbl07XG5jb25zdCBGT1JCSURERU5fVkFSSUFCTEVfT1BUSU9OUyA9IFtcInF1ZXJ5XCIsIFwibWV0aG9kXCIsIFwidXJsXCJdO1xuY29uc3QgR0hFU19WM19TVUZGSVhfUkVHRVggPSAvXFwvYXBpXFwvdjNcXC8/JC87XG5mdW5jdGlvbiBncmFwaHFsKHJlcXVlc3QsIHF1ZXJ5LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIiAmJiBcInF1ZXJ5XCIgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgW0BvY3Rva2l0L2dyYXBocWxdIFwicXVlcnlcIiBjYW5ub3QgYmUgdXNlZCBhcyB2YXJpYWJsZSBuYW1lYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICghRk9SQklEREVOX1ZBUklBQkxFX09QVElPTlMuaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFtAb2N0b2tpdC9ncmFwaHFsXSBcIiR7a2V5fVwiIGNhbm5vdCBiZSB1c2VkIGFzIHZhcmlhYmxlIG5hbWVgKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcGFyc2VkT3B0aW9ucyA9IHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIiA/IE9iamVjdC5hc3NpZ24oeyBxdWVyeSB9LCBvcHRpb25zKSA6IHF1ZXJ5O1xuICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0gT2JqZWN0LmtleXMocGFyc2VkT3B0aW9ucykucmVkdWNlKChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgICBpZiAoTk9OX1ZBUklBQkxFX09QVElPTlMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBwYXJzZWRPcHRpb25zW2tleV07XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVzdWx0LnZhcmlhYmxlcykge1xuICAgICAgICAgICAgcmVzdWx0LnZhcmlhYmxlcyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC52YXJpYWJsZXNba2V5XSA9IHBhcnNlZE9wdGlvbnNba2V5XTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCB7fSk7XG4gICAgLy8gd29ya2Fyb3VuZCBmb3IgR2l0SHViIEVudGVycHJpc2UgYmFzZVVybCBzZXQgd2l0aCAvYXBpL3YzIHN1ZmZpeFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9vY3Rva2l0L2F1dGgtYXBwLmpzL2lzc3Vlcy8xMTEjaXNzdWVjb21tZW50LTY1NzYxMDQ1MVxuICAgIGNvbnN0IGJhc2VVcmwgPSBwYXJzZWRPcHRpb25zLmJhc2VVcmwgfHwgcmVxdWVzdC5lbmRwb2ludC5ERUZBVUxUUy5iYXNlVXJsO1xuICAgIGlmIChHSEVTX1YzX1NVRkZJWF9SRUdFWC50ZXN0KGJhc2VVcmwpKSB7XG4gICAgICAgIHJlcXVlc3RPcHRpb25zLnVybCA9IGJhc2VVcmwucmVwbGFjZShHSEVTX1YzX1NVRkZJWF9SRUdFWCwgXCIvYXBpL2dyYXBocWxcIik7XG4gICAgfVxuICAgIHJldHVybiByZXF1ZXN0KHJlcXVlc3RPcHRpb25zKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5lcnJvcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3BvbnNlLmhlYWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVyc1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXBocWxSZXNwb25zZUVycm9yKHJlcXVlc3RPcHRpb25zLCBoZWFkZXJzLCByZXNwb25zZS5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS5kYXRhO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiB3aXRoRGVmYXVsdHMocmVxdWVzdCQxLCBuZXdEZWZhdWx0cykge1xuICAgIGNvbnN0IG5ld1JlcXVlc3QgPSByZXF1ZXN0JDEuZGVmYXVsdHMobmV3RGVmYXVsdHMpO1xuICAgIGNvbnN0IG5ld0FwaSA9IChxdWVyeSwgb3B0aW9ucykgPT4ge1xuICAgICAgICByZXR1cm4gZ3JhcGhxbChuZXdSZXF1ZXN0LCBxdWVyeSwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXdBcGksIHtcbiAgICAgICAgZGVmYXVsdHM6IHdpdGhEZWZhdWx0cy5iaW5kKG51bGwsIG5ld1JlcXVlc3QpLFxuICAgICAgICBlbmRwb2ludDogcmVxdWVzdC5lbmRwb2ludCxcbiAgICB9KTtcbn1cblxuY29uc3QgZ3JhcGhxbCQxID0gd2l0aERlZmF1bHRzKHJlcXVlc3QsIHtcbiAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwidXNlci1hZ2VudFwiOiBgb2N0b2tpdC1ncmFwaHFsLmpzLyR7VkVSU0lPTn0gJHtnZXRVc2VyQWdlbnQoKX1gLFxuICAgIH0sXG4gICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICB1cmw6IFwiL2dyYXBocWxcIixcbn0pO1xuZnVuY3Rpb24gd2l0aEN1c3RvbVJlcXVlc3QoY3VzdG9tUmVxdWVzdCkge1xuICAgIHJldHVybiB3aXRoRGVmYXVsdHMoY3VzdG9tUmVxdWVzdCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICB1cmw6IFwiL2dyYXBocWxcIixcbiAgICB9KTtcbn1cblxuZXhwb3J0IHsgR3JhcGhxbFJlc3BvbnNlRXJyb3IsIGdyYXBocWwkMSBhcyBncmFwaHFsLCB3aXRoQ3VzdG9tUmVxdWVzdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLCJjb25zdCBSRUdFWF9JU19JTlNUQUxMQVRJT05fTEVHQUNZID0gL152MVxcLi87XG5jb25zdCBSRUdFWF9JU19JTlNUQUxMQVRJT04gPSAvXmdoc18vO1xuY29uc3QgUkVHRVhfSVNfVVNFUl9UT19TRVJWRVIgPSAvXmdodV8vO1xuYXN5bmMgZnVuY3Rpb24gYXV0aCh0b2tlbikge1xuICAgIGNvbnN0IGlzQXBwID0gdG9rZW4uc3BsaXQoL1xcLi8pLmxlbmd0aCA9PT0gMztcbiAgICBjb25zdCBpc0luc3RhbGxhdGlvbiA9IFJFR0VYX0lTX0lOU1RBTExBVElPTl9MRUdBQ1kudGVzdCh0b2tlbikgfHxcbiAgICAgICAgUkVHRVhfSVNfSU5TVEFMTEFUSU9OLnRlc3QodG9rZW4pO1xuICAgIGNvbnN0IGlzVXNlclRvU2VydmVyID0gUkVHRVhfSVNfVVNFUl9UT19TRVJWRVIudGVzdCh0b2tlbik7XG4gICAgY29uc3QgdG9rZW5UeXBlID0gaXNBcHBcbiAgICAgICAgPyBcImFwcFwiXG4gICAgICAgIDogaXNJbnN0YWxsYXRpb25cbiAgICAgICAgICAgID8gXCJpbnN0YWxsYXRpb25cIlxuICAgICAgICAgICAgOiBpc1VzZXJUb1NlcnZlclxuICAgICAgICAgICAgICAgID8gXCJ1c2VyLXRvLXNlcnZlclwiXG4gICAgICAgICAgICAgICAgOiBcIm9hdXRoXCI7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJ0b2tlblwiLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIHRva2VuVHlwZSxcbiAgICB9O1xufVxuXG4vKipcbiAqIFByZWZpeCB0b2tlbiBmb3IgdXNhZ2UgaW4gdGhlIEF1dGhvcml6YXRpb24gaGVhZGVyXG4gKlxuICogQHBhcmFtIHRva2VuIE9BdXRoIHRva2VuIG9yIEpTT04gV2ViIFRva2VuXG4gKi9cbmZ1bmN0aW9uIHdpdGhBdXRob3JpemF0aW9uUHJlZml4KHRva2VuKSB7XG4gICAgaWYgKHRva2VuLnNwbGl0KC9cXC4vKS5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuIGBiZWFyZXIgJHt0b2tlbn1gO1xuICAgIH1cbiAgICByZXR1cm4gYHRva2VuICR7dG9rZW59YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaG9vayh0b2tlbiwgcmVxdWVzdCwgcm91dGUsIHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IHJlcXVlc3QuZW5kcG9pbnQubWVyZ2Uocm91dGUsIHBhcmFtZXRlcnMpO1xuICAgIGVuZHBvaW50LmhlYWRlcnMuYXV0aG9yaXphdGlvbiA9IHdpdGhBdXRob3JpemF0aW9uUHJlZml4KHRva2VuKTtcbiAgICByZXR1cm4gcmVxdWVzdChlbmRwb2ludCk7XG59XG5cbmNvbnN0IGNyZWF0ZVRva2VuQXV0aCA9IGZ1bmN0aW9uIGNyZWF0ZVRva2VuQXV0aCh0b2tlbikge1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW0BvY3Rva2l0L2F1dGgtdG9rZW5dIE5vIHRva2VuIHBhc3NlZCB0byBjcmVhdGVUb2tlbkF1dGhcIik7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdG9rZW4gIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW0BvY3Rva2l0L2F1dGgtdG9rZW5dIFRva2VuIHBhc3NlZCB0byBjcmVhdGVUb2tlbkF1dGggaXMgbm90IGEgc3RyaW5nXCIpO1xuICAgIH1cbiAgICB0b2tlbiA9IHRva2VuLnJlcGxhY2UoL14odG9rZW58YmVhcmVyKSArL2ksIFwiXCIpO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGF1dGguYmluZChudWxsLCB0b2tlbiksIHtcbiAgICAgICAgaG9vazogaG9vay5iaW5kKG51bGwsIHRva2VuKSxcbiAgICB9KTtcbn07XG5cbmV4cG9ydCB7IGNyZWF0ZVRva2VuQXV0aCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLCJpbXBvcnQgeyBnZXRVc2VyQWdlbnQgfSBmcm9tICd1bml2ZXJzYWwtdXNlci1hZ2VudCc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnYmVmb3JlLWFmdGVyLWhvb2snO1xuaW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJ0BvY3Rva2l0L3JlcXVlc3QnO1xuaW1wb3J0IHsgd2l0aEN1c3RvbVJlcXVlc3QgfSBmcm9tICdAb2N0b2tpdC9ncmFwaHFsJztcbmltcG9ydCB7IGNyZWF0ZVRva2VuQXV0aCB9IGZyb20gJ0BvY3Rva2l0L2F1dGgtdG9rZW4nO1xuXG5jb25zdCBWRVJTSU9OID0gXCIzLjYuMFwiO1xuXG5jbGFzcyBPY3Rva2l0IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgaG9vayA9IG5ldyBDb2xsZWN0aW9uKCk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3REZWZhdWx0cyA9IHtcbiAgICAgICAgICAgIGJhc2VVcmw6IHJlcXVlc3QuZW5kcG9pbnQuREVGQVVMVFMuYmFzZVVybCxcbiAgICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgICAgcmVxdWVzdDogT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5yZXF1ZXN0LCB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBpbnRlcm5hbCB1c2FnZSBvbmx5LCBubyBuZWVkIHRvIHR5cGVcbiAgICAgICAgICAgICAgICBob29rOiBob29rLmJpbmQobnVsbCwgXCJyZXF1ZXN0XCIpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtZWRpYVR5cGU6IHtcbiAgICAgICAgICAgICAgICBwcmV2aWV3czogW10sXG4gICAgICAgICAgICAgICAgZm9ybWF0OiBcIlwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gcHJlcGVuZCBkZWZhdWx0IHVzZXIgYWdlbnQgd2l0aCBgb3B0aW9ucy51c2VyQWdlbnRgIGlmIHNldFxuICAgICAgICByZXF1ZXN0RGVmYXVsdHMuaGVhZGVyc1tcInVzZXItYWdlbnRcIl0gPSBbXG4gICAgICAgICAgICBvcHRpb25zLnVzZXJBZ2VudCxcbiAgICAgICAgICAgIGBvY3Rva2l0LWNvcmUuanMvJHtWRVJTSU9OfSAke2dldFVzZXJBZ2VudCgpfWAsXG4gICAgICAgIF1cbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgIC5qb2luKFwiIFwiKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYmFzZVVybCkge1xuICAgICAgICAgICAgcmVxdWVzdERlZmF1bHRzLmJhc2VVcmwgPSBvcHRpb25zLmJhc2VVcmw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMucHJldmlld3MpIHtcbiAgICAgICAgICAgIHJlcXVlc3REZWZhdWx0cy5tZWRpYVR5cGUucHJldmlld3MgPSBvcHRpb25zLnByZXZpZXdzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnRpbWVab25lKSB7XG4gICAgICAgICAgICByZXF1ZXN0RGVmYXVsdHMuaGVhZGVyc1tcInRpbWUtem9uZVwiXSA9IG9wdGlvbnMudGltZVpvbmU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdC5kZWZhdWx0cyhyZXF1ZXN0RGVmYXVsdHMpO1xuICAgICAgICB0aGlzLmdyYXBocWwgPSB3aXRoQ3VzdG9tUmVxdWVzdCh0aGlzLnJlcXVlc3QpLmRlZmF1bHRzKHJlcXVlc3REZWZhdWx0cyk7XG4gICAgICAgIHRoaXMubG9nID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBkZWJ1ZzogKCkgPT4geyB9LFxuICAgICAgICAgICAgaW5mbzogKCkgPT4geyB9LFxuICAgICAgICAgICAgd2FybjogY29uc29sZS53YXJuLmJpbmQoY29uc29sZSksXG4gICAgICAgICAgICBlcnJvcjogY29uc29sZS5lcnJvci5iaW5kKGNvbnNvbGUpLFxuICAgICAgICB9LCBvcHRpb25zLmxvZyk7XG4gICAgICAgIHRoaXMuaG9vayA9IGhvb2s7XG4gICAgICAgIC8vICgxKSBJZiBuZWl0aGVyIGBvcHRpb25zLmF1dGhTdHJhdGVneWAgbm9yIGBvcHRpb25zLmF1dGhgIGFyZSBzZXQsIHRoZSBgb2N0b2tpdGAgaW5zdGFuY2VcbiAgICAgICAgLy8gICAgIGlzIHVuYXV0aGVudGljYXRlZC4gVGhlIGB0aGlzLmF1dGgoKWAgbWV0aG9kIGlzIGEgbm8tb3AgYW5kIG5vIHJlcXVlc3QgaG9vayBpcyByZWdpc3RlcmVkLlxuICAgICAgICAvLyAoMikgSWYgb25seSBgb3B0aW9ucy5hdXRoYCBpcyBzZXQsIHVzZSB0aGUgZGVmYXVsdCB0b2tlbiBhdXRoZW50aWNhdGlvbiBzdHJhdGVneS5cbiAgICAgICAgLy8gKDMpIElmIGBvcHRpb25zLmF1dGhTdHJhdGVneWAgaXMgc2V0IHRoZW4gdXNlIGl0IGFuZCBwYXNzIGluIGBvcHRpb25zLmF1dGhgLiBBbHdheXMgcGFzcyBvd24gcmVxdWVzdCBhcyBtYW55IHN0cmF0ZWdpZXMgYWNjZXB0IGEgY3VzdG9tIHJlcXVlc3QgaW5zdGFuY2UuXG4gICAgICAgIC8vIFRPRE86IHR5cGUgYG9wdGlvbnMuYXV0aGAgYmFzZWQgb24gYG9wdGlvbnMuYXV0aFN0cmF0ZWd5YC5cbiAgICAgICAgaWYgKCFvcHRpb25zLmF1dGhTdHJhdGVneSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmF1dGgpIHtcbiAgICAgICAgICAgICAgICAvLyAoMSlcbiAgICAgICAgICAgICAgICB0aGlzLmF1dGggPSBhc3luYyAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInVuYXV0aGVudGljYXRlZFwiLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gKDIpXG4gICAgICAgICAgICAgICAgY29uc3QgYXV0aCA9IGNyZWF0ZVRva2VuQXV0aChvcHRpb25zLmF1dGgpO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgIMKvXFxfKOODhClfL8KvXG4gICAgICAgICAgICAgICAgaG9vay53cmFwKFwicmVxdWVzdFwiLCBhdXRoLmhvb2spO1xuICAgICAgICAgICAgICAgIHRoaXMuYXV0aCA9IGF1dGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IGF1dGhTdHJhdGVneSwgLi4ub3RoZXJPcHRpb25zIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgYXV0aCA9IGF1dGhTdHJhdGVneShPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3QsXG4gICAgICAgICAgICAgICAgbG9nOiB0aGlzLmxvZyxcbiAgICAgICAgICAgICAgICAvLyB3ZSBwYXNzIHRoZSBjdXJyZW50IG9jdG9raXQgaW5zdGFuY2UgYXMgd2VsbCBhcyBpdHMgY29uc3RydWN0b3Igb3B0aW9uc1xuICAgICAgICAgICAgICAgIC8vIHRvIGFsbG93IGZvciBhdXRoZW50aWNhdGlvbiBzdHJhdGVnaWVzIHRoYXQgcmV0dXJuIGEgbmV3IG9jdG9raXQgaW5zdGFuY2VcbiAgICAgICAgICAgICAgICAvLyB0aGF0IHNoYXJlcyB0aGUgc2FtZSBpbnRlcm5hbCBzdGF0ZSBhcyB0aGUgY3VycmVudCBvbmUuIFRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgICAgIC8vIHJlcXVpcmVtZW50IGZvciB0aGlzIHdhcyB0aGUgXCJldmVudC1vY3Rva2l0XCIgYXV0aGVudGljYXRpb24gc3RyYXRlZ3lcbiAgICAgICAgICAgICAgICAvLyBvZiBodHRwczovL2dpdGh1Yi5jb20vcHJvYm90L29jdG9raXQtYXV0aC1wcm9ib3QuXG4gICAgICAgICAgICAgICAgb2N0b2tpdDogdGhpcyxcbiAgICAgICAgICAgICAgICBvY3Rva2l0T3B0aW9uczogb3RoZXJPcHRpb25zLFxuICAgICAgICAgICAgfSwgb3B0aW9ucy5hdXRoKSk7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlICDCr1xcXyjjg4QpXy/Cr1xuICAgICAgICAgICAgaG9vay53cmFwKFwicmVxdWVzdFwiLCBhdXRoLmhvb2spO1xuICAgICAgICAgICAgdGhpcy5hdXRoID0gYXV0aDtcbiAgICAgICAgfVxuICAgICAgICAvLyBhcHBseSBwbHVnaW5zXG4gICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNjM0NTE3MlxuICAgICAgICBjb25zdCBjbGFzc0NvbnN0cnVjdG9yID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgY2xhc3NDb25zdHJ1Y3Rvci5wbHVnaW5zLmZvckVhY2goKHBsdWdpbikgPT4ge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBwbHVnaW4odGhpcywgb3B0aW9ucykpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGRlZmF1bHRzKGRlZmF1bHRzKSB7XG4gICAgICAgIGNvbnN0IE9jdG9raXRXaXRoRGVmYXVsdHMgPSBjbGFzcyBleHRlbmRzIHRoaXMge1xuICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBhcmdzWzBdIHx8IHt9O1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGVmYXVsdHMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBzdXBlcihkZWZhdWx0cyhvcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3VwZXIoT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMsIG9wdGlvbnMsIG9wdGlvbnMudXNlckFnZW50ICYmIGRlZmF1bHRzLnVzZXJBZ2VudFxuICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJBZ2VudDogYCR7b3B0aW9ucy51c2VyQWdlbnR9ICR7ZGVmYXVsdHMudXNlckFnZW50fWAsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgOiBudWxsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBPY3Rva2l0V2l0aERlZmF1bHRzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBdHRhY2ggYSBwbHVnaW4gKG9yIG1hbnkpIHRvIHlvdXIgT2N0b2tpdCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgQVBJID0gT2N0b2tpdC5wbHVnaW4ocGx1Z2luMSwgcGx1Z2luMiwgcGx1Z2luMywgLi4uKVxuICAgICAqL1xuICAgIHN0YXRpYyBwbHVnaW4oLi4ubmV3UGx1Z2lucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQbHVnaW5zID0gdGhpcy5wbHVnaW5zO1xuICAgICAgICBjb25zdCBOZXdPY3Rva2l0ID0gKF9hID0gY2xhc3MgZXh0ZW5kcyB0aGlzIHtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBfYS5wbHVnaW5zID0gY3VycmVudFBsdWdpbnMuY29uY2F0KG5ld1BsdWdpbnMuZmlsdGVyKChwbHVnaW4pID0+ICFjdXJyZW50UGx1Z2lucy5pbmNsdWRlcyhwbHVnaW4pKSksXG4gICAgICAgICAgICBfYSk7XG4gICAgICAgIHJldHVybiBOZXdPY3Rva2l0O1xuICAgIH1cbn1cbk9jdG9raXQuVkVSU0lPTiA9IFZFUlNJT047XG5PY3Rva2l0LnBsdWdpbnMgPSBbXTtcblxuZXhwb3J0IHsgT2N0b2tpdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4483\n')},2009:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ composePaginateRest: () => (/* binding */ composePaginateRest),\n/* harmony export */ isPaginatingEndpoint: () => (/* binding */ isPaginatingEndpoint),\n/* harmony export */ paginateRest: () => (/* binding */ paginateRest),\n/* harmony export */ paginatingEndpoints: () => (/* binding */ paginatingEndpoints)\n/* harmony export */ });\nconst VERSION = "2.21.3";\n\n/**\n * Some “list” response that can be paginated have a different response structure\n *\n * They have a `total_count` key in the response (search also has `incomplete_results`,\n * /installation/repositories also has `repository_selection`), as well as a key with\n * the list of the items which name varies from endpoint to endpoint.\n *\n * Octokit normalizes these responses so that paginated results are always returned following\n * the same structure. One challenge is that if the list response has only one page, no Link\n * header is provided, so this header alone is not sufficient to check wether a response is\n * paginated or not.\n *\n * We check if a "total_count" key is present in the response data, but also make sure that\n * a "url" property is not, as the "Get the combined status for a specific ref" endpoint would\n * otherwise match: https://developer.github.com/v3/repos/statuses/#get-the-combined-status-for-a-specific-ref\n */\nfunction normalizePaginatedListResponse(response) {\n // endpoints can respond with 204 if repository is empty\n if (!response.data) {\n return {\n ...response,\n data: [],\n };\n }\n const responseNeedsNormalization = "total_count" in response.data && !("url" in response.data);\n if (!responseNeedsNormalization)\n return response;\n // keep the additional properties intact as there is currently no other way\n // to retrieve the same information.\n const incompleteResults = response.data.incomplete_results;\n const repositorySelection = response.data.repository_selection;\n const totalCount = response.data.total_count;\n delete response.data.incomplete_results;\n delete response.data.repository_selection;\n delete response.data.total_count;\n const namespaceKey = Object.keys(response.data)[0];\n const data = response.data[namespaceKey];\n response.data = data;\n if (typeof incompleteResults !== "undefined") {\n response.data.incomplete_results = incompleteResults;\n }\n if (typeof repositorySelection !== "undefined") {\n response.data.repository_selection = repositorySelection;\n }\n response.data.total_count = totalCount;\n return response;\n}\n\nfunction iterator(octokit, route, parameters) {\n const options = typeof route === "function"\n ? route.endpoint(parameters)\n : octokit.request.endpoint(route, parameters);\n const requestMethod = typeof route === "function" ? route : octokit.request;\n const method = options.method;\n const headers = options.headers;\n let url = options.url;\n return {\n [Symbol.asyncIterator]: () => ({\n async next() {\n if (!url)\n return { done: true };\n try {\n const response = await requestMethod({ method, url, headers });\n const normalizedResponse = normalizePaginatedListResponse(response);\n // `response.headers.link` format:\n // \'; rel="next", ; rel="last"\'\n // sets `url` to undefined if "next" URL is not present or `link` header is not set\n url = ((normalizedResponse.headers.link || "").match(/<([^>]+)>;\\s*rel="next"/) || [])[1];\n return { value: normalizedResponse };\n }\n catch (error) {\n if (error.status !== 409)\n throw error;\n url = "";\n return {\n value: {\n status: 200,\n headers: {},\n data: [],\n },\n };\n }\n },\n }),\n };\n}\n\nfunction paginate(octokit, route, parameters, mapFn) {\n if (typeof parameters === "function") {\n mapFn = parameters;\n parameters = undefined;\n }\n return gather(octokit, [], iterator(octokit, route, parameters)[Symbol.asyncIterator](), mapFn);\n}\nfunction gather(octokit, results, iterator, mapFn) {\n return iterator.next().then((result) => {\n if (result.done) {\n return results;\n }\n let earlyExit = false;\n function done() {\n earlyExit = true;\n }\n results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data);\n if (earlyExit) {\n return results;\n }\n return gather(octokit, results, iterator, mapFn);\n });\n}\n\nconst composePaginateRest = Object.assign(paginate, {\n iterator,\n});\n\nconst paginatingEndpoints = [\n "GET /app/hook/deliveries",\n "GET /app/installations",\n "GET /applications/grants",\n "GET /authorizations",\n "GET /enterprises/{enterprise}/actions/permissions/organizations",\n "GET /enterprises/{enterprise}/actions/runner-groups",\n "GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/organizations",\n "GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/runners",\n "GET /enterprises/{enterprise}/actions/runners",\n "GET /enterprises/{enterprise}/audit-log",\n "GET /enterprises/{enterprise}/secret-scanning/alerts",\n "GET /enterprises/{enterprise}/settings/billing/advanced-security",\n "GET /events",\n "GET /gists",\n "GET /gists/public",\n "GET /gists/starred",\n "GET /gists/{gist_id}/comments",\n "GET /gists/{gist_id}/commits",\n "GET /gists/{gist_id}/forks",\n "GET /installation/repositories",\n "GET /issues",\n "GET /licenses",\n "GET /marketplace_listing/plans",\n "GET /marketplace_listing/plans/{plan_id}/accounts",\n "GET /marketplace_listing/stubbed/plans",\n "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts",\n "GET /networks/{owner}/{repo}/events",\n "GET /notifications",\n "GET /organizations",\n "GET /orgs/{org}/actions/cache/usage-by-repository",\n "GET /orgs/{org}/actions/permissions/repositories",\n "GET /orgs/{org}/actions/runner-groups",\n "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories",\n "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/runners",\n "GET /orgs/{org}/actions/runners",\n "GET /orgs/{org}/actions/secrets",\n "GET /orgs/{org}/actions/secrets/{secret_name}/repositories",\n "GET /orgs/{org}/audit-log",\n "GET /orgs/{org}/blocks",\n "GET /orgs/{org}/code-scanning/alerts",\n "GET /orgs/{org}/codespaces",\n "GET /orgs/{org}/credential-authorizations",\n "GET /orgs/{org}/dependabot/secrets",\n "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories",\n "GET /orgs/{org}/events",\n "GET /orgs/{org}/external-groups",\n "GET /orgs/{org}/failed_invitations",\n "GET /orgs/{org}/hooks",\n "GET /orgs/{org}/hooks/{hook_id}/deliveries",\n "GET /orgs/{org}/installations",\n "GET /orgs/{org}/invitations",\n "GET /orgs/{org}/invitations/{invitation_id}/teams",\n "GET /orgs/{org}/issues",\n "GET /orgs/{org}/members",\n "GET /orgs/{org}/migrations",\n "GET /orgs/{org}/migrations/{migration_id}/repositories",\n "GET /orgs/{org}/outside_collaborators",\n "GET /orgs/{org}/packages",\n "GET /orgs/{org}/packages/{package_type}/{package_name}/versions",\n "GET /orgs/{org}/projects",\n "GET /orgs/{org}/public_members",\n "GET /orgs/{org}/repos",\n "GET /orgs/{org}/secret-scanning/alerts",\n "GET /orgs/{org}/settings/billing/advanced-security",\n "GET /orgs/{org}/team-sync/groups",\n "GET /orgs/{org}/teams",\n "GET /orgs/{org}/teams/{team_slug}/discussions",\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments",\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions",\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions",\n "GET /orgs/{org}/teams/{team_slug}/invitations",\n "GET /orgs/{org}/teams/{team_slug}/members",\n "GET /orgs/{org}/teams/{team_slug}/projects",\n "GET /orgs/{org}/teams/{team_slug}/repos",\n "GET /orgs/{org}/teams/{team_slug}/teams",\n "GET /projects/columns/{column_id}/cards",\n "GET /projects/{project_id}/collaborators",\n "GET /projects/{project_id}/columns",\n "GET /repos/{owner}/{repo}/actions/artifacts",\n "GET /repos/{owner}/{repo}/actions/caches",\n "GET /repos/{owner}/{repo}/actions/runners",\n "GET /repos/{owner}/{repo}/actions/runs",\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts",\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs",\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs",\n "GET /repos/{owner}/{repo}/actions/secrets",\n "GET /repos/{owner}/{repo}/actions/workflows",\n "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs",\n "GET /repos/{owner}/{repo}/assignees",\n "GET /repos/{owner}/{repo}/branches",\n "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations",\n "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs",\n "GET /repos/{owner}/{repo}/code-scanning/alerts",\n "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances",\n "GET /repos/{owner}/{repo}/code-scanning/analyses",\n "GET /repos/{owner}/{repo}/codespaces",\n "GET /repos/{owner}/{repo}/codespaces/devcontainers",\n "GET /repos/{owner}/{repo}/codespaces/secrets",\n "GET /repos/{owner}/{repo}/collaborators",\n "GET /repos/{owner}/{repo}/comments",\n "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions",\n "GET /repos/{owner}/{repo}/commits",\n "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments",\n "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls",\n "GET /repos/{owner}/{repo}/commits/{ref}/check-runs",\n "GET /repos/{owner}/{repo}/commits/{ref}/check-suites",\n "GET /repos/{owner}/{repo}/commits/{ref}/status",\n "GET /repos/{owner}/{repo}/commits/{ref}/statuses",\n "GET /repos/{owner}/{repo}/contributors",\n "GET /repos/{owner}/{repo}/dependabot/secrets",\n "GET /repos/{owner}/{repo}/deployments",\n "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses",\n "GET /repos/{owner}/{repo}/environments",\n "GET /repos/{owner}/{repo}/events",\n "GET /repos/{owner}/{repo}/forks",\n "GET /repos/{owner}/{repo}/git/matching-refs/{ref}",\n "GET /repos/{owner}/{repo}/hooks",\n "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries",\n "GET /repos/{owner}/{repo}/invitations",\n "GET /repos/{owner}/{repo}/issues",\n "GET /repos/{owner}/{repo}/issues/comments",\n "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions",\n "GET /repos/{owner}/{repo}/issues/events",\n "GET /repos/{owner}/{repo}/issues/{issue_number}/comments",\n "GET /repos/{owner}/{repo}/issues/{issue_number}/events",\n "GET /repos/{owner}/{repo}/issues/{issue_number}/labels",\n "GET /repos/{owner}/{repo}/issues/{issue_number}/reactions",\n "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline",\n "GET /repos/{owner}/{repo}/keys",\n "GET /repos/{owner}/{repo}/labels",\n "GET /repos/{owner}/{repo}/milestones",\n "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels",\n "GET /repos/{owner}/{repo}/notifications",\n "GET /repos/{owner}/{repo}/pages/builds",\n "GET /repos/{owner}/{repo}/projects",\n "GET /repos/{owner}/{repo}/pulls",\n "GET /repos/{owner}/{repo}/pulls/comments",\n "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/commits",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/files",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments",\n "GET /repos/{owner}/{repo}/releases",\n "GET /repos/{owner}/{repo}/releases/{release_id}/assets",\n "GET /repos/{owner}/{repo}/releases/{release_id}/reactions",\n "GET /repos/{owner}/{repo}/secret-scanning/alerts",\n "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations",\n "GET /repos/{owner}/{repo}/stargazers",\n "GET /repos/{owner}/{repo}/subscribers",\n "GET /repos/{owner}/{repo}/tags",\n "GET /repos/{owner}/{repo}/teams",\n "GET /repos/{owner}/{repo}/topics",\n "GET /repositories",\n "GET /repositories/{repository_id}/environments/{environment_name}/secrets",\n "GET /search/code",\n "GET /search/commits",\n "GET /search/issues",\n "GET /search/labels",\n "GET /search/repositories",\n "GET /search/topics",\n "GET /search/users",\n "GET /teams/{team_id}/discussions",\n "GET /teams/{team_id}/discussions/{discussion_number}/comments",\n "GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions",\n "GET /teams/{team_id}/discussions/{discussion_number}/reactions",\n "GET /teams/{team_id}/invitations",\n "GET /teams/{team_id}/members",\n "GET /teams/{team_id}/projects",\n "GET /teams/{team_id}/repos",\n "GET /teams/{team_id}/teams",\n "GET /user/blocks",\n "GET /user/codespaces",\n "GET /user/codespaces/secrets",\n "GET /user/emails",\n "GET /user/followers",\n "GET /user/following",\n "GET /user/gpg_keys",\n "GET /user/installations",\n "GET /user/installations/{installation_id}/repositories",\n "GET /user/issues",\n "GET /user/keys",\n "GET /user/marketplace_purchases",\n "GET /user/marketplace_purchases/stubbed",\n "GET /user/memberships/orgs",\n "GET /user/migrations",\n "GET /user/migrations/{migration_id}/repositories",\n "GET /user/orgs",\n "GET /user/packages",\n "GET /user/packages/{package_type}/{package_name}/versions",\n "GET /user/public_emails",\n "GET /user/repos",\n "GET /user/repository_invitations",\n "GET /user/starred",\n "GET /user/subscriptions",\n "GET /user/teams",\n "GET /users",\n "GET /users/{username}/events",\n "GET /users/{username}/events/orgs/{org}",\n "GET /users/{username}/events/public",\n "GET /users/{username}/followers",\n "GET /users/{username}/following",\n "GET /users/{username}/gists",\n "GET /users/{username}/gpg_keys",\n "GET /users/{username}/keys",\n "GET /users/{username}/orgs",\n "GET /users/{username}/packages",\n "GET /users/{username}/projects",\n "GET /users/{username}/received_events",\n "GET /users/{username}/received_events/public",\n "GET /users/{username}/repos",\n "GET /users/{username}/starred",\n "GET /users/{username}/subscriptions",\n];\n\nfunction isPaginatingEndpoint(arg) {\n if (typeof arg === "string") {\n return paginatingEndpoints.includes(arg);\n }\n else {\n return false;\n }\n}\n\n/**\n * @param octokit Octokit instance\n * @param options Options passed to Octokit constructor\n */\nfunction paginateRest(octokit) {\n return {\n paginate: Object.assign(paginate.bind(null, octokit), {\n iterator: iterator.bind(null, octokit),\n }),\n };\n}\npaginateRest.VERSION = VERSION;\n\n\n//# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QzFCLGlCQUFpQixTQUFTO0FBQzFCLGlCQUFpQixTQUFTO0FBQzFCLGlCQUFpQixTQUFTO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRXdGO0FBQ3hGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3Qvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3BsdWdpbi1wYWdpbmF0ZS1yZXN0L2Rpc3Qtd2ViL2luZGV4LmpzPzEwOWIiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgVkVSU0lPTiA9IFwiMi4yMS4zXCI7XG5cbi8qKlxuICogU29tZSDigJxsaXN04oCdIHJlc3BvbnNlIHRoYXQgY2FuIGJlIHBhZ2luYXRlZCBoYXZlIGEgZGlmZmVyZW50IHJlc3BvbnNlIHN0cnVjdHVyZVxuICpcbiAqIFRoZXkgaGF2ZSBhIGB0b3RhbF9jb3VudGAga2V5IGluIHRoZSByZXNwb25zZSAoc2VhcmNoIGFsc28gaGFzIGBpbmNvbXBsZXRlX3Jlc3VsdHNgLFxuICogL2luc3RhbGxhdGlvbi9yZXBvc2l0b3JpZXMgYWxzbyBoYXMgYHJlcG9zaXRvcnlfc2VsZWN0aW9uYCksIGFzIHdlbGwgYXMgYSBrZXkgd2l0aFxuICogdGhlIGxpc3Qgb2YgdGhlIGl0ZW1zIHdoaWNoIG5hbWUgdmFyaWVzIGZyb20gZW5kcG9pbnQgdG8gZW5kcG9pbnQuXG4gKlxuICogT2N0b2tpdCBub3JtYWxpemVzIHRoZXNlIHJlc3BvbnNlcyBzbyB0aGF0IHBhZ2luYXRlZCByZXN1bHRzIGFyZSBhbHdheXMgcmV0dXJuZWQgZm9sbG93aW5nXG4gKiB0aGUgc2FtZSBzdHJ1Y3R1cmUuIE9uZSBjaGFsbGVuZ2UgaXMgdGhhdCBpZiB0aGUgbGlzdCByZXNwb25zZSBoYXMgb25seSBvbmUgcGFnZSwgbm8gTGlua1xuICogaGVhZGVyIGlzIHByb3ZpZGVkLCBzbyB0aGlzIGhlYWRlciBhbG9uZSBpcyBub3Qgc3VmZmljaWVudCB0byBjaGVjayB3ZXRoZXIgYSByZXNwb25zZSBpc1xuICogcGFnaW5hdGVkIG9yIG5vdC5cbiAqXG4gKiBXZSBjaGVjayBpZiBhIFwidG90YWxfY291bnRcIiBrZXkgaXMgcHJlc2VudCBpbiB0aGUgcmVzcG9uc2UgZGF0YSwgYnV0IGFsc28gbWFrZSBzdXJlIHRoYXRcbiAqIGEgXCJ1cmxcIiBwcm9wZXJ0eSBpcyBub3QsIGFzIHRoZSBcIkdldCB0aGUgY29tYmluZWQgc3RhdHVzIGZvciBhIHNwZWNpZmljIHJlZlwiIGVuZHBvaW50IHdvdWxkXG4gKiBvdGhlcndpc2UgbWF0Y2g6IGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvcmVwb3Mvc3RhdHVzZXMvI2dldC10aGUtY29tYmluZWQtc3RhdHVzLWZvci1hLXNwZWNpZmljLXJlZlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQYWdpbmF0ZWRMaXN0UmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICAvLyBlbmRwb2ludHMgY2FuIHJlc3BvbmQgd2l0aCAyMDQgaWYgcmVwb3NpdG9yeSBpcyBlbXB0eVxuICAgIGlmICghcmVzcG9uc2UuZGF0YSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucmVzcG9uc2UsXG4gICAgICAgICAgICBkYXRhOiBbXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VOZWVkc05vcm1hbGl6YXRpb24gPSBcInRvdGFsX2NvdW50XCIgaW4gcmVzcG9uc2UuZGF0YSAmJiAhKFwidXJsXCIgaW4gcmVzcG9uc2UuZGF0YSk7XG4gICAgaWYgKCFyZXNwb25zZU5lZWRzTm9ybWFsaXphdGlvbilcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIC8vIGtlZXAgdGhlIGFkZGl0aW9uYWwgcHJvcGVydGllcyBpbnRhY3QgYXMgdGhlcmUgaXMgY3VycmVudGx5IG5vIG90aGVyIHdheVxuICAgIC8vIHRvIHJldHJpZXZlIHRoZSBzYW1lIGluZm9ybWF0aW9uLlxuICAgIGNvbnN0IGluY29tcGxldGVSZXN1bHRzID0gcmVzcG9uc2UuZGF0YS5pbmNvbXBsZXRlX3Jlc3VsdHM7XG4gICAgY29uc3QgcmVwb3NpdG9yeVNlbGVjdGlvbiA9IHJlc3BvbnNlLmRhdGEucmVwb3NpdG9yeV9zZWxlY3Rpb247XG4gICAgY29uc3QgdG90YWxDb3VudCA9IHJlc3BvbnNlLmRhdGEudG90YWxfY291bnQ7XG4gICAgZGVsZXRlIHJlc3BvbnNlLmRhdGEuaW5jb21wbGV0ZV9yZXN1bHRzO1xuICAgIGRlbGV0ZSByZXNwb25zZS5kYXRhLnJlcG9zaXRvcnlfc2VsZWN0aW9uO1xuICAgIGRlbGV0ZSByZXNwb25zZS5kYXRhLnRvdGFsX2NvdW50O1xuICAgIGNvbnN0IG5hbWVzcGFjZUtleSA9IE9iamVjdC5rZXlzKHJlc3BvbnNlLmRhdGEpWzBdO1xuICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS5kYXRhW25hbWVzcGFjZUtleV07XG4gICAgcmVzcG9uc2UuZGF0YSA9IGRhdGE7XG4gICAgaWYgKHR5cGVvZiBpbmNvbXBsZXRlUmVzdWx0cyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICByZXNwb25zZS5kYXRhLmluY29tcGxldGVfcmVzdWx0cyA9IGluY29tcGxldGVSZXN1bHRzO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlcG9zaXRvcnlTZWxlY3Rpb24gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgcmVzcG9uc2UuZGF0YS5yZXBvc2l0b3J5X3NlbGVjdGlvbiA9IHJlcG9zaXRvcnlTZWxlY3Rpb247XG4gICAgfVxuICAgIHJlc3BvbnNlLmRhdGEudG90YWxfY291bnQgPSB0b3RhbENvdW50O1xuICAgIHJldHVybiByZXNwb25zZTtcbn1cblxuZnVuY3Rpb24gaXRlcmF0b3Iob2N0b2tpdCwgcm91dGUsIHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdHlwZW9mIHJvdXRlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyByb3V0ZS5lbmRwb2ludChwYXJhbWV0ZXJzKVxuICAgICAgICA6IG9jdG9raXQucmVxdWVzdC5lbmRwb2ludChyb3V0ZSwgcGFyYW1ldGVycyk7XG4gICAgY29uc3QgcmVxdWVzdE1ldGhvZCA9IHR5cGVvZiByb3V0ZSA9PT0gXCJmdW5jdGlvblwiID8gcm91dGUgOiBvY3Rva2l0LnJlcXVlc3Q7XG4gICAgY29uc3QgbWV0aG9kID0gb3B0aW9ucy5tZXRob2Q7XG4gICAgY29uc3QgaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycztcbiAgICBsZXQgdXJsID0gb3B0aW9ucy51cmw7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gKHtcbiAgICAgICAgICAgIGFzeW5jIG5leHQoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1cmwpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RNZXRob2QoeyBtZXRob2QsIHVybCwgaGVhZGVycyB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFJlc3BvbnNlID0gbm9ybWFsaXplUGFnaW5hdGVkTGlzdFJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gYHJlc3BvbnNlLmhlYWRlcnMubGlua2AgZm9ybWF0OlxuICAgICAgICAgICAgICAgICAgICAvLyAnPGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXNlZW1rL2ZvbGxvd2Vycz9wYWdlPTI+OyByZWw9XCJuZXh0XCIsIDxodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2FzZWVtay9mb2xsb3dlcnM/cGFnZT0yPjsgcmVsPVwibGFzdFwiJ1xuICAgICAgICAgICAgICAgICAgICAvLyBzZXRzIGB1cmxgIHRvIHVuZGVmaW5lZCBpZiBcIm5leHRcIiBVUkwgaXMgbm90IHByZXNlbnQgb3IgYGxpbmtgIGhlYWRlciBpcyBub3Qgc2V0XG4gICAgICAgICAgICAgICAgICAgIHVybCA9ICgobm9ybWFsaXplZFJlc3BvbnNlLmhlYWRlcnMubGluayB8fCBcIlwiKS5tYXRjaCgvPChbXj5dKyk+O1xccypyZWw9XCJuZXh0XCIvKSB8fCBbXSlbMV07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBub3JtYWxpemVkUmVzcG9uc2UgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgIT09IDQwOSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB1cmwgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gcGFnaW5hdGUob2N0b2tpdCwgcm91dGUsIHBhcmFtZXRlcnMsIG1hcEZuKSB7XG4gICAgaWYgKHR5cGVvZiBwYXJhbWV0ZXJzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgbWFwRm4gPSBwYXJhbWV0ZXJzO1xuICAgICAgICBwYXJhbWV0ZXJzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gZ2F0aGVyKG9jdG9raXQsIFtdLCBpdGVyYXRvcihvY3Rva2l0LCByb3V0ZSwgcGFyYW1ldGVycylbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCksIG1hcEZuKTtcbn1cbmZ1bmN0aW9uIGdhdGhlcihvY3Rva2l0LCByZXN1bHRzLCBpdGVyYXRvciwgbWFwRm4pIHtcbiAgICByZXR1cm4gaXRlcmF0b3IubmV4dCgpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBlYXJseUV4aXQgPSBmYWxzZTtcbiAgICAgICAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICAgICAgICAgIGVhcmx5RXhpdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuY29uY2F0KG1hcEZuID8gbWFwRm4ocmVzdWx0LnZhbHVlLCBkb25lKSA6IHJlc3VsdC52YWx1ZS5kYXRhKTtcbiAgICAgICAgaWYgKGVhcmx5RXhpdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdhdGhlcihvY3Rva2l0LCByZXN1bHRzLCBpdGVyYXRvciwgbWFwRm4pO1xuICAgIH0pO1xufVxuXG5jb25zdCBjb21wb3NlUGFnaW5hdGVSZXN0ID0gT2JqZWN0LmFzc2lnbihwYWdpbmF0ZSwge1xuICAgIGl0ZXJhdG9yLFxufSk7XG5cbmNvbnN0IHBhZ2luYXRpbmdFbmRwb2ludHMgPSBbXG4gICAgXCJHRVQgL2FwcC9ob29rL2RlbGl2ZXJpZXNcIixcbiAgICBcIkdFVCAvYXBwL2luc3RhbGxhdGlvbnNcIixcbiAgICBcIkdFVCAvYXBwbGljYXRpb25zL2dyYW50c1wiLFxuICAgIFwiR0VUIC9hdXRob3JpemF0aW9uc1wiLFxuICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9wZXJtaXNzaW9ucy9vcmdhbml6YXRpb25zXCIsXG4gICAgXCJHRVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3J1bm5lci1ncm91cHNcIixcbiAgICBcIkdFVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L2FjdGlvbnMvcnVubmVyLWdyb3Vwcy97cnVubmVyX2dyb3VwX2lkfS9vcmdhbml6YXRpb25zXCIsXG4gICAgXCJHRVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3J1bm5lci1ncm91cHMve3J1bm5lcl9ncm91cF9pZH0vcnVubmVyc1wiLFxuICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9ydW5uZXJzXCIsXG4gICAgXCJHRVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hdWRpdC1sb2dcIixcbiAgICBcIkdFVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L3NlY3JldC1zY2FubmluZy9hbGVydHNcIixcbiAgICBcIkdFVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L3NldHRpbmdzL2JpbGxpbmcvYWR2YW5jZWQtc2VjdXJpdHlcIixcbiAgICBcIkdFVCAvZXZlbnRzXCIsXG4gICAgXCJHRVQgL2dpc3RzXCIsXG4gICAgXCJHRVQgL2dpc3RzL3B1YmxpY1wiLFxuICAgIFwiR0VUIC9naXN0cy9zdGFycmVkXCIsXG4gICAgXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS9jb21tZW50c1wiLFxuICAgIFwiR0VUIC9naXN0cy97Z2lzdF9pZH0vY29tbWl0c1wiLFxuICAgIFwiR0VUIC9naXN0cy97Z2lzdF9pZH0vZm9ya3NcIixcbiAgICBcIkdFVCAvaW5zdGFsbGF0aW9uL3JlcG9zaXRvcmllc1wiLFxuICAgIFwiR0VUIC9pc3N1ZXNcIixcbiAgICBcIkdFVCAvbGljZW5zZXNcIixcbiAgICBcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9wbGFuc1wiLFxuICAgIFwiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3BsYW5zL3twbGFuX2lkfS9hY2NvdW50c1wiLFxuICAgIFwiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3N0dWJiZWQvcGxhbnNcIixcbiAgICBcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9zdHViYmVkL3BsYW5zL3twbGFuX2lkfS9hY2NvdW50c1wiLFxuICAgIFwiR0VUIC9uZXR3b3Jrcy97b3duZXJ9L3tyZXBvfS9ldmVudHNcIixcbiAgICBcIkdFVCAvbm90aWZpY2F0aW9uc1wiLFxuICAgIFwiR0VUIC9vcmdhbml6YXRpb25zXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9jYWNoZS91c2FnZS1ieS1yZXBvc2l0b3J5XCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9yZXBvc2l0b3JpZXNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lci1ncm91cHNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lci1ncm91cHMve3J1bm5lcl9ncm91cF9pZH0vcmVwb3NpdG9yaWVzXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXItZ3JvdXBzL3tydW5uZXJfZ3JvdXBfaWR9L3J1bm5lcnNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9hdWRpdC1sb2dcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9ibG9ja3NcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9jb2RlLXNjYW5uaW5nL2FsZXJ0c1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9jcmVkZW50aWFsLWF1dGhvcml6YXRpb25zXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vZXZlbnRzXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vZXh0ZXJuYWwtZ3JvdXBzXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vZmFpbGVkX2ludml0YXRpb25zXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vaG9va3NcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllc1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L2luc3RhbGxhdGlvbnNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9pbnZpdGF0aW9uc1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfS90ZWFtc1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L2lzc3Vlc1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L21lbWJlcnNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9taWdyYXRpb25zXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9vdXRzaWRlX2NvbGxhYm9yYXRvcnNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9wYWNrYWdlc1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vcHJvamVjdHNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9wdWJsaWNfbWVtYmVyc1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L3JlcG9zXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L3NldHRpbmdzL2JpbGxpbmcvYWR2YW5jZWQtc2VjdXJpdHlcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtLXN5bmMvZ3JvdXBzXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9uc1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn0vcmVhY3Rpb25zXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9yZWFjdGlvbnNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9pbnZpdGF0aW9uc1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L21lbWJlcnNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9wcm9qZWN0c1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3JlcG9zXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vdGVhbXNcIixcbiAgICBcIkdFVCAvcHJvamVjdHMvY29sdW1ucy97Y29sdW1uX2lkfS9jYXJkc1wiLFxuICAgIFwiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sbGFib3JhdG9yc1wiLFxuICAgIFwiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sdW1uc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2FydGlmYWN0c1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2NhY2hlc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hcnRpZmFjdHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2F0dGVtcHRzL3thdHRlbXB0X251bWJlcn0vam9ic1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vam9ic1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3NcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9ydW5zXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Fzc2lnbmVlc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1ydW5zL3tjaGVja19ydW5faWR9L2Fubm90YXRpb25zXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXN1aXRlcy97Y2hlY2tfc3VpdGVfaWR9L2NoZWNrLXJ1bnNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn0vaW5zdGFuY2VzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYW5hbHlzZXNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL2RldmNvbnRhaW5lcnNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9zZWNyZXRzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbGxhYm9yYXRvcnNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve2NvbW1pdF9zaGF9L2NvbW1lbnRzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve2NvbW1pdF9zaGF9L3B1bGxzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vY2hlY2stcnVuc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9L2NoZWNrLXN1aXRlc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9L3N0YXR1c1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9L3N0YXR1c2VzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbnRyaWJ1dG9yc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBlbmRhYm90L3NlY3JldHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHMve2RlcGxveW1lbnRfaWR9L3N0YXR1c2VzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50c1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ldmVudHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZm9ya3NcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L21hdGNoaW5nLXJlZnMve3JlZn1cIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3NcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9L2RlbGl2ZXJpZXNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaW52aXRhdGlvbnNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50c1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvZXZlbnRzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9jb21tZW50c1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vZXZlbnRzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L3JlYWN0aW9uc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vdGltZWxpbmVcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30va2V5c1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9taWxlc3RvbmVzL3ttaWxlc3RvbmVfbnVtYmVyfS9sYWJlbHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbm90aWZpY2F0aW9uc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wYWdlcy9idWlsZHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHJvamVjdHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1lbnRzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vY29tbWl0c1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2ZpbGVzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmVxdWVzdGVkX3Jldmlld2Vyc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3NcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzL3tyZXZpZXdfaWR9L2NvbW1lbnRzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9hc3NldHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9L3JlYWN0aW9uc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWNyZXQtc2Nhbm5pbmcvYWxlcnRzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3JldC1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn0vbG9jYXRpb25zXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N0YXJnYXplcnNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3Vic2NyaWJlcnNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdGFnc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90ZWFtc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90b3BpY3NcIixcbiAgICBcIkdFVCAvcmVwb3NpdG9yaWVzXCIsXG4gICAgXCJHRVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzXCIsXG4gICAgXCJHRVQgL3NlYXJjaC9jb2RlXCIsXG4gICAgXCJHRVQgL3NlYXJjaC9jb21taXRzXCIsXG4gICAgXCJHRVQgL3NlYXJjaC9pc3N1ZXNcIixcbiAgICBcIkdFVCAvc2VhcmNoL2xhYmVsc1wiLFxuICAgIFwiR0VUIC9zZWFyY2gvcmVwb3NpdG9yaWVzXCIsXG4gICAgXCJHRVQgL3NlYXJjaC90b3BpY3NcIixcbiAgICBcIkdFVCAvc2VhcmNoL3VzZXJzXCIsXG4gICAgXCJHRVQgL3RlYW1zL3t0ZWFtX2lkfS9kaXNjdXNzaW9uc1wiLFxuICAgIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50c1wiLFxuICAgIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50cy97Y29tbWVudF9udW1iZXJ9L3JlYWN0aW9uc1wiLFxuICAgIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9yZWFjdGlvbnNcIixcbiAgICBcIkdFVCAvdGVhbXMve3RlYW1faWR9L2ludml0YXRpb25zXCIsXG4gICAgXCJHRVQgL3RlYW1zL3t0ZWFtX2lkfS9tZW1iZXJzXCIsXG4gICAgXCJHRVQgL3RlYW1zL3t0ZWFtX2lkfS9wcm9qZWN0c1wiLFxuICAgIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vcmVwb3NcIixcbiAgICBcIkdFVCAvdGVhbXMve3RlYW1faWR9L3RlYW1zXCIsXG4gICAgXCJHRVQgL3VzZXIvYmxvY2tzXCIsXG4gICAgXCJHRVQgL3VzZXIvY29kZXNwYWNlc1wiLFxuICAgIFwiR0VUIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0c1wiLFxuICAgIFwiR0VUIC91c2VyL2VtYWlsc1wiLFxuICAgIFwiR0VUIC91c2VyL2ZvbGxvd2Vyc1wiLFxuICAgIFwiR0VUIC91c2VyL2ZvbGxvd2luZ1wiLFxuICAgIFwiR0VUIC91c2VyL2dwZ19rZXlzXCIsXG4gICAgXCJHRVQgL3VzZXIvaW5zdGFsbGF0aW9uc1wiLFxuICAgIFwiR0VUIC91c2VyL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vcmVwb3NpdG9yaWVzXCIsXG4gICAgXCJHRVQgL3VzZXIvaXNzdWVzXCIsXG4gICAgXCJHRVQgL3VzZXIva2V5c1wiLFxuICAgIFwiR0VUIC91c2VyL21hcmtldHBsYWNlX3B1cmNoYXNlc1wiLFxuICAgIFwiR0VUIC91c2VyL21hcmtldHBsYWNlX3B1cmNoYXNlcy9zdHViYmVkXCIsXG4gICAgXCJHRVQgL3VzZXIvbWVtYmVyc2hpcHMvb3Jnc1wiLFxuICAgIFwiR0VUIC91c2VyL21pZ3JhdGlvbnNcIixcbiAgICBcIkdFVCAvdXNlci9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9L3JlcG9zaXRvcmllc1wiLFxuICAgIFwiR0VUIC91c2VyL29yZ3NcIixcbiAgICBcIkdFVCAvdXNlci9wYWNrYWdlc1wiLFxuICAgIFwiR0VUIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zXCIsXG4gICAgXCJHRVQgL3VzZXIvcHVibGljX2VtYWlsc1wiLFxuICAgIFwiR0VUIC91c2VyL3JlcG9zXCIsXG4gICAgXCJHRVQgL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9uc1wiLFxuICAgIFwiR0VUIC91c2VyL3N0YXJyZWRcIixcbiAgICBcIkdFVCAvdXNlci9zdWJzY3JpcHRpb25zXCIsXG4gICAgXCJHRVQgL3VzZXIvdGVhbXNcIixcbiAgICBcIkdFVCAvdXNlcnNcIixcbiAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ldmVudHNcIixcbiAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ldmVudHMvb3Jncy97b3JnfVwiLFxuICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2V2ZW50cy9wdWJsaWNcIixcbiAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9mb2xsb3dlcnNcIixcbiAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9mb2xsb3dpbmdcIixcbiAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9naXN0c1wiLFxuICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2dwZ19rZXlzXCIsXG4gICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0va2V5c1wiLFxuICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L29yZ3NcIixcbiAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlc1wiLFxuICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3Byb2plY3RzXCIsXG4gICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVjZWl2ZWRfZXZlbnRzXCIsXG4gICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVjZWl2ZWRfZXZlbnRzL3B1YmxpY1wiLFxuICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3JlcG9zXCIsXG4gICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc3RhcnJlZFwiLFxuICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3N1YnNjcmlwdGlvbnNcIixcbl07XG5cbmZ1bmN0aW9uIGlzUGFnaW5hdGluZ0VuZHBvaW50KGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiBwYWdpbmF0aW5nRW5kcG9pbnRzLmluY2x1ZGVzKGFyZyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSBvY3Rva2l0IE9jdG9raXQgaW5zdGFuY2VcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgcGFzc2VkIHRvIE9jdG9raXQgY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gcGFnaW5hdGVSZXN0KG9jdG9raXQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBwYWdpbmF0ZTogT2JqZWN0LmFzc2lnbihwYWdpbmF0ZS5iaW5kKG51bGwsIG9jdG9raXQpLCB7XG4gICAgICAgICAgICBpdGVyYXRvcjogaXRlcmF0b3IuYmluZChudWxsLCBvY3Rva2l0KSxcbiAgICAgICAgfSksXG4gICAgfTtcbn1cbnBhZ2luYXRlUmVzdC5WRVJTSU9OID0gVkVSU0lPTjtcblxuZXhwb3J0IHsgY29tcG9zZVBhZ2luYXRlUmVzdCwgaXNQYWdpbmF0aW5nRW5kcG9pbnQsIHBhZ2luYXRlUmVzdCwgcGFnaW5hdGluZ0VuZHBvaW50cyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2009\n')},9378:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ legacyRestEndpointMethods: () => (/* binding */ legacyRestEndpointMethods),\n/* harmony export */ restEndpointMethods: () => (/* binding */ restEndpointMethods)\n/* harmony export */ });\nconst Endpoints = {\n actions: {\n addCustomLabelsToSelfHostedRunnerForOrg: [\n "POST /orgs/{org}/actions/runners/{runner_id}/labels",\n ],\n addCustomLabelsToSelfHostedRunnerForRepo: [\n "POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels",\n ],\n addSelectedRepoToOrgSecret: [\n "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}",\n ],\n approveWorkflowRun: [\n "POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve",\n ],\n cancelWorkflowRun: [\n "POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel",\n ],\n createOrUpdateEnvironmentSecret: [\n "PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}",\n ],\n createOrUpdateOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}"],\n createOrUpdateRepoSecret: [\n "PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",\n ],\n createRegistrationTokenForOrg: [\n "POST /orgs/{org}/actions/runners/registration-token",\n ],\n createRegistrationTokenForRepo: [\n "POST /repos/{owner}/{repo}/actions/runners/registration-token",\n ],\n createRemoveTokenForOrg: ["POST /orgs/{org}/actions/runners/remove-token"],\n createRemoveTokenForRepo: [\n "POST /repos/{owner}/{repo}/actions/runners/remove-token",\n ],\n createWorkflowDispatch: [\n "POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches",\n ],\n deleteActionsCacheById: [\n "DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}",\n ],\n deleteActionsCacheByKey: [\n "DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}",\n ],\n deleteArtifact: [\n "DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}",\n ],\n deleteEnvironmentSecret: [\n "DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}",\n ],\n deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"],\n deleteRepoSecret: [\n "DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",\n ],\n deleteSelfHostedRunnerFromOrg: [\n "DELETE /orgs/{org}/actions/runners/{runner_id}",\n ],\n deleteSelfHostedRunnerFromRepo: [\n "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}",\n ],\n deleteWorkflowRun: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"],\n deleteWorkflowRunLogs: [\n "DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs",\n ],\n disableSelectedRepositoryGithubActionsOrganization: [\n "DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}",\n ],\n disableWorkflow: [\n "PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable",\n ],\n downloadArtifact: [\n "GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}",\n ],\n downloadJobLogsForWorkflowRun: [\n "GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs",\n ],\n downloadWorkflowRunAttemptLogs: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs",\n ],\n downloadWorkflowRunLogs: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs",\n ],\n enableSelectedRepositoryGithubActionsOrganization: [\n "PUT /orgs/{org}/actions/permissions/repositories/{repository_id}",\n ],\n enableWorkflow: [\n "PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable",\n ],\n getActionsCacheList: ["GET /repos/{owner}/{repo}/actions/caches"],\n getActionsCacheUsage: ["GET /repos/{owner}/{repo}/actions/cache/usage"],\n getActionsCacheUsageByRepoForOrg: [\n "GET /orgs/{org}/actions/cache/usage-by-repository",\n ],\n getActionsCacheUsageForEnterprise: [\n "GET /enterprises/{enterprise}/actions/cache/usage",\n ],\n getActionsCacheUsageForOrg: ["GET /orgs/{org}/actions/cache/usage"],\n getAllowedActionsOrganization: [\n "GET /orgs/{org}/actions/permissions/selected-actions",\n ],\n getAllowedActionsRepository: [\n "GET /repos/{owner}/{repo}/actions/permissions/selected-actions",\n ],\n getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"],\n getEnvironmentPublicKey: [\n "GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key",\n ],\n getEnvironmentSecret: [\n "GET /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}",\n ],\n getGithubActionsDefaultWorkflowPermissionsEnterprise: [\n "GET /enterprises/{enterprise}/actions/permissions/workflow",\n ],\n getGithubActionsDefaultWorkflowPermissionsOrganization: [\n "GET /orgs/{org}/actions/permissions/workflow",\n ],\n getGithubActionsDefaultWorkflowPermissionsRepository: [\n "GET /repos/{owner}/{repo}/actions/permissions/workflow",\n ],\n getGithubActionsPermissionsOrganization: [\n "GET /orgs/{org}/actions/permissions",\n ],\n getGithubActionsPermissionsRepository: [\n "GET /repos/{owner}/{repo}/actions/permissions",\n ],\n getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"],\n getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"],\n getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"],\n getPendingDeploymentsForRun: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments",\n ],\n getRepoPermissions: [\n "GET /repos/{owner}/{repo}/actions/permissions",\n {},\n { renamed: ["actions", "getGithubActionsPermissionsRepository"] },\n ],\n getRepoPublicKey: ["GET /repos/{owner}/{repo}/actions/secrets/public-key"],\n getRepoSecret: ["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"],\n getReviewsForRun: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals",\n ],\n getSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}"],\n getSelfHostedRunnerForRepo: [\n "GET /repos/{owner}/{repo}/actions/runners/{runner_id}",\n ],\n getWorkflow: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"],\n getWorkflowAccessToRepository: [\n "GET /repos/{owner}/{repo}/actions/permissions/access",\n ],\n getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"],\n getWorkflowRunAttempt: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}",\n ],\n getWorkflowRunUsage: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing",\n ],\n getWorkflowUsage: [\n "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing",\n ],\n listArtifactsForRepo: ["GET /repos/{owner}/{repo}/actions/artifacts"],\n listEnvironmentSecrets: [\n "GET /repositories/{repository_id}/environments/{environment_name}/secrets",\n ],\n listJobsForWorkflowRun: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs",\n ],\n listJobsForWorkflowRunAttempt: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs",\n ],\n listLabelsForSelfHostedRunnerForOrg: [\n "GET /orgs/{org}/actions/runners/{runner_id}/labels",\n ],\n listLabelsForSelfHostedRunnerForRepo: [\n "GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels",\n ],\n listOrgSecrets: ["GET /orgs/{org}/actions/secrets"],\n listRepoSecrets: ["GET /repos/{owner}/{repo}/actions/secrets"],\n listRepoWorkflows: ["GET /repos/{owner}/{repo}/actions/workflows"],\n listRunnerApplicationsForOrg: ["GET /orgs/{org}/actions/runners/downloads"],\n listRunnerApplicationsForRepo: [\n "GET /repos/{owner}/{repo}/actions/runners/downloads",\n ],\n listSelectedReposForOrgSecret: [\n "GET /orgs/{org}/actions/secrets/{secret_name}/repositories",\n ],\n listSelectedRepositoriesEnabledGithubActionsOrganization: [\n "GET /orgs/{org}/actions/permissions/repositories",\n ],\n listSelfHostedRunnersForOrg: ["GET /orgs/{org}/actions/runners"],\n listSelfHostedRunnersForRepo: ["GET /repos/{owner}/{repo}/actions/runners"],\n listWorkflowRunArtifacts: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts",\n ],\n listWorkflowRuns: [\n "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs",\n ],\n listWorkflowRunsForRepo: ["GET /repos/{owner}/{repo}/actions/runs"],\n reRunJobForWorkflowRun: [\n "POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun",\n ],\n reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"],\n reRunWorkflowFailedJobs: [\n "POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs",\n ],\n removeAllCustomLabelsFromSelfHostedRunnerForOrg: [\n "DELETE /orgs/{org}/actions/runners/{runner_id}/labels",\n ],\n removeAllCustomLabelsFromSelfHostedRunnerForRepo: [\n "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels",\n ],\n removeCustomLabelFromSelfHostedRunnerForOrg: [\n "DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}",\n ],\n removeCustomLabelFromSelfHostedRunnerForRepo: [\n "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}",\n ],\n removeSelectedRepoFromOrgSecret: [\n "DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}",\n ],\n reviewPendingDeploymentsForRun: [\n "POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments",\n ],\n setAllowedActionsOrganization: [\n "PUT /orgs/{org}/actions/permissions/selected-actions",\n ],\n setAllowedActionsRepository: [\n "PUT /repos/{owner}/{repo}/actions/permissions/selected-actions",\n ],\n setCustomLabelsForSelfHostedRunnerForOrg: [\n "PUT /orgs/{org}/actions/runners/{runner_id}/labels",\n ],\n setCustomLabelsForSelfHostedRunnerForRepo: [\n "PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels",\n ],\n setGithubActionsDefaultWorkflowPermissionsEnterprise: [\n "PUT /enterprises/{enterprise}/actions/permissions/workflow",\n ],\n setGithubActionsDefaultWorkflowPermissionsOrganization: [\n "PUT /orgs/{org}/actions/permissions/workflow",\n ],\n setGithubActionsDefaultWorkflowPermissionsRepository: [\n "PUT /repos/{owner}/{repo}/actions/permissions/workflow",\n ],\n setGithubActionsPermissionsOrganization: [\n "PUT /orgs/{org}/actions/permissions",\n ],\n setGithubActionsPermissionsRepository: [\n "PUT /repos/{owner}/{repo}/actions/permissions",\n ],\n setSelectedReposForOrgSecret: [\n "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories",\n ],\n setSelectedRepositoriesEnabledGithubActionsOrganization: [\n "PUT /orgs/{org}/actions/permissions/repositories",\n ],\n setWorkflowAccessToRepository: [\n "PUT /repos/{owner}/{repo}/actions/permissions/access",\n ],\n },\n activity: {\n checkRepoIsStarredByAuthenticatedUser: ["GET /user/starred/{owner}/{repo}"],\n deleteRepoSubscription: ["DELETE /repos/{owner}/{repo}/subscription"],\n deleteThreadSubscription: [\n "DELETE /notifications/threads/{thread_id}/subscription",\n ],\n getFeeds: ["GET /feeds"],\n getRepoSubscription: ["GET /repos/{owner}/{repo}/subscription"],\n getThread: ["GET /notifications/threads/{thread_id}"],\n getThreadSubscriptionForAuthenticatedUser: [\n "GET /notifications/threads/{thread_id}/subscription",\n ],\n listEventsForAuthenticatedUser: ["GET /users/{username}/events"],\n listNotificationsForAuthenticatedUser: ["GET /notifications"],\n listOrgEventsForAuthenticatedUser: [\n "GET /users/{username}/events/orgs/{org}",\n ],\n listPublicEvents: ["GET /events"],\n listPublicEventsForRepoNetwork: ["GET /networks/{owner}/{repo}/events"],\n listPublicEventsForUser: ["GET /users/{username}/events/public"],\n listPublicOrgEvents: ["GET /orgs/{org}/events"],\n listReceivedEventsForUser: ["GET /users/{username}/received_events"],\n listReceivedPublicEventsForUser: [\n "GET /users/{username}/received_events/public",\n ],\n listRepoEvents: ["GET /repos/{owner}/{repo}/events"],\n listRepoNotificationsForAuthenticatedUser: [\n "GET /repos/{owner}/{repo}/notifications",\n ],\n listReposStarredByAuthenticatedUser: ["GET /user/starred"],\n listReposStarredByUser: ["GET /users/{username}/starred"],\n listReposWatchedByUser: ["GET /users/{username}/subscriptions"],\n listStargazersForRepo: ["GET /repos/{owner}/{repo}/stargazers"],\n listWatchedReposForAuthenticatedUser: ["GET /user/subscriptions"],\n listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"],\n markNotificationsAsRead: ["PUT /notifications"],\n markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"],\n markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"],\n setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"],\n setThreadSubscription: [\n "PUT /notifications/threads/{thread_id}/subscription",\n ],\n starRepoForAuthenticatedUser: ["PUT /user/starred/{owner}/{repo}"],\n unstarRepoForAuthenticatedUser: ["DELETE /user/starred/{owner}/{repo}"],\n },\n apps: {\n addRepoToInstallation: [\n "PUT /user/installations/{installation_id}/repositories/{repository_id}",\n {},\n { renamed: ["apps", "addRepoToInstallationForAuthenticatedUser"] },\n ],\n addRepoToInstallationForAuthenticatedUser: [\n "PUT /user/installations/{installation_id}/repositories/{repository_id}",\n ],\n checkToken: ["POST /applications/{client_id}/token"],\n createFromManifest: ["POST /app-manifests/{code}/conversions"],\n createInstallationAccessToken: [\n "POST /app/installations/{installation_id}/access_tokens",\n ],\n deleteAuthorization: ["DELETE /applications/{client_id}/grant"],\n deleteInstallation: ["DELETE /app/installations/{installation_id}"],\n deleteToken: ["DELETE /applications/{client_id}/token"],\n getAuthenticated: ["GET /app"],\n getBySlug: ["GET /apps/{app_slug}"],\n getInstallation: ["GET /app/installations/{installation_id}"],\n getOrgInstallation: ["GET /orgs/{org}/installation"],\n getRepoInstallation: ["GET /repos/{owner}/{repo}/installation"],\n getSubscriptionPlanForAccount: [\n "GET /marketplace_listing/accounts/{account_id}",\n ],\n getSubscriptionPlanForAccountStubbed: [\n "GET /marketplace_listing/stubbed/accounts/{account_id}",\n ],\n getUserInstallation: ["GET /users/{username}/installation"],\n getWebhookConfigForApp: ["GET /app/hook/config"],\n getWebhookDelivery: ["GET /app/hook/deliveries/{delivery_id}"],\n listAccountsForPlan: ["GET /marketplace_listing/plans/{plan_id}/accounts"],\n listAccountsForPlanStubbed: [\n "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts",\n ],\n listInstallationReposForAuthenticatedUser: [\n "GET /user/installations/{installation_id}/repositories",\n ],\n listInstallations: ["GET /app/installations"],\n listInstallationsForAuthenticatedUser: ["GET /user/installations"],\n listPlans: ["GET /marketplace_listing/plans"],\n listPlansStubbed: ["GET /marketplace_listing/stubbed/plans"],\n listReposAccessibleToInstallation: ["GET /installation/repositories"],\n listSubscriptionsForAuthenticatedUser: ["GET /user/marketplace_purchases"],\n listSubscriptionsForAuthenticatedUserStubbed: [\n "GET /user/marketplace_purchases/stubbed",\n ],\n listWebhookDeliveries: ["GET /app/hook/deliveries"],\n redeliverWebhookDelivery: [\n "POST /app/hook/deliveries/{delivery_id}/attempts",\n ],\n removeRepoFromInstallation: [\n "DELETE /user/installations/{installation_id}/repositories/{repository_id}",\n {},\n { renamed: ["apps", "removeRepoFromInstallationForAuthenticatedUser"] },\n ],\n removeRepoFromInstallationForAuthenticatedUser: [\n "DELETE /user/installations/{installation_id}/repositories/{repository_id}",\n ],\n resetToken: ["PATCH /applications/{client_id}/token"],\n revokeInstallationAccessToken: ["DELETE /installation/token"],\n scopeToken: ["POST /applications/{client_id}/token/scoped"],\n suspendInstallation: ["PUT /app/installations/{installation_id}/suspended"],\n unsuspendInstallation: [\n "DELETE /app/installations/{installation_id}/suspended",\n ],\n updateWebhookConfigForApp: ["PATCH /app/hook/config"],\n },\n billing: {\n getGithubActionsBillingOrg: ["GET /orgs/{org}/settings/billing/actions"],\n getGithubActionsBillingUser: [\n "GET /users/{username}/settings/billing/actions",\n ],\n getGithubAdvancedSecurityBillingGhe: [\n "GET /enterprises/{enterprise}/settings/billing/advanced-security",\n ],\n getGithubAdvancedSecurityBillingOrg: [\n "GET /orgs/{org}/settings/billing/advanced-security",\n ],\n getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"],\n getGithubPackagesBillingUser: [\n "GET /users/{username}/settings/billing/packages",\n ],\n getSharedStorageBillingOrg: [\n "GET /orgs/{org}/settings/billing/shared-storage",\n ],\n getSharedStorageBillingUser: [\n "GET /users/{username}/settings/billing/shared-storage",\n ],\n },\n checks: {\n create: ["POST /repos/{owner}/{repo}/check-runs"],\n createSuite: ["POST /repos/{owner}/{repo}/check-suites"],\n get: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}"],\n getSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}"],\n listAnnotations: [\n "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations",\n ],\n listForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-runs"],\n listForSuite: [\n "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs",\n ],\n listSuitesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-suites"],\n rerequestRun: [\n "POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest",\n ],\n rerequestSuite: [\n "POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest",\n ],\n setSuitesPreferences: [\n "PATCH /repos/{owner}/{repo}/check-suites/preferences",\n ],\n update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"],\n },\n codeScanning: {\n deleteAnalysis: [\n "DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}",\n ],\n getAlert: [\n "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}",\n {},\n { renamedParameters: { alert_id: "alert_number" } },\n ],\n getAnalysis: [\n "GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}",\n ],\n getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"],\n listAlertInstances: [\n "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances",\n ],\n listAlertsForOrg: ["GET /orgs/{org}/code-scanning/alerts"],\n listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"],\n listAlertsInstances: [\n "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances",\n {},\n { renamed: ["codeScanning", "listAlertInstances"] },\n ],\n listRecentAnalyses: ["GET /repos/{owner}/{repo}/code-scanning/analyses"],\n updateAlert: [\n "PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}",\n ],\n uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"],\n },\n codesOfConduct: {\n getAllCodesOfConduct: ["GET /codes_of_conduct"],\n getConductCode: ["GET /codes_of_conduct/{key}"],\n },\n codespaces: {\n addRepositoryForSecretForAuthenticatedUser: [\n "PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}",\n ],\n codespaceMachinesForAuthenticatedUser: [\n "GET /user/codespaces/{codespace_name}/machines",\n ],\n createForAuthenticatedUser: ["POST /user/codespaces"],\n createOrUpdateRepoSecret: [\n "PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}",\n ],\n createOrUpdateSecretForAuthenticatedUser: [\n "PUT /user/codespaces/secrets/{secret_name}",\n ],\n createWithPrForAuthenticatedUser: [\n "POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces",\n ],\n createWithRepoForAuthenticatedUser: [\n "POST /repos/{owner}/{repo}/codespaces",\n ],\n deleteForAuthenticatedUser: ["DELETE /user/codespaces/{codespace_name}"],\n deleteFromOrganization: [\n "DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}",\n ],\n deleteRepoSecret: [\n "DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}",\n ],\n deleteSecretForAuthenticatedUser: [\n "DELETE /user/codespaces/secrets/{secret_name}",\n ],\n exportForAuthenticatedUser: [\n "POST /user/codespaces/{codespace_name}/exports",\n ],\n getExportDetailsForAuthenticatedUser: [\n "GET /user/codespaces/{codespace_name}/exports/{export_id}",\n ],\n getForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}"],\n getPublicKeyForAuthenticatedUser: [\n "GET /user/codespaces/secrets/public-key",\n ],\n getRepoPublicKey: [\n "GET /repos/{owner}/{repo}/codespaces/secrets/public-key",\n ],\n getRepoSecret: [\n "GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}",\n ],\n getSecretForAuthenticatedUser: [\n "GET /user/codespaces/secrets/{secret_name}",\n ],\n listDevcontainersInRepositoryForAuthenticatedUser: [\n "GET /repos/{owner}/{repo}/codespaces/devcontainers",\n ],\n listForAuthenticatedUser: ["GET /user/codespaces"],\n listInOrganization: [\n "GET /orgs/{org}/codespaces",\n {},\n { renamedParameters: { org_id: "org" } },\n ],\n listInRepositoryForAuthenticatedUser: [\n "GET /repos/{owner}/{repo}/codespaces",\n ],\n listRepoSecrets: ["GET /repos/{owner}/{repo}/codespaces/secrets"],\n listRepositoriesForSecretForAuthenticatedUser: [\n "GET /user/codespaces/secrets/{secret_name}/repositories",\n ],\n listSecretsForAuthenticatedUser: ["GET /user/codespaces/secrets"],\n removeRepositoryForSecretForAuthenticatedUser: [\n "DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}",\n ],\n repoMachinesForAuthenticatedUser: [\n "GET /repos/{owner}/{repo}/codespaces/machines",\n ],\n setRepositoriesForSecretForAuthenticatedUser: [\n "PUT /user/codespaces/secrets/{secret_name}/repositories",\n ],\n startForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/start"],\n stopForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/stop"],\n stopInOrganization: [\n "POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop",\n ],\n updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"],\n },\n dependabot: {\n addSelectedRepoToOrgSecret: [\n "PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}",\n ],\n createOrUpdateOrgSecret: [\n "PUT /orgs/{org}/dependabot/secrets/{secret_name}",\n ],\n createOrUpdateRepoSecret: [\n "PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}",\n ],\n deleteOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"],\n deleteRepoSecret: [\n "DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}",\n ],\n getOrgPublicKey: ["GET /orgs/{org}/dependabot/secrets/public-key"],\n getOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}"],\n getRepoPublicKey: [\n "GET /repos/{owner}/{repo}/dependabot/secrets/public-key",\n ],\n getRepoSecret: [\n "GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}",\n ],\n listOrgSecrets: ["GET /orgs/{org}/dependabot/secrets"],\n listRepoSecrets: ["GET /repos/{owner}/{repo}/dependabot/secrets"],\n listSelectedReposForOrgSecret: [\n "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories",\n ],\n removeSelectedRepoFromOrgSecret: [\n "DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}",\n ],\n setSelectedReposForOrgSecret: [\n "PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories",\n ],\n },\n dependencyGraph: {\n createRepositorySnapshot: [\n "POST /repos/{owner}/{repo}/dependency-graph/snapshots",\n ],\n diffRange: [\n "GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}",\n ],\n },\n emojis: { get: ["GET /emojis"] },\n enterpriseAdmin: {\n addCustomLabelsToSelfHostedRunnerForEnterprise: [\n "POST /enterprises/{enterprise}/actions/runners/{runner_id}/labels",\n ],\n disableSelectedOrganizationGithubActionsEnterprise: [\n "DELETE /enterprises/{enterprise}/actions/permissions/organizations/{org_id}",\n ],\n enableSelectedOrganizationGithubActionsEnterprise: [\n "PUT /enterprises/{enterprise}/actions/permissions/organizations/{org_id}",\n ],\n getAllowedActionsEnterprise: [\n "GET /enterprises/{enterprise}/actions/permissions/selected-actions",\n ],\n getGithubActionsPermissionsEnterprise: [\n "GET /enterprises/{enterprise}/actions/permissions",\n ],\n getServerStatistics: [\n "GET /enterprise-installation/{enterprise_or_org}/server-statistics",\n ],\n listLabelsForSelfHostedRunnerForEnterprise: [\n "GET /enterprises/{enterprise}/actions/runners/{runner_id}/labels",\n ],\n listSelectedOrganizationsEnabledGithubActionsEnterprise: [\n "GET /enterprises/{enterprise}/actions/permissions/organizations",\n ],\n removeAllCustomLabelsFromSelfHostedRunnerForEnterprise: [\n "DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels",\n ],\n removeCustomLabelFromSelfHostedRunnerForEnterprise: [\n "DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels/{name}",\n ],\n setAllowedActionsEnterprise: [\n "PUT /enterprises/{enterprise}/actions/permissions/selected-actions",\n ],\n setCustomLabelsForSelfHostedRunnerForEnterprise: [\n "PUT /enterprises/{enterprise}/actions/runners/{runner_id}/labels",\n ],\n setGithubActionsPermissionsEnterprise: [\n "PUT /enterprises/{enterprise}/actions/permissions",\n ],\n setSelectedOrganizationsEnabledGithubActionsEnterprise: [\n "PUT /enterprises/{enterprise}/actions/permissions/organizations",\n ],\n },\n gists: {\n checkIsStarred: ["GET /gists/{gist_id}/star"],\n create: ["POST /gists"],\n createComment: ["POST /gists/{gist_id}/comments"],\n delete: ["DELETE /gists/{gist_id}"],\n deleteComment: ["DELETE /gists/{gist_id}/comments/{comment_id}"],\n fork: ["POST /gists/{gist_id}/forks"],\n get: ["GET /gists/{gist_id}"],\n getComment: ["GET /gists/{gist_id}/comments/{comment_id}"],\n getRevision: ["GET /gists/{gist_id}/{sha}"],\n list: ["GET /gists"],\n listComments: ["GET /gists/{gist_id}/comments"],\n listCommits: ["GET /gists/{gist_id}/commits"],\n listForUser: ["GET /users/{username}/gists"],\n listForks: ["GET /gists/{gist_id}/forks"],\n listPublic: ["GET /gists/public"],\n listStarred: ["GET /gists/starred"],\n star: ["PUT /gists/{gist_id}/star"],\n unstar: ["DELETE /gists/{gist_id}/star"],\n update: ["PATCH /gists/{gist_id}"],\n updateComment: ["PATCH /gists/{gist_id}/comments/{comment_id}"],\n },\n git: {\n createBlob: ["POST /repos/{owner}/{repo}/git/blobs"],\n createCommit: ["POST /repos/{owner}/{repo}/git/commits"],\n createRef: ["POST /repos/{owner}/{repo}/git/refs"],\n createTag: ["POST /repos/{owner}/{repo}/git/tags"],\n createTree: ["POST /repos/{owner}/{repo}/git/trees"],\n deleteRef: ["DELETE /repos/{owner}/{repo}/git/refs/{ref}"],\n getBlob: ["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"],\n getCommit: ["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"],\n getRef: ["GET /repos/{owner}/{repo}/git/ref/{ref}"],\n getTag: ["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"],\n getTree: ["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"],\n listMatchingRefs: ["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"],\n updateRef: ["PATCH /repos/{owner}/{repo}/git/refs/{ref}"],\n },\n gitignore: {\n getAllTemplates: ["GET /gitignore/templates"],\n getTemplate: ["GET /gitignore/templates/{name}"],\n },\n interactions: {\n getRestrictionsForAuthenticatedUser: ["GET /user/interaction-limits"],\n getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits"],\n getRestrictionsForRepo: ["GET /repos/{owner}/{repo}/interaction-limits"],\n getRestrictionsForYourPublicRepos: [\n "GET /user/interaction-limits",\n {},\n { renamed: ["interactions", "getRestrictionsForAuthenticatedUser"] },\n ],\n removeRestrictionsForAuthenticatedUser: ["DELETE /user/interaction-limits"],\n removeRestrictionsForOrg: ["DELETE /orgs/{org}/interaction-limits"],\n removeRestrictionsForRepo: [\n "DELETE /repos/{owner}/{repo}/interaction-limits",\n ],\n removeRestrictionsForYourPublicRepos: [\n "DELETE /user/interaction-limits",\n {},\n { renamed: ["interactions", "removeRestrictionsForAuthenticatedUser"] },\n ],\n setRestrictionsForAuthenticatedUser: ["PUT /user/interaction-limits"],\n setRestrictionsForOrg: ["PUT /orgs/{org}/interaction-limits"],\n setRestrictionsForRepo: ["PUT /repos/{owner}/{repo}/interaction-limits"],\n setRestrictionsForYourPublicRepos: [\n "PUT /user/interaction-limits",\n {},\n { renamed: ["interactions", "setRestrictionsForAuthenticatedUser"] },\n ],\n },\n issues: {\n addAssignees: [\n "POST /repos/{owner}/{repo}/issues/{issue_number}/assignees",\n ],\n addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"],\n checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"],\n create: ["POST /repos/{owner}/{repo}/issues"],\n createComment: [\n "POST /repos/{owner}/{repo}/issues/{issue_number}/comments",\n ],\n createLabel: ["POST /repos/{owner}/{repo}/labels"],\n createMilestone: ["POST /repos/{owner}/{repo}/milestones"],\n deleteComment: [\n "DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}",\n ],\n deleteLabel: ["DELETE /repos/{owner}/{repo}/labels/{name}"],\n deleteMilestone: [\n "DELETE /repos/{owner}/{repo}/milestones/{milestone_number}",\n ],\n get: ["GET /repos/{owner}/{repo}/issues/{issue_number}"],\n getComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"],\n getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"],\n getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"],\n getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"],\n list: ["GET /issues"],\n listAssignees: ["GET /repos/{owner}/{repo}/assignees"],\n listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"],\n listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"],\n listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"],\n listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"],\n listEventsForTimeline: [\n "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline",\n ],\n listForAuthenticatedUser: ["GET /user/issues"],\n listForOrg: ["GET /orgs/{org}/issues"],\n listForRepo: ["GET /repos/{owner}/{repo}/issues"],\n listLabelsForMilestone: [\n "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels",\n ],\n listLabelsForRepo: ["GET /repos/{owner}/{repo}/labels"],\n listLabelsOnIssue: [\n "GET /repos/{owner}/{repo}/issues/{issue_number}/labels",\n ],\n listMilestones: ["GET /repos/{owner}/{repo}/milestones"],\n lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"],\n removeAllLabels: [\n "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels",\n ],\n removeAssignees: [\n "DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees",\n ],\n removeLabel: [\n "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}",\n ],\n setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"],\n unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"],\n update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"],\n updateComment: ["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"],\n updateLabel: ["PATCH /repos/{owner}/{repo}/labels/{name}"],\n updateMilestone: [\n "PATCH /repos/{owner}/{repo}/milestones/{milestone_number}",\n ],\n },\n licenses: {\n get: ["GET /licenses/{license}"],\n getAllCommonlyUsed: ["GET /licenses"],\n getForRepo: ["GET /repos/{owner}/{repo}/license"],\n },\n markdown: {\n render: ["POST /markdown"],\n renderRaw: [\n "POST /markdown/raw",\n { headers: { "content-type": "text/plain; charset=utf-8" } },\n ],\n },\n meta: {\n get: ["GET /meta"],\n getOctocat: ["GET /octocat"],\n getZen: ["GET /zen"],\n root: ["GET /"],\n },\n migrations: {\n cancelImport: ["DELETE /repos/{owner}/{repo}/import"],\n deleteArchiveForAuthenticatedUser: [\n "DELETE /user/migrations/{migration_id}/archive",\n ],\n deleteArchiveForOrg: [\n "DELETE /orgs/{org}/migrations/{migration_id}/archive",\n ],\n downloadArchiveForOrg: [\n "GET /orgs/{org}/migrations/{migration_id}/archive",\n ],\n getArchiveForAuthenticatedUser: [\n "GET /user/migrations/{migration_id}/archive",\n ],\n getCommitAuthors: ["GET /repos/{owner}/{repo}/import/authors"],\n getImportStatus: ["GET /repos/{owner}/{repo}/import"],\n getLargeFiles: ["GET /repos/{owner}/{repo}/import/large_files"],\n getStatusForAuthenticatedUser: ["GET /user/migrations/{migration_id}"],\n getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}"],\n listForAuthenticatedUser: ["GET /user/migrations"],\n listForOrg: ["GET /orgs/{org}/migrations"],\n listReposForAuthenticatedUser: [\n "GET /user/migrations/{migration_id}/repositories",\n ],\n listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories"],\n listReposForUser: [\n "GET /user/migrations/{migration_id}/repositories",\n {},\n { renamed: ["migrations", "listReposForAuthenticatedUser"] },\n ],\n mapCommitAuthor: ["PATCH /repos/{owner}/{repo}/import/authors/{author_id}"],\n setLfsPreference: ["PATCH /repos/{owner}/{repo}/import/lfs"],\n startForAuthenticatedUser: ["POST /user/migrations"],\n startForOrg: ["POST /orgs/{org}/migrations"],\n startImport: ["PUT /repos/{owner}/{repo}/import"],\n unlockRepoForAuthenticatedUser: [\n "DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock",\n ],\n unlockRepoForOrg: [\n "DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock",\n ],\n updateImport: ["PATCH /repos/{owner}/{repo}/import"],\n },\n orgs: {\n blockUser: ["PUT /orgs/{org}/blocks/{username}"],\n cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"],\n checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"],\n checkMembershipForUser: ["GET /orgs/{org}/members/{username}"],\n checkPublicMembershipForUser: ["GET /orgs/{org}/public_members/{username}"],\n convertMemberToOutsideCollaborator: [\n "PUT /orgs/{org}/outside_collaborators/{username}",\n ],\n createInvitation: ["POST /orgs/{org}/invitations"],\n createWebhook: ["POST /orgs/{org}/hooks"],\n deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"],\n get: ["GET /orgs/{org}"],\n getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"],\n getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"],\n getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"],\n getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"],\n getWebhookDelivery: [\n "GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}",\n ],\n list: ["GET /organizations"],\n listAppInstallations: ["GET /orgs/{org}/installations"],\n listBlockedUsers: ["GET /orgs/{org}/blocks"],\n listCustomRoles: ["GET /organizations/{organization_id}/custom_roles"],\n listFailedInvitations: ["GET /orgs/{org}/failed_invitations"],\n listForAuthenticatedUser: ["GET /user/orgs"],\n listForUser: ["GET /users/{username}/orgs"],\n listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"],\n listMembers: ["GET /orgs/{org}/members"],\n listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"],\n listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"],\n listPendingInvitations: ["GET /orgs/{org}/invitations"],\n listPublicMembers: ["GET /orgs/{org}/public_members"],\n listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"],\n listWebhooks: ["GET /orgs/{org}/hooks"],\n pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"],\n redeliverWebhookDelivery: [\n "POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts",\n ],\n removeMember: ["DELETE /orgs/{org}/members/{username}"],\n removeMembershipForUser: ["DELETE /orgs/{org}/memberships/{username}"],\n removeOutsideCollaborator: [\n "DELETE /orgs/{org}/outside_collaborators/{username}",\n ],\n removePublicMembershipForAuthenticatedUser: [\n "DELETE /orgs/{org}/public_members/{username}",\n ],\n setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"],\n setPublicMembershipForAuthenticatedUser: [\n "PUT /orgs/{org}/public_members/{username}",\n ],\n unblockUser: ["DELETE /orgs/{org}/blocks/{username}"],\n update: ["PATCH /orgs/{org}"],\n updateMembershipForAuthenticatedUser: [\n "PATCH /user/memberships/orgs/{org}",\n ],\n updateWebhook: ["PATCH /orgs/{org}/hooks/{hook_id}"],\n updateWebhookConfigForOrg: ["PATCH /orgs/{org}/hooks/{hook_id}/config"],\n },\n packages: {\n deletePackageForAuthenticatedUser: [\n "DELETE /user/packages/{package_type}/{package_name}",\n ],\n deletePackageForOrg: [\n "DELETE /orgs/{org}/packages/{package_type}/{package_name}",\n ],\n deletePackageForUser: [\n "DELETE /users/{username}/packages/{package_type}/{package_name}",\n ],\n deletePackageVersionForAuthenticatedUser: [\n "DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}",\n ],\n deletePackageVersionForOrg: [\n "DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}",\n ],\n deletePackageVersionForUser: [\n "DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}",\n ],\n getAllPackageVersionsForAPackageOwnedByAnOrg: [\n "GET /orgs/{org}/packages/{package_type}/{package_name}/versions",\n {},\n { renamed: ["packages", "getAllPackageVersionsForPackageOwnedByOrg"] },\n ],\n getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: [\n "GET /user/packages/{package_type}/{package_name}/versions",\n {},\n {\n renamed: [\n "packages",\n "getAllPackageVersionsForPackageOwnedByAuthenticatedUser",\n ],\n },\n ],\n getAllPackageVersionsForPackageOwnedByAuthenticatedUser: [\n "GET /user/packages/{package_type}/{package_name}/versions",\n ],\n getAllPackageVersionsForPackageOwnedByOrg: [\n "GET /orgs/{org}/packages/{package_type}/{package_name}/versions",\n ],\n getAllPackageVersionsForPackageOwnedByUser: [\n "GET /users/{username}/packages/{package_type}/{package_name}/versions",\n ],\n getPackageForAuthenticatedUser: [\n "GET /user/packages/{package_type}/{package_name}",\n ],\n getPackageForOrganization: [\n "GET /orgs/{org}/packages/{package_type}/{package_name}",\n ],\n getPackageForUser: [\n "GET /users/{username}/packages/{package_type}/{package_name}",\n ],\n getPackageVersionForAuthenticatedUser: [\n "GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}",\n ],\n getPackageVersionForOrganization: [\n "GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}",\n ],\n getPackageVersionForUser: [\n "GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}",\n ],\n listPackagesForAuthenticatedUser: ["GET /user/packages"],\n listPackagesForOrganization: ["GET /orgs/{org}/packages"],\n listPackagesForUser: ["GET /users/{username}/packages"],\n restorePackageForAuthenticatedUser: [\n "POST /user/packages/{package_type}/{package_name}/restore{?token}",\n ],\n restorePackageForOrg: [\n "POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}",\n ],\n restorePackageForUser: [\n "POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}",\n ],\n restorePackageVersionForAuthenticatedUser: [\n "POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore",\n ],\n restorePackageVersionForOrg: [\n "POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore",\n ],\n restorePackageVersionForUser: [\n "POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore",\n ],\n },\n projects: {\n addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}"],\n createCard: ["POST /projects/columns/{column_id}/cards"],\n createColumn: ["POST /projects/{project_id}/columns"],\n createForAuthenticatedUser: ["POST /user/projects"],\n createForOrg: ["POST /orgs/{org}/projects"],\n createForRepo: ["POST /repos/{owner}/{repo}/projects"],\n delete: ["DELETE /projects/{project_id}"],\n deleteCard: ["DELETE /projects/columns/cards/{card_id}"],\n deleteColumn: ["DELETE /projects/columns/{column_id}"],\n get: ["GET /projects/{project_id}"],\n getCard: ["GET /projects/columns/cards/{card_id}"],\n getColumn: ["GET /projects/columns/{column_id}"],\n getPermissionForUser: [\n "GET /projects/{project_id}/collaborators/{username}/permission",\n ],\n listCards: ["GET /projects/columns/{column_id}/cards"],\n listCollaborators: ["GET /projects/{project_id}/collaborators"],\n listColumns: ["GET /projects/{project_id}/columns"],\n listForOrg: ["GET /orgs/{org}/projects"],\n listForRepo: ["GET /repos/{owner}/{repo}/projects"],\n listForUser: ["GET /users/{username}/projects"],\n moveCard: ["POST /projects/columns/cards/{card_id}/moves"],\n moveColumn: ["POST /projects/columns/{column_id}/moves"],\n removeCollaborator: [\n "DELETE /projects/{project_id}/collaborators/{username}",\n ],\n update: ["PATCH /projects/{project_id}"],\n updateCard: ["PATCH /projects/columns/cards/{card_id}"],\n updateColumn: ["PATCH /projects/columns/{column_id}"],\n },\n pulls: {\n checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"],\n create: ["POST /repos/{owner}/{repo}/pulls"],\n createReplyForReviewComment: [\n "POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies",\n ],\n createReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"],\n createReviewComment: [\n "POST /repos/{owner}/{repo}/pulls/{pull_number}/comments",\n ],\n deletePendingReview: [\n "DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}",\n ],\n deleteReviewComment: [\n "DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}",\n ],\n dismissReview: [\n "PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals",\n ],\n get: ["GET /repos/{owner}/{repo}/pulls/{pull_number}"],\n getReview: [\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}",\n ],\n getReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"],\n list: ["GET /repos/{owner}/{repo}/pulls"],\n listCommentsForReview: [\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments",\n ],\n listCommits: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"],\n listFiles: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"],\n listRequestedReviewers: [\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers",\n ],\n listReviewComments: [\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments",\n ],\n listReviewCommentsForRepo: ["GET /repos/{owner}/{repo}/pulls/comments"],\n listReviews: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"],\n merge: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"],\n removeRequestedReviewers: [\n "DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers",\n ],\n requestReviewers: [\n "POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers",\n ],\n submitReview: [\n "POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events",\n ],\n update: ["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"],\n updateBranch: [\n "PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch",\n ],\n updateReview: [\n "PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}",\n ],\n updateReviewComment: [\n "PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}",\n ],\n },\n rateLimit: { get: ["GET /rate_limit"] },\n reactions: {\n createForCommitComment: [\n "POST /repos/{owner}/{repo}/comments/{comment_id}/reactions",\n ],\n createForIssue: [\n "POST /repos/{owner}/{repo}/issues/{issue_number}/reactions",\n ],\n createForIssueComment: [\n "POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions",\n ],\n createForPullRequestReviewComment: [\n "POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions",\n ],\n createForRelease: [\n "POST /repos/{owner}/{repo}/releases/{release_id}/reactions",\n ],\n createForTeamDiscussionCommentInOrg: [\n "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions",\n ],\n createForTeamDiscussionInOrg: [\n "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions",\n ],\n deleteForCommitComment: [\n "DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}",\n ],\n deleteForIssue: [\n "DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}",\n ],\n deleteForIssueComment: [\n "DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}",\n ],\n deleteForPullRequestComment: [\n "DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}",\n ],\n deleteForRelease: [\n "DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}",\n ],\n deleteForTeamDiscussion: [\n "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}",\n ],\n deleteForTeamDiscussionComment: [\n "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}",\n ],\n listForCommitComment: [\n "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions",\n ],\n listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"],\n listForIssueComment: [\n "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions",\n ],\n listForPullRequestReviewComment: [\n "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions",\n ],\n listForRelease: [\n "GET /repos/{owner}/{repo}/releases/{release_id}/reactions",\n ],\n listForTeamDiscussionCommentInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions",\n ],\n listForTeamDiscussionInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions",\n ],\n },\n repos: {\n acceptInvitation: [\n "PATCH /user/repository_invitations/{invitation_id}",\n {},\n { renamed: ["repos", "acceptInvitationForAuthenticatedUser"] },\n ],\n acceptInvitationForAuthenticatedUser: [\n "PATCH /user/repository_invitations/{invitation_id}",\n ],\n addAppAccessRestrictions: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",\n {},\n { mapToData: "apps" },\n ],\n addCollaborator: ["PUT /repos/{owner}/{repo}/collaborators/{username}"],\n addStatusCheckContexts: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",\n {},\n { mapToData: "contexts" },\n ],\n addTeamAccessRestrictions: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",\n {},\n { mapToData: "teams" },\n ],\n addUserAccessRestrictions: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",\n {},\n { mapToData: "users" },\n ],\n checkCollaborator: ["GET /repos/{owner}/{repo}/collaborators/{username}"],\n checkVulnerabilityAlerts: [\n "GET /repos/{owner}/{repo}/vulnerability-alerts",\n ],\n codeownersErrors: ["GET /repos/{owner}/{repo}/codeowners/errors"],\n compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"],\n compareCommitsWithBasehead: [\n "GET /repos/{owner}/{repo}/compare/{basehead}",\n ],\n createAutolink: ["POST /repos/{owner}/{repo}/autolinks"],\n createCommitComment: [\n "POST /repos/{owner}/{repo}/commits/{commit_sha}/comments",\n ],\n createCommitSignatureProtection: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures",\n ],\n createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"],\n createDeployKey: ["POST /repos/{owner}/{repo}/keys"],\n createDeployment: ["POST /repos/{owner}/{repo}/deployments"],\n createDeploymentStatus: [\n "POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses",\n ],\n createDispatchEvent: ["POST /repos/{owner}/{repo}/dispatches"],\n createForAuthenticatedUser: ["POST /user/repos"],\n createFork: ["POST /repos/{owner}/{repo}/forks"],\n createInOrg: ["POST /orgs/{org}/repos"],\n createOrUpdateEnvironment: [\n "PUT /repos/{owner}/{repo}/environments/{environment_name}",\n ],\n createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"],\n createPagesSite: ["POST /repos/{owner}/{repo}/pages"],\n createRelease: ["POST /repos/{owner}/{repo}/releases"],\n createTagProtection: ["POST /repos/{owner}/{repo}/tags/protection"],\n createUsingTemplate: [\n "POST /repos/{template_owner}/{template_repo}/generate",\n ],\n createWebhook: ["POST /repos/{owner}/{repo}/hooks"],\n declineInvitation: [\n "DELETE /user/repository_invitations/{invitation_id}",\n {},\n { renamed: ["repos", "declineInvitationForAuthenticatedUser"] },\n ],\n declineInvitationForAuthenticatedUser: [\n "DELETE /user/repository_invitations/{invitation_id}",\n ],\n delete: ["DELETE /repos/{owner}/{repo}"],\n deleteAccessRestrictions: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions",\n ],\n deleteAdminBranchProtection: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins",\n ],\n deleteAnEnvironment: [\n "DELETE /repos/{owner}/{repo}/environments/{environment_name}",\n ],\n deleteAutolink: ["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"],\n deleteBranchProtection: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection",\n ],\n deleteCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}"],\n deleteCommitSignatureProtection: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures",\n ],\n deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"],\n deleteDeployment: [\n "DELETE /repos/{owner}/{repo}/deployments/{deployment_id}",\n ],\n deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"],\n deleteInvitation: [\n "DELETE /repos/{owner}/{repo}/invitations/{invitation_id}",\n ],\n deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages"],\n deletePullRequestReviewProtection: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews",\n ],\n deleteRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}"],\n deleteReleaseAsset: [\n "DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}",\n ],\n deleteTagProtection: [\n "DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id}",\n ],\n deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"],\n disableAutomatedSecurityFixes: [\n "DELETE /repos/{owner}/{repo}/automated-security-fixes",\n ],\n disableLfsForRepo: ["DELETE /repos/{owner}/{repo}/lfs"],\n disableVulnerabilityAlerts: [\n "DELETE /repos/{owner}/{repo}/vulnerability-alerts",\n ],\n downloadArchive: [\n "GET /repos/{owner}/{repo}/zipball/{ref}",\n {},\n { renamed: ["repos", "downloadZipballArchive"] },\n ],\n downloadTarballArchive: ["GET /repos/{owner}/{repo}/tarball/{ref}"],\n downloadZipballArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}"],\n enableAutomatedSecurityFixes: [\n "PUT /repos/{owner}/{repo}/automated-security-fixes",\n ],\n enableLfsForRepo: ["PUT /repos/{owner}/{repo}/lfs"],\n enableVulnerabilityAlerts: [\n "PUT /repos/{owner}/{repo}/vulnerability-alerts",\n ],\n generateReleaseNotes: [\n "POST /repos/{owner}/{repo}/releases/generate-notes",\n ],\n get: ["GET /repos/{owner}/{repo}"],\n getAccessRestrictions: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions",\n ],\n getAdminBranchProtection: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins",\n ],\n getAllEnvironments: ["GET /repos/{owner}/{repo}/environments"],\n getAllStatusCheckContexts: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",\n ],\n getAllTopics: ["GET /repos/{owner}/{repo}/topics"],\n getAppsWithAccessToProtectedBranch: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",\n ],\n getAutolink: ["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"],\n getBranch: ["GET /repos/{owner}/{repo}/branches/{branch}"],\n getBranchProtection: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection",\n ],\n getClones: ["GET /repos/{owner}/{repo}/traffic/clones"],\n getCodeFrequencyStats: ["GET /repos/{owner}/{repo}/stats/code_frequency"],\n getCollaboratorPermissionLevel: [\n "GET /repos/{owner}/{repo}/collaborators/{username}/permission",\n ],\n getCombinedStatusForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/status"],\n getCommit: ["GET /repos/{owner}/{repo}/commits/{ref}"],\n getCommitActivityStats: ["GET /repos/{owner}/{repo}/stats/commit_activity"],\n getCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}"],\n getCommitSignatureProtection: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures",\n ],\n getCommunityProfileMetrics: ["GET /repos/{owner}/{repo}/community/profile"],\n getContent: ["GET /repos/{owner}/{repo}/contents/{path}"],\n getContributorsStats: ["GET /repos/{owner}/{repo}/stats/contributors"],\n getDeployKey: ["GET /repos/{owner}/{repo}/keys/{key_id}"],\n getDeployment: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}"],\n getDeploymentStatus: [\n "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}",\n ],\n getEnvironment: [\n "GET /repos/{owner}/{repo}/environments/{environment_name}",\n ],\n getLatestPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/latest"],\n getLatestRelease: ["GET /repos/{owner}/{repo}/releases/latest"],\n getPages: ["GET /repos/{owner}/{repo}/pages"],\n getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"],\n getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"],\n getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"],\n getPullRequestReviewProtection: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews",\n ],\n getPunchCardStats: ["GET /repos/{owner}/{repo}/stats/punch_card"],\n getReadme: ["GET /repos/{owner}/{repo}/readme"],\n getReadmeInDirectory: ["GET /repos/{owner}/{repo}/readme/{dir}"],\n getRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}"],\n getReleaseAsset: ["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"],\n getReleaseByTag: ["GET /repos/{owner}/{repo}/releases/tags/{tag}"],\n getStatusChecksProtection: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks",\n ],\n getTeamsWithAccessToProtectedBranch: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",\n ],\n getTopPaths: ["GET /repos/{owner}/{repo}/traffic/popular/paths"],\n getTopReferrers: ["GET /repos/{owner}/{repo}/traffic/popular/referrers"],\n getUsersWithAccessToProtectedBranch: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",\n ],\n getViews: ["GET /repos/{owner}/{repo}/traffic/views"],\n getWebhook: ["GET /repos/{owner}/{repo}/hooks/{hook_id}"],\n getWebhookConfigForRepo: [\n "GET /repos/{owner}/{repo}/hooks/{hook_id}/config",\n ],\n getWebhookDelivery: [\n "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}",\n ],\n listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"],\n listBranches: ["GET /repos/{owner}/{repo}/branches"],\n listBranchesForHeadCommit: [\n "GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head",\n ],\n listCollaborators: ["GET /repos/{owner}/{repo}/collaborators"],\n listCommentsForCommit: [\n "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments",\n ],\n listCommitCommentsForRepo: ["GET /repos/{owner}/{repo}/comments"],\n listCommitStatusesForRef: [\n "GET /repos/{owner}/{repo}/commits/{ref}/statuses",\n ],\n listCommits: ["GET /repos/{owner}/{repo}/commits"],\n listContributors: ["GET /repos/{owner}/{repo}/contributors"],\n listDeployKeys: ["GET /repos/{owner}/{repo}/keys"],\n listDeploymentStatuses: [\n "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses",\n ],\n listDeployments: ["GET /repos/{owner}/{repo}/deployments"],\n listForAuthenticatedUser: ["GET /user/repos"],\n listForOrg: ["GET /orgs/{org}/repos"],\n listForUser: ["GET /users/{username}/repos"],\n listForks: ["GET /repos/{owner}/{repo}/forks"],\n listInvitations: ["GET /repos/{owner}/{repo}/invitations"],\n listInvitationsForAuthenticatedUser: ["GET /user/repository_invitations"],\n listLanguages: ["GET /repos/{owner}/{repo}/languages"],\n listPagesBuilds: ["GET /repos/{owner}/{repo}/pages/builds"],\n listPublic: ["GET /repositories"],\n listPullRequestsAssociatedWithCommit: [\n "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls",\n ],\n listReleaseAssets: [\n "GET /repos/{owner}/{repo}/releases/{release_id}/assets",\n ],\n listReleases: ["GET /repos/{owner}/{repo}/releases"],\n listTagProtection: ["GET /repos/{owner}/{repo}/tags/protection"],\n listTags: ["GET /repos/{owner}/{repo}/tags"],\n listTeams: ["GET /repos/{owner}/{repo}/teams"],\n listWebhookDeliveries: [\n "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries",\n ],\n listWebhooks: ["GET /repos/{owner}/{repo}/hooks"],\n merge: ["POST /repos/{owner}/{repo}/merges"],\n mergeUpstream: ["POST /repos/{owner}/{repo}/merge-upstream"],\n pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"],\n redeliverWebhookDelivery: [\n "POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts",\n ],\n removeAppAccessRestrictions: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",\n {},\n { mapToData: "apps" },\n ],\n removeCollaborator: [\n "DELETE /repos/{owner}/{repo}/collaborators/{username}",\n ],\n removeStatusCheckContexts: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",\n {},\n { mapToData: "contexts" },\n ],\n removeStatusCheckProtection: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks",\n ],\n removeTeamAccessRestrictions: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",\n {},\n { mapToData: "teams" },\n ],\n removeUserAccessRestrictions: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",\n {},\n { mapToData: "users" },\n ],\n renameBranch: ["POST /repos/{owner}/{repo}/branches/{branch}/rename"],\n replaceAllTopics: ["PUT /repos/{owner}/{repo}/topics"],\n requestPagesBuild: ["POST /repos/{owner}/{repo}/pages/builds"],\n setAdminBranchProtection: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins",\n ],\n setAppAccessRestrictions: [\n "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",\n {},\n { mapToData: "apps" },\n ],\n setStatusCheckContexts: [\n "PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",\n {},\n { mapToData: "contexts" },\n ],\n setTeamAccessRestrictions: [\n "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",\n {},\n { mapToData: "teams" },\n ],\n setUserAccessRestrictions: [\n "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",\n {},\n { mapToData: "users" },\n ],\n testPushWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"],\n transfer: ["POST /repos/{owner}/{repo}/transfer"],\n update: ["PATCH /repos/{owner}/{repo}"],\n updateBranchProtection: [\n "PUT /repos/{owner}/{repo}/branches/{branch}/protection",\n ],\n updateCommitComment: ["PATCH /repos/{owner}/{repo}/comments/{comment_id}"],\n updateInformationAboutPagesSite: ["PUT /repos/{owner}/{repo}/pages"],\n updateInvitation: [\n "PATCH /repos/{owner}/{repo}/invitations/{invitation_id}",\n ],\n updatePullRequestReviewProtection: [\n "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews",\n ],\n updateRelease: ["PATCH /repos/{owner}/{repo}/releases/{release_id}"],\n updateReleaseAsset: [\n "PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}",\n ],\n updateStatusCheckPotection: [\n "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks",\n {},\n { renamed: ["repos", "updateStatusCheckProtection"] },\n ],\n updateStatusCheckProtection: [\n "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks",\n ],\n updateWebhook: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"],\n updateWebhookConfigForRepo: [\n "PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config",\n ],\n uploadReleaseAsset: [\n "POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}",\n { baseUrl: "https://uploads.github.com" },\n ],\n },\n search: {\n code: ["GET /search/code"],\n commits: ["GET /search/commits"],\n issuesAndPullRequests: ["GET /search/issues"],\n labels: ["GET /search/labels"],\n repos: ["GET /search/repositories"],\n topics: ["GET /search/topics"],\n users: ["GET /search/users"],\n },\n secretScanning: {\n getAlert: [\n "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}",\n ],\n listAlertsForEnterprise: [\n "GET /enterprises/{enterprise}/secret-scanning/alerts",\n ],\n listAlertsForOrg: ["GET /orgs/{org}/secret-scanning/alerts"],\n listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"],\n listLocationsForAlert: [\n "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations",\n ],\n updateAlert: [\n "PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}",\n ],\n },\n teams: {\n addOrUpdateMembershipForUserInOrg: [\n "PUT /orgs/{org}/teams/{team_slug}/memberships/{username}",\n ],\n addOrUpdateProjectPermissionsInOrg: [\n "PUT /orgs/{org}/teams/{team_slug}/projects/{project_id}",\n ],\n addOrUpdateRepoPermissionsInOrg: [\n "PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}",\n ],\n checkPermissionsForProjectInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/projects/{project_id}",\n ],\n checkPermissionsForRepoInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}",\n ],\n create: ["POST /orgs/{org}/teams"],\n createDiscussionCommentInOrg: [\n "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments",\n ],\n createDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions"],\n deleteDiscussionCommentInOrg: [\n "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}",\n ],\n deleteDiscussionInOrg: [\n "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}",\n ],\n deleteInOrg: ["DELETE /orgs/{org}/teams/{team_slug}"],\n getByName: ["GET /orgs/{org}/teams/{team_slug}"],\n getDiscussionCommentInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}",\n ],\n getDiscussionInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}",\n ],\n getMembershipForUserInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/memberships/{username}",\n ],\n list: ["GET /orgs/{org}/teams"],\n listChildInOrg: ["GET /orgs/{org}/teams/{team_slug}/teams"],\n listDiscussionCommentsInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments",\n ],\n listDiscussionsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions"],\n listForAuthenticatedUser: ["GET /user/teams"],\n listMembersInOrg: ["GET /orgs/{org}/teams/{team_slug}/members"],\n listPendingInvitationsInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/invitations",\n ],\n listProjectsInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects"],\n listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"],\n removeMembershipForUserInOrg: [\n "DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}",\n ],\n removeProjectInOrg: [\n "DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id}",\n ],\n removeRepoInOrg: [\n "DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}",\n ],\n updateDiscussionCommentInOrg: [\n "PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}",\n ],\n updateDiscussionInOrg: [\n "PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}",\n ],\n updateInOrg: ["PATCH /orgs/{org}/teams/{team_slug}"],\n },\n users: {\n addEmailForAuthenticated: [\n "POST /user/emails",\n {},\n { renamed: ["users", "addEmailForAuthenticatedUser"] },\n ],\n addEmailForAuthenticatedUser: ["POST /user/emails"],\n block: ["PUT /user/blocks/{username}"],\n checkBlocked: ["GET /user/blocks/{username}"],\n checkFollowingForUser: ["GET /users/{username}/following/{target_user}"],\n checkPersonIsFollowedByAuthenticated: ["GET /user/following/{username}"],\n createGpgKeyForAuthenticated: [\n "POST /user/gpg_keys",\n {},\n { renamed: ["users", "createGpgKeyForAuthenticatedUser"] },\n ],\n createGpgKeyForAuthenticatedUser: ["POST /user/gpg_keys"],\n createPublicSshKeyForAuthenticated: [\n "POST /user/keys",\n {},\n { renamed: ["users", "createPublicSshKeyForAuthenticatedUser"] },\n ],\n createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"],\n deleteEmailForAuthenticated: [\n "DELETE /user/emails",\n {},\n { renamed: ["users", "deleteEmailForAuthenticatedUser"] },\n ],\n deleteEmailForAuthenticatedUser: ["DELETE /user/emails"],\n deleteGpgKeyForAuthenticated: [\n "DELETE /user/gpg_keys/{gpg_key_id}",\n {},\n { renamed: ["users", "deleteGpgKeyForAuthenticatedUser"] },\n ],\n deleteGpgKeyForAuthenticatedUser: ["DELETE /user/gpg_keys/{gpg_key_id}"],\n deletePublicSshKeyForAuthenticated: [\n "DELETE /user/keys/{key_id}",\n {},\n { renamed: ["users", "deletePublicSshKeyForAuthenticatedUser"] },\n ],\n deletePublicSshKeyForAuthenticatedUser: ["DELETE /user/keys/{key_id}"],\n follow: ["PUT /user/following/{username}"],\n getAuthenticated: ["GET /user"],\n getByUsername: ["GET /users/{username}"],\n getContextForUser: ["GET /users/{username}/hovercard"],\n getGpgKeyForAuthenticated: [\n "GET /user/gpg_keys/{gpg_key_id}",\n {},\n { renamed: ["users", "getGpgKeyForAuthenticatedUser"] },\n ],\n getGpgKeyForAuthenticatedUser: ["GET /user/gpg_keys/{gpg_key_id}"],\n getPublicSshKeyForAuthenticated: [\n "GET /user/keys/{key_id}",\n {},\n { renamed: ["users", "getPublicSshKeyForAuthenticatedUser"] },\n ],\n getPublicSshKeyForAuthenticatedUser: ["GET /user/keys/{key_id}"],\n list: ["GET /users"],\n listBlockedByAuthenticated: [\n "GET /user/blocks",\n {},\n { renamed: ["users", "listBlockedByAuthenticatedUser"] },\n ],\n listBlockedByAuthenticatedUser: ["GET /user/blocks"],\n listEmailsForAuthenticated: [\n "GET /user/emails",\n {},\n { renamed: ["users", "listEmailsForAuthenticatedUser"] },\n ],\n listEmailsForAuthenticatedUser: ["GET /user/emails"],\n listFollowedByAuthenticated: [\n "GET /user/following",\n {},\n { renamed: ["users", "listFollowedByAuthenticatedUser"] },\n ],\n listFollowedByAuthenticatedUser: ["GET /user/following"],\n listFollowersForAuthenticatedUser: ["GET /user/followers"],\n listFollowersForUser: ["GET /users/{username}/followers"],\n listFollowingForUser: ["GET /users/{username}/following"],\n listGpgKeysForAuthenticated: [\n "GET /user/gpg_keys",\n {},\n { renamed: ["users", "listGpgKeysForAuthenticatedUser"] },\n ],\n listGpgKeysForAuthenticatedUser: ["GET /user/gpg_keys"],\n listGpgKeysForUser: ["GET /users/{username}/gpg_keys"],\n listPublicEmailsForAuthenticated: [\n "GET /user/public_emails",\n {},\n { renamed: ["users", "listPublicEmailsForAuthenticatedUser"] },\n ],\n listPublicEmailsForAuthenticatedUser: ["GET /user/public_emails"],\n listPublicKeysForUser: ["GET /users/{username}/keys"],\n listPublicSshKeysForAuthenticated: [\n "GET /user/keys",\n {},\n { renamed: ["users", "listPublicSshKeysForAuthenticatedUser"] },\n ],\n listPublicSshKeysForAuthenticatedUser: ["GET /user/keys"],\n setPrimaryEmailVisibilityForAuthenticated: [\n "PATCH /user/email/visibility",\n {},\n { renamed: ["users", "setPrimaryEmailVisibilityForAuthenticatedUser"] },\n ],\n setPrimaryEmailVisibilityForAuthenticatedUser: [\n "PATCH /user/email/visibility",\n ],\n unblock: ["DELETE /user/blocks/{username}"],\n unfollow: ["DELETE /user/following/{username}"],\n updateAuthenticated: ["PATCH /user"],\n },\n};\n\nconst VERSION = "5.16.2";\n\nfunction endpointsToMethods(octokit, endpointsMap) {\n const newMethods = {};\n for (const [scope, endpoints] of Object.entries(endpointsMap)) {\n for (const [methodName, endpoint] of Object.entries(endpoints)) {\n const [route, defaults, decorations] = endpoint;\n const [method, url] = route.split(/ /);\n const endpointDefaults = Object.assign({ method, url }, defaults);\n if (!newMethods[scope]) {\n newMethods[scope] = {};\n }\n const scopeMethods = newMethods[scope];\n if (decorations) {\n scopeMethods[methodName] = decorate(octokit, scope, methodName, endpointDefaults, decorations);\n continue;\n }\n scopeMethods[methodName] = octokit.request.defaults(endpointDefaults);\n }\n }\n return newMethods;\n}\nfunction decorate(octokit, scope, methodName, defaults, decorations) {\n const requestWithDefaults = octokit.request.defaults(defaults);\n /* istanbul ignore next */\n function withDecorations(...args) {\n // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488\n let options = requestWithDefaults.endpoint.merge(...args);\n // There are currently no other decorations than `.mapToData`\n if (decorations.mapToData) {\n options = Object.assign({}, options, {\n data: options[decorations.mapToData],\n [decorations.mapToData]: undefined,\n });\n return requestWithDefaults(options);\n }\n if (decorations.renamed) {\n const [newScope, newMethodName] = decorations.renamed;\n octokit.log.warn(`octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()`);\n }\n if (decorations.deprecated) {\n octokit.log.warn(decorations.deprecated);\n }\n if (decorations.renamedParameters) {\n // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488\n const options = requestWithDefaults.endpoint.merge(...args);\n for (const [name, alias] of Object.entries(decorations.renamedParameters)) {\n if (name in options) {\n octokit.log.warn(`"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead`);\n if (!(alias in options)) {\n options[alias] = options[name];\n }\n delete options[name];\n }\n }\n return requestWithDefaults(options);\n }\n // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488\n return requestWithDefaults(...args);\n }\n return Object.assign(withDecorations, requestWithDefaults);\n}\n\nfunction restEndpointMethods(octokit) {\n const api = endpointsToMethods(octokit, Endpoints);\n return {\n rest: api,\n };\n}\nrestEndpointMethods.VERSION = VERSION;\nfunction legacyRestEndpointMethods(octokit) {\n const api = endpointsToMethods(octokit, Endpoints);\n return {\n ...api,\n rest: api,\n };\n}\nlegacyRestEndpointMethods.VERSION = VERSION;\n\n\n//# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RDtBQUNyRTtBQUNBO0FBQ0EsMENBQTBDLFNBQVM7QUFDbkQ7QUFDQTtBQUNBLGNBQWM7QUFDZCxjQUFjLDREQUE0RDtBQUMxRTtBQUNBO0FBQ0EsNkNBQTZDLFNBQVM7QUFDdEQ7QUFDQTtBQUNBLGNBQWM7QUFDZCxjQUFjLDZEQUE2RDtBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZCxjQUFjLHFFQUFxRTtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxTQUFTO0FBQ2pELDRDQUE0QyxTQUFTO0FBQ3JEO0FBQ0EsS0FBSztBQUNMOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxhQUFhO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLE1BQU0sR0FBRyxXQUFXLGlDQUFpQyxTQUFTLEdBQUcsY0FBYztBQUN2SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsS0FBSyx5Q0FBeUMsTUFBTSxHQUFHLFdBQVcsWUFBWSxNQUFNO0FBQzdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFMEQ7QUFDMUQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9ub2RlX21vZHVsZXMvQG9jdG9raXQvcGx1Z2luLXJlc3QtZW5kcG9pbnQtbWV0aG9kcy9kaXN0LXdlYi9pbmRleC5qcz8xYTgzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IEVuZHBvaW50cyA9IHtcbiAgICBhY3Rpb25zOiB7XG4gICAgICAgIGFkZEN1c3RvbUxhYmVsc1RvU2VsZkhvc3RlZFJ1bm5lckZvck9yZzogW1xuICAgICAgICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgYWRkQ3VzdG9tTGFiZWxzVG9TZWxmSG9zdGVkUnVubmVyRm9yUmVwbzogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGFkZFNlbGVjdGVkUmVwb1RvT3JnU2VjcmV0OiBbXG4gICAgICAgICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGFwcHJvdmVXb3JrZmxvd1J1bjogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vYXBwcm92ZVwiLFxuICAgICAgICBdLFxuICAgICAgICBjYW5jZWxXb3JrZmxvd1J1bjogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vY2FuY2VsXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZU9yVXBkYXRlRW52aXJvbm1lbnRTZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiUFVUIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vc2VjcmV0cy97c2VjcmV0X25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZU9yVXBkYXRlT3JnU2VjcmV0OiBbXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIl0sXG4gICAgICAgIGNyZWF0ZU9yVXBkYXRlUmVwb1NlY3JldDogW1xuICAgICAgICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZVJlZ2lzdHJhdGlvblRva2VuRm9yT3JnOiBbXG4gICAgICAgICAgICBcIlBPU1QgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL3JlZ2lzdHJhdGlvbi10b2tlblwiLFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVSZWdpc3RyYXRpb25Ub2tlbkZvclJlcG86IFtcbiAgICAgICAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3JlZ2lzdHJhdGlvbi10b2tlblwiLFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVSZW1vdmVUb2tlbkZvck9yZzogW1wiUE9TVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMvcmVtb3ZlLXRva2VuXCJdLFxuICAgICAgICBjcmVhdGVSZW1vdmVUb2tlbkZvclJlcG86IFtcbiAgICAgICAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3JlbW92ZS10b2tlblwiLFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVXb3JrZmxvd0Rpc3BhdGNoOiBbXG4gICAgICAgICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH0vZGlzcGF0Y2hlc1wiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVBY3Rpb25zQ2FjaGVCeUlkOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9jYWNoZXMve2NhY2hlX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVBY3Rpb25zQ2FjaGVCeUtleTogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvY2FjaGVzez9rZXkscmVmfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVBcnRpZmFjdDogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvYXJ0aWZhY3RzL3thcnRpZmFjdF9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlRW52aXJvbm1lbnRTZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vc2VjcmV0cy97c2VjcmV0X25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZU9yZ1NlY3JldDogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgICAgICBkZWxldGVSZXBvU2VjcmV0OiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlU2VsZkhvc3RlZFJ1bm5lckZyb21Pcmc6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVTZWxmSG9zdGVkUnVubmVyRnJvbVJlcG86IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlV29ya2Zsb3dSdW46IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9XCJdLFxuICAgICAgICBkZWxldGVXb3JrZmxvd1J1bkxvZ3M6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vbG9nc1wiLFxuICAgICAgICBdLFxuICAgICAgICBkaXNhYmxlU2VsZWN0ZWRSZXBvc2l0b3J5R2l0aHViQWN0aW9uc09yZ2FuaXphdGlvbjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRpc2FibGVXb3JrZmxvdzogW1xuICAgICAgICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH0vZGlzYWJsZVwiLFxuICAgICAgICBdLFxuICAgICAgICBkb3dubG9hZEFydGlmYWN0OiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9hcnRpZmFjdHMve2FydGlmYWN0X2lkfS97YXJjaGl2ZV9mb3JtYXR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRvd25sb2FkSm9iTG9nc0ZvcldvcmtmbG93UnVuOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9qb2JzL3tqb2JfaWR9L2xvZ3NcIixcbiAgICAgICAgXSxcbiAgICAgICAgZG93bmxvYWRXb3JrZmxvd1J1bkF0dGVtcHRMb2dzOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2F0dGVtcHRzL3thdHRlbXB0X251bWJlcn0vbG9nc1wiLFxuICAgICAgICBdLFxuICAgICAgICBkb3dubG9hZFdvcmtmbG93UnVuTG9nczogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9sb2dzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGVuYWJsZVNlbGVjdGVkUmVwb3NpdG9yeUdpdGh1YkFjdGlvbnNPcmdhbml6YXRpb246IFtcbiAgICAgICAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBlbmFibGVXb3JrZmxvdzogW1xuICAgICAgICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH0vZW5hYmxlXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEFjdGlvbnNDYWNoZUxpc3Q6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9jYWNoZXNcIl0sXG4gICAgICAgIGdldEFjdGlvbnNDYWNoZVVzYWdlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvY2FjaGUvdXNhZ2VcIl0sXG4gICAgICAgIGdldEFjdGlvbnNDYWNoZVVzYWdlQnlSZXBvRm9yT3JnOiBbXG4gICAgICAgICAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL2NhY2hlL3VzYWdlLWJ5LXJlcG9zaXRvcnlcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0QWN0aW9uc0NhY2hlVXNhZ2VGb3JFbnRlcnByaXNlOiBbXG4gICAgICAgICAgICBcIkdFVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L2FjdGlvbnMvY2FjaGUvdXNhZ2VcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0QWN0aW9uc0NhY2hlVXNhZ2VGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL2NhY2hlL3VzYWdlXCJdLFxuICAgICAgICBnZXRBbGxvd2VkQWN0aW9uc09yZ2FuaXphdGlvbjogW1xuICAgICAgICAgICAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9zZWxlY3RlZC1hY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEFsbG93ZWRBY3Rpb25zUmVwb3NpdG9yeTogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnMvc2VsZWN0ZWQtYWN0aW9uc1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRBcnRpZmFjdDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2FydGlmYWN0cy97YXJ0aWZhY3RfaWR9XCJdLFxuICAgICAgICBnZXRFbnZpcm9ubWVudFB1YmxpY0tleTogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzL3B1YmxpYy1rZXlcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0RW52aXJvbm1lbnRTZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vc2VjcmV0cy97c2VjcmV0X25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEdpdGh1YkFjdGlvbnNEZWZhdWx0V29ya2Zsb3dQZXJtaXNzaW9uc0VudGVycHJpc2U6IFtcbiAgICAgICAgICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9wZXJtaXNzaW9ucy93b3JrZmxvd1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRHaXRodWJBY3Rpb25zRGVmYXVsdFdvcmtmbG93UGVybWlzc2lvbnNPcmdhbml6YXRpb246IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvd29ya2Zsb3dcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0R2l0aHViQWN0aW9uc0RlZmF1bHRXb3JrZmxvd1Blcm1pc3Npb25zUmVwb3NpdG9yeTogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnMvd29ya2Zsb3dcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0R2l0aHViQWN0aW9uc1Blcm1pc3Npb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICAgICAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEdpdGh1YkFjdGlvbnNQZXJtaXNzaW9uc1JlcG9zaXRvcnk6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEpvYkZvcldvcmtmbG93UnVuOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvam9icy97am9iX2lkfVwiXSxcbiAgICAgICAgZ2V0T3JnUHVibGljS2V5OiBbXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9zZWNyZXRzL3B1YmxpYy1rZXlcIl0sXG4gICAgICAgIGdldE9yZ1NlY3JldDogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgICAgICBnZXRQZW5kaW5nRGVwbG95bWVudHNGb3JSdW46IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vcGVuZGluZ19kZXBsb3ltZW50c1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRSZXBvUGVybWlzc2lvbnM6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zXCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHsgcmVuYW1lZDogW1wiYWN0aW9uc1wiLCBcImdldEdpdGh1YkFjdGlvbnNQZXJtaXNzaW9uc1JlcG9zaXRvcnlcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0UmVwb1B1YmxpY0tleTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleVwiXSxcbiAgICAgICAgZ2V0UmVwb1NlY3JldDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXSxcbiAgICAgICAgZ2V0UmV2aWV3c0ZvclJ1bjogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hcHByb3ZhbHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0U2VsZkhvc3RlZFJ1bm5lckZvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfVwiXSxcbiAgICAgICAgZ2V0U2VsZkhvc3RlZFJ1bm5lckZvclJlcG86IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0V29ya2Zsb3c6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfVwiXSxcbiAgICAgICAgZ2V0V29ya2Zsb3dBY2Nlc3NUb1JlcG9zaXRvcnk6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zL2FjY2Vzc1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRXb3JrZmxvd1J1bjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH1cIl0sXG4gICAgICAgIGdldFdvcmtmbG93UnVuQXR0ZW1wdDogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hdHRlbXB0cy97YXR0ZW1wdF9udW1iZXJ9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFdvcmtmbG93UnVuVXNhZ2U6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vdGltaW5nXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFdvcmtmbG93VXNhZ2U6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93cy97d29ya2Zsb3dfaWR9L3RpbWluZ1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0QXJ0aWZhY3RzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2FydGlmYWN0c1wiXSxcbiAgICAgICAgbGlzdEVudmlyb25tZW50U2VjcmV0czogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RKb2JzRm9yV29ya2Zsb3dSdW46IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vam9ic1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0Sm9ic0ZvcldvcmtmbG93UnVuQXR0ZW1wdDogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hdHRlbXB0cy97YXR0ZW1wdF9udW1iZXJ9L2pvYnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdExhYmVsc0ZvclNlbGZIb3N0ZWRSdW5uZXJGb3JPcmc6IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdExhYmVsc0ZvclNlbGZIb3N0ZWRSdW5uZXJGb3JSZXBvOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0T3JnU2VjcmV0czogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0c1wiXSxcbiAgICAgICAgbGlzdFJlcG9TZWNyZXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0c1wiXSxcbiAgICAgICAgbGlzdFJlcG9Xb3JrZmxvd3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3NcIl0sXG4gICAgICAgIGxpc3RSdW5uZXJBcHBsaWNhdGlvbnNGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMvZG93bmxvYWRzXCJdLFxuICAgICAgICBsaXN0UnVubmVyQXBwbGljYXRpb25zRm9yUmVwbzogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy9kb3dubG9hZHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0U2VsZWN0ZWRSZXBvc2l0b3JpZXNFbmFibGVkR2l0aHViQWN0aW9uc09yZ2FuaXphdGlvbjogW1xuICAgICAgICAgICAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9yZXBvc2l0b3JpZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdFNlbGZIb3N0ZWRSdW5uZXJzRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzXCJdLFxuICAgICAgICBsaXN0U2VsZkhvc3RlZFJ1bm5lcnNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVyc1wiXSxcbiAgICAgICAgbGlzdFdvcmtmbG93UnVuQXJ0aWZhY3RzOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2FydGlmYWN0c1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0V29ya2Zsb3dSdW5zOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9ydW5zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RXb3JrZmxvd1J1bnNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVuc1wiXSxcbiAgICAgICAgcmVSdW5Kb2JGb3JXb3JrZmxvd1J1bjogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2pvYnMve2pvYl9pZH0vcmVydW5cIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVSdW5Xb3JrZmxvdzogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L3JlcnVuXCJdLFxuICAgICAgICByZVJ1bldvcmtmbG93RmFpbGVkSm9iczogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vcmVydW4tZmFpbGVkLWpvYnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVtb3ZlQWxsQ3VzdG9tTGFiZWxzRnJvbVNlbGZIb3N0ZWRSdW5uZXJGb3JPcmc6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVtb3ZlQWxsQ3VzdG9tTGFiZWxzRnJvbVNlbGZIb3N0ZWRSdW5uZXJGb3JSZXBvOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiLFxuICAgICAgICBdLFxuICAgICAgICByZW1vdmVDdXN0b21MYWJlbEZyb21TZWxmSG9zdGVkUnVubmVyRm9yT3JnOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzL3tuYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICByZW1vdmVDdXN0b21MYWJlbEZyb21TZWxmSG9zdGVkUnVubmVyRm9yUmVwbzogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHMve25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIHJlbW92ZVNlbGVjdGVkUmVwb0Zyb21PcmdTZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgcmV2aWV3UGVuZGluZ0RlcGxveW1lbnRzRm9yUnVuOiBbXG4gICAgICAgICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9wZW5kaW5nX2RlcGxveW1lbnRzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHNldEFsbG93ZWRBY3Rpb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICAgICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zL3NlbGVjdGVkLWFjdGlvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgc2V0QWxsb3dlZEFjdGlvbnNSZXBvc2l0b3J5OiBbXG4gICAgICAgICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9wZXJtaXNzaW9ucy9zZWxlY3RlZC1hY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHNldEN1c3RvbUxhYmVsc0ZvclNlbGZIb3N0ZWRSdW5uZXJGb3JPcmc6IFtcbiAgICAgICAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgc2V0Q3VzdG9tTGFiZWxzRm9yU2VsZkhvc3RlZFJ1bm5lckZvclJlcG86IFtcbiAgICAgICAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHNldEdpdGh1YkFjdGlvbnNEZWZhdWx0V29ya2Zsb3dQZXJtaXNzaW9uc0VudGVycHJpc2U6IFtcbiAgICAgICAgICAgIFwiUFVUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9wZXJtaXNzaW9ucy93b3JrZmxvd1wiLFxuICAgICAgICBdLFxuICAgICAgICBzZXRHaXRodWJBY3Rpb25zRGVmYXVsdFdvcmtmbG93UGVybWlzc2lvbnNPcmdhbml6YXRpb246IFtcbiAgICAgICAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvd29ya2Zsb3dcIixcbiAgICAgICAgXSxcbiAgICAgICAgc2V0R2l0aHViQWN0aW9uc0RlZmF1bHRXb3JrZmxvd1Blcm1pc3Npb25zUmVwb3NpdG9yeTogW1xuICAgICAgICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnMvd29ya2Zsb3dcIixcbiAgICAgICAgXSxcbiAgICAgICAgc2V0R2l0aHViQWN0aW9uc1Blcm1pc3Npb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICAgICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHNldEdpdGh1YkFjdGlvbnNQZXJtaXNzaW9uc1JlcG9zaXRvcnk6IFtcbiAgICAgICAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHNldFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiLFxuICAgICAgICBdLFxuICAgICAgICBzZXRTZWxlY3RlZFJlcG9zaXRvcmllc0VuYWJsZWRHaXRodWJBY3Rpb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICAgICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zL3JlcG9zaXRvcmllc1wiLFxuICAgICAgICBdLFxuICAgICAgICBzZXRXb3JrZmxvd0FjY2Vzc1RvUmVwb3NpdG9yeTogW1xuICAgICAgICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnMvYWNjZXNzXCIsXG4gICAgICAgIF0sXG4gICAgfSxcbiAgICBhY3Rpdml0eToge1xuICAgICAgICBjaGVja1JlcG9Jc1N0YXJyZWRCeUF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvc3RhcnJlZC97b3duZXJ9L3tyZXBvfVwiXSxcbiAgICAgICAgZGVsZXRlUmVwb1N1YnNjcmlwdGlvbjogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdWJzY3JpcHRpb25cIl0sXG4gICAgICAgIGRlbGV0ZVRocmVhZFN1YnNjcmlwdGlvbjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL25vdGlmaWNhdGlvbnMvdGhyZWFkcy97dGhyZWFkX2lkfS9zdWJzY3JpcHRpb25cIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0RmVlZHM6IFtcIkdFVCAvZmVlZHNcIl0sXG4gICAgICAgIGdldFJlcG9TdWJzY3JpcHRpb246IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3Vic2NyaXB0aW9uXCJdLFxuICAgICAgICBnZXRUaHJlYWQ6IFtcIkdFVCAvbm90aWZpY2F0aW9ucy90aHJlYWRzL3t0aHJlYWRfaWR9XCJdLFxuICAgICAgICBnZXRUaHJlYWRTdWJzY3JpcHRpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL25vdGlmaWNhdGlvbnMvdGhyZWFkcy97dGhyZWFkX2lkfS9zdWJzY3JpcHRpb25cIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdEV2ZW50c0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZXZlbnRzXCJdLFxuICAgICAgICBsaXN0Tm90aWZpY2F0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL25vdGlmaWNhdGlvbnNcIl0sXG4gICAgICAgIGxpc3RPcmdFdmVudHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZXZlbnRzL29yZ3Mve29yZ31cIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdFB1YmxpY0V2ZW50czogW1wiR0VUIC9ldmVudHNcIl0sXG4gICAgICAgIGxpc3RQdWJsaWNFdmVudHNGb3JSZXBvTmV0d29yazogW1wiR0VUIC9uZXR3b3Jrcy97b3duZXJ9L3tyZXBvfS9ldmVudHNcIl0sXG4gICAgICAgIGxpc3RQdWJsaWNFdmVudHNGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZXZlbnRzL3B1YmxpY1wiXSxcbiAgICAgICAgbGlzdFB1YmxpY09yZ0V2ZW50czogW1wiR0VUIC9vcmdzL3tvcmd9L2V2ZW50c1wiXSxcbiAgICAgICAgbGlzdFJlY2VpdmVkRXZlbnRzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3JlY2VpdmVkX2V2ZW50c1wiXSxcbiAgICAgICAgbGlzdFJlY2VpdmVkUHVibGljRXZlbnRzRm9yVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVjZWl2ZWRfZXZlbnRzL3B1YmxpY1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0UmVwb0V2ZW50czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ldmVudHNcIl0sXG4gICAgICAgIGxpc3RSZXBvTm90aWZpY2F0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbm90aWZpY2F0aW9uc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0UmVwb3NTdGFycmVkQnlBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3N0YXJyZWRcIl0sXG4gICAgICAgIGxpc3RSZXBvc1N0YXJyZWRCeVVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9zdGFycmVkXCJdLFxuICAgICAgICBsaXN0UmVwb3NXYXRjaGVkQnlVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc3Vic2NyaXB0aW9uc1wiXSxcbiAgICAgICAgbGlzdFN0YXJnYXplcnNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N0YXJnYXplcnNcIl0sXG4gICAgICAgIGxpc3RXYXRjaGVkUmVwb3NGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3N1YnNjcmlwdGlvbnNcIl0sXG4gICAgICAgIGxpc3RXYXRjaGVyc0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3Vic2NyaWJlcnNcIl0sXG4gICAgICAgIG1hcmtOb3RpZmljYXRpb25zQXNSZWFkOiBbXCJQVVQgL25vdGlmaWNhdGlvbnNcIl0sXG4gICAgICAgIG1hcmtSZXBvTm90aWZpY2F0aW9uc0FzUmVhZDogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ub3RpZmljYXRpb25zXCJdLFxuICAgICAgICBtYXJrVGhyZWFkQXNSZWFkOiBbXCJQQVRDSCAvbm90aWZpY2F0aW9ucy90aHJlYWRzL3t0aHJlYWRfaWR9XCJdLFxuICAgICAgICBzZXRSZXBvU3Vic2NyaXB0aW9uOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N1YnNjcmlwdGlvblwiXSxcbiAgICAgICAgc2V0VGhyZWFkU3Vic2NyaXB0aW9uOiBbXG4gICAgICAgICAgICBcIlBVVCAvbm90aWZpY2F0aW9ucy90aHJlYWRzL3t0aHJlYWRfaWR9L3N1YnNjcmlwdGlvblwiLFxuICAgICAgICBdLFxuICAgICAgICBzdGFyUmVwb0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQVVQgL3VzZXIvc3RhcnJlZC97b3duZXJ9L3tyZXBvfVwiXSxcbiAgICAgICAgdW5zdGFyUmVwb0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIvc3RhcnJlZC97b3duZXJ9L3tyZXBvfVwiXSxcbiAgICB9LFxuICAgIGFwcHM6IHtcbiAgICAgICAgYWRkUmVwb1RvSW5zdGFsbGF0aW9uOiBbXG4gICAgICAgICAgICBcIlBVVCAvdXNlci9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJhcHBzXCIsIFwiYWRkUmVwb1RvSW5zdGFsbGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgYWRkUmVwb1RvSW5zdGFsbGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiUFVUIC91c2VyL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBjaGVja1Rva2VuOiBbXCJQT1NUIC9hcHBsaWNhdGlvbnMve2NsaWVudF9pZH0vdG9rZW5cIl0sXG4gICAgICAgIGNyZWF0ZUZyb21NYW5pZmVzdDogW1wiUE9TVCAvYXBwLW1hbmlmZXN0cy97Y29kZX0vY29udmVyc2lvbnNcIl0sXG4gICAgICAgIGNyZWF0ZUluc3RhbGxhdGlvbkFjY2Vzc1Rva2VuOiBbXG4gICAgICAgICAgICBcIlBPU1QgL2FwcC9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L2FjY2Vzc190b2tlbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlQXV0aG9yaXphdGlvbjogW1wiREVMRVRFIC9hcHBsaWNhdGlvbnMve2NsaWVudF9pZH0vZ3JhbnRcIl0sXG4gICAgICAgIGRlbGV0ZUluc3RhbGxhdGlvbjogW1wiREVMRVRFIC9hcHAvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfVwiXSxcbiAgICAgICAgZGVsZXRlVG9rZW46IFtcIkRFTEVURSAvYXBwbGljYXRpb25zL3tjbGllbnRfaWR9L3Rva2VuXCJdLFxuICAgICAgICBnZXRBdXRoZW50aWNhdGVkOiBbXCJHRVQgL2FwcFwiXSxcbiAgICAgICAgZ2V0QnlTbHVnOiBbXCJHRVQgL2FwcHMve2FwcF9zbHVnfVwiXSxcbiAgICAgICAgZ2V0SW5zdGFsbGF0aW9uOiBbXCJHRVQgL2FwcC9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9XCJdLFxuICAgICAgICBnZXRPcmdJbnN0YWxsYXRpb246IFtcIkdFVCAvb3Jncy97b3JnfS9pbnN0YWxsYXRpb25cIl0sXG4gICAgICAgIGdldFJlcG9JbnN0YWxsYXRpb246IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaW5zdGFsbGF0aW9uXCJdLFxuICAgICAgICBnZXRTdWJzY3JpcHRpb25QbGFuRm9yQWNjb3VudDogW1xuICAgICAgICAgICAgXCJHRVQgL21hcmtldHBsYWNlX2xpc3RpbmcvYWNjb3VudHMve2FjY291bnRfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFN1YnNjcmlwdGlvblBsYW5Gb3JBY2NvdW50U3R1YmJlZDogW1xuICAgICAgICAgICAgXCJHRVQgL21hcmtldHBsYWNlX2xpc3Rpbmcvc3R1YmJlZC9hY2NvdW50cy97YWNjb3VudF9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0VXNlckluc3RhbGxhdGlvbjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2luc3RhbGxhdGlvblwiXSxcbiAgICAgICAgZ2V0V2ViaG9va0NvbmZpZ0ZvckFwcDogW1wiR0VUIC9hcHAvaG9vay9jb25maWdcIl0sXG4gICAgICAgIGdldFdlYmhvb2tEZWxpdmVyeTogW1wiR0VUIC9hcHAvaG9vay9kZWxpdmVyaWVzL3tkZWxpdmVyeV9pZH1cIl0sXG4gICAgICAgIGxpc3RBY2NvdW50c0ZvclBsYW46IFtcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9wbGFucy97cGxhbl9pZH0vYWNjb3VudHNcIl0sXG4gICAgICAgIGxpc3RBY2NvdW50c0ZvclBsYW5TdHViYmVkOiBbXG4gICAgICAgICAgICBcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9zdHViYmVkL3BsYW5zL3twbGFuX2lkfS9hY2NvdW50c1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0SW5zdGFsbGF0aW9uUmVwb3NGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdEluc3RhbGxhdGlvbnM6IFtcIkdFVCAvYXBwL2luc3RhbGxhdGlvbnNcIl0sXG4gICAgICAgIGxpc3RJbnN0YWxsYXRpb25zRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9pbnN0YWxsYXRpb25zXCJdLFxuICAgICAgICBsaXN0UGxhbnM6IFtcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9wbGFuc1wiXSxcbiAgICAgICAgbGlzdFBsYW5zU3R1YmJlZDogW1wiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3N0dWJiZWQvcGxhbnNcIl0sXG4gICAgICAgIGxpc3RSZXBvc0FjY2Vzc2libGVUb0luc3RhbGxhdGlvbjogW1wiR0VUIC9pbnN0YWxsYXRpb24vcmVwb3NpdG9yaWVzXCJdLFxuICAgICAgICBsaXN0U3Vic2NyaXB0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvbWFya2V0cGxhY2VfcHVyY2hhc2VzXCJdLFxuICAgICAgICBsaXN0U3Vic2NyaXB0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyU3R1YmJlZDogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvbWFya2V0cGxhY2VfcHVyY2hhc2VzL3N0dWJiZWRcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdFdlYmhvb2tEZWxpdmVyaWVzOiBbXCJHRVQgL2FwcC9ob29rL2RlbGl2ZXJpZXNcIl0sXG4gICAgICAgIHJlZGVsaXZlcldlYmhvb2tEZWxpdmVyeTogW1xuICAgICAgICAgICAgXCJQT1NUIC9hcHAvaG9vay9kZWxpdmVyaWVzL3tkZWxpdmVyeV9pZH0vYXR0ZW1wdHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVtb3ZlUmVwb0Zyb21JbnN0YWxsYXRpb246IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC91c2VyL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IHJlbmFtZWQ6IFtcImFwcHNcIiwgXCJyZW1vdmVSZXBvRnJvbUluc3RhbGxhdGlvbkZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHJlbW92ZVJlcG9Gcm9tSW5zdGFsbGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC91c2VyL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICByZXNldFRva2VuOiBbXCJQQVRDSCAvYXBwbGljYXRpb25zL3tjbGllbnRfaWR9L3Rva2VuXCJdLFxuICAgICAgICByZXZva2VJbnN0YWxsYXRpb25BY2Nlc3NUb2tlbjogW1wiREVMRVRFIC9pbnN0YWxsYXRpb24vdG9rZW5cIl0sXG4gICAgICAgIHNjb3BlVG9rZW46IFtcIlBPU1QgL2FwcGxpY2F0aW9ucy97Y2xpZW50X2lkfS90b2tlbi9zY29wZWRcIl0sXG4gICAgICAgIHN1c3BlbmRJbnN0YWxsYXRpb246IFtcIlBVVCAvYXBwL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vc3VzcGVuZGVkXCJdLFxuICAgICAgICB1bnN1c3BlbmRJbnN0YWxsYXRpb246IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9hcHAvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9zdXNwZW5kZWRcIixcbiAgICAgICAgXSxcbiAgICAgICAgdXBkYXRlV2ViaG9va0NvbmZpZ0ZvckFwcDogW1wiUEFUQ0ggL2FwcC9ob29rL2NvbmZpZ1wiXSxcbiAgICB9LFxuICAgIGJpbGxpbmc6IHtcbiAgICAgICAgZ2V0R2l0aHViQWN0aW9uc0JpbGxpbmdPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9zZXR0aW5ncy9iaWxsaW5nL2FjdGlvbnNcIl0sXG4gICAgICAgIGdldEdpdGh1YkFjdGlvbnNCaWxsaW5nVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc2V0dGluZ3MvYmlsbGluZy9hY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEdpdGh1YkFkdmFuY2VkU2VjdXJpdHlCaWxsaW5nR2hlOiBbXG4gICAgICAgICAgICBcIkdFVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L3NldHRpbmdzL2JpbGxpbmcvYWR2YW5jZWQtc2VjdXJpdHlcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0R2l0aHViQWR2YW5jZWRTZWN1cml0eUJpbGxpbmdPcmc6IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3NldHRpbmdzL2JpbGxpbmcvYWR2YW5jZWQtc2VjdXJpdHlcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0R2l0aHViUGFja2FnZXNCaWxsaW5nT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vc2V0dGluZ3MvYmlsbGluZy9wYWNrYWdlc1wiXSxcbiAgICAgICAgZ2V0R2l0aHViUGFja2FnZXNCaWxsaW5nVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc2V0dGluZ3MvYmlsbGluZy9wYWNrYWdlc1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRTaGFyZWRTdG9yYWdlQmlsbGluZ09yZzogW1xuICAgICAgICAgICAgXCJHRVQgL29yZ3Mve29yZ30vc2V0dGluZ3MvYmlsbGluZy9zaGFyZWQtc3RvcmFnZVwiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRTaGFyZWRTdG9yYWdlQmlsbGluZ1VzZXI6IFtcbiAgICAgICAgICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3NldHRpbmdzL2JpbGxpbmcvc2hhcmVkLXN0b3JhZ2VcIixcbiAgICAgICAgXSxcbiAgICB9LFxuICAgIGNoZWNrczoge1xuICAgICAgICBjcmVhdGU6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXJ1bnNcIl0sXG4gICAgICAgIGNyZWF0ZVN1aXRlOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1zdWl0ZXNcIl0sXG4gICAgICAgIGdldDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1ydW5zL3tjaGVja19ydW5faWR9XCJdLFxuICAgICAgICBnZXRTdWl0ZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1zdWl0ZXMve2NoZWNrX3N1aXRlX2lkfVwiXSxcbiAgICAgICAgbGlzdEFubm90YXRpb25zOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stcnVucy97Y2hlY2tfcnVuX2lkfS9hbm5vdGF0aW9uc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0Rm9yUmVmOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vY2hlY2stcnVuc1wiXSxcbiAgICAgICAgbGlzdEZvclN1aXRlOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stc3VpdGVzL3tjaGVja19zdWl0ZV9pZH0vY2hlY2stcnVuc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0U3VpdGVzRm9yUmVmOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vY2hlY2stc3VpdGVzXCJdLFxuICAgICAgICByZXJlcXVlc3RSdW46IFtcbiAgICAgICAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stcnVucy97Y2hlY2tfcnVuX2lkfS9yZXJlcXVlc3RcIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVyZXF1ZXN0U3VpdGU6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stc3VpdGVzL3tjaGVja19zdWl0ZV9pZH0vcmVyZXF1ZXN0XCIsXG4gICAgICAgIF0sXG4gICAgICAgIHNldFN1aXRlc1ByZWZlcmVuY2VzOiBbXG4gICAgICAgICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1zdWl0ZXMvcHJlZmVyZW5jZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgdXBkYXRlOiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stcnVucy97Y2hlY2tfcnVuX2lkfVwiXSxcbiAgICB9LFxuICAgIGNvZGVTY2FubmluZzoge1xuICAgICAgICBkZWxldGVBbmFseXNpczogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYW5hbHlzZXMve2FuYWx5c2lzX2lkfXs/Y29uZmlybV9kZWxldGV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEFsZXJ0OiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn1cIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkUGFyYW1ldGVyczogeyBhbGVydF9pZDogXCJhbGVydF9udW1iZXJcIiB9IH0sXG4gICAgICAgIF0sXG4gICAgICAgIGdldEFuYWx5c2lzOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbmFseXNlcy97YW5hbHlzaXNfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFNhcmlmOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvc2FyaWZzL3tzYXJpZl9pZH1cIl0sXG4gICAgICAgIGxpc3RBbGVydEluc3RhbmNlczogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYWxlcnRzL3thbGVydF9udW1iZXJ9L2luc3RhbmNlc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0QWxlcnRzRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vY29kZS1zY2FubmluZy9hbGVydHNcIl0sXG4gICAgICAgIGxpc3RBbGVydHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYWxlcnRzXCJdLFxuICAgICAgICBsaXN0QWxlcnRzSW5zdGFuY2VzOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn0vaW5zdGFuY2VzXCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHsgcmVuYW1lZDogW1wiY29kZVNjYW5uaW5nXCIsIFwibGlzdEFsZXJ0SW5zdGFuY2VzXCJdIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RSZWNlbnRBbmFseXNlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FuYWx5c2VzXCJdLFxuICAgICAgICB1cGRhdGVBbGVydDogW1xuICAgICAgICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn1cIixcbiAgICAgICAgXSxcbiAgICAgICAgdXBsb2FkU2FyaWY6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvc2FyaWZzXCJdLFxuICAgIH0sXG4gICAgY29kZXNPZkNvbmR1Y3Q6IHtcbiAgICAgICAgZ2V0QWxsQ29kZXNPZkNvbmR1Y3Q6IFtcIkdFVCAvY29kZXNfb2ZfY29uZHVjdFwiXSxcbiAgICAgICAgZ2V0Q29uZHVjdENvZGU6IFtcIkdFVCAvY29kZXNfb2ZfY29uZHVjdC97a2V5fVwiXSxcbiAgICB9LFxuICAgIGNvZGVzcGFjZXM6IHtcbiAgICAgICAgYWRkUmVwb3NpdG9yeUZvclNlY3JldEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICAgICAgICBcIlBVVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNvZGVzcGFjZU1hY2hpbmVzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiR0VUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfS9tYWNoaW5lc1wiLFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9jb2Rlc3BhY2VzXCJdLFxuICAgICAgICBjcmVhdGVPclVwZGF0ZVJlcG9TZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVPclVwZGF0ZVNlY3JldEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICAgICAgICBcIlBVVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVXaXRoUHJGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvZGVzcGFjZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgY3JlYXRlV2l0aFJlcG9Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIvY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9XCJdLFxuICAgICAgICBkZWxldGVGcm9tT3JnYW5pemF0aW9uOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX0vY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZVJlcG9TZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZXhwb3J0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvdXNlci9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX0vZXhwb3J0c1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRFeHBvcnREZXRhaWxzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiR0VUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfS9leHBvcnRzL3tleHBvcnRfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9XCJdLFxuICAgICAgICBnZXRQdWJsaWNLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3B1YmxpYy1rZXlcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0UmVwb1B1YmxpY0tleTogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvc2VjcmV0cy9wdWJsaWMta2V5XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFJlcG9TZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdERldmNvbnRhaW5lcnNJblJlcG9zaXRvcnlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvZGV2Y29udGFpbmVyc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9jb2Rlc3BhY2VzXCJdLFxuICAgICAgICBsaXN0SW5Pcmdhbml6YXRpb246IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXNcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkUGFyYW1ldGVyczogeyBvcmdfaWQ6IFwib3JnXCIgfSB9LFxuICAgICAgICBdLFxuICAgICAgICBsaXN0SW5SZXBvc2l0b3J5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RSZXBvU2VjcmV0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL3NlY3JldHNcIl0sXG4gICAgICAgIGxpc3RSZXBvc2l0b3JpZXNGb3JTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RTZWNyZXRzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHNcIl0sXG4gICAgICAgIHJlbW92ZVJlcG9zaXRvcnlGb3JTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICByZXBvTWFjaGluZXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvbWFjaGluZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgc2V0UmVwb3NpdG9yaWVzRm9yU2VjcmV0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiUFVUIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiLFxuICAgICAgICBdLFxuICAgICAgICBzdGFydEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfS9zdGFydFwiXSxcbiAgICAgICAgc3RvcEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfS9zdG9wXCJdLFxuICAgICAgICBzdG9wSW5Pcmdhbml6YXRpb246IFtcbiAgICAgICAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX0vY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9L3N0b3BcIixcbiAgICAgICAgXSxcbiAgICAgICAgdXBkYXRlRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBBVENIIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfVwiXSxcbiAgICB9LFxuICAgIGRlcGVuZGFib3Q6IHtcbiAgICAgICAgYWRkU2VsZWN0ZWRSZXBvVG9PcmdTZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgY3JlYXRlT3JVcGRhdGVPcmdTZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZU9yVXBkYXRlUmVwb1NlY3JldDogW1xuICAgICAgICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZU9yZ1NlY3JldDogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgICAgICBkZWxldGVSZXBvU2VjcmV0OiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0T3JnUHVibGljS2V5OiBbXCJHRVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3B1YmxpYy1rZXlcIl0sXG4gICAgICAgIGdldE9yZ1NlY3JldDogW1wiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgICAgICBnZXRSZXBvUHVibGljS2V5OiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9zZWNyZXRzL3B1YmxpYy1rZXlcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0UmVwb1NlY3JldDogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RPcmdTZWNyZXRzOiBbXCJHRVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzXCJdLFxuICAgICAgICBsaXN0UmVwb1NlY3JldHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9zZWNyZXRzXCJdLFxuICAgICAgICBsaXN0U2VsZWN0ZWRSZXBvc0Zvck9yZ1NlY3JldDogW1xuICAgICAgICAgICAgXCJHRVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHJlbW92ZVNlbGVjdGVkUmVwb0Zyb21PcmdTZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgc2V0U2VsZWN0ZWRSZXBvc0Zvck9yZ1NlY3JldDogW1xuICAgICAgICAgICAgXCJQVVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCIsXG4gICAgICAgIF0sXG4gICAgfSxcbiAgICBkZXBlbmRlbmN5R3JhcGg6IHtcbiAgICAgICAgY3JlYXRlUmVwb3NpdG9yeVNuYXBzaG90OiBbXG4gICAgICAgICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGVuY3ktZ3JhcGgvc25hcHNob3RzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRpZmZSYW5nZTogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGVuY3ktZ3JhcGgvY29tcGFyZS97YmFzZWhlYWR9XCIsXG4gICAgICAgIF0sXG4gICAgfSxcbiAgICBlbW9qaXM6IHsgZ2V0OiBbXCJHRVQgL2Vtb2ppc1wiXSB9LFxuICAgIGVudGVycHJpc2VBZG1pbjoge1xuICAgICAgICBhZGRDdXN0b21MYWJlbHNUb1NlbGZIb3N0ZWRSdW5uZXJGb3JFbnRlcnByaXNlOiBbXG4gICAgICAgICAgICBcIlBPU1QgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRpc2FibGVTZWxlY3RlZE9yZ2FuaXphdGlvbkdpdGh1YkFjdGlvbnNFbnRlcnByaXNlOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L2FjdGlvbnMvcGVybWlzc2lvbnMvb3JnYW5pemF0aW9ucy97b3JnX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBlbmFibGVTZWxlY3RlZE9yZ2FuaXphdGlvbkdpdGh1YkFjdGlvbnNFbnRlcnByaXNlOiBbXG4gICAgICAgICAgICBcIlBVVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L2FjdGlvbnMvcGVybWlzc2lvbnMvb3JnYW5pemF0aW9ucy97b3JnX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRBbGxvd2VkQWN0aW9uc0VudGVycHJpc2U6IFtcbiAgICAgICAgICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9wZXJtaXNzaW9ucy9zZWxlY3RlZC1hY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEdpdGh1YkFjdGlvbnNQZXJtaXNzaW9uc0VudGVycHJpc2U6IFtcbiAgICAgICAgICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9wZXJtaXNzaW9uc1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRTZXJ2ZXJTdGF0aXN0aWNzOiBbXG4gICAgICAgICAgICBcIkdFVCAvZW50ZXJwcmlzZS1pbnN0YWxsYXRpb24ve2VudGVycHJpc2Vfb3Jfb3JnfS9zZXJ2ZXItc3RhdGlzdGljc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0TGFiZWxzRm9yU2VsZkhvc3RlZFJ1bm5lckZvckVudGVycHJpc2U6IFtcbiAgICAgICAgICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0U2VsZWN0ZWRPcmdhbml6YXRpb25zRW5hYmxlZEdpdGh1YkFjdGlvbnNFbnRlcnByaXNlOiBbXG4gICAgICAgICAgICBcIkdFVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L2FjdGlvbnMvcGVybWlzc2lvbnMvb3JnYW5pemF0aW9uc1wiLFxuICAgICAgICBdLFxuICAgICAgICByZW1vdmVBbGxDdXN0b21MYWJlbHNGcm9tU2VsZkhvc3RlZFJ1bm5lckZvckVudGVycHJpc2U6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiLFxuICAgICAgICBdLFxuICAgICAgICByZW1vdmVDdXN0b21MYWJlbEZyb21TZWxmSG9zdGVkUnVubmVyRm9yRW50ZXJwcmlzZTogW1xuICAgICAgICAgICAgXCJERUxFVEUgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzL3tuYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBzZXRBbGxvd2VkQWN0aW9uc0VudGVycHJpc2U6IFtcbiAgICAgICAgICAgIFwiUFVUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9wZXJtaXNzaW9ucy9zZWxlY3RlZC1hY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHNldEN1c3RvbUxhYmVsc0ZvclNlbGZIb3N0ZWRSdW5uZXJGb3JFbnRlcnByaXNlOiBbXG4gICAgICAgICAgICBcIlBVVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgc2V0R2l0aHViQWN0aW9uc1Blcm1pc3Npb25zRW50ZXJwcmlzZTogW1xuICAgICAgICAgICAgXCJQVVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3Blcm1pc3Npb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHNldFNlbGVjdGVkT3JnYW5pemF0aW9uc0VuYWJsZWRHaXRodWJBY3Rpb25zRW50ZXJwcmlzZTogW1xuICAgICAgICAgICAgXCJQVVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3Blcm1pc3Npb25zL29yZ2FuaXphdGlvbnNcIixcbiAgICAgICAgXSxcbiAgICB9LFxuICAgIGdpc3RzOiB7XG4gICAgICAgIGNoZWNrSXNTdGFycmVkOiBbXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS9zdGFyXCJdLFxuICAgICAgICBjcmVhdGU6IFtcIlBPU1QgL2dpc3RzXCJdLFxuICAgICAgICBjcmVhdGVDb21tZW50OiBbXCJQT1NUIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHNcIl0sXG4gICAgICAgIGRlbGV0ZTogW1wiREVMRVRFIC9naXN0cy97Z2lzdF9pZH1cIl0sXG4gICAgICAgIGRlbGV0ZUNvbW1lbnQ6IFtcIkRFTEVURSAvZ2lzdHMve2dpc3RfaWR9L2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXSxcbiAgICAgICAgZm9yazogW1wiUE9TVCAvZ2lzdHMve2dpc3RfaWR9L2ZvcmtzXCJdLFxuICAgICAgICBnZXQ6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9XCJdLFxuICAgICAgICBnZXRDb21tZW50OiBbXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgICAgIGdldFJldmlzaW9uOiBbXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS97c2hhfVwiXSxcbiAgICAgICAgbGlzdDogW1wiR0VUIC9naXN0c1wiXSxcbiAgICAgICAgbGlzdENvbW1lbnRzOiBbXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS9jb21tZW50c1wiXSxcbiAgICAgICAgbGlzdENvbW1pdHM6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L2NvbW1pdHNcIl0sXG4gICAgICAgIGxpc3RGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZ2lzdHNcIl0sXG4gICAgICAgIGxpc3RGb3JrczogW1wiR0VUIC9naXN0cy97Z2lzdF9pZH0vZm9ya3NcIl0sXG4gICAgICAgIGxpc3RQdWJsaWM6IFtcIkdFVCAvZ2lzdHMvcHVibGljXCJdLFxuICAgICAgICBsaXN0U3RhcnJlZDogW1wiR0VUIC9naXN0cy9zdGFycmVkXCJdLFxuICAgICAgICBzdGFyOiBbXCJQVVQgL2dpc3RzL3tnaXN0X2lkfS9zdGFyXCJdLFxuICAgICAgICB1bnN0YXI6IFtcIkRFTEVURSAvZ2lzdHMve2dpc3RfaWR9L3N0YXJcIl0sXG4gICAgICAgIHVwZGF0ZTogW1wiUEFUQ0ggL2dpc3RzL3tnaXN0X2lkfVwiXSxcbiAgICAgICAgdXBkYXRlQ29tbWVudDogW1wiUEFUQ0ggL2dpc3RzL3tnaXN0X2lkfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgfSxcbiAgICBnaXQ6IHtcbiAgICAgICAgY3JlYXRlQmxvYjogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L2Jsb2JzXCJdLFxuICAgICAgICBjcmVhdGVDb21taXQ6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9jb21taXRzXCJdLFxuICAgICAgICBjcmVhdGVSZWY6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9yZWZzXCJdLFxuICAgICAgICBjcmVhdGVUYWc6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC90YWdzXCJdLFxuICAgICAgICBjcmVhdGVUcmVlOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvdHJlZXNcIl0sXG4gICAgICAgIGRlbGV0ZVJlZjogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvcmVmcy97cmVmfVwiXSxcbiAgICAgICAgZ2V0QmxvYjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvYmxvYnMve2ZpbGVfc2hhfVwiXSxcbiAgICAgICAgZ2V0Q29tbWl0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9jb21taXRzL3tjb21taXRfc2hhfVwiXSxcbiAgICAgICAgZ2V0UmVmOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9yZWYve3JlZn1cIl0sXG4gICAgICAgIGdldFRhZzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvdGFncy97dGFnX3NoYX1cIl0sXG4gICAgICAgIGdldFRyZWU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3RyZWVzL3t0cmVlX3NoYX1cIl0sXG4gICAgICAgIGxpc3RNYXRjaGluZ1JlZnM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L21hdGNoaW5nLXJlZnMve3JlZn1cIl0sXG4gICAgICAgIHVwZGF0ZVJlZjogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9yZWZzL3tyZWZ9XCJdLFxuICAgIH0sXG4gICAgZ2l0aWdub3JlOiB7XG4gICAgICAgIGdldEFsbFRlbXBsYXRlczogW1wiR0VUIC9naXRpZ25vcmUvdGVtcGxhdGVzXCJdLFxuICAgICAgICBnZXRUZW1wbGF0ZTogW1wiR0VUIC9naXRpZ25vcmUvdGVtcGxhdGVzL3tuYW1lfVwiXSxcbiAgICB9LFxuICAgIGludGVyYWN0aW9uczoge1xuICAgICAgICBnZXRSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICAgICAgZ2V0UmVzdHJpY3Rpb25zRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vaW50ZXJhY3Rpb24tbGltaXRzXCJdLFxuICAgICAgICBnZXRSZXN0cmljdGlvbnNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICAgICAgZ2V0UmVzdHJpY3Rpb25zRm9yWW91clB1YmxpY1JlcG9zOiBbXG4gICAgICAgICAgICBcIkdFVCAvdXNlci9pbnRlcmFjdGlvbi1saW1pdHNcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJpbnRlcmFjdGlvbnNcIiwgXCJnZXRSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9LFxuICAgICAgICBdLFxuICAgICAgICByZW1vdmVSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICAgICAgcmVtb3ZlUmVzdHJpY3Rpb25zRm9yT3JnOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vaW50ZXJhY3Rpb24tbGltaXRzXCJdLFxuICAgICAgICByZW1vdmVSZXN0cmljdGlvbnNGb3JSZXBvOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaW50ZXJhY3Rpb24tbGltaXRzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHJlbW92ZVJlc3RyaWN0aW9uc0ZvcllvdXJQdWJsaWNSZXBvczogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3VzZXIvaW50ZXJhY3Rpb24tbGltaXRzXCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHsgcmVuYW1lZDogW1wiaW50ZXJhY3Rpb25zXCIsIFwicmVtb3ZlUmVzdHJpY3Rpb25zRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgc2V0UmVzdHJpY3Rpb25zRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBVVCAvdXNlci9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgICAgIHNldFJlc3RyaWN0aW9uc0Zvck9yZzogW1wiUFVUIC9vcmdzL3tvcmd9L2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICAgICAgc2V0UmVzdHJpY3Rpb25zRm9yUmVwbzogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgICAgIHNldFJlc3RyaWN0aW9uc0ZvcllvdXJQdWJsaWNSZXBvczogW1xuICAgICAgICAgICAgXCJQVVQgL3VzZXIvaW50ZXJhY3Rpb24tbGltaXRzXCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHsgcmVuYW1lZDogW1wiaW50ZXJhY3Rpb25zXCIsIFwic2V0UmVzdHJpY3Rpb25zRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfSxcbiAgICAgICAgXSxcbiAgICB9LFxuICAgIGlzc3Vlczoge1xuICAgICAgICBhZGRBc3NpZ25lZXM6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2Fzc2lnbmVlc1wiLFxuICAgICAgICBdLFxuICAgICAgICBhZGRMYWJlbHM6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHNcIl0sXG4gICAgICAgIGNoZWNrVXNlckNhbkJlQXNzaWduZWQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXNzaWduZWVzL3thc3NpZ25lZX1cIl0sXG4gICAgICAgIGNyZWF0ZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzXCJdLFxuICAgICAgICBjcmVhdGVDb21tZW50OiBbXG4gICAgICAgICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9jb21tZW50c1wiLFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVMYWJlbDogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzXCJdLFxuICAgICAgICBjcmVhdGVNaWxlc3RvbmU6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L21pbGVzdG9uZXNcIl0sXG4gICAgICAgIGRlbGV0ZUNvbW1lbnQ6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHMve2NvbW1lbnRfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZUxhYmVsOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX1cIl0sXG4gICAgICAgIGRlbGV0ZU1pbGVzdG9uZTogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L21pbGVzdG9uZXMve21pbGVzdG9uZV9udW1iZXJ9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn1cIl0sXG4gICAgICAgIGdldENvbW1lbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXSxcbiAgICAgICAgZ2V0RXZlbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2V2ZW50cy97ZXZlbnRfaWR9XCJdLFxuICAgICAgICBnZXRMYWJlbDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9XCJdLFxuICAgICAgICBnZXRNaWxlc3RvbmU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lcy97bWlsZXN0b25lX251bWJlcn1cIl0sXG4gICAgICAgIGxpc3Q6IFtcIkdFVCAvaXNzdWVzXCJdLFxuICAgICAgICBsaXN0QXNzaWduZWVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Fzc2lnbmVlc1wiXSxcbiAgICAgICAgbGlzdENvbW1lbnRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9jb21tZW50c1wiXSxcbiAgICAgICAgbGlzdENvbW1lbnRzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHNcIl0sXG4gICAgICAgIGxpc3RFdmVudHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2V2ZW50c1wiXSxcbiAgICAgICAgbGlzdEV2ZW50c0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2V2ZW50c1wiXSxcbiAgICAgICAgbGlzdEV2ZW50c0ZvclRpbWVsaW5lOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L3RpbWVsaW5lXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2lzc3Vlc1wiXSxcbiAgICAgICAgbGlzdEZvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L2lzc3Vlc1wiXSxcbiAgICAgICAgbGlzdEZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzXCJdLFxuICAgICAgICBsaXN0TGFiZWxzRm9yTWlsZXN0b25lOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lcy97bWlsZXN0b25lX251bWJlcn0vbGFiZWxzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RMYWJlbHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVsc1wiXSxcbiAgICAgICAgbGlzdExhYmVsc09uSXNzdWU6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vbGFiZWxzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RNaWxlc3RvbmVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L21pbGVzdG9uZXNcIl0sXG4gICAgICAgIGxvY2s6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2xvY2tcIl0sXG4gICAgICAgIHJlbW92ZUFsbExhYmVsczogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVtb3ZlQXNzaWduZWVzOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2Fzc2lnbmVlc1wiLFxuICAgICAgICBdLFxuICAgICAgICByZW1vdmVMYWJlbDogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHMve25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIHNldExhYmVsczogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vbGFiZWxzXCJdLFxuICAgICAgICB1bmxvY2s6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2xvY2tcIl0sXG4gICAgICAgIHVwZGF0ZTogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfVwiXSxcbiAgICAgICAgdXBkYXRlQ29tbWVudDogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgICAgIHVwZGF0ZUxhYmVsOiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfVwiXSxcbiAgICAgICAgdXBkYXRlTWlsZXN0b25lOiBbXG4gICAgICAgICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9taWxlc3RvbmVzL3ttaWxlc3RvbmVfbnVtYmVyfVwiLFxuICAgICAgICBdLFxuICAgIH0sXG4gICAgbGljZW5zZXM6IHtcbiAgICAgICAgZ2V0OiBbXCJHRVQgL2xpY2Vuc2VzL3tsaWNlbnNlfVwiXSxcbiAgICAgICAgZ2V0QWxsQ29tbW9ubHlVc2VkOiBbXCJHRVQgL2xpY2Vuc2VzXCJdLFxuICAgICAgICBnZXRGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xpY2Vuc2VcIl0sXG4gICAgfSxcbiAgICBtYXJrZG93bjoge1xuICAgICAgICByZW5kZXI6IFtcIlBPU1QgL21hcmtkb3duXCJdLFxuICAgICAgICByZW5kZXJSYXc6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvbWFya2Rvd24vcmF3XCIsXG4gICAgICAgICAgICB7IGhlYWRlcnM6IHsgXCJjb250ZW50LXR5cGVcIjogXCJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XCIgfSB9LFxuICAgICAgICBdLFxuICAgIH0sXG4gICAgbWV0YToge1xuICAgICAgICBnZXQ6IFtcIkdFVCAvbWV0YVwiXSxcbiAgICAgICAgZ2V0T2N0b2NhdDogW1wiR0VUIC9vY3RvY2F0XCJdLFxuICAgICAgICBnZXRaZW46IFtcIkdFVCAvemVuXCJdLFxuICAgICAgICByb290OiBbXCJHRVQgL1wiXSxcbiAgICB9LFxuICAgIG1pZ3JhdGlvbnM6IHtcbiAgICAgICAgY2FuY2VsSW1wb3J0OiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ltcG9ydFwiXSxcbiAgICAgICAgZGVsZXRlQXJjaGl2ZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvdXNlci9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9L2FyY2hpdmVcIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlQXJjaGl2ZUZvck9yZzogW1xuICAgICAgICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9hcmNoaXZlXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRvd25sb2FkQXJjaGl2ZUZvck9yZzogW1xuICAgICAgICAgICAgXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9hcmNoaXZlXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEFyY2hpdmVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9hcmNoaXZlXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldENvbW1pdEF1dGhvcnM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0L2F1dGhvcnNcIl0sXG4gICAgICAgIGdldEltcG9ydFN0YXR1czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnRcIl0sXG4gICAgICAgIGdldExhcmdlRmlsZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0L2xhcmdlX2ZpbGVzXCJdLFxuICAgICAgICBnZXRTdGF0dXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH1cIl0sXG4gICAgICAgIGdldFN0YXR1c0Zvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH1cIl0sXG4gICAgICAgIGxpc3RGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL21pZ3JhdGlvbnNcIl0sXG4gICAgICAgIGxpc3RGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9taWdyYXRpb25zXCJdLFxuICAgICAgICBsaXN0UmVwb3NGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdFJlcG9zRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIl0sXG4gICAgICAgIGxpc3RSZXBvc0ZvclVzZXI6IFtcbiAgICAgICAgICAgIFwiR0VUIC91c2VyL21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vcmVwb3NpdG9yaWVzXCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHsgcmVuYW1lZDogW1wibWlncmF0aW9uc1wiLCBcImxpc3RSZXBvc0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG1hcENvbW1pdEF1dGhvcjogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2ltcG9ydC9hdXRob3JzL3thdXRob3JfaWR9XCJdLFxuICAgICAgICBzZXRMZnNQcmVmZXJlbmNlOiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0L2xmc1wiXSxcbiAgICAgICAgc3RhcnRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9taWdyYXRpb25zXCJdLFxuICAgICAgICBzdGFydEZvck9yZzogW1wiUE9TVCAvb3Jncy97b3JnfS9taWdyYXRpb25zXCJdLFxuICAgICAgICBzdGFydEltcG9ydDogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnRcIl0sXG4gICAgICAgIHVubG9ja1JlcG9Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvcy97cmVwb19uYW1lfS9sb2NrXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHVubG9ja1JlcG9Gb3JPcmc6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vcmVwb3Mve3JlcG9fbmFtZX0vbG9ja1wiLFxuICAgICAgICBdLFxuICAgICAgICB1cGRhdGVJbXBvcnQ6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnRcIl0sXG4gICAgfSxcbiAgICBvcmdzOiB7XG4gICAgICAgIGJsb2NrVXNlcjogW1wiUFVUIC9vcmdzL3tvcmd9L2Jsb2Nrcy97dXNlcm5hbWV9XCJdLFxuICAgICAgICBjYW5jZWxJbnZpdGF0aW9uOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vaW52aXRhdGlvbnMve2ludml0YXRpb25faWR9XCJdLFxuICAgICAgICBjaGVja0Jsb2NrZWRVc2VyOiBbXCJHRVQgL29yZ3Mve29yZ30vYmxvY2tzL3t1c2VybmFtZX1cIl0sXG4gICAgICAgIGNoZWNrTWVtYmVyc2hpcEZvclVzZXI6IFtcIkdFVCAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX1cIl0sXG4gICAgICAgIGNoZWNrUHVibGljTWVtYmVyc2hpcEZvclVzZXI6IFtcIkdFVCAvb3Jncy97b3JnfS9wdWJsaWNfbWVtYmVycy97dXNlcm5hbWV9XCJdLFxuICAgICAgICBjb252ZXJ0TWVtYmVyVG9PdXRzaWRlQ29sbGFib3JhdG9yOiBbXG4gICAgICAgICAgICBcIlBVVCAvb3Jncy97b3JnfS9vdXRzaWRlX2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVJbnZpdGF0aW9uOiBbXCJQT1NUIC9vcmdzL3tvcmd9L2ludml0YXRpb25zXCJdLFxuICAgICAgICBjcmVhdGVXZWJob29rOiBbXCJQT1NUIC9vcmdzL3tvcmd9L2hvb2tzXCJdLFxuICAgICAgICBkZWxldGVXZWJob29rOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgICAgICBnZXQ6IFtcIkdFVCAvb3Jncy97b3JnfVwiXSxcbiAgICAgICAgZ2V0TWVtYmVyc2hpcEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvbWVtYmVyc2hpcHMvb3Jncy97b3JnfVwiXSxcbiAgICAgICAgZ2V0TWVtYmVyc2hpcEZvclVzZXI6IFtcIkdFVCAvb3Jncy97b3JnfS9tZW1iZXJzaGlwcy97dXNlcm5hbWV9XCJdLFxuICAgICAgICBnZXRXZWJob29rOiBbXCJHRVQgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgICAgICBnZXRXZWJob29rQ29uZmlnRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L2NvbmZpZ1wiXSxcbiAgICAgICAgZ2V0V2ViaG9va0RlbGl2ZXJ5OiBbXG4gICAgICAgICAgICBcIkdFVCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllcy97ZGVsaXZlcnlfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3Q6IFtcIkdFVCAvb3JnYW5pemF0aW9uc1wiXSxcbiAgICAgICAgbGlzdEFwcEluc3RhbGxhdGlvbnM6IFtcIkdFVCAvb3Jncy97b3JnfS9pbnN0YWxsYXRpb25zXCJdLFxuICAgICAgICBsaXN0QmxvY2tlZFVzZXJzOiBbXCJHRVQgL29yZ3Mve29yZ30vYmxvY2tzXCJdLFxuICAgICAgICBsaXN0Q3VzdG9tUm9sZXM6IFtcIkdFVCAvb3JnYW5pemF0aW9ucy97b3JnYW5pemF0aW9uX2lkfS9jdXN0b21fcm9sZXNcIl0sXG4gICAgICAgIGxpc3RGYWlsZWRJbnZpdGF0aW9uczogW1wiR0VUIC9vcmdzL3tvcmd9L2ZhaWxlZF9pbnZpdGF0aW9uc1wiXSxcbiAgICAgICAgbGlzdEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvb3Jnc1wiXSxcbiAgICAgICAgbGlzdEZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9vcmdzXCJdLFxuICAgICAgICBsaXN0SW52aXRhdGlvblRlYW1zOiBbXCJHRVQgL29yZ3Mve29yZ30vaW52aXRhdGlvbnMve2ludml0YXRpb25faWR9L3RlYW1zXCJdLFxuICAgICAgICBsaXN0TWVtYmVyczogW1wiR0VUIC9vcmdzL3tvcmd9L21lbWJlcnNcIl0sXG4gICAgICAgIGxpc3RNZW1iZXJzaGlwc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvbWVtYmVyc2hpcHMvb3Jnc1wiXSxcbiAgICAgICAgbGlzdE91dHNpZGVDb2xsYWJvcmF0b3JzOiBbXCJHRVQgL29yZ3Mve29yZ30vb3V0c2lkZV9jb2xsYWJvcmF0b3JzXCJdLFxuICAgICAgICBsaXN0UGVuZGluZ0ludml0YXRpb25zOiBbXCJHRVQgL29yZ3Mve29yZ30vaW52aXRhdGlvbnNcIl0sXG4gICAgICAgIGxpc3RQdWJsaWNNZW1iZXJzOiBbXCJHRVQgL29yZ3Mve29yZ30vcHVibGljX21lbWJlcnNcIl0sXG4gICAgICAgIGxpc3RXZWJob29rRGVsaXZlcmllczogW1wiR0VUIC9vcmdzL3tvcmd9L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzXCJdLFxuICAgICAgICBsaXN0V2ViaG9va3M6IFtcIkdFVCAvb3Jncy97b3JnfS9ob29rc1wiXSxcbiAgICAgICAgcGluZ1dlYmhvb2s6IFtcIlBPU1QgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L3BpbmdzXCJdLFxuICAgICAgICByZWRlbGl2ZXJXZWJob29rRGVsaXZlcnk6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllcy97ZGVsaXZlcnlfaWR9L2F0dGVtcHRzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHJlbW92ZU1lbWJlcjogW1wiREVMRVRFIC9vcmdzL3tvcmd9L21lbWJlcnMve3VzZXJuYW1lfVwiXSxcbiAgICAgICAgcmVtb3ZlTWVtYmVyc2hpcEZvclVzZXI6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9tZW1iZXJzaGlwcy97dXNlcm5hbWV9XCJdLFxuICAgICAgICByZW1vdmVPdXRzaWRlQ29sbGFib3JhdG9yOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9vdXRzaWRlX2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICByZW1vdmVQdWJsaWNNZW1iZXJzaGlwRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L3B1YmxpY19tZW1iZXJzL3t1c2VybmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgc2V0TWVtYmVyc2hpcEZvclVzZXI6IFtcIlBVVCAvb3Jncy97b3JnfS9tZW1iZXJzaGlwcy97dXNlcm5hbWV9XCJdLFxuICAgICAgICBzZXRQdWJsaWNNZW1iZXJzaGlwRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L3B1YmxpY19tZW1iZXJzL3t1c2VybmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgdW5ibG9ja1VzZXI6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9ibG9ja3Mve3VzZXJuYW1lfVwiXSxcbiAgICAgICAgdXBkYXRlOiBbXCJQQVRDSCAvb3Jncy97b3JnfVwiXSxcbiAgICAgICAgdXBkYXRlTWVtYmVyc2hpcEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICAgICAgICBcIlBBVENIIC91c2VyL21lbWJlcnNoaXBzL29yZ3Mve29yZ31cIixcbiAgICAgICAgXSxcbiAgICAgICAgdXBkYXRlV2ViaG9vazogW1wiUEFUQ0ggL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgICAgICB1cGRhdGVXZWJob29rQ29uZmlnRm9yT3JnOiBbXCJQQVRDSCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vY29uZmlnXCJdLFxuICAgIH0sXG4gICAgcGFja2FnZXM6IHtcbiAgICAgICAgZGVsZXRlUGFja2FnZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvdXNlci9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVQYWNrYWdlRm9yT3JnOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVQYWNrYWdlRm9yVXNlcjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlUGFja2FnZVZlcnNpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlUGFja2FnZVZlcnNpb25Gb3JPcmc6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZVBhY2thZ2VWZXJzaW9uRm9yVXNlcjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0QWxsUGFja2FnZVZlcnNpb25zRm9yQVBhY2thZ2VPd25lZEJ5QW5Pcmc6IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zXCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHsgcmVuYW1lZDogW1wicGFja2FnZXNcIiwgXCJnZXRBbGxQYWNrYWdlVmVyc2lvbnNGb3JQYWNrYWdlT3duZWRCeU9yZ1wiXSB9LFxuICAgICAgICBdLFxuICAgICAgICBnZXRBbGxQYWNrYWdlVmVyc2lvbnNGb3JBUGFja2FnZU93bmVkQnlUaGVBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnNcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlbmFtZWQ6IFtcbiAgICAgICAgICAgICAgICAgICAgXCJwYWNrYWdlc1wiLFxuICAgICAgICAgICAgICAgICAgICBcImdldEFsbFBhY2thZ2VWZXJzaW9uc0ZvclBhY2thZ2VPd25lZEJ5QXV0aGVudGljYXRlZFVzZXJcIixcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0QWxsUGFja2FnZVZlcnNpb25zRm9yUGFja2FnZU93bmVkQnlBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0QWxsUGFja2FnZVZlcnNpb25zRm9yUGFja2FnZU93bmVkQnlPcmc6IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEFsbFBhY2thZ2VWZXJzaW9uc0ZvclBhY2thZ2VPd25lZEJ5VXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0UGFja2FnZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICAgICAgICBcIkdFVCAvdXNlci9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRQYWNrYWdlRm9yT3JnYW5pemF0aW9uOiBbXG4gICAgICAgICAgICBcIkdFVCAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRQYWNrYWdlRm9yVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0UGFja2FnZVZlcnNpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0UGFja2FnZVZlcnNpb25Gb3JPcmdhbml6YXRpb246IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFBhY2thZ2VWZXJzaW9uRm9yVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdFBhY2thZ2VzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9wYWNrYWdlc1wiXSxcbiAgICAgICAgbGlzdFBhY2thZ2VzRm9yT3JnYW5pemF0aW9uOiBbXCJHRVQgL29yZ3Mve29yZ30vcGFja2FnZXNcIl0sXG4gICAgICAgIGxpc3RQYWNrYWdlc0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlc1wiXSxcbiAgICAgICAgcmVzdG9yZVBhY2thZ2VGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJQT1NUIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3Jlc3RvcmV7P3Rva2VufVwiLFxuICAgICAgICBdLFxuICAgICAgICByZXN0b3JlUGFja2FnZUZvck9yZzogW1xuICAgICAgICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3Jlc3RvcmV7P3Rva2VufVwiLFxuICAgICAgICBdLFxuICAgICAgICByZXN0b3JlUGFja2FnZUZvclVzZXI6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS9yZXN0b3Jlez90b2tlbn1cIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVzdG9yZVBhY2thZ2VWZXJzaW9uRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvdXNlci9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfS9yZXN0b3JlXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc3RvcmVQYWNrYWdlVmVyc2lvbkZvck9yZzogW1xuICAgICAgICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9L3Jlc3RvcmVcIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVzdG9yZVBhY2thZ2VWZXJzaW9uRm9yVXNlcjogW1xuICAgICAgICAgICAgXCJQT1NUIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9L3Jlc3RvcmVcIixcbiAgICAgICAgXSxcbiAgICB9LFxuICAgIHByb2plY3RzOiB7XG4gICAgICAgIGFkZENvbGxhYm9yYXRvcjogW1wiUFVUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sbGFib3JhdG9ycy97dXNlcm5hbWV9XCJdLFxuICAgICAgICBjcmVhdGVDYXJkOiBbXCJQT1NUIC9wcm9qZWN0cy9jb2x1bW5zL3tjb2x1bW5faWR9L2NhcmRzXCJdLFxuICAgICAgICBjcmVhdGVDb2x1bW46IFtcIlBPU1QgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2x1bW5zXCJdLFxuICAgICAgICBjcmVhdGVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9wcm9qZWN0c1wiXSxcbiAgICAgICAgY3JlYXRlRm9yT3JnOiBbXCJQT1NUIC9vcmdzL3tvcmd9L3Byb2plY3RzXCJdLFxuICAgICAgICBjcmVhdGVGb3JSZXBvOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wcm9qZWN0c1wiXSxcbiAgICAgICAgZGVsZXRlOiBbXCJERUxFVEUgL3Byb2plY3RzL3twcm9qZWN0X2lkfVwiXSxcbiAgICAgICAgZGVsZXRlQ2FyZDogW1wiREVMRVRFIC9wcm9qZWN0cy9jb2x1bW5zL2NhcmRzL3tjYXJkX2lkfVwiXSxcbiAgICAgICAgZGVsZXRlQ29sdW1uOiBbXCJERUxFVEUgL3Byb2plY3RzL2NvbHVtbnMve2NvbHVtbl9pZH1cIl0sXG4gICAgICAgIGdldDogW1wiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH1cIl0sXG4gICAgICAgIGdldENhcmQ6IFtcIkdFVCAvcHJvamVjdHMvY29sdW1ucy9jYXJkcy97Y2FyZF9pZH1cIl0sXG4gICAgICAgIGdldENvbHVtbjogW1wiR0VUIC9wcm9qZWN0cy9jb2x1bW5zL3tjb2x1bW5faWR9XCJdLFxuICAgICAgICBnZXRQZXJtaXNzaW9uRm9yVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX0vcGVybWlzc2lvblwiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0Q2FyZHM6IFtcIkdFVCAvcHJvamVjdHMvY29sdW1ucy97Y29sdW1uX2lkfS9jYXJkc1wiXSxcbiAgICAgICAgbGlzdENvbGxhYm9yYXRvcnM6IFtcIkdFVCAvcHJvamVjdHMve3Byb2plY3RfaWR9L2NvbGxhYm9yYXRvcnNcIl0sXG4gICAgICAgIGxpc3RDb2x1bW5zOiBbXCJHRVQgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2x1bW5zXCJdLFxuICAgICAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vcHJvamVjdHNcIl0sXG4gICAgICAgIGxpc3RGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3Byb2plY3RzXCJdLFxuICAgICAgICBsaXN0Rm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3Byb2plY3RzXCJdLFxuICAgICAgICBtb3ZlQ2FyZDogW1wiUE9TVCAvcHJvamVjdHMvY29sdW1ucy9jYXJkcy97Y2FyZF9pZH0vbW92ZXNcIl0sXG4gICAgICAgIG1vdmVDb2x1bW46IFtcIlBPU1QgL3Byb2plY3RzL2NvbHVtbnMve2NvbHVtbl9pZH0vbW92ZXNcIl0sXG4gICAgICAgIHJlbW92ZUNvbGxhYm9yYXRvcjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgdXBkYXRlOiBbXCJQQVRDSCAvcHJvamVjdHMve3Byb2plY3RfaWR9XCJdLFxuICAgICAgICB1cGRhdGVDYXJkOiBbXCJQQVRDSCAvcHJvamVjdHMvY29sdW1ucy9jYXJkcy97Y2FyZF9pZH1cIl0sXG4gICAgICAgIHVwZGF0ZUNvbHVtbjogW1wiUEFUQ0ggL3Byb2plY3RzL2NvbHVtbnMve2NvbHVtbl9pZH1cIl0sXG4gICAgfSxcbiAgICBwdWxsczoge1xuICAgICAgICBjaGVja0lmTWVyZ2VkOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vbWVyZ2VcIl0sXG4gICAgICAgIGNyZWF0ZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHNcIl0sXG4gICAgICAgIGNyZWF0ZVJlcGx5Rm9yUmV2aWV3Q29tbWVudDogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZXBsaWVzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZVJldmlldzogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzXCJdLFxuICAgICAgICBjcmVhdGVSZXZpZXdDb21tZW50OiBbXG4gICAgICAgICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vY29tbWVudHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlUGVuZGluZ1JldmlldzogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3cy97cmV2aWV3X2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVSZXZpZXdDb21tZW50OiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRpc21pc3NSZXZpZXc6IFtcbiAgICAgICAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3Mve3Jldmlld19pZH0vZGlzbWlzc2Fsc1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfVwiXSxcbiAgICAgICAgZ2V0UmV2aWV3OiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzL3tyZXZpZXdfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFJldmlld0NvbW1lbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9XCJdLFxuICAgICAgICBsaXN0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzXCJdLFxuICAgICAgICBsaXN0Q29tbWVudHNGb3JSZXZpZXc6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3Mve3Jldmlld19pZH0vY29tbWVudHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdENvbW1pdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9jb21taXRzXCJdLFxuICAgICAgICBsaXN0RmlsZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9maWxlc1wiXSxcbiAgICAgICAgbGlzdFJlcXVlc3RlZFJldmlld2VyczogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmVxdWVzdGVkX3Jldmlld2Vyc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0UmV2aWV3Q29tbWVudHM6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1lbnRzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RSZXZpZXdDb21tZW50c0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHNcIl0sXG4gICAgICAgIGxpc3RSZXZpZXdzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3c1wiXSxcbiAgICAgICAgbWVyZ2U6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9tZXJnZVwiXSxcbiAgICAgICAgcmVtb3ZlUmVxdWVzdGVkUmV2aWV3ZXJzOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXF1ZXN0ZWRfcmV2aWV3ZXJzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHJlcXVlc3RSZXZpZXdlcnM6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXF1ZXN0ZWRfcmV2aWV3ZXJzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHN1Ym1pdFJldmlldzogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3Mve3Jldmlld19pZH0vZXZlbnRzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHVwZGF0ZTogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn1cIl0sXG4gICAgICAgIHVwZGF0ZUJyYW5jaDogW1xuICAgICAgICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vdXBkYXRlLWJyYW5jaFwiLFxuICAgICAgICBdLFxuICAgICAgICB1cGRhdGVSZXZpZXc6IFtcbiAgICAgICAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3Mve3Jldmlld19pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgdXBkYXRlUmV2aWV3Q29tbWVudDogW1xuICAgICAgICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgfSxcbiAgICByYXRlTGltaXQ6IHsgZ2V0OiBbXCJHRVQgL3JhdGVfbGltaXRcIl0gfSxcbiAgICByZWFjdGlvbnM6IHtcbiAgICAgICAgY3JlYXRlRm9yQ29tbWl0Q29tbWVudDogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZUZvcklzc3VlOiBbXG4gICAgICAgICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9yZWFjdGlvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgY3JlYXRlRm9ySXNzdWVDb21tZW50OiBbXG4gICAgICAgICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZUZvclB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZUZvclJlbGVhc2U6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9L3JlYWN0aW9uc1wiLFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVGb3JUZWFtRGlzY3Vzc2lvbkNvbW1lbnRJbk9yZzogW1xuICAgICAgICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfS9yZWFjdGlvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgY3JlYXRlRm9yVGVhbURpc2N1c3Npb25Jbk9yZzogW1xuICAgICAgICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vcmVhY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZUZvckNvbW1pdENvbW1lbnQ6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlRm9ySXNzdWU6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlRm9ySXNzdWVDb21tZW50OiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZWFjdGlvbnMve3JlYWN0aW9uX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVGb3JQdWxsUmVxdWVzdENvbW1lbnQ6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlRm9yUmVsZWFzZTogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9yZWFjdGlvbnMve3JlYWN0aW9uX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVGb3JUZWFtRGlzY3Vzc2lvbjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9yZWFjdGlvbnMve3JlYWN0aW9uX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVGb3JUZWFtRGlzY3Vzc2lvbkNvbW1lbnQ6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfS9yZWFjdGlvbnMve3JlYWN0aW9uX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0Rm9yQ29tbWl0Q29tbWVudDogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZWFjdGlvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdEZvcklzc3VlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9yZWFjdGlvbnNcIl0sXG4gICAgICAgIGxpc3RGb3JJc3N1ZUNvbW1lbnQ6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0Rm9yUHVsbFJlcXVlc3RSZXZpZXdDb21tZW50OiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0Rm9yUmVsZWFzZTogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9yZWFjdGlvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdEZvclRlYW1EaXNjdXNzaW9uQ29tbWVudEluT3JnOiBbXG4gICAgICAgICAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn0vcmVhY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RGb3JUZWFtRGlzY3Vzc2lvbkluT3JnOiBbXG4gICAgICAgICAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L3JlYWN0aW9uc1wiLFxuICAgICAgICBdLFxuICAgIH0sXG4gICAgcmVwb3M6IHtcbiAgICAgICAgYWNjZXB0SW52aXRhdGlvbjogW1xuICAgICAgICAgICAgXCJQQVRDSCAvdXNlci9yZXBvc2l0b3J5X2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfVwiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IHJlbmFtZWQ6IFtcInJlcG9zXCIsIFwiYWNjZXB0SW52aXRhdGlvbkZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGFjY2VwdEludml0YXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJQQVRDSCAvdXNlci9yZXBvc2l0b3J5X2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBhZGRBcHBBY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvYXBwc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IG1hcFRvRGF0YTogXCJhcHBzXCIgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYWRkQ29sbGFib3JhdG9yOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfVwiXSxcbiAgICAgICAgYWRkU3RhdHVzQ2hlY2tDb250ZXh0czogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3N0YXR1c19jaGVja3MvY29udGV4dHNcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyBtYXBUb0RhdGE6IFwiY29udGV4dHNcIiB9LFxuICAgICAgICBdLFxuICAgICAgICBhZGRUZWFtQWNjZXNzUmVzdHJpY3Rpb25zOiBbXG4gICAgICAgICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3RlYW1zXCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHsgbWFwVG9EYXRhOiBcInRlYW1zXCIgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYWRkVXNlckFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy91c2Vyc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IG1hcFRvRGF0YTogXCJ1c2Vyc1wiIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGNoZWNrQ29sbGFib3JhdG9yOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfVwiXSxcbiAgICAgICAgY2hlY2tWdWxuZXJhYmlsaXR5QWxlcnRzOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdnVsbmVyYWJpbGl0eS1hbGVydHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgY29kZW93bmVyc0Vycm9yczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlb3duZXJzL2Vycm9yc1wiXSxcbiAgICAgICAgY29tcGFyZUNvbW1pdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tcGFyZS97YmFzZX0uLi57aGVhZH1cIl0sXG4gICAgICAgIGNvbXBhcmVDb21taXRzV2l0aEJhc2VoZWFkOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tcGFyZS97YmFzZWhlYWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZUF1dG9saW5rOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hdXRvbGlua3NcIl0sXG4gICAgICAgIGNyZWF0ZUNvbW1pdENvbW1lbnQ6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97Y29tbWl0X3NoYX0vY29tbWVudHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgY3JlYXRlQ29tbWl0U2lnbmF0dXJlUHJvdGVjdGlvbjogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3NpZ25hdHVyZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgY3JlYXRlQ29tbWl0U3RhdHVzOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGF0dXNlcy97c2hhfVwiXSxcbiAgICAgICAgY3JlYXRlRGVwbG95S2V5OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9rZXlzXCJdLFxuICAgICAgICBjcmVhdGVEZXBsb3ltZW50OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50c1wiXSxcbiAgICAgICAgY3JlYXRlRGVwbG95bWVudFN0YXR1czogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50cy97ZGVwbG95bWVudF9pZH0vc3RhdHVzZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgY3JlYXRlRGlzcGF0Y2hFdmVudDogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGlzcGF0Y2hlc1wiXSxcbiAgICAgICAgY3JlYXRlRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBPU1QgL3VzZXIvcmVwb3NcIl0sXG4gICAgICAgIGNyZWF0ZUZvcms6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ZvcmtzXCJdLFxuICAgICAgICBjcmVhdGVJbk9yZzogW1wiUE9TVCAvb3Jncy97b3JnfS9yZXBvc1wiXSxcbiAgICAgICAgY3JlYXRlT3JVcGRhdGVFbnZpcm9ubWVudDogW1xuICAgICAgICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgY3JlYXRlT3JVcGRhdGVGaWxlQ29udGVudHM6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29udGVudHMve3BhdGh9XCJdLFxuICAgICAgICBjcmVhdGVQYWdlc1NpdGU6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzXCJdLFxuICAgICAgICBjcmVhdGVSZWxlYXNlOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlc1wiXSxcbiAgICAgICAgY3JlYXRlVGFnUHJvdGVjdGlvbjogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vdGFncy9wcm90ZWN0aW9uXCJdLFxuICAgICAgICBjcmVhdGVVc2luZ1RlbXBsYXRlOiBbXG4gICAgICAgICAgICBcIlBPU1QgL3JlcG9zL3t0ZW1wbGF0ZV9vd25lcn0ve3RlbXBsYXRlX3JlcG99L2dlbmVyYXRlXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZVdlYmhvb2s6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzXCJdLFxuICAgICAgICBkZWNsaW5lSW52aXRhdGlvbjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJyZXBvc1wiLCBcImRlY2xpbmVJbnZpdGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgZGVjbGluZUludml0YXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99XCJdLFxuICAgICAgICBkZWxldGVBY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9uc1wiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVBZG1pbkJyYW5jaFByb3RlY3Rpb246IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL2VuZm9yY2VfYWRtaW5zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZUFuRW52aXJvbm1lbnQ6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZUF1dG9saW5rOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2F1dG9saW5rcy97YXV0b2xpbmtfaWR9XCJdLFxuICAgICAgICBkZWxldGVCcmFuY2hQcm90ZWN0aW9uOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvblwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVDb21taXRDb21tZW50OiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXSxcbiAgICAgICAgZGVsZXRlQ29tbWl0U2lnbmF0dXJlUHJvdGVjdGlvbjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc2lnbmF0dXJlc1wiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVEZXBsb3lLZXk6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30va2V5cy97a2V5X2lkfVwiXSxcbiAgICAgICAgZGVsZXRlRGVwbG95bWVudDogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50X2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVGaWxlOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbnRlbnRzL3twYXRofVwiXSxcbiAgICAgICAgZGVsZXRlSW52aXRhdGlvbjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVQYWdlc1NpdGU6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXNcIl0sXG4gICAgICAgIGRlbGV0ZVB1bGxSZXF1ZXN0UmV2aWV3UHJvdGVjdGlvbjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfcHVsbF9yZXF1ZXN0X3Jldmlld3NcIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlUmVsZWFzZTogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH1cIl0sXG4gICAgICAgIGRlbGV0ZVJlbGVhc2VBc3NldDogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL2Fzc2V0cy97YXNzZXRfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZVRhZ1Byb3RlY3Rpb246IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90YWdzL3Byb3RlY3Rpb24ve3RhZ19wcm90ZWN0aW9uX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVXZWJob29rOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfVwiXSxcbiAgICAgICAgZGlzYWJsZUF1dG9tYXRlZFNlY3VyaXR5Rml4ZXM6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hdXRvbWF0ZWQtc2VjdXJpdHktZml4ZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgZGlzYWJsZUxmc0ZvclJlcG86IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbGZzXCJdLFxuICAgICAgICBkaXNhYmxlVnVsbmVyYWJpbGl0eUFsZXJ0czogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3Z1bG5lcmFiaWxpdHktYWxlcnRzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRvd25sb2FkQXJjaGl2ZTogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3ppcGJhbGwve3JlZn1cIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJyZXBvc1wiLCBcImRvd25sb2FkWmlwYmFsbEFyY2hpdmVcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgZG93bmxvYWRUYXJiYWxsQXJjaGl2ZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90YXJiYWxsL3tyZWZ9XCJdLFxuICAgICAgICBkb3dubG9hZFppcGJhbGxBcmNoaXZlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3ppcGJhbGwve3JlZn1cIl0sXG4gICAgICAgIGVuYWJsZUF1dG9tYXRlZFNlY3VyaXR5Rml4ZXM6IFtcbiAgICAgICAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hdXRvbWF0ZWQtc2VjdXJpdHktZml4ZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgZW5hYmxlTGZzRm9yUmVwbzogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sZnNcIl0sXG4gICAgICAgIGVuYWJsZVZ1bG5lcmFiaWxpdHlBbGVydHM6IFtcbiAgICAgICAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS92dWxuZXJhYmlsaXR5LWFsZXJ0c1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZW5lcmF0ZVJlbGVhc2VOb3RlczogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy9nZW5lcmF0ZS1ub3Rlc1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb31cIl0sXG4gICAgICAgIGdldEFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEFkbWluQnJhbmNoUHJvdGVjdGlvbjogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vZW5mb3JjZV9hZG1pbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0QWxsRW52aXJvbm1lbnRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50c1wiXSxcbiAgICAgICAgZ2V0QWxsU3RhdHVzQ2hlY2tDb250ZXh0czogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc3RhdHVzX2NoZWNrcy9jb250ZXh0c1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRBbGxUb3BpY3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdG9waWNzXCJdLFxuICAgICAgICBnZXRBcHBzV2l0aEFjY2Vzc1RvUHJvdGVjdGVkQnJhbmNoOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvYXBwc1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRBdXRvbGluazogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hdXRvbGlua3Mve2F1dG9saW5rX2lkfVwiXSxcbiAgICAgICAgZ2V0QnJhbmNoOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9XCJdLFxuICAgICAgICBnZXRCcmFuY2hQcm90ZWN0aW9uOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvblwiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRDbG9uZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdHJhZmZpYy9jbG9uZXNcIl0sXG4gICAgICAgIGdldENvZGVGcmVxdWVuY3lTdGF0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGF0cy9jb2RlX2ZyZXF1ZW5jeVwiXSxcbiAgICAgICAgZ2V0Q29sbGFib3JhdG9yUGVybWlzc2lvbkxldmVsOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29sbGFib3JhdG9ycy97dXNlcm5hbWV9L3Blcm1pc3Npb25cIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0Q29tYmluZWRTdGF0dXNGb3JSZWY6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9zdGF0dXNcIl0sXG4gICAgICAgIGdldENvbW1pdDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9XCJdLFxuICAgICAgICBnZXRDb21taXRBY3Rpdml0eVN0YXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N0YXRzL2NvbW1pdF9hY3Rpdml0eVwiXSxcbiAgICAgICAgZ2V0Q29tbWl0Q29tbWVudDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgICAgIGdldENvbW1pdFNpZ25hdHVyZVByb3RlY3Rpb246IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3NpZ25hdHVyZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0Q29tbXVuaXR5UHJvZmlsZU1ldHJpY3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbXVuaXR5L3Byb2ZpbGVcIl0sXG4gICAgICAgIGdldENvbnRlbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29udGVudHMve3BhdGh9XCJdLFxuICAgICAgICBnZXRDb250cmlidXRvcnNTdGF0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGF0cy9jb250cmlidXRvcnNcIl0sXG4gICAgICAgIGdldERlcGxveUtleTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9rZXlzL3trZXlfaWR9XCJdLFxuICAgICAgICBnZXREZXBsb3ltZW50OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50X2lkfVwiXSxcbiAgICAgICAgZ2V0RGVwbG95bWVudFN0YXR1czogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50X2lkfS9zdGF0dXNlcy97c3RhdHVzX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRFbnZpcm9ubWVudDogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0TGF0ZXN0UGFnZXNCdWlsZDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wYWdlcy9idWlsZHMvbGF0ZXN0XCJdLFxuICAgICAgICBnZXRMYXRlc3RSZWxlYXNlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL2xhdGVzdFwiXSxcbiAgICAgICAgZ2V0UGFnZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXNcIl0sXG4gICAgICAgIGdldFBhZ2VzQnVpbGQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvYnVpbGRzL3tidWlsZF9pZH1cIl0sXG4gICAgICAgIGdldFBhZ2VzSGVhbHRoQ2hlY2s6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvaGVhbHRoXCJdLFxuICAgICAgICBnZXRQYXJ0aWNpcGF0aW9uU3RhdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3RhdHMvcGFydGljaXBhdGlvblwiXSxcbiAgICAgICAgZ2V0UHVsbFJlcXVlc3RSZXZpZXdQcm90ZWN0aW9uOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9wdWxsX3JlcXVlc3RfcmV2aWV3c1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRQdW5jaENhcmRTdGF0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGF0cy9wdW5jaF9jYXJkXCJdLFxuICAgICAgICBnZXRSZWFkbWU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVhZG1lXCJdLFxuICAgICAgICBnZXRSZWFkbWVJbkRpcmVjdG9yeTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWFkbWUve2Rpcn1cIl0sXG4gICAgICAgIGdldFJlbGVhc2U6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9XCJdLFxuICAgICAgICBnZXRSZWxlYXNlQXNzZXQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvYXNzZXRzL3thc3NldF9pZH1cIl0sXG4gICAgICAgIGdldFJlbGVhc2VCeVRhZzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy90YWdzL3t0YWd9XCJdLFxuICAgICAgICBnZXRTdGF0dXNDaGVja3NQcm90ZWN0aW9uOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFRlYW1zV2l0aEFjY2Vzc1RvUHJvdGVjdGVkQnJhbmNoOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvdGVhbXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0VG9wUGF0aHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdHJhZmZpYy9wb3B1bGFyL3BhdGhzXCJdLFxuICAgICAgICBnZXRUb3BSZWZlcnJlcnM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdHJhZmZpYy9wb3B1bGFyL3JlZmVycmVyc1wiXSxcbiAgICAgICAgZ2V0VXNlcnNXaXRoQWNjZXNzVG9Qcm90ZWN0ZWRCcmFuY2g6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy91c2Vyc1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRWaWV3czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90cmFmZmljL3ZpZXdzXCJdLFxuICAgICAgICBnZXRXZWJob29rOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfVwiXSxcbiAgICAgICAgZ2V0V2ViaG9va0NvbmZpZ0ZvclJlcG86IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vY29uZmlnXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFdlYmhvb2tEZWxpdmVyeTogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzL3tkZWxpdmVyeV9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdEF1dG9saW5rczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hdXRvbGlua3NcIl0sXG4gICAgICAgIGxpc3RCcmFuY2hlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlc1wiXSxcbiAgICAgICAgbGlzdEJyYW5jaGVzRm9ySGVhZENvbW1pdDogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve2NvbW1pdF9zaGF9L2JyYW5jaGVzLXdoZXJlLWhlYWRcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdENvbGxhYm9yYXRvcnM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29sbGFib3JhdG9yc1wiXSxcbiAgICAgICAgbGlzdENvbW1lbnRzRm9yQ29tbWl0OiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97Y29tbWl0X3NoYX0vY29tbWVudHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdENvbW1pdENvbW1lbnRzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50c1wiXSxcbiAgICAgICAgbGlzdENvbW1pdFN0YXR1c2VzRm9yUmVmOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9zdGF0dXNlc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0Q29tbWl0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzXCJdLFxuICAgICAgICBsaXN0Q29udHJpYnV0b3JzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbnRyaWJ1dG9yc1wiXSxcbiAgICAgICAgbGlzdERlcGxveUtleXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30va2V5c1wiXSxcbiAgICAgICAgbGlzdERlcGxveW1lbnRTdGF0dXNlczogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50X2lkfS9zdGF0dXNlc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0RGVwbG95bWVudHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHNcIl0sXG4gICAgICAgIGxpc3RGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3JlcG9zXCJdLFxuICAgICAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vcmVwb3NcIl0sXG4gICAgICAgIGxpc3RGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVwb3NcIl0sXG4gICAgICAgIGxpc3RGb3JrczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9mb3Jrc1wiXSxcbiAgICAgICAgbGlzdEludml0YXRpb25zOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludml0YXRpb25zXCJdLFxuICAgICAgICBsaXN0SW52aXRhdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3JlcG9zaXRvcnlfaW52aXRhdGlvbnNcIl0sXG4gICAgICAgIGxpc3RMYW5ndWFnZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFuZ3VhZ2VzXCJdLFxuICAgICAgICBsaXN0UGFnZXNCdWlsZHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvYnVpbGRzXCJdLFxuICAgICAgICBsaXN0UHVibGljOiBbXCJHRVQgL3JlcG9zaXRvcmllc1wiXSxcbiAgICAgICAgbGlzdFB1bGxSZXF1ZXN0c0Fzc29jaWF0ZWRXaXRoQ29tbWl0OiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97Y29tbWl0X3NoYX0vcHVsbHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdFJlbGVhc2VBc3NldHM6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH0vYXNzZXRzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RSZWxlYXNlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlc1wiXSxcbiAgICAgICAgbGlzdFRhZ1Byb3RlY3Rpb246IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdGFncy9wcm90ZWN0aW9uXCJdLFxuICAgICAgICBsaXN0VGFnczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90YWdzXCJdLFxuICAgICAgICBsaXN0VGVhbXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdGVhbXNcIl0sXG4gICAgICAgIGxpc3RXZWJob29rRGVsaXZlcmllczogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RXZWJob29rczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rc1wiXSxcbiAgICAgICAgbWVyZ2U6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L21lcmdlc1wiXSxcbiAgICAgICAgbWVyZ2VVcHN0cmVhbTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWVyZ2UtdXBzdHJlYW1cIl0sXG4gICAgICAgIHBpbmdXZWJob29rOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vcGluZ3NcIl0sXG4gICAgICAgIHJlZGVsaXZlcldlYmhvb2tEZWxpdmVyeTogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllcy97ZGVsaXZlcnlfaWR9L2F0dGVtcHRzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHJlbW92ZUFwcEFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL2FwcHNcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyBtYXBUb0RhdGE6IFwiYXBwc1wiIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHJlbW92ZUNvbGxhYm9yYXRvcjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICByZW1vdmVTdGF0dXNDaGVja0NvbnRleHRzOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzL2NvbnRleHRzXCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHsgbWFwVG9EYXRhOiBcImNvbnRleHRzXCIgfSxcbiAgICAgICAgXSxcbiAgICAgICAgcmVtb3ZlU3RhdHVzQ2hlY2tQcm90ZWN0aW9uOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHJlbW92ZVRlYW1BY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy90ZWFtc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IG1hcFRvRGF0YTogXCJ0ZWFtc1wiIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHJlbW92ZVVzZXJBY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy91c2Vyc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IG1hcFRvRGF0YTogXCJ1c2Vyc1wiIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHJlbmFtZUJyYW5jaDogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcmVuYW1lXCJdLFxuICAgICAgICByZXBsYWNlQWxsVG9waWNzOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RvcGljc1wiXSxcbiAgICAgICAgcmVxdWVzdFBhZ2VzQnVpbGQ6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzL2J1aWxkc1wiXSxcbiAgICAgICAgc2V0QWRtaW5CcmFuY2hQcm90ZWN0aW9uOiBbXG4gICAgICAgICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vZW5mb3JjZV9hZG1pbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgc2V0QXBwQWNjZXNzUmVzdHJpY3Rpb25zOiBbXG4gICAgICAgICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvYXBwc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IG1hcFRvRGF0YTogXCJhcHBzXCIgfSxcbiAgICAgICAgXSxcbiAgICAgICAgc2V0U3RhdHVzQ2hlY2tDb250ZXh0czogW1xuICAgICAgICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc3RhdHVzX2NoZWNrcy9jb250ZXh0c1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IG1hcFRvRGF0YTogXCJjb250ZXh0c1wiIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHNldFRlYW1BY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgICAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy90ZWFtc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IG1hcFRvRGF0YTogXCJ0ZWFtc1wiIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHNldFVzZXJBY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgICAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy91c2Vyc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IG1hcFRvRGF0YTogXCJ1c2Vyc1wiIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHRlc3RQdXNoV2ViaG9vazogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9L3Rlc3RzXCJdLFxuICAgICAgICB0cmFuc2ZlcjogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vdHJhbnNmZXJcIl0sXG4gICAgICAgIHVwZGF0ZTogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99XCJdLFxuICAgICAgICB1cGRhdGVCcmFuY2hQcm90ZWN0aW9uOiBbXG4gICAgICAgICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvblwiLFxuICAgICAgICBdLFxuICAgICAgICB1cGRhdGVDb21taXRDb21tZW50OiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHMve2NvbW1lbnRfaWR9XCJdLFxuICAgICAgICB1cGRhdGVJbmZvcm1hdGlvbkFib3V0UGFnZXNTaXRlOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzXCJdLFxuICAgICAgICB1cGRhdGVJbnZpdGF0aW9uOiBbXG4gICAgICAgICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgdXBkYXRlUHVsbFJlcXVlc3RSZXZpZXdQcm90ZWN0aW9uOiBbXG4gICAgICAgICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3B1bGxfcmVxdWVzdF9yZXZpZXdzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHVwZGF0ZVJlbGVhc2U6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH1cIl0sXG4gICAgICAgIHVwZGF0ZVJlbGVhc2VBc3NldDogW1xuICAgICAgICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvYXNzZXRzL3thc3NldF9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgdXBkYXRlU3RhdHVzQ2hlY2tQb3RlY3Rpb246IFtcbiAgICAgICAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc3RhdHVzX2NoZWNrc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IHJlbmFtZWQ6IFtcInJlcG9zXCIsIFwidXBkYXRlU3RhdHVzQ2hlY2tQcm90ZWN0aW9uXCJdIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHVwZGF0ZVN0YXR1c0NoZWNrUHJvdGVjdGlvbjogW1xuICAgICAgICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHVwZGF0ZVdlYmhvb2s6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH1cIl0sXG4gICAgICAgIHVwZGF0ZVdlYmhvb2tDb25maWdGb3JSZXBvOiBbXG4gICAgICAgICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vY29uZmlnXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHVwbG9hZFJlbGVhc2VBc3NldDogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH0vYXNzZXRzez9uYW1lLGxhYmVsfVwiLFxuICAgICAgICAgICAgeyBiYXNlVXJsOiBcImh0dHBzOi8vdXBsb2Fkcy5naXRodWIuY29tXCIgfSxcbiAgICAgICAgXSxcbiAgICB9LFxuICAgIHNlYXJjaDoge1xuICAgICAgICBjb2RlOiBbXCJHRVQgL3NlYXJjaC9jb2RlXCJdLFxuICAgICAgICBjb21taXRzOiBbXCJHRVQgL3NlYXJjaC9jb21taXRzXCJdLFxuICAgICAgICBpc3N1ZXNBbmRQdWxsUmVxdWVzdHM6IFtcIkdFVCAvc2VhcmNoL2lzc3Vlc1wiXSxcbiAgICAgICAgbGFiZWxzOiBbXCJHRVQgL3NlYXJjaC9sYWJlbHNcIl0sXG4gICAgICAgIHJlcG9zOiBbXCJHRVQgL3NlYXJjaC9yZXBvc2l0b3JpZXNcIl0sXG4gICAgICAgIHRvcGljczogW1wiR0VUIC9zZWFyY2gvdG9waWNzXCJdLFxuICAgICAgICB1c2VyczogW1wiR0VUIC9zZWFyY2gvdXNlcnNcIl0sXG4gICAgfSxcbiAgICBzZWNyZXRTY2FubmluZzoge1xuICAgICAgICBnZXRBbGVydDogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3JldC1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn1cIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdEFsZXJ0c0ZvckVudGVycHJpc2U6IFtcbiAgICAgICAgICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0QWxlcnRzRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiXSxcbiAgICAgICAgbGlzdEFsZXJ0c0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiXSxcbiAgICAgICAgbGlzdExvY2F0aW9uc0ZvckFsZXJ0OiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0cy97YWxlcnRfbnVtYmVyfS9sb2NhdGlvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgdXBkYXRlQWxlcnQ6IFtcbiAgICAgICAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3JldC1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn1cIixcbiAgICAgICAgXSxcbiAgICB9LFxuICAgIHRlYW1zOiB7XG4gICAgICAgIGFkZE9yVXBkYXRlTWVtYmVyc2hpcEZvclVzZXJJbk9yZzogW1xuICAgICAgICAgICAgXCJQVVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vbWVtYmVyc2hpcHMve3VzZXJuYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBhZGRPclVwZGF0ZVByb2plY3RQZXJtaXNzaW9uc0luT3JnOiBbXG4gICAgICAgICAgICBcIlBVVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9wcm9qZWN0cy97cHJvamVjdF9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgYWRkT3JVcGRhdGVSZXBvUGVybWlzc2lvbnNJbk9yZzogW1xuICAgICAgICAgICAgXCJQVVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcmVwb3Mve293bmVyfS97cmVwb31cIixcbiAgICAgICAgXSxcbiAgICAgICAgY2hlY2tQZXJtaXNzaW9uc0ZvclByb2plY3RJbk9yZzogW1xuICAgICAgICAgICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcHJvamVjdHMve3Byb2plY3RfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNoZWNrUGVybWlzc2lvbnNGb3JSZXBvSW5Pcmc6IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3JlcG9zL3tvd25lcn0ve3JlcG99XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZTogW1wiUE9TVCAvb3Jncy97b3JnfS90ZWFtc1wiXSxcbiAgICAgICAgY3JlYXRlRGlzY3Vzc2lvbkNvbW1lbnRJbk9yZzogW1xuICAgICAgICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgY3JlYXRlRGlzY3Vzc2lvbkluT3JnOiBbXCJQT1NUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zXCJdLFxuICAgICAgICBkZWxldGVEaXNjdXNzaW9uQ29tbWVudEluT3JnOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlRGlzY3Vzc2lvbkluT3JnOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZUluT3JnOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z31cIl0sXG4gICAgICAgIGdldEJ5TmFtZTogW1wiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9XCJdLFxuICAgICAgICBnZXREaXNjdXNzaW9uQ29tbWVudEluT3JnOiBbXG4gICAgICAgICAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0RGlzY3Vzc2lvbkluT3JnOiBbXG4gICAgICAgICAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldE1lbWJlcnNoaXBGb3JVc2VySW5Pcmc6IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L21lbWJlcnNoaXBzL3t1c2VybmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdDogW1wiR0VUIC9vcmdzL3tvcmd9L3RlYW1zXCJdLFxuICAgICAgICBsaXN0Q2hpbGRJbk9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3RlYW1zXCJdLFxuICAgICAgICBsaXN0RGlzY3Vzc2lvbkNvbW1lbnRzSW5Pcmc6IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdERpc2N1c3Npb25zSW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9uc1wiXSxcbiAgICAgICAgbGlzdEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvdGVhbXNcIl0sXG4gICAgICAgIGxpc3RNZW1iZXJzSW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9tZW1iZXJzXCJdLFxuICAgICAgICBsaXN0UGVuZGluZ0ludml0YXRpb25zSW5Pcmc6IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2ludml0YXRpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RQcm9qZWN0c0luT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcHJvamVjdHNcIl0sXG4gICAgICAgIGxpc3RSZXBvc0luT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcmVwb3NcIl0sXG4gICAgICAgIHJlbW92ZU1lbWJlcnNoaXBGb3JVc2VySW5Pcmc6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L21lbWJlcnNoaXBzL3t1c2VybmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVtb3ZlUHJvamVjdEluT3JnOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9wcm9qZWN0cy97cHJvamVjdF9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVtb3ZlUmVwb0luT3JnOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9yZXBvcy97b3duZXJ9L3tyZXBvfVwiLFxuICAgICAgICBdLFxuICAgICAgICB1cGRhdGVEaXNjdXNzaW9uQ29tbWVudEluT3JnOiBbXG4gICAgICAgICAgICBcIlBBVENIIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfVwiLFxuICAgICAgICBdLFxuICAgICAgICB1cGRhdGVEaXNjdXNzaW9uSW5Pcmc6IFtcbiAgICAgICAgICAgIFwiUEFUQ0ggL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfVwiLFxuICAgICAgICBdLFxuICAgICAgICB1cGRhdGVJbk9yZzogW1wiUEFUQ0ggL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z31cIl0sXG4gICAgfSxcbiAgICB1c2Vyczoge1xuICAgICAgICBhZGRFbWFpbEZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvdXNlci9lbWFpbHNcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImFkZEVtYWlsRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgYWRkRW1haWxGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9lbWFpbHNcIl0sXG4gICAgICAgIGJsb2NrOiBbXCJQVVQgL3VzZXIvYmxvY2tzL3t1c2VybmFtZX1cIl0sXG4gICAgICAgIGNoZWNrQmxvY2tlZDogW1wiR0VUIC91c2VyL2Jsb2Nrcy97dXNlcm5hbWV9XCJdLFxuICAgICAgICBjaGVja0ZvbGxvd2luZ0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9mb2xsb3dpbmcve3RhcmdldF91c2VyfVwiXSxcbiAgICAgICAgY2hlY2tQZXJzb25Jc0ZvbGxvd2VkQnlBdXRoZW50aWNhdGVkOiBbXCJHRVQgL3VzZXIvZm9sbG93aW5nL3t1c2VybmFtZX1cIl0sXG4gICAgICAgIGNyZWF0ZUdwZ0tleUZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvdXNlci9ncGdfa2V5c1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwiY3JlYXRlR3BnS2V5Rm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgY3JlYXRlR3BnS2V5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBPU1QgL3VzZXIvZ3BnX2tleXNcIl0sXG4gICAgICAgIGNyZWF0ZVB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvdXNlci9rZXlzXCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJjcmVhdGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9LFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9rZXlzXCJdLFxuICAgICAgICBkZWxldGVFbWFpbEZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC91c2VyL2VtYWlsc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwiZGVsZXRlRW1haWxGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9LFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVFbWFpbEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIvZW1haWxzXCJdLFxuICAgICAgICBkZWxldGVHcGdLZXlGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvdXNlci9ncGdfa2V5cy97Z3BnX2tleV9pZH1cIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImRlbGV0ZUdwZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZUdwZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIvZ3BnX2tleXMve2dwZ19rZXlfaWR9XCJdLFxuICAgICAgICBkZWxldGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvdXNlci9rZXlzL3trZXlfaWR9XCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJkZWxldGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9LFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL2tleXMve2tleV9pZH1cIl0sXG4gICAgICAgIGZvbGxvdzogW1wiUFVUIC91c2VyL2ZvbGxvd2luZy97dXNlcm5hbWV9XCJdLFxuICAgICAgICBnZXRBdXRoZW50aWNhdGVkOiBbXCJHRVQgL3VzZXJcIl0sXG4gICAgICAgIGdldEJ5VXNlcm5hbWU6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfVwiXSxcbiAgICAgICAgZ2V0Q29udGV4dEZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ob3ZlcmNhcmRcIl0sXG4gICAgICAgIGdldEdwZ0tleUZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgICAgICAgIFwiR0VUIC91c2VyL2dwZ19rZXlzL3tncGdfa2V5X2lkfVwiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwiZ2V0R3BnS2V5Rm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0R3BnS2V5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9ncGdfa2V5cy97Z3BnX2tleV9pZH1cIl0sXG4gICAgICAgIGdldFB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgICAgICAgIFwiR0VUIC91c2VyL2tleXMve2tleV9pZH1cIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImdldFB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGdldFB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIva2V5cy97a2V5X2lkfVwiXSxcbiAgICAgICAgbGlzdDogW1wiR0VUIC91c2Vyc1wiXSxcbiAgICAgICAgbGlzdEJsb2NrZWRCeUF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgICAgICAgIFwiR0VUIC91c2VyL2Jsb2Nrc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwibGlzdEJsb2NrZWRCeUF1dGhlbnRpY2F0ZWRVc2VyXCJdIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RCbG9ja2VkQnlBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2Jsb2Nrc1wiXSxcbiAgICAgICAgbGlzdEVtYWlsc0ZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgICAgICAgIFwiR0VUIC91c2VyL2VtYWlsc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwibGlzdEVtYWlsc0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RFbWFpbHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2VtYWlsc1wiXSxcbiAgICAgICAgbGlzdEZvbGxvd2VkQnlBdXRoZW50aWNhdGVkOiBbXG4gICAgICAgICAgICBcIkdFVCAvdXNlci9mb2xsb3dpbmdcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImxpc3RGb2xsb3dlZEJ5QXV0aGVudGljYXRlZFVzZXJcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdEZvbGxvd2VkQnlBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2ZvbGxvd2luZ1wiXSxcbiAgICAgICAgbGlzdEZvbGxvd2Vyc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvZm9sbG93ZXJzXCJdLFxuICAgICAgICBsaXN0Rm9sbG93ZXJzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2ZvbGxvd2Vyc1wiXSxcbiAgICAgICAgbGlzdEZvbGxvd2luZ0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9mb2xsb3dpbmdcIl0sXG4gICAgICAgIGxpc3RHcGdLZXlzRm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvZ3BnX2tleXNcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImxpc3RHcGdLZXlzRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdEdwZ0tleXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2dwZ19rZXlzXCJdLFxuICAgICAgICBsaXN0R3BnS2V5c0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ncGdfa2V5c1wiXSxcbiAgICAgICAgbGlzdFB1YmxpY0VtYWlsc0ZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgICAgICAgIFwiR0VUIC91c2VyL3B1YmxpY19lbWFpbHNcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImxpc3RQdWJsaWNFbWFpbHNGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9LFxuICAgICAgICBdLFxuICAgICAgICBsaXN0UHVibGljRW1haWxzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9wdWJsaWNfZW1haWxzXCJdLFxuICAgICAgICBsaXN0UHVibGljS2V5c0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9rZXlzXCJdLFxuICAgICAgICBsaXN0UHVibGljU3NoS2V5c0ZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgICAgICAgIFwiR0VUIC91c2VyL2tleXNcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImxpc3RQdWJsaWNTc2hLZXlzRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdFB1YmxpY1NzaEtleXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2tleXNcIl0sXG4gICAgICAgIHNldFByaW1hcnlFbWFpbFZpc2liaWxpdHlGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICAgICAgICBcIlBBVENIIC91c2VyL2VtYWlsL3Zpc2liaWxpdHlcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcInNldFByaW1hcnlFbWFpbFZpc2liaWxpdHlGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9LFxuICAgICAgICBdLFxuICAgICAgICBzZXRQcmltYXJ5RW1haWxWaXNpYmlsaXR5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiUEFUQ0ggL3VzZXIvZW1haWwvdmlzaWJpbGl0eVwiLFxuICAgICAgICBdLFxuICAgICAgICB1bmJsb2NrOiBbXCJERUxFVEUgL3VzZXIvYmxvY2tzL3t1c2VybmFtZX1cIl0sXG4gICAgICAgIHVuZm9sbG93OiBbXCJERUxFVEUgL3VzZXIvZm9sbG93aW5nL3t1c2VybmFtZX1cIl0sXG4gICAgICAgIHVwZGF0ZUF1dGhlbnRpY2F0ZWQ6IFtcIlBBVENIIC91c2VyXCJdLFxuICAgIH0sXG59O1xuXG5jb25zdCBWRVJTSU9OID0gXCI1LjE2LjJcIjtcblxuZnVuY3Rpb24gZW5kcG9pbnRzVG9NZXRob2RzKG9jdG9raXQsIGVuZHBvaW50c01hcCkge1xuICAgIGNvbnN0IG5ld01ldGhvZHMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtzY29wZSwgZW5kcG9pbnRzXSBvZiBPYmplY3QuZW50cmllcyhlbmRwb2ludHNNYXApKSB7XG4gICAgICAgIGZvciAoY29uc3QgW21ldGhvZE5hbWUsIGVuZHBvaW50XSBvZiBPYmplY3QuZW50cmllcyhlbmRwb2ludHMpKSB7XG4gICAgICAgICAgICBjb25zdCBbcm91dGUsIGRlZmF1bHRzLCBkZWNvcmF0aW9uc10gPSBlbmRwb2ludDtcbiAgICAgICAgICAgIGNvbnN0IFttZXRob2QsIHVybF0gPSByb3V0ZS5zcGxpdCgvIC8pO1xuICAgICAgICAgICAgY29uc3QgZW5kcG9pbnREZWZhdWx0cyA9IE9iamVjdC5hc3NpZ24oeyBtZXRob2QsIHVybCB9LCBkZWZhdWx0cyk7XG4gICAgICAgICAgICBpZiAoIW5ld01ldGhvZHNbc2NvcGVdKSB7XG4gICAgICAgICAgICAgICAgbmV3TWV0aG9kc1tzY29wZV0gPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNjb3BlTWV0aG9kcyA9IG5ld01ldGhvZHNbc2NvcGVdO1xuICAgICAgICAgICAgaWYgKGRlY29yYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgc2NvcGVNZXRob2RzW21ldGhvZE5hbWVdID0gZGVjb3JhdGUob2N0b2tpdCwgc2NvcGUsIG1ldGhvZE5hbWUsIGVuZHBvaW50RGVmYXVsdHMsIGRlY29yYXRpb25zKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlTWV0aG9kc1ttZXRob2ROYW1lXSA9IG9jdG9raXQucmVxdWVzdC5kZWZhdWx0cyhlbmRwb2ludERlZmF1bHRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3TWV0aG9kcztcbn1cbmZ1bmN0aW9uIGRlY29yYXRlKG9jdG9raXQsIHNjb3BlLCBtZXRob2ROYW1lLCBkZWZhdWx0cywgZGVjb3JhdGlvbnMpIHtcbiAgICBjb25zdCByZXF1ZXN0V2l0aERlZmF1bHRzID0gb2N0b2tpdC5yZXF1ZXN0LmRlZmF1bHRzKGRlZmF1bHRzKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGZ1bmN0aW9uIHdpdGhEZWNvcmF0aW9ucyguLi5hcmdzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8yNTQ4OFxuICAgICAgICBsZXQgb3B0aW9ucyA9IHJlcXVlc3RXaXRoRGVmYXVsdHMuZW5kcG9pbnQubWVyZ2UoLi4uYXJncyk7XG4gICAgICAgIC8vIFRoZXJlIGFyZSBjdXJyZW50bHkgbm8gb3RoZXIgZGVjb3JhdGlvbnMgdGhhbiBgLm1hcFRvRGF0YWBcbiAgICAgICAgaWYgKGRlY29yYXRpb25zLm1hcFRvRGF0YSkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBvcHRpb25zW2RlY29yYXRpb25zLm1hcFRvRGF0YV0sXG4gICAgICAgICAgICAgICAgW2RlY29yYXRpb25zLm1hcFRvRGF0YV06IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RXaXRoRGVmYXVsdHMob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlY29yYXRpb25zLnJlbmFtZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IFtuZXdTY29wZSwgbmV3TWV0aG9kTmFtZV0gPSBkZWNvcmF0aW9ucy5yZW5hbWVkO1xuICAgICAgICAgICAgb2N0b2tpdC5sb2cud2Fybihgb2N0b2tpdC4ke3Njb3BlfS4ke21ldGhvZE5hbWV9KCkgaGFzIGJlZW4gcmVuYW1lZCB0byBvY3Rva2l0LiR7bmV3U2NvcGV9LiR7bmV3TWV0aG9kTmFtZX0oKWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWNvcmF0aW9ucy5kZXByZWNhdGVkKSB7XG4gICAgICAgICAgICBvY3Rva2l0LmxvZy53YXJuKGRlY29yYXRpb25zLmRlcHJlY2F0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWNvcmF0aW9ucy5yZW5hbWVkUGFyYW1ldGVycykge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzI1NDg4XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0gcmVxdWVzdFdpdGhEZWZhdWx0cy5lbmRwb2ludC5tZXJnZSguLi5hcmdzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW25hbWUsIGFsaWFzXSBvZiBPYmplY3QuZW50cmllcyhkZWNvcmF0aW9ucy5yZW5hbWVkUGFyYW1ldGVycykpIHtcbiAgICAgICAgICAgICAgICBpZiAobmFtZSBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIG9jdG9raXQubG9nLndhcm4oYFwiJHtuYW1lfVwiIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkIGZvciBcIm9jdG9raXQuJHtzY29wZX0uJHttZXRob2ROYW1lfSgpXCIuIFVzZSBcIiR7YWxpYXN9XCIgaW5zdGVhZGApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShhbGlhcyBpbiBvcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1thbGlhc10gPSBvcHRpb25zW25hbWVdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zW25hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0V2l0aERlZmF1bHRzKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8yNTQ4OFxuICAgICAgICByZXR1cm4gcmVxdWVzdFdpdGhEZWZhdWx0cyguLi5hcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24od2l0aERlY29yYXRpb25zLCByZXF1ZXN0V2l0aERlZmF1bHRzKTtcbn1cblxuZnVuY3Rpb24gcmVzdEVuZHBvaW50TWV0aG9kcyhvY3Rva2l0KSB7XG4gICAgY29uc3QgYXBpID0gZW5kcG9pbnRzVG9NZXRob2RzKG9jdG9raXQsIEVuZHBvaW50cyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdDogYXBpLFxuICAgIH07XG59XG5yZXN0RW5kcG9pbnRNZXRob2RzLlZFUlNJT04gPSBWRVJTSU9OO1xuZnVuY3Rpb24gbGVnYWN5UmVzdEVuZHBvaW50TWV0aG9kcyhvY3Rva2l0KSB7XG4gICAgY29uc3QgYXBpID0gZW5kcG9pbnRzVG9NZXRob2RzKG9jdG9raXQsIEVuZHBvaW50cyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYXBpLFxuICAgICAgICByZXN0OiBhcGksXG4gICAgfTtcbn1cbmxlZ2FjeVJlc3RFbmRwb2ludE1ldGhvZHMuVkVSU0lPTiA9IFZFUlNJT047XG5cbmV4cG9ydCB7IGxlZ2FjeVJlc3RFbmRwb2ludE1ldGhvZHMsIHJlc3RFbmRwb2ludE1ldGhvZHMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9378\n')},5265:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.issue = exports.issueCommand = void 0;\nconst os = __importStar(__webpack_require__(2037));\nconst utils_1 = __webpack_require__(4570);\n/**\n * Commands\n *\n * Command Format:\n * ::name key=value,key=value::message\n *\n * Examples:\n * ::warning::This is the message\n * ::set-env name=MY_VAR::some value\n */\nfunction issueCommand(command, properties, message) {\n const cmd = new Command(command, properties, message);\n process.stdout.write(cmd.toString() + os.EOL);\n}\nexports.issueCommand = issueCommand;\nfunction issue(name, message = '') {\n issueCommand(name, {}, message);\n}\nexports.issue = issue;\nconst CMD_STRING = '::';\nclass Command {\n constructor(command, properties, message) {\n if (!command) {\n command = 'missing.command';\n }\n this.command = command;\n this.properties = properties;\n this.message = message;\n }\n toString() {\n let cmdStr = CMD_STRING + this.command;\n if (this.properties && Object.keys(this.properties).length > 0) {\n cmdStr += ' ';\n let first = true;\n for (const key in this.properties) {\n if (this.properties.hasOwnProperty(key)) {\n const val = this.properties[key];\n if (val) {\n if (first) {\n first = false;\n }\n else {\n cmdStr += ',';\n }\n cmdStr += `${key}=${escapeProperty(val)}`;\n }\n }\n }\n }\n cmdStr += `${CMD_STRING}${escapeData(this.message)}`;\n return cmdStr;\n }\n}\nfunction escapeData(s) {\n return utils_1.toCommandValue(s)\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A');\n}\nfunction escapeProperty(s) {\n return utils_1.toCommandValue(s)\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A')\n .replace(/:/g, '%3A')\n .replace(/,/g, '%2C');\n}\n//# sourceMappingURL=command.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI2NS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQSxtQ0FBbUMsb0NBQW9DLGdCQUFnQjtBQUN2RixDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGFBQWEsR0FBRyxvQkFBb0I7QUFDcEMsd0JBQXdCLG1CQUFPLENBQUMsSUFBSTtBQUNwQyxnQkFBZ0IsbUJBQU8sQ0FBQyxJQUFTO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQSx5QkFBeUI7QUFDekI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsSUFBSSxHQUFHLG9CQUFvQjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixXQUFXLEVBQUUseUJBQXlCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2NvcmUvbGliL2NvbW1hbmQuanM/M2YyOCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlzc3VlID0gZXhwb3J0cy5pc3N1ZUNvbW1hbmQgPSB2b2lkIDA7XG5jb25zdCBvcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwib3NcIikpO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuLyoqXG4gKiBDb21tYW5kc1xuICpcbiAqIENvbW1hbmQgRm9ybWF0OlxuICogICA6Om5hbWUga2V5PXZhbHVlLGtleT12YWx1ZTo6bWVzc2FnZVxuICpcbiAqIEV4YW1wbGVzOlxuICogICA6Ondhcm5pbmc6OlRoaXMgaXMgdGhlIG1lc3NhZ2VcbiAqICAgOjpzZXQtZW52IG5hbWU9TVlfVkFSOjpzb21lIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIGlzc3VlQ29tbWFuZChjb21tYW5kLCBwcm9wZXJ0aWVzLCBtZXNzYWdlKSB7XG4gICAgY29uc3QgY21kID0gbmV3IENvbW1hbmQoY29tbWFuZCwgcHJvcGVydGllcywgbWVzc2FnZSk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoY21kLnRvU3RyaW5nKCkgKyBvcy5FT0wpO1xufVxuZXhwb3J0cy5pc3N1ZUNvbW1hbmQgPSBpc3N1ZUNvbW1hbmQ7XG5mdW5jdGlvbiBpc3N1ZShuYW1lLCBtZXNzYWdlID0gJycpIHtcbiAgICBpc3N1ZUNvbW1hbmQobmFtZSwge30sIG1lc3NhZ2UpO1xufVxuZXhwb3J0cy5pc3N1ZSA9IGlzc3VlO1xuY29uc3QgQ01EX1NUUklORyA9ICc6Oic7XG5jbGFzcyBDb21tYW5kIHtcbiAgICBjb25zdHJ1Y3Rvcihjb21tYW5kLCBwcm9wZXJ0aWVzLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmICghY29tbWFuZCkge1xuICAgICAgICAgICAgY29tbWFuZCA9ICdtaXNzaW5nLmNvbW1hbmQnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7XG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBsZXQgY21kU3RyID0gQ01EX1NUUklORyArIHRoaXMuY29tbWFuZDtcbiAgICAgICAgaWYgKHRoaXMucHJvcGVydGllcyAmJiBPYmplY3Qua2V5cyh0aGlzLnByb3BlcnRpZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNtZFN0ciArPSAnICc7XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMucHJvcGVydGllc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kU3RyICs9ICcsJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNtZFN0ciArPSBgJHtrZXl9PSR7ZXNjYXBlUHJvcGVydHkodmFsKX1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNtZFN0ciArPSBgJHtDTURfU1RSSU5HfSR7ZXNjYXBlRGF0YSh0aGlzLm1lc3NhZ2UpfWA7XG4gICAgICAgIHJldHVybiBjbWRTdHI7XG4gICAgfVxufVxuZnVuY3Rpb24gZXNjYXBlRGF0YShzKSB7XG4gICAgcmV0dXJuIHV0aWxzXzEudG9Db21tYW5kVmFsdWUocylcbiAgICAgICAgLnJlcGxhY2UoLyUvZywgJyUyNScpXG4gICAgICAgIC5yZXBsYWNlKC9cXHIvZywgJyUwRCcpXG4gICAgICAgIC5yZXBsYWNlKC9cXG4vZywgJyUwQScpO1xufVxuZnVuY3Rpb24gZXNjYXBlUHJvcGVydHkocykge1xuICAgIHJldHVybiB1dGlsc18xLnRvQ29tbWFuZFZhbHVlKHMpXG4gICAgICAgIC5yZXBsYWNlKC8lL2csICclMjUnKVxuICAgICAgICAucmVwbGFjZSgvXFxyL2csICclMEQnKVxuICAgICAgICAucmVwbGFjZSgvXFxuL2csICclMEEnKVxuICAgICAgICAucmVwbGFjZSgvOi9nLCAnJTNBJylcbiAgICAgICAgLnJlcGxhY2UoLywvZywgJyUyQycpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tbWFuZC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5265\n")},2225:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.getIDToken = exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0;\nconst command_1 = __webpack_require__(5265);\nconst file_command_1 = __webpack_require__(3108);\nconst utils_1 = __webpack_require__(4570);\nconst os = __importStar(__webpack_require__(2037));\nconst path = __importStar(__webpack_require__(1017));\nconst oidc_utils_1 = __webpack_require__(1526);\n/**\n * The code to exit an action\n */\nvar ExitCode;\n(function (ExitCode) {\n /**\n * A code indicating that the action was successful\n */\n ExitCode[ExitCode[\"Success\"] = 0] = \"Success\";\n /**\n * A code indicating that the action was a failure\n */\n ExitCode[ExitCode[\"Failure\"] = 1] = \"Failure\";\n})(ExitCode = exports.ExitCode || (exports.ExitCode = {}));\n//-----------------------------------------------------------------------\n// Variables\n//-----------------------------------------------------------------------\n/**\n * Sets env variable for this action and future actions in the job\n * @param name the name of the variable to set\n * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction exportVariable(name, val) {\n const convertedVal = utils_1.toCommandValue(val);\n process.env[name] = convertedVal;\n const filePath = process.env['GITHUB_ENV'] || '';\n if (filePath) {\n return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));\n }\n command_1.issueCommand('set-env', { name }, convertedVal);\n}\nexports.exportVariable = exportVariable;\n/**\n * Registers a secret which will get masked from logs\n * @param secret value of the secret\n */\nfunction setSecret(secret) {\n command_1.issueCommand('add-mask', {}, secret);\n}\nexports.setSecret = setSecret;\n/**\n * Prepends inputPath to the PATH (for this action and future actions)\n * @param inputPath\n */\nfunction addPath(inputPath) {\n const filePath = process.env['GITHUB_PATH'] || '';\n if (filePath) {\n file_command_1.issueFileCommand('PATH', inputPath);\n }\n else {\n command_1.issueCommand('add-path', {}, inputPath);\n }\n process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`;\n}\nexports.addPath = addPath;\n/**\n * Gets the value of an input.\n * Unless trimWhitespace is set to false in InputOptions, the value is also trimmed.\n * Returns an empty string if the value is not defined.\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns string\n */\nfunction getInput(name, options) {\n const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || '';\n if (options && options.required && !val) {\n throw new Error(`Input required and not supplied: ${name}`);\n }\n if (options && options.trimWhitespace === false) {\n return val;\n }\n return val.trim();\n}\nexports.getInput = getInput;\n/**\n * Gets the values of an multiline input. Each value is also trimmed.\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns string[]\n *\n */\nfunction getMultilineInput(name, options) {\n const inputs = getInput(name, options)\n .split('\\n')\n .filter(x => x !== '');\n if (options && options.trimWhitespace === false) {\n return inputs;\n }\n return inputs.map(input => input.trim());\n}\nexports.getMultilineInput = getMultilineInput;\n/**\n * Gets the input value of the boolean type in the YAML 1.2 \"core schema\" specification.\n * Support boolean input list: `true | True | TRUE | false | False | FALSE` .\n * The return value is also in boolean type.\n * ref: https://yaml.org/spec/1.2/spec.html#id2804923\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns boolean\n */\nfunction getBooleanInput(name, options) {\n const trueValue = ['true', 'True', 'TRUE'];\n const falseValue = ['false', 'False', 'FALSE'];\n const val = getInput(name, options);\n if (trueValue.includes(val))\n return true;\n if (falseValue.includes(val))\n return false;\n throw new TypeError(`Input does not meet YAML 1.2 \"Core Schema\" specification: ${name}\\n` +\n `Support boolean input list: \\`true | True | TRUE | false | False | FALSE\\``);\n}\nexports.getBooleanInput = getBooleanInput;\n/**\n * Sets the value of an output.\n *\n * @param name name of the output to set\n * @param value value to store. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction setOutput(name, value) {\n const filePath = process.env['GITHUB_OUTPUT'] || '';\n if (filePath) {\n return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));\n }\n process.stdout.write(os.EOL);\n command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));\n}\nexports.setOutput = setOutput;\n/**\n * Enables or disables the echoing of commands into stdout for the rest of the step.\n * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set.\n *\n */\nfunction setCommandEcho(enabled) {\n command_1.issue('echo', enabled ? 'on' : 'off');\n}\nexports.setCommandEcho = setCommandEcho;\n//-----------------------------------------------------------------------\n// Results\n//-----------------------------------------------------------------------\n/**\n * Sets the action status to failed.\n * When the action exits it will be with an exit code of 1\n * @param message add error issue message\n */\nfunction setFailed(message) {\n process.exitCode = ExitCode.Failure;\n error(message);\n}\nexports.setFailed = setFailed;\n//-----------------------------------------------------------------------\n// Logging Commands\n//-----------------------------------------------------------------------\n/**\n * Gets whether Actions Step Debug is on or not\n */\nfunction isDebug() {\n return process.env['RUNNER_DEBUG'] === '1';\n}\nexports.isDebug = isDebug;\n/**\n * Writes debug message to user log\n * @param message debug message\n */\nfunction debug(message) {\n command_1.issueCommand('debug', {}, message);\n}\nexports.debug = debug;\n/**\n * Adds an error issue\n * @param message error issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction error(message, properties = {}) {\n command_1.issueCommand('error', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);\n}\nexports.error = error;\n/**\n * Adds a warning issue\n * @param message warning issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction warning(message, properties = {}) {\n command_1.issueCommand('warning', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);\n}\nexports.warning = warning;\n/**\n * Adds a notice issue\n * @param message notice issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction notice(message, properties = {}) {\n command_1.issueCommand('notice', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);\n}\nexports.notice = notice;\n/**\n * Writes info to log with console.log.\n * @param message info message\n */\nfunction info(message) {\n process.stdout.write(message + os.EOL);\n}\nexports.info = info;\n/**\n * Begin an output group.\n *\n * Output until the next `groupEnd` will be foldable in this group\n *\n * @param name The name of the output group\n */\nfunction startGroup(name) {\n command_1.issue('group', name);\n}\nexports.startGroup = startGroup;\n/**\n * End an output group.\n */\nfunction endGroup() {\n command_1.issue('endgroup');\n}\nexports.endGroup = endGroup;\n/**\n * Wrap an asynchronous function call in a group.\n *\n * Returns the same type as the function itself.\n *\n * @param name The name of the group\n * @param fn The function to wrap in the group\n */\nfunction group(name, fn) {\n return __awaiter(this, void 0, void 0, function* () {\n startGroup(name);\n let result;\n try {\n result = yield fn();\n }\n finally {\n endGroup();\n }\n return result;\n });\n}\nexports.group = group;\n//-----------------------------------------------------------------------\n// Wrapper action state\n//-----------------------------------------------------------------------\n/**\n * Saves state for current action, the state can only be retrieved by this action's post job execution.\n *\n * @param name name of the state to store\n * @param value value to store. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction saveState(name, value) {\n const filePath = process.env['GITHUB_STATE'] || '';\n if (filePath) {\n return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));\n }\n command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));\n}\nexports.saveState = saveState;\n/**\n * Gets the value of an state set by this action's main execution.\n *\n * @param name name of the state to get\n * @returns string\n */\nfunction getState(name) {\n return process.env[`STATE_${name}`] || '';\n}\nexports.getState = getState;\nfunction getIDToken(aud) {\n return __awaiter(this, void 0, void 0, function* () {\n return yield oidc_utils_1.OidcClient.getIDToken(aud);\n });\n}\nexports.getIDToken = getIDToken;\n/**\n * Summary exports\n */\nvar summary_1 = __webpack_require__(7410);\nObject.defineProperty(exports, \"summary\", ({ enumerable: true, get: function () { return summary_1.summary; } }));\n/**\n * @deprecated use core.summary\n */\nvar summary_2 = __webpack_require__(7410);\nObject.defineProperty(exports, \"markdownSummary\", ({ enumerable: true, get: function () { return summary_2.markdownSummary; } }));\n/**\n * Path exports\n */\nvar path_utils_1 = __webpack_require__(6340);\nObject.defineProperty(exports, \"toPosixPath\", ({ enumerable: true, get: function () { return path_utils_1.toPosixPath; } }));\nObject.defineProperty(exports, \"toWin32Path\", ({ enumerable: true, get: function () { return path_utils_1.toWin32Path; } }));\nObject.defineProperty(exports, \"toPlatformPath\", ({ enumerable: true, get: function () { return path_utils_1.toPlatformPath; } }));\n//# sourceMappingURL=core.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QztBQUMvSDtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsbUJBQU8sQ0FBQyxJQUFjO0FBQ3pDLCtDQUE4QyxFQUFFLHFDQUFxQyxvQ0FBb0MsRUFBQztBQUMxSCwrQ0FBOEMsRUFBRSxxQ0FBcUMsb0NBQW9DLEVBQUM7QUFDMUgsa0RBQWlELEVBQUUscUNBQXFDLHVDQUF1QyxFQUFDO0FBQ2hJIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvY29yZS9saWIvY29yZS5qcz84ZmZkIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRJRFRva2VuID0gZXhwb3J0cy5nZXRTdGF0ZSA9IGV4cG9ydHMuc2F2ZVN0YXRlID0gZXhwb3J0cy5ncm91cCA9IGV4cG9ydHMuZW5kR3JvdXAgPSBleHBvcnRzLnN0YXJ0R3JvdXAgPSBleHBvcnRzLmluZm8gPSBleHBvcnRzLm5vdGljZSA9IGV4cG9ydHMud2FybmluZyA9IGV4cG9ydHMuZXJyb3IgPSBleHBvcnRzLmRlYnVnID0gZXhwb3J0cy5pc0RlYnVnID0gZXhwb3J0cy5zZXRGYWlsZWQgPSBleHBvcnRzLnNldENvbW1hbmRFY2hvID0gZXhwb3J0cy5zZXRPdXRwdXQgPSBleHBvcnRzLmdldEJvb2xlYW5JbnB1dCA9IGV4cG9ydHMuZ2V0TXVsdGlsaW5lSW5wdXQgPSBleHBvcnRzLmdldElucHV0ID0gZXhwb3J0cy5hZGRQYXRoID0gZXhwb3J0cy5zZXRTZWNyZXQgPSBleHBvcnRzLmV4cG9ydFZhcmlhYmxlID0gZXhwb3J0cy5FeGl0Q29kZSA9IHZvaWQgMDtcbmNvbnN0IGNvbW1hbmRfMSA9IHJlcXVpcmUoXCIuL2NvbW1hbmRcIik7XG5jb25zdCBmaWxlX2NvbW1hbmRfMSA9IHJlcXVpcmUoXCIuL2ZpbGUtY29tbWFuZFwiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbmNvbnN0IG9zID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJvc1wiKSk7XG5jb25zdCBwYXRoID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJwYXRoXCIpKTtcbmNvbnN0IG9pZGNfdXRpbHNfMSA9IHJlcXVpcmUoXCIuL29pZGMtdXRpbHNcIik7XG4vKipcbiAqIFRoZSBjb2RlIHRvIGV4aXQgYW4gYWN0aW9uXG4gKi9cbnZhciBFeGl0Q29kZTtcbihmdW5jdGlvbiAoRXhpdENvZGUpIHtcbiAgICAvKipcbiAgICAgKiBBIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBhY3Rpb24gd2FzIHN1Y2Nlc3NmdWxcbiAgICAgKi9cbiAgICBFeGl0Q29kZVtFeGl0Q29kZVtcIlN1Y2Nlc3NcIl0gPSAwXSA9IFwiU3VjY2Vzc1wiO1xuICAgIC8qKlxuICAgICAqIEEgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGFjdGlvbiB3YXMgYSBmYWlsdXJlXG4gICAgICovXG4gICAgRXhpdENvZGVbRXhpdENvZGVbXCJGYWlsdXJlXCJdID0gMV0gPSBcIkZhaWx1cmVcIjtcbn0pKEV4aXRDb2RlID0gZXhwb3J0cy5FeGl0Q29kZSB8fCAoZXhwb3J0cy5FeGl0Q29kZSA9IHt9KSk7XG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBWYXJpYWJsZXNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8qKlxuICogU2V0cyBlbnYgdmFyaWFibGUgZm9yIHRoaXMgYWN0aW9uIGFuZCBmdXR1cmUgYWN0aW9ucyBpbiB0aGUgam9iXG4gKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gc2V0XG4gKiBAcGFyYW0gdmFsIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUuIE5vbi1zdHJpbmcgdmFsdWVzIHdpbGwgYmUgY29udmVydGVkIHRvIGEgc3RyaW5nIHZpYSBKU09OLnN0cmluZ2lmeVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gZXhwb3J0VmFyaWFibGUobmFtZSwgdmFsKSB7XG4gICAgY29uc3QgY29udmVydGVkVmFsID0gdXRpbHNfMS50b0NvbW1hbmRWYWx1ZSh2YWwpO1xuICAgIHByb2Nlc3MuZW52W25hbWVdID0gY29udmVydGVkVmFsO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9FTlYnXSB8fCAnJztcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGZpbGVfY29tbWFuZF8xLmlzc3VlRmlsZUNvbW1hbmQoJ0VOVicsIGZpbGVfY29tbWFuZF8xLnByZXBhcmVLZXlWYWx1ZU1lc3NhZ2UobmFtZSwgdmFsKSk7XG4gICAgfVxuICAgIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQoJ3NldC1lbnYnLCB7IG5hbWUgfSwgY29udmVydGVkVmFsKTtcbn1cbmV4cG9ydHMuZXhwb3J0VmFyaWFibGUgPSBleHBvcnRWYXJpYWJsZTtcbi8qKlxuICogUmVnaXN0ZXJzIGEgc2VjcmV0IHdoaWNoIHdpbGwgZ2V0IG1hc2tlZCBmcm9tIGxvZ3NcbiAqIEBwYXJhbSBzZWNyZXQgdmFsdWUgb2YgdGhlIHNlY3JldFxuICovXG5mdW5jdGlvbiBzZXRTZWNyZXQoc2VjcmV0KSB7XG4gICAgY29tbWFuZF8xLmlzc3VlQ29tbWFuZCgnYWRkLW1hc2snLCB7fSwgc2VjcmV0KTtcbn1cbmV4cG9ydHMuc2V0U2VjcmV0ID0gc2V0U2VjcmV0O1xuLyoqXG4gKiBQcmVwZW5kcyBpbnB1dFBhdGggdG8gdGhlIFBBVEggKGZvciB0aGlzIGFjdGlvbiBhbmQgZnV0dXJlIGFjdGlvbnMpXG4gKiBAcGFyYW0gaW5wdXRQYXRoXG4gKi9cbmZ1bmN0aW9uIGFkZFBhdGgoaW5wdXRQYXRoKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwcm9jZXNzLmVudlsnR0lUSFVCX1BBVEgnXSB8fCAnJztcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgZmlsZV9jb21tYW5kXzEuaXNzdWVGaWxlQ29tbWFuZCgnUEFUSCcsIGlucHV0UGF0aCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb21tYW5kXzEuaXNzdWVDb21tYW5kKCdhZGQtcGF0aCcsIHt9LCBpbnB1dFBhdGgpO1xuICAgIH1cbiAgICBwcm9jZXNzLmVudlsnUEFUSCddID0gYCR7aW5wdXRQYXRofSR7cGF0aC5kZWxpbWl0ZXJ9JHtwcm9jZXNzLmVudlsnUEFUSCddfWA7XG59XG5leHBvcnRzLmFkZFBhdGggPSBhZGRQYXRoO1xuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBvZiBhbiBpbnB1dC5cbiAqIFVubGVzcyB0cmltV2hpdGVzcGFjZSBpcyBzZXQgdG8gZmFsc2UgaW4gSW5wdXRPcHRpb25zLCB0aGUgdmFsdWUgaXMgYWxzbyB0cmltbWVkLlxuICogUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIHZhbHVlIGlzIG5vdCBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSAgICAgbmFtZSAgICAgbmFtZSBvZiB0aGUgaW5wdXQgdG8gZ2V0XG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgIG9wdGlvbmFsLiBTZWUgSW5wdXRPcHRpb25zLlxuICogQHJldHVybnMgICBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0SW5wdXQobmFtZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHZhbCA9IHByb2Nlc3MuZW52W2BJTlBVVF8ke25hbWUucmVwbGFjZSgvIC9nLCAnXycpLnRvVXBwZXJDYXNlKCl9YF0gfHwgJyc7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZXF1aXJlZCAmJiAhdmFsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgcmVxdWlyZWQgYW5kIG5vdCBzdXBwbGllZDogJHtuYW1lfWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRyaW1XaGl0ZXNwYWNlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gdmFsLnRyaW0oKTtcbn1cbmV4cG9ydHMuZ2V0SW5wdXQgPSBnZXRJbnB1dDtcbi8qKlxuICogR2V0cyB0aGUgdmFsdWVzIG9mIGFuIG11bHRpbGluZSBpbnB1dC4gIEVhY2ggdmFsdWUgaXMgYWxzbyB0cmltbWVkLlxuICpcbiAqIEBwYXJhbSAgICAgbmFtZSAgICAgbmFtZSBvZiB0aGUgaW5wdXQgdG8gZ2V0XG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgIG9wdGlvbmFsLiBTZWUgSW5wdXRPcHRpb25zLlxuICogQHJldHVybnMgICBzdHJpbmdbXVxuICpcbiAqL1xuZnVuY3Rpb24gZ2V0TXVsdGlsaW5lSW5wdXQobmFtZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGlucHV0cyA9IGdldElucHV0KG5hbWUsIG9wdGlvbnMpXG4gICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgLmZpbHRlcih4ID0+IHggIT09ICcnKTtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRyaW1XaGl0ZXNwYWNlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gaW5wdXRzO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRzLm1hcChpbnB1dCA9PiBpbnB1dC50cmltKCkpO1xufVxuZXhwb3J0cy5nZXRNdWx0aWxpbmVJbnB1dCA9IGdldE11bHRpbGluZUlucHV0O1xuLyoqXG4gKiBHZXRzIHRoZSBpbnB1dCB2YWx1ZSBvZiB0aGUgYm9vbGVhbiB0eXBlIGluIHRoZSBZQU1MIDEuMiBcImNvcmUgc2NoZW1hXCIgc3BlY2lmaWNhdGlvbi5cbiAqIFN1cHBvcnQgYm9vbGVhbiBpbnB1dCBsaXN0OiBgdHJ1ZSB8IFRydWUgfCBUUlVFIHwgZmFsc2UgfCBGYWxzZSB8IEZBTFNFYCAuXG4gKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGFsc28gaW4gYm9vbGVhbiB0eXBlLlxuICogcmVmOiBodHRwczovL3lhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI4MDQ5MjNcbiAqXG4gKiBAcGFyYW0gICAgIG5hbWUgICAgIG5hbWUgb2YgdGhlIGlucHV0IHRvIGdldFxuICogQHBhcmFtICAgICBvcHRpb25zICBvcHRpb25hbC4gU2VlIElucHV0T3B0aW9ucy5cbiAqIEByZXR1cm5zICAgYm9vbGVhblxuICovXG5mdW5jdGlvbiBnZXRCb29sZWFuSW5wdXQobmFtZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHRydWVWYWx1ZSA9IFsndHJ1ZScsICdUcnVlJywgJ1RSVUUnXTtcbiAgICBjb25zdCBmYWxzZVZhbHVlID0gWydmYWxzZScsICdGYWxzZScsICdGQUxTRSddO1xuICAgIGNvbnN0IHZhbCA9IGdldElucHV0KG5hbWUsIG9wdGlvbnMpO1xuICAgIGlmICh0cnVlVmFsdWUuaW5jbHVkZXModmFsKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKGZhbHNlVmFsdWUuaW5jbHVkZXModmFsKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYElucHV0IGRvZXMgbm90IG1lZXQgWUFNTCAxLjIgXCJDb3JlIFNjaGVtYVwiIHNwZWNpZmljYXRpb246ICR7bmFtZX1cXG5gICtcbiAgICAgICAgYFN1cHBvcnQgYm9vbGVhbiBpbnB1dCBsaXN0OiBcXGB0cnVlIHwgVHJ1ZSB8IFRSVUUgfCBmYWxzZSB8IEZhbHNlIHwgRkFMU0VcXGBgKTtcbn1cbmV4cG9ydHMuZ2V0Qm9vbGVhbklucHV0ID0gZ2V0Qm9vbGVhbklucHV0O1xuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBvZiBhbiBvdXRwdXQuXG4gKlxuICogQHBhcmFtICAgICBuYW1lICAgICBuYW1lIG9mIHRoZSBvdXRwdXQgdG8gc2V0XG4gKiBAcGFyYW0gICAgIHZhbHVlICAgIHZhbHVlIHRvIHN0b3JlLiBOb24tc3RyaW5nIHZhbHVlcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHN0cmluZyB2aWEgSlNPTi5zdHJpbmdpZnlcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmZ1bmN0aW9uIHNldE91dHB1dChuYW1lLCB2YWx1ZSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9PVVRQVVQnXSB8fCAnJztcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGZpbGVfY29tbWFuZF8xLmlzc3VlRmlsZUNvbW1hbmQoJ09VVFBVVCcsIGZpbGVfY29tbWFuZF8xLnByZXBhcmVLZXlWYWx1ZU1lc3NhZ2UobmFtZSwgdmFsdWUpKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3MuRU9MKTtcbiAgICBjb21tYW5kXzEuaXNzdWVDb21tYW5kKCdzZXQtb3V0cHV0JywgeyBuYW1lIH0sIHV0aWxzXzEudG9Db21tYW5kVmFsdWUodmFsdWUpKTtcbn1cbmV4cG9ydHMuc2V0T3V0cHV0ID0gc2V0T3V0cHV0O1xuLyoqXG4gKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBlY2hvaW5nIG9mIGNvbW1hbmRzIGludG8gc3Rkb3V0IGZvciB0aGUgcmVzdCBvZiB0aGUgc3RlcC5cbiAqIEVjaG9pbmcgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBpZiBBQ1RJT05TX1NURVBfREVCVUcgaXMgbm90IHNldC5cbiAqXG4gKi9cbmZ1bmN0aW9uIHNldENvbW1hbmRFY2hvKGVuYWJsZWQpIHtcbiAgICBjb21tYW5kXzEuaXNzdWUoJ2VjaG8nLCBlbmFibGVkID8gJ29uJyA6ICdvZmYnKTtcbn1cbmV4cG9ydHMuc2V0Q29tbWFuZEVjaG8gPSBzZXRDb21tYW5kRWNobztcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlc3VsdHNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8qKlxuICogU2V0cyB0aGUgYWN0aW9uIHN0YXR1cyB0byBmYWlsZWQuXG4gKiBXaGVuIHRoZSBhY3Rpb24gZXhpdHMgaXQgd2lsbCBiZSB3aXRoIGFuIGV4aXQgY29kZSBvZiAxXG4gKiBAcGFyYW0gbWVzc2FnZSBhZGQgZXJyb3IgaXNzdWUgbWVzc2FnZVxuICovXG5mdW5jdGlvbiBzZXRGYWlsZWQobWVzc2FnZSkge1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSBFeGl0Q29kZS5GYWlsdXJlO1xuICAgIGVycm9yKG1lc3NhZ2UpO1xufVxuZXhwb3J0cy5zZXRGYWlsZWQgPSBzZXRGYWlsZWQ7XG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMb2dnaW5nIENvbW1hbmRzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vKipcbiAqIEdldHMgd2hldGhlciBBY3Rpb25zIFN0ZXAgRGVidWcgaXMgb24gb3Igbm90XG4gKi9cbmZ1bmN0aW9uIGlzRGVidWcoKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52WydSVU5ORVJfREVCVUcnXSA9PT0gJzEnO1xufVxuZXhwb3J0cy5pc0RlYnVnID0gaXNEZWJ1Zztcbi8qKlxuICogV3JpdGVzIGRlYnVnIG1lc3NhZ2UgdG8gdXNlciBsb2dcbiAqIEBwYXJhbSBtZXNzYWdlIGRlYnVnIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gZGVidWcobWVzc2FnZSkge1xuICAgIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQoJ2RlYnVnJywge30sIG1lc3NhZ2UpO1xufVxuZXhwb3J0cy5kZWJ1ZyA9IGRlYnVnO1xuLyoqXG4gKiBBZGRzIGFuIGVycm9yIGlzc3VlXG4gKiBAcGFyYW0gbWVzc2FnZSBlcnJvciBpc3N1ZSBtZXNzYWdlLiBFcnJvcnMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gc3RyaW5nIHZpYSB0b1N0cmluZygpXG4gKiBAcGFyYW0gcHJvcGVydGllcyBvcHRpb25hbCBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgYW5ub3RhdGlvbi5cbiAqL1xuZnVuY3Rpb24gZXJyb3IobWVzc2FnZSwgcHJvcGVydGllcyA9IHt9KSB7XG4gICAgY29tbWFuZF8xLmlzc3VlQ29tbWFuZCgnZXJyb3InLCB1dGlsc18xLnRvQ29tbWFuZFByb3BlcnRpZXMocHJvcGVydGllcyksIG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvciA/IG1lc3NhZ2UudG9TdHJpbmcoKSA6IG1lc3NhZ2UpO1xufVxuZXhwb3J0cy5lcnJvciA9IGVycm9yO1xuLyoqXG4gKiBBZGRzIGEgd2FybmluZyBpc3N1ZVxuICogQHBhcmFtIG1lc3NhZ2Ugd2FybmluZyBpc3N1ZSBtZXNzYWdlLiBFcnJvcnMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gc3RyaW5nIHZpYSB0b1N0cmluZygpXG4gKiBAcGFyYW0gcHJvcGVydGllcyBvcHRpb25hbCBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgYW5ub3RhdGlvbi5cbiAqL1xuZnVuY3Rpb24gd2FybmluZyhtZXNzYWdlLCBwcm9wZXJ0aWVzID0ge30pIHtcbiAgICBjb21tYW5kXzEuaXNzdWVDb21tYW5kKCd3YXJuaW5nJywgdXRpbHNfMS50b0NvbW1hbmRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpLCBtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IgPyBtZXNzYWdlLnRvU3RyaW5nKCkgOiBtZXNzYWdlKTtcbn1cbmV4cG9ydHMud2FybmluZyA9IHdhcm5pbmc7XG4vKipcbiAqIEFkZHMgYSBub3RpY2UgaXNzdWVcbiAqIEBwYXJhbSBtZXNzYWdlIG5vdGljZSBpc3N1ZSBtZXNzYWdlLiBFcnJvcnMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gc3RyaW5nIHZpYSB0b1N0cmluZygpXG4gKiBAcGFyYW0gcHJvcGVydGllcyBvcHRpb25hbCBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgYW5ub3RhdGlvbi5cbiAqL1xuZnVuY3Rpb24gbm90aWNlKG1lc3NhZ2UsIHByb3BlcnRpZXMgPSB7fSkge1xuICAgIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQoJ25vdGljZScsIHV0aWxzXzEudG9Db21tYW5kUHJvcGVydGllcyhwcm9wZXJ0aWVzKSwgbWVzc2FnZSBpbnN0YW5jZW9mIEVycm9yID8gbWVzc2FnZS50b1N0cmluZygpIDogbWVzc2FnZSk7XG59XG5leHBvcnRzLm5vdGljZSA9IG5vdGljZTtcbi8qKlxuICogV3JpdGVzIGluZm8gdG8gbG9nIHdpdGggY29uc29sZS5sb2cuXG4gKiBAcGFyYW0gbWVzc2FnZSBpbmZvIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gaW5mbyhtZXNzYWdlKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUobWVzc2FnZSArIG9zLkVPTCk7XG59XG5leHBvcnRzLmluZm8gPSBpbmZvO1xuLyoqXG4gKiBCZWdpbiBhbiBvdXRwdXQgZ3JvdXAuXG4gKlxuICogT3V0cHV0IHVudGlsIHRoZSBuZXh0IGBncm91cEVuZGAgd2lsbCBiZSBmb2xkYWJsZSBpbiB0aGlzIGdyb3VwXG4gKlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIG91dHB1dCBncm91cFxuICovXG5mdW5jdGlvbiBzdGFydEdyb3VwKG5hbWUpIHtcbiAgICBjb21tYW5kXzEuaXNzdWUoJ2dyb3VwJywgbmFtZSk7XG59XG5leHBvcnRzLnN0YXJ0R3JvdXAgPSBzdGFydEdyb3VwO1xuLyoqXG4gKiBFbmQgYW4gb3V0cHV0IGdyb3VwLlxuICovXG5mdW5jdGlvbiBlbmRHcm91cCgpIHtcbiAgICBjb21tYW5kXzEuaXNzdWUoJ2VuZGdyb3VwJyk7XG59XG5leHBvcnRzLmVuZEdyb3VwID0gZW5kR3JvdXA7XG4vKipcbiAqIFdyYXAgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIGNhbGwgaW4gYSBncm91cC5cbiAqXG4gKiBSZXR1cm5zIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGZ1bmN0aW9uIGl0c2VsZi5cbiAqXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZ3JvdXBcbiAqIEBwYXJhbSBmbiBUaGUgZnVuY3Rpb24gdG8gd3JhcCBpbiB0aGUgZ3JvdXBcbiAqL1xuZnVuY3Rpb24gZ3JvdXAobmFtZSwgZm4pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBzdGFydEdyb3VwKG5hbWUpO1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0geWllbGQgZm4oKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGVuZEdyb3VwKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ3JvdXAgPSBncm91cDtcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFdyYXBwZXIgYWN0aW9uIHN0YXRlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vKipcbiAqIFNhdmVzIHN0YXRlIGZvciBjdXJyZW50IGFjdGlvbiwgdGhlIHN0YXRlIGNhbiBvbmx5IGJlIHJldHJpZXZlZCBieSB0aGlzIGFjdGlvbidzIHBvc3Qgam9iIGV4ZWN1dGlvbi5cbiAqXG4gKiBAcGFyYW0gICAgIG5hbWUgICAgIG5hbWUgb2YgdGhlIHN0YXRlIHRvIHN0b3JlXG4gKiBAcGFyYW0gICAgIHZhbHVlICAgIHZhbHVlIHRvIHN0b3JlLiBOb24tc3RyaW5nIHZhbHVlcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHN0cmluZyB2aWEgSlNPTi5zdHJpbmdpZnlcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmZ1bmN0aW9uIHNhdmVTdGF0ZShuYW1lLCB2YWx1ZSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9TVEFURSddIHx8ICcnO1xuICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICByZXR1cm4gZmlsZV9jb21tYW5kXzEuaXNzdWVGaWxlQ29tbWFuZCgnU1RBVEUnLCBmaWxlX2NvbW1hbmRfMS5wcmVwYXJlS2V5VmFsdWVNZXNzYWdlKG5hbWUsIHZhbHVlKSk7XG4gICAgfVxuICAgIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQoJ3NhdmUtc3RhdGUnLCB7IG5hbWUgfSwgdXRpbHNfMS50b0NvbW1hbmRWYWx1ZSh2YWx1ZSkpO1xufVxuZXhwb3J0cy5zYXZlU3RhdGUgPSBzYXZlU3RhdGU7XG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIG9mIGFuIHN0YXRlIHNldCBieSB0aGlzIGFjdGlvbidzIG1haW4gZXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSAgICAgbmFtZSAgICAgbmFtZSBvZiB0aGUgc3RhdGUgdG8gZ2V0XG4gKiBAcmV0dXJucyAgIHN0cmluZ1xuICovXG5mdW5jdGlvbiBnZXRTdGF0ZShuYW1lKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52W2BTVEFURV8ke25hbWV9YF0gfHwgJyc7XG59XG5leHBvcnRzLmdldFN0YXRlID0gZ2V0U3RhdGU7XG5mdW5jdGlvbiBnZXRJRFRva2VuKGF1ZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHJldHVybiB5aWVsZCBvaWRjX3V0aWxzXzEuT2lkY0NsaWVudC5nZXRJRFRva2VuKGF1ZCk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldElEVG9rZW4gPSBnZXRJRFRva2VuO1xuLyoqXG4gKiBTdW1tYXJ5IGV4cG9ydHNcbiAqL1xudmFyIHN1bW1hcnlfMSA9IHJlcXVpcmUoXCIuL3N1bW1hcnlcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzdW1tYXJ5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBzdW1tYXJ5XzEuc3VtbWFyeTsgfSB9KTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIGNvcmUuc3VtbWFyeVxuICovXG52YXIgc3VtbWFyeV8yID0gcmVxdWlyZShcIi4vc3VtbWFyeVwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIm1hcmtkb3duU3VtbWFyeVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc3VtbWFyeV8yLm1hcmtkb3duU3VtbWFyeTsgfSB9KTtcbi8qKlxuICogUGF0aCBleHBvcnRzXG4gKi9cbnZhciBwYXRoX3V0aWxzXzEgPSByZXF1aXJlKFwiLi9wYXRoLXV0aWxzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidG9Qb3NpeFBhdGhcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBhdGhfdXRpbHNfMS50b1Bvc2l4UGF0aDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInRvV2luMzJQYXRoXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBwYXRoX3V0aWxzXzEudG9XaW4zMlBhdGg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ0b1BsYXRmb3JtUGF0aFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcGF0aF91dGlsc18xLnRvUGxhdGZvcm1QYXRoOyB9IH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29yZS5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2225\n")},3108:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\n// For internal use, subject to change.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.prepareKeyValueMessage = exports.issueFileCommand = void 0;\n// We use any as a valid input type\n/* eslint-disable @typescript-eslint/no-explicit-any */\nconst fs = __importStar(__webpack_require__(7147));\nconst os = __importStar(__webpack_require__(2037));\nconst uuid_1 = __webpack_require__(5693);\nconst utils_1 = __webpack_require__(4570);\nfunction issueFileCommand(command, message) {\n const filePath = process.env[`GITHUB_${command}`];\n if (!filePath) {\n throw new Error(`Unable to find environment variable for file command ${command}`);\n }\n if (!fs.existsSync(filePath)) {\n throw new Error(`Missing file at path: ${filePath}`);\n }\n fs.appendFileSync(filePath, `${utils_1.toCommandValue(message)}${os.EOL}`, {\n encoding: \'utf8\'\n });\n}\nexports.issueFileCommand = issueFileCommand;\nfunction prepareKeyValueMessage(key, value) {\n const delimiter = `ghadelimiter_${uuid_1.v4()}`;\n const convertedValue = utils_1.toCommandValue(value);\n // These should realistically never happen, but just in case someone finds a\n // way to exploit uuid generation let\'s not allow keys or values that contain\n // the delimiter.\n if (key.includes(delimiter)) {\n throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);\n }\n if (convertedValue.includes(delimiter)) {\n throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);\n }\n return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;\n}\nexports.prepareKeyValueMessage = prepareKeyValueMessage;\n//# sourceMappingURL=file-command.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzEwOC5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxvQ0FBb0MsZ0JBQWdCO0FBQ3ZGLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsMENBQTBDLDRCQUE0QjtBQUN0RSxDQUFDO0FBQ0Q7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsOEJBQThCLEdBQUcsd0JBQXdCO0FBQ3pEO0FBQ0E7QUFDQSx3QkFBd0IsbUJBQU8sQ0FBQyxJQUFJO0FBQ3BDLHdCQUF3QixtQkFBTyxDQUFDLElBQUk7QUFDcEMsZUFBZSxtQkFBTyxDQUFDLElBQU07QUFDN0IsZ0JBQWdCLG1CQUFPLENBQUMsSUFBUztBQUNqQztBQUNBLDJDQUEyQyxRQUFRO0FBQ25EO0FBQ0EsZ0ZBQWdGLFFBQVE7QUFDeEY7QUFDQTtBQUNBLGlEQUFpRCxTQUFTO0FBQzFEO0FBQ0EsbUNBQW1DLGdDQUFnQyxFQUFFLE9BQU87QUFDNUU7QUFDQSxLQUFLO0FBQ0w7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQSxzQ0FBc0MsWUFBWTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0ZBQW9GLFVBQVU7QUFDOUY7QUFDQTtBQUNBLHFGQUFxRixVQUFVO0FBQy9GO0FBQ0EsY0FBYyxJQUFJLElBQUksVUFBVSxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFVBQVU7QUFDL0U7QUFDQSw4QkFBOEI7QUFDOUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9jb3JlL2xpYi9maWxlLWNvbW1hbmQuanM/YTY3MiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbi8vIEZvciBpbnRlcm5hbCB1c2UsIHN1YmplY3QgdG8gY2hhbmdlLlxudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucHJlcGFyZUtleVZhbHVlTWVzc2FnZSA9IGV4cG9ydHMuaXNzdWVGaWxlQ29tbWFuZCA9IHZvaWQgMDtcbi8vIFdlIHVzZSBhbnkgYXMgYSB2YWxpZCBpbnB1dCB0eXBlXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5jb25zdCBmcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiZnNcIikpO1xuY29uc3Qgb3MgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIm9zXCIpKTtcbmNvbnN0IHV1aWRfMSA9IHJlcXVpcmUoXCJ1dWlkXCIpO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuZnVuY3Rpb24gaXNzdWVGaWxlQ29tbWFuZChjb21tYW5kLCBtZXNzYWdlKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwcm9jZXNzLmVudltgR0lUSFVCXyR7Y29tbWFuZH1gXTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGZpbmQgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIGZpbGUgY29tbWFuZCAke2NvbW1hbmR9YCk7XG4gICAgfVxuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGZpbGUgYXQgcGF0aDogJHtmaWxlUGF0aH1gKTtcbiAgICB9XG4gICAgZnMuYXBwZW5kRmlsZVN5bmMoZmlsZVBhdGgsIGAke3V0aWxzXzEudG9Db21tYW5kVmFsdWUobWVzc2FnZSl9JHtvcy5FT0x9YCwge1xuICAgICAgICBlbmNvZGluZzogJ3V0ZjgnXG4gICAgfSk7XG59XG5leHBvcnRzLmlzc3VlRmlsZUNvbW1hbmQgPSBpc3N1ZUZpbGVDb21tYW5kO1xuZnVuY3Rpb24gcHJlcGFyZUtleVZhbHVlTWVzc2FnZShrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgZGVsaW1pdGVyID0gYGdoYWRlbGltaXRlcl8ke3V1aWRfMS52NCgpfWA7XG4gICAgY29uc3QgY29udmVydGVkVmFsdWUgPSB1dGlsc18xLnRvQ29tbWFuZFZhbHVlKHZhbHVlKTtcbiAgICAvLyBUaGVzZSBzaG91bGQgcmVhbGlzdGljYWxseSBuZXZlciBoYXBwZW4sIGJ1dCBqdXN0IGluIGNhc2Ugc29tZW9uZSBmaW5kcyBhXG4gICAgLy8gd2F5IHRvIGV4cGxvaXQgdXVpZCBnZW5lcmF0aW9uIGxldCdzIG5vdCBhbGxvdyBrZXlzIG9yIHZhbHVlcyB0aGF0IGNvbnRhaW5cbiAgICAvLyB0aGUgZGVsaW1pdGVyLlxuICAgIGlmIChrZXkuaW5jbHVkZXMoZGVsaW1pdGVyKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgaW5wdXQ6IG5hbWUgc2hvdWxkIG5vdCBjb250YWluIHRoZSBkZWxpbWl0ZXIgXCIke2RlbGltaXRlcn1cImApO1xuICAgIH1cbiAgICBpZiAoY29udmVydGVkVmFsdWUuaW5jbHVkZXMoZGVsaW1pdGVyKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgaW5wdXQ6IHZhbHVlIHNob3VsZCBub3QgY29udGFpbiB0aGUgZGVsaW1pdGVyIFwiJHtkZWxpbWl0ZXJ9XCJgKTtcbiAgICB9XG4gICAgcmV0dXJuIGAke2tleX08PCR7ZGVsaW1pdGVyfSR7b3MuRU9MfSR7Y29udmVydGVkVmFsdWV9JHtvcy5FT0x9JHtkZWxpbWl0ZXJ9YDtcbn1cbmV4cG9ydHMucHJlcGFyZUtleVZhbHVlTWVzc2FnZSA9IHByZXBhcmVLZXlWYWx1ZU1lc3NhZ2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWxlLWNvbW1hbmQuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3108\n')},1526:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.OidcClient = void 0;\nconst http_client_1 = __webpack_require__(4635);\nconst auth_1 = __webpack_require__(2429);\nconst core_1 = __webpack_require__(2225);\nclass OidcClient {\n static createHttpClient(allowRetry = true, maxRetry = 10) {\n const requestOptions = {\n allowRetries: allowRetry,\n maxRetries: maxRetry\n };\n return new http_client_1.HttpClient('actions/oidc-client', [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions);\n }\n static getRequestToken() {\n const token = process.env['ACTIONS_ID_TOKEN_REQUEST_TOKEN'];\n if (!token) {\n throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable');\n }\n return token;\n }\n static getIDTokenUrl() {\n const runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL'];\n if (!runtimeUrl) {\n throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable');\n }\n return runtimeUrl;\n }\n static getCall(id_token_url) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const httpclient = OidcClient.createHttpClient();\n const res = yield httpclient\n .getJson(id_token_url)\n .catch(error => {\n throw new Error(`Failed to get ID Token. \\n \n Error Code : ${error.statusCode}\\n \n Error Message: ${error.message}`);\n });\n const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value;\n if (!id_token) {\n throw new Error('Response json body do not have ID Token field');\n }\n return id_token;\n });\n }\n static getIDToken(audience) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n // New ID Token is requested from action service\n let id_token_url = OidcClient.getIDTokenUrl();\n if (audience) {\n const encodedAudience = encodeURIComponent(audience);\n id_token_url = `${id_token_url}&audience=${encodedAudience}`;\n }\n core_1.debug(`ID token url is ${id_token_url}`);\n const id_token = yield OidcClient.getCall(id_token_url);\n core_1.setSecret(id_token);\n return id_token;\n }\n catch (error) {\n throw new Error(`Error message: ${error.message}`);\n }\n });\n }\n}\nexports.OidcClient = OidcClient;\n//# sourceMappingURL=oidc-utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUyNi5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0EsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0Qsa0JBQWtCO0FBQ2xCLHNCQUFzQixtQkFBTyxDQUFDLElBQXNCO0FBQ3BELGVBQWUsbUJBQU8sQ0FBQyxJQUErQjtBQUN0RCxlQUFlLG1CQUFPLENBQUMsSUFBUTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsaUJBQWlCO0FBQ3hDLHlCQUF5QixjQUFjO0FBQ3ZDLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsYUFBYSxZQUFZLGdCQUFnQjtBQUMvRTtBQUNBLGdEQUFnRCxhQUFhO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsY0FBYztBQUNoRTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvY29yZS9saWIvb2lkYy11dGlscy5qcz8zYmQ4Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk9pZGNDbGllbnQgPSB2b2lkIDA7XG5jb25zdCBodHRwX2NsaWVudF8xID0gcmVxdWlyZShcIkBhY3Rpb25zL2h0dHAtY2xpZW50XCIpO1xuY29uc3QgYXV0aF8xID0gcmVxdWlyZShcIkBhY3Rpb25zL2h0dHAtY2xpZW50L2xpYi9hdXRoXCIpO1xuY29uc3QgY29yZV8xID0gcmVxdWlyZShcIi4vY29yZVwiKTtcbmNsYXNzIE9pZGNDbGllbnQge1xuICAgIHN0YXRpYyBjcmVhdGVIdHRwQ2xpZW50KGFsbG93UmV0cnkgPSB0cnVlLCBtYXhSZXRyeSA9IDEwKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICAgICAgYWxsb3dSZXRyaWVzOiBhbGxvd1JldHJ5LFxuICAgICAgICAgICAgbWF4UmV0cmllczogbWF4UmV0cnlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwX2NsaWVudF8xLkh0dHBDbGllbnQoJ2FjdGlvbnMvb2lkYy1jbGllbnQnLCBbbmV3IGF1dGhfMS5CZWFyZXJDcmVkZW50aWFsSGFuZGxlcihPaWRjQ2xpZW50LmdldFJlcXVlc3RUb2tlbigpKV0sIHJlcXVlc3RPcHRpb25zKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFJlcXVlc3RUb2tlbigpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSBwcm9jZXNzLmVudlsnQUNUSU9OU19JRF9UT0tFTl9SRVFVRVNUX1RPS0VOJ107XG4gICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGdldCBBQ1RJT05TX0lEX1RPS0VOX1JFUVVFU1RfVE9LRU4gZW52IHZhcmlhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0SURUb2tlblVybCgpIHtcbiAgICAgICAgY29uc3QgcnVudGltZVVybCA9IHByb2Nlc3MuZW52WydBQ1RJT05TX0lEX1RPS0VOX1JFUVVFU1RfVVJMJ107XG4gICAgICAgIGlmICghcnVudGltZVVybCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZ2V0IEFDVElPTlNfSURfVE9LRU5fUkVRVUVTVF9VUkwgZW52IHZhcmlhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJ1bnRpbWVVcmw7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRDYWxsKGlkX3Rva2VuX3VybCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBodHRwY2xpZW50ID0gT2lkY0NsaWVudC5jcmVhdGVIdHRwQ2xpZW50KCk7XG4gICAgICAgICAgICBjb25zdCByZXMgPSB5aWVsZCBodHRwY2xpZW50XG4gICAgICAgICAgICAgICAgLmdldEpzb24oaWRfdG9rZW5fdXJsKVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZ2V0IElEIFRva2VuLiBcXG4gXG4gICAgICAgIEVycm9yIENvZGUgOiAke2Vycm9yLnN0YXR1c0NvZGV9XFxuIFxuICAgICAgICBFcnJvciBNZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGlkX3Rva2VuID0gKF9hID0gcmVzLnJlc3VsdCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlO1xuICAgICAgICAgICAgaWYgKCFpZF90b2tlbikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVzcG9uc2UganNvbiBib2R5IGRvIG5vdCBoYXZlIElEIFRva2VuIGZpZWxkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaWRfdG9rZW47XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0SURUb2tlbihhdWRpZW5jZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBOZXcgSUQgVG9rZW4gaXMgcmVxdWVzdGVkIGZyb20gYWN0aW9uIHNlcnZpY2VcbiAgICAgICAgICAgICAgICBsZXQgaWRfdG9rZW5fdXJsID0gT2lkY0NsaWVudC5nZXRJRFRva2VuVXJsKCk7XG4gICAgICAgICAgICAgICAgaWYgKGF1ZGllbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kZWRBdWRpZW5jZSA9IGVuY29kZVVSSUNvbXBvbmVudChhdWRpZW5jZSk7XG4gICAgICAgICAgICAgICAgICAgIGlkX3Rva2VuX3VybCA9IGAke2lkX3Rva2VuX3VybH0mYXVkaWVuY2U9JHtlbmNvZGVkQXVkaWVuY2V9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29yZV8xLmRlYnVnKGBJRCB0b2tlbiB1cmwgaXMgJHtpZF90b2tlbl91cmx9YCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRfdG9rZW4gPSB5aWVsZCBPaWRjQ2xpZW50LmdldENhbGwoaWRfdG9rZW5fdXJsKTtcbiAgICAgICAgICAgICAgICBjb3JlXzEuc2V0U2VjcmV0KGlkX3Rva2VuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWRfdG9rZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5PaWRjQ2xpZW50ID0gT2lkY0NsaWVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9pZGMtdXRpbHMuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1526\n")},6340:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = void 0;\nconst path = __importStar(__webpack_require__(1017));\n/**\n * toPosixPath converts the given path to the posix form. On Windows, \\\\ will be\n * replaced with /.\n *\n * @param pth. Path to transform.\n * @return string Posix path.\n */\nfunction toPosixPath(pth) {\n return pth.replace(/[\\\\]/g, \'/\');\n}\nexports.toPosixPath = toPosixPath;\n/**\n * toWin32Path converts the given path to the win32 form. On Linux, / will be\n * replaced with \\\\.\n *\n * @param pth. Path to transform.\n * @return string Win32 path.\n */\nfunction toWin32Path(pth) {\n return pth.replace(/[/]/g, \'\\\\\');\n}\nexports.toWin32Path = toWin32Path;\n/**\n * toPlatformPath converts the given path to a platform-specific path. It does\n * this by replacing instances of / and \\ with the platform-specific path\n * separator.\n *\n * @param pth The path to platformize.\n * @return string The platform-specific path.\n */\nfunction toPlatformPath(pth) {\n return pth.replace(/[/\\\\]/g, path.sep);\n}\nexports.toPlatformPath = toPlatformPath;\n//# sourceMappingURL=path-utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjM0MC5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQSxtQ0FBbUMsb0NBQW9DLGdCQUFnQjtBQUN2RixDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHNCQUFzQixHQUFHLG1CQUFtQixHQUFHLG1CQUFtQjtBQUNsRSwwQkFBMEIsbUJBQU8sQ0FBQyxJQUFNO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9jb3JlL2xpYi9wYXRoLXV0aWxzLmpzP2NmOTYiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy50b1BsYXRmb3JtUGF0aCA9IGV4cG9ydHMudG9XaW4zMlBhdGggPSBleHBvcnRzLnRvUG9zaXhQYXRoID0gdm9pZCAwO1xuY29uc3QgcGF0aCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwicGF0aFwiKSk7XG4vKipcbiAqIHRvUG9zaXhQYXRoIGNvbnZlcnRzIHRoZSBnaXZlbiBwYXRoIHRvIHRoZSBwb3NpeCBmb3JtLiBPbiBXaW5kb3dzLCBcXFxcIHdpbGwgYmVcbiAqIHJlcGxhY2VkIHdpdGggLy5cbiAqXG4gKiBAcGFyYW0gcHRoLiBQYXRoIHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4gc3RyaW5nIFBvc2l4IHBhdGguXG4gKi9cbmZ1bmN0aW9uIHRvUG9zaXhQYXRoKHB0aCkge1xuICAgIHJldHVybiBwdGgucmVwbGFjZSgvW1xcXFxdL2csICcvJyk7XG59XG5leHBvcnRzLnRvUG9zaXhQYXRoID0gdG9Qb3NpeFBhdGg7XG4vKipcbiAqIHRvV2luMzJQYXRoIGNvbnZlcnRzIHRoZSBnaXZlbiBwYXRoIHRvIHRoZSB3aW4zMiBmb3JtLiBPbiBMaW51eCwgLyB3aWxsIGJlXG4gKiByZXBsYWNlZCB3aXRoIFxcXFwuXG4gKlxuICogQHBhcmFtIHB0aC4gUGF0aCB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHN0cmluZyBXaW4zMiBwYXRoLlxuICovXG5mdW5jdGlvbiB0b1dpbjMyUGF0aChwdGgpIHtcbiAgICByZXR1cm4gcHRoLnJlcGxhY2UoL1svXS9nLCAnXFxcXCcpO1xufVxuZXhwb3J0cy50b1dpbjMyUGF0aCA9IHRvV2luMzJQYXRoO1xuLyoqXG4gKiB0b1BsYXRmb3JtUGF0aCBjb252ZXJ0cyB0aGUgZ2l2ZW4gcGF0aCB0byBhIHBsYXRmb3JtLXNwZWNpZmljIHBhdGguIEl0IGRvZXNcbiAqIHRoaXMgYnkgcmVwbGFjaW5nIGluc3RhbmNlcyBvZiAvIGFuZCBcXCB3aXRoIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoXG4gKiBzZXBhcmF0b3IuXG4gKlxuICogQHBhcmFtIHB0aCBUaGUgcGF0aCB0byBwbGF0Zm9ybWl6ZS5cbiAqIEByZXR1cm4gc3RyaW5nIFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoLlxuICovXG5mdW5jdGlvbiB0b1BsYXRmb3JtUGF0aChwdGgpIHtcbiAgICByZXR1cm4gcHRoLnJlcGxhY2UoL1svXFxcXF0vZywgcGF0aC5zZXApO1xufVxuZXhwb3J0cy50b1BsYXRmb3JtUGF0aCA9IHRvUGxhdGZvcm1QYXRoO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGF0aC11dGlscy5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6340\n')},7410:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.summary = exports.markdownSummary = exports.SUMMARY_DOCS_URL = exports.SUMMARY_ENV_VAR = void 0;\nconst os_1 = __webpack_require__(2037);\nconst fs_1 = __webpack_require__(7147);\nconst { access, appendFile, writeFile } = fs_1.promises;\nexports.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY';\nexports.SUMMARY_DOCS_URL = 'https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary';\nclass Summary {\n constructor() {\n this._buffer = '';\n }\n /**\n * Finds the summary file path from the environment, rejects if env var is not found or file does not exist\n * Also checks r/w permissions.\n *\n * @returns step summary file path\n */\n filePath() {\n return __awaiter(this, void 0, void 0, function* () {\n if (this._filePath) {\n return this._filePath;\n }\n const pathFromEnv = process.env[exports.SUMMARY_ENV_VAR];\n if (!pathFromEnv) {\n throw new Error(`Unable to find environment variable for $${exports.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`);\n }\n try {\n yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK);\n }\n catch (_a) {\n throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`);\n }\n this._filePath = pathFromEnv;\n return this._filePath;\n });\n }\n /**\n * Wraps content in an HTML tag, adding any HTML attributes\n *\n * @param {string} tag HTML tag to wrap\n * @param {string | null} content content within the tag\n * @param {[attribute: string]: string} attrs key-value list of HTML attributes to add\n *\n * @returns {string} content wrapped in HTML element\n */\n wrap(tag, content, attrs = {}) {\n const htmlAttrs = Object.entries(attrs)\n .map(([key, value]) => ` ${key}=\"${value}\"`)\n .join('');\n if (!content) {\n return `<${tag}${htmlAttrs}>`;\n }\n return `<${tag}${htmlAttrs}>${content}`;\n }\n /**\n * Writes text in the buffer to the summary buffer file and empties buffer. Will append by default.\n *\n * @param {SummaryWriteOptions} [options] (optional) options for write operation\n *\n * @returns {Promise} summary instance\n */\n write(options) {\n return __awaiter(this, void 0, void 0, function* () {\n const overwrite = !!(options === null || options === void 0 ? void 0 : options.overwrite);\n const filePath = yield this.filePath();\n const writeFunc = overwrite ? writeFile : appendFile;\n yield writeFunc(filePath, this._buffer, { encoding: 'utf8' });\n return this.emptyBuffer();\n });\n }\n /**\n * Clears the summary buffer and wipes the summary file\n *\n * @returns {Summary} summary instance\n */\n clear() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.emptyBuffer().write({ overwrite: true });\n });\n }\n /**\n * Returns the current summary buffer as a string\n *\n * @returns {string} string of summary buffer\n */\n stringify() {\n return this._buffer;\n }\n /**\n * If the summary buffer is empty\n *\n * @returns {boolen} true if the buffer is empty\n */\n isEmptyBuffer() {\n return this._buffer.length === 0;\n }\n /**\n * Resets the summary buffer without writing to summary file\n *\n * @returns {Summary} summary instance\n */\n emptyBuffer() {\n this._buffer = '';\n return this;\n }\n /**\n * Adds raw text to the summary buffer\n *\n * @param {string} text content to add\n * @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false)\n *\n * @returns {Summary} summary instance\n */\n addRaw(text, addEOL = false) {\n this._buffer += text;\n return addEOL ? this.addEOL() : this;\n }\n /**\n * Adds the operating system-specific end-of-line marker to the buffer\n *\n * @returns {Summary} summary instance\n */\n addEOL() {\n return this.addRaw(os_1.EOL);\n }\n /**\n * Adds an HTML codeblock to the summary buffer\n *\n * @param {string} code content to render within fenced code block\n * @param {string} lang (optional) language to syntax highlight code\n *\n * @returns {Summary} summary instance\n */\n addCodeBlock(code, lang) {\n const attrs = Object.assign({}, (lang && { lang }));\n const element = this.wrap('pre', this.wrap('code', code), attrs);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML list to the summary buffer\n *\n * @param {string[]} items list of items to render\n * @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false)\n *\n * @returns {Summary} summary instance\n */\n addList(items, ordered = false) {\n const tag = ordered ? 'ol' : 'ul';\n const listItems = items.map(item => this.wrap('li', item)).join('');\n const element = this.wrap(tag, listItems);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML table to the summary buffer\n *\n * @param {SummaryTableCell[]} rows table rows\n *\n * @returns {Summary} summary instance\n */\n addTable(rows) {\n const tableBody = rows\n .map(row => {\n const cells = row\n .map(cell => {\n if (typeof cell === 'string') {\n return this.wrap('td', cell);\n }\n const { header, data, colspan, rowspan } = cell;\n const tag = header ? 'th' : 'td';\n const attrs = Object.assign(Object.assign({}, (colspan && { colspan })), (rowspan && { rowspan }));\n return this.wrap(tag, data, attrs);\n })\n .join('');\n return this.wrap('tr', cells);\n })\n .join('');\n const element = this.wrap('table', tableBody);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds a collapsable HTML details element to the summary buffer\n *\n * @param {string} label text for the closed state\n * @param {string} content collapsable content\n *\n * @returns {Summary} summary instance\n */\n addDetails(label, content) {\n const element = this.wrap('details', this.wrap('summary', label) + content);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML image tag to the summary buffer\n *\n * @param {string} src path to the image you to embed\n * @param {string} alt text description of the image\n * @param {SummaryImageOptions} options (optional) addition image attributes\n *\n * @returns {Summary} summary instance\n */\n addImage(src, alt, options) {\n const { width, height } = options || {};\n const attrs = Object.assign(Object.assign({}, (width && { width })), (height && { height }));\n const element = this.wrap('img', null, Object.assign({ src, alt }, attrs));\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML section heading element\n *\n * @param {string} text heading text\n * @param {number | string} [level=1] (optional) the heading level, default: 1\n *\n * @returns {Summary} summary instance\n */\n addHeading(text, level) {\n const tag = `h${level}`;\n const allowedTag = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tag)\n ? tag\n : 'h1';\n const element = this.wrap(allowedTag, text);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML thematic break (
) to the summary buffer\n *\n * @returns {Summary} summary instance\n */\n addSeparator() {\n const element = this.wrap('hr', null);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML line break (
) to the summary buffer\n *\n * @returns {Summary} summary instance\n */\n addBreak() {\n const element = this.wrap('br', null);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML blockquote to the summary buffer\n *\n * @param {string} text quote text\n * @param {string} cite (optional) citation url\n *\n * @returns {Summary} summary instance\n */\n addQuote(text, cite) {\n const attrs = Object.assign({}, (cite && { cite }));\n const element = this.wrap('blockquote', text, attrs);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML anchor tag to the summary buffer\n *\n * @param {string} text link text/content\n * @param {string} href hyperlink\n *\n * @returns {Summary} summary instance\n */\n addLink(text, href) {\n const element = this.wrap('a', text, { href });\n return this.addRaw(element).addEOL();\n }\n}\nconst _summary = new Summary();\n/**\n * @deprecated use `core.summary`\n */\nexports.markdownSummary = _summary;\nexports.summary = _summary;\n//# sourceMappingURL=summary.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQxMC5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0EsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsZUFBZSxHQUFHLHVCQUF1QixHQUFHLHdCQUF3QixHQUFHLHVCQUF1QjtBQUM5RixhQUFhLG1CQUFPLENBQUMsSUFBSTtBQUN6QixhQUFhLG1CQUFPLENBQUMsSUFBSTtBQUN6QixRQUFRLGdDQUFnQztBQUN4Qyx1QkFBdUI7QUFDdkIsd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0RUFBNEUsd0JBQXdCO0FBQ3BHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRUFBbUUsWUFBWTtBQUMvRTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZUFBZSxlQUFlO0FBQzlCLGVBQWUsNkJBQTZCO0FBQzVDO0FBQ0EsaUJBQWlCLFFBQVE7QUFDekI7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQSx1Q0FBdUMsSUFBSSxJQUFJLE1BQU07QUFDckQ7QUFDQTtBQUNBLHVCQUF1QixJQUFJLEVBQUUsVUFBVTtBQUN2QztBQUNBLG1CQUFtQixJQUFJLEVBQUUsVUFBVSxHQUFHLFFBQVEsSUFBSSxJQUFJO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxxQkFBcUI7QUFDcEM7QUFDQSxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxrQkFBa0I7QUFDeEU7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsaUJBQWlCO0FBQy9ELFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsU0FBUztBQUN4QjtBQUNBLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkI7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0Esc0NBQXNDLGFBQWEsTUFBTTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFVBQVU7QUFDekIsZUFBZSxTQUFTO0FBQ3hCO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG9CQUFvQjtBQUNuQztBQUNBLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixpQ0FBaUM7QUFDekQ7QUFDQSw0REFBNEQsZ0JBQWdCLFNBQVMsa0JBQWtCLFNBQVM7QUFDaEg7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkI7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixlQUFlLHFCQUFxQjtBQUNwQztBQUNBLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQSxnQkFBZ0IsZ0JBQWdCO0FBQ2hDLG9EQUFvRCxjQUFjLE9BQU8saUJBQWlCLFFBQVE7QUFDbEcsK0RBQStELFVBQVU7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLGlCQUFpQjtBQUNoQztBQUNBLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQSx3QkFBd0IsTUFBTTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkI7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0Esc0NBQXNDLGFBQWEsTUFBTTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBLCtDQUErQyxNQUFNO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCLGVBQWU7QUFDZiIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2NvcmUvbGliL3N1bW1hcnkuanM/MzNlZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zdW1tYXJ5ID0gZXhwb3J0cy5tYXJrZG93blN1bW1hcnkgPSBleHBvcnRzLlNVTU1BUllfRE9DU19VUkwgPSBleHBvcnRzLlNVTU1BUllfRU5WX1ZBUiA9IHZvaWQgMDtcbmNvbnN0IG9zXzEgPSByZXF1aXJlKFwib3NcIik7XG5jb25zdCBmc18xID0gcmVxdWlyZShcImZzXCIpO1xuY29uc3QgeyBhY2Nlc3MsIGFwcGVuZEZpbGUsIHdyaXRlRmlsZSB9ID0gZnNfMS5wcm9taXNlcztcbmV4cG9ydHMuU1VNTUFSWV9FTlZfVkFSID0gJ0dJVEhVQl9TVEVQX1NVTU1BUlknO1xuZXhwb3J0cy5TVU1NQVJZX0RPQ1NfVVJMID0gJ2h0dHBzOi8vZG9jcy5naXRodWIuY29tL2FjdGlvbnMvdXNpbmctd29ya2Zsb3dzL3dvcmtmbG93LWNvbW1hbmRzLWZvci1naXRodWItYWN0aW9ucyNhZGRpbmctYS1qb2Itc3VtbWFyeSc7XG5jbGFzcyBTdW1tYXJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fYnVmZmVyID0gJyc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBzdW1tYXJ5IGZpbGUgcGF0aCBmcm9tIHRoZSBlbnZpcm9ubWVudCwgcmVqZWN0cyBpZiBlbnYgdmFyIGlzIG5vdCBmb3VuZCBvciBmaWxlIGRvZXMgbm90IGV4aXN0XG4gICAgICogQWxzbyBjaGVja3Mgci93IHBlcm1pc3Npb25zLlxuICAgICAqXG4gICAgICogQHJldHVybnMgc3RlcCBzdW1tYXJ5IGZpbGUgcGF0aFxuICAgICAqL1xuICAgIGZpbGVQYXRoKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2ZpbGVQYXRoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVQYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGF0aEZyb21FbnYgPSBwcm9jZXNzLmVudltleHBvcnRzLlNVTU1BUllfRU5WX1ZBUl07XG4gICAgICAgICAgICBpZiAoIXBhdGhGcm9tRW52KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZmluZCBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgJCR7ZXhwb3J0cy5TVU1NQVJZX0VOVl9WQVJ9LiBDaGVjayBpZiB5b3VyIHJ1bnRpbWUgZW52aXJvbm1lbnQgc3VwcG9ydHMgam9iIHN1bW1hcmllcy5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgeWllbGQgYWNjZXNzKHBhdGhGcm9tRW52LCBmc18xLmNvbnN0YW50cy5SX09LIHwgZnNfMS5jb25zdGFudHMuV19PSyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoX2EpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBhY2Nlc3Mgc3VtbWFyeSBmaWxlOiAnJHtwYXRoRnJvbUVudn0nLiBDaGVjayBpZiB0aGUgZmlsZSBoYXMgY29ycmVjdCByZWFkL3dyaXRlIHBlcm1pc3Npb25zLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZmlsZVBhdGggPSBwYXRoRnJvbUVudjtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9maWxlUGF0aDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyYXBzIGNvbnRlbnQgaW4gYW4gSFRNTCB0YWcsIGFkZGluZyBhbnkgSFRNTCBhdHRyaWJ1dGVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIEhUTUwgdGFnIHRvIHdyYXBcbiAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IGNvbnRlbnQgY29udGVudCB3aXRoaW4gdGhlIHRhZ1xuICAgICAqIEBwYXJhbSB7W2F0dHJpYnV0ZTogc3RyaW5nXTogc3RyaW5nfSBhdHRycyBrZXktdmFsdWUgbGlzdCBvZiBIVE1MIGF0dHJpYnV0ZXMgdG8gYWRkXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBjb250ZW50IHdyYXBwZWQgaW4gSFRNTCBlbGVtZW50XG4gICAgICovXG4gICAgd3JhcCh0YWcsIGNvbnRlbnQsIGF0dHJzID0ge30pIHtcbiAgICAgICAgY29uc3QgaHRtbEF0dHJzID0gT2JqZWN0LmVudHJpZXMoYXR0cnMpXG4gICAgICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAgJHtrZXl9PVwiJHt2YWx1ZX1cImApXG4gICAgICAgICAgICAuam9pbignJyk7XG4gICAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGA8JHt0YWd9JHtodG1sQXR0cnN9PmA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGA8JHt0YWd9JHtodG1sQXR0cnN9PiR7Y29udGVudH08LyR7dGFnfT5gO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgdGV4dCBpbiB0aGUgYnVmZmVyIHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlciBmaWxlIGFuZCBlbXB0aWVzIGJ1ZmZlci4gV2lsbCBhcHBlbmQgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3VtbWFyeVdyaXRlT3B0aW9uc30gW29wdGlvbnNdIChvcHRpb25hbCkgb3B0aW9ucyBmb3Igd3JpdGUgb3BlcmF0aW9uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTdW1tYXJ5Pn0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHdyaXRlKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJ3cml0ZSA9ICEhKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5vdmVyd3JpdGUpO1xuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSB5aWVsZCB0aGlzLmZpbGVQYXRoKCk7XG4gICAgICAgICAgICBjb25zdCB3cml0ZUZ1bmMgPSBvdmVyd3JpdGUgPyB3cml0ZUZpbGUgOiBhcHBlbmRGaWxlO1xuICAgICAgICAgICAgeWllbGQgd3JpdGVGdW5jKGZpbGVQYXRoLCB0aGlzLl9idWZmZXIsIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtcHR5QnVmZmVyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIHN1bW1hcnkgYnVmZmVyIGFuZCB3aXBlcyB0aGUgc3VtbWFyeSBmaWxlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGNsZWFyKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1wdHlCdWZmZXIoKS53cml0ZSh7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3VtbWFyeSBidWZmZXIgYXMgYSBzdHJpbmdcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IHN0cmluZyBvZiBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqL1xuICAgIHN0cmluZ2lmeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2J1ZmZlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHN1bW1hcnkgYnVmZmVyIGlzIGVtcHR5XG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVufSB0cnVlIGlmIHRoZSBidWZmZXIgaXMgZW1wdHlcbiAgICAgKi9cbiAgICBpc0VtcHR5QnVmZmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnVmZmVyLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBzdW1tYXJ5IGJ1ZmZlciB3aXRob3V0IHdyaXRpbmcgdG8gc3VtbWFyeSBmaWxlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGVtcHR5QnVmZmVyKCkge1xuICAgICAgICB0aGlzLl9idWZmZXIgPSAnJztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgcmF3IHRleHQgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBjb250ZW50IHRvIGFkZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FkZEVPTD1mYWxzZV0gKG9wdGlvbmFsKSBhcHBlbmQgYW4gRU9MIHRvIHRoZSByYXcgdGV4dCAoZGVmYXVsdDogZmFsc2UpXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZFJhdyh0ZXh0LCBhZGRFT0wgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLl9idWZmZXIgKz0gdGV4dDtcbiAgICAgICAgcmV0dXJuIGFkZEVPTCA/IHRoaXMuYWRkRU9MKCkgOiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBvcGVyYXRpbmcgc3lzdGVtLXNwZWNpZmljIGVuZC1vZi1saW5lIG1hcmtlciB0byB0aGUgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZEVPTCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KG9zXzEuRU9MKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBIVE1MIGNvZGVibG9jayB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIGNvbnRlbnQgdG8gcmVuZGVyIHdpdGhpbiBmZW5jZWQgY29kZSBibG9ja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5nIChvcHRpb25hbCkgbGFuZ3VhZ2UgdG8gc3ludGF4IGhpZ2hsaWdodCBjb2RlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZENvZGVCbG9jayhjb2RlLCBsYW5nKSB7XG4gICAgICAgIGNvbnN0IGF0dHJzID0gT2JqZWN0LmFzc2lnbih7fSwgKGxhbmcgJiYgeyBsYW5nIH0pKTtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMud3JhcCgncHJlJywgdGhpcy53cmFwKCdjb2RlJywgY29kZSksIGF0dHJzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEhUTUwgbGlzdCB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IGl0ZW1zIGxpc3Qgb2YgaXRlbXMgdG8gcmVuZGVyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3JkZXJlZD1mYWxzZV0gKG9wdGlvbmFsKSBpZiB0aGUgcmVuZGVyZWQgbGlzdCBzaG91bGQgYmUgb3JkZXJlZCBvciBub3QgKGRlZmF1bHQ6IGZhbHNlKVxuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGRMaXN0KGl0ZW1zLCBvcmRlcmVkID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgdGFnID0gb3JkZXJlZCA/ICdvbCcgOiAndWwnO1xuICAgICAgICBjb25zdCBsaXN0SXRlbXMgPSBpdGVtcy5tYXAoaXRlbSA9PiB0aGlzLndyYXAoJ2xpJywgaXRlbSkpLmpvaW4oJycpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKHRhZywgbGlzdEl0ZW1zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEhUTUwgdGFibGUgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N1bW1hcnlUYWJsZUNlbGxbXX0gcm93cyB0YWJsZSByb3dzXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZFRhYmxlKHJvd3MpIHtcbiAgICAgICAgY29uc3QgdGFibGVCb2R5ID0gcm93c1xuICAgICAgICAgICAgLm1hcChyb3cgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2VsbHMgPSByb3dcbiAgICAgICAgICAgICAgICAubWFwKGNlbGwgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2VsbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcCgndGQnLCBjZWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgeyBoZWFkZXIsIGRhdGEsIGNvbHNwYW4sIHJvd3NwYW4gfSA9IGNlbGw7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFnID0gaGVhZGVyID8gJ3RoJyA6ICd0ZCc7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0cnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIChjb2xzcGFuICYmIHsgY29sc3BhbiB9KSksIChyb3dzcGFuICYmIHsgcm93c3BhbiB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcCh0YWcsIGRhdGEsIGF0dHJzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcCgndHInLCBjZWxscyk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignJyk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAoJ3RhYmxlJywgdGFibGVCb2R5KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY29sbGFwc2FibGUgSFRNTCBkZXRhaWxzIGVsZW1lbnQgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgdGV4dCBmb3IgdGhlIGNsb3NlZCBzdGF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IGNvbGxhcHNhYmxlIGNvbnRlbnRcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkRGV0YWlscyhsYWJlbCwgY29udGVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKCdkZXRhaWxzJywgdGhpcy53cmFwKCdzdW1tYXJ5JywgbGFiZWwpICsgY29udGVudCk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBIVE1MIGltYWdlIHRhZyB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgcGF0aCB0byB0aGUgaW1hZ2UgeW91IHRvIGVtYmVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFsdCB0ZXh0IGRlc2NyaXB0aW9uIG9mIHRoZSBpbWFnZVxuICAgICAqIEBwYXJhbSB7U3VtbWFyeUltYWdlT3B0aW9uc30gb3B0aW9ucyAob3B0aW9uYWwpIGFkZGl0aW9uIGltYWdlIGF0dHJpYnV0ZXNcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkSW1hZ2Uoc3JjLCBhbHQsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBjb25zdCBhdHRycyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgKHdpZHRoICYmIHsgd2lkdGggfSkpLCAoaGVpZ2h0ICYmIHsgaGVpZ2h0IH0pKTtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMud3JhcCgnaW1nJywgbnVsbCwgT2JqZWN0LmFzc2lnbih7IHNyYywgYWx0IH0sIGF0dHJzKSk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBIVE1MIHNlY3Rpb24gaGVhZGluZyBlbGVtZW50XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBoZWFkaW5nIHRleHRcbiAgICAgKiBAcGFyYW0ge251bWJlciB8IHN0cmluZ30gW2xldmVsPTFdIChvcHRpb25hbCkgdGhlIGhlYWRpbmcgbGV2ZWwsIGRlZmF1bHQ6IDFcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkSGVhZGluZyh0ZXh0LCBsZXZlbCkge1xuICAgICAgICBjb25zdCB0YWcgPSBgaCR7bGV2ZWx9YDtcbiAgICAgICAgY29uc3QgYWxsb3dlZFRhZyA9IFsnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnXS5pbmNsdWRlcyh0YWcpXG4gICAgICAgICAgICA/IHRhZ1xuICAgICAgICAgICAgOiAnaDEnO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKGFsbG93ZWRUYWcsIHRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gSFRNTCB0aGVtYXRpYyBicmVhayAoPGhyPikgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZFNlcGFyYXRvcigpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMud3JhcCgnaHInLCBudWxsKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEhUTUwgbGluZSBicmVhayAoPGJyPikgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZEJyZWFrKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKCdicicsIG51bGwpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gSFRNTCBibG9ja3F1b3RlIHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgcXVvdGUgdGV4dFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjaXRlIChvcHRpb25hbCkgY2l0YXRpb24gdXJsXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZFF1b3RlKHRleHQsIGNpdGUpIHtcbiAgICAgICAgY29uc3QgYXR0cnMgPSBPYmplY3QuYXNzaWduKHt9LCAoY2l0ZSAmJiB7IGNpdGUgfSkpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKCdibG9ja3F1b3RlJywgdGV4dCwgYXR0cnMpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gSFRNTCBhbmNob3IgdGFnIHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgbGluayB0ZXh0L2NvbnRlbnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHJlZiBoeXBlcmxpbmtcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkTGluayh0ZXh0LCBocmVmKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAoJ2EnLCB0ZXh0LCB7IGhyZWYgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG59XG5jb25zdCBfc3VtbWFyeSA9IG5ldyBTdW1tYXJ5KCk7XG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBgY29yZS5zdW1tYXJ5YFxuICovXG5leHBvcnRzLm1hcmtkb3duU3VtbWFyeSA9IF9zdW1tYXJ5O1xuZXhwb3J0cy5zdW1tYXJ5ID0gX3N1bW1hcnk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdW1tYXJ5LmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7410\n")},4570:(__unused_webpack_module,exports)=>{"use strict";eval("\n// We use any as a valid input type\n/* eslint-disable @typescript-eslint/no-explicit-any */\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.toCommandProperties = exports.toCommandValue = void 0;\n/**\n * Sanitizes an input into a string so it can be passed into issueCommand safely\n * @param input input to sanitize into a string\n */\nfunction toCommandValue(input) {\n if (input === null || input === undefined) {\n return '';\n }\n else if (typeof input === 'string' || input instanceof String) {\n return input;\n }\n return JSON.stringify(input);\n}\nexports.toCommandValue = toCommandValue;\n/**\n *\n * @param annotationProperties\n * @returns The command properties to send with the actual annotation command\n * See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646\n */\nfunction toCommandProperties(annotationProperties) {\n if (!Object.keys(annotationProperties).length) {\n return {};\n }\n return {\n title: annotationProperties.title,\n file: annotationProperties.file,\n line: annotationProperties.startLine,\n endLine: annotationProperties.endLine,\n col: annotationProperties.startColumn,\n endColumn: annotationProperties.endColumn\n };\n}\nexports.toCommandProperties = toCommandProperties;\n//# sourceMappingURL=utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU3MC5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsMkJBQTJCLEdBQUcsc0JBQXNCO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvY29yZS9saWIvdXRpbHMuanM/NmZiZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbi8vIFdlIHVzZSBhbnkgYXMgYSB2YWxpZCBpbnB1dCB0eXBlXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnRvQ29tbWFuZFByb3BlcnRpZXMgPSBleHBvcnRzLnRvQ29tbWFuZFZhbHVlID0gdm9pZCAwO1xuLyoqXG4gKiBTYW5pdGl6ZXMgYW4gaW5wdXQgaW50byBhIHN0cmluZyBzbyBpdCBjYW4gYmUgcGFzc2VkIGludG8gaXNzdWVDb21tYW5kIHNhZmVseVxuICogQHBhcmFtIGlucHV0IGlucHV0IHRvIHNhbml0aXplIGludG8gYSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gdG9Db21tYW5kVmFsdWUoaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHwgaW5wdXQgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoaW5wdXQpO1xufVxuZXhwb3J0cy50b0NvbW1hbmRWYWx1ZSA9IHRvQ29tbWFuZFZhbHVlO1xuLyoqXG4gKlxuICogQHBhcmFtIGFubm90YXRpb25Qcm9wZXJ0aWVzXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZCBwcm9wZXJ0aWVzIHRvIHNlbmQgd2l0aCB0aGUgYWN0dWFsIGFubm90YXRpb24gY29tbWFuZFxuICogU2VlIElzc3VlQ29tbWFuZFByb3BlcnRpZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9hY3Rpb25zL3J1bm5lci9ibG9iL21haW4vc3JjL1J1bm5lci5Xb3JrZXIvQWN0aW9uQ29tbWFuZE1hbmFnZXIuY3MjTDY0NlxuICovXG5mdW5jdGlvbiB0b0NvbW1hbmRQcm9wZXJ0aWVzKGFubm90YXRpb25Qcm9wZXJ0aWVzKSB7XG4gICAgaWYgKCFPYmplY3Qua2V5cyhhbm5vdGF0aW9uUHJvcGVydGllcykubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGl0bGU6IGFubm90YXRpb25Qcm9wZXJ0aWVzLnRpdGxlLFxuICAgICAgICBmaWxlOiBhbm5vdGF0aW9uUHJvcGVydGllcy5maWxlLFxuICAgICAgICBsaW5lOiBhbm5vdGF0aW9uUHJvcGVydGllcy5zdGFydExpbmUsXG4gICAgICAgIGVuZExpbmU6IGFubm90YXRpb25Qcm9wZXJ0aWVzLmVuZExpbmUsXG4gICAgICAgIGNvbDogYW5ub3RhdGlvblByb3BlcnRpZXMuc3RhcnRDb2x1bW4sXG4gICAgICAgIGVuZENvbHVtbjogYW5ub3RhdGlvblByb3BlcnRpZXMuZW5kQ29sdW1uXG4gICAgfTtcbn1cbmV4cG9ydHMudG9Db21tYW5kUHJvcGVydGllcyA9IHRvQ29tbWFuZFByb3BlcnRpZXM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4570\n")},37:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.Context = void 0;\nconst fs_1 = __webpack_require__(7147);\nconst os_1 = __webpack_require__(2037);\nclass Context {\n /**\n * Hydrate the context from the environment\n */\n constructor() {\n var _a, _b, _c;\n this.payload = {};\n if (process.env.GITHUB_EVENT_PATH) {\n if ((0, fs_1.existsSync)(process.env.GITHUB_EVENT_PATH)) {\n this.payload = JSON.parse((0, fs_1.readFileSync)(process.env.GITHUB_EVENT_PATH, { encoding: 'utf8' }));\n }\n else {\n const path = process.env.GITHUB_EVENT_PATH;\n process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`);\n }\n }\n this.eventName = process.env.GITHUB_EVENT_NAME;\n this.sha = process.env.GITHUB_SHA;\n this.ref = process.env.GITHUB_REF;\n this.workflow = process.env.GITHUB_WORKFLOW;\n this.action = process.env.GITHUB_ACTION;\n this.actor = process.env.GITHUB_ACTOR;\n this.job = process.env.GITHUB_JOB;\n this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10);\n this.runId = parseInt(process.env.GITHUB_RUN_ID, 10);\n this.apiUrl = (_a = process.env.GITHUB_API_URL) !== null && _a !== void 0 ? _a : `https://api.github.com`;\n this.serverUrl = (_b = process.env.GITHUB_SERVER_URL) !== null && _b !== void 0 ? _b : `https://github.com`;\n this.graphqlUrl =\n (_c = process.env.GITHUB_GRAPHQL_URL) !== null && _c !== void 0 ? _c : `https://api.github.com/graphql`;\n }\n get issue() {\n const payload = this.payload;\n return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number });\n }\n get repo() {\n if (process.env.GITHUB_REPOSITORY) {\n const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/');\n return { owner, repo };\n }\n if (this.payload.repository) {\n return {\n owner: this.payload.repository.owner.login,\n repo: this.payload.repository.name\n };\n }\n throw new Error(\"context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'\");\n }\n}\nexports.Context = Context;\n//# sourceMappingURL=context.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzcuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsZUFBZTtBQUNmLGFBQWEsbUJBQU8sQ0FBQyxJQUFJO0FBQ3pCLGFBQWEsbUJBQU8sQ0FBQyxJQUFJO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtHQUFrRyxrQkFBa0I7QUFDcEg7QUFDQTtBQUNBO0FBQ0EsMERBQTBELE1BQU0sZ0JBQWdCLFNBQVM7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLGdCQUFnQixtRUFBbUU7QUFDaEk7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9naXRodWIvbGliL2NvbnRleHQuanM/OWI2YSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQ29udGV4dCA9IHZvaWQgMDtcbmNvbnN0IGZzXzEgPSByZXF1aXJlKFwiZnNcIik7XG5jb25zdCBvc18xID0gcmVxdWlyZShcIm9zXCIpO1xuY2xhc3MgQ29udGV4dCB7XG4gICAgLyoqXG4gICAgICogSHlkcmF0ZSB0aGUgY29udGV4dCBmcm9tIHRoZSBlbnZpcm9ubWVudFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgdGhpcy5wYXlsb2FkID0ge307XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5HSVRIVUJfRVZFTlRfUEFUSCkge1xuICAgICAgICAgICAgaWYgKCgwLCBmc18xLmV4aXN0c1N5bmMpKHByb2Nlc3MuZW52LkdJVEhVQl9FVkVOVF9QQVRIKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGF5bG9hZCA9IEpTT04ucGFyc2UoKDAsIGZzXzEucmVhZEZpbGVTeW5jKShwcm9jZXNzLmVudi5HSVRIVUJfRVZFTlRfUEFUSCwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBwcm9jZXNzLmVudi5HSVRIVUJfRVZFTlRfUEFUSDtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgR0lUSFVCX0VWRU5UX1BBVEggJHtwYXRofSBkb2VzIG5vdCBleGlzdCR7b3NfMS5FT0x9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ldmVudE5hbWUgPSBwcm9jZXNzLmVudi5HSVRIVUJfRVZFTlRfTkFNRTtcbiAgICAgICAgdGhpcy5zaGEgPSBwcm9jZXNzLmVudi5HSVRIVUJfU0hBO1xuICAgICAgICB0aGlzLnJlZiA9IHByb2Nlc3MuZW52LkdJVEhVQl9SRUY7XG4gICAgICAgIHRoaXMud29ya2Zsb3cgPSBwcm9jZXNzLmVudi5HSVRIVUJfV09SS0ZMT1c7XG4gICAgICAgIHRoaXMuYWN0aW9uID0gcHJvY2Vzcy5lbnYuR0lUSFVCX0FDVElPTjtcbiAgICAgICAgdGhpcy5hY3RvciA9IHByb2Nlc3MuZW52LkdJVEhVQl9BQ1RPUjtcbiAgICAgICAgdGhpcy5qb2IgPSBwcm9jZXNzLmVudi5HSVRIVUJfSk9CO1xuICAgICAgICB0aGlzLnJ1bk51bWJlciA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkdJVEhVQl9SVU5fTlVNQkVSLCAxMCk7XG4gICAgICAgIHRoaXMucnVuSWQgPSBwYXJzZUludChwcm9jZXNzLmVudi5HSVRIVUJfUlVOX0lELCAxMCk7XG4gICAgICAgIHRoaXMuYXBpVXJsID0gKF9hID0gcHJvY2Vzcy5lbnYuR0lUSFVCX0FQSV9VUkwpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGBodHRwczovL2FwaS5naXRodWIuY29tYDtcbiAgICAgICAgdGhpcy5zZXJ2ZXJVcmwgPSAoX2IgPSBwcm9jZXNzLmVudi5HSVRIVUJfU0VSVkVSX1VSTCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogYGh0dHBzOi8vZ2l0aHViLmNvbWA7XG4gICAgICAgIHRoaXMuZ3JhcGhxbFVybCA9XG4gICAgICAgICAgICAoX2MgPSBwcm9jZXNzLmVudi5HSVRIVUJfR1JBUEhRTF9VUkwpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGBodHRwczovL2FwaS5naXRodWIuY29tL2dyYXBocWxgO1xuICAgIH1cbiAgICBnZXQgaXNzdWUoKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLnBheWxvYWQ7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMucmVwbyksIHsgbnVtYmVyOiAocGF5bG9hZC5pc3N1ZSB8fCBwYXlsb2FkLnB1bGxfcmVxdWVzdCB8fCBwYXlsb2FkKS5udW1iZXIgfSk7XG4gICAgfVxuICAgIGdldCByZXBvKCkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuR0lUSFVCX1JFUE9TSVRPUlkpIHtcbiAgICAgICAgICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBwcm9jZXNzLmVudi5HSVRIVUJfUkVQT1NJVE9SWS5zcGxpdCgnLycpO1xuICAgICAgICAgICAgcmV0dXJuIHsgb3duZXIsIHJlcG8gfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXlsb2FkLnJlcG9zaXRvcnkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb3duZXI6IHRoaXMucGF5bG9hZC5yZXBvc2l0b3J5Lm93bmVyLmxvZ2luLFxuICAgICAgICAgICAgICAgIHJlcG86IHRoaXMucGF5bG9hZC5yZXBvc2l0b3J5Lm5hbWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY29udGV4dC5yZXBvIHJlcXVpcmVzIGEgR0lUSFVCX1JFUE9TSVRPUlkgZW52aXJvbm1lbnQgdmFyaWFibGUgbGlrZSAnb3duZXIvcmVwbydcIik7XG4gICAgfVxufVxuZXhwb3J0cy5Db250ZXh0ID0gQ29udGV4dDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnRleHQuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///37\n")},8142:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.getOctokit = exports.context = void 0;\nconst Context = __importStar(__webpack_require__(37));\nconst utils_1 = __webpack_require__(3833);\nexports.context = new Context.Context();\n/**\n * Returns a hydrated octokit ready to use for GitHub Actions\n *\n * @param token the repo PAT or GITHUB_TOKEN\n * @param options other options to set\n */\nfunction getOctokit(token, options, ...additionalPlugins) {\n const GitHubWithPlugins = utils_1.GitHub.plugin(...additionalPlugins);\n return new GitHubWithPlugins((0, utils_1.getOctokitOptions)(token, options));\n}\nexports.getOctokit = getOctokit;\n//# sourceMappingURL=github.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODE0Mi5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQ0FBb0M7QUFDbkQ7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsMENBQTBDLDRCQUE0QjtBQUN0RSxDQUFDO0FBQ0Q7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0Qsa0JBQWtCLEdBQUcsZUFBZTtBQUNwQyw2QkFBNkIsbUJBQU8sQ0FBQyxFQUFXO0FBQ2hELGdCQUFnQixtQkFBTyxDQUFDLElBQVM7QUFDakMsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvZ2l0aHViL2xpYi9naXRodWIuanM/YzYwOCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRPY3Rva2l0ID0gZXhwb3J0cy5jb250ZXh0ID0gdm9pZCAwO1xuY29uc3QgQ29udGV4dCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9jb250ZXh0XCIpKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbmV4cG9ydHMuY29udGV4dCA9IG5ldyBDb250ZXh0LkNvbnRleHQoKTtcbi8qKlxuICogUmV0dXJucyBhIGh5ZHJhdGVkIG9jdG9raXQgcmVhZHkgdG8gdXNlIGZvciBHaXRIdWIgQWN0aW9uc1xuICpcbiAqIEBwYXJhbSAgICAgdG9rZW4gICAgdGhlIHJlcG8gUEFUIG9yIEdJVEhVQl9UT0tFTlxuICogQHBhcmFtICAgICBvcHRpb25zICBvdGhlciBvcHRpb25zIHRvIHNldFxuICovXG5mdW5jdGlvbiBnZXRPY3Rva2l0KHRva2VuLCBvcHRpb25zLCAuLi5hZGRpdGlvbmFsUGx1Z2lucykge1xuICAgIGNvbnN0IEdpdEh1YldpdGhQbHVnaW5zID0gdXRpbHNfMS5HaXRIdWIucGx1Z2luKC4uLmFkZGl0aW9uYWxQbHVnaW5zKTtcbiAgICByZXR1cm4gbmV3IEdpdEh1YldpdGhQbHVnaW5zKCgwLCB1dGlsc18xLmdldE9jdG9raXRPcHRpb25zKSh0b2tlbiwgb3B0aW9ucykpO1xufVxuZXhwb3J0cy5nZXRPY3Rva2l0ID0gZ2V0T2N0b2tpdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdpdGh1Yi5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8142\n')},3460:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.getApiBaseUrl = exports.getProxyFetch = exports.getProxyAgentDispatcher = exports.getProxyAgent = exports.getAuthString = void 0;\nconst httpClient = __importStar(__webpack_require__(4635));\nconst undici_1 = __webpack_require__(9362);\nfunction getAuthString(token, options) {\n if (!token && !options.auth) {\n throw new Error(\'Parameter token or opts.auth is required\');\n }\n else if (token && options.auth) {\n throw new Error(\'Parameters token and opts.auth may not both be specified\');\n }\n return typeof options.auth === \'string\' ? options.auth : `token ${token}`;\n}\nexports.getAuthString = getAuthString;\nfunction getProxyAgent(destinationUrl) {\n const hc = new httpClient.HttpClient();\n return hc.getAgent(destinationUrl);\n}\nexports.getProxyAgent = getProxyAgent;\nfunction getProxyAgentDispatcher(destinationUrl) {\n const hc = new httpClient.HttpClient();\n return hc.getAgentDispatcher(destinationUrl);\n}\nexports.getProxyAgentDispatcher = getProxyAgentDispatcher;\nfunction getProxyFetch(destinationUrl) {\n const httpDispatcher = getProxyAgentDispatcher(destinationUrl);\n const proxyFetch = (url, opts) => __awaiter(this, void 0, void 0, function* () {\n return (0, undici_1.fetch)(url, Object.assign(Object.assign({}, opts), { dispatcher: httpDispatcher }));\n });\n return proxyFetch;\n}\nexports.getProxyFetch = getProxyFetch;\nfunction getApiBaseUrl() {\n return process.env[\'GITHUB_API_URL\'] || \'https://api.github.com\';\n}\nexports.getApiBaseUrl = getApiBaseUrl;\n//# sourceMappingURL=utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ2MC5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQ0FBb0M7QUFDbkQ7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsMENBQTBDLDRCQUE0QjtBQUN0RSxDQUFDO0FBQ0Q7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHFCQUFxQixHQUFHLHFCQUFxQixHQUFHLCtCQUErQixHQUFHLHFCQUFxQixHQUFHLHFCQUFxQjtBQUMvSCxnQ0FBZ0MsbUJBQU8sQ0FBQyxJQUFzQjtBQUM5RCxpQkFBaUIsbUJBQU8sQ0FBQyxJQUFRO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFLE1BQU07QUFDNUU7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFLFdBQVcsNEJBQTRCO0FBQzdHLEtBQUs7QUFDTDtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQiIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2dpdGh1Yi9saWIvaW50ZXJuYWwvdXRpbHMuanM/Y2IyOCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldEFwaUJhc2VVcmwgPSBleHBvcnRzLmdldFByb3h5RmV0Y2ggPSBleHBvcnRzLmdldFByb3h5QWdlbnREaXNwYXRjaGVyID0gZXhwb3J0cy5nZXRQcm94eUFnZW50ID0gZXhwb3J0cy5nZXRBdXRoU3RyaW5nID0gdm9pZCAwO1xuY29uc3QgaHR0cENsaWVudCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvaHR0cC1jbGllbnRcIikpO1xuY29uc3QgdW5kaWNpXzEgPSByZXF1aXJlKFwidW5kaWNpXCIpO1xuZnVuY3Rpb24gZ2V0QXV0aFN0cmluZyh0b2tlbiwgb3B0aW9ucykge1xuICAgIGlmICghdG9rZW4gJiYgIW9wdGlvbnMuYXV0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmFtZXRlciB0b2tlbiBvciBvcHRzLmF1dGggaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodG9rZW4gJiYgb3B0aW9ucy5hdXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyYW1ldGVycyB0b2tlbiBhbmQgb3B0cy5hdXRoIG1heSBub3QgYm90aCBiZSBzcGVjaWZpZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBvcHRpb25zLmF1dGggPT09ICdzdHJpbmcnID8gb3B0aW9ucy5hdXRoIDogYHRva2VuICR7dG9rZW59YDtcbn1cbmV4cG9ydHMuZ2V0QXV0aFN0cmluZyA9IGdldEF1dGhTdHJpbmc7XG5mdW5jdGlvbiBnZXRQcm94eUFnZW50KGRlc3RpbmF0aW9uVXJsKSB7XG4gICAgY29uc3QgaGMgPSBuZXcgaHR0cENsaWVudC5IdHRwQ2xpZW50KCk7XG4gICAgcmV0dXJuIGhjLmdldEFnZW50KGRlc3RpbmF0aW9uVXJsKTtcbn1cbmV4cG9ydHMuZ2V0UHJveHlBZ2VudCA9IGdldFByb3h5QWdlbnQ7XG5mdW5jdGlvbiBnZXRQcm94eUFnZW50RGlzcGF0Y2hlcihkZXN0aW5hdGlvblVybCkge1xuICAgIGNvbnN0IGhjID0gbmV3IGh0dHBDbGllbnQuSHR0cENsaWVudCgpO1xuICAgIHJldHVybiBoYy5nZXRBZ2VudERpc3BhdGNoZXIoZGVzdGluYXRpb25VcmwpO1xufVxuZXhwb3J0cy5nZXRQcm94eUFnZW50RGlzcGF0Y2hlciA9IGdldFByb3h5QWdlbnREaXNwYXRjaGVyO1xuZnVuY3Rpb24gZ2V0UHJveHlGZXRjaChkZXN0aW5hdGlvblVybCkge1xuICAgIGNvbnN0IGh0dHBEaXNwYXRjaGVyID0gZ2V0UHJveHlBZ2VudERpc3BhdGNoZXIoZGVzdGluYXRpb25VcmwpO1xuICAgIGNvbnN0IHByb3h5RmV0Y2ggPSAodXJsLCBvcHRzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHJldHVybiAoMCwgdW5kaWNpXzEuZmV0Y2gpKHVybCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRzKSwgeyBkaXNwYXRjaGVyOiBodHRwRGlzcGF0Y2hlciB9KSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHByb3h5RmV0Y2g7XG59XG5leHBvcnRzLmdldFByb3h5RmV0Y2ggPSBnZXRQcm94eUZldGNoO1xuZnVuY3Rpb24gZ2V0QXBpQmFzZVVybCgpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9BUElfVVJMJ10gfHwgJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20nO1xufVxuZXhwb3J0cy5nZXRBcGlCYXNlVXJsID0gZ2V0QXBpQmFzZVVybDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3460\n')},3833:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0;\nconst Context = __importStar(__webpack_require__(37));\nconst Utils = __importStar(__webpack_require__(3460));\n// octokit + plugins\nconst core_1 = __webpack_require__(6808);\nconst plugin_rest_endpoint_methods_1 = __webpack_require__(3927);\nconst plugin_paginate_rest_1 = __webpack_require__(5745);\nexports.context = new Context.Context();\nconst baseUrl = Utils.getApiBaseUrl();\nexports.defaults = {\n baseUrl,\n request: {\n agent: Utils.getProxyAgent(baseUrl),\n fetch: Utils.getProxyFetch(baseUrl)\n }\n};\nexports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults);\n/**\n * Convience function to correctly format Octokit Options to pass into the constructor.\n *\n * @param token the repo PAT or GITHUB_TOKEN\n * @param options other options to set\n */\nfunction getOctokitOptions(token, options) {\n const opts = Object.assign({}, options || {}); // Shallow clone - don\'t mutate the object provided by the caller\n // Auth\n const auth = Utils.getAuthString(token, opts);\n if (auth) {\n opts.auth = auth;\n }\n return opts;\n}\nexports.getOctokitOptions = getOctokitOptions;\n//# sourceMappingURL=utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzgzMy5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQ0FBb0M7QUFDbkQ7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsMENBQTBDLDRCQUE0QjtBQUN0RSxDQUFDO0FBQ0Q7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QseUJBQXlCLEdBQUcsY0FBYyxHQUFHLGdCQUFnQixHQUFHLGVBQWU7QUFDL0UsNkJBQTZCLG1CQUFPLENBQUMsRUFBVztBQUNoRCwyQkFBMkIsbUJBQU8sQ0FBQyxJQUFrQjtBQUNyRDtBQUNBLGVBQWUsbUJBQU8sQ0FBQyxJQUFlO0FBQ3RDLHVDQUF1QyxtQkFBTyxDQUFDLElBQXVDO0FBQ3RGLCtCQUErQixtQkFBTyxDQUFDLElBQStCO0FBQ3RFLGVBQWU7QUFDZjtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsZUFBZSxHQUFHO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvZ2l0aHViL2xpYi91dGlscy5qcz9jZTEwIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldE9jdG9raXRPcHRpb25zID0gZXhwb3J0cy5HaXRIdWIgPSBleHBvcnRzLmRlZmF1bHRzID0gZXhwb3J0cy5jb250ZXh0ID0gdm9pZCAwO1xuY29uc3QgQ29udGV4dCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9jb250ZXh0XCIpKTtcbmNvbnN0IFV0aWxzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2ludGVybmFsL3V0aWxzXCIpKTtcbi8vIG9jdG9raXQgKyBwbHVnaW5zXG5jb25zdCBjb3JlXzEgPSByZXF1aXJlKFwiQG9jdG9raXQvY29yZVwiKTtcbmNvbnN0IHBsdWdpbl9yZXN0X2VuZHBvaW50X21ldGhvZHNfMSA9IHJlcXVpcmUoXCJAb2N0b2tpdC9wbHVnaW4tcmVzdC1lbmRwb2ludC1tZXRob2RzXCIpO1xuY29uc3QgcGx1Z2luX3BhZ2luYXRlX3Jlc3RfMSA9IHJlcXVpcmUoXCJAb2N0b2tpdC9wbHVnaW4tcGFnaW5hdGUtcmVzdFwiKTtcbmV4cG9ydHMuY29udGV4dCA9IG5ldyBDb250ZXh0LkNvbnRleHQoKTtcbmNvbnN0IGJhc2VVcmwgPSBVdGlscy5nZXRBcGlCYXNlVXJsKCk7XG5leHBvcnRzLmRlZmF1bHRzID0ge1xuICAgIGJhc2VVcmwsXG4gICAgcmVxdWVzdDoge1xuICAgICAgICBhZ2VudDogVXRpbHMuZ2V0UHJveHlBZ2VudChiYXNlVXJsKSxcbiAgICAgICAgZmV0Y2g6IFV0aWxzLmdldFByb3h5RmV0Y2goYmFzZVVybClcbiAgICB9XG59O1xuZXhwb3J0cy5HaXRIdWIgPSBjb3JlXzEuT2N0b2tpdC5wbHVnaW4ocGx1Z2luX3Jlc3RfZW5kcG9pbnRfbWV0aG9kc18xLnJlc3RFbmRwb2ludE1ldGhvZHMsIHBsdWdpbl9wYWdpbmF0ZV9yZXN0XzEucGFnaW5hdGVSZXN0KS5kZWZhdWx0cyhleHBvcnRzLmRlZmF1bHRzKTtcbi8qKlxuICogQ29udmllbmNlIGZ1bmN0aW9uIHRvIGNvcnJlY3RseSBmb3JtYXQgT2N0b2tpdCBPcHRpb25zIHRvIHBhc3MgaW50byB0aGUgY29uc3RydWN0b3IuXG4gKlxuICogQHBhcmFtICAgICB0b2tlbiAgICB0aGUgcmVwbyBQQVQgb3IgR0lUSFVCX1RPS0VOXG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgIG90aGVyIG9wdGlvbnMgdG8gc2V0XG4gKi9cbmZ1bmN0aW9uIGdldE9jdG9raXRPcHRpb25zKHRva2VuLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMgfHwge30pOyAvLyBTaGFsbG93IGNsb25lIC0gZG9uJ3QgbXV0YXRlIHRoZSBvYmplY3QgcHJvdmlkZWQgYnkgdGhlIGNhbGxlclxuICAgIC8vIEF1dGhcbiAgICBjb25zdCBhdXRoID0gVXRpbHMuZ2V0QXV0aFN0cmluZyh0b2tlbiwgb3B0cyk7XG4gICAgaWYgKGF1dGgpIHtcbiAgICAgICAgb3B0cy5hdXRoID0gYXV0aDtcbiAgICB9XG4gICAgcmV0dXJuIG9wdHM7XG59XG5leHBvcnRzLmdldE9jdG9raXRPcHRpb25zID0gZ2V0T2N0b2tpdE9wdGlvbnM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3833\n')},2429:function(__unused_webpack_module,exports){"use strict";eval("\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.PersonalAccessTokenCredentialHandler = exports.BearerCredentialHandler = exports.BasicCredentialHandler = void 0;\nclass BasicCredentialHandler {\n constructor(username, password) {\n this.username = username;\n this.password = password;\n }\n prepareRequest(options) {\n if (!options.headers) {\n throw Error('The request has no headers');\n }\n options.headers['Authorization'] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString('base64')}`;\n }\n // This handler cannot handle 401\n canHandleAuthentication() {\n return false;\n }\n handleAuthentication() {\n return __awaiter(this, void 0, void 0, function* () {\n throw new Error('not implemented');\n });\n }\n}\nexports.BasicCredentialHandler = BasicCredentialHandler;\nclass BearerCredentialHandler {\n constructor(token) {\n this.token = token;\n }\n // currently implements pre-authorization\n // TODO: support preAuth = false where it hooks on 401\n prepareRequest(options) {\n if (!options.headers) {\n throw Error('The request has no headers');\n }\n options.headers['Authorization'] = `Bearer ${this.token}`;\n }\n // This handler cannot handle 401\n canHandleAuthentication() {\n return false;\n }\n handleAuthentication() {\n return __awaiter(this, void 0, void 0, function* () {\n throw new Error('not implemented');\n });\n }\n}\nexports.BearerCredentialHandler = BearerCredentialHandler;\nclass PersonalAccessTokenCredentialHandler {\n constructor(token) {\n this.token = token;\n }\n // currently implements pre-authorization\n // TODO: support preAuth = false where it hooks on 401\n prepareRequest(options) {\n if (!options.headers) {\n throw Error('The request has no headers');\n }\n options.headers['Authorization'] = `Basic ${Buffer.from(`PAT:${this.token}`).toString('base64')}`;\n }\n // This handler cannot handle 401\n canHandleAuthentication() {\n return false;\n }\n handleAuthentication() {\n return __awaiter(this, void 0, void 0, function* () {\n throw new Error('not implemented');\n });\n }\n}\nexports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler;\n//# sourceMappingURL=auth.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQyOS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0EsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsNENBQTRDLEdBQUcsK0JBQStCLEdBQUcsOEJBQThCO0FBQy9HO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxlQUFlLGNBQWMsR0FBRyxjQUFjLHNCQUFzQjtBQUN4SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsV0FBVztBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0QsbUJBQW1CLFdBQVcsc0JBQXNCO0FBQ3hHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLDRDQUE0QztBQUM1QyIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2h0dHAtY2xpZW50L2xpYi9hdXRoLmpzPzIxMGQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUGVyc29uYWxBY2Nlc3NUb2tlbkNyZWRlbnRpYWxIYW5kbGVyID0gZXhwb3J0cy5CZWFyZXJDcmVkZW50aWFsSGFuZGxlciA9IGV4cG9ydHMuQmFzaWNDcmVkZW50aWFsSGFuZGxlciA9IHZvaWQgMDtcbmNsYXNzIEJhc2ljQ3JlZGVudGlhbEhhbmRsZXIge1xuICAgIGNvbnN0cnVjdG9yKHVzZXJuYW1lLCBwYXNzd29yZCkge1xuICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7XG4gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDtcbiAgICB9XG4gICAgcHJlcGFyZVJlcXVlc3Qob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1RoZSByZXF1ZXN0IGhhcyBubyBoZWFkZXJzJyk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHt0aGlzLnVzZXJuYW1lfToke3RoaXMucGFzc3dvcmR9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpfWA7XG4gICAgfVxuICAgIC8vIFRoaXMgaGFuZGxlciBjYW5ub3QgaGFuZGxlIDQwMVxuICAgIGNhbkhhbmRsZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGhhbmRsZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5CYXNpY0NyZWRlbnRpYWxIYW5kbGVyID0gQmFzaWNDcmVkZW50aWFsSGFuZGxlcjtcbmNsYXNzIEJlYXJlckNyZWRlbnRpYWxIYW5kbGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih0b2tlbikge1xuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgfVxuICAgIC8vIGN1cnJlbnRseSBpbXBsZW1lbnRzIHByZS1hdXRob3JpemF0aW9uXG4gICAgLy8gVE9ETzogc3VwcG9ydCBwcmVBdXRoID0gZmFsc2Ugd2hlcmUgaXQgaG9va3Mgb24gNDAxXG4gICAgcHJlcGFyZVJlcXVlc3Qob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1RoZSByZXF1ZXN0IGhhcyBubyBoZWFkZXJzJyk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7dGhpcy50b2tlbn1gO1xuICAgIH1cbiAgICAvLyBUaGlzIGhhbmRsZXIgY2Fubm90IGhhbmRsZSA0MDFcbiAgICBjYW5IYW5kbGVBdXRoZW50aWNhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBoYW5kbGVBdXRoZW50aWNhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuQmVhcmVyQ3JlZGVudGlhbEhhbmRsZXIgPSBCZWFyZXJDcmVkZW50aWFsSGFuZGxlcjtcbmNsYXNzIFBlcnNvbmFsQWNjZXNzVG9rZW5DcmVkZW50aWFsSGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IodG9rZW4pIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgIH1cbiAgICAvLyBjdXJyZW50bHkgaW1wbGVtZW50cyBwcmUtYXV0aG9yaXphdGlvblxuICAgIC8vIFRPRE86IHN1cHBvcnQgcHJlQXV0aCA9IGZhbHNlIHdoZXJlIGl0IGhvb2tzIG9uIDQwMVxuICAgIHByZXBhcmVSZXF1ZXN0KG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdUaGUgcmVxdWVzdCBoYXMgbm8gaGVhZGVycycpO1xuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gYEJhc2ljICR7QnVmZmVyLmZyb20oYFBBVDoke3RoaXMudG9rZW59YCkudG9TdHJpbmcoJ2Jhc2U2NCcpfWA7XG4gICAgfVxuICAgIC8vIFRoaXMgaGFuZGxlciBjYW5ub3QgaGFuZGxlIDQwMVxuICAgIGNhbkhhbmRsZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGhhbmRsZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5QZXJzb25hbEFjY2Vzc1Rva2VuQ3JlZGVudGlhbEhhbmRsZXIgPSBQZXJzb25hbEFjY2Vzc1Rva2VuQ3JlZGVudGlhbEhhbmRsZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdXRoLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2429\n")},4635:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\n/* eslint-disable @typescript-eslint/no-explicit-any */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.HttpClient = exports.isHttps = exports.HttpClientResponse = exports.HttpClientError = exports.getProxyUrl = exports.MediaTypes = exports.Headers = exports.HttpCodes = void 0;\nconst http = __importStar(__webpack_require__(3685));\nconst https = __importStar(__webpack_require__(5687));\nconst pm = __importStar(__webpack_require__(7960));\nconst tunnel = __importStar(__webpack_require__(6149));\nconst undici_1 = __webpack_require__(9362);\nvar HttpCodes;\n(function (HttpCodes) {\n HttpCodes[HttpCodes["OK"] = 200] = "OK";\n HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices";\n HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently";\n HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved";\n HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther";\n HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified";\n HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy";\n HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy";\n HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect";\n HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect";\n HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest";\n HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized";\n HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired";\n HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden";\n HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound";\n HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed";\n HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable";\n HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired";\n HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout";\n HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict";\n HttpCodes[HttpCodes["Gone"] = 410] = "Gone";\n HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests";\n HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError";\n HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented";\n HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway";\n HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable";\n HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout";\n})(HttpCodes || (exports.HttpCodes = HttpCodes = {}));\nvar Headers;\n(function (Headers) {\n Headers["Accept"] = "accept";\n Headers["ContentType"] = "content-type";\n})(Headers || (exports.Headers = Headers = {}));\nvar MediaTypes;\n(function (MediaTypes) {\n MediaTypes["ApplicationJson"] = "application/json";\n})(MediaTypes || (exports.MediaTypes = MediaTypes = {}));\n/**\n * Returns the proxy URL, depending upon the supplied url and proxy environment variables.\n * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com\n */\nfunction getProxyUrl(serverUrl) {\n const proxyUrl = pm.getProxyUrl(new URL(serverUrl));\n return proxyUrl ? proxyUrl.href : \'\';\n}\nexports.getProxyUrl = getProxyUrl;\nconst HttpRedirectCodes = [\n HttpCodes.MovedPermanently,\n HttpCodes.ResourceMoved,\n HttpCodes.SeeOther,\n HttpCodes.TemporaryRedirect,\n HttpCodes.PermanentRedirect\n];\nconst HttpResponseRetryCodes = [\n HttpCodes.BadGateway,\n HttpCodes.ServiceUnavailable,\n HttpCodes.GatewayTimeout\n];\nconst RetryableHttpVerbs = [\'OPTIONS\', \'GET\', \'DELETE\', \'HEAD\'];\nconst ExponentialBackoffCeiling = 10;\nconst ExponentialBackoffTimeSlice = 5;\nclass HttpClientError extends Error {\n constructor(message, statusCode) {\n super(message);\n this.name = \'HttpClientError\';\n this.statusCode = statusCode;\n Object.setPrototypeOf(this, HttpClientError.prototype);\n }\n}\nexports.HttpClientError = HttpClientError;\nclass HttpClientResponse {\n constructor(message) {\n this.message = message;\n }\n readBody() {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {\n let output = Buffer.alloc(0);\n this.message.on(\'data\', (chunk) => {\n output = Buffer.concat([output, chunk]);\n });\n this.message.on(\'end\', () => {\n resolve(output.toString());\n });\n }));\n });\n }\n readBodyBuffer() {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {\n const chunks = [];\n this.message.on(\'data\', (chunk) => {\n chunks.push(chunk);\n });\n this.message.on(\'end\', () => {\n resolve(Buffer.concat(chunks));\n });\n }));\n });\n }\n}\nexports.HttpClientResponse = HttpClientResponse;\nfunction isHttps(requestUrl) {\n const parsedUrl = new URL(requestUrl);\n return parsedUrl.protocol === \'https:\';\n}\nexports.isHttps = isHttps;\nclass HttpClient {\n constructor(userAgent, handlers, requestOptions) {\n this._ignoreSslError = false;\n this._allowRedirects = true;\n this._allowRedirectDowngrade = false;\n this._maxRedirects = 50;\n this._allowRetries = false;\n this._maxRetries = 1;\n this._keepAlive = false;\n this._disposed = false;\n this.userAgent = userAgent;\n this.handlers = handlers || [];\n this.requestOptions = requestOptions;\n if (requestOptions) {\n if (requestOptions.ignoreSslError != null) {\n this._ignoreSslError = requestOptions.ignoreSslError;\n }\n this._socketTimeout = requestOptions.socketTimeout;\n if (requestOptions.allowRedirects != null) {\n this._allowRedirects = requestOptions.allowRedirects;\n }\n if (requestOptions.allowRedirectDowngrade != null) {\n this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade;\n }\n if (requestOptions.maxRedirects != null) {\n this._maxRedirects = Math.max(requestOptions.maxRedirects, 0);\n }\n if (requestOptions.keepAlive != null) {\n this._keepAlive = requestOptions.keepAlive;\n }\n if (requestOptions.allowRetries != null) {\n this._allowRetries = requestOptions.allowRetries;\n }\n if (requestOptions.maxRetries != null) {\n this._maxRetries = requestOptions.maxRetries;\n }\n }\n }\n options(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request(\'OPTIONS\', requestUrl, null, additionalHeaders || {});\n });\n }\n get(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request(\'GET\', requestUrl, null, additionalHeaders || {});\n });\n }\n del(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request(\'DELETE\', requestUrl, null, additionalHeaders || {});\n });\n }\n post(requestUrl, data, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request(\'POST\', requestUrl, data, additionalHeaders || {});\n });\n }\n patch(requestUrl, data, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request(\'PATCH\', requestUrl, data, additionalHeaders || {});\n });\n }\n put(requestUrl, data, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request(\'PUT\', requestUrl, data, additionalHeaders || {});\n });\n }\n head(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request(\'HEAD\', requestUrl, null, additionalHeaders || {});\n });\n }\n sendStream(verb, requestUrl, stream, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request(verb, requestUrl, stream, additionalHeaders);\n });\n }\n /**\n * Gets a typed object from an endpoint\n * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise\n */\n getJson(requestUrl, additionalHeaders = {}) {\n return __awaiter(this, void 0, void 0, function* () {\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n const res = yield this.get(requestUrl, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n postJson(requestUrl, obj, additionalHeaders = {}) {\n return __awaiter(this, void 0, void 0, function* () {\n const data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);\n const res = yield this.post(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n putJson(requestUrl, obj, additionalHeaders = {}) {\n return __awaiter(this, void 0, void 0, function* () {\n const data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);\n const res = yield this.put(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n patchJson(requestUrl, obj, additionalHeaders = {}) {\n return __awaiter(this, void 0, void 0, function* () {\n const data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);\n const res = yield this.patch(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n /**\n * Makes a raw http request.\n * All other methods such as get, post, patch, and request ultimately call this.\n * Prefer get, del, post and patch\n */\n request(verb, requestUrl, data, headers) {\n return __awaiter(this, void 0, void 0, function* () {\n if (this._disposed) {\n throw new Error(\'Client has already been disposed.\');\n }\n const parsedUrl = new URL(requestUrl);\n let info = this._prepareRequest(verb, parsedUrl, headers);\n // Only perform retries on reads since writes may not be idempotent.\n const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb)\n ? this._maxRetries + 1\n : 1;\n let numTries = 0;\n let response;\n do {\n response = yield this.requestRaw(info, data);\n // Check if it\'s an authentication challenge\n if (response &&\n response.message &&\n response.message.statusCode === HttpCodes.Unauthorized) {\n let authenticationHandler;\n for (const handler of this.handlers) {\n if (handler.canHandleAuthentication(response)) {\n authenticationHandler = handler;\n break;\n }\n }\n if (authenticationHandler) {\n return authenticationHandler.handleAuthentication(this, info, data);\n }\n else {\n // We have received an unauthorized response but have no handlers to handle it.\n // Let the response return to the caller.\n return response;\n }\n }\n let redirectsRemaining = this._maxRedirects;\n while (response.message.statusCode &&\n HttpRedirectCodes.includes(response.message.statusCode) &&\n this._allowRedirects &&\n redirectsRemaining > 0) {\n const redirectUrl = response.message.headers[\'location\'];\n if (!redirectUrl) {\n // if there\'s no location to redirect to, we won\'t\n break;\n }\n const parsedRedirectUrl = new URL(redirectUrl);\n if (parsedUrl.protocol === \'https:\' &&\n parsedUrl.protocol !== parsedRedirectUrl.protocol &&\n !this._allowRedirectDowngrade) {\n throw new Error(\'Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.\');\n }\n // we need to finish reading the response before reassigning response\n // which will leak the open socket.\n yield response.readBody();\n // strip authorization header if redirected to a different hostname\n if (parsedRedirectUrl.hostname !== parsedUrl.hostname) {\n for (const header in headers) {\n // header names are case insensitive\n if (header.toLowerCase() === \'authorization\') {\n delete headers[header];\n }\n }\n }\n // let\'s make the request with the new redirectUrl\n info = this._prepareRequest(verb, parsedRedirectUrl, headers);\n response = yield this.requestRaw(info, data);\n redirectsRemaining--;\n }\n if (!response.message.statusCode ||\n !HttpResponseRetryCodes.includes(response.message.statusCode)) {\n // If not a retry code, return immediately instead of retrying\n return response;\n }\n numTries += 1;\n if (numTries < maxTries) {\n yield response.readBody();\n yield this._performExponentialBackoff(numTries);\n }\n } while (numTries < maxTries);\n return response;\n });\n }\n /**\n * Needs to be called if keepAlive is set to true in request options.\n */\n dispose() {\n if (this._agent) {\n this._agent.destroy();\n }\n this._disposed = true;\n }\n /**\n * Raw request.\n * @param info\n * @param data\n */\n requestRaw(info, data) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n function callbackForResult(err, res) {\n if (err) {\n reject(err);\n }\n else if (!res) {\n // If `err` is not passed, then `res` must be passed.\n reject(new Error(\'Unknown error\'));\n }\n else {\n resolve(res);\n }\n }\n this.requestRawWithCallback(info, data, callbackForResult);\n });\n });\n }\n /**\n * Raw request with callback.\n * @param info\n * @param data\n * @param onResult\n */\n requestRawWithCallback(info, data, onResult) {\n if (typeof data === \'string\') {\n if (!info.options.headers) {\n info.options.headers = {};\n }\n info.options.headers[\'Content-Length\'] = Buffer.byteLength(data, \'utf8\');\n }\n let callbackCalled = false;\n function handleResult(err, res) {\n if (!callbackCalled) {\n callbackCalled = true;\n onResult(err, res);\n }\n }\n const req = info.httpModule.request(info.options, (msg) => {\n const res = new HttpClientResponse(msg);\n handleResult(undefined, res);\n });\n let socket;\n req.on(\'socket\', sock => {\n socket = sock;\n });\n // If we ever get disconnected, we want the socket to timeout eventually\n req.setTimeout(this._socketTimeout || 3 * 60000, () => {\n if (socket) {\n socket.end();\n }\n handleResult(new Error(`Request timeout: ${info.options.path}`));\n });\n req.on(\'error\', function (err) {\n // err has statusCode property\n // res should have headers\n handleResult(err);\n });\n if (data && typeof data === \'string\') {\n req.write(data, \'utf8\');\n }\n if (data && typeof data !== \'string\') {\n data.on(\'close\', function () {\n req.end();\n });\n data.pipe(req);\n }\n else {\n req.end();\n }\n }\n /**\n * Gets an http agent. This function is useful when you need an http agent that handles\n * routing through a proxy server - depending upon the url and proxy environment variables.\n * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com\n */\n getAgent(serverUrl) {\n const parsedUrl = new URL(serverUrl);\n return this._getAgent(parsedUrl);\n }\n getAgentDispatcher(serverUrl) {\n const parsedUrl = new URL(serverUrl);\n const proxyUrl = pm.getProxyUrl(parsedUrl);\n const useProxy = proxyUrl && proxyUrl.hostname;\n if (!useProxy) {\n return;\n }\n return this._getProxyAgentDispatcher(parsedUrl, proxyUrl);\n }\n _prepareRequest(method, requestUrl, headers) {\n const info = {};\n info.parsedUrl = requestUrl;\n const usingSsl = info.parsedUrl.protocol === \'https:\';\n info.httpModule = usingSsl ? https : http;\n const defaultPort = usingSsl ? 443 : 80;\n info.options = {};\n info.options.host = info.parsedUrl.hostname;\n info.options.port = info.parsedUrl.port\n ? parseInt(info.parsedUrl.port)\n : defaultPort;\n info.options.path =\n (info.parsedUrl.pathname || \'\') + (info.parsedUrl.search || \'\');\n info.options.method = method;\n info.options.headers = this._mergeHeaders(headers);\n if (this.userAgent != null) {\n info.options.headers[\'user-agent\'] = this.userAgent;\n }\n info.options.agent = this._getAgent(info.parsedUrl);\n // gives handlers an opportunity to participate\n if (this.handlers) {\n for (const handler of this.handlers) {\n handler.prepareRequest(info.options);\n }\n }\n return info;\n }\n _mergeHeaders(headers) {\n if (this.requestOptions && this.requestOptions.headers) {\n return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {}));\n }\n return lowercaseKeys(headers || {});\n }\n _getExistingOrDefaultHeader(additionalHeaders, header, _default) {\n let clientHeader;\n if (this.requestOptions && this.requestOptions.headers) {\n clientHeader = lowercaseKeys(this.requestOptions.headers)[header];\n }\n return additionalHeaders[header] || clientHeader || _default;\n }\n _getAgent(parsedUrl) {\n let agent;\n const proxyUrl = pm.getProxyUrl(parsedUrl);\n const useProxy = proxyUrl && proxyUrl.hostname;\n if (this._keepAlive && useProxy) {\n agent = this._proxyAgent;\n }\n if (this._keepAlive && !useProxy) {\n agent = this._agent;\n }\n // if agent is already assigned use that agent.\n if (agent) {\n return agent;\n }\n const usingSsl = parsedUrl.protocol === \'https:\';\n let maxSockets = 100;\n if (this.requestOptions) {\n maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets;\n }\n // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts\'s flow analysis.\n if (proxyUrl && proxyUrl.hostname) {\n const agentOptions = {\n maxSockets,\n keepAlive: this._keepAlive,\n proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && {\n proxyAuth: `${proxyUrl.username}:${proxyUrl.password}`\n })), { host: proxyUrl.hostname, port: proxyUrl.port })\n };\n let tunnelAgent;\n const overHttps = proxyUrl.protocol === \'https:\';\n if (usingSsl) {\n tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp;\n }\n else {\n tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp;\n }\n agent = tunnelAgent(agentOptions);\n this._proxyAgent = agent;\n }\n // if reusing agent across request and tunneling agent isn\'t assigned create a new agent\n if (this._keepAlive && !agent) {\n const options = { keepAlive: this._keepAlive, maxSockets };\n agent = usingSsl ? new https.Agent(options) : new http.Agent(options);\n this._agent = agent;\n }\n // if not using private agent and tunnel agent isn\'t setup then use global agent\n if (!agent) {\n agent = usingSsl ? https.globalAgent : http.globalAgent;\n }\n if (usingSsl && this._ignoreSslError) {\n // we don\'t want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process\n // http.RequestOptions doesn\'t expose a way to modify RequestOptions.agent.options\n // we have to cast it to any and change it directly\n agent.options = Object.assign(agent.options || {}, {\n rejectUnauthorized: false\n });\n }\n return agent;\n }\n _getProxyAgentDispatcher(parsedUrl, proxyUrl) {\n let proxyAgent;\n if (this._keepAlive) {\n proxyAgent = this._proxyAgentDispatcher;\n }\n // if agent is already assigned use that agent.\n if (proxyAgent) {\n return proxyAgent;\n }\n const usingSsl = parsedUrl.protocol === \'https:\';\n proxyAgent = new undici_1.ProxyAgent(Object.assign({ uri: proxyUrl.href, pipelining: !this._keepAlive ? 0 : 1 }, ((proxyUrl.username || proxyUrl.password) && {\n token: `${proxyUrl.username}:${proxyUrl.password}`\n })));\n this._proxyAgentDispatcher = proxyAgent;\n if (usingSsl && this._ignoreSslError) {\n // we don\'t want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process\n // http.RequestOptions doesn\'t expose a way to modify RequestOptions.agent.options\n // we have to cast it to any and change it directly\n proxyAgent.options = Object.assign(proxyAgent.options.requestTls || {}, {\n rejectUnauthorized: false\n });\n }\n return proxyAgent;\n }\n _performExponentialBackoff(retryNumber) {\n return __awaiter(this, void 0, void 0, function* () {\n retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber);\n const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber);\n return new Promise(resolve => setTimeout(() => resolve(), ms));\n });\n }\n _processResponse(res, options) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n const statusCode = res.message.statusCode || 0;\n const response = {\n statusCode,\n result: null,\n headers: {}\n };\n // not found leads to null obj returned\n if (statusCode === HttpCodes.NotFound) {\n resolve(response);\n }\n // get the result from the body\n function dateTimeDeserializer(key, value) {\n if (typeof value === \'string\') {\n const a = new Date(value);\n if (!isNaN(a.valueOf())) {\n return a;\n }\n }\n return value;\n }\n let obj;\n let contents;\n try {\n contents = yield res.readBody();\n if (contents && contents.length > 0) {\n if (options && options.deserializeDates) {\n obj = JSON.parse(contents, dateTimeDeserializer);\n }\n else {\n obj = JSON.parse(contents);\n }\n response.result = obj;\n }\n response.headers = res.message.headers;\n }\n catch (err) {\n // Invalid resource (contents not json); leaving result obj null\n }\n // note that 3xx redirects are handled by the http layer.\n if (statusCode > 299) {\n let msg;\n // if exception/error in body, attempt to get better error\n if (obj && obj.message) {\n msg = obj.message;\n }\n else if (contents && contents.length > 0) {\n // it may be the case that the exception is in the body message as string\n msg = contents;\n }\n else {\n msg = `Failed request: (${statusCode})`;\n }\n const err = new HttpClientError(msg, statusCode);\n err.result = response.result;\n reject(err);\n }\n else {\n resolve(response);\n }\n }));\n });\n }\n}\nexports.HttpClient = HttpClient;\nconst lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {});\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsa0JBQWtCO0FBQ3pFLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyx5RUFBeUU7QUFDNUc7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRCxrQ0FBa0Msa0JBQWtCLEdBQUcsa0JBQWtCO0FBQ3pFLGlCQUFpQixNQUFNLDhDQUE4QztBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQsMERBQTBEO0FBQ3ZILHNCQUFzQixrQkFBa0IsR0FBRyxrQkFBa0I7QUFDN0QsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRkFBa0Y7QUFDbEY7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RDtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxXQUFXO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEIsdUdBQXVHO0FBQ3ZHIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvaHR0cC1jbGllbnQvbGliL2luZGV4LmpzPzlkOWEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5IdHRwQ2xpZW50ID0gZXhwb3J0cy5pc0h0dHBzID0gZXhwb3J0cy5IdHRwQ2xpZW50UmVzcG9uc2UgPSBleHBvcnRzLkh0dHBDbGllbnRFcnJvciA9IGV4cG9ydHMuZ2V0UHJveHlVcmwgPSBleHBvcnRzLk1lZGlhVHlwZXMgPSBleHBvcnRzLkhlYWRlcnMgPSBleHBvcnRzLkh0dHBDb2RlcyA9IHZvaWQgMDtcbmNvbnN0IGh0dHAgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImh0dHBcIikpO1xuY29uc3QgaHR0cHMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImh0dHBzXCIpKTtcbmNvbnN0IHBtID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3Byb3h5XCIpKTtcbmNvbnN0IHR1bm5lbCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwidHVubmVsXCIpKTtcbmNvbnN0IHVuZGljaV8xID0gcmVxdWlyZShcInVuZGljaVwiKTtcbnZhciBIdHRwQ29kZXM7XG4oZnVuY3Rpb24gKEh0dHBDb2Rlcykge1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJPS1wiXSA9IDIwMF0gPSBcIk9LXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIk11bHRpcGxlQ2hvaWNlc1wiXSA9IDMwMF0gPSBcIk11bHRpcGxlQ2hvaWNlc1wiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJNb3ZlZFBlcm1hbmVudGx5XCJdID0gMzAxXSA9IFwiTW92ZWRQZXJtYW5lbnRseVwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJSZXNvdXJjZU1vdmVkXCJdID0gMzAyXSA9IFwiUmVzb3VyY2VNb3ZlZFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJTZWVPdGhlclwiXSA9IDMwM10gPSBcIlNlZU90aGVyXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIk5vdE1vZGlmaWVkXCJdID0gMzA0XSA9IFwiTm90TW9kaWZpZWRcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiVXNlUHJveHlcIl0gPSAzMDVdID0gXCJVc2VQcm94eVwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJTd2l0Y2hQcm94eVwiXSA9IDMwNl0gPSBcIlN3aXRjaFByb3h5XCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlRlbXBvcmFyeVJlZGlyZWN0XCJdID0gMzA3XSA9IFwiVGVtcG9yYXJ5UmVkaXJlY3RcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiUGVybWFuZW50UmVkaXJlY3RcIl0gPSAzMDhdID0gXCJQZXJtYW5lbnRSZWRpcmVjdFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJCYWRSZXF1ZXN0XCJdID0gNDAwXSA9IFwiQmFkUmVxdWVzdFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJVbmF1dGhvcml6ZWRcIl0gPSA0MDFdID0gXCJVbmF1dGhvcml6ZWRcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiUGF5bWVudFJlcXVpcmVkXCJdID0gNDAyXSA9IFwiUGF5bWVudFJlcXVpcmVkXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkZvcmJpZGRlblwiXSA9IDQwM10gPSBcIkZvcmJpZGRlblwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJOb3RGb3VuZFwiXSA9IDQwNF0gPSBcIk5vdEZvdW5kXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIk1ldGhvZE5vdEFsbG93ZWRcIl0gPSA0MDVdID0gXCJNZXRob2ROb3RBbGxvd2VkXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIk5vdEFjY2VwdGFibGVcIl0gPSA0MDZdID0gXCJOb3RBY2NlcHRhYmxlXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZFwiXSA9IDQwN10gPSBcIlByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJSZXF1ZXN0VGltZW91dFwiXSA9IDQwOF0gPSBcIlJlcXVlc3RUaW1lb3V0XCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkNvbmZsaWN0XCJdID0gNDA5XSA9IFwiQ29uZmxpY3RcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiR29uZVwiXSA9IDQxMF0gPSBcIkdvbmVcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiVG9vTWFueVJlcXVlc3RzXCJdID0gNDI5XSA9IFwiVG9vTWFueVJlcXVlc3RzXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkludGVybmFsU2VydmVyRXJyb3JcIl0gPSA1MDBdID0gXCJJbnRlcm5hbFNlcnZlckVycm9yXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIk5vdEltcGxlbWVudGVkXCJdID0gNTAxXSA9IFwiTm90SW1wbGVtZW50ZWRcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiQmFkR2F0ZXdheVwiXSA9IDUwMl0gPSBcIkJhZEdhdGV3YXlcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiU2VydmljZVVuYXZhaWxhYmxlXCJdID0gNTAzXSA9IFwiU2VydmljZVVuYXZhaWxhYmxlXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkdhdGV3YXlUaW1lb3V0XCJdID0gNTA0XSA9IFwiR2F0ZXdheVRpbWVvdXRcIjtcbn0pKEh0dHBDb2RlcyB8fCAoZXhwb3J0cy5IdHRwQ29kZXMgPSBIdHRwQ29kZXMgPSB7fSkpO1xudmFyIEhlYWRlcnM7XG4oZnVuY3Rpb24gKEhlYWRlcnMpIHtcbiAgICBIZWFkZXJzW1wiQWNjZXB0XCJdID0gXCJhY2NlcHRcIjtcbiAgICBIZWFkZXJzW1wiQ29udGVudFR5cGVcIl0gPSBcImNvbnRlbnQtdHlwZVwiO1xufSkoSGVhZGVycyB8fCAoZXhwb3J0cy5IZWFkZXJzID0gSGVhZGVycyA9IHt9KSk7XG52YXIgTWVkaWFUeXBlcztcbihmdW5jdGlvbiAoTWVkaWFUeXBlcykge1xuICAgIE1lZGlhVHlwZXNbXCJBcHBsaWNhdGlvbkpzb25cIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbn0pKE1lZGlhVHlwZXMgfHwgKGV4cG9ydHMuTWVkaWFUeXBlcyA9IE1lZGlhVHlwZXMgPSB7fSkpO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBwcm94eSBVUkwsIGRlcGVuZGluZyB1cG9uIHRoZSBzdXBwbGllZCB1cmwgYW5kIHByb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqIEBwYXJhbSBzZXJ2ZXJVcmwgIFRoZSBzZXJ2ZXIgVVJMIHdoZXJlIHRoZSByZXF1ZXN0IHdpbGwgYmUgc2VudC4gRm9yIGV4YW1wbGUsIGh0dHBzOi8vYXBpLmdpdGh1Yi5jb21cbiAqL1xuZnVuY3Rpb24gZ2V0UHJveHlVcmwoc2VydmVyVXJsKSB7XG4gICAgY29uc3QgcHJveHlVcmwgPSBwbS5nZXRQcm94eVVybChuZXcgVVJMKHNlcnZlclVybCkpO1xuICAgIHJldHVybiBwcm94eVVybCA/IHByb3h5VXJsLmhyZWYgOiAnJztcbn1cbmV4cG9ydHMuZ2V0UHJveHlVcmwgPSBnZXRQcm94eVVybDtcbmNvbnN0IEh0dHBSZWRpcmVjdENvZGVzID0gW1xuICAgIEh0dHBDb2Rlcy5Nb3ZlZFBlcm1hbmVudGx5LFxuICAgIEh0dHBDb2Rlcy5SZXNvdXJjZU1vdmVkLFxuICAgIEh0dHBDb2Rlcy5TZWVPdGhlcixcbiAgICBIdHRwQ29kZXMuVGVtcG9yYXJ5UmVkaXJlY3QsXG4gICAgSHR0cENvZGVzLlBlcm1hbmVudFJlZGlyZWN0XG5dO1xuY29uc3QgSHR0cFJlc3BvbnNlUmV0cnlDb2RlcyA9IFtcbiAgICBIdHRwQ29kZXMuQmFkR2F0ZXdheSxcbiAgICBIdHRwQ29kZXMuU2VydmljZVVuYXZhaWxhYmxlLFxuICAgIEh0dHBDb2Rlcy5HYXRld2F5VGltZW91dFxuXTtcbmNvbnN0IFJldHJ5YWJsZUh0dHBWZXJicyA9IFsnT1BUSU9OUycsICdHRVQnLCAnREVMRVRFJywgJ0hFQUQnXTtcbmNvbnN0IEV4cG9uZW50aWFsQmFja29mZkNlaWxpbmcgPSAxMDtcbmNvbnN0IEV4cG9uZW50aWFsQmFja29mZlRpbWVTbGljZSA9IDU7XG5jbGFzcyBIdHRwQ2xpZW50RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzQ29kZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gJ0h0dHBDbGllbnRFcnJvcic7XG4gICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBIdHRwQ2xpZW50RXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkh0dHBDbGllbnRFcnJvciA9IEh0dHBDbGllbnRFcnJvcjtcbmNsYXNzIEh0dHBDbGllbnRSZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cbiAgICByZWFkQm9keSgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGxldCBvdXRwdXQgPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEJ1ZmZlci5jb25jYXQoW291dHB1dCwgY2h1bmtdKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShvdXRwdXQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWFkQm9keUJ1ZmZlcigpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZS5vbignZGF0YScsIChjaHVuaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoQnVmZmVyLmNvbmNhdChjaHVua3MpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5IdHRwQ2xpZW50UmVzcG9uc2UgPSBIdHRwQ2xpZW50UmVzcG9uc2U7XG5mdW5jdGlvbiBpc0h0dHBzKHJlcXVlc3RVcmwpIHtcbiAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHJlcXVlc3RVcmwpO1xuICAgIHJldHVybiBwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwczonO1xufVxuZXhwb3J0cy5pc0h0dHBzID0gaXNIdHRwcztcbmNsYXNzIEh0dHBDbGllbnQge1xuICAgIGNvbnN0cnVjdG9yKHVzZXJBZ2VudCwgaGFuZGxlcnMsIHJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX2lnbm9yZVNzbEVycm9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2FsbG93UmVkaXJlY3RzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fYWxsb3dSZWRpcmVjdERvd25ncmFkZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9tYXhSZWRpcmVjdHMgPSA1MDtcbiAgICAgICAgdGhpcy5fYWxsb3dSZXRyaWVzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX21heFJldHJpZXMgPSAxO1xuICAgICAgICB0aGlzLl9rZWVwQWxpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZGlzcG9zZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51c2VyQWdlbnQgPSB1c2VyQWdlbnQ7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBoYW5kbGVycyB8fCBbXTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0T3B0aW9ucyA9IHJlcXVlc3RPcHRpb25zO1xuICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5pZ25vcmVTc2xFcnJvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faWdub3JlU3NsRXJyb3IgPSByZXF1ZXN0T3B0aW9ucy5pZ25vcmVTc2xFcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3NvY2tldFRpbWVvdXQgPSByZXF1ZXN0T3B0aW9ucy5zb2NrZXRUaW1lb3V0O1xuICAgICAgICAgICAgaWYgKHJlcXVlc3RPcHRpb25zLmFsbG93UmVkaXJlY3RzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hbGxvd1JlZGlyZWN0cyA9IHJlcXVlc3RPcHRpb25zLmFsbG93UmVkaXJlY3RzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcXVlc3RPcHRpb25zLmFsbG93UmVkaXJlY3REb3duZ3JhZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FsbG93UmVkaXJlY3REb3duZ3JhZGUgPSByZXF1ZXN0T3B0aW9ucy5hbGxvd1JlZGlyZWN0RG93bmdyYWRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcXVlc3RPcHRpb25zLm1heFJlZGlyZWN0cyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4UmVkaXJlY3RzID0gTWF0aC5tYXgocmVxdWVzdE9wdGlvbnMubWF4UmVkaXJlY3RzLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5rZWVwQWxpdmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2tlZXBBbGl2ZSA9IHJlcXVlc3RPcHRpb25zLmtlZXBBbGl2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5hbGxvd1JldHJpZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FsbG93UmV0cmllcyA9IHJlcXVlc3RPcHRpb25zLmFsbG93UmV0cmllcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5tYXhSZXRyaWVzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhSZXRyaWVzID0gcmVxdWVzdE9wdGlvbnMubWF4UmV0cmllcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBvcHRpb25zKHJlcXVlc3RVcmwsIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdPUFRJT05TJywgcmVxdWVzdFVybCwgbnVsbCwgYWRkaXRpb25hbEhlYWRlcnMgfHwge30pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0KHJlcXVlc3RVcmwsIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdHRVQnLCByZXF1ZXN0VXJsLCBudWxsLCBhZGRpdGlvbmFsSGVhZGVycyB8fCB7fSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkZWwocmVxdWVzdFVybCwgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0RFTEVURScsIHJlcXVlc3RVcmwsIG51bGwsIGFkZGl0aW9uYWxIZWFkZXJzIHx8IHt9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBvc3QocmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ1BPU1QnLCByZXF1ZXN0VXJsLCBkYXRhLCBhZGRpdGlvbmFsSGVhZGVycyB8fCB7fSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwYXRjaChyZXF1ZXN0VXJsLCBkYXRhLCBhZGRpdGlvbmFsSGVhZGVycykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUEFUQ0gnLCByZXF1ZXN0VXJsLCBkYXRhLCBhZGRpdGlvbmFsSGVhZGVycyB8fCB7fSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdXQocmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ1BVVCcsIHJlcXVlc3RVcmwsIGRhdGEsIGFkZGl0aW9uYWxIZWFkZXJzIHx8IHt9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGhlYWQocmVxdWVzdFVybCwgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0hFQUQnLCByZXF1ZXN0VXJsLCBudWxsLCBhZGRpdGlvbmFsSGVhZGVycyB8fCB7fSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZW5kU3RyZWFtKHZlcmIsIHJlcXVlc3RVcmwsIHN0cmVhbSwgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QodmVyYiwgcmVxdWVzdFVybCwgc3RyZWFtLCBhZGRpdGlvbmFsSGVhZGVycyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgdHlwZWQgb2JqZWN0IGZyb20gYW4gZW5kcG9pbnRcbiAgICAgKiBCZSBhd2FyZSB0aGF0IG5vdCBmb3VuZCByZXR1cm5zIGEgbnVsbC4gIE90aGVyIGVycm9ycyAoNHh4LCA1eHgpIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAqL1xuICAgIGdldEpzb24ocmVxdWVzdFVybCwgYWRkaXRpb25hbEhlYWRlcnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgYWRkaXRpb25hbEhlYWRlcnNbSGVhZGVycy5BY2NlcHRdID0gdGhpcy5fZ2V0RXhpc3RpbmdPckRlZmF1bHRIZWFkZXIoYWRkaXRpb25hbEhlYWRlcnMsIEhlYWRlcnMuQWNjZXB0LCBNZWRpYVR5cGVzLkFwcGxpY2F0aW9uSnNvbik7XG4gICAgICAgICAgICBjb25zdCByZXMgPSB5aWVsZCB0aGlzLmdldChyZXF1ZXN0VXJsLCBhZGRpdGlvbmFsSGVhZGVycyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1Jlc3BvbnNlKHJlcywgdGhpcy5yZXF1ZXN0T3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwb3N0SnNvbihyZXF1ZXN0VXJsLCBvYmosIGFkZGl0aW9uYWxIZWFkZXJzID0ge30pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnN0cmluZ2lmeShvYmosIG51bGwsIDIpO1xuICAgICAgICAgICAgYWRkaXRpb25hbEhlYWRlcnNbSGVhZGVycy5BY2NlcHRdID0gdGhpcy5fZ2V0RXhpc3RpbmdPckRlZmF1bHRIZWFkZXIoYWRkaXRpb25hbEhlYWRlcnMsIEhlYWRlcnMuQWNjZXB0LCBNZWRpYVR5cGVzLkFwcGxpY2F0aW9uSnNvbik7XG4gICAgICAgICAgICBhZGRpdGlvbmFsSGVhZGVyc1tIZWFkZXJzLkNvbnRlbnRUeXBlXSA9IHRoaXMuX2dldEV4aXN0aW5nT3JEZWZhdWx0SGVhZGVyKGFkZGl0aW9uYWxIZWFkZXJzLCBIZWFkZXJzLkNvbnRlbnRUeXBlLCBNZWRpYVR5cGVzLkFwcGxpY2F0aW9uSnNvbik7XG4gICAgICAgICAgICBjb25zdCByZXMgPSB5aWVsZCB0aGlzLnBvc3QocmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NSZXNwb25zZShyZXMsIHRoaXMucmVxdWVzdE9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHV0SnNvbihyZXF1ZXN0VXJsLCBvYmosIGFkZGl0aW9uYWxIZWFkZXJzID0ge30pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnN0cmluZ2lmeShvYmosIG51bGwsIDIpO1xuICAgICAgICAgICAgYWRkaXRpb25hbEhlYWRlcnNbSGVhZGVycy5BY2NlcHRdID0gdGhpcy5fZ2V0RXhpc3RpbmdPckRlZmF1bHRIZWFkZXIoYWRkaXRpb25hbEhlYWRlcnMsIEhlYWRlcnMuQWNjZXB0LCBNZWRpYVR5cGVzLkFwcGxpY2F0aW9uSnNvbik7XG4gICAgICAgICAgICBhZGRpdGlvbmFsSGVhZGVyc1tIZWFkZXJzLkNvbnRlbnRUeXBlXSA9IHRoaXMuX2dldEV4aXN0aW5nT3JEZWZhdWx0SGVhZGVyKGFkZGl0aW9uYWxIZWFkZXJzLCBIZWFkZXJzLkNvbnRlbnRUeXBlLCBNZWRpYVR5cGVzLkFwcGxpY2F0aW9uSnNvbik7XG4gICAgICAgICAgICBjb25zdCByZXMgPSB5aWVsZCB0aGlzLnB1dChyZXF1ZXN0VXJsLCBkYXRhLCBhZGRpdGlvbmFsSGVhZGVycyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1Jlc3BvbnNlKHJlcywgdGhpcy5yZXF1ZXN0T3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwYXRjaEpzb24ocmVxdWVzdFVybCwgb2JqLCBhZGRpdGlvbmFsSGVhZGVycyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAyKTtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxIZWFkZXJzW0hlYWRlcnMuQWNjZXB0XSA9IHRoaXMuX2dldEV4aXN0aW5nT3JEZWZhdWx0SGVhZGVyKGFkZGl0aW9uYWxIZWFkZXJzLCBIZWFkZXJzLkFjY2VwdCwgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgYWRkaXRpb25hbEhlYWRlcnNbSGVhZGVycy5Db250ZW50VHlwZV0gPSB0aGlzLl9nZXRFeGlzdGluZ09yRGVmYXVsdEhlYWRlcihhZGRpdGlvbmFsSGVhZGVycywgSGVhZGVycy5Db250ZW50VHlwZSwgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgY29uc3QgcmVzID0geWllbGQgdGhpcy5wYXRjaChyZXF1ZXN0VXJsLCBkYXRhLCBhZGRpdGlvbmFsSGVhZGVycyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1Jlc3BvbnNlKHJlcywgdGhpcy5yZXF1ZXN0T3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhIHJhdyBodHRwIHJlcXVlc3QuXG4gICAgICogQWxsIG90aGVyIG1ldGhvZHMgc3VjaCBhcyBnZXQsIHBvc3QsIHBhdGNoLCBhbmQgcmVxdWVzdCB1bHRpbWF0ZWx5IGNhbGwgdGhpcy5cbiAgICAgKiBQcmVmZXIgZ2V0LCBkZWwsIHBvc3QgYW5kIHBhdGNoXG4gICAgICovXG4gICAgcmVxdWVzdCh2ZXJiLCByZXF1ZXN0VXJsLCBkYXRhLCBoZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NsaWVudCBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTChyZXF1ZXN0VXJsKTtcbiAgICAgICAgICAgIGxldCBpbmZvID0gdGhpcy5fcHJlcGFyZVJlcXVlc3QodmVyYiwgcGFyc2VkVXJsLCBoZWFkZXJzKTtcbiAgICAgICAgICAgIC8vIE9ubHkgcGVyZm9ybSByZXRyaWVzIG9uIHJlYWRzIHNpbmNlIHdyaXRlcyBtYXkgbm90IGJlIGlkZW1wb3RlbnQuXG4gICAgICAgICAgICBjb25zdCBtYXhUcmllcyA9IHRoaXMuX2FsbG93UmV0cmllcyAmJiBSZXRyeWFibGVIdHRwVmVyYnMuaW5jbHVkZXModmVyYilcbiAgICAgICAgICAgICAgICA/IHRoaXMuX21heFJldHJpZXMgKyAxXG4gICAgICAgICAgICAgICAgOiAxO1xuICAgICAgICAgICAgbGV0IG51bVRyaWVzID0gMDtcbiAgICAgICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIHRoaXMucmVxdWVzdFJhdyhpbmZvLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGFuIGF1dGhlbnRpY2F0aW9uIGNoYWxsZW5nZVxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJlxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlICYmXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2Uuc3RhdHVzQ29kZSA9PT0gSHR0cENvZGVzLlVuYXV0aG9yaXplZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXV0aGVudGljYXRpb25IYW5kbGVyO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5oYW5kbGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIuY2FuSGFuZGxlQXV0aGVudGljYXRpb24ocmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb25IYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoYXV0aGVudGljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXV0aGVudGljYXRpb25IYW5kbGVyLmhhbmRsZUF1dGhlbnRpY2F0aW9uKHRoaXMsIGluZm8sIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhbiB1bmF1dGhvcml6ZWQgcmVzcG9uc2UgYnV0IGhhdmUgbm8gaGFuZGxlcnMgdG8gaGFuZGxlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IHRoZSByZXNwb25zZSByZXR1cm4gdG8gdGhlIGNhbGxlci5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcmVkaXJlY3RzUmVtYWluaW5nID0gdGhpcy5fbWF4UmVkaXJlY3RzO1xuICAgICAgICAgICAgICAgIHdoaWxlIChyZXNwb25zZS5tZXNzYWdlLnN0YXR1c0NvZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgSHR0cFJlZGlyZWN0Q29kZXMuaW5jbHVkZXMocmVzcG9uc2UubWVzc2FnZS5zdGF0dXNDb2RlKSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hbGxvd1JlZGlyZWN0cyAmJlxuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdHNSZW1haW5pbmcgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0VXJsID0gcmVzcG9uc2UubWVzc2FnZS5oZWFkZXJzWydsb2NhdGlvbiddO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZGlyZWN0VXJsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSdzIG5vIGxvY2F0aW9uIHRvIHJlZGlyZWN0IHRvLCB3ZSB3b24ndFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkUmVkaXJlY3RVcmwgPSBuZXcgVVJMKHJlZGlyZWN0VXJsKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZFVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZFVybC5wcm90b2NvbCAhPT0gcGFyc2VkUmVkaXJlY3RVcmwucHJvdG9jb2wgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLl9hbGxvd1JlZGlyZWN0RG93bmdyYWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZGlyZWN0IGZyb20gSFRUUFMgdG8gSFRUUCBwcm90b2NvbC4gVGhpcyBkb3duZ3JhZGUgaXMgbm90IGFsbG93ZWQgZm9yIHNlY3VyaXR5IHJlYXNvbnMuIElmIHlvdSB3YW50IHRvIGFsbG93IHRoaXMgYmVoYXZpb3IsIHNldCB0aGUgYWxsb3dSZWRpcmVjdERvd25ncmFkZSBvcHRpb24gdG8gdHJ1ZS4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGZpbmlzaCByZWFkaW5nIHRoZSByZXNwb25zZSBiZWZvcmUgcmVhc3NpZ25pbmcgcmVzcG9uc2VcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggd2lsbCBsZWFrIHRoZSBvcGVuIHNvY2tldC5cbiAgICAgICAgICAgICAgICAgICAgeWllbGQgcmVzcG9uc2UucmVhZEJvZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RyaXAgYXV0aG9yaXphdGlvbiBoZWFkZXIgaWYgcmVkaXJlY3RlZCB0byBhIGRpZmZlcmVudCBob3N0bmFtZVxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkUmVkaXJlY3RVcmwuaG9zdG5hbWUgIT09IHBhcnNlZFVybC5ob3N0bmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBoZWFkZXIgaW4gaGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlYWRlciBuYW1lcyBhcmUgY2FzZSBpbnNlbnNpdGl2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXIudG9Mb3dlckNhc2UoKSA9PT0gJ2F1dGhvcml6YXRpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBoZWFkZXJzW2hlYWRlcl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGxldCdzIG1ha2UgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgbmV3IHJlZGlyZWN0VXJsXG4gICAgICAgICAgICAgICAgICAgIGluZm8gPSB0aGlzLl9wcmVwYXJlUmVxdWVzdCh2ZXJiLCBwYXJzZWRSZWRpcmVjdFVybCwgaGVhZGVycyk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgdGhpcy5yZXF1ZXN0UmF3KGluZm8sIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdHNSZW1haW5pbmctLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5tZXNzYWdlLnN0YXR1c0NvZGUgfHxcbiAgICAgICAgICAgICAgICAgICAgIUh0dHBSZXNwb25zZVJldHJ5Q29kZXMuaW5jbHVkZXMocmVzcG9uc2UubWVzc2FnZS5zdGF0dXNDb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBub3QgYSByZXRyeSBjb2RlLCByZXR1cm4gaW1tZWRpYXRlbHkgaW5zdGVhZCBvZiByZXRyeWluZ1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG51bVRyaWVzICs9IDE7XG4gICAgICAgICAgICAgICAgaWYgKG51bVRyaWVzIDwgbWF4VHJpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgcmVzcG9uc2UucmVhZEJvZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgdGhpcy5fcGVyZm9ybUV4cG9uZW50aWFsQmFja29mZihudW1Ucmllcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAobnVtVHJpZXMgPCBtYXhUcmllcyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOZWVkcyB0byBiZSBjYWxsZWQgaWYga2VlcEFsaXZlIGlzIHNldCB0byB0cnVlIGluIHJlcXVlc3Qgb3B0aW9ucy5cbiAgICAgKi9cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5fYWdlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2FnZW50LmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kaXNwb3NlZCA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJhdyByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBpbmZvXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKi9cbiAgICByZXF1ZXN0UmF3KGluZm8sIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FsbGJhY2tGb3JSZXN1bHQoZXJyLCByZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYGVycmAgaXMgbm90IHBhc3NlZCwgdGhlbiBgcmVzYCBtdXN0IGJlIHBhc3NlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Vua25vd24gZXJyb3InKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0UmF3V2l0aENhbGxiYWNrKGluZm8sIGRhdGEsIGNhbGxiYWNrRm9yUmVzdWx0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmF3IHJlcXVlc3Qgd2l0aCBjYWxsYmFjay5cbiAgICAgKiBAcGFyYW0gaW5mb1xuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICogQHBhcmFtIG9uUmVzdWx0XG4gICAgICovXG4gICAgcmVxdWVzdFJhd1dpdGhDYWxsYmFjayhpbmZvLCBkYXRhLCBvblJlc3VsdCkge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoIWluZm8ub3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgaW5mby5vcHRpb25zLmhlYWRlcnMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluZm8ub3B0aW9ucy5oZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gQnVmZmVyLmJ5dGVMZW5ndGgoZGF0YSwgJ3V0ZjgnKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2FsbGJhY2tDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlUmVzdWx0KGVyciwgcmVzKSB7XG4gICAgICAgICAgICBpZiAoIWNhbGxiYWNrQ2FsbGVkKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2tDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIG9uUmVzdWx0KGVyciwgcmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXEgPSBpbmZvLmh0dHBNb2R1bGUucmVxdWVzdChpbmZvLm9wdGlvbnMsIChtc2cpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IG5ldyBIdHRwQ2xpZW50UmVzcG9uc2UobXNnKTtcbiAgICAgICAgICAgIGhhbmRsZVJlc3VsdCh1bmRlZmluZWQsIHJlcyk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgc29ja2V0O1xuICAgICAgICByZXEub24oJ3NvY2tldCcsIHNvY2sgPT4ge1xuICAgICAgICAgICAgc29ja2V0ID0gc29jaztcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIElmIHdlIGV2ZXIgZ2V0IGRpc2Nvbm5lY3RlZCwgd2Ugd2FudCB0aGUgc29ja2V0IHRvIHRpbWVvdXQgZXZlbnR1YWxseVxuICAgICAgICByZXEuc2V0VGltZW91dCh0aGlzLl9zb2NrZXRUaW1lb3V0IHx8IDMgKiA2MDAwMCwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNvY2tldCkge1xuICAgICAgICAgICAgICAgIHNvY2tldC5lbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZVJlc3VsdChuZXcgRXJyb3IoYFJlcXVlc3QgdGltZW91dDogJHtpbmZvLm9wdGlvbnMucGF0aH1gKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXEub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgLy8gZXJyIGhhcyBzdGF0dXNDb2RlIHByb3BlcnR5XG4gICAgICAgICAgICAvLyByZXMgc2hvdWxkIGhhdmUgaGVhZGVyc1xuICAgICAgICAgICAgaGFuZGxlUmVzdWx0KGVycik7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJlcS53cml0ZShkYXRhLCAndXRmOCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhICYmIHR5cGVvZiBkYXRhICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZGF0YS5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVxLmVuZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkYXRhLnBpcGUocmVxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcS5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuIGh0dHAgYWdlbnQuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHdoZW4geW91IG5lZWQgYW4gaHR0cCBhZ2VudCB0aGF0IGhhbmRsZXNcbiAgICAgKiByb3V0aW5nIHRocm91Z2ggYSBwcm94eSBzZXJ2ZXIgLSBkZXBlbmRpbmcgdXBvbiB0aGUgdXJsIGFuZCBwcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gICAgICogQHBhcmFtIHNlcnZlclVybCAgVGhlIHNlcnZlciBVUkwgd2hlcmUgdGhlIHJlcXVlc3Qgd2lsbCBiZSBzZW50LiBGb3IgZXhhbXBsZSwgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbVxuICAgICAqL1xuICAgIGdldEFnZW50KHNlcnZlclVybCkge1xuICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHNlcnZlclVybCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRBZ2VudChwYXJzZWRVcmwpO1xuICAgIH1cbiAgICBnZXRBZ2VudERpc3BhdGNoZXIoc2VydmVyVXJsKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwoc2VydmVyVXJsKTtcbiAgICAgICAgY29uc3QgcHJveHlVcmwgPSBwbS5nZXRQcm94eVVybChwYXJzZWRVcmwpO1xuICAgICAgICBjb25zdCB1c2VQcm94eSA9IHByb3h5VXJsICYmIHByb3h5VXJsLmhvc3RuYW1lO1xuICAgICAgICBpZiAoIXVzZVByb3h5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFByb3h5QWdlbnREaXNwYXRjaGVyKHBhcnNlZFVybCwgcHJveHlVcmwpO1xuICAgIH1cbiAgICBfcHJlcGFyZVJlcXVlc3QobWV0aG9kLCByZXF1ZXN0VXJsLCBoZWFkZXJzKSB7XG4gICAgICAgIGNvbnN0IGluZm8gPSB7fTtcbiAgICAgICAgaW5mby5wYXJzZWRVcmwgPSByZXF1ZXN0VXJsO1xuICAgICAgICBjb25zdCB1c2luZ1NzbCA9IGluZm8ucGFyc2VkVXJsLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICAgICAgaW5mby5odHRwTW9kdWxlID0gdXNpbmdTc2wgPyBodHRwcyA6IGh0dHA7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRQb3J0ID0gdXNpbmdTc2wgPyA0NDMgOiA4MDtcbiAgICAgICAgaW5mby5vcHRpb25zID0ge307XG4gICAgICAgIGluZm8ub3B0aW9ucy5ob3N0ID0gaW5mby5wYXJzZWRVcmwuaG9zdG5hbWU7XG4gICAgICAgIGluZm8ub3B0aW9ucy5wb3J0ID0gaW5mby5wYXJzZWRVcmwucG9ydFxuICAgICAgICAgICAgPyBwYXJzZUludChpbmZvLnBhcnNlZFVybC5wb3J0KVxuICAgICAgICAgICAgOiBkZWZhdWx0UG9ydDtcbiAgICAgICAgaW5mby5vcHRpb25zLnBhdGggPVxuICAgICAgICAgICAgKGluZm8ucGFyc2VkVXJsLnBhdGhuYW1lIHx8ICcnKSArIChpbmZvLnBhcnNlZFVybC5zZWFyY2ggfHwgJycpO1xuICAgICAgICBpbmZvLm9wdGlvbnMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICBpbmZvLm9wdGlvbnMuaGVhZGVycyA9IHRoaXMuX21lcmdlSGVhZGVycyhoZWFkZXJzKTtcbiAgICAgICAgaWYgKHRoaXMudXNlckFnZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGluZm8ub3B0aW9ucy5oZWFkZXJzWyd1c2VyLWFnZW50J10gPSB0aGlzLnVzZXJBZ2VudDtcbiAgICAgICAgfVxuICAgICAgICBpbmZvLm9wdGlvbnMuYWdlbnQgPSB0aGlzLl9nZXRBZ2VudChpbmZvLnBhcnNlZFVybCk7XG4gICAgICAgIC8vIGdpdmVzIGhhbmRsZXJzIGFuIG9wcG9ydHVuaXR5IHRvIHBhcnRpY2lwYXRlXG4gICAgICAgIGlmICh0aGlzLmhhbmRsZXJzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5oYW5kbGVycykge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIucHJlcGFyZVJlcXVlc3QoaW5mby5vcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5mbztcbiAgICB9XG4gICAgX21lcmdlSGVhZGVycyhoZWFkZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3RPcHRpb25zICYmIHRoaXMucmVxdWVzdE9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGxvd2VyY2FzZUtleXModGhpcy5yZXF1ZXN0T3B0aW9ucy5oZWFkZXJzKSwgbG93ZXJjYXNlS2V5cyhoZWFkZXJzIHx8IHt9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvd2VyY2FzZUtleXMoaGVhZGVycyB8fCB7fSk7XG4gICAgfVxuICAgIF9nZXRFeGlzdGluZ09yRGVmYXVsdEhlYWRlcihhZGRpdGlvbmFsSGVhZGVycywgaGVhZGVyLCBfZGVmYXVsdCkge1xuICAgICAgICBsZXQgY2xpZW50SGVhZGVyO1xuICAgICAgICBpZiAodGhpcy5yZXF1ZXN0T3B0aW9ucyAmJiB0aGlzLnJlcXVlc3RPcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIGNsaWVudEhlYWRlciA9IGxvd2VyY2FzZUtleXModGhpcy5yZXF1ZXN0T3B0aW9ucy5oZWFkZXJzKVtoZWFkZXJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRpdGlvbmFsSGVhZGVyc1toZWFkZXJdIHx8IGNsaWVudEhlYWRlciB8fCBfZGVmYXVsdDtcbiAgICB9XG4gICAgX2dldEFnZW50KHBhcnNlZFVybCkge1xuICAgICAgICBsZXQgYWdlbnQ7XG4gICAgICAgIGNvbnN0IHByb3h5VXJsID0gcG0uZ2V0UHJveHlVcmwocGFyc2VkVXJsKTtcbiAgICAgICAgY29uc3QgdXNlUHJveHkgPSBwcm94eVVybCAmJiBwcm94eVVybC5ob3N0bmFtZTtcbiAgICAgICAgaWYgKHRoaXMuX2tlZXBBbGl2ZSAmJiB1c2VQcm94eSkge1xuICAgICAgICAgICAgYWdlbnQgPSB0aGlzLl9wcm94eUFnZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9rZWVwQWxpdmUgJiYgIXVzZVByb3h5KSB7XG4gICAgICAgICAgICBhZ2VudCA9IHRoaXMuX2FnZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGFnZW50IGlzIGFscmVhZHkgYXNzaWduZWQgdXNlIHRoYXQgYWdlbnQuXG4gICAgICAgIGlmIChhZ2VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGFnZW50O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVzaW5nU3NsID0gcGFyc2VkVXJsLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICAgICAgbGV0IG1heFNvY2tldHMgPSAxMDA7XG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgICAgICBtYXhTb2NrZXRzID0gdGhpcy5yZXF1ZXN0T3B0aW9ucy5tYXhTb2NrZXRzIHx8IGh0dHAuZ2xvYmFsQWdlbnQubWF4U29ja2V0cztcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGlzIGlzIGB1c2VQcm94eWAgYWdhaW4sIGJ1dCB3ZSBuZWVkIHRvIGNoZWNrIGBwcm94eVVSbGAgZGlyZWN0bHkgZm9yIFR5cGVTY3JpcHRzJ3MgZmxvdyBhbmFseXNpcy5cbiAgICAgICAgaWYgKHByb3h5VXJsICYmIHByb3h5VXJsLmhvc3RuYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBhZ2VudE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgbWF4U29ja2V0cyxcbiAgICAgICAgICAgICAgICBrZWVwQWxpdmU6IHRoaXMuX2tlZXBBbGl2ZSxcbiAgICAgICAgICAgICAgICBwcm94eTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAoKHByb3h5VXJsLnVzZXJuYW1lIHx8IHByb3h5VXJsLnBhc3N3b3JkKSAmJiB7XG4gICAgICAgICAgICAgICAgICAgIHByb3h5QXV0aDogYCR7cHJveHlVcmwudXNlcm5hbWV9OiR7cHJveHlVcmwucGFzc3dvcmR9YFxuICAgICAgICAgICAgICAgIH0pKSwgeyBob3N0OiBwcm94eVVybC5ob3N0bmFtZSwgcG9ydDogcHJveHlVcmwucG9ydCB9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCB0dW5uZWxBZ2VudDtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJIdHRwcyA9IHByb3h5VXJsLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICAgICAgICAgIGlmICh1c2luZ1NzbCkge1xuICAgICAgICAgICAgICAgIHR1bm5lbEFnZW50ID0gb3Zlckh0dHBzID8gdHVubmVsLmh0dHBzT3Zlckh0dHBzIDogdHVubmVsLmh0dHBzT3Zlckh0dHA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0dW5uZWxBZ2VudCA9IG92ZXJIdHRwcyA/IHR1bm5lbC5odHRwT3Zlckh0dHBzIDogdHVubmVsLmh0dHBPdmVySHR0cDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFnZW50ID0gdHVubmVsQWdlbnQoYWdlbnRPcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuX3Byb3h5QWdlbnQgPSBhZ2VudDtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiByZXVzaW5nIGFnZW50IGFjcm9zcyByZXF1ZXN0IGFuZCB0dW5uZWxpbmcgYWdlbnQgaXNuJ3QgYXNzaWduZWQgY3JlYXRlIGEgbmV3IGFnZW50XG4gICAgICAgIGlmICh0aGlzLl9rZWVwQWxpdmUgJiYgIWFnZW50KSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0geyBrZWVwQWxpdmU6IHRoaXMuX2tlZXBBbGl2ZSwgbWF4U29ja2V0cyB9O1xuICAgICAgICAgICAgYWdlbnQgPSB1c2luZ1NzbCA/IG5ldyBodHRwcy5BZ2VudChvcHRpb25zKSA6IG5ldyBodHRwLkFnZW50KG9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5fYWdlbnQgPSBhZ2VudDtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBub3QgdXNpbmcgcHJpdmF0ZSBhZ2VudCBhbmQgdHVubmVsIGFnZW50IGlzbid0IHNldHVwIHRoZW4gdXNlIGdsb2JhbCBhZ2VudFxuICAgICAgICBpZiAoIWFnZW50KSB7XG4gICAgICAgICAgICBhZ2VudCA9IHVzaW5nU3NsID8gaHR0cHMuZ2xvYmFsQWdlbnQgOiBodHRwLmdsb2JhbEFnZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICh1c2luZ1NzbCAmJiB0aGlzLl9pZ25vcmVTc2xFcnJvcikge1xuICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBzZXQgTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRD0wIHNpbmNlIHRoYXQgd2lsbCBhZmZlY3QgcmVxdWVzdCBmb3IgZW50aXJlIHByb2Nlc3NcbiAgICAgICAgICAgIC8vIGh0dHAuUmVxdWVzdE9wdGlvbnMgZG9lc24ndCBleHBvc2UgYSB3YXkgdG8gbW9kaWZ5IFJlcXVlc3RPcHRpb25zLmFnZW50Lm9wdGlvbnNcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gY2FzdCBpdCB0byBhbnkgYW5kIGNoYW5nZSBpdCBkaXJlY3RseVxuICAgICAgICAgICAgYWdlbnQub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oYWdlbnQub3B0aW9ucyB8fCB7fSwge1xuICAgICAgICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZ2VudDtcbiAgICB9XG4gICAgX2dldFByb3h5QWdlbnREaXNwYXRjaGVyKHBhcnNlZFVybCwgcHJveHlVcmwpIHtcbiAgICAgICAgbGV0IHByb3h5QWdlbnQ7XG4gICAgICAgIGlmICh0aGlzLl9rZWVwQWxpdmUpIHtcbiAgICAgICAgICAgIHByb3h5QWdlbnQgPSB0aGlzLl9wcm94eUFnZW50RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBhZ2VudCBpcyBhbHJlYWR5IGFzc2lnbmVkIHVzZSB0aGF0IGFnZW50LlxuICAgICAgICBpZiAocHJveHlBZ2VudCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb3h5QWdlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNpbmdTc2wgPSBwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwczonO1xuICAgICAgICBwcm94eUFnZW50ID0gbmV3IHVuZGljaV8xLlByb3h5QWdlbnQoT2JqZWN0LmFzc2lnbih7IHVyaTogcHJveHlVcmwuaHJlZiwgcGlwZWxpbmluZzogIXRoaXMuX2tlZXBBbGl2ZSA/IDAgOiAxIH0sICgocHJveHlVcmwudXNlcm5hbWUgfHwgcHJveHlVcmwucGFzc3dvcmQpICYmIHtcbiAgICAgICAgICAgIHRva2VuOiBgJHtwcm94eVVybC51c2VybmFtZX06JHtwcm94eVVybC5wYXNzd29yZH1gXG4gICAgICAgIH0pKSk7XG4gICAgICAgIHRoaXMuX3Byb3h5QWdlbnREaXNwYXRjaGVyID0gcHJveHlBZ2VudDtcbiAgICAgICAgaWYgKHVzaW5nU3NsICYmIHRoaXMuX2lnbm9yZVNzbEVycm9yKSB7XG4gICAgICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIHNldCBOT0RFX1RMU19SRUpFQ1RfVU5BVVRIT1JJWkVEPTAgc2luY2UgdGhhdCB3aWxsIGFmZmVjdCByZXF1ZXN0IGZvciBlbnRpcmUgcHJvY2Vzc1xuICAgICAgICAgICAgLy8gaHR0cC5SZXF1ZXN0T3B0aW9ucyBkb2Vzbid0IGV4cG9zZSBhIHdheSB0byBtb2RpZnkgUmVxdWVzdE9wdGlvbnMuYWdlbnQub3B0aW9uc1xuICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBjYXN0IGl0IHRvIGFueSBhbmQgY2hhbmdlIGl0IGRpcmVjdGx5XG4gICAgICAgICAgICBwcm94eUFnZW50Lm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHByb3h5QWdlbnQub3B0aW9ucy5yZXF1ZXN0VGxzIHx8IHt9LCB7XG4gICAgICAgICAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3h5QWdlbnQ7XG4gICAgfVxuICAgIF9wZXJmb3JtRXhwb25lbnRpYWxCYWNrb2ZmKHJldHJ5TnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXRyeU51bWJlciA9IE1hdGgubWluKEV4cG9uZW50aWFsQmFja29mZkNlaWxpbmcsIHJldHJ5TnVtYmVyKTtcbiAgICAgICAgICAgIGNvbnN0IG1zID0gRXhwb25lbnRpYWxCYWNrb2ZmVGltZVNsaWNlICogTWF0aC5wb3coMiwgcmV0cnlOdW1iZXIpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfcHJvY2Vzc1Jlc3BvbnNlKHJlcywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0dXNDb2RlID0gcmVzLm1lc3NhZ2Uuc3RhdHVzQ29kZSB8fCAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHt9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyBub3QgZm91bmQgbGVhZHMgdG8gbnVsbCBvYmogcmV0dXJuZWRcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzQ29kZSA9PT0gSHR0cENvZGVzLk5vdEZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHJlc3VsdCBmcm9tIHRoZSBib2R5XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gZGF0ZVRpbWVEZXNlcmlhbGl6ZXIoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4oYS52YWx1ZU9mKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgb2JqO1xuICAgICAgICAgICAgICAgIGxldCBjb250ZW50cztcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50cyA9IHlpZWxkIHJlcy5yZWFkQm9keSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudHMgJiYgY29udGVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5kZXNlcmlhbGl6ZURhdGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gSlNPTi5wYXJzZShjb250ZW50cywgZGF0ZVRpbWVEZXNlcmlhbGl6ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gSlNPTi5wYXJzZShjb250ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5yZXN1bHQgPSBvYmo7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycyA9IHJlcy5tZXNzYWdlLmhlYWRlcnM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW52YWxpZCByZXNvdXJjZSAoY29udGVudHMgbm90IGpzb24pOyAgbGVhdmluZyByZXN1bHQgb2JqIG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0IDN4eCByZWRpcmVjdHMgYXJlIGhhbmRsZWQgYnkgdGhlIGh0dHAgbGF5ZXIuXG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1c0NvZGUgPiAyOTkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1zZztcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgZXhjZXB0aW9uL2Vycm9yIGluIGJvZHksIGF0dGVtcHQgdG8gZ2V0IGJldHRlciBlcnJvclxuICAgICAgICAgICAgICAgICAgICBpZiAob2JqICYmIG9iai5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBvYmoubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb250ZW50cyAmJiBjb250ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBtYXkgYmUgdGhlIGNhc2UgdGhhdCB0aGUgZXhjZXB0aW9uIGlzIGluIHRoZSBib2R5IG1lc3NhZ2UgYXMgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBjb250ZW50cztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IGBGYWlsZWQgcmVxdWVzdDogKCR7c3RhdHVzQ29kZX0pYDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgSHR0cENsaWVudEVycm9yKG1zZywgc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICAgICAgICAgIGVyci5yZXN1bHQgPSByZXNwb25zZS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLkh0dHBDbGllbnQgPSBIdHRwQ2xpZW50O1xuY29uc3QgbG93ZXJjYXNlS2V5cyA9IChvYmopID0+IE9iamVjdC5rZXlzKG9iaikucmVkdWNlKChjLCBrKSA9PiAoKGNbay50b0xvd2VyQ2FzZSgpXSA9IG9ialtrXSksIGMpLCB7fSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4635\n')},7960:(__unused_webpack_module,exports)=>{"use strict";eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.checkBypass = exports.getProxyUrl = void 0;\nfunction getProxyUrl(reqUrl) {\n const usingSsl = reqUrl.protocol === 'https:';\n if (checkBypass(reqUrl)) {\n return undefined;\n }\n const proxyVar = (() => {\n if (usingSsl) {\n return process.env['https_proxy'] || process.env['HTTPS_PROXY'];\n }\n else {\n return process.env['http_proxy'] || process.env['HTTP_PROXY'];\n }\n })();\n if (proxyVar) {\n try {\n return new URL(proxyVar);\n }\n catch (_a) {\n if (!proxyVar.startsWith('http://') && !proxyVar.startsWith('https://'))\n return new URL(`http://${proxyVar}`);\n }\n }\n else {\n return undefined;\n }\n}\nexports.getProxyUrl = getProxyUrl;\nfunction checkBypass(reqUrl) {\n if (!reqUrl.hostname) {\n return false;\n }\n const reqHost = reqUrl.hostname;\n if (isLoopbackAddress(reqHost)) {\n return true;\n }\n const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || '';\n if (!noProxy) {\n return false;\n }\n // Determine the request port\n let reqPort;\n if (reqUrl.port) {\n reqPort = Number(reqUrl.port);\n }\n else if (reqUrl.protocol === 'http:') {\n reqPort = 80;\n }\n else if (reqUrl.protocol === 'https:') {\n reqPort = 443;\n }\n // Format the request hostname and hostname with port\n const upperReqHosts = [reqUrl.hostname.toUpperCase()];\n if (typeof reqPort === 'number') {\n upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`);\n }\n // Compare request host against noproxy\n for (const upperNoProxyItem of noProxy\n .split(',')\n .map(x => x.trim().toUpperCase())\n .filter(x => x)) {\n if (upperNoProxyItem === '*' ||\n upperReqHosts.some(x => x === upperNoProxyItem ||\n x.endsWith(`.${upperNoProxyItem}`) ||\n (upperNoProxyItem.startsWith('.') &&\n x.endsWith(`${upperNoProxyItem}`)))) {\n return true;\n }\n }\n return false;\n}\nexports.checkBypass = checkBypass;\nfunction isLoopbackAddress(host) {\n const hostLower = host.toLowerCase();\n return (hostLower === 'localhost' ||\n hostLower.startsWith('127.') ||\n hostLower.startsWith('[::1]') ||\n hostLower.startsWith('[0:0:0:0:0:0:0:1]'));\n}\n//# sourceMappingURL=proxy.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzk2MC5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxtQkFBbUIsR0FBRyxtQkFBbUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxTQUFTO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLGlCQUFpQixHQUFHLFFBQVE7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixpQkFBaUI7QUFDaEQ7QUFDQSxrQ0FBa0MsaUJBQWlCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2h0dHAtY2xpZW50L2xpYi9wcm94eS5qcz9kOWM4Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jaGVja0J5cGFzcyA9IGV4cG9ydHMuZ2V0UHJveHlVcmwgPSB2b2lkIDA7XG5mdW5jdGlvbiBnZXRQcm94eVVybChyZXFVcmwpIHtcbiAgICBjb25zdCB1c2luZ1NzbCA9IHJlcVVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOic7XG4gICAgaWYgKGNoZWNrQnlwYXNzKHJlcVVybCkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcHJveHlWYXIgPSAoKCkgPT4ge1xuICAgICAgICBpZiAodXNpbmdTc2wpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9jZXNzLmVudlsnaHR0cHNfcHJveHknXSB8fCBwcm9jZXNzLmVudlsnSFRUUFNfUFJPWFknXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9jZXNzLmVudlsnaHR0cF9wcm94eSddIHx8IHByb2Nlc3MuZW52WydIVFRQX1BST1hZJ107XG4gICAgICAgIH1cbiAgICB9KSgpO1xuICAgIGlmIChwcm94eVZhcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwocHJveHlWYXIpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgaWYgKCFwcm94eVZhci5zdGFydHNXaXRoKCdodHRwOi8vJykgJiYgIXByb3h5VmFyLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwoYGh0dHA6Ly8ke3Byb3h5VmFyfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn1cbmV4cG9ydHMuZ2V0UHJveHlVcmwgPSBnZXRQcm94eVVybDtcbmZ1bmN0aW9uIGNoZWNrQnlwYXNzKHJlcVVybCkge1xuICAgIGlmICghcmVxVXJsLmhvc3RuYW1lKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcmVxSG9zdCA9IHJlcVVybC5ob3N0bmFtZTtcbiAgICBpZiAoaXNMb29wYmFja0FkZHJlc3MocmVxSG9zdCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IG5vUHJveHkgPSBwcm9jZXNzLmVudlsnbm9fcHJveHknXSB8fCBwcm9jZXNzLmVudlsnTk9fUFJPWFknXSB8fCAnJztcbiAgICBpZiAoIW5vUHJveHkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBEZXRlcm1pbmUgdGhlIHJlcXVlc3QgcG9ydFxuICAgIGxldCByZXFQb3J0O1xuICAgIGlmIChyZXFVcmwucG9ydCkge1xuICAgICAgICByZXFQb3J0ID0gTnVtYmVyKHJlcVVybC5wb3J0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAocmVxVXJsLnByb3RvY29sID09PSAnaHR0cDonKSB7XG4gICAgICAgIHJlcVBvcnQgPSA4MDtcbiAgICB9XG4gICAgZWxzZSBpZiAocmVxVXJsLnByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgICAgICByZXFQb3J0ID0gNDQzO1xuICAgIH1cbiAgICAvLyBGb3JtYXQgdGhlIHJlcXVlc3QgaG9zdG5hbWUgYW5kIGhvc3RuYW1lIHdpdGggcG9ydFxuICAgIGNvbnN0IHVwcGVyUmVxSG9zdHMgPSBbcmVxVXJsLmhvc3RuYW1lLnRvVXBwZXJDYXNlKCldO1xuICAgIGlmICh0eXBlb2YgcmVxUG9ydCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdXBwZXJSZXFIb3N0cy5wdXNoKGAke3VwcGVyUmVxSG9zdHNbMF19OiR7cmVxUG9ydH1gKTtcbiAgICB9XG4gICAgLy8gQ29tcGFyZSByZXF1ZXN0IGhvc3QgYWdhaW5zdCBub3Byb3h5XG4gICAgZm9yIChjb25zdCB1cHBlck5vUHJveHlJdGVtIG9mIG5vUHJveHlcbiAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgLm1hcCh4ID0+IHgudHJpbSgpLnRvVXBwZXJDYXNlKCkpXG4gICAgICAgIC5maWx0ZXIoeCA9PiB4KSkge1xuICAgICAgICBpZiAodXBwZXJOb1Byb3h5SXRlbSA9PT0gJyonIHx8XG4gICAgICAgICAgICB1cHBlclJlcUhvc3RzLnNvbWUoeCA9PiB4ID09PSB1cHBlck5vUHJveHlJdGVtIHx8XG4gICAgICAgICAgICAgICAgeC5lbmRzV2l0aChgLiR7dXBwZXJOb1Byb3h5SXRlbX1gKSB8fFxuICAgICAgICAgICAgICAgICh1cHBlck5vUHJveHlJdGVtLnN0YXJ0c1dpdGgoJy4nKSAmJlxuICAgICAgICAgICAgICAgICAgICB4LmVuZHNXaXRoKGAke3VwcGVyTm9Qcm94eUl0ZW19YCkpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0cy5jaGVja0J5cGFzcyA9IGNoZWNrQnlwYXNzO1xuZnVuY3Rpb24gaXNMb29wYmFja0FkZHJlc3MoaG9zdCkge1xuICAgIGNvbnN0IGhvc3RMb3dlciA9IGhvc3QudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gKGhvc3RMb3dlciA9PT0gJ2xvY2FsaG9zdCcgfHxcbiAgICAgICAgaG9zdExvd2VyLnN0YXJ0c1dpdGgoJzEyNy4nKSB8fFxuICAgICAgICBob3N0TG93ZXIuc3RhcnRzV2l0aCgnWzo6MV0nKSB8fFxuICAgICAgICBob3N0TG93ZXIuc3RhcnRzV2l0aCgnWzA6MDowOjA6MDowOjA6MV0nKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcm94eS5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7960\n")},5234:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n AccountSASPermissions: () => (/* reexport */ AccountSASPermissions),\n AccountSASResourceTypes: () => (/* reexport */ AccountSASResourceTypes),\n AccountSASServices: () => (/* reexport */ AccountSASServices),\n AnonymousCredential: () => (/* reexport */ AnonymousCredential),\n AnonymousCredentialPolicy: () => (/* reexport */ AnonymousCredentialPolicy),\n AppendBlobClient: () => (/* reexport */ AppendBlobClient),\n BaseRequestPolicy: () => (/* reexport */ BaseRequestPolicy),\n BlobBatch: () => (/* reexport */ BlobBatch),\n BlobBatchClient: () => (/* reexport */ BlobBatchClient),\n BlobClient: () => (/* reexport */ BlobClient),\n BlobLeaseClient: () => (/* reexport */ BlobLeaseClient),\n BlobSASPermissions: () => (/* reexport */ BlobSASPermissions),\n BlobServiceClient: () => (/* reexport */ BlobServiceClient),\n BlockBlobClient: () => (/* reexport */ BlockBlobClient),\n BlockBlobTier: () => (/* reexport */ BlockBlobTier),\n ContainerClient: () => (/* reexport */ ContainerClient),\n ContainerSASPermissions: () => (/* reexport */ ContainerSASPermissions),\n Credential: () => (/* reexport */ Credential),\n CredentialPolicy: () => (/* reexport */ CredentialPolicy),\n HttpHeaders: () => (/* reexport */ httpHeaders_HttpHeaders),\n KnownEncryptionAlgorithmType: () => (/* reexport */ KnownEncryptionAlgorithmType),\n PageBlobClient: () => (/* reexport */ PageBlobClient),\n Pipeline: () => (/* reexport */ Pipeline),\n PremiumPageBlobTier: () => (/* reexport */ PremiumPageBlobTier),\n RequestPolicyOptions: () => (/* reexport */ RequestPolicyOptions),\n RestError: () => (/* reexport */ RestError),\n SASProtocol: () => (/* reexport */ SASProtocol),\n SASQueryParameters: () => (/* reexport */ SASQueryParameters),\n StorageBlobAudience: () => (/* reexport */ StorageBlobAudience),\n StorageBrowserPolicy: () => (/* reexport */ StorageBrowserPolicy),\n StorageBrowserPolicyFactory: () => (/* reexport */ StorageBrowserPolicyFactory),\n StorageOAuthScopes: () => (/* reexport */ StorageOAuthScopes),\n StorageRetryPolicy: () => (/* reexport */ StorageRetryPolicy),\n StorageRetryPolicyFactory: () => (/* reexport */ StorageRetryPolicyFactory),\n StorageRetryPolicyType: () => (/* reexport */ StorageRetryPolicyType),\n StorageSharedKeyCredential: () => (/* reexport */ StorageSharedKeyCredential),\n StorageSharedKeyCredentialPolicy: () => (/* reexport */ StorageSharedKeyCredentialPolicy),\n WebResource: () => (/* reexport */ WebResource),\n deserializationPolicy: () => (/* reexport */ deserializationPolicy_deserializationPolicy),\n generateAccountSASQueryParameters: () => (/* reexport */ generateAccountSASQueryParameters),\n generateBlobSASQueryParameters: () => (/* reexport */ generateBlobSASQueryParameters),\n getBlobServiceAccountAudience: () => (/* reexport */ getBlobServiceAccountAudience),\n isPipelineLike: () => (/* reexport */ isPipelineLike),\n logger: () => (/* reexport */ logger),\n newPipeline: () => (/* reexport */ newPipeline)\n});\n\n// NAMESPACE OBJECT: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generated/src/models/mappers.js\nvar mappers_namespaceObject = {};\n__webpack_require__.r(mappers_namespaceObject);\n__webpack_require__.d(mappers_namespaceObject, {\n AccessPolicy: () => (AccessPolicy),\n AppendBlobAppendBlockExceptionHeaders: () => (AppendBlobAppendBlockExceptionHeaders),\n AppendBlobAppendBlockFromUrlExceptionHeaders: () => (AppendBlobAppendBlockFromUrlExceptionHeaders),\n AppendBlobAppendBlockFromUrlHeaders: () => (AppendBlobAppendBlockFromUrlHeaders),\n AppendBlobAppendBlockHeaders: () => (AppendBlobAppendBlockHeaders),\n AppendBlobCreateExceptionHeaders: () => (AppendBlobCreateExceptionHeaders),\n AppendBlobCreateHeaders: () => (AppendBlobCreateHeaders),\n AppendBlobSealExceptionHeaders: () => (AppendBlobSealExceptionHeaders),\n AppendBlobSealHeaders: () => (AppendBlobSealHeaders),\n ArrowConfiguration: () => (ArrowConfiguration),\n ArrowField: () => (ArrowField),\n BlobAbortCopyFromURLExceptionHeaders: () => (BlobAbortCopyFromURLExceptionHeaders),\n BlobAbortCopyFromURLHeaders: () => (BlobAbortCopyFromURLHeaders),\n BlobAcquireLeaseExceptionHeaders: () => (BlobAcquireLeaseExceptionHeaders),\n BlobAcquireLeaseHeaders: () => (BlobAcquireLeaseHeaders),\n BlobBreakLeaseExceptionHeaders: () => (BlobBreakLeaseExceptionHeaders),\n BlobBreakLeaseHeaders: () => (BlobBreakLeaseHeaders),\n BlobChangeLeaseExceptionHeaders: () => (BlobChangeLeaseExceptionHeaders),\n BlobChangeLeaseHeaders: () => (BlobChangeLeaseHeaders),\n BlobCopyFromURLExceptionHeaders: () => (BlobCopyFromURLExceptionHeaders),\n BlobCopyFromURLHeaders: () => (BlobCopyFromURLHeaders),\n BlobCreateSnapshotExceptionHeaders: () => (BlobCreateSnapshotExceptionHeaders),\n BlobCreateSnapshotHeaders: () => (BlobCreateSnapshotHeaders),\n BlobDeleteExceptionHeaders: () => (BlobDeleteExceptionHeaders),\n BlobDeleteHeaders: () => (BlobDeleteHeaders),\n BlobDeleteImmutabilityPolicyExceptionHeaders: () => (BlobDeleteImmutabilityPolicyExceptionHeaders),\n BlobDeleteImmutabilityPolicyHeaders: () => (BlobDeleteImmutabilityPolicyHeaders),\n BlobDownloadExceptionHeaders: () => (BlobDownloadExceptionHeaders),\n BlobDownloadHeaders: () => (BlobDownloadHeaders),\n BlobFlatListSegment: () => (BlobFlatListSegment),\n BlobGetAccountInfoExceptionHeaders: () => (BlobGetAccountInfoExceptionHeaders),\n BlobGetAccountInfoHeaders: () => (BlobGetAccountInfoHeaders),\n BlobGetPropertiesExceptionHeaders: () => (BlobGetPropertiesExceptionHeaders),\n BlobGetPropertiesHeaders: () => (BlobGetPropertiesHeaders),\n BlobGetTagsExceptionHeaders: () => (BlobGetTagsExceptionHeaders),\n BlobGetTagsHeaders: () => (BlobGetTagsHeaders),\n BlobHierarchyListSegment: () => (BlobHierarchyListSegment),\n BlobItemInternal: () => (BlobItemInternal),\n BlobName: () => (BlobName),\n BlobPrefix: () => (BlobPrefix),\n BlobPropertiesInternal: () => (BlobPropertiesInternal),\n BlobQueryExceptionHeaders: () => (BlobQueryExceptionHeaders),\n BlobQueryHeaders: () => (BlobQueryHeaders),\n BlobReleaseLeaseExceptionHeaders: () => (BlobReleaseLeaseExceptionHeaders),\n BlobReleaseLeaseHeaders: () => (BlobReleaseLeaseHeaders),\n BlobRenewLeaseExceptionHeaders: () => (BlobRenewLeaseExceptionHeaders),\n BlobRenewLeaseHeaders: () => (BlobRenewLeaseHeaders),\n BlobServiceProperties: () => (BlobServiceProperties),\n BlobServiceStatistics: () => (BlobServiceStatistics),\n BlobSetExpiryExceptionHeaders: () => (BlobSetExpiryExceptionHeaders),\n BlobSetExpiryHeaders: () => (BlobSetExpiryHeaders),\n BlobSetHttpHeadersExceptionHeaders: () => (BlobSetHttpHeadersExceptionHeaders),\n BlobSetHttpHeadersHeaders: () => (BlobSetHttpHeadersHeaders),\n BlobSetImmutabilityPolicyExceptionHeaders: () => (BlobSetImmutabilityPolicyExceptionHeaders),\n BlobSetImmutabilityPolicyHeaders: () => (BlobSetImmutabilityPolicyHeaders),\n BlobSetLegalHoldExceptionHeaders: () => (BlobSetLegalHoldExceptionHeaders),\n BlobSetLegalHoldHeaders: () => (BlobSetLegalHoldHeaders),\n BlobSetMetadataExceptionHeaders: () => (BlobSetMetadataExceptionHeaders),\n BlobSetMetadataHeaders: () => (BlobSetMetadataHeaders),\n BlobSetTagsExceptionHeaders: () => (BlobSetTagsExceptionHeaders),\n BlobSetTagsHeaders: () => (BlobSetTagsHeaders),\n BlobSetTierExceptionHeaders: () => (BlobSetTierExceptionHeaders),\n BlobSetTierHeaders: () => (BlobSetTierHeaders),\n BlobStartCopyFromURLExceptionHeaders: () => (BlobStartCopyFromURLExceptionHeaders),\n BlobStartCopyFromURLHeaders: () => (BlobStartCopyFromURLHeaders),\n BlobTag: () => (BlobTag),\n BlobTags: () => (BlobTags),\n BlobUndeleteExceptionHeaders: () => (BlobUndeleteExceptionHeaders),\n BlobUndeleteHeaders: () => (BlobUndeleteHeaders),\n Block: () => (Block),\n BlockBlobCommitBlockListExceptionHeaders: () => (BlockBlobCommitBlockListExceptionHeaders),\n BlockBlobCommitBlockListHeaders: () => (BlockBlobCommitBlockListHeaders),\n BlockBlobGetBlockListExceptionHeaders: () => (BlockBlobGetBlockListExceptionHeaders),\n BlockBlobGetBlockListHeaders: () => (BlockBlobGetBlockListHeaders),\n BlockBlobPutBlobFromUrlExceptionHeaders: () => (BlockBlobPutBlobFromUrlExceptionHeaders),\n BlockBlobPutBlobFromUrlHeaders: () => (BlockBlobPutBlobFromUrlHeaders),\n BlockBlobStageBlockExceptionHeaders: () => (BlockBlobStageBlockExceptionHeaders),\n BlockBlobStageBlockFromURLExceptionHeaders: () => (BlockBlobStageBlockFromURLExceptionHeaders),\n BlockBlobStageBlockFromURLHeaders: () => (BlockBlobStageBlockFromURLHeaders),\n BlockBlobStageBlockHeaders: () => (BlockBlobStageBlockHeaders),\n BlockBlobUploadExceptionHeaders: () => (BlockBlobUploadExceptionHeaders),\n BlockBlobUploadHeaders: () => (BlockBlobUploadHeaders),\n BlockList: () => (BlockList),\n BlockLookupList: () => (BlockLookupList),\n ClearRange: () => (ClearRange),\n ContainerAcquireLeaseExceptionHeaders: () => (ContainerAcquireLeaseExceptionHeaders),\n ContainerAcquireLeaseHeaders: () => (ContainerAcquireLeaseHeaders),\n ContainerBreakLeaseExceptionHeaders: () => (ContainerBreakLeaseExceptionHeaders),\n ContainerBreakLeaseHeaders: () => (ContainerBreakLeaseHeaders),\n ContainerChangeLeaseExceptionHeaders: () => (ContainerChangeLeaseExceptionHeaders),\n ContainerChangeLeaseHeaders: () => (ContainerChangeLeaseHeaders),\n ContainerCreateExceptionHeaders: () => (ContainerCreateExceptionHeaders),\n ContainerCreateHeaders: () => (ContainerCreateHeaders),\n ContainerDeleteExceptionHeaders: () => (ContainerDeleteExceptionHeaders),\n ContainerDeleteHeaders: () => (ContainerDeleteHeaders),\n ContainerFilterBlobsExceptionHeaders: () => (ContainerFilterBlobsExceptionHeaders),\n ContainerFilterBlobsHeaders: () => (ContainerFilterBlobsHeaders),\n ContainerGetAccessPolicyExceptionHeaders: () => (ContainerGetAccessPolicyExceptionHeaders),\n ContainerGetAccessPolicyHeaders: () => (ContainerGetAccessPolicyHeaders),\n ContainerGetAccountInfoExceptionHeaders: () => (ContainerGetAccountInfoExceptionHeaders),\n ContainerGetAccountInfoHeaders: () => (ContainerGetAccountInfoHeaders),\n ContainerGetPropertiesExceptionHeaders: () => (ContainerGetPropertiesExceptionHeaders),\n ContainerGetPropertiesHeaders: () => (ContainerGetPropertiesHeaders),\n ContainerItem: () => (ContainerItem),\n ContainerListBlobFlatSegmentExceptionHeaders: () => (ContainerListBlobFlatSegmentExceptionHeaders),\n ContainerListBlobFlatSegmentHeaders: () => (ContainerListBlobFlatSegmentHeaders),\n ContainerListBlobHierarchySegmentExceptionHeaders: () => (ContainerListBlobHierarchySegmentExceptionHeaders),\n ContainerListBlobHierarchySegmentHeaders: () => (ContainerListBlobHierarchySegmentHeaders),\n ContainerProperties: () => (ContainerProperties),\n ContainerReleaseLeaseExceptionHeaders: () => (ContainerReleaseLeaseExceptionHeaders),\n ContainerReleaseLeaseHeaders: () => (ContainerReleaseLeaseHeaders),\n ContainerRenameExceptionHeaders: () => (ContainerRenameExceptionHeaders),\n ContainerRenameHeaders: () => (ContainerRenameHeaders),\n ContainerRenewLeaseExceptionHeaders: () => (ContainerRenewLeaseExceptionHeaders),\n ContainerRenewLeaseHeaders: () => (ContainerRenewLeaseHeaders),\n ContainerRestoreExceptionHeaders: () => (ContainerRestoreExceptionHeaders),\n ContainerRestoreHeaders: () => (ContainerRestoreHeaders),\n ContainerSetAccessPolicyExceptionHeaders: () => (ContainerSetAccessPolicyExceptionHeaders),\n ContainerSetAccessPolicyHeaders: () => (ContainerSetAccessPolicyHeaders),\n ContainerSetMetadataExceptionHeaders: () => (ContainerSetMetadataExceptionHeaders),\n ContainerSetMetadataHeaders: () => (ContainerSetMetadataHeaders),\n ContainerSubmitBatchExceptionHeaders: () => (ContainerSubmitBatchExceptionHeaders),\n ContainerSubmitBatchHeaders: () => (ContainerSubmitBatchHeaders),\n CorsRule: () => (CorsRule),\n DelimitedTextConfiguration: () => (DelimitedTextConfiguration),\n FilterBlobItem: () => (FilterBlobItem),\n FilterBlobSegment: () => (FilterBlobSegment),\n GeoReplication: () => (GeoReplication),\n JsonTextConfiguration: () => (JsonTextConfiguration),\n KeyInfo: () => (KeyInfo),\n ListBlobsFlatSegmentResponse: () => (ListBlobsFlatSegmentResponse),\n ListBlobsHierarchySegmentResponse: () => (ListBlobsHierarchySegmentResponse),\n ListContainersSegmentResponse: () => (ListContainersSegmentResponse),\n Logging: () => (Logging),\n Metrics: () => (Metrics),\n PageBlobClearPagesExceptionHeaders: () => (PageBlobClearPagesExceptionHeaders),\n PageBlobClearPagesHeaders: () => (PageBlobClearPagesHeaders),\n PageBlobCopyIncrementalExceptionHeaders: () => (PageBlobCopyIncrementalExceptionHeaders),\n PageBlobCopyIncrementalHeaders: () => (PageBlobCopyIncrementalHeaders),\n PageBlobCreateExceptionHeaders: () => (PageBlobCreateExceptionHeaders),\n PageBlobCreateHeaders: () => (PageBlobCreateHeaders),\n PageBlobGetPageRangesDiffExceptionHeaders: () => (PageBlobGetPageRangesDiffExceptionHeaders),\n PageBlobGetPageRangesDiffHeaders: () => (PageBlobGetPageRangesDiffHeaders),\n PageBlobGetPageRangesExceptionHeaders: () => (PageBlobGetPageRangesExceptionHeaders),\n PageBlobGetPageRangesHeaders: () => (PageBlobGetPageRangesHeaders),\n PageBlobResizeExceptionHeaders: () => (PageBlobResizeExceptionHeaders),\n PageBlobResizeHeaders: () => (PageBlobResizeHeaders),\n PageBlobUpdateSequenceNumberExceptionHeaders: () => (PageBlobUpdateSequenceNumberExceptionHeaders),\n PageBlobUpdateSequenceNumberHeaders: () => (PageBlobUpdateSequenceNumberHeaders),\n PageBlobUploadPagesExceptionHeaders: () => (PageBlobUploadPagesExceptionHeaders),\n PageBlobUploadPagesFromURLExceptionHeaders: () => (PageBlobUploadPagesFromURLExceptionHeaders),\n PageBlobUploadPagesFromURLHeaders: () => (PageBlobUploadPagesFromURLHeaders),\n PageBlobUploadPagesHeaders: () => (PageBlobUploadPagesHeaders),\n PageList: () => (PageList),\n PageRange: () => (PageRange),\n QueryFormat: () => (QueryFormat),\n QueryRequest: () => (QueryRequest),\n QuerySerialization: () => (QuerySerialization),\n RetentionPolicy: () => (RetentionPolicy),\n ServiceFilterBlobsExceptionHeaders: () => (ServiceFilterBlobsExceptionHeaders),\n ServiceFilterBlobsHeaders: () => (ServiceFilterBlobsHeaders),\n ServiceGetAccountInfoExceptionHeaders: () => (ServiceGetAccountInfoExceptionHeaders),\n ServiceGetAccountInfoHeaders: () => (ServiceGetAccountInfoHeaders),\n ServiceGetPropertiesExceptionHeaders: () => (ServiceGetPropertiesExceptionHeaders),\n ServiceGetPropertiesHeaders: () => (ServiceGetPropertiesHeaders),\n ServiceGetStatisticsExceptionHeaders: () => (ServiceGetStatisticsExceptionHeaders),\n ServiceGetStatisticsHeaders: () => (ServiceGetStatisticsHeaders),\n ServiceGetUserDelegationKeyExceptionHeaders: () => (ServiceGetUserDelegationKeyExceptionHeaders),\n ServiceGetUserDelegationKeyHeaders: () => (ServiceGetUserDelegationKeyHeaders),\n ServiceListContainersSegmentExceptionHeaders: () => (ServiceListContainersSegmentExceptionHeaders),\n ServiceListContainersSegmentHeaders: () => (ServiceListContainersSegmentHeaders),\n ServiceSetPropertiesExceptionHeaders: () => (ServiceSetPropertiesExceptionHeaders),\n ServiceSetPropertiesHeaders: () => (ServiceSetPropertiesHeaders),\n ServiceSubmitBatchExceptionHeaders: () => (ServiceSubmitBatchExceptionHeaders),\n ServiceSubmitBatchHeaders: () => (ServiceSubmitBatchHeaders),\n SignedIdentifier: () => (SignedIdentifier),\n StaticWebsite: () => (StaticWebsite),\n StorageError: () => (StorageError),\n UserDelegationKey: () => (UserDelegationKey)\n});\n\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/util/serializer.common.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * Default key used to access the XML attributes.\n */\nconst XML_ATTRKEY = "$";\n/**\n * Default key used to access the XML value content.\n */\nconst XML_CHARKEY = "_";\n//# sourceMappingURL=serializer.common.js.map\n// EXTERNAL MODULE: ./node_modules/uuid/dist/esm-node/v4.js\nvar v4 = __webpack_require__(9568);\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/util/utils.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\nconst validUuidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/i;\n/**\n * Checks if a parsed URL is HTTPS\n *\n * @param urlToCheck - The url to check\n * @returns True if the URL is HTTPS; false otherwise.\n */\nfunction urlIsHTTPS(urlToCheck) {\n return urlToCheck.protocol.toLowerCase() === Constants.HTTPS;\n}\n/**\n * Encodes an URI.\n *\n * @param uri - The URI to be encoded.\n * @returns The encoded URI.\n */\nfunction encodeUri(uri) {\n return encodeURIComponent(uri)\n .replace(/!/g, "%21")\n .replace(/"/g, "%27")\n .replace(/\\(/g, "%28")\n .replace(/\\)/g, "%29")\n .replace(/\\*/g, "%2A");\n}\n/**\n * Returns a stripped version of the Http Response which only contains body,\n * headers and the status.\n *\n * @param response - The Http Response\n * @returns The stripped version of Http Response.\n */\nfunction stripResponse(response) {\n const strippedResponse = {};\n strippedResponse.body = response.bodyAsText;\n strippedResponse.headers = response.headers;\n strippedResponse.status = response.status;\n return strippedResponse;\n}\n/**\n * Returns a stripped version of the Http Request that does not contain the\n * Authorization header.\n *\n * @param request - The Http Request object\n * @returns The stripped version of Http Request.\n */\nfunction stripRequest(request) {\n const strippedRequest = request.clone();\n if (strippedRequest.headers) {\n strippedRequest.headers.remove("authorization");\n }\n return strippedRequest;\n}\n/**\n * Validates the given uuid as a string\n *\n * @param uuid - The uuid as a string that needs to be validated\n * @returns True if the uuid is valid; false otherwise.\n */\nfunction isValidUuid(uuid) {\n return validUuidRegex.test(uuid);\n}\n/**\n * Generated UUID\n *\n * @returns RFC4122 v4 UUID.\n */\nfunction generateUuid() {\n return (0,v4/* default */.Z)();\n}\n/**\n * Executes an array of promises sequentially. Inspiration of this method is here:\n * https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html. An awesome blog on promises!\n *\n * @param promiseFactories - An array of promise factories(A function that return a promise)\n * @param kickstart - Input to the first promise that is used to kickstart the promise chain.\n * If not provided then the promise chain starts with undefined.\n * @returns A chain of resolved or rejected promises\n */\nfunction executePromisesSequentially(promiseFactories, kickstart) {\n let result = Promise.resolve(kickstart);\n promiseFactories.forEach((promiseFactory) => {\n result = result.then(promiseFactory);\n });\n return result;\n}\n/**\n * Converts a Promise to a callback.\n * @param promise - The Promise to be converted to a callback\n * @returns A function that takes the callback `(cb: Function) => void`\n * @deprecated generated code should instead depend on responseToBody\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction promiseToCallback(promise) {\n if (typeof promise.then !== "function") {\n throw new Error("The provided input is not a Promise.");\n }\n // eslint-disable-next-line @typescript-eslint/ban-types\n return (cb) => {\n promise\n .then((data) => {\n // eslint-disable-next-line promise/no-callback-in-promise\n return cb(undefined, data);\n })\n .catch((err) => {\n // eslint-disable-next-line promise/no-callback-in-promise\n cb(err);\n });\n };\n}\n/**\n * Converts a Promise to a service callback.\n * @param promise - The Promise of HttpOperationResponse to be converted to a service callback\n * @returns A function that takes the service callback (cb: ServiceCallback): void\n */\nfunction promiseToServiceCallback(promise) {\n if (typeof promise.then !== "function") {\n throw new Error("The provided input is not a Promise.");\n }\n return (cb) => {\n promise\n .then((data) => {\n return process.nextTick(cb, undefined, data.parsedBody, data.request, data);\n })\n .catch((err) => {\n process.nextTick(cb, err);\n });\n };\n}\nfunction prepareXMLRootList(obj, elementName, xmlNamespaceKey, xmlNamespace) {\n if (!Array.isArray(obj)) {\n obj = [obj];\n }\n if (!xmlNamespaceKey || !xmlNamespace) {\n return { [elementName]: obj };\n }\n const result = { [elementName]: obj };\n result[XML_ATTRKEY] = { [xmlNamespaceKey]: xmlNamespace };\n return result;\n}\n/**\n * Applies the properties on the prototype of sourceCtors to the prototype of targetCtor\n * @param targetCtor - The target object on which the properties need to be applied.\n * @param sourceCtors - An array of source objects from which the properties need to be taken.\n */\nfunction applyMixins(targetCtorParam, sourceCtors) {\n const castTargetCtorParam = targetCtorParam;\n sourceCtors.forEach((sourceCtor) => {\n Object.getOwnPropertyNames(sourceCtor.prototype).forEach((name) => {\n castTargetCtorParam.prototype[name] = sourceCtor.prototype[name];\n });\n });\n}\nconst validateISODuration = /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n/**\n * Indicates whether the given string is in ISO 8601 format.\n * @param value - The value to be validated for ISO 8601 duration format.\n * @returns `true` if valid, `false` otherwise.\n */\nfunction isDuration(value) {\n return validateISODuration.test(value);\n}\n/**\n * Replace all of the instances of searchValue in value with the provided replaceValue.\n * @param value - The value to search and replace in.\n * @param searchValue - The value to search for in the value argument.\n * @param replaceValue - The value to replace searchValue with in the value argument.\n * @returns The value where each instance of searchValue was replaced with replacedValue.\n */\nfunction replaceAll(value, searchValue, replaceValue) {\n return !value || !searchValue ? value : value.split(searchValue).join(replaceValue || "");\n}\n/**\n * Determines whether the given entity is a basic/primitive type\n * (string, number, boolean, null, undefined).\n * @param value - Any entity\n * @returns true is it is primitive type, false otherwise.\n */\nfunction isPrimitiveType(value) {\n return (typeof value !== "object" && typeof value !== "function") || value === null;\n}\nfunction getEnvironmentValue(name) {\n if (process.env[name]) {\n return process.env[name];\n }\n else if (process.env[name.toLowerCase()]) {\n return process.env[name.toLowerCase()];\n }\n return undefined;\n}\n/**\n * @internal\n * @returns true when input is an object type that is not null, Array, RegExp, or Date.\n */\nfunction isObject(input) {\n return (typeof input === "object" &&\n input !== null &&\n !Array.isArray(input) &&\n !(input instanceof RegExp) &&\n !(input instanceof Date));\n}\n//# sourceMappingURL=utils.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/url.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * A class that handles the query portion of a URLBuilder.\n */\nclass URLQuery {\n constructor() {\n this._rawQuery = {};\n }\n /**\n * Get whether or not there any query parameters in this URLQuery.\n */\n any() {\n return Object.keys(this._rawQuery).length > 0;\n }\n /**\n * Get the keys of the query string.\n */\n keys() {\n return Object.keys(this._rawQuery);\n }\n /**\n * Set a query parameter with the provided name and value. If the parameterValue is undefined or\n * empty, then this will attempt to remove an existing query parameter with the provided\n * parameterName.\n */\n set(parameterName, parameterValue) {\n const caseParameterValue = parameterValue;\n if (parameterName) {\n if (caseParameterValue !== undefined && caseParameterValue !== null) {\n const newValue = Array.isArray(caseParameterValue)\n ? caseParameterValue\n : caseParameterValue.toString();\n this._rawQuery[parameterName] = newValue;\n }\n else {\n delete this._rawQuery[parameterName];\n }\n }\n }\n /**\n * Get the value of the query parameter with the provided name. If no parameter exists with the\n * provided parameter name, then undefined will be returned.\n */\n get(parameterName) {\n return parameterName ? this._rawQuery[parameterName] : undefined;\n }\n /**\n * Get the string representation of this query. The return value will not start with a "?".\n */\n toString() {\n let result = "";\n for (const parameterName in this._rawQuery) {\n if (result) {\n result += "&";\n }\n const parameterValue = this._rawQuery[parameterName];\n if (Array.isArray(parameterValue)) {\n const parameterStrings = [];\n for (const parameterValueElement of parameterValue) {\n parameterStrings.push(`${parameterName}=${parameterValueElement}`);\n }\n result += parameterStrings.join("&");\n }\n else {\n result += `${parameterName}=${parameterValue}`;\n }\n }\n return result;\n }\n /**\n * Parse a URLQuery from the provided text.\n */\n static parse(text) {\n const result = new URLQuery();\n if (text) {\n if (text.startsWith("?")) {\n text = text.substring(1);\n }\n let currentState = "ParameterName";\n let parameterName = "";\n let parameterValue = "";\n for (let i = 0; i < text.length; ++i) {\n const currentCharacter = text[i];\n switch (currentState) {\n case "ParameterName":\n switch (currentCharacter) {\n case "=":\n currentState = "ParameterValue";\n break;\n case "&":\n parameterName = "";\n parameterValue = "";\n break;\n default:\n parameterName += currentCharacter;\n break;\n }\n break;\n case "ParameterValue":\n switch (currentCharacter) {\n case "&":\n result.set(parameterName, parameterValue);\n parameterName = "";\n parameterValue = "";\n currentState = "ParameterName";\n break;\n default:\n parameterValue += currentCharacter;\n break;\n }\n break;\n default:\n throw new Error("Unrecognized URLQuery parse state: " + currentState);\n }\n }\n if (currentState === "ParameterValue") {\n result.set(parameterName, parameterValue);\n }\n }\n return result;\n }\n}\n/**\n * A class that handles creating, modifying, and parsing URLs.\n */\nclass URLBuilder {\n /**\n * Set the scheme/protocol for this URL. If the provided scheme contains other parts of a URL\n * (such as a host, port, path, or query), those parts will be added to this URL as well.\n */\n setScheme(scheme) {\n if (!scheme) {\n this._scheme = undefined;\n }\n else {\n this.set(scheme, "SCHEME");\n }\n }\n /**\n * Get the scheme that has been set in this URL.\n */\n getScheme() {\n return this._scheme;\n }\n /**\n * Set the host for this URL. If the provided host contains other parts of a URL (such as a\n * port, path, or query), those parts will be added to this URL as well.\n */\n setHost(host) {\n if (!host) {\n this._host = undefined;\n }\n else {\n this.set(host, "SCHEME_OR_HOST");\n }\n }\n /**\n * Get the host that has been set in this URL.\n */\n getHost() {\n return this._host;\n }\n /**\n * Set the port for this URL. If the provided port contains other parts of a URL (such as a\n * path or query), those parts will be added to this URL as well.\n */\n setPort(port) {\n if (port === undefined || port === null || port === "") {\n this._port = undefined;\n }\n else {\n this.set(port.toString(), "PORT");\n }\n }\n /**\n * Get the port that has been set in this URL.\n */\n getPort() {\n return this._port;\n }\n /**\n * Set the path for this URL. If the provided path contains a query, then it will be added to\n * this URL as well.\n */\n setPath(path) {\n if (!path) {\n this._path = undefined;\n }\n else {\n const schemeIndex = path.indexOf("://");\n if (schemeIndex !== -1) {\n const schemeStart = path.lastIndexOf("/", schemeIndex);\n // Make sure to only grab the URL part of the path before setting the state back to SCHEME\n // this will handle cases such as "/a/b/c/https://microsoft.com" => "https://microsoft.com"\n this.set(schemeStart === -1 ? path : path.substr(schemeStart + 1), "SCHEME");\n }\n else {\n this.set(path, "PATH");\n }\n }\n }\n /**\n * Append the provided path to this URL\'s existing path. If the provided path contains a query,\n * then it will be added to this URL as well.\n */\n appendPath(path) {\n if (path) {\n let currentPath = this.getPath();\n if (currentPath) {\n if (!currentPath.endsWith("/")) {\n currentPath += "/";\n }\n if (path.startsWith("/")) {\n path = path.substring(1);\n }\n path = currentPath + path;\n }\n this.set(path, "PATH");\n }\n }\n /**\n * Get the path that has been set in this URL.\n */\n getPath() {\n return this._path;\n }\n /**\n * Set the query in this URL.\n */\n setQuery(query) {\n if (!query) {\n this._query = undefined;\n }\n else {\n this._query = URLQuery.parse(query);\n }\n }\n /**\n * Set a query parameter with the provided name and value in this URL\'s query. If the provided\n * query parameter value is undefined or empty, then the query parameter will be removed if it\n * existed.\n */\n setQueryParameter(queryParameterName, queryParameterValue) {\n if (queryParameterName) {\n if (!this._query) {\n this._query = new URLQuery();\n }\n this._query.set(queryParameterName, queryParameterValue);\n }\n }\n /**\n * Get the value of the query parameter with the provided query parameter name. If no query\n * parameter exists with the provided name, then undefined will be returned.\n */\n getQueryParameterValue(queryParameterName) {\n return this._query ? this._query.get(queryParameterName) : undefined;\n }\n /**\n * Get the query in this URL.\n */\n getQuery() {\n return this._query ? this._query.toString() : undefined;\n }\n /**\n * Set the parts of this URL by parsing the provided text using the provided startState.\n */\n set(text, startState) {\n const tokenizer = new URLTokenizer(text, startState);\n while (tokenizer.next()) {\n const token = tokenizer.current();\n let tokenPath;\n if (token) {\n switch (token.type) {\n case "SCHEME":\n this._scheme = token.text || undefined;\n break;\n case "HOST":\n this._host = token.text || undefined;\n break;\n case "PORT":\n this._port = token.text || undefined;\n break;\n case "PATH":\n tokenPath = token.text || undefined;\n if (!this._path || this._path === "/" || tokenPath !== "/") {\n this._path = tokenPath;\n }\n break;\n case "QUERY":\n this._query = URLQuery.parse(token.text);\n break;\n default:\n throw new Error(`Unrecognized URLTokenType: ${token.type}`);\n }\n }\n }\n }\n /**\n * Serializes the URL as a string.\n * @returns the URL as a string.\n */\n toString() {\n let result = "";\n if (this._scheme) {\n result += `${this._scheme}://`;\n }\n if (this._host) {\n result += this._host;\n }\n if (this._port) {\n result += `:${this._port}`;\n }\n if (this._path) {\n if (!this._path.startsWith("/")) {\n result += "/";\n }\n result += this._path;\n }\n if (this._query && this._query.any()) {\n result += `?${this._query.toString()}`;\n }\n return result;\n }\n /**\n * If the provided searchValue is found in this URLBuilder, then replace it with the provided\n * replaceValue.\n */\n replaceAll(searchValue, replaceValue) {\n if (searchValue) {\n this.setScheme(replaceAll(this.getScheme(), searchValue, replaceValue));\n this.setHost(replaceAll(this.getHost(), searchValue, replaceValue));\n this.setPort(replaceAll(this.getPort(), searchValue, replaceValue));\n this.setPath(replaceAll(this.getPath(), searchValue, replaceValue));\n this.setQuery(replaceAll(this.getQuery(), searchValue, replaceValue));\n }\n }\n /**\n * Parses a given string URL into a new {@link URLBuilder}.\n */\n static parse(text) {\n const result = new URLBuilder();\n result.set(text, "SCHEME_OR_HOST");\n return result;\n }\n}\nclass URLToken {\n constructor(text, type) {\n this.text = text;\n this.type = type;\n }\n static scheme(text) {\n return new URLToken(text, "SCHEME");\n }\n static host(text) {\n return new URLToken(text, "HOST");\n }\n static port(text) {\n return new URLToken(text, "PORT");\n }\n static path(text) {\n return new URLToken(text, "PATH");\n }\n static query(text) {\n return new URLToken(text, "QUERY");\n }\n}\n/**\n * Get whether or not the provided character (single character string) is an alphanumeric (letter or\n * digit) character.\n */\nfunction isAlphaNumericCharacter(character) {\n const characterCode = character.charCodeAt(0);\n return ((48 /* \'0\' */ <= characterCode && characterCode <= 57) /* \'9\' */ ||\n (65 /* \'A\' */ <= characterCode && characterCode <= 90) /* \'Z\' */ ||\n (97 /* \'a\' */ <= characterCode && characterCode <= 122) /* \'z\' */);\n}\n/**\n * A class that tokenizes URL strings.\n */\nclass URLTokenizer {\n constructor(_text, state) {\n this._text = _text;\n this._textLength = _text ? _text.length : 0;\n this._currentState = state !== undefined && state !== null ? state : "SCHEME_OR_HOST";\n this._currentIndex = 0;\n }\n /**\n * Get the current URLToken this URLTokenizer is pointing at, or undefined if the URLTokenizer\n * hasn\'t started or has finished tokenizing.\n */\n current() {\n return this._currentToken;\n }\n /**\n * Advance to the next URLToken and return whether or not a URLToken was found.\n */\n next() {\n if (!hasCurrentCharacter(this)) {\n this._currentToken = undefined;\n }\n else {\n switch (this._currentState) {\n case "SCHEME":\n nextScheme(this);\n break;\n case "SCHEME_OR_HOST":\n nextSchemeOrHost(this);\n break;\n case "HOST":\n nextHost(this);\n break;\n case "PORT":\n nextPort(this);\n break;\n case "PATH":\n nextPath(this);\n break;\n case "QUERY":\n nextQuery(this);\n break;\n default:\n throw new Error(`Unrecognized URLTokenizerState: ${this._currentState}`);\n }\n }\n return !!this._currentToken;\n }\n}\n/**\n * Read the remaining characters from this Tokenizer\'s character stream.\n */\nfunction readRemaining(tokenizer) {\n let result = "";\n if (tokenizer._currentIndex < tokenizer._textLength) {\n result = tokenizer._text.substring(tokenizer._currentIndex);\n tokenizer._currentIndex = tokenizer._textLength;\n }\n return result;\n}\n/**\n * Whether or not this URLTokenizer has a current character.\n */\nfunction hasCurrentCharacter(tokenizer) {\n return tokenizer._currentIndex < tokenizer._textLength;\n}\n/**\n * Get the character in the text string at the current index.\n */\nfunction getCurrentCharacter(tokenizer) {\n return tokenizer._text[tokenizer._currentIndex];\n}\n/**\n * Advance to the character in text that is "step" characters ahead. If no step value is provided,\n * then step will default to 1.\n */\nfunction nextCharacter(tokenizer, step) {\n if (hasCurrentCharacter(tokenizer)) {\n if (!step) {\n step = 1;\n }\n tokenizer._currentIndex += step;\n }\n}\n/**\n * Starting with the current character, peek "charactersToPeek" number of characters ahead in this\n * Tokenizer\'s stream of characters.\n */\nfunction peekCharacters(tokenizer, charactersToPeek) {\n let endIndex = tokenizer._currentIndex + charactersToPeek;\n if (tokenizer._textLength < endIndex) {\n endIndex = tokenizer._textLength;\n }\n return tokenizer._text.substring(tokenizer._currentIndex, endIndex);\n}\n/**\n * Read characters from this Tokenizer until the end of the stream or until the provided condition\n * is false when provided the current character.\n */\nfunction readWhile(tokenizer, condition) {\n let result = "";\n while (hasCurrentCharacter(tokenizer)) {\n const currentCharacter = getCurrentCharacter(tokenizer);\n if (!condition(currentCharacter)) {\n break;\n }\n else {\n result += currentCharacter;\n nextCharacter(tokenizer);\n }\n }\n return result;\n}\n/**\n * Read characters from this Tokenizer until a non-alphanumeric character or the end of the\n * character stream is reached.\n */\nfunction readWhileLetterOrDigit(tokenizer) {\n return readWhile(tokenizer, (character) => isAlphaNumericCharacter(character));\n}\n/**\n * Read characters from this Tokenizer until one of the provided terminating characters is read or\n * the end of the character stream is reached.\n */\nfunction readUntilCharacter(tokenizer, ...terminatingCharacters) {\n return readWhile(tokenizer, (character) => terminatingCharacters.indexOf(character) === -1);\n}\nfunction nextScheme(tokenizer) {\n const scheme = readWhileLetterOrDigit(tokenizer);\n tokenizer._currentToken = URLToken.scheme(scheme);\n if (!hasCurrentCharacter(tokenizer)) {\n tokenizer._currentState = "DONE";\n }\n else {\n tokenizer._currentState = "HOST";\n }\n}\nfunction nextSchemeOrHost(tokenizer) {\n const schemeOrHost = readUntilCharacter(tokenizer, ":", "/", "?");\n if (!hasCurrentCharacter(tokenizer)) {\n tokenizer._currentToken = URLToken.host(schemeOrHost);\n tokenizer._currentState = "DONE";\n }\n else if (getCurrentCharacter(tokenizer) === ":") {\n if (peekCharacters(tokenizer, 3) === "://") {\n tokenizer._currentToken = URLToken.scheme(schemeOrHost);\n tokenizer._currentState = "HOST";\n }\n else {\n tokenizer._currentToken = URLToken.host(schemeOrHost);\n tokenizer._currentState = "PORT";\n }\n }\n else {\n tokenizer._currentToken = URLToken.host(schemeOrHost);\n if (getCurrentCharacter(tokenizer) === "/") {\n tokenizer._currentState = "PATH";\n }\n else {\n tokenizer._currentState = "QUERY";\n }\n }\n}\nfunction nextHost(tokenizer) {\n if (peekCharacters(tokenizer, 3) === "://") {\n nextCharacter(tokenizer, 3);\n }\n const host = readUntilCharacter(tokenizer, ":", "/", "?");\n tokenizer._currentToken = URLToken.host(host);\n if (!hasCurrentCharacter(tokenizer)) {\n tokenizer._currentState = "DONE";\n }\n else if (getCurrentCharacter(tokenizer) === ":") {\n tokenizer._currentState = "PORT";\n }\n else if (getCurrentCharacter(tokenizer) === "/") {\n tokenizer._currentState = "PATH";\n }\n else {\n tokenizer._currentState = "QUERY";\n }\n}\nfunction nextPort(tokenizer) {\n if (getCurrentCharacter(tokenizer) === ":") {\n nextCharacter(tokenizer);\n }\n const port = readUntilCharacter(tokenizer, "/", "?");\n tokenizer._currentToken = URLToken.port(port);\n if (!hasCurrentCharacter(tokenizer)) {\n tokenizer._currentState = "DONE";\n }\n else if (getCurrentCharacter(tokenizer) === "/") {\n tokenizer._currentState = "PATH";\n }\n else {\n tokenizer._currentState = "QUERY";\n }\n}\nfunction nextPath(tokenizer) {\n const path = readUntilCharacter(tokenizer, "?");\n tokenizer._currentToken = URLToken.path(path);\n if (!hasCurrentCharacter(tokenizer)) {\n tokenizer._currentState = "DONE";\n }\n else {\n tokenizer._currentState = "QUERY";\n }\n}\nfunction nextQuery(tokenizer) {\n if (getCurrentCharacter(tokenizer) === "?") {\n nextCharacter(tokenizer);\n }\n const query = readRemaining(tokenizer);\n tokenizer._currentToken = URLToken.query(query);\n tokenizer._currentState = "DONE";\n}\n//# sourceMappingURL=url.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/util/sanitizer.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\nconst RedactedString = "REDACTED";\nconst defaultAllowedHeaderNames = [\n "x-ms-client-request-id",\n "x-ms-return-client-request-id",\n "x-ms-useragent",\n "x-ms-correlation-request-id",\n "x-ms-request-id",\n "client-request-id",\n "ms-cv",\n "return-client-request-id",\n "traceparent",\n "Access-Control-Allow-Credentials",\n "Access-Control-Allow-Headers",\n "Access-Control-Allow-Methods",\n "Access-Control-Allow-Origin",\n "Access-Control-Expose-Headers",\n "Access-Control-Max-Age",\n "Access-Control-Request-Headers",\n "Access-Control-Request-Method",\n "Origin",\n "Accept",\n "Accept-Encoding",\n "Cache-Control",\n "Connection",\n "Content-Length",\n "Content-Type",\n "Date",\n "ETag",\n "Expires",\n "If-Match",\n "If-Modified-Since",\n "If-None-Match",\n "If-Unmodified-Since",\n "Last-Modified",\n "Pragma",\n "Request-Id",\n "Retry-After",\n "Server",\n "Transfer-Encoding",\n "User-Agent",\n "WWW-Authenticate",\n];\nconst defaultAllowedQueryParameters = ["api-version"];\nclass Sanitizer {\n constructor({ allowedHeaderNames = [], allowedQueryParameters = [] } = {}) {\n allowedHeaderNames = Array.isArray(allowedHeaderNames)\n ? defaultAllowedHeaderNames.concat(allowedHeaderNames)\n : defaultAllowedHeaderNames;\n allowedQueryParameters = Array.isArray(allowedQueryParameters)\n ? defaultAllowedQueryParameters.concat(allowedQueryParameters)\n : defaultAllowedQueryParameters;\n this.allowedHeaderNames = new Set(allowedHeaderNames.map((n) => n.toLowerCase()));\n this.allowedQueryParameters = new Set(allowedQueryParameters.map((p) => p.toLowerCase()));\n }\n sanitize(obj) {\n const seen = new Set();\n return JSON.stringify(obj, (key, value) => {\n // Ensure Errors include their interesting non-enumerable members\n if (value instanceof Error) {\n return Object.assign(Object.assign({}, value), { name: value.name, message: value.message });\n }\n if (key === "_headersMap") {\n return this.sanitizeHeaders(value);\n }\n else if (key === "url") {\n return this.sanitizeUrl(value);\n }\n else if (key === "query") {\n return this.sanitizeQuery(value);\n }\n else if (key === "body") {\n // Don\'t log the request body\n return undefined;\n }\n else if (key === "response") {\n // Don\'t log response again\n return undefined;\n }\n else if (key === "operationSpec") {\n // When using sendOperationRequest, the request carries a massive\n // field with the autorest spec. No need to log it.\n return undefined;\n }\n else if (Array.isArray(value) || isObject(value)) {\n if (seen.has(value)) {\n return "[Circular]";\n }\n seen.add(value);\n }\n return value;\n }, 2);\n }\n sanitizeHeaders(value) {\n return this.sanitizeObject(value, this.allowedHeaderNames, (v, k) => v[k].value);\n }\n sanitizeQuery(value) {\n return this.sanitizeObject(value, this.allowedQueryParameters, (v, k) => v[k]);\n }\n sanitizeObject(value, allowedKeys, accessor) {\n if (typeof value !== "object" || value === null) {\n return value;\n }\n const sanitized = {};\n for (const k of Object.keys(value)) {\n if (allowedKeys.has(k.toLowerCase())) {\n sanitized[k] = accessor(value, k);\n }\n else {\n sanitized[k] = RedactedString;\n }\n }\n return sanitized;\n }\n sanitizeUrl(value) {\n if (typeof value !== "string" || value === null) {\n return value;\n }\n const urlBuilder = URLBuilder.parse(value);\n const queryString = urlBuilder.getQuery();\n if (!queryString) {\n return value;\n }\n const query = URLQuery.parse(queryString);\n for (const k of query.keys()) {\n if (!this.allowedQueryParameters.has(k.toLowerCase())) {\n query.set(k, RedactedString);\n }\n }\n urlBuilder.setQuery(query.toString());\n return urlBuilder.toString();\n }\n}\n//# sourceMappingURL=sanitizer.js.map\n// EXTERNAL MODULE: external "util"\nvar external_util_ = __webpack_require__(3837);\nvar external_util_default = /*#__PURE__*/__webpack_require__.n(external_util_);\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/util/inspect.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nconst custom = external_util_.inspect.custom;\n//# sourceMappingURL=inspect.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/restError.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\nconst errorSanitizer = new Sanitizer();\n/**\n * An error resulting from an HTTP request to a service endpoint.\n */\nclass RestError extends Error {\n constructor(message, code, statusCode, request, response) {\n super(message);\n this.name = "RestError";\n this.code = code;\n this.statusCode = statusCode;\n this.request = request;\n this.response = response;\n Object.setPrototypeOf(this, RestError.prototype);\n }\n /**\n * Logging method for util.inspect in Node\n */\n [custom]() {\n return `RestError: ${this.message} \\n ${errorSanitizer.sanitize(this)}`;\n }\n}\n/**\n * A constant string to identify errors that may arise when making an HTTP request that indicates an issue with the transport layer (e.g. the hostname of the URL cannot be resolved via DNS.)\n */\nRestError.REQUEST_SEND_ERROR = "REQUEST_SEND_ERROR";\n/**\n * A constant string to identify errors that may arise from parsing an incoming HTTP response. Usually indicates a malformed HTTP body, such as an encoded JSON payload that is incomplete.\n */\nRestError.PARSE_ERROR = "PARSE_ERROR";\n//# sourceMappingURL=restError.js.map\n;// CONCATENATED MODULE: ./node_modules/tslib/tslib.es6.mjs\n/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nfunction __extends(d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nvar __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nfunction __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === "function")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nfunction __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nfunction __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nfunction __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }\n var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";\n var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === "accessor") {\n if (result === void 0) continue;\n if (result === null || typeof result !== "object") throw new TypeError("Object expected");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === "field") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nfunction __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nfunction __propKey(x) {\n return typeof x === "symbol" ? x : "".concat(x);\n};\n\nfunction __setFunctionName(f, name, prefix) {\n if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";\n return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });\n};\n\nfunction __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nfunction __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nfunction __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError("Generator is already executing.");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nvar __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nfunction __exportStar(m, o) {\n for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nfunction __values(o) {\n var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === "number") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");\n}\n\nfunction __read(o, n) {\n var m = typeof Symbol === "function" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i["return"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nfunction __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nfunction __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nfunction __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nfunction tslib_es6_await(v) {\n return this instanceof tslib_es6_await ? (this.v = v, this) : new tslib_es6_await(v);\n}\n\nfunction tslib_es6_asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof tslib_es6_await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume("next", value); }\n function reject(value) { resume("throw", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nfunction tslib_es6_asyncDelegator(o) {\n var i, p;\n return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: tslib_es6_await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nfunction tslib_es6_asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nfunction __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n};\n\nfunction __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nfunction __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");\n if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");\n return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === "m") throw new TypeError("Private method is not writable");\n if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");\n if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");\n return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nfunction __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use \'in\' operator on non-object");\n return typeof state === "function" ? receiver === state : state.has(receiver);\n}\n\nfunction __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");\n var dispose;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");\n dispose = value[Symbol.dispose];\n }\n if (typeof dispose !== "function") throw new TypeError("Object not disposable.");\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;\n};\n\nfunction __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;\n env.hasError = true;\n }\n function next() {\n while (env.stack.length) {\n var rec = env.stack.pop();\n try {\n var result = rec.dispose && rec.dispose.call(rec.value);\n if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n catch (e) {\n fail(e);\n }\n }\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\n/* harmony default export */ const tslib_es6 = ({\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await: tslib_es6_await,\n __asyncGenerator: tslib_es6_asyncGenerator,\n __asyncDelegator: tslib_es6_asyncDelegator,\n __asyncValues: tslib_es6_asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n});\n\n;// CONCATENATED MODULE: ./node_modules/@azure/core-util/dist-esm/src/checkEnvironment.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nvar _a, _b, _c, _d;\n/**\n * A constant that indicates whether the environment the code is running is a Web Browser.\n */\n// eslint-disable-next-line @azure/azure-sdk/ts-no-window\nconst isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined";\n/**\n * A constant that indicates whether the environment the code is running is a Web Worker.\n */\nconst isWebWorker = typeof self === "object" &&\n typeof (self === null || self === void 0 ? void 0 : self.importScripts) === "function" &&\n (((_a = self.constructor) === null || _a === void 0 ? void 0 : _a.name) === "DedicatedWorkerGlobalScope" ||\n ((_b = self.constructor) === null || _b === void 0 ? void 0 : _b.name) === "ServiceWorkerGlobalScope" ||\n ((_c = self.constructor) === null || _c === void 0 ? void 0 : _c.name) === "SharedWorkerGlobalScope");\n/**\n * A constant that indicates whether the environment the code is running is Deno.\n */\nconst isDeno = typeof Deno !== "undefined" &&\n typeof Deno.version !== "undefined" &&\n typeof Deno.version.deno !== "undefined";\n/**\n * A constant that indicates whether the environment the code is running is Node.JS.\n */\nconst checkEnvironment_isNode = typeof process !== "undefined" &&\n Boolean(process.version) &&\n Boolean((_d = process.versions) === null || _d === void 0 ? void 0 : _d.node) &&\n // Deno thought it was a good idea to spoof process.versions.node, see https://deno.land/std@0.177.0/node/process.ts?s=versions\n !isDeno;\n/**\n * A constant that indicates whether the environment the code is running is Bun.sh.\n */\nconst isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undefined";\n/**\n * A constant that indicates whether the environment the code is running is in React-Native.\n */\n// https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js\nconst isReactNative = typeof navigator !== "undefined" && (navigator === null || navigator === void 0 ? void 0 : navigator.product) === "ReactNative";\n//# sourceMappingURL=checkEnvironment.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-auth/dist-esm/src/tokenCredential.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * Tests an object to determine whether it implements TokenCredential.\n *\n * @param credential - The assumed TokenCredential to be tested.\n */\nfunction isTokenCredential(credential) {\n // Check for an object with a \'getToken\' function and possibly with\n // a \'signRequest\' function. We do this check to make sure that\n // a ServiceClientCredentials implementor (like TokenClientCredentials\n // in ms-rest-nodeauth) doesn\'t get mistaken for a TokenCredential if\n // it doesn\'t actually implement TokenCredential also.\n const castCredential = credential;\n return (castCredential &&\n typeof castCredential.getToken === "function" &&\n (castCredential.signRequest === undefined || castCredential.getToken.length > 0));\n}\n//# sourceMappingURL=tokenCredential.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/httpPipelineLogLevel.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * The different levels of logs that can be used with the HttpPipelineLogger.\n */\nvar HttpPipelineLogLevel;\n(function (HttpPipelineLogLevel) {\n /**\n * A log level that indicates that no logs will be logged.\n */\n HttpPipelineLogLevel[HttpPipelineLogLevel["OFF"] = 0] = "OFF";\n /**\n * An error log.\n */\n HttpPipelineLogLevel[HttpPipelineLogLevel["ERROR"] = 1] = "ERROR";\n /**\n * A warning log.\n */\n HttpPipelineLogLevel[HttpPipelineLogLevel["WARNING"] = 2] = "WARNING";\n /**\n * An information log.\n */\n HttpPipelineLogLevel[HttpPipelineLogLevel["INFO"] = 3] = "INFO";\n})(HttpPipelineLogLevel || (HttpPipelineLogLevel = {}));\n//# sourceMappingURL=httpPipelineLogLevel.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/requestPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * The base class from which all request policies derive.\n */\nclass BaseRequestPolicy {\n /**\n * The main method to implement that manipulates a request/response.\n */\n constructor(\n /**\n * The next policy in the pipeline. Each policy is responsible for executing the next one if the request is to continue through the pipeline.\n */\n _nextPolicy, \n /**\n * The options that can be passed to a given request policy.\n */\n _options) {\n this._nextPolicy = _nextPolicy;\n this._options = _options;\n }\n /**\n * Get whether or not a log with the provided log level should be logged.\n * @param logLevel - The log level of the log that will be logged.\n * @returns Whether or not a log with the provided log level should be logged.\n */\n shouldLog(logLevel) {\n return this._options.shouldLog(logLevel);\n }\n /**\n * Attempt to log the provided message to the provided logger. If no logger was provided or if\n * the log level does not meat the logger\'s threshold, then nothing will be logged.\n * @param logLevel - The log level of this log.\n * @param message - The message of this log.\n */\n log(logLevel, message) {\n this._options.log(logLevel, message);\n }\n}\n/**\n * Optional properties that can be used when creating a RequestPolicy.\n */\nclass RequestPolicyOptions {\n constructor(_logger) {\n this._logger = _logger;\n }\n /**\n * Get whether or not a log with the provided log level should be logged.\n * @param logLevel - The log level of the log that will be logged.\n * @returns Whether or not a log with the provided log level should be logged.\n */\n shouldLog(logLevel) {\n return (!!this._logger &&\n logLevel !== HttpPipelineLogLevel.OFF &&\n logLevel <= this._logger.minimumLogLevel);\n }\n /**\n * Attempt to log the provided message to the provided logger. If no logger was provided or if\n * the log level does not meet the logger\'s threshold, then nothing will be logged.\n * @param logLevel - The log level of this log.\n * @param message - The message of this log.\n */\n log(logLevel, message) {\n if (this._logger && this.shouldLog(logLevel)) {\n this._logger.log(logLevel, message);\n }\n }\n}\n//# sourceMappingURL=requestPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/util/constants.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * A set of constants used internally when processing requests.\n */\nconst constants_Constants = {\n /**\n * The core-http version\n */\n coreHttpVersion: "3.0.4",\n /**\n * Specifies HTTP.\n */\n HTTP: "http:",\n /**\n * Specifies HTTPS.\n */\n HTTPS: "https:",\n /**\n * Specifies HTTP Proxy.\n */\n HTTP_PROXY: "HTTP_PROXY",\n /**\n * Specifies HTTPS Proxy.\n */\n HTTPS_PROXY: "HTTPS_PROXY",\n /**\n * Specifies NO Proxy.\n */\n NO_PROXY: "NO_PROXY",\n /**\n * Specifies ALL Proxy.\n */\n ALL_PROXY: "ALL_PROXY",\n HttpConstants: {\n /**\n * Http Verbs\n */\n HttpVerbs: {\n PUT: "PUT",\n GET: "GET",\n DELETE: "DELETE",\n POST: "POST",\n MERGE: "MERGE",\n HEAD: "HEAD",\n PATCH: "PATCH",\n },\n StatusCodes: {\n TooManyRequests: 429,\n ServiceUnavailable: 503,\n },\n },\n /**\n * Defines constants for use with HTTP headers.\n */\n HeaderConstants: {\n /**\n * The Authorization header.\n */\n AUTHORIZATION: "authorization",\n AUTHORIZATION_SCHEME: "Bearer",\n /**\n * The Retry-After response-header field can be used with a 503 (Service\n * Unavailable) or 349 (Too Many Requests) responses to indicate how long\n * the service is expected to be unavailable to the requesting client.\n */\n RETRY_AFTER: "Retry-After",\n /**\n * The UserAgent header.\n */\n USER_AGENT: "User-Agent",\n },\n};\n//# sourceMappingURL=constants.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/proxyPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n/**\n * Stores the patterns specified in NO_PROXY environment variable.\n * @internal\n */\nconst globalNoProxyList = [];\nlet noProxyListLoaded = false;\n/** A cache of whether a host should bypass the proxy. */\nconst globalBypassedMap = new Map();\nfunction loadEnvironmentProxyValue() {\n if (!process) {\n return undefined;\n }\n const httpsProxy = getEnvironmentValue(constants_Constants.HTTPS_PROXY);\n const allProxy = getEnvironmentValue(constants_Constants.ALL_PROXY);\n const httpProxy = getEnvironmentValue(constants_Constants.HTTP_PROXY);\n return httpsProxy || allProxy || httpProxy;\n}\n/**\n * Check whether the host of a given `uri` matches any pattern in the no proxy list.\n * If there\'s a match, any request sent to the same host shouldn\'t have the proxy settings set.\n * This implementation is a port of https://github.com/Azure/azure-sdk-for-net/blob/8cca811371159e527159c7eb65602477898683e2/sdk/core/Azure.Core/src/Pipeline/Internal/HttpEnvironmentProxy.cs#L210\n */\nfunction isBypassed(uri, noProxyList, bypassedMap) {\n if (noProxyList.length === 0) {\n return false;\n }\n const host = URLBuilder.parse(uri).getHost();\n if (bypassedMap === null || bypassedMap === void 0 ? void 0 : bypassedMap.has(host)) {\n return bypassedMap.get(host);\n }\n let isBypassedFlag = false;\n for (const pattern of noProxyList) {\n if (pattern[0] === ".") {\n // This should match either domain it self or any subdomain or host\n // .foo.com will match foo.com it self or *.foo.com\n if (host.endsWith(pattern)) {\n isBypassedFlag = true;\n }\n else {\n if (host.length === pattern.length - 1 && host === pattern.slice(1)) {\n isBypassedFlag = true;\n }\n }\n }\n else {\n if (host === pattern) {\n isBypassedFlag = true;\n }\n }\n }\n bypassedMap === null || bypassedMap === void 0 ? void 0 : bypassedMap.set(host, isBypassedFlag);\n return isBypassedFlag;\n}\n/**\n * @internal\n */\nfunction loadNoProxy() {\n const noProxy = getEnvironmentValue(constants_Constants.NO_PROXY);\n noProxyListLoaded = true;\n if (noProxy) {\n return noProxy\n .split(",")\n .map((item) => item.trim())\n .filter((item) => item.length);\n }\n return [];\n}\n/**\n * Converts a given URL of a proxy server into `ProxySettings` or attempts to retrieve `ProxySettings` from the current environment if one is not passed.\n * @param proxyUrl - URL of the proxy\n * @returns The default proxy settings, or undefined.\n */\nfunction getDefaultProxySettings(proxyUrl) {\n if (!proxyUrl) {\n proxyUrl = loadEnvironmentProxyValue();\n if (!proxyUrl) {\n return undefined;\n }\n }\n const { username, password, urlWithoutAuth } = extractAuthFromUrl(proxyUrl);\n const parsedUrl = URLBuilder.parse(urlWithoutAuth);\n const schema = parsedUrl.getScheme() ? parsedUrl.getScheme() + "://" : "";\n return {\n host: schema + parsedUrl.getHost(),\n port: Number.parseInt(parsedUrl.getPort() || "80"),\n username,\n password,\n };\n}\n/**\n * A policy that allows one to apply proxy settings to all requests.\n * If not passed static settings, they will be retrieved from the HTTPS_PROXY\n * or HTTP_PROXY environment variables.\n * @param proxySettings - ProxySettings to use on each request.\n * @param options - additional settings, for example, custom NO_PROXY patterns\n */\nfunction proxyPolicy_proxyPolicy(proxySettings, options) {\n if (!proxySettings) {\n proxySettings = getDefaultProxySettings();\n }\n if (!noProxyListLoaded) {\n globalNoProxyList.push(...loadNoProxy());\n }\n return {\n create: (nextPolicy, requestPolicyOptions) => {\n return new ProxyPolicy(nextPolicy, requestPolicyOptions, proxySettings, options === null || options === void 0 ? void 0 : options.customNoProxyList);\n },\n };\n}\nfunction extractAuthFromUrl(url) {\n const atIndex = url.indexOf("@");\n if (atIndex === -1) {\n return { urlWithoutAuth: url };\n }\n const schemeIndex = url.indexOf("://");\n const authStart = schemeIndex !== -1 ? schemeIndex + 3 : 0;\n const auth = url.substring(authStart, atIndex);\n const colonIndex = auth.indexOf(":");\n const hasPassword = colonIndex !== -1;\n const username = hasPassword ? auth.substring(0, colonIndex) : auth;\n const password = hasPassword ? auth.substring(colonIndex + 1) : undefined;\n const urlWithoutAuth = url.substring(0, authStart) + url.substring(atIndex + 1);\n return {\n username,\n password,\n urlWithoutAuth,\n };\n}\nclass ProxyPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options, proxySettings, customNoProxyList) {\n super(nextPolicy, options);\n this.proxySettings = proxySettings;\n this.customNoProxyList = customNoProxyList;\n }\n sendRequest(request) {\n var _a;\n if (!request.proxySettings &&\n !isBypassed(request.url, (_a = this.customNoProxyList) !== null && _a !== void 0 ? _a : globalNoProxyList, this.customNoProxyList ? undefined : globalBypassedMap)) {\n request.proxySettings = this.proxySettings;\n }\n return this._nextPolicy.sendRequest(request);\n }\n}\n//# sourceMappingURL=proxyPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/platform/node/globalThis.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** only globals that common to node and browsers are allowed */\n// eslint-disable-next-line node/no-unsupported-features/es-builtins\nvar _globalThis = typeof globalThis === \'object\' ? globalThis : global;\n//# sourceMappingURL=globalThis.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/version.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// this is autogenerated file, see scripts/version-update.js\nvar VERSION = \'1.7.0\';\n//# sourceMappingURL=version.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/internal/semver.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar re = /^(\\d+)\\.(\\d+)\\.(\\d+)(-(.+))?$/;\n/**\n * Create a function to test an API version to see if it is compatible with the provided ownVersion.\n *\n * The returned function has the following semantics:\n * - Exact match is always compatible\n * - Major versions must match exactly\n * - 1.x package cannot use global 2.x package\n * - 2.x package cannot use global 1.x package\n * - The minor version of the API module requesting access to the global API must be less than or equal to the minor version of this API\n * - 1.3 package may use 1.4 global because the later global contains all functions 1.3 expects\n * - 1.4 package may NOT use 1.3 global because it may try to call functions which don\'t exist on 1.3\n * - If the major version is 0, the minor version is treated as the major and the patch is treated as the minor\n * - Patch and build tag differences are not considered at this time\n *\n * @param ownVersion version which should be checked against\n */\nfunction _makeCompatibilityCheck(ownVersion) {\n var acceptedVersions = new Set([ownVersion]);\n var rejectedVersions = new Set();\n var myVersionMatch = ownVersion.match(re);\n if (!myVersionMatch) {\n // we cannot guarantee compatibility so we always return noop\n return function () { return false; };\n }\n var ownVersionParsed = {\n major: +myVersionMatch[1],\n minor: +myVersionMatch[2],\n patch: +myVersionMatch[3],\n prerelease: myVersionMatch[4],\n };\n // if ownVersion has a prerelease tag, versions must match exactly\n if (ownVersionParsed.prerelease != null) {\n return function isExactmatch(globalVersion) {\n return globalVersion === ownVersion;\n };\n }\n function _reject(v) {\n rejectedVersions.add(v);\n return false;\n }\n function _accept(v) {\n acceptedVersions.add(v);\n return true;\n }\n return function isCompatible(globalVersion) {\n if (acceptedVersions.has(globalVersion)) {\n return true;\n }\n if (rejectedVersions.has(globalVersion)) {\n return false;\n }\n var globalVersionMatch = globalVersion.match(re);\n if (!globalVersionMatch) {\n // cannot parse other version\n // we cannot guarantee compatibility so we always noop\n return _reject(globalVersion);\n }\n var globalVersionParsed = {\n major: +globalVersionMatch[1],\n minor: +globalVersionMatch[2],\n patch: +globalVersionMatch[3],\n prerelease: globalVersionMatch[4],\n };\n // if globalVersion has a prerelease tag, versions must match exactly\n if (globalVersionParsed.prerelease != null) {\n return _reject(globalVersion);\n }\n // major versions must match\n if (ownVersionParsed.major !== globalVersionParsed.major) {\n return _reject(globalVersion);\n }\n if (ownVersionParsed.major === 0) {\n if (ownVersionParsed.minor === globalVersionParsed.minor &&\n ownVersionParsed.patch <= globalVersionParsed.patch) {\n return _accept(globalVersion);\n }\n return _reject(globalVersion);\n }\n if (ownVersionParsed.minor <= globalVersionParsed.minor) {\n return _accept(globalVersion);\n }\n return _reject(globalVersion);\n };\n}\n/**\n * Test an API version to see if it is compatible with this API.\n *\n * - Exact match is always compatible\n * - Major versions must match exactly\n * - 1.x package cannot use global 2.x package\n * - 2.x package cannot use global 1.x package\n * - The minor version of the API module requesting access to the global API must be less than or equal to the minor version of this API\n * - 1.3 package may use 1.4 global because the later global contains all functions 1.3 expects\n * - 1.4 package may NOT use 1.3 global because it may try to call functions which don\'t exist on 1.3\n * - If the major version is 0, the minor version is treated as the major and the patch is treated as the minor\n * - Patch and build tag differences are not considered at this time\n *\n * @param version version of the API requesting an instance of the global API\n */\nvar isCompatible = _makeCompatibilityCheck(VERSION);\n//# sourceMappingURL=semver.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/internal/global-utils.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n\nvar major = VERSION.split(\'.\')[0];\nvar GLOBAL_OPENTELEMETRY_API_KEY = Symbol.for("opentelemetry.js.api." + major);\nvar _global = _globalThis;\nfunction registerGlobal(type, instance, diag, allowOverride) {\n var _a;\n if (allowOverride === void 0) { allowOverride = false; }\n var api = (_global[GLOBAL_OPENTELEMETRY_API_KEY] = (_a = _global[GLOBAL_OPENTELEMETRY_API_KEY]) !== null && _a !== void 0 ? _a : {\n version: VERSION,\n });\n if (!allowOverride && api[type]) {\n // already registered an API of this type\n var err = new Error("@opentelemetry/api: Attempted duplicate registration of API: " + type);\n diag.error(err.stack || err.message);\n return false;\n }\n if (api.version !== VERSION) {\n // All registered APIs must be of the same version exactly\n var err = new Error("@opentelemetry/api: Registration of version v" + api.version + " for " + type + " does not match previously registered API v" + VERSION);\n diag.error(err.stack || err.message);\n return false;\n }\n api[type] = instance;\n diag.debug("@opentelemetry/api: Registered a global for " + type + " v" + VERSION + ".");\n return true;\n}\nfunction getGlobal(type) {\n var _a, _b;\n var globalVersion = (_a = _global[GLOBAL_OPENTELEMETRY_API_KEY]) === null || _a === void 0 ? void 0 : _a.version;\n if (!globalVersion || !isCompatible(globalVersion)) {\n return;\n }\n return (_b = _global[GLOBAL_OPENTELEMETRY_API_KEY]) === null || _b === void 0 ? void 0 : _b[type];\n}\nfunction unregisterGlobal(type, diag) {\n diag.debug("@opentelemetry/api: Unregistering a global for " + type + " v" + VERSION + ".");\n var api = _global[GLOBAL_OPENTELEMETRY_API_KEY];\n if (api) {\n delete api[type];\n }\n}\n//# sourceMappingURL=global-utils.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/context/context.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Get a key to uniquely identify a context value */\nfunction createContextKey(description) {\n // The specification states that for the same input, multiple calls should\n // return different keys. Due to the nature of the JS dependency management\n // system, this creates problems where multiple versions of some package\n // could hold different keys for the same property.\n //\n // Therefore, we use Symbol.for which returns the same key for the same input.\n return Symbol.for(description);\n}\nvar BaseContext = /** @class */ (function () {\n /**\n * Construct a new context which inherits values from an optional parent context.\n *\n * @param parentContext a context from which to inherit values\n */\n function BaseContext(parentContext) {\n // for minification\n var self = this;\n self._currentContext = parentContext ? new Map(parentContext) : new Map();\n self.getValue = function (key) { return self._currentContext.get(key); };\n self.setValue = function (key, value) {\n var context = new BaseContext(self._currentContext);\n context._currentContext.set(key, value);\n return context;\n };\n self.deleteValue = function (key) {\n var context = new BaseContext(self._currentContext);\n context._currentContext.delete(key);\n return context;\n };\n }\n return BaseContext;\n}());\n/** The root context is used as the default parent context when there is no active context */\nvar ROOT_CONTEXT = new BaseContext();\n//# sourceMappingURL=context.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/context/NoopContextManager.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar NoopContextManager_read = (undefined && undefined.__read) || function (o, n) {\n var m = typeof Symbol === "function" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i["return"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar NoopContextManager_spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\n\nvar NoopContextManager = /** @class */ (function () {\n function NoopContextManager() {\n }\n NoopContextManager.prototype.active = function () {\n return ROOT_CONTEXT;\n };\n NoopContextManager.prototype.with = function (_context, fn, thisArg) {\n var args = [];\n for (var _i = 3; _i < arguments.length; _i++) {\n args[_i - 3] = arguments[_i];\n }\n return fn.call.apply(fn, NoopContextManager_spreadArray([thisArg], NoopContextManager_read(args), false));\n };\n NoopContextManager.prototype.bind = function (_context, target) {\n return target;\n };\n NoopContextManager.prototype.enable = function () {\n return this;\n };\n NoopContextManager.prototype.disable = function () {\n return this;\n };\n return NoopContextManager;\n}());\n\n//# sourceMappingURL=NoopContextManager.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/diag/ComponentLogger.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar ComponentLogger_read = (undefined && undefined.__read) || function (o, n) {\n var m = typeof Symbol === "function" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i["return"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar ComponentLogger_spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\n\n/**\n * Component Logger which is meant to be used as part of any component which\n * will add automatically additional namespace in front of the log message.\n * It will then forward all message to global diag logger\n * @example\n * const cLogger = diag.createComponentLogger({ namespace: \'@opentelemetry/instrumentation-http\' });\n * cLogger.debug(\'test\');\n * // @opentelemetry/instrumentation-http test\n */\nvar DiagComponentLogger = /** @class */ (function () {\n function DiagComponentLogger(props) {\n this._namespace = props.namespace || \'DiagComponentLogger\';\n }\n DiagComponentLogger.prototype.debug = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return logProxy(\'debug\', this._namespace, args);\n };\n DiagComponentLogger.prototype.error = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return logProxy(\'error\', this._namespace, args);\n };\n DiagComponentLogger.prototype.info = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return logProxy(\'info\', this._namespace, args);\n };\n DiagComponentLogger.prototype.warn = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return logProxy(\'warn\', this._namespace, args);\n };\n DiagComponentLogger.prototype.verbose = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return logProxy(\'verbose\', this._namespace, args);\n };\n return DiagComponentLogger;\n}());\n\nfunction logProxy(funcName, namespace, args) {\n var logger = getGlobal(\'diag\');\n // shortcut if logger not set\n if (!logger) {\n return;\n }\n args.unshift(namespace);\n return logger[funcName].apply(logger, ComponentLogger_spreadArray([], ComponentLogger_read(args), false));\n}\n//# sourceMappingURL=ComponentLogger.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/diag/types.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Defines the available internal logging levels for the diagnostic logger, the numeric values\n * of the levels are defined to match the original values from the initial LogLevel to avoid\n * compatibility/migration issues for any implementation that assume the numeric ordering.\n */\nvar DiagLogLevel;\n(function (DiagLogLevel) {\n /** Diagnostic Logging level setting to disable all logging (except and forced logs) */\n DiagLogLevel[DiagLogLevel["NONE"] = 0] = "NONE";\n /** Identifies an error scenario */\n DiagLogLevel[DiagLogLevel["ERROR"] = 30] = "ERROR";\n /** Identifies a warning scenario */\n DiagLogLevel[DiagLogLevel["WARN"] = 50] = "WARN";\n /** General informational log message */\n DiagLogLevel[DiagLogLevel["INFO"] = 60] = "INFO";\n /** General debug log message */\n DiagLogLevel[DiagLogLevel["DEBUG"] = 70] = "DEBUG";\n /**\n * Detailed trace level logging should only be used for development, should only be set\n * in a development environment.\n */\n DiagLogLevel[DiagLogLevel["VERBOSE"] = 80] = "VERBOSE";\n /** Used to set the logging level to include all logging */\n DiagLogLevel[DiagLogLevel["ALL"] = 9999] = "ALL";\n})(DiagLogLevel || (DiagLogLevel = {}));\n//# sourceMappingURL=types.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/diag/internal/logLevelLogger.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nfunction createLogLevelDiagLogger(maxLevel, logger) {\n if (maxLevel < DiagLogLevel.NONE) {\n maxLevel = DiagLogLevel.NONE;\n }\n else if (maxLevel > DiagLogLevel.ALL) {\n maxLevel = DiagLogLevel.ALL;\n }\n // In case the logger is null or undefined\n logger = logger || {};\n function _filterFunc(funcName, theLevel) {\n var theFunc = logger[funcName];\n if (typeof theFunc === \'function\' && maxLevel >= theLevel) {\n return theFunc.bind(logger);\n }\n return function () { };\n }\n return {\n error: _filterFunc(\'error\', DiagLogLevel.ERROR),\n warn: _filterFunc(\'warn\', DiagLogLevel.WARN),\n info: _filterFunc(\'info\', DiagLogLevel.INFO),\n debug: _filterFunc(\'debug\', DiagLogLevel.DEBUG),\n verbose: _filterFunc(\'verbose\', DiagLogLevel.VERBOSE),\n };\n}\n//# sourceMappingURL=logLevelLogger.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/api/diag.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar diag_read = (undefined && undefined.__read) || function (o, n) {\n var m = typeof Symbol === "function" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i["return"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar diag_spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\n\n\n\n\nvar API_NAME = \'diag\';\n/**\n * Singleton object which represents the entry point to the OpenTelemetry internal\n * diagnostic API\n */\nvar DiagAPI = /** @class */ (function () {\n /**\n * Private internal constructor\n * @private\n */\n function DiagAPI() {\n function _logProxy(funcName) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var logger = getGlobal(\'diag\');\n // shortcut if logger not set\n if (!logger)\n return;\n return logger[funcName].apply(logger, diag_spreadArray([], diag_read(args), false));\n };\n }\n // Using self local variable for minification purposes as \'this\' cannot be minified\n var self = this;\n // DiagAPI specific functions\n var setLogger = function (logger, optionsOrLogLevel) {\n var _a, _b, _c;\n if (optionsOrLogLevel === void 0) { optionsOrLogLevel = { logLevel: DiagLogLevel.INFO }; }\n if (logger === self) {\n // There isn\'t much we can do here.\n // Logging to the console might break the user application.\n // Try to log to self. If a logger was previously registered it will receive the log.\n var err = new Error(\'Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation\');\n self.error((_a = err.stack) !== null && _a !== void 0 ? _a : err.message);\n return false;\n }\n if (typeof optionsOrLogLevel === \'number\') {\n optionsOrLogLevel = {\n logLevel: optionsOrLogLevel,\n };\n }\n var oldLogger = getGlobal(\'diag\');\n var newLogger = createLogLevelDiagLogger((_b = optionsOrLogLevel.logLevel) !== null && _b !== void 0 ? _b : DiagLogLevel.INFO, logger);\n // There already is an logger registered. We\'ll let it know before overwriting it.\n if (oldLogger && !optionsOrLogLevel.suppressOverrideMessage) {\n var stack = (_c = new Error().stack) !== null && _c !== void 0 ? _c : \'\';\n oldLogger.warn("Current logger will be overwritten from " + stack);\n newLogger.warn("Current logger will overwrite one already registered from " + stack);\n }\n return registerGlobal(\'diag\', newLogger, self, true);\n };\n self.setLogger = setLogger;\n self.disable = function () {\n unregisterGlobal(API_NAME, self);\n };\n self.createComponentLogger = function (options) {\n return new DiagComponentLogger(options);\n };\n self.verbose = _logProxy(\'verbose\');\n self.debug = _logProxy(\'debug\');\n self.info = _logProxy(\'info\');\n self.warn = _logProxy(\'warn\');\n self.error = _logProxy(\'error\');\n }\n /** Get the singleton instance of the DiagAPI API */\n DiagAPI.instance = function () {\n if (!this._instance) {\n this._instance = new DiagAPI();\n }\n return this._instance;\n };\n return DiagAPI;\n}());\n\n//# sourceMappingURL=diag.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/api/context.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar context_read = (undefined && undefined.__read) || function (o, n) {\n var m = typeof Symbol === "function" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i["return"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar context_spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\n\n\n\nvar context_API_NAME = \'context\';\nvar NOOP_CONTEXT_MANAGER = new NoopContextManager();\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Context API\n */\nvar ContextAPI = /** @class */ (function () {\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n function ContextAPI() {\n }\n /** Get the singleton instance of the Context API */\n ContextAPI.getInstance = function () {\n if (!this._instance) {\n this._instance = new ContextAPI();\n }\n return this._instance;\n };\n /**\n * Set the current context manager.\n *\n * @returns true if the context manager was successfully registered, else false\n */\n ContextAPI.prototype.setGlobalContextManager = function (contextManager) {\n return registerGlobal(context_API_NAME, contextManager, DiagAPI.instance());\n };\n /**\n * Get the currently active context\n */\n ContextAPI.prototype.active = function () {\n return this._getContextManager().active();\n };\n /**\n * Execute a function with an active context\n *\n * @param context context to be active during function execution\n * @param fn function to execute in a context\n * @param thisArg optional receiver to be used for calling fn\n * @param args optional arguments forwarded to fn\n */\n ContextAPI.prototype.with = function (context, fn, thisArg) {\n var _a;\n var args = [];\n for (var _i = 3; _i < arguments.length; _i++) {\n args[_i - 3] = arguments[_i];\n }\n return (_a = this._getContextManager()).with.apply(_a, context_spreadArray([context, fn, thisArg], context_read(args), false));\n };\n /**\n * Bind a context to a target function or event emitter\n *\n * @param context context to bind to the event emitter or function. Defaults to the currently active context\n * @param target function or event emitter to bind\n */\n ContextAPI.prototype.bind = function (context, target) {\n return this._getContextManager().bind(context, target);\n };\n ContextAPI.prototype._getContextManager = function () {\n return getGlobal(context_API_NAME) || NOOP_CONTEXT_MANAGER;\n };\n /** Disable and remove the global context manager */\n ContextAPI.prototype.disable = function () {\n this._getContextManager().disable();\n unregisterGlobal(context_API_NAME, DiagAPI.instance());\n };\n return ContextAPI;\n}());\n\n//# sourceMappingURL=context.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/trace/trace_flags.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar TraceFlags;\n(function (TraceFlags) {\n /** Represents no flag set. */\n TraceFlags[TraceFlags["NONE"] = 0] = "NONE";\n /** Bit to represent whether trace is sampled in trace flags. */\n TraceFlags[TraceFlags["SAMPLED"] = 1] = "SAMPLED";\n})(TraceFlags || (TraceFlags = {}));\n//# sourceMappingURL=trace_flags.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/trace/invalid-span-constants.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar INVALID_SPANID = \'0000000000000000\';\nvar INVALID_TRACEID = \'00000000000000000000000000000000\';\nvar INVALID_SPAN_CONTEXT = {\n traceId: INVALID_TRACEID,\n spanId: INVALID_SPANID,\n traceFlags: TraceFlags.NONE,\n};\n//# sourceMappingURL=invalid-span-constants.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/trace/NonRecordingSpan.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * The NonRecordingSpan is the default {@link Span} that is used when no Span\n * implementation is available. All operations are no-op including context\n * propagation.\n */\nvar NonRecordingSpan = /** @class */ (function () {\n function NonRecordingSpan(_spanContext) {\n if (_spanContext === void 0) { _spanContext = INVALID_SPAN_CONTEXT; }\n this._spanContext = _spanContext;\n }\n // Returns a SpanContext.\n NonRecordingSpan.prototype.spanContext = function () {\n return this._spanContext;\n };\n // By default does nothing\n NonRecordingSpan.prototype.setAttribute = function (_key, _value) {\n return this;\n };\n // By default does nothing\n NonRecordingSpan.prototype.setAttributes = function (_attributes) {\n return this;\n };\n // By default does nothing\n NonRecordingSpan.prototype.addEvent = function (_name, _attributes) {\n return this;\n };\n // By default does nothing\n NonRecordingSpan.prototype.setStatus = function (_status) {\n return this;\n };\n // By default does nothing\n NonRecordingSpan.prototype.updateName = function (_name) {\n return this;\n };\n // By default does nothing\n NonRecordingSpan.prototype.end = function (_endTime) { };\n // isRecording always returns false for NonRecordingSpan.\n NonRecordingSpan.prototype.isRecording = function () {\n return false;\n };\n // By default does nothing\n NonRecordingSpan.prototype.recordException = function (_exception, _time) { };\n return NonRecordingSpan;\n}());\n\n//# sourceMappingURL=NonRecordingSpan.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/trace/context-utils.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n\n/**\n * span key\n */\nvar SPAN_KEY = createContextKey(\'OpenTelemetry Context Key SPAN\');\n/**\n * Return the span if one exists\n *\n * @param context context to get span from\n */\nfunction getSpan(context) {\n return context.getValue(SPAN_KEY) || undefined;\n}\n/**\n * Gets the span from the current context, if one exists.\n */\nfunction getActiveSpan() {\n return getSpan(ContextAPI.getInstance().active());\n}\n/**\n * Set the span on a context\n *\n * @param context context to use as parent\n * @param span span to set active\n */\nfunction setSpan(context, span) {\n return context.setValue(SPAN_KEY, span);\n}\n/**\n * Remove current span stored in the context\n *\n * @param context context to delete span from\n */\nfunction deleteSpan(context) {\n return context.deleteValue(SPAN_KEY);\n}\n/**\n * Wrap span context in a NoopSpan and set as span in a new\n * context\n *\n * @param context context to set active span on\n * @param spanContext span context to be wrapped\n */\nfunction setSpanContext(context, spanContext) {\n return setSpan(context, new NonRecordingSpan(spanContext));\n}\n/**\n * Get the span context of the span if it exists.\n *\n * @param context context to get values from\n */\nfunction getSpanContext(context) {\n var _a;\n return (_a = getSpan(context)) === null || _a === void 0 ? void 0 : _a.spanContext();\n}\n//# sourceMappingURL=context-utils.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/trace/spancontext-utils.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nvar VALID_TRACEID_REGEX = /^([0-9a-f]{32})$/i;\nvar VALID_SPANID_REGEX = /^[0-9a-f]{16}$/i;\nfunction isValidTraceId(traceId) {\n return VALID_TRACEID_REGEX.test(traceId) && traceId !== INVALID_TRACEID;\n}\nfunction isValidSpanId(spanId) {\n return VALID_SPANID_REGEX.test(spanId) && spanId !== INVALID_SPANID;\n}\n/**\n * Returns true if this {@link SpanContext} is valid.\n * @return true if this {@link SpanContext} is valid.\n */\nfunction isSpanContextValid(spanContext) {\n return (isValidTraceId(spanContext.traceId) && isValidSpanId(spanContext.spanId));\n}\n/**\n * Wrap the given {@link SpanContext} in a new non-recording {@link Span}\n *\n * @param spanContext span context to be wrapped\n * @returns a new non-recording {@link Span} with the provided context\n */\nfunction wrapSpanContext(spanContext) {\n return new NonRecordingSpan(spanContext);\n}\n//# sourceMappingURL=spancontext-utils.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/trace/NoopTracer.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n\n\nvar contextApi = ContextAPI.getInstance();\n/**\n * No-op implementations of {@link Tracer}.\n */\nvar NoopTracer = /** @class */ (function () {\n function NoopTracer() {\n }\n // startSpan starts a noop span.\n NoopTracer.prototype.startSpan = function (name, options, context) {\n if (context === void 0) { context = contextApi.active(); }\n var root = Boolean(options === null || options === void 0 ? void 0 : options.root);\n if (root) {\n return new NonRecordingSpan();\n }\n var parentFromContext = context && getSpanContext(context);\n if (isSpanContext(parentFromContext) &&\n isSpanContextValid(parentFromContext)) {\n return new NonRecordingSpan(parentFromContext);\n }\n else {\n return new NonRecordingSpan();\n }\n };\n NoopTracer.prototype.startActiveSpan = function (name, arg2, arg3, arg4) {\n var opts;\n var ctx;\n var fn;\n if (arguments.length < 2) {\n return;\n }\n else if (arguments.length === 2) {\n fn = arg2;\n }\n else if (arguments.length === 3) {\n opts = arg2;\n fn = arg3;\n }\n else {\n opts = arg2;\n ctx = arg3;\n fn = arg4;\n }\n var parentContext = ctx !== null && ctx !== void 0 ? ctx : contextApi.active();\n var span = this.startSpan(name, opts, parentContext);\n var contextWithSpanSet = setSpan(parentContext, span);\n return contextApi.with(contextWithSpanSet, fn, undefined, span);\n };\n return NoopTracer;\n}());\n\nfunction isSpanContext(spanContext) {\n return (typeof spanContext === \'object\' &&\n typeof spanContext[\'spanId\'] === \'string\' &&\n typeof spanContext[\'traceId\'] === \'string\' &&\n typeof spanContext[\'traceFlags\'] === \'number\');\n}\n//# sourceMappingURL=NoopTracer.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/trace/ProxyTracer.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar NOOP_TRACER = new NoopTracer();\n/**\n * Proxy tracer provided by the proxy tracer provider\n */\nvar ProxyTracer = /** @class */ (function () {\n function ProxyTracer(_provider, name, version, options) {\n this._provider = _provider;\n this.name = name;\n this.version = version;\n this.options = options;\n }\n ProxyTracer.prototype.startSpan = function (name, options, context) {\n return this._getTracer().startSpan(name, options, context);\n };\n ProxyTracer.prototype.startActiveSpan = function (_name, _options, _context, _fn) {\n var tracer = this._getTracer();\n return Reflect.apply(tracer.startActiveSpan, tracer, arguments);\n };\n /**\n * Try to get a tracer from the proxy tracer provider.\n * If the proxy tracer provider has no delegate, return a noop tracer.\n */\n ProxyTracer.prototype._getTracer = function () {\n if (this._delegate) {\n return this._delegate;\n }\n var tracer = this._provider.getDelegateTracer(this.name, this.version, this.options);\n if (!tracer) {\n return NOOP_TRACER;\n }\n this._delegate = tracer;\n return this._delegate;\n };\n return ProxyTracer;\n}());\n\n//# sourceMappingURL=ProxyTracer.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/trace/NoopTracerProvider.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * An implementation of the {@link TracerProvider} which returns an impotent\n * Tracer for all calls to `getTracer`.\n *\n * All operations are no-op.\n */\nvar NoopTracerProvider = /** @class */ (function () {\n function NoopTracerProvider() {\n }\n NoopTracerProvider.prototype.getTracer = function (_name, _version, _options) {\n return new NoopTracer();\n };\n return NoopTracerProvider;\n}());\n\n//# sourceMappingURL=NoopTracerProvider.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/trace/ProxyTracerProvider.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nvar NOOP_TRACER_PROVIDER = new NoopTracerProvider();\n/**\n * Tracer provider which provides {@link ProxyTracer}s.\n *\n * Before a delegate is set, tracers provided are NoOp.\n * When a delegate is set, traces are provided from the delegate.\n * When a delegate is set after tracers have already been provided,\n * all tracers already provided will use the provided delegate implementation.\n */\nvar ProxyTracerProvider = /** @class */ (function () {\n function ProxyTracerProvider() {\n }\n /**\n * Get a {@link ProxyTracer}\n */\n ProxyTracerProvider.prototype.getTracer = function (name, version, options) {\n var _a;\n return ((_a = this.getDelegateTracer(name, version, options)) !== null && _a !== void 0 ? _a : new ProxyTracer(this, name, version, options));\n };\n ProxyTracerProvider.prototype.getDelegate = function () {\n var _a;\n return (_a = this._delegate) !== null && _a !== void 0 ? _a : NOOP_TRACER_PROVIDER;\n };\n /**\n * Set the delegate tracer provider\n */\n ProxyTracerProvider.prototype.setDelegate = function (delegate) {\n this._delegate = delegate;\n };\n ProxyTracerProvider.prototype.getDelegateTracer = function (name, version, options) {\n var _a;\n return (_a = this._delegate) === null || _a === void 0 ? void 0 : _a.getTracer(name, version, options);\n };\n return ProxyTracerProvider;\n}());\n\n//# sourceMappingURL=ProxyTracerProvider.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/api/trace.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n\n\n\nvar trace_API_NAME = \'trace\';\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Tracing API\n */\nvar TraceAPI = /** @class */ (function () {\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n function TraceAPI() {\n this._proxyTracerProvider = new ProxyTracerProvider();\n this.wrapSpanContext = wrapSpanContext;\n this.isSpanContextValid = isSpanContextValid;\n this.deleteSpan = deleteSpan;\n this.getSpan = getSpan;\n this.getActiveSpan = getActiveSpan;\n this.getSpanContext = getSpanContext;\n this.setSpan = setSpan;\n this.setSpanContext = setSpanContext;\n }\n /** Get the singleton instance of the Trace API */\n TraceAPI.getInstance = function () {\n if (!this._instance) {\n this._instance = new TraceAPI();\n }\n return this._instance;\n };\n /**\n * Set the current global tracer.\n *\n * @returns true if the tracer provider was successfully registered, else false\n */\n TraceAPI.prototype.setGlobalTracerProvider = function (provider) {\n var success = registerGlobal(trace_API_NAME, this._proxyTracerProvider, DiagAPI.instance());\n if (success) {\n this._proxyTracerProvider.setDelegate(provider);\n }\n return success;\n };\n /**\n * Returns the global tracer provider.\n */\n TraceAPI.prototype.getTracerProvider = function () {\n return getGlobal(trace_API_NAME) || this._proxyTracerProvider;\n };\n /**\n * Returns a tracer from the global tracer provider.\n */\n TraceAPI.prototype.getTracer = function (name, version) {\n return this.getTracerProvider().getTracer(name, version);\n };\n /** Remove the global tracer provider */\n TraceAPI.prototype.disable = function () {\n unregisterGlobal(trace_API_NAME, DiagAPI.instance());\n this._proxyTracerProvider = new ProxyTracerProvider();\n };\n return TraceAPI;\n}());\n\n//# sourceMappingURL=trace.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/trace-api.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\n\n/** Entrypoint for trace API */\nvar trace = TraceAPI.getInstance();\n//# sourceMappingURL=trace-api.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/context-api.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\n\n/** Entrypoint for context API */\nvar context = ContextAPI.getInstance();\n//# sourceMappingURL=context-api.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-tracing/dist-esm/src/interfaces.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * The kind of span.\n */\nvar SpanKind;\n(function (SpanKind) {\n /** Default value. Indicates that the span is used internally. */\n SpanKind[SpanKind["INTERNAL"] = 0] = "INTERNAL";\n /**\n * Indicates that the span covers server-side handling of an RPC or other\n * remote request.\n */\n SpanKind[SpanKind["SERVER"] = 1] = "SERVER";\n /**\n * Indicates that the span covers the client-side wrapper around an RPC or\n * other remote request.\n */\n SpanKind[SpanKind["CLIENT"] = 2] = "CLIENT";\n /**\n * Indicates that the span describes producer sending a message to a\n * broker. Unlike client and server, there is no direct critical path latency\n * relationship between producer and consumer spans.\n */\n SpanKind[SpanKind["PRODUCER"] = 3] = "PRODUCER";\n /**\n * Indicates that the span describes consumer receiving a message from a\n * broker. Unlike client and server, there is no direct critical path latency\n * relationship between producer and consumer spans.\n */\n SpanKind[SpanKind["CONSUMER"] = 4] = "CONSUMER";\n})(SpanKind || (SpanKind = {}));\n/**\n * Return the span if one exists\n *\n * @param context - context to get span from\n */\nfunction interfaces_getSpan(context) {\n return otTrace.getSpan(context);\n}\n/**\n * Set the span on a context\n *\n * @param context - context to use as parent\n * @param span - span to set active\n */\nfunction interfaces_setSpan(context, span) {\n return trace.setSpan(context, span);\n}\n/**\n * Wrap span context in a NoopSpan and set as span in a new\n * context\n *\n * @param context - context to set active span on\n * @param spanContext - span context to be wrapped\n */\nfunction interfaces_setSpanContext(context, spanContext) {\n return otTrace.setSpanContext(context, spanContext);\n}\n/**\n * Get the span context of the span if it exists.\n *\n * @param context - context to get values from\n */\nfunction interfaces_getSpanContext(context) {\n return otTrace.getSpanContext(context);\n}\n/**\n * Returns true of the given {@link SpanContext} is valid.\n * A valid {@link SpanContext} is one which has a valid trace ID and span ID as per the spec.\n *\n * @param context - the {@link SpanContext} to validate.\n *\n * @returns true if the {@link SpanContext} is valid, false otherwise.\n */\nfunction interfaces_isSpanContextValid(context) {\n return trace.isSpanContextValid(context);\n}\nfunction getTracer(name, version) {\n return trace.getTracer(name || "azure/core-tracing", version);\n}\n/** Entrypoint for context API */\nconst interfaces_context = context;\n/** SpanStatusCode */\nvar SpanStatusCode;\n(function (SpanStatusCode) {\n /**\n * The default status.\n */\n SpanStatusCode[SpanStatusCode["UNSET"] = 0] = "UNSET";\n /**\n * The operation has been validated by an Application developer or\n * Operator to have completed successfully.\n */\n SpanStatusCode[SpanStatusCode["OK"] = 1] = "OK";\n /**\n * The operation contains an error.\n */\n SpanStatusCode[SpanStatusCode["ERROR"] = 2] = "ERROR";\n})(SpanStatusCode || (SpanStatusCode = {}));\n//# sourceMappingURL=interfaces.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/operationOptions.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Converts an OperationOptions to a RequestOptionsBase\n *\n * @param opts - OperationOptions object to convert to RequestOptionsBase\n */\nfunction operationOptionsToRequestOptionsBase(opts) {\n const { requestOptions, tracingOptions } = opts, additionalOptions = __rest(opts, ["requestOptions", "tracingOptions"]);\n let result = additionalOptions;\n if (requestOptions) {\n result = Object.assign(Object.assign({}, result), requestOptions);\n }\n if (tracingOptions) {\n result.tracingContext = tracingOptions.tracingContext;\n // By passing spanOptions if they exist at runtime, we\'re backwards compatible with @azure/core-tracing@preview.13 and earlier.\n result.spanOptions = tracingOptions === null || tracingOptions === void 0 ? void 0 : tracingOptions.spanOptions;\n }\n return result;\n}\n//# sourceMappingURL=operationOptions.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/util/base64.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * Encodes a string in base64 format.\n * @param value - The string to encode\n */\nfunction encodeString(value) {\n return Buffer.from(value).toString("base64");\n}\n/**\n * Encodes a byte array in base64 format.\n * @param value - The Uint8Aray to encode\n */\nfunction encodeByteArray(value) {\n // Buffer.from accepts | -- the TypeScript definition is off here\n // https://nodejs.org/api/buffer.html#buffer_class_method_buffer_from_arraybuffer_byteoffset_length\n const bufferValue = value instanceof Buffer ? value : Buffer.from(value.buffer);\n return bufferValue.toString("base64");\n}\n/**\n * Decodes a base64 string into a byte array.\n * @param value - The base64 string to decode\n */\nfunction decodeString(value) {\n return Buffer.from(value, "base64");\n}\n//# sourceMappingURL=base64.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/serializer.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/* eslint-disable eqeqeq */\n\n\n\n// This file contains utility code to serialize and deserialize network operations according to `OperationSpec` objects generated by AutoRest.TypeScript from OpenAPI specifications.\n/**\n * Used to map raw response objects to final shapes.\n * Helps packing and unpacking Dates and other encoded types that are not intrinsic to JSON.\n * Also allows pulling values from headers, as well as inserting default values and constants.\n */\nclass Serializer {\n constructor(\n /**\n * The provided model mapper.\n */\n modelMappers = {}, \n /**\n * Whether the contents are XML or not.\n */\n isXML) {\n this.modelMappers = modelMappers;\n this.isXML = isXML;\n }\n /**\n * Validates constraints, if any. This function will throw if the provided value does not respect those constraints.\n * @param mapper - The definition of data models.\n * @param value - The value.\n * @param objectName - Name of the object. Used in the error messages.\n * @deprecated Removing the constraints validation on client side.\n */\n validateConstraints(mapper, value, objectName) {\n const failValidation = (constraintName, constraintValue) => {\n throw new Error(`"${objectName}" with value "${value}" should satisfy the constraint "${constraintName}": ${constraintValue}.`);\n };\n if (mapper.constraints && value != undefined) {\n const valueAsNumber = value;\n const { ExclusiveMaximum, ExclusiveMinimum, InclusiveMaximum, InclusiveMinimum, MaxItems, MaxLength, MinItems, MinLength, MultipleOf, Pattern, UniqueItems, } = mapper.constraints;\n if (ExclusiveMaximum != undefined && valueAsNumber >= ExclusiveMaximum) {\n failValidation("ExclusiveMaximum", ExclusiveMaximum);\n }\n if (ExclusiveMinimum != undefined && valueAsNumber <= ExclusiveMinimum) {\n failValidation("ExclusiveMinimum", ExclusiveMinimum);\n }\n if (InclusiveMaximum != undefined && valueAsNumber > InclusiveMaximum) {\n failValidation("InclusiveMaximum", InclusiveMaximum);\n }\n if (InclusiveMinimum != undefined && valueAsNumber < InclusiveMinimum) {\n failValidation("InclusiveMinimum", InclusiveMinimum);\n }\n const valueAsArray = value;\n if (MaxItems != undefined && valueAsArray.length > MaxItems) {\n failValidation("MaxItems", MaxItems);\n }\n if (MaxLength != undefined && valueAsArray.length > MaxLength) {\n failValidation("MaxLength", MaxLength);\n }\n if (MinItems != undefined && valueAsArray.length < MinItems) {\n failValidation("MinItems", MinItems);\n }\n if (MinLength != undefined && valueAsArray.length < MinLength) {\n failValidation("MinLength", MinLength);\n }\n if (MultipleOf != undefined && valueAsNumber % MultipleOf !== 0) {\n failValidation("MultipleOf", MultipleOf);\n }\n if (Pattern) {\n const pattern = typeof Pattern === "string" ? new RegExp(Pattern) : Pattern;\n if (typeof value !== "string" || value.match(pattern) === null) {\n failValidation("Pattern", Pattern);\n }\n }\n if (UniqueItems &&\n valueAsArray.some((item, i, ar) => ar.indexOf(item) !== i)) {\n failValidation("UniqueItems", UniqueItems);\n }\n }\n }\n /**\n * Serialize the given object based on its metadata defined in the mapper.\n *\n * @param mapper - The mapper which defines the metadata of the serializable object.\n * @param object - A valid Javascript object to be serialized.\n * @param objectName - Name of the serialized object.\n * @param options - additional options to deserialization.\n * @returns A valid serialized Javascript object.\n */\n serialize(mapper, object, objectName, options = {}) {\n var _a, _b, _c;\n const updatedOptions = {\n rootName: (_a = options.rootName) !== null && _a !== void 0 ? _a : "",\n includeRoot: (_b = options.includeRoot) !== null && _b !== void 0 ? _b : false,\n xmlCharKey: (_c = options.xmlCharKey) !== null && _c !== void 0 ? _c : XML_CHARKEY,\n };\n let payload = {};\n const mapperType = mapper.type.name;\n if (!objectName) {\n objectName = mapper.serializedName;\n }\n if (mapperType.match(/^Sequence$/i) !== null) {\n payload = [];\n }\n if (mapper.isConstant) {\n object = mapper.defaultValue;\n }\n // This table of allowed values should help explain\n // the mapper.required and mapper.nullable properties.\n // X means "neither undefined or null are allowed".\n // || required\n // || true | false\n // nullable || ==========================\n // true || null | undefined/null\n // false || X | undefined\n // undefined || X | undefined/null\n const { required, nullable } = mapper;\n if (required && nullable && object === undefined) {\n throw new Error(`${objectName} cannot be undefined.`);\n }\n if (required && !nullable && object == undefined) {\n throw new Error(`${objectName} cannot be null or undefined.`);\n }\n if (!required && nullable === false && object === null) {\n throw new Error(`${objectName} cannot be null.`);\n }\n if (object == undefined) {\n payload = object;\n }\n else {\n if (mapperType.match(/^any$/i) !== null) {\n payload = object;\n }\n else if (mapperType.match(/^(Number|String|Boolean|Object|Stream|Uuid)$/i) !== null) {\n payload = serializeBasicTypes(mapperType, objectName, object);\n }\n else if (mapperType.match(/^Enum$/i) !== null) {\n const enumMapper = mapper;\n payload = serializeEnumType(objectName, enumMapper.type.allowedValues, object);\n }\n else if (mapperType.match(/^(Date|DateTime|TimeSpan|DateTimeRfc1123|UnixTime)$/i) !== null) {\n payload = serializeDateTypes(mapperType, object, objectName);\n }\n else if (mapperType.match(/^ByteArray$/i) !== null) {\n payload = serializeByteArrayType(objectName, object);\n }\n else if (mapperType.match(/^Base64Url$/i) !== null) {\n payload = serializeBase64UrlType(objectName, object);\n }\n else if (mapperType.match(/^Sequence$/i) !== null) {\n payload = serializeSequenceType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);\n }\n else if (mapperType.match(/^Dictionary$/i) !== null) {\n payload = serializeDictionaryType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);\n }\n else if (mapperType.match(/^Composite$/i) !== null) {\n payload = serializeCompositeType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);\n }\n }\n return payload;\n }\n /**\n * Deserialize the given object based on its metadata defined in the mapper.\n *\n * @param mapper - The mapper which defines the metadata of the serializable object.\n * @param responseBody - A valid Javascript entity to be deserialized.\n * @param objectName - Name of the deserialized object.\n * @param options - Controls behavior of XML parser and builder.\n * @returns A valid deserialized Javascript object.\n */\n deserialize(mapper, responseBody, objectName, options = {}) {\n var _a, _b, _c;\n const updatedOptions = {\n rootName: (_a = options.rootName) !== null && _a !== void 0 ? _a : "",\n includeRoot: (_b = options.includeRoot) !== null && _b !== void 0 ? _b : false,\n xmlCharKey: (_c = options.xmlCharKey) !== null && _c !== void 0 ? _c : XML_CHARKEY,\n };\n if (responseBody == undefined) {\n if (this.isXML && mapper.type.name === "Sequence" && !mapper.xmlIsWrapped) {\n // Edge case for empty XML non-wrapped lists. xml2js can\'t distinguish\n // between the list being empty versus being missing,\n // so let\'s do the more user-friendly thing and return an empty list.\n responseBody = [];\n }\n // specifically check for undefined as default value can be a falsey value `0, "", false, null`\n if (mapper.defaultValue !== undefined) {\n responseBody = mapper.defaultValue;\n }\n return responseBody;\n }\n let payload;\n const mapperType = mapper.type.name;\n if (!objectName) {\n objectName = mapper.serializedName;\n }\n if (mapperType.match(/^Composite$/i) !== null) {\n payload = deserializeCompositeType(this, mapper, responseBody, objectName, updatedOptions);\n }\n else {\n if (this.isXML) {\n const xmlCharKey = updatedOptions.xmlCharKey;\n const castResponseBody = responseBody;\n /**\n * If the mapper specifies this as a non-composite type value but the responseBody contains\n * both header ("$" i.e., XML_ATTRKEY) and body ("#" i.e., XML_CHARKEY) properties,\n * then just reduce the responseBody value to the body ("#" i.e., XML_CHARKEY) property.\n */\n if (castResponseBody[XML_ATTRKEY] != undefined &&\n castResponseBody[xmlCharKey] != undefined) {\n responseBody = castResponseBody[xmlCharKey];\n }\n }\n if (mapperType.match(/^Number$/i) !== null) {\n payload = parseFloat(responseBody);\n if (isNaN(payload)) {\n payload = responseBody;\n }\n }\n else if (mapperType.match(/^Boolean$/i) !== null) {\n if (responseBody === "true") {\n payload = true;\n }\n else if (responseBody === "false") {\n payload = false;\n }\n else {\n payload = responseBody;\n }\n }\n else if (mapperType.match(/^(String|Enum|Object|Stream|Uuid|TimeSpan|any)$/i) !== null) {\n payload = responseBody;\n }\n else if (mapperType.match(/^(Date|DateTime|DateTimeRfc1123)$/i) !== null) {\n payload = new Date(responseBody);\n }\n else if (mapperType.match(/^UnixTime$/i) !== null) {\n payload = unixTimeToDate(responseBody);\n }\n else if (mapperType.match(/^ByteArray$/i) !== null) {\n payload = decodeString(responseBody);\n }\n else if (mapperType.match(/^Base64Url$/i) !== null) {\n payload = base64UrlToByteArray(responseBody);\n }\n else if (mapperType.match(/^Sequence$/i) !== null) {\n payload = deserializeSequenceType(this, mapper, responseBody, objectName, updatedOptions);\n }\n else if (mapperType.match(/^Dictionary$/i) !== null) {\n payload = deserializeDictionaryType(this, mapper, responseBody, objectName, updatedOptions);\n }\n }\n if (mapper.isConstant) {\n payload = mapper.defaultValue;\n }\n return payload;\n }\n}\nfunction trimEnd(str, ch) {\n let len = str.length;\n while (len - 1 >= 0 && str[len - 1] === ch) {\n --len;\n }\n return str.substr(0, len);\n}\nfunction bufferToBase64Url(buffer) {\n if (!buffer) {\n return undefined;\n }\n if (!(buffer instanceof Uint8Array)) {\n throw new Error(`Please provide an input of type Uint8Array for converting to Base64Url.`);\n }\n // Uint8Array to Base64.\n const str = encodeByteArray(buffer);\n // Base64 to Base64Url.\n return trimEnd(str, "=").replace(/\\+/g, "-").replace(/\\//g, "_");\n}\nfunction base64UrlToByteArray(str) {\n if (!str) {\n return undefined;\n }\n if (str && typeof str.valueOf() !== "string") {\n throw new Error("Please provide an input of type string for converting to Uint8Array");\n }\n // Base64Url to Base64.\n str = str.replace(/-/g, "+").replace(/_/g, "/");\n // Base64 to Uint8Array.\n return decodeString(str);\n}\nfunction splitSerializeName(prop) {\n const classes = [];\n let partialclass = "";\n if (prop) {\n const subwords = prop.split(".");\n for (const item of subwords) {\n if (item.charAt(item.length - 1) === "\\\\") {\n partialclass += item.substr(0, item.length - 1) + ".";\n }\n else {\n partialclass += item;\n classes.push(partialclass);\n partialclass = "";\n }\n }\n }\n return classes;\n}\nfunction dateToUnixTime(d) {\n if (!d) {\n return undefined;\n }\n if (typeof d.valueOf() === "string") {\n d = new Date(d);\n }\n return Math.floor(d.getTime() / 1000);\n}\nfunction unixTimeToDate(n) {\n if (!n) {\n return undefined;\n }\n return new Date(n * 1000);\n}\nfunction serializeBasicTypes(typeName, objectName, value) {\n if (value !== null && value !== undefined) {\n if (typeName.match(/^Number$/i) !== null) {\n if (typeof value !== "number") {\n throw new Error(`${objectName} with value ${value} must be of type number.`);\n }\n }\n else if (typeName.match(/^String$/i) !== null) {\n if (typeof value.valueOf() !== "string") {\n throw new Error(`${objectName} with value "${value}" must be of type string.`);\n }\n }\n else if (typeName.match(/^Uuid$/i) !== null) {\n if (!(typeof value.valueOf() === "string" && isValidUuid(value))) {\n throw new Error(`${objectName} with value "${value}" must be of type string and a valid uuid.`);\n }\n }\n else if (typeName.match(/^Boolean$/i) !== null) {\n if (typeof value !== "boolean") {\n throw new Error(`${objectName} with value ${value} must be of type boolean.`);\n }\n }\n else if (typeName.match(/^Stream$/i) !== null) {\n const objectType = typeof value;\n if (objectType !== "string" &&\n objectType !== "function" &&\n !(value instanceof ArrayBuffer) &&\n !ArrayBuffer.isView(value) &&\n !((typeof Blob === "function" || typeof Blob === "object") && value instanceof Blob)) {\n throw new Error(`${objectName} must be a string, Blob, ArrayBuffer, ArrayBufferView, or a function returning NodeJS.ReadableStream.`);\n }\n }\n }\n return value;\n}\nfunction serializeEnumType(objectName, allowedValues, value) {\n if (!allowedValues) {\n throw new Error(`Please provide a set of allowedValues to validate ${objectName} as an Enum Type.`);\n }\n const isPresent = allowedValues.some((item) => {\n if (typeof item.valueOf() === "string") {\n return item.toLowerCase() === value.toLowerCase();\n }\n return item === value;\n });\n if (!isPresent) {\n throw new Error(`${value} is not a valid value for ${objectName}. The valid values are: ${JSON.stringify(allowedValues)}.`);\n }\n return value;\n}\nfunction serializeByteArrayType(objectName, value) {\n let returnValue = "";\n if (value != undefined) {\n if (!(value instanceof Uint8Array)) {\n throw new Error(`${objectName} must be of type Uint8Array.`);\n }\n returnValue = encodeByteArray(value);\n }\n return returnValue;\n}\nfunction serializeBase64UrlType(objectName, value) {\n let returnValue = "";\n if (value != undefined) {\n if (!(value instanceof Uint8Array)) {\n throw new Error(`${objectName} must be of type Uint8Array.`);\n }\n returnValue = bufferToBase64Url(value) || "";\n }\n return returnValue;\n}\nfunction serializeDateTypes(typeName, value, objectName) {\n if (value != undefined) {\n if (typeName.match(/^Date$/i) !== null) {\n if (!(value instanceof Date ||\n (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {\n throw new Error(`${objectName} must be an instanceof Date or a string in ISO8601 format.`);\n }\n value =\n value instanceof Date\n ? value.toISOString().substring(0, 10)\n : new Date(value).toISOString().substring(0, 10);\n }\n else if (typeName.match(/^DateTime$/i) !== null) {\n if (!(value instanceof Date ||\n (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {\n throw new Error(`${objectName} must be an instanceof Date or a string in ISO8601 format.`);\n }\n value = value instanceof Date ? value.toISOString() : new Date(value).toISOString();\n }\n else if (typeName.match(/^DateTimeRfc1123$/i) !== null) {\n if (!(value instanceof Date ||\n (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {\n throw new Error(`${objectName} must be an instanceof Date or a string in RFC-1123 format.`);\n }\n value = value instanceof Date ? value.toUTCString() : new Date(value).toUTCString();\n }\n else if (typeName.match(/^UnixTime$/i) !== null) {\n if (!(value instanceof Date ||\n (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {\n throw new Error(`${objectName} must be an instanceof Date or a string in RFC-1123/ISO8601 format ` +\n `for it to be serialized in UnixTime/Epoch format.`);\n }\n value = dateToUnixTime(value);\n }\n else if (typeName.match(/^TimeSpan$/i) !== null) {\n if (!isDuration(value)) {\n throw new Error(`${objectName} must be a string in ISO 8601 format. Instead was "${value}".`);\n }\n }\n }\n return value;\n}\nfunction serializeSequenceType(serializer, mapper, object, objectName, isXml, options) {\n if (!Array.isArray(object)) {\n throw new Error(`${objectName} must be of type Array.`);\n }\n const elementType = mapper.type.element;\n if (!elementType || typeof elementType !== "object") {\n throw new Error(`element" metadata for an Array must be defined in the ` +\n `mapper and it must of type "object" in ${objectName}.`);\n }\n const tempArray = [];\n for (let i = 0; i < object.length; i++) {\n const serializedValue = serializer.serialize(elementType, object[i], objectName, options);\n if (isXml && elementType.xmlNamespace) {\n const xmlnsKey = elementType.xmlNamespacePrefix\n ? `xmlns:${elementType.xmlNamespacePrefix}`\n : "xmlns";\n if (elementType.type.name === "Composite") {\n tempArray[i] = Object.assign({}, serializedValue);\n tempArray[i][XML_ATTRKEY] = { [xmlnsKey]: elementType.xmlNamespace };\n }\n else {\n tempArray[i] = {};\n tempArray[i][options.xmlCharKey] = serializedValue;\n tempArray[i][XML_ATTRKEY] = { [xmlnsKey]: elementType.xmlNamespace };\n }\n }\n else {\n tempArray[i] = serializedValue;\n }\n }\n return tempArray;\n}\nfunction serializeDictionaryType(serializer, mapper, object, objectName, isXml, options) {\n if (typeof object !== "object") {\n throw new Error(`${objectName} must be of type object.`);\n }\n const valueType = mapper.type.value;\n if (!valueType || typeof valueType !== "object") {\n throw new Error(`"value" metadata for a Dictionary must be defined in the ` +\n `mapper and it must of type "object" in ${objectName}.`);\n }\n const tempDictionary = {};\n for (const key of Object.keys(object)) {\n const serializedValue = serializer.serialize(valueType, object[key], objectName, options);\n // If the element needs an XML namespace we need to add it within the $ property\n tempDictionary[key] = getXmlObjectValue(valueType, serializedValue, isXml, options);\n }\n // Add the namespace to the root element if needed\n if (isXml && mapper.xmlNamespace) {\n const xmlnsKey = mapper.xmlNamespacePrefix ? `xmlns:${mapper.xmlNamespacePrefix}` : "xmlns";\n const result = tempDictionary;\n result[XML_ATTRKEY] = { [xmlnsKey]: mapper.xmlNamespace };\n return result;\n }\n return tempDictionary;\n}\n/**\n * Resolves the additionalProperties property from a referenced mapper.\n * @param serializer - The serializer containing the entire set of mappers.\n * @param mapper - The composite mapper to resolve.\n * @param objectName - Name of the object being serialized.\n */\nfunction resolveAdditionalProperties(serializer, mapper, objectName) {\n const additionalProperties = mapper.type.additionalProperties;\n if (!additionalProperties && mapper.type.className) {\n const modelMapper = resolveReferencedMapper(serializer, mapper, objectName);\n return modelMapper === null || modelMapper === void 0 ? void 0 : modelMapper.type.additionalProperties;\n }\n return additionalProperties;\n}\n/**\n * Finds the mapper referenced by `className`.\n * @param serializer - The serializer containing the entire set of mappers\n * @param mapper - The composite mapper to resolve\n * @param objectName - Name of the object being serialized\n */\nfunction resolveReferencedMapper(serializer, mapper, objectName) {\n const className = mapper.type.className;\n if (!className) {\n throw new Error(`Class name for model "${objectName}" is not provided in the mapper "${JSON.stringify(mapper, undefined, 2)}".`);\n }\n return serializer.modelMappers[className];\n}\n/**\n * Resolves a composite mapper\'s modelProperties.\n * @param serializer - The serializer containing the entire set of mappers\n * @param mapper - The composite mapper to resolve\n */\nfunction resolveModelProperties(serializer, mapper, objectName) {\n let modelProps = mapper.type.modelProperties;\n if (!modelProps) {\n const modelMapper = resolveReferencedMapper(serializer, mapper, objectName);\n if (!modelMapper) {\n throw new Error(`mapper() cannot be null or undefined for model "${mapper.type.className}".`);\n }\n modelProps = modelMapper === null || modelMapper === void 0 ? void 0 : modelMapper.type.modelProperties;\n if (!modelProps) {\n throw new Error(`modelProperties cannot be null or undefined in the ` +\n `mapper "${JSON.stringify(modelMapper)}" of type "${mapper.type.className}" for object "${objectName}".`);\n }\n }\n return modelProps;\n}\nfunction serializeCompositeType(serializer, mapper, object, objectName, isXml, options) {\n if (getPolymorphicDiscriminatorRecursively(serializer, mapper)) {\n mapper = getPolymorphicMapper(serializer, mapper, object, "clientName");\n }\n if (object != undefined) {\n const payload = {};\n const modelProps = resolveModelProperties(serializer, mapper, objectName);\n for (const key of Object.keys(modelProps)) {\n const propertyMapper = modelProps[key];\n if (propertyMapper.readOnly) {\n continue;\n }\n let propName;\n let parentObject = payload;\n if (serializer.isXML) {\n if (propertyMapper.xmlIsWrapped) {\n propName = propertyMapper.xmlName;\n }\n else {\n propName = propertyMapper.xmlElementName || propertyMapper.xmlName;\n }\n }\n else {\n const paths = splitSerializeName(propertyMapper.serializedName);\n propName = paths.pop();\n for (const pathName of paths) {\n const childObject = parentObject[pathName];\n if (childObject == undefined &&\n (object[key] != undefined || propertyMapper.defaultValue !== undefined)) {\n parentObject[pathName] = {};\n }\n parentObject = parentObject[pathName];\n }\n }\n if (parentObject != undefined) {\n if (isXml && mapper.xmlNamespace) {\n const xmlnsKey = mapper.xmlNamespacePrefix\n ? `xmlns:${mapper.xmlNamespacePrefix}`\n : "xmlns";\n parentObject[XML_ATTRKEY] = Object.assign(Object.assign({}, parentObject[XML_ATTRKEY]), { [xmlnsKey]: mapper.xmlNamespace });\n }\n const propertyObjectName = propertyMapper.serializedName !== ""\n ? objectName + "." + propertyMapper.serializedName\n : objectName;\n let toSerialize = object[key];\n const polymorphicDiscriminator = getPolymorphicDiscriminatorRecursively(serializer, mapper);\n if (polymorphicDiscriminator &&\n polymorphicDiscriminator.clientName === key &&\n toSerialize == undefined) {\n toSerialize = mapper.serializedName;\n }\n const serializedValue = serializer.serialize(propertyMapper, toSerialize, propertyObjectName, options);\n if (serializedValue !== undefined && propName != undefined) {\n const value = getXmlObjectValue(propertyMapper, serializedValue, isXml, options);\n if (isXml && propertyMapper.xmlIsAttribute) {\n // XML_ATTRKEY, i.e., $ is the key attributes are kept under in xml2js.\n // This keeps things simple while preventing name collision\n // with names in user documents.\n parentObject[XML_ATTRKEY] = parentObject[XML_ATTRKEY] || {};\n parentObject[XML_ATTRKEY][propName] = serializedValue;\n }\n else if (isXml && propertyMapper.xmlIsWrapped) {\n parentObject[propName] = { [propertyMapper.xmlElementName]: value };\n }\n else {\n parentObject[propName] = value;\n }\n }\n }\n }\n const additionalPropertiesMapper = resolveAdditionalProperties(serializer, mapper, objectName);\n if (additionalPropertiesMapper) {\n const propNames = Object.keys(modelProps);\n for (const clientPropName in object) {\n const isAdditionalProperty = propNames.every((pn) => pn !== clientPropName);\n if (isAdditionalProperty) {\n payload[clientPropName] = serializer.serialize(additionalPropertiesMapper, object[clientPropName], objectName + \'["\' + clientPropName + \'"]\', options);\n }\n }\n }\n return payload;\n }\n return object;\n}\nfunction getXmlObjectValue(propertyMapper, serializedValue, isXml, options) {\n if (!isXml || !propertyMapper.xmlNamespace) {\n return serializedValue;\n }\n const xmlnsKey = propertyMapper.xmlNamespacePrefix\n ? `xmlns:${propertyMapper.xmlNamespacePrefix}`\n : "xmlns";\n const xmlNamespace = { [xmlnsKey]: propertyMapper.xmlNamespace };\n if (["Composite"].includes(propertyMapper.type.name)) {\n if (serializedValue[XML_ATTRKEY]) {\n return serializedValue;\n }\n else {\n const result = Object.assign({}, serializedValue);\n result[XML_ATTRKEY] = xmlNamespace;\n return result;\n }\n }\n const result = {};\n result[options.xmlCharKey] = serializedValue;\n result[XML_ATTRKEY] = xmlNamespace;\n return result;\n}\nfunction isSpecialXmlProperty(propertyName, options) {\n return [XML_ATTRKEY, options.xmlCharKey].includes(propertyName);\n}\nfunction deserializeCompositeType(serializer, mapper, responseBody, objectName, options) {\n var _a, _b;\n const xmlCharKey = (_a = options.xmlCharKey) !== null && _a !== void 0 ? _a : XML_CHARKEY;\n if (getPolymorphicDiscriminatorRecursively(serializer, mapper)) {\n mapper = getPolymorphicMapper(serializer, mapper, responseBody, "serializedName");\n }\n const modelProps = resolveModelProperties(serializer, mapper, objectName);\n let instance = {};\n const handledPropertyNames = [];\n for (const key of Object.keys(modelProps)) {\n const propertyMapper = modelProps[key];\n const paths = splitSerializeName(modelProps[key].serializedName);\n handledPropertyNames.push(paths[0]);\n const { serializedName, xmlName, xmlElementName } = propertyMapper;\n let propertyObjectName = objectName;\n if (serializedName !== "" && serializedName !== undefined) {\n propertyObjectName = objectName + "." + serializedName;\n }\n const headerCollectionPrefix = propertyMapper.headerCollectionPrefix;\n if (headerCollectionPrefix) {\n const dictionary = {};\n for (const headerKey of Object.keys(responseBody)) {\n if (headerKey.startsWith(headerCollectionPrefix)) {\n dictionary[headerKey.substring(headerCollectionPrefix.length)] = serializer.deserialize(propertyMapper.type.value, responseBody[headerKey], propertyObjectName, options);\n }\n handledPropertyNames.push(headerKey);\n }\n instance[key] = dictionary;\n }\n else if (serializer.isXML) {\n if (propertyMapper.xmlIsAttribute && responseBody[XML_ATTRKEY]) {\n instance[key] = serializer.deserialize(propertyMapper, responseBody[XML_ATTRKEY][xmlName], propertyObjectName, options);\n }\n else if (propertyMapper.xmlIsMsText) {\n if (responseBody[xmlCharKey] !== undefined) {\n instance[key] = responseBody[xmlCharKey];\n }\n else if (typeof responseBody === "string") {\n // The special case where xml parser parses "content" into JSON of\n // `{ name: "content"}` instead of `{ name: { "_": "content" }}`\n instance[key] = responseBody;\n }\n }\n else {\n const propertyName = xmlElementName || xmlName || serializedName;\n if (propertyMapper.xmlIsWrapped) {\n /* a list of wrapped by \n For the xml example below\n \n ...\n ...\n \n the responseBody has\n {\n Cors: {\n CorsRule: [{...}, {...}]\n }\n }\n xmlName is "Cors" and xmlElementName is"CorsRule".\n */\n const wrapped = responseBody[xmlName];\n const elementList = (_b = wrapped === null || wrapped === void 0 ? void 0 : wrapped[xmlElementName]) !== null && _b !== void 0 ? _b : [];\n instance[key] = serializer.deserialize(propertyMapper, elementList, propertyObjectName, options);\n handledPropertyNames.push(xmlName);\n }\n else {\n const property = responseBody[propertyName];\n instance[key] = serializer.deserialize(propertyMapper, property, propertyObjectName, options);\n handledPropertyNames.push(propertyName);\n }\n }\n }\n else {\n // deserialize the property if it is present in the provided responseBody instance\n let propertyInstance;\n let res = responseBody;\n // traversing the object step by step.\n for (const item of paths) {\n if (!res)\n break;\n res = res[item];\n }\n propertyInstance = res;\n const polymorphicDiscriminator = mapper.type.polymorphicDiscriminator;\n // checking that the model property name (key)(ex: "fishtype") and the\n // clientName of the polymorphicDiscriminator {metadata} (ex: "fishtype")\n // instead of the serializedName of the polymorphicDiscriminator (ex: "fish.type")\n // is a better approach. The generator is not consistent with escaping \'\\.\' in the\n // serializedName of the property (ex: "fish\\.type") that is marked as polymorphic discriminator\n // and the serializedName of the metadata polymorphicDiscriminator (ex: "fish.type"). However,\n // the clientName transformation of the polymorphicDiscriminator (ex: "fishtype") and\n // the transformation of model property name (ex: "fishtype") is done consistently.\n // Hence, it is a safer bet to rely on the clientName of the polymorphicDiscriminator.\n if (polymorphicDiscriminator &&\n key === polymorphicDiscriminator.clientName &&\n propertyInstance == undefined) {\n propertyInstance = mapper.serializedName;\n }\n let serializedValue;\n // paging\n if (Array.isArray(responseBody[key]) && modelProps[key].serializedName === "") {\n propertyInstance = responseBody[key];\n const arrayInstance = serializer.deserialize(propertyMapper, propertyInstance, propertyObjectName, options);\n // Copy over any properties that have already been added into the instance, where they do\n // not exist on the newly de-serialized array\n for (const [k, v] of Object.entries(instance)) {\n if (!Object.prototype.hasOwnProperty.call(arrayInstance, k)) {\n arrayInstance[k] = v;\n }\n }\n instance = arrayInstance;\n }\n else if (propertyInstance !== undefined || propertyMapper.defaultValue !== undefined) {\n serializedValue = serializer.deserialize(propertyMapper, propertyInstance, propertyObjectName, options);\n instance[key] = serializedValue;\n }\n }\n }\n const additionalPropertiesMapper = mapper.type.additionalProperties;\n if (additionalPropertiesMapper) {\n const isAdditionalProperty = (responsePropName) => {\n for (const clientPropName in modelProps) {\n const paths = splitSerializeName(modelProps[clientPropName].serializedName);\n if (paths[0] === responsePropName) {\n return false;\n }\n }\n return true;\n };\n for (const responsePropName in responseBody) {\n if (isAdditionalProperty(responsePropName)) {\n instance[responsePropName] = serializer.deserialize(additionalPropertiesMapper, responseBody[responsePropName], objectName + \'["\' + responsePropName + \'"]\', options);\n }\n }\n }\n else if (responseBody) {\n for (const key of Object.keys(responseBody)) {\n if (instance[key] === undefined &&\n !handledPropertyNames.includes(key) &&\n !isSpecialXmlProperty(key, options)) {\n instance[key] = responseBody[key];\n }\n }\n }\n return instance;\n}\nfunction deserializeDictionaryType(serializer, mapper, responseBody, objectName, options) {\n const value = mapper.type.value;\n if (!value || typeof value !== "object") {\n throw new Error(`"value" metadata for a Dictionary must be defined in the ` +\n `mapper and it must of type "object" in ${objectName}`);\n }\n if (responseBody) {\n const tempDictionary = {};\n for (const key of Object.keys(responseBody)) {\n tempDictionary[key] = serializer.deserialize(value, responseBody[key], objectName, options);\n }\n return tempDictionary;\n }\n return responseBody;\n}\nfunction deserializeSequenceType(serializer, mapper, responseBody, objectName, options) {\n const element = mapper.type.element;\n if (!element || typeof element !== "object") {\n throw new Error(`element" metadata for an Array must be defined in the ` +\n `mapper and it must of type "object" in ${objectName}`);\n }\n if (responseBody) {\n if (!Array.isArray(responseBody)) {\n // xml2js will interpret a single element array as just the element, so force it to be an array\n responseBody = [responseBody];\n }\n const tempArray = [];\n for (let i = 0; i < responseBody.length; i++) {\n tempArray[i] = serializer.deserialize(element, responseBody[i], `${objectName}[${i}]`, options);\n }\n return tempArray;\n }\n return responseBody;\n}\nfunction getPolymorphicMapper(serializer, mapper, object, polymorphicPropertyName) {\n const polymorphicDiscriminator = getPolymorphicDiscriminatorRecursively(serializer, mapper);\n if (polymorphicDiscriminator) {\n const discriminatorName = polymorphicDiscriminator[polymorphicPropertyName];\n if (discriminatorName != undefined) {\n const discriminatorValue = object[discriminatorName];\n if (discriminatorValue != undefined) {\n const typeName = mapper.type.uberParent || mapper.type.className;\n const indexDiscriminator = discriminatorValue === typeName\n ? discriminatorValue\n : typeName + "." + discriminatorValue;\n const polymorphicMapper = serializer.modelMappers.discriminators[indexDiscriminator];\n if (polymorphicMapper) {\n mapper = polymorphicMapper;\n }\n }\n }\n }\n return mapper;\n}\nfunction getPolymorphicDiscriminatorRecursively(serializer, mapper) {\n return (mapper.type.polymorphicDiscriminator ||\n getPolymorphicDiscriminatorSafely(serializer, mapper.type.uberParent) ||\n getPolymorphicDiscriminatorSafely(serializer, mapper.type.className));\n}\nfunction getPolymorphicDiscriminatorSafely(serializer, typeName) {\n return (typeName &&\n serializer.modelMappers[typeName] &&\n serializer.modelMappers[typeName].type.polymorphicDiscriminator);\n}\n/**\n * Utility function that serializes an object that might contain binary information into a plain object, array or a string.\n */\nfunction serializeObject(toSerialize) {\n const castToSerialize = toSerialize;\n if (toSerialize == undefined)\n return undefined;\n if (toSerialize instanceof Uint8Array) {\n toSerialize = base64.encodeByteArray(toSerialize);\n return toSerialize;\n }\n else if (toSerialize instanceof Date) {\n return toSerialize.toISOString();\n }\n else if (Array.isArray(toSerialize)) {\n const array = [];\n for (let i = 0; i < toSerialize.length; i++) {\n array.push(serializeObject(toSerialize[i]));\n }\n return array;\n }\n else if (typeof toSerialize === "object") {\n const dictionary = {};\n for (const property in toSerialize) {\n dictionary[property] = serializeObject(castToSerialize[property]);\n }\n return dictionary;\n }\n return toSerialize;\n}\n/**\n * Utility function to create a K:V from a list of strings\n */\nfunction strEnum(o) {\n const result = {};\n for (const key of o) {\n result[key] = key;\n }\n return result;\n}\n/**\n * String enum containing the string types of property mappers.\n */\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nconst MapperType = strEnum([\n "Base64Url",\n "Boolean",\n "ByteArray",\n "Composite",\n "Date",\n "DateTime",\n "DateTimeRfc1123",\n "Dictionary",\n "Enum",\n "Number",\n "Object",\n "Sequence",\n "String",\n "Stream",\n "TimeSpan",\n "UnixTime",\n]);\n//# sourceMappingURL=serializer.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generated/src/models/mappers.js\n/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\nconst BlobServiceProperties = {\n serializedName: "BlobServiceProperties",\n xmlName: "StorageServiceProperties",\n type: {\n name: "Composite",\n className: "BlobServiceProperties",\n modelProperties: {\n blobAnalyticsLogging: {\n serializedName: "Logging",\n xmlName: "Logging",\n type: {\n name: "Composite",\n className: "Logging"\n }\n },\n hourMetrics: {\n serializedName: "HourMetrics",\n xmlName: "HourMetrics",\n type: {\n name: "Composite",\n className: "Metrics"\n }\n },\n minuteMetrics: {\n serializedName: "MinuteMetrics",\n xmlName: "MinuteMetrics",\n type: {\n name: "Composite",\n className: "Metrics"\n }\n },\n cors: {\n serializedName: "Cors",\n xmlName: "Cors",\n xmlIsWrapped: true,\n xmlElementName: "CorsRule",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "CorsRule"\n }\n }\n }\n },\n defaultServiceVersion: {\n serializedName: "DefaultServiceVersion",\n xmlName: "DefaultServiceVersion",\n type: {\n name: "String"\n }\n },\n deleteRetentionPolicy: {\n serializedName: "DeleteRetentionPolicy",\n xmlName: "DeleteRetentionPolicy",\n type: {\n name: "Composite",\n className: "RetentionPolicy"\n }\n },\n staticWebsite: {\n serializedName: "StaticWebsite",\n xmlName: "StaticWebsite",\n type: {\n name: "Composite",\n className: "StaticWebsite"\n }\n }\n }\n }\n};\nconst Logging = {\n serializedName: "Logging",\n type: {\n name: "Composite",\n className: "Logging",\n modelProperties: {\n version: {\n serializedName: "Version",\n required: true,\n xmlName: "Version",\n type: {\n name: "String"\n }\n },\n deleteProperty: {\n serializedName: "Delete",\n required: true,\n xmlName: "Delete",\n type: {\n name: "Boolean"\n }\n },\n read: {\n serializedName: "Read",\n required: true,\n xmlName: "Read",\n type: {\n name: "Boolean"\n }\n },\n write: {\n serializedName: "Write",\n required: true,\n xmlName: "Write",\n type: {\n name: "Boolean"\n }\n },\n retentionPolicy: {\n serializedName: "RetentionPolicy",\n xmlName: "RetentionPolicy",\n type: {\n name: "Composite",\n className: "RetentionPolicy"\n }\n }\n }\n }\n};\nconst RetentionPolicy = {\n serializedName: "RetentionPolicy",\n type: {\n name: "Composite",\n className: "RetentionPolicy",\n modelProperties: {\n enabled: {\n serializedName: "Enabled",\n required: true,\n xmlName: "Enabled",\n type: {\n name: "Boolean"\n }\n },\n days: {\n constraints: {\n InclusiveMinimum: 1\n },\n serializedName: "Days",\n xmlName: "Days",\n type: {\n name: "Number"\n }\n }\n }\n }\n};\nconst Metrics = {\n serializedName: "Metrics",\n type: {\n name: "Composite",\n className: "Metrics",\n modelProperties: {\n version: {\n serializedName: "Version",\n xmlName: "Version",\n type: {\n name: "String"\n }\n },\n enabled: {\n serializedName: "Enabled",\n required: true,\n xmlName: "Enabled",\n type: {\n name: "Boolean"\n }\n },\n includeAPIs: {\n serializedName: "IncludeAPIs",\n xmlName: "IncludeAPIs",\n type: {\n name: "Boolean"\n }\n },\n retentionPolicy: {\n serializedName: "RetentionPolicy",\n xmlName: "RetentionPolicy",\n type: {\n name: "Composite",\n className: "RetentionPolicy"\n }\n }\n }\n }\n};\nconst CorsRule = {\n serializedName: "CorsRule",\n type: {\n name: "Composite",\n className: "CorsRule",\n modelProperties: {\n allowedOrigins: {\n serializedName: "AllowedOrigins",\n required: true,\n xmlName: "AllowedOrigins",\n type: {\n name: "String"\n }\n },\n allowedMethods: {\n serializedName: "AllowedMethods",\n required: true,\n xmlName: "AllowedMethods",\n type: {\n name: "String"\n }\n },\n allowedHeaders: {\n serializedName: "AllowedHeaders",\n required: true,\n xmlName: "AllowedHeaders",\n type: {\n name: "String"\n }\n },\n exposedHeaders: {\n serializedName: "ExposedHeaders",\n required: true,\n xmlName: "ExposedHeaders",\n type: {\n name: "String"\n }\n },\n maxAgeInSeconds: {\n constraints: {\n InclusiveMinimum: 0\n },\n serializedName: "MaxAgeInSeconds",\n required: true,\n xmlName: "MaxAgeInSeconds",\n type: {\n name: "Number"\n }\n }\n }\n }\n};\nconst StaticWebsite = {\n serializedName: "StaticWebsite",\n type: {\n name: "Composite",\n className: "StaticWebsite",\n modelProperties: {\n enabled: {\n serializedName: "Enabled",\n required: true,\n xmlName: "Enabled",\n type: {\n name: "Boolean"\n }\n },\n indexDocument: {\n serializedName: "IndexDocument",\n xmlName: "IndexDocument",\n type: {\n name: "String"\n }\n },\n errorDocument404Path: {\n serializedName: "ErrorDocument404Path",\n xmlName: "ErrorDocument404Path",\n type: {\n name: "String"\n }\n },\n defaultIndexDocumentPath: {\n serializedName: "DefaultIndexDocumentPath",\n xmlName: "DefaultIndexDocumentPath",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst StorageError = {\n serializedName: "StorageError",\n type: {\n name: "Composite",\n className: "StorageError",\n modelProperties: {\n message: {\n serializedName: "Message",\n xmlName: "Message",\n type: {\n name: "String"\n }\n },\n code: {\n serializedName: "Code",\n xmlName: "Code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobServiceStatistics = {\n serializedName: "BlobServiceStatistics",\n xmlName: "StorageServiceStats",\n type: {\n name: "Composite",\n className: "BlobServiceStatistics",\n modelProperties: {\n geoReplication: {\n serializedName: "GeoReplication",\n xmlName: "GeoReplication",\n type: {\n name: "Composite",\n className: "GeoReplication"\n }\n }\n }\n }\n};\nconst GeoReplication = {\n serializedName: "GeoReplication",\n type: {\n name: "Composite",\n className: "GeoReplication",\n modelProperties: {\n status: {\n serializedName: "Status",\n required: true,\n xmlName: "Status",\n type: {\n name: "Enum",\n allowedValues: ["live", "bootstrap", "unavailable"]\n }\n },\n lastSyncOn: {\n serializedName: "LastSyncTime",\n required: true,\n xmlName: "LastSyncTime",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst ListContainersSegmentResponse = {\n serializedName: "ListContainersSegmentResponse",\n xmlName: "EnumerationResults",\n type: {\n name: "Composite",\n className: "ListContainersSegmentResponse",\n modelProperties: {\n serviceEndpoint: {\n serializedName: "ServiceEndpoint",\n required: true,\n xmlName: "ServiceEndpoint",\n xmlIsAttribute: true,\n type: {\n name: "String"\n }\n },\n prefix: {\n serializedName: "Prefix",\n xmlName: "Prefix",\n type: {\n name: "String"\n }\n },\n marker: {\n serializedName: "Marker",\n xmlName: "Marker",\n type: {\n name: "String"\n }\n },\n maxPageSize: {\n serializedName: "MaxResults",\n xmlName: "MaxResults",\n type: {\n name: "Number"\n }\n },\n containerItems: {\n serializedName: "ContainerItems",\n required: true,\n xmlName: "Containers",\n xmlIsWrapped: true,\n xmlElementName: "Container",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "ContainerItem"\n }\n }\n }\n },\n continuationToken: {\n serializedName: "NextMarker",\n xmlName: "NextMarker",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerItem = {\n serializedName: "ContainerItem",\n xmlName: "Container",\n type: {\n name: "Composite",\n className: "ContainerItem",\n modelProperties: {\n name: {\n serializedName: "Name",\n required: true,\n xmlName: "Name",\n type: {\n name: "String"\n }\n },\n deleted: {\n serializedName: "Deleted",\n xmlName: "Deleted",\n type: {\n name: "Boolean"\n }\n },\n version: {\n serializedName: "Version",\n xmlName: "Version",\n type: {\n name: "String"\n }\n },\n properties: {\n serializedName: "Properties",\n xmlName: "Properties",\n type: {\n name: "Composite",\n className: "ContainerProperties"\n }\n },\n metadata: {\n serializedName: "Metadata",\n xmlName: "Metadata",\n type: {\n name: "Dictionary",\n value: { type: { name: "String" } }\n }\n }\n }\n }\n};\nconst ContainerProperties = {\n serializedName: "ContainerProperties",\n type: {\n name: "Composite",\n className: "ContainerProperties",\n modelProperties: {\n lastModified: {\n serializedName: "Last-Modified",\n required: true,\n xmlName: "Last-Modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n etag: {\n serializedName: "Etag",\n required: true,\n xmlName: "Etag",\n type: {\n name: "String"\n }\n },\n leaseStatus: {\n serializedName: "LeaseStatus",\n xmlName: "LeaseStatus",\n type: {\n name: "Enum",\n allowedValues: ["locked", "unlocked"]\n }\n },\n leaseState: {\n serializedName: "LeaseState",\n xmlName: "LeaseState",\n type: {\n name: "Enum",\n allowedValues: [\n "available",\n "leased",\n "expired",\n "breaking",\n "broken"\n ]\n }\n },\n leaseDuration: {\n serializedName: "LeaseDuration",\n xmlName: "LeaseDuration",\n type: {\n name: "Enum",\n allowedValues: ["infinite", "fixed"]\n }\n },\n publicAccess: {\n serializedName: "PublicAccess",\n xmlName: "PublicAccess",\n type: {\n name: "Enum",\n allowedValues: ["container", "blob"]\n }\n },\n hasImmutabilityPolicy: {\n serializedName: "HasImmutabilityPolicy",\n xmlName: "HasImmutabilityPolicy",\n type: {\n name: "Boolean"\n }\n },\n hasLegalHold: {\n serializedName: "HasLegalHold",\n xmlName: "HasLegalHold",\n type: {\n name: "Boolean"\n }\n },\n defaultEncryptionScope: {\n serializedName: "DefaultEncryptionScope",\n xmlName: "DefaultEncryptionScope",\n type: {\n name: "String"\n }\n },\n preventEncryptionScopeOverride: {\n serializedName: "DenyEncryptionScopeOverride",\n xmlName: "DenyEncryptionScopeOverride",\n type: {\n name: "Boolean"\n }\n },\n deletedOn: {\n serializedName: "DeletedTime",\n xmlName: "DeletedTime",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n remainingRetentionDays: {\n serializedName: "RemainingRetentionDays",\n xmlName: "RemainingRetentionDays",\n type: {\n name: "Number"\n }\n },\n isImmutableStorageWithVersioningEnabled: {\n serializedName: "ImmutableStorageWithVersioningEnabled",\n xmlName: "ImmutableStorageWithVersioningEnabled",\n type: {\n name: "Boolean"\n }\n }\n }\n }\n};\nconst KeyInfo = {\n serializedName: "KeyInfo",\n type: {\n name: "Composite",\n className: "KeyInfo",\n modelProperties: {\n startsOn: {\n serializedName: "Start",\n required: true,\n xmlName: "Start",\n type: {\n name: "String"\n }\n },\n expiresOn: {\n serializedName: "Expiry",\n required: true,\n xmlName: "Expiry",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst UserDelegationKey = {\n serializedName: "UserDelegationKey",\n type: {\n name: "Composite",\n className: "UserDelegationKey",\n modelProperties: {\n signedObjectId: {\n serializedName: "SignedOid",\n required: true,\n xmlName: "SignedOid",\n type: {\n name: "String"\n }\n },\n signedTenantId: {\n serializedName: "SignedTid",\n required: true,\n xmlName: "SignedTid",\n type: {\n name: "String"\n }\n },\n signedStartsOn: {\n serializedName: "SignedStart",\n required: true,\n xmlName: "SignedStart",\n type: {\n name: "String"\n }\n },\n signedExpiresOn: {\n serializedName: "SignedExpiry",\n required: true,\n xmlName: "SignedExpiry",\n type: {\n name: "String"\n }\n },\n signedService: {\n serializedName: "SignedService",\n required: true,\n xmlName: "SignedService",\n type: {\n name: "String"\n }\n },\n signedVersion: {\n serializedName: "SignedVersion",\n required: true,\n xmlName: "SignedVersion",\n type: {\n name: "String"\n }\n },\n value: {\n serializedName: "Value",\n required: true,\n xmlName: "Value",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst FilterBlobSegment = {\n serializedName: "FilterBlobSegment",\n xmlName: "EnumerationResults",\n type: {\n name: "Composite",\n className: "FilterBlobSegment",\n modelProperties: {\n serviceEndpoint: {\n serializedName: "ServiceEndpoint",\n required: true,\n xmlName: "ServiceEndpoint",\n xmlIsAttribute: true,\n type: {\n name: "String"\n }\n },\n where: {\n serializedName: "Where",\n required: true,\n xmlName: "Where",\n type: {\n name: "String"\n }\n },\n blobs: {\n serializedName: "Blobs",\n required: true,\n xmlName: "Blobs",\n xmlIsWrapped: true,\n xmlElementName: "Blob",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "FilterBlobItem"\n }\n }\n }\n },\n continuationToken: {\n serializedName: "NextMarker",\n xmlName: "NextMarker",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst FilterBlobItem = {\n serializedName: "FilterBlobItem",\n xmlName: "Blob",\n type: {\n name: "Composite",\n className: "FilterBlobItem",\n modelProperties: {\n name: {\n serializedName: "Name",\n required: true,\n xmlName: "Name",\n type: {\n name: "String"\n }\n },\n containerName: {\n serializedName: "ContainerName",\n required: true,\n xmlName: "ContainerName",\n type: {\n name: "String"\n }\n },\n tags: {\n serializedName: "Tags",\n xmlName: "Tags",\n type: {\n name: "Composite",\n className: "BlobTags"\n }\n }\n }\n }\n};\nconst BlobTags = {\n serializedName: "BlobTags",\n xmlName: "Tags",\n type: {\n name: "Composite",\n className: "BlobTags",\n modelProperties: {\n blobTagSet: {\n serializedName: "BlobTagSet",\n required: true,\n xmlName: "TagSet",\n xmlIsWrapped: true,\n xmlElementName: "Tag",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "BlobTag"\n }\n }\n }\n }\n }\n }\n};\nconst BlobTag = {\n serializedName: "BlobTag",\n xmlName: "Tag",\n type: {\n name: "Composite",\n className: "BlobTag",\n modelProperties: {\n key: {\n serializedName: "Key",\n required: true,\n xmlName: "Key",\n type: {\n name: "String"\n }\n },\n value: {\n serializedName: "Value",\n required: true,\n xmlName: "Value",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst SignedIdentifier = {\n serializedName: "SignedIdentifier",\n xmlName: "SignedIdentifier",\n type: {\n name: "Composite",\n className: "SignedIdentifier",\n modelProperties: {\n id: {\n serializedName: "Id",\n required: true,\n xmlName: "Id",\n type: {\n name: "String"\n }\n },\n accessPolicy: {\n serializedName: "AccessPolicy",\n xmlName: "AccessPolicy",\n type: {\n name: "Composite",\n className: "AccessPolicy"\n }\n }\n }\n }\n};\nconst AccessPolicy = {\n serializedName: "AccessPolicy",\n type: {\n name: "Composite",\n className: "AccessPolicy",\n modelProperties: {\n startsOn: {\n serializedName: "Start",\n xmlName: "Start",\n type: {\n name: "String"\n }\n },\n expiresOn: {\n serializedName: "Expiry",\n xmlName: "Expiry",\n type: {\n name: "String"\n }\n },\n permissions: {\n serializedName: "Permission",\n xmlName: "Permission",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ListBlobsFlatSegmentResponse = {\n serializedName: "ListBlobsFlatSegmentResponse",\n xmlName: "EnumerationResults",\n type: {\n name: "Composite",\n className: "ListBlobsFlatSegmentResponse",\n modelProperties: {\n serviceEndpoint: {\n serializedName: "ServiceEndpoint",\n required: true,\n xmlName: "ServiceEndpoint",\n xmlIsAttribute: true,\n type: {\n name: "String"\n }\n },\n containerName: {\n serializedName: "ContainerName",\n required: true,\n xmlName: "ContainerName",\n xmlIsAttribute: true,\n type: {\n name: "String"\n }\n },\n prefix: {\n serializedName: "Prefix",\n xmlName: "Prefix",\n type: {\n name: "String"\n }\n },\n marker: {\n serializedName: "Marker",\n xmlName: "Marker",\n type: {\n name: "String"\n }\n },\n maxPageSize: {\n serializedName: "MaxResults",\n xmlName: "MaxResults",\n type: {\n name: "Number"\n }\n },\n segment: {\n serializedName: "Segment",\n xmlName: "Blobs",\n type: {\n name: "Composite",\n className: "BlobFlatListSegment"\n }\n },\n continuationToken: {\n serializedName: "NextMarker",\n xmlName: "NextMarker",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobFlatListSegment = {\n serializedName: "BlobFlatListSegment",\n xmlName: "Blobs",\n type: {\n name: "Composite",\n className: "BlobFlatListSegment",\n modelProperties: {\n blobItems: {\n serializedName: "BlobItems",\n required: true,\n xmlName: "BlobItems",\n xmlElementName: "Blob",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "BlobItemInternal"\n }\n }\n }\n }\n }\n }\n};\nconst BlobItemInternal = {\n serializedName: "BlobItemInternal",\n xmlName: "Blob",\n type: {\n name: "Composite",\n className: "BlobItemInternal",\n modelProperties: {\n name: {\n serializedName: "Name",\n xmlName: "Name",\n type: {\n name: "Composite",\n className: "BlobName"\n }\n },\n deleted: {\n serializedName: "Deleted",\n required: true,\n xmlName: "Deleted",\n type: {\n name: "Boolean"\n }\n },\n snapshot: {\n serializedName: "Snapshot",\n required: true,\n xmlName: "Snapshot",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "VersionId",\n xmlName: "VersionId",\n type: {\n name: "String"\n }\n },\n isCurrentVersion: {\n serializedName: "IsCurrentVersion",\n xmlName: "IsCurrentVersion",\n type: {\n name: "Boolean"\n }\n },\n properties: {\n serializedName: "Properties",\n xmlName: "Properties",\n type: {\n name: "Composite",\n className: "BlobPropertiesInternal"\n }\n },\n metadata: {\n serializedName: "Metadata",\n xmlName: "Metadata",\n type: {\n name: "Dictionary",\n value: { type: { name: "String" } }\n }\n },\n blobTags: {\n serializedName: "BlobTags",\n xmlName: "Tags",\n type: {\n name: "Composite",\n className: "BlobTags"\n }\n },\n objectReplicationMetadata: {\n serializedName: "ObjectReplicationMetadata",\n xmlName: "OrMetadata",\n type: {\n name: "Dictionary",\n value: { type: { name: "String" } }\n }\n },\n hasVersionsOnly: {\n serializedName: "HasVersionsOnly",\n xmlName: "HasVersionsOnly",\n type: {\n name: "Boolean"\n }\n }\n }\n }\n};\nconst BlobName = {\n serializedName: "BlobName",\n type: {\n name: "Composite",\n className: "BlobName",\n modelProperties: {\n encoded: {\n serializedName: "Encoded",\n xmlName: "Encoded",\n xmlIsAttribute: true,\n type: {\n name: "Boolean"\n }\n },\n content: {\n serializedName: "content",\n xmlName: "content",\n xmlIsMsText: true,\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobPropertiesInternal = {\n serializedName: "BlobPropertiesInternal",\n xmlName: "Properties",\n type: {\n name: "Composite",\n className: "BlobPropertiesInternal",\n modelProperties: {\n createdOn: {\n serializedName: "Creation-Time",\n xmlName: "Creation-Time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n lastModified: {\n serializedName: "Last-Modified",\n required: true,\n xmlName: "Last-Modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n etag: {\n serializedName: "Etag",\n required: true,\n xmlName: "Etag",\n type: {\n name: "String"\n }\n },\n contentLength: {\n serializedName: "Content-Length",\n xmlName: "Content-Length",\n type: {\n name: "Number"\n }\n },\n contentType: {\n serializedName: "Content-Type",\n xmlName: "Content-Type",\n type: {\n name: "String"\n }\n },\n contentEncoding: {\n serializedName: "Content-Encoding",\n xmlName: "Content-Encoding",\n type: {\n name: "String"\n }\n },\n contentLanguage: {\n serializedName: "Content-Language",\n xmlName: "Content-Language",\n type: {\n name: "String"\n }\n },\n contentMD5: {\n serializedName: "Content-MD5",\n xmlName: "Content-MD5",\n type: {\n name: "ByteArray"\n }\n },\n contentDisposition: {\n serializedName: "Content-Disposition",\n xmlName: "Content-Disposition",\n type: {\n name: "String"\n }\n },\n cacheControl: {\n serializedName: "Cache-Control",\n xmlName: "Cache-Control",\n type: {\n name: "String"\n }\n },\n blobSequenceNumber: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n },\n blobType: {\n serializedName: "BlobType",\n xmlName: "BlobType",\n type: {\n name: "Enum",\n allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"]\n }\n },\n leaseStatus: {\n serializedName: "LeaseStatus",\n xmlName: "LeaseStatus",\n type: {\n name: "Enum",\n allowedValues: ["locked", "unlocked"]\n }\n },\n leaseState: {\n serializedName: "LeaseState",\n xmlName: "LeaseState",\n type: {\n name: "Enum",\n allowedValues: [\n "available",\n "leased",\n "expired",\n "breaking",\n "broken"\n ]\n }\n },\n leaseDuration: {\n serializedName: "LeaseDuration",\n xmlName: "LeaseDuration",\n type: {\n name: "Enum",\n allowedValues: ["infinite", "fixed"]\n }\n },\n copyId: {\n serializedName: "CopyId",\n xmlName: "CopyId",\n type: {\n name: "String"\n }\n },\n copyStatus: {\n serializedName: "CopyStatus",\n xmlName: "CopyStatus",\n type: {\n name: "Enum",\n allowedValues: ["pending", "success", "aborted", "failed"]\n }\n },\n copySource: {\n serializedName: "CopySource",\n xmlName: "CopySource",\n type: {\n name: "String"\n }\n },\n copyProgress: {\n serializedName: "CopyProgress",\n xmlName: "CopyProgress",\n type: {\n name: "String"\n }\n },\n copyCompletedOn: {\n serializedName: "CopyCompletionTime",\n xmlName: "CopyCompletionTime",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n copyStatusDescription: {\n serializedName: "CopyStatusDescription",\n xmlName: "CopyStatusDescription",\n type: {\n name: "String"\n }\n },\n serverEncrypted: {\n serializedName: "ServerEncrypted",\n xmlName: "ServerEncrypted",\n type: {\n name: "Boolean"\n }\n },\n incrementalCopy: {\n serializedName: "IncrementalCopy",\n xmlName: "IncrementalCopy",\n type: {\n name: "Boolean"\n }\n },\n destinationSnapshot: {\n serializedName: "DestinationSnapshot",\n xmlName: "DestinationSnapshot",\n type: {\n name: "String"\n }\n },\n deletedOn: {\n serializedName: "DeletedTime",\n xmlName: "DeletedTime",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n remainingRetentionDays: {\n serializedName: "RemainingRetentionDays",\n xmlName: "RemainingRetentionDays",\n type: {\n name: "Number"\n }\n },\n accessTier: {\n serializedName: "AccessTier",\n xmlName: "AccessTier",\n type: {\n name: "Enum",\n allowedValues: [\n "P4",\n "P6",\n "P10",\n "P15",\n "P20",\n "P30",\n "P40",\n "P50",\n "P60",\n "P70",\n "P80",\n "Hot",\n "Cool",\n "Archive",\n "Cold"\n ]\n }\n },\n accessTierInferred: {\n serializedName: "AccessTierInferred",\n xmlName: "AccessTierInferred",\n type: {\n name: "Boolean"\n }\n },\n archiveStatus: {\n serializedName: "ArchiveStatus",\n xmlName: "ArchiveStatus",\n type: {\n name: "Enum",\n allowedValues: [\n "rehydrate-pending-to-hot",\n "rehydrate-pending-to-cool",\n "rehydrate-pending-to-cold"\n ]\n }\n },\n customerProvidedKeySha256: {\n serializedName: "CustomerProvidedKeySha256",\n xmlName: "CustomerProvidedKeySha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "EncryptionScope",\n xmlName: "EncryptionScope",\n type: {\n name: "String"\n }\n },\n accessTierChangedOn: {\n serializedName: "AccessTierChangeTime",\n xmlName: "AccessTierChangeTime",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n tagCount: {\n serializedName: "TagCount",\n xmlName: "TagCount",\n type: {\n name: "Number"\n }\n },\n expiresOn: {\n serializedName: "Expiry-Time",\n xmlName: "Expiry-Time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isSealed: {\n serializedName: "Sealed",\n xmlName: "Sealed",\n type: {\n name: "Boolean"\n }\n },\n rehydratePriority: {\n serializedName: "RehydratePriority",\n xmlName: "RehydratePriority",\n type: {\n name: "Enum",\n allowedValues: ["High", "Standard"]\n }\n },\n lastAccessedOn: {\n serializedName: "LastAccessTime",\n xmlName: "LastAccessTime",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n immutabilityPolicyExpiresOn: {\n serializedName: "ImmutabilityPolicyUntilDate",\n xmlName: "ImmutabilityPolicyUntilDate",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n immutabilityPolicyMode: {\n serializedName: "ImmutabilityPolicyMode",\n xmlName: "ImmutabilityPolicyMode",\n type: {\n name: "Enum",\n allowedValues: ["Mutable", "Unlocked", "Locked"]\n }\n },\n legalHold: {\n serializedName: "LegalHold",\n xmlName: "LegalHold",\n type: {\n name: "Boolean"\n }\n }\n }\n }\n};\nconst ListBlobsHierarchySegmentResponse = {\n serializedName: "ListBlobsHierarchySegmentResponse",\n xmlName: "EnumerationResults",\n type: {\n name: "Composite",\n className: "ListBlobsHierarchySegmentResponse",\n modelProperties: {\n serviceEndpoint: {\n serializedName: "ServiceEndpoint",\n required: true,\n xmlName: "ServiceEndpoint",\n xmlIsAttribute: true,\n type: {\n name: "String"\n }\n },\n containerName: {\n serializedName: "ContainerName",\n required: true,\n xmlName: "ContainerName",\n xmlIsAttribute: true,\n type: {\n name: "String"\n }\n },\n prefix: {\n serializedName: "Prefix",\n xmlName: "Prefix",\n type: {\n name: "String"\n }\n },\n marker: {\n serializedName: "Marker",\n xmlName: "Marker",\n type: {\n name: "String"\n }\n },\n maxPageSize: {\n serializedName: "MaxResults",\n xmlName: "MaxResults",\n type: {\n name: "Number"\n }\n },\n delimiter: {\n serializedName: "Delimiter",\n xmlName: "Delimiter",\n type: {\n name: "String"\n }\n },\n segment: {\n serializedName: "Segment",\n xmlName: "Blobs",\n type: {\n name: "Composite",\n className: "BlobHierarchyListSegment"\n }\n },\n continuationToken: {\n serializedName: "NextMarker",\n xmlName: "NextMarker",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobHierarchyListSegment = {\n serializedName: "BlobHierarchyListSegment",\n xmlName: "Blobs",\n type: {\n name: "Composite",\n className: "BlobHierarchyListSegment",\n modelProperties: {\n blobPrefixes: {\n serializedName: "BlobPrefixes",\n xmlName: "BlobPrefixes",\n xmlElementName: "BlobPrefix",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "BlobPrefix"\n }\n }\n }\n },\n blobItems: {\n serializedName: "BlobItems",\n required: true,\n xmlName: "BlobItems",\n xmlElementName: "Blob",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "BlobItemInternal"\n }\n }\n }\n }\n }\n }\n};\nconst BlobPrefix = {\n serializedName: "BlobPrefix",\n type: {\n name: "Composite",\n className: "BlobPrefix",\n modelProperties: {\n name: {\n serializedName: "Name",\n xmlName: "Name",\n type: {\n name: "Composite",\n className: "BlobName"\n }\n }\n }\n }\n};\nconst BlockLookupList = {\n serializedName: "BlockLookupList",\n xmlName: "BlockList",\n type: {\n name: "Composite",\n className: "BlockLookupList",\n modelProperties: {\n committed: {\n serializedName: "Committed",\n xmlName: "Committed",\n xmlElementName: "Committed",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "String"\n }\n }\n }\n },\n uncommitted: {\n serializedName: "Uncommitted",\n xmlName: "Uncommitted",\n xmlElementName: "Uncommitted",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "String"\n }\n }\n }\n },\n latest: {\n serializedName: "Latest",\n xmlName: "Latest",\n xmlElementName: "Latest",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "String"\n }\n }\n }\n }\n }\n }\n};\nconst BlockList = {\n serializedName: "BlockList",\n type: {\n name: "Composite",\n className: "BlockList",\n modelProperties: {\n committedBlocks: {\n serializedName: "CommittedBlocks",\n xmlName: "CommittedBlocks",\n xmlIsWrapped: true,\n xmlElementName: "Block",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "Block"\n }\n }\n }\n },\n uncommittedBlocks: {\n serializedName: "UncommittedBlocks",\n xmlName: "UncommittedBlocks",\n xmlIsWrapped: true,\n xmlElementName: "Block",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "Block"\n }\n }\n }\n }\n }\n }\n};\nconst Block = {\n serializedName: "Block",\n type: {\n name: "Composite",\n className: "Block",\n modelProperties: {\n name: {\n serializedName: "Name",\n required: true,\n xmlName: "Name",\n type: {\n name: "String"\n }\n },\n size: {\n serializedName: "Size",\n required: true,\n xmlName: "Size",\n type: {\n name: "Number"\n }\n }\n }\n }\n};\nconst PageList = {\n serializedName: "PageList",\n type: {\n name: "Composite",\n className: "PageList",\n modelProperties: {\n pageRange: {\n serializedName: "PageRange",\n xmlName: "PageRange",\n xmlElementName: "PageRange",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "PageRange"\n }\n }\n }\n },\n clearRange: {\n serializedName: "ClearRange",\n xmlName: "ClearRange",\n xmlElementName: "ClearRange",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "ClearRange"\n }\n }\n }\n },\n continuationToken: {\n serializedName: "NextMarker",\n xmlName: "NextMarker",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageRange = {\n serializedName: "PageRange",\n xmlName: "PageRange",\n type: {\n name: "Composite",\n className: "PageRange",\n modelProperties: {\n start: {\n serializedName: "Start",\n required: true,\n xmlName: "Start",\n type: {\n name: "Number"\n }\n },\n end: {\n serializedName: "End",\n required: true,\n xmlName: "End",\n type: {\n name: "Number"\n }\n }\n }\n }\n};\nconst ClearRange = {\n serializedName: "ClearRange",\n xmlName: "ClearRange",\n type: {\n name: "Composite",\n className: "ClearRange",\n modelProperties: {\n start: {\n serializedName: "Start",\n required: true,\n xmlName: "Start",\n type: {\n name: "Number"\n }\n },\n end: {\n serializedName: "End",\n required: true,\n xmlName: "End",\n type: {\n name: "Number"\n }\n }\n }\n }\n};\nconst QueryRequest = {\n serializedName: "QueryRequest",\n xmlName: "QueryRequest",\n type: {\n name: "Composite",\n className: "QueryRequest",\n modelProperties: {\n queryType: {\n serializedName: "QueryType",\n required: true,\n xmlName: "QueryType",\n type: {\n name: "String"\n }\n },\n expression: {\n serializedName: "Expression",\n required: true,\n xmlName: "Expression",\n type: {\n name: "String"\n }\n },\n inputSerialization: {\n serializedName: "InputSerialization",\n xmlName: "InputSerialization",\n type: {\n name: "Composite",\n className: "QuerySerialization"\n }\n },\n outputSerialization: {\n serializedName: "OutputSerialization",\n xmlName: "OutputSerialization",\n type: {\n name: "Composite",\n className: "QuerySerialization"\n }\n }\n }\n }\n};\nconst QuerySerialization = {\n serializedName: "QuerySerialization",\n type: {\n name: "Composite",\n className: "QuerySerialization",\n modelProperties: {\n format: {\n serializedName: "Format",\n xmlName: "Format",\n type: {\n name: "Composite",\n className: "QueryFormat"\n }\n }\n }\n }\n};\nconst QueryFormat = {\n serializedName: "QueryFormat",\n type: {\n name: "Composite",\n className: "QueryFormat",\n modelProperties: {\n type: {\n serializedName: "Type",\n required: true,\n xmlName: "Type",\n type: {\n name: "Enum",\n allowedValues: ["delimited", "json", "arrow", "parquet"]\n }\n },\n delimitedTextConfiguration: {\n serializedName: "DelimitedTextConfiguration",\n xmlName: "DelimitedTextConfiguration",\n type: {\n name: "Composite",\n className: "DelimitedTextConfiguration"\n }\n },\n jsonTextConfiguration: {\n serializedName: "JsonTextConfiguration",\n xmlName: "JsonTextConfiguration",\n type: {\n name: "Composite",\n className: "JsonTextConfiguration"\n }\n },\n arrowConfiguration: {\n serializedName: "ArrowConfiguration",\n xmlName: "ArrowConfiguration",\n type: {\n name: "Composite",\n className: "ArrowConfiguration"\n }\n },\n parquetTextConfiguration: {\n serializedName: "ParquetTextConfiguration",\n xmlName: "ParquetTextConfiguration",\n type: {\n name: "any"\n }\n }\n }\n }\n};\nconst DelimitedTextConfiguration = {\n serializedName: "DelimitedTextConfiguration",\n xmlName: "DelimitedTextConfiguration",\n type: {\n name: "Composite",\n className: "DelimitedTextConfiguration",\n modelProperties: {\n columnSeparator: {\n serializedName: "ColumnSeparator",\n xmlName: "ColumnSeparator",\n type: {\n name: "String"\n }\n },\n fieldQuote: {\n serializedName: "FieldQuote",\n xmlName: "FieldQuote",\n type: {\n name: "String"\n }\n },\n recordSeparator: {\n serializedName: "RecordSeparator",\n xmlName: "RecordSeparator",\n type: {\n name: "String"\n }\n },\n escapeChar: {\n serializedName: "EscapeChar",\n xmlName: "EscapeChar",\n type: {\n name: "String"\n }\n },\n headersPresent: {\n serializedName: "HeadersPresent",\n xmlName: "HasHeaders",\n type: {\n name: "Boolean"\n }\n }\n }\n }\n};\nconst JsonTextConfiguration = {\n serializedName: "JsonTextConfiguration",\n xmlName: "JsonTextConfiguration",\n type: {\n name: "Composite",\n className: "JsonTextConfiguration",\n modelProperties: {\n recordSeparator: {\n serializedName: "RecordSeparator",\n xmlName: "RecordSeparator",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ArrowConfiguration = {\n serializedName: "ArrowConfiguration",\n xmlName: "ArrowConfiguration",\n type: {\n name: "Composite",\n className: "ArrowConfiguration",\n modelProperties: {\n schema: {\n serializedName: "Schema",\n required: true,\n xmlName: "Schema",\n xmlIsWrapped: true,\n xmlElementName: "Field",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "ArrowField"\n }\n }\n }\n }\n }\n }\n};\nconst ArrowField = {\n serializedName: "ArrowField",\n xmlName: "Field",\n type: {\n name: "Composite",\n className: "ArrowField",\n modelProperties: {\n type: {\n serializedName: "Type",\n required: true,\n xmlName: "Type",\n type: {\n name: "String"\n }\n },\n name: {\n serializedName: "Name",\n xmlName: "Name",\n type: {\n name: "String"\n }\n },\n precision: {\n serializedName: "Precision",\n xmlName: "Precision",\n type: {\n name: "Number"\n }\n },\n scale: {\n serializedName: "Scale",\n xmlName: "Scale",\n type: {\n name: "Number"\n }\n }\n }\n }\n};\nconst ServiceSetPropertiesHeaders = {\n serializedName: "Service_setPropertiesHeaders",\n type: {\n name: "Composite",\n className: "ServiceSetPropertiesHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceSetPropertiesExceptionHeaders = {\n serializedName: "Service_setPropertiesExceptionHeaders",\n type: {\n name: "Composite",\n className: "ServiceSetPropertiesExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceGetPropertiesHeaders = {\n serializedName: "Service_getPropertiesHeaders",\n type: {\n name: "Composite",\n className: "ServiceGetPropertiesHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceGetPropertiesExceptionHeaders = {\n serializedName: "Service_getPropertiesExceptionHeaders",\n type: {\n name: "Composite",\n className: "ServiceGetPropertiesExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceGetStatisticsHeaders = {\n serializedName: "Service_getStatisticsHeaders",\n type: {\n name: "Composite",\n className: "ServiceGetStatisticsHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceGetStatisticsExceptionHeaders = {\n serializedName: "Service_getStatisticsExceptionHeaders",\n type: {\n name: "Composite",\n className: "ServiceGetStatisticsExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceListContainersSegmentHeaders = {\n serializedName: "Service_listContainersSegmentHeaders",\n type: {\n name: "Composite",\n className: "ServiceListContainersSegmentHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceListContainersSegmentExceptionHeaders = {\n serializedName: "Service_listContainersSegmentExceptionHeaders",\n type: {\n name: "Composite",\n className: "ServiceListContainersSegmentExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceGetUserDelegationKeyHeaders = {\n serializedName: "Service_getUserDelegationKeyHeaders",\n type: {\n name: "Composite",\n className: "ServiceGetUserDelegationKeyHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceGetUserDelegationKeyExceptionHeaders = {\n serializedName: "Service_getUserDelegationKeyExceptionHeaders",\n type: {\n name: "Composite",\n className: "ServiceGetUserDelegationKeyExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceGetAccountInfoHeaders = {\n serializedName: "Service_getAccountInfoHeaders",\n type: {\n name: "Composite",\n className: "ServiceGetAccountInfoHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n skuName: {\n serializedName: "x-ms-sku-name",\n xmlName: "x-ms-sku-name",\n type: {\n name: "Enum",\n allowedValues: [\n "Standard_LRS",\n "Standard_GRS",\n "Standard_RAGRS",\n "Standard_ZRS",\n "Premium_LRS"\n ]\n }\n },\n accountKind: {\n serializedName: "x-ms-account-kind",\n xmlName: "x-ms-account-kind",\n type: {\n name: "Enum",\n allowedValues: [\n "Storage",\n "BlobStorage",\n "StorageV2",\n "FileStorage",\n "BlockBlobStorage"\n ]\n }\n },\n isHierarchicalNamespaceEnabled: {\n serializedName: "x-ms-is-hns-enabled",\n xmlName: "x-ms-is-hns-enabled",\n type: {\n name: "Boolean"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceGetAccountInfoExceptionHeaders = {\n serializedName: "Service_getAccountInfoExceptionHeaders",\n type: {\n name: "Composite",\n className: "ServiceGetAccountInfoExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceSubmitBatchHeaders = {\n serializedName: "Service_submitBatchHeaders",\n type: {\n name: "Composite",\n className: "ServiceSubmitBatchHeaders",\n modelProperties: {\n contentType: {\n serializedName: "content-type",\n xmlName: "content-type",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceSubmitBatchExceptionHeaders = {\n serializedName: "Service_submitBatchExceptionHeaders",\n type: {\n name: "Composite",\n className: "ServiceSubmitBatchExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceFilterBlobsHeaders = {\n serializedName: "Service_filterBlobsHeaders",\n type: {\n name: "Composite",\n className: "ServiceFilterBlobsHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceFilterBlobsExceptionHeaders = {\n serializedName: "Service_filterBlobsExceptionHeaders",\n type: {\n name: "Composite",\n className: "ServiceFilterBlobsExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerCreateHeaders = {\n serializedName: "Container_createHeaders",\n type: {\n name: "Composite",\n className: "ContainerCreateHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerCreateExceptionHeaders = {\n serializedName: "Container_createExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerCreateExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerGetPropertiesHeaders = {\n serializedName: "Container_getPropertiesHeaders",\n type: {\n name: "Composite",\n className: "ContainerGetPropertiesHeaders",\n modelProperties: {\n metadata: {\n serializedName: "x-ms-meta",\n xmlName: "x-ms-meta",\n type: {\n name: "Dictionary",\n value: { type: { name: "String" } }\n },\n headerCollectionPrefix: "x-ms-meta-"\n },\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n leaseDuration: {\n serializedName: "x-ms-lease-duration",\n xmlName: "x-ms-lease-duration",\n type: {\n name: "Enum",\n allowedValues: ["infinite", "fixed"]\n }\n },\n leaseState: {\n serializedName: "x-ms-lease-state",\n xmlName: "x-ms-lease-state",\n type: {\n name: "Enum",\n allowedValues: [\n "available",\n "leased",\n "expired",\n "breaking",\n "broken"\n ]\n }\n },\n leaseStatus: {\n serializedName: "x-ms-lease-status",\n xmlName: "x-ms-lease-status",\n type: {\n name: "Enum",\n allowedValues: ["locked", "unlocked"]\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n blobPublicAccess: {\n serializedName: "x-ms-blob-public-access",\n xmlName: "x-ms-blob-public-access",\n type: {\n name: "Enum",\n allowedValues: ["container", "blob"]\n }\n },\n hasImmutabilityPolicy: {\n serializedName: "x-ms-has-immutability-policy",\n xmlName: "x-ms-has-immutability-policy",\n type: {\n name: "Boolean"\n }\n },\n hasLegalHold: {\n serializedName: "x-ms-has-legal-hold",\n xmlName: "x-ms-has-legal-hold",\n type: {\n name: "Boolean"\n }\n },\n defaultEncryptionScope: {\n serializedName: "x-ms-default-encryption-scope",\n xmlName: "x-ms-default-encryption-scope",\n type: {\n name: "String"\n }\n },\n denyEncryptionScopeOverride: {\n serializedName: "x-ms-deny-encryption-scope-override",\n xmlName: "x-ms-deny-encryption-scope-override",\n type: {\n name: "Boolean"\n }\n },\n isImmutableStorageWithVersioningEnabled: {\n serializedName: "x-ms-immutable-storage-with-versioning-enabled",\n xmlName: "x-ms-immutable-storage-with-versioning-enabled",\n type: {\n name: "Boolean"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerGetPropertiesExceptionHeaders = {\n serializedName: "Container_getPropertiesExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerGetPropertiesExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerDeleteHeaders = {\n serializedName: "Container_deleteHeaders",\n type: {\n name: "Composite",\n className: "ContainerDeleteHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerDeleteExceptionHeaders = {\n serializedName: "Container_deleteExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerDeleteExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerSetMetadataHeaders = {\n serializedName: "Container_setMetadataHeaders",\n type: {\n name: "Composite",\n className: "ContainerSetMetadataHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerSetMetadataExceptionHeaders = {\n serializedName: "Container_setMetadataExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerSetMetadataExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerGetAccessPolicyHeaders = {\n serializedName: "Container_getAccessPolicyHeaders",\n type: {\n name: "Composite",\n className: "ContainerGetAccessPolicyHeaders",\n modelProperties: {\n blobPublicAccess: {\n serializedName: "x-ms-blob-public-access",\n xmlName: "x-ms-blob-public-access",\n type: {\n name: "Enum",\n allowedValues: ["container", "blob"]\n }\n },\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerGetAccessPolicyExceptionHeaders = {\n serializedName: "Container_getAccessPolicyExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerGetAccessPolicyExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerSetAccessPolicyHeaders = {\n serializedName: "Container_setAccessPolicyHeaders",\n type: {\n name: "Composite",\n className: "ContainerSetAccessPolicyHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerSetAccessPolicyExceptionHeaders = {\n serializedName: "Container_setAccessPolicyExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerSetAccessPolicyExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerRestoreHeaders = {\n serializedName: "Container_restoreHeaders",\n type: {\n name: "Composite",\n className: "ContainerRestoreHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerRestoreExceptionHeaders = {\n serializedName: "Container_restoreExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerRestoreExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerRenameHeaders = {\n serializedName: "Container_renameHeaders",\n type: {\n name: "Composite",\n className: "ContainerRenameHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerRenameExceptionHeaders = {\n serializedName: "Container_renameExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerRenameExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerSubmitBatchHeaders = {\n serializedName: "Container_submitBatchHeaders",\n type: {\n name: "Composite",\n className: "ContainerSubmitBatchHeaders",\n modelProperties: {\n contentType: {\n serializedName: "content-type",\n xmlName: "content-type",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerSubmitBatchExceptionHeaders = {\n serializedName: "Container_submitBatchExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerSubmitBatchExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerFilterBlobsHeaders = {\n serializedName: "Container_filterBlobsHeaders",\n type: {\n name: "Composite",\n className: "ContainerFilterBlobsHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst ContainerFilterBlobsExceptionHeaders = {\n serializedName: "Container_filterBlobsExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerFilterBlobsExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerAcquireLeaseHeaders = {\n serializedName: "Container_acquireLeaseHeaders",\n type: {\n name: "Composite",\n className: "ContainerAcquireLeaseHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n leaseId: {\n serializedName: "x-ms-lease-id",\n xmlName: "x-ms-lease-id",\n type: {\n name: "String"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst ContainerAcquireLeaseExceptionHeaders = {\n serializedName: "Container_acquireLeaseExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerAcquireLeaseExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerReleaseLeaseHeaders = {\n serializedName: "Container_releaseLeaseHeaders",\n type: {\n name: "Composite",\n className: "ContainerReleaseLeaseHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst ContainerReleaseLeaseExceptionHeaders = {\n serializedName: "Container_releaseLeaseExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerReleaseLeaseExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerRenewLeaseHeaders = {\n serializedName: "Container_renewLeaseHeaders",\n type: {\n name: "Composite",\n className: "ContainerRenewLeaseHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n leaseId: {\n serializedName: "x-ms-lease-id",\n xmlName: "x-ms-lease-id",\n type: {\n name: "String"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst ContainerRenewLeaseExceptionHeaders = {\n serializedName: "Container_renewLeaseExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerRenewLeaseExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerBreakLeaseHeaders = {\n serializedName: "Container_breakLeaseHeaders",\n type: {\n name: "Composite",\n className: "ContainerBreakLeaseHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n leaseTime: {\n serializedName: "x-ms-lease-time",\n xmlName: "x-ms-lease-time",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst ContainerBreakLeaseExceptionHeaders = {\n serializedName: "Container_breakLeaseExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerBreakLeaseExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerChangeLeaseHeaders = {\n serializedName: "Container_changeLeaseHeaders",\n type: {\n name: "Composite",\n className: "ContainerChangeLeaseHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n leaseId: {\n serializedName: "x-ms-lease-id",\n xmlName: "x-ms-lease-id",\n type: {\n name: "String"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst ContainerChangeLeaseExceptionHeaders = {\n serializedName: "Container_changeLeaseExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerChangeLeaseExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerListBlobFlatSegmentHeaders = {\n serializedName: "Container_listBlobFlatSegmentHeaders",\n type: {\n name: "Composite",\n className: "ContainerListBlobFlatSegmentHeaders",\n modelProperties: {\n contentType: {\n serializedName: "content-type",\n xmlName: "content-type",\n type: {\n name: "String"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerListBlobFlatSegmentExceptionHeaders = {\n serializedName: "Container_listBlobFlatSegmentExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerListBlobFlatSegmentExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerListBlobHierarchySegmentHeaders = {\n serializedName: "Container_listBlobHierarchySegmentHeaders",\n type: {\n name: "Composite",\n className: "ContainerListBlobHierarchySegmentHeaders",\n modelProperties: {\n contentType: {\n serializedName: "content-type",\n xmlName: "content-type",\n type: {\n name: "String"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerListBlobHierarchySegmentExceptionHeaders = {\n serializedName: "Container_listBlobHierarchySegmentExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerListBlobHierarchySegmentExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerGetAccountInfoHeaders = {\n serializedName: "Container_getAccountInfoHeaders",\n type: {\n name: "Composite",\n className: "ContainerGetAccountInfoHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n skuName: {\n serializedName: "x-ms-sku-name",\n xmlName: "x-ms-sku-name",\n type: {\n name: "Enum",\n allowedValues: [\n "Standard_LRS",\n "Standard_GRS",\n "Standard_RAGRS",\n "Standard_ZRS",\n "Premium_LRS"\n ]\n }\n },\n accountKind: {\n serializedName: "x-ms-account-kind",\n xmlName: "x-ms-account-kind",\n type: {\n name: "Enum",\n allowedValues: [\n "Storage",\n "BlobStorage",\n "StorageV2",\n "FileStorage",\n "BlockBlobStorage"\n ]\n }\n }\n }\n }\n};\nconst ContainerGetAccountInfoExceptionHeaders = {\n serializedName: "Container_getAccountInfoExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerGetAccountInfoExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobDownloadHeaders = {\n serializedName: "Blob_downloadHeaders",\n type: {\n name: "Composite",\n className: "BlobDownloadHeaders",\n modelProperties: {\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n createdOn: {\n serializedName: "x-ms-creation-time",\n xmlName: "x-ms-creation-time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n metadata: {\n serializedName: "x-ms-meta",\n xmlName: "x-ms-meta",\n type: {\n name: "Dictionary",\n value: { type: { name: "String" } }\n },\n headerCollectionPrefix: "x-ms-meta-"\n },\n objectReplicationPolicyId: {\n serializedName: "x-ms-or-policy-id",\n xmlName: "x-ms-or-policy-id",\n type: {\n name: "String"\n }\n },\n objectReplicationRules: {\n serializedName: "x-ms-or",\n xmlName: "x-ms-or",\n type: {\n name: "Dictionary",\n value: { type: { name: "String" } }\n },\n headerCollectionPrefix: "x-ms-or-"\n },\n contentLength: {\n serializedName: "content-length",\n xmlName: "content-length",\n type: {\n name: "Number"\n }\n },\n contentType: {\n serializedName: "content-type",\n xmlName: "content-type",\n type: {\n name: "String"\n }\n },\n contentRange: {\n serializedName: "content-range",\n xmlName: "content-range",\n type: {\n name: "String"\n }\n },\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n contentEncoding: {\n serializedName: "content-encoding",\n xmlName: "content-encoding",\n type: {\n name: "String"\n }\n },\n cacheControl: {\n serializedName: "cache-control",\n xmlName: "cache-control",\n type: {\n name: "String"\n }\n },\n contentDisposition: {\n serializedName: "content-disposition",\n xmlName: "content-disposition",\n type: {\n name: "String"\n }\n },\n contentLanguage: {\n serializedName: "content-language",\n xmlName: "content-language",\n type: {\n name: "String"\n }\n },\n blobSequenceNumber: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n },\n blobType: {\n serializedName: "x-ms-blob-type",\n xmlName: "x-ms-blob-type",\n type: {\n name: "Enum",\n allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"]\n }\n },\n copyCompletedOn: {\n serializedName: "x-ms-copy-completion-time",\n xmlName: "x-ms-copy-completion-time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n copyStatusDescription: {\n serializedName: "x-ms-copy-status-description",\n xmlName: "x-ms-copy-status-description",\n type: {\n name: "String"\n }\n },\n copyId: {\n serializedName: "x-ms-copy-id",\n xmlName: "x-ms-copy-id",\n type: {\n name: "String"\n }\n },\n copyProgress: {\n serializedName: "x-ms-copy-progress",\n xmlName: "x-ms-copy-progress",\n type: {\n name: "String"\n }\n },\n copySource: {\n serializedName: "x-ms-copy-source",\n xmlName: "x-ms-copy-source",\n type: {\n name: "String"\n }\n },\n copyStatus: {\n serializedName: "x-ms-copy-status",\n xmlName: "x-ms-copy-status",\n type: {\n name: "Enum",\n allowedValues: ["pending", "success", "aborted", "failed"]\n }\n },\n leaseDuration: {\n serializedName: "x-ms-lease-duration",\n xmlName: "x-ms-lease-duration",\n type: {\n name: "Enum",\n allowedValues: ["infinite", "fixed"]\n }\n },\n leaseState: {\n serializedName: "x-ms-lease-state",\n xmlName: "x-ms-lease-state",\n type: {\n name: "Enum",\n allowedValues: [\n "available",\n "leased",\n "expired",\n "breaking",\n "broken"\n ]\n }\n },\n leaseStatus: {\n serializedName: "x-ms-lease-status",\n xmlName: "x-ms-lease-status",\n type: {\n name: "Enum",\n allowedValues: ["locked", "unlocked"]\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n isCurrentVersion: {\n serializedName: "x-ms-is-current-version",\n xmlName: "x-ms-is-current-version",\n type: {\n name: "Boolean"\n }\n },\n acceptRanges: {\n serializedName: "accept-ranges",\n xmlName: "accept-ranges",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n blobCommittedBlockCount: {\n serializedName: "x-ms-blob-committed-block-count",\n xmlName: "x-ms-blob-committed-block-count",\n type: {\n name: "Number"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-server-encrypted",\n xmlName: "x-ms-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n blobContentMD5: {\n serializedName: "x-ms-blob-content-md5",\n xmlName: "x-ms-blob-content-md5",\n type: {\n name: "ByteArray"\n }\n },\n tagCount: {\n serializedName: "x-ms-tag-count",\n xmlName: "x-ms-tag-count",\n type: {\n name: "Number"\n }\n },\n isSealed: {\n serializedName: "x-ms-blob-sealed",\n xmlName: "x-ms-blob-sealed",\n type: {\n name: "Boolean"\n }\n },\n lastAccessed: {\n serializedName: "x-ms-last-access-time",\n xmlName: "x-ms-last-access-time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n immutabilityPolicyExpiresOn: {\n serializedName: "x-ms-immutability-policy-until-date",\n xmlName: "x-ms-immutability-policy-until-date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n immutabilityPolicyMode: {\n serializedName: "x-ms-immutability-policy-mode",\n xmlName: "x-ms-immutability-policy-mode",\n type: {\n name: "Enum",\n allowedValues: ["Mutable", "Unlocked", "Locked"]\n }\n },\n legalHold: {\n serializedName: "x-ms-legal-hold",\n xmlName: "x-ms-legal-hold",\n type: {\n name: "Boolean"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n },\n contentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n }\n }\n }\n};\nconst BlobDownloadExceptionHeaders = {\n serializedName: "Blob_downloadExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobDownloadExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobGetPropertiesHeaders = {\n serializedName: "Blob_getPropertiesHeaders",\n type: {\n name: "Composite",\n className: "BlobGetPropertiesHeaders",\n modelProperties: {\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n createdOn: {\n serializedName: "x-ms-creation-time",\n xmlName: "x-ms-creation-time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n metadata: {\n serializedName: "x-ms-meta",\n xmlName: "x-ms-meta",\n type: {\n name: "Dictionary",\n value: { type: { name: "String" } }\n },\n headerCollectionPrefix: "x-ms-meta-"\n },\n objectReplicationPolicyId: {\n serializedName: "x-ms-or-policy-id",\n xmlName: "x-ms-or-policy-id",\n type: {\n name: "String"\n }\n },\n objectReplicationRules: {\n serializedName: "x-ms-or",\n xmlName: "x-ms-or",\n type: {\n name: "Dictionary",\n value: { type: { name: "String" } }\n },\n headerCollectionPrefix: "x-ms-or-"\n },\n blobType: {\n serializedName: "x-ms-blob-type",\n xmlName: "x-ms-blob-type",\n type: {\n name: "Enum",\n allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"]\n }\n },\n copyCompletedOn: {\n serializedName: "x-ms-copy-completion-time",\n xmlName: "x-ms-copy-completion-time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n copyStatusDescription: {\n serializedName: "x-ms-copy-status-description",\n xmlName: "x-ms-copy-status-description",\n type: {\n name: "String"\n }\n },\n copyId: {\n serializedName: "x-ms-copy-id",\n xmlName: "x-ms-copy-id",\n type: {\n name: "String"\n }\n },\n copyProgress: {\n serializedName: "x-ms-copy-progress",\n xmlName: "x-ms-copy-progress",\n type: {\n name: "String"\n }\n },\n copySource: {\n serializedName: "x-ms-copy-source",\n xmlName: "x-ms-copy-source",\n type: {\n name: "String"\n }\n },\n copyStatus: {\n serializedName: "x-ms-copy-status",\n xmlName: "x-ms-copy-status",\n type: {\n name: "Enum",\n allowedValues: ["pending", "success", "aborted", "failed"]\n }\n },\n isIncrementalCopy: {\n serializedName: "x-ms-incremental-copy",\n xmlName: "x-ms-incremental-copy",\n type: {\n name: "Boolean"\n }\n },\n destinationSnapshot: {\n serializedName: "x-ms-copy-destination-snapshot",\n xmlName: "x-ms-copy-destination-snapshot",\n type: {\n name: "String"\n }\n },\n leaseDuration: {\n serializedName: "x-ms-lease-duration",\n xmlName: "x-ms-lease-duration",\n type: {\n name: "Enum",\n allowedValues: ["infinite", "fixed"]\n }\n },\n leaseState: {\n serializedName: "x-ms-lease-state",\n xmlName: "x-ms-lease-state",\n type: {\n name: "Enum",\n allowedValues: [\n "available",\n "leased",\n "expired",\n "breaking",\n "broken"\n ]\n }\n },\n leaseStatus: {\n serializedName: "x-ms-lease-status",\n xmlName: "x-ms-lease-status",\n type: {\n name: "Enum",\n allowedValues: ["locked", "unlocked"]\n }\n },\n contentLength: {\n serializedName: "content-length",\n xmlName: "content-length",\n type: {\n name: "Number"\n }\n },\n contentType: {\n serializedName: "content-type",\n xmlName: "content-type",\n type: {\n name: "String"\n }\n },\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n contentEncoding: {\n serializedName: "content-encoding",\n xmlName: "content-encoding",\n type: {\n name: "String"\n }\n },\n contentDisposition: {\n serializedName: "content-disposition",\n xmlName: "content-disposition",\n type: {\n name: "String"\n }\n },\n contentLanguage: {\n serializedName: "content-language",\n xmlName: "content-language",\n type: {\n name: "String"\n }\n },\n cacheControl: {\n serializedName: "cache-control",\n xmlName: "cache-control",\n type: {\n name: "String"\n }\n },\n blobSequenceNumber: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n acceptRanges: {\n serializedName: "accept-ranges",\n xmlName: "accept-ranges",\n type: {\n name: "String"\n }\n },\n blobCommittedBlockCount: {\n serializedName: "x-ms-blob-committed-block-count",\n xmlName: "x-ms-blob-committed-block-count",\n type: {\n name: "Number"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-server-encrypted",\n xmlName: "x-ms-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n accessTier: {\n serializedName: "x-ms-access-tier",\n xmlName: "x-ms-access-tier",\n type: {\n name: "String"\n }\n },\n accessTierInferred: {\n serializedName: "x-ms-access-tier-inferred",\n xmlName: "x-ms-access-tier-inferred",\n type: {\n name: "Boolean"\n }\n },\n archiveStatus: {\n serializedName: "x-ms-archive-status",\n xmlName: "x-ms-archive-status",\n type: {\n name: "String"\n }\n },\n accessTierChangedOn: {\n serializedName: "x-ms-access-tier-change-time",\n xmlName: "x-ms-access-tier-change-time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n isCurrentVersion: {\n serializedName: "x-ms-is-current-version",\n xmlName: "x-ms-is-current-version",\n type: {\n name: "Boolean"\n }\n },\n tagCount: {\n serializedName: "x-ms-tag-count",\n xmlName: "x-ms-tag-count",\n type: {\n name: "Number"\n }\n },\n expiresOn: {\n serializedName: "x-ms-expiry-time",\n xmlName: "x-ms-expiry-time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isSealed: {\n serializedName: "x-ms-blob-sealed",\n xmlName: "x-ms-blob-sealed",\n type: {\n name: "Boolean"\n }\n },\n rehydratePriority: {\n serializedName: "x-ms-rehydrate-priority",\n xmlName: "x-ms-rehydrate-priority",\n type: {\n name: "Enum",\n allowedValues: ["High", "Standard"]\n }\n },\n lastAccessed: {\n serializedName: "x-ms-last-access-time",\n xmlName: "x-ms-last-access-time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n immutabilityPolicyExpiresOn: {\n serializedName: "x-ms-immutability-policy-until-date",\n xmlName: "x-ms-immutability-policy-until-date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n immutabilityPolicyMode: {\n serializedName: "x-ms-immutability-policy-mode",\n xmlName: "x-ms-immutability-policy-mode",\n type: {\n name: "Enum",\n allowedValues: ["Mutable", "Unlocked", "Locked"]\n }\n },\n legalHold: {\n serializedName: "x-ms-legal-hold",\n xmlName: "x-ms-legal-hold",\n type: {\n name: "Boolean"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobGetPropertiesExceptionHeaders = {\n serializedName: "Blob_getPropertiesExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobGetPropertiesExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobDeleteHeaders = {\n serializedName: "Blob_deleteHeaders",\n type: {\n name: "Composite",\n className: "BlobDeleteHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobDeleteExceptionHeaders = {\n serializedName: "Blob_deleteExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobDeleteExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobUndeleteHeaders = {\n serializedName: "Blob_undeleteHeaders",\n type: {\n name: "Composite",\n className: "BlobUndeleteHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobUndeleteExceptionHeaders = {\n serializedName: "Blob_undeleteExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobUndeleteExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetExpiryHeaders = {\n serializedName: "Blob_setExpiryHeaders",\n type: {\n name: "Composite",\n className: "BlobSetExpiryHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst BlobSetExpiryExceptionHeaders = {\n serializedName: "Blob_setExpiryExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobSetExpiryExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetHttpHeadersHeaders = {\n serializedName: "Blob_setHttpHeadersHeaders",\n type: {\n name: "Composite",\n className: "BlobSetHttpHeadersHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n blobSequenceNumber: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetHttpHeadersExceptionHeaders = {\n serializedName: "Blob_setHttpHeadersExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobSetHttpHeadersExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetImmutabilityPolicyHeaders = {\n serializedName: "Blob_setImmutabilityPolicyHeaders",\n type: {\n name: "Composite",\n className: "BlobSetImmutabilityPolicyHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n immutabilityPolicyExpiry: {\n serializedName: "x-ms-immutability-policy-until-date",\n xmlName: "x-ms-immutability-policy-until-date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n immutabilityPolicyMode: {\n serializedName: "x-ms-immutability-policy-mode",\n xmlName: "x-ms-immutability-policy-mode",\n type: {\n name: "Enum",\n allowedValues: ["Mutable", "Unlocked", "Locked"]\n }\n }\n }\n }\n};\nconst BlobSetImmutabilityPolicyExceptionHeaders = {\n serializedName: "Blob_setImmutabilityPolicyExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobSetImmutabilityPolicyExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobDeleteImmutabilityPolicyHeaders = {\n serializedName: "Blob_deleteImmutabilityPolicyHeaders",\n type: {\n name: "Composite",\n className: "BlobDeleteImmutabilityPolicyHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst BlobDeleteImmutabilityPolicyExceptionHeaders = {\n serializedName: "Blob_deleteImmutabilityPolicyExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobDeleteImmutabilityPolicyExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetLegalHoldHeaders = {\n serializedName: "Blob_setLegalHoldHeaders",\n type: {\n name: "Composite",\n className: "BlobSetLegalHoldHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n legalHold: {\n serializedName: "x-ms-legal-hold",\n xmlName: "x-ms-legal-hold",\n type: {\n name: "Boolean"\n }\n }\n }\n }\n};\nconst BlobSetLegalHoldExceptionHeaders = {\n serializedName: "Blob_setLegalHoldExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobSetLegalHoldExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetMetadataHeaders = {\n serializedName: "Blob_setMetadataHeaders",\n type: {\n name: "Composite",\n className: "BlobSetMetadataHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetMetadataExceptionHeaders = {\n serializedName: "Blob_setMetadataExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobSetMetadataExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobAcquireLeaseHeaders = {\n serializedName: "Blob_acquireLeaseHeaders",\n type: {\n name: "Composite",\n className: "BlobAcquireLeaseHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n leaseId: {\n serializedName: "x-ms-lease-id",\n xmlName: "x-ms-lease-id",\n type: {\n name: "String"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst BlobAcquireLeaseExceptionHeaders = {\n serializedName: "Blob_acquireLeaseExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobAcquireLeaseExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobReleaseLeaseHeaders = {\n serializedName: "Blob_releaseLeaseHeaders",\n type: {\n name: "Composite",\n className: "BlobReleaseLeaseHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst BlobReleaseLeaseExceptionHeaders = {\n serializedName: "Blob_releaseLeaseExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobReleaseLeaseExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobRenewLeaseHeaders = {\n serializedName: "Blob_renewLeaseHeaders",\n type: {\n name: "Composite",\n className: "BlobRenewLeaseHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n leaseId: {\n serializedName: "x-ms-lease-id",\n xmlName: "x-ms-lease-id",\n type: {\n name: "String"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst BlobRenewLeaseExceptionHeaders = {\n serializedName: "Blob_renewLeaseExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobRenewLeaseExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobChangeLeaseHeaders = {\n serializedName: "Blob_changeLeaseHeaders",\n type: {\n name: "Composite",\n className: "BlobChangeLeaseHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n leaseId: {\n serializedName: "x-ms-lease-id",\n xmlName: "x-ms-lease-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst BlobChangeLeaseExceptionHeaders = {\n serializedName: "Blob_changeLeaseExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobChangeLeaseExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobBreakLeaseHeaders = {\n serializedName: "Blob_breakLeaseHeaders",\n type: {\n name: "Composite",\n className: "BlobBreakLeaseHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n leaseTime: {\n serializedName: "x-ms-lease-time",\n xmlName: "x-ms-lease-time",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst BlobBreakLeaseExceptionHeaders = {\n serializedName: "Blob_breakLeaseExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobBreakLeaseExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobCreateSnapshotHeaders = {\n serializedName: "Blob_createSnapshotHeaders",\n type: {\n name: "Composite",\n className: "BlobCreateSnapshotHeaders",\n modelProperties: {\n snapshot: {\n serializedName: "x-ms-snapshot",\n xmlName: "x-ms-snapshot",\n type: {\n name: "String"\n }\n },\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobCreateSnapshotExceptionHeaders = {\n serializedName: "Blob_createSnapshotExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobCreateSnapshotExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobStartCopyFromURLHeaders = {\n serializedName: "Blob_startCopyFromURLHeaders",\n type: {\n name: "Composite",\n className: "BlobStartCopyFromURLHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n copyId: {\n serializedName: "x-ms-copy-id",\n xmlName: "x-ms-copy-id",\n type: {\n name: "String"\n }\n },\n copyStatus: {\n serializedName: "x-ms-copy-status",\n xmlName: "x-ms-copy-status",\n type: {\n name: "Enum",\n allowedValues: ["pending", "success", "aborted", "failed"]\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobStartCopyFromURLExceptionHeaders = {\n serializedName: "Blob_startCopyFromURLExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobStartCopyFromURLExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobCopyFromURLHeaders = {\n serializedName: "Blob_copyFromURLHeaders",\n type: {\n name: "Composite",\n className: "BlobCopyFromURLHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n copyId: {\n serializedName: "x-ms-copy-id",\n xmlName: "x-ms-copy-id",\n type: {\n name: "String"\n }\n },\n copyStatus: {\n defaultValue: "success",\n isConstant: true,\n serializedName: "x-ms-copy-status",\n type: {\n name: "String"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n xMsContentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobCopyFromURLExceptionHeaders = {\n serializedName: "Blob_copyFromURLExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobCopyFromURLExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobAbortCopyFromURLHeaders = {\n serializedName: "Blob_abortCopyFromURLHeaders",\n type: {\n name: "Composite",\n className: "BlobAbortCopyFromURLHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobAbortCopyFromURLExceptionHeaders = {\n serializedName: "Blob_abortCopyFromURLExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobAbortCopyFromURLExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetTierHeaders = {\n serializedName: "Blob_setTierHeaders",\n type: {\n name: "Composite",\n className: "BlobSetTierHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetTierExceptionHeaders = {\n serializedName: "Blob_setTierExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobSetTierExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobGetAccountInfoHeaders = {\n serializedName: "Blob_getAccountInfoHeaders",\n type: {\n name: "Composite",\n className: "BlobGetAccountInfoHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n skuName: {\n serializedName: "x-ms-sku-name",\n xmlName: "x-ms-sku-name",\n type: {\n name: "Enum",\n allowedValues: [\n "Standard_LRS",\n "Standard_GRS",\n "Standard_RAGRS",\n "Standard_ZRS",\n "Premium_LRS"\n ]\n }\n },\n accountKind: {\n serializedName: "x-ms-account-kind",\n xmlName: "x-ms-account-kind",\n type: {\n name: "Enum",\n allowedValues: [\n "Storage",\n "BlobStorage",\n "StorageV2",\n "FileStorage",\n "BlockBlobStorage"\n ]\n }\n }\n }\n }\n};\nconst BlobGetAccountInfoExceptionHeaders = {\n serializedName: "Blob_getAccountInfoExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobGetAccountInfoExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobQueryHeaders = {\n serializedName: "Blob_queryHeaders",\n type: {\n name: "Composite",\n className: "BlobQueryHeaders",\n modelProperties: {\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n metadata: {\n serializedName: "x-ms-meta",\n xmlName: "x-ms-meta",\n type: {\n name: "Dictionary",\n value: { type: { name: "String" } }\n }\n },\n contentLength: {\n serializedName: "content-length",\n xmlName: "content-length",\n type: {\n name: "Number"\n }\n },\n contentType: {\n serializedName: "content-type",\n xmlName: "content-type",\n type: {\n name: "String"\n }\n },\n contentRange: {\n serializedName: "content-range",\n xmlName: "content-range",\n type: {\n name: "String"\n }\n },\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n contentEncoding: {\n serializedName: "content-encoding",\n xmlName: "content-encoding",\n type: {\n name: "String"\n }\n },\n cacheControl: {\n serializedName: "cache-control",\n xmlName: "cache-control",\n type: {\n name: "String"\n }\n },\n contentDisposition: {\n serializedName: "content-disposition",\n xmlName: "content-disposition",\n type: {\n name: "String"\n }\n },\n contentLanguage: {\n serializedName: "content-language",\n xmlName: "content-language",\n type: {\n name: "String"\n }\n },\n blobSequenceNumber: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n },\n blobType: {\n serializedName: "x-ms-blob-type",\n xmlName: "x-ms-blob-type",\n type: {\n name: "Enum",\n allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"]\n }\n },\n copyCompletionTime: {\n serializedName: "x-ms-copy-completion-time",\n xmlName: "x-ms-copy-completion-time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n copyStatusDescription: {\n serializedName: "x-ms-copy-status-description",\n xmlName: "x-ms-copy-status-description",\n type: {\n name: "String"\n }\n },\n copyId: {\n serializedName: "x-ms-copy-id",\n xmlName: "x-ms-copy-id",\n type: {\n name: "String"\n }\n },\n copyProgress: {\n serializedName: "x-ms-copy-progress",\n xmlName: "x-ms-copy-progress",\n type: {\n name: "String"\n }\n },\n copySource: {\n serializedName: "x-ms-copy-source",\n xmlName: "x-ms-copy-source",\n type: {\n name: "String"\n }\n },\n copyStatus: {\n serializedName: "x-ms-copy-status",\n xmlName: "x-ms-copy-status",\n type: {\n name: "Enum",\n allowedValues: ["pending", "success", "aborted", "failed"]\n }\n },\n leaseDuration: {\n serializedName: "x-ms-lease-duration",\n xmlName: "x-ms-lease-duration",\n type: {\n name: "Enum",\n allowedValues: ["infinite", "fixed"]\n }\n },\n leaseState: {\n serializedName: "x-ms-lease-state",\n xmlName: "x-ms-lease-state",\n type: {\n name: "Enum",\n allowedValues: [\n "available",\n "leased",\n "expired",\n "breaking",\n "broken"\n ]\n }\n },\n leaseStatus: {\n serializedName: "x-ms-lease-status",\n xmlName: "x-ms-lease-status",\n type: {\n name: "Enum",\n allowedValues: ["locked", "unlocked"]\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n acceptRanges: {\n serializedName: "accept-ranges",\n xmlName: "accept-ranges",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n blobCommittedBlockCount: {\n serializedName: "x-ms-blob-committed-block-count",\n xmlName: "x-ms-blob-committed-block-count",\n type: {\n name: "Number"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-server-encrypted",\n xmlName: "x-ms-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n blobContentMD5: {\n serializedName: "x-ms-blob-content-md5",\n xmlName: "x-ms-blob-content-md5",\n type: {\n name: "ByteArray"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n },\n contentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n }\n }\n }\n};\nconst BlobQueryExceptionHeaders = {\n serializedName: "Blob_queryExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobQueryExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobGetTagsHeaders = {\n serializedName: "Blob_getTagsHeaders",\n type: {\n name: "Composite",\n className: "BlobGetTagsHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobGetTagsExceptionHeaders = {\n serializedName: "Blob_getTagsExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobGetTagsExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetTagsHeaders = {\n serializedName: "Blob_setTagsHeaders",\n type: {\n name: "Composite",\n className: "BlobSetTagsHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetTagsExceptionHeaders = {\n serializedName: "Blob_setTagsExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobSetTagsExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobCreateHeaders = {\n serializedName: "PageBlob_createHeaders",\n type: {\n name: "Composite",\n className: "PageBlobCreateHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobCreateExceptionHeaders = {\n serializedName: "PageBlob_createExceptionHeaders",\n type: {\n name: "Composite",\n className: "PageBlobCreateExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobUploadPagesHeaders = {\n serializedName: "PageBlob_uploadPagesHeaders",\n type: {\n name: "Composite",\n className: "PageBlobUploadPagesHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n xMsContentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n },\n blobSequenceNumber: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobUploadPagesExceptionHeaders = {\n serializedName: "PageBlob_uploadPagesExceptionHeaders",\n type: {\n name: "Composite",\n className: "PageBlobUploadPagesExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobClearPagesHeaders = {\n serializedName: "PageBlob_clearPagesHeaders",\n type: {\n name: "Composite",\n className: "PageBlobClearPagesHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n xMsContentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n },\n blobSequenceNumber: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobClearPagesExceptionHeaders = {\n serializedName: "PageBlob_clearPagesExceptionHeaders",\n type: {\n name: "Composite",\n className: "PageBlobClearPagesExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobUploadPagesFromURLHeaders = {\n serializedName: "PageBlob_uploadPagesFromURLHeaders",\n type: {\n name: "Composite",\n className: "PageBlobUploadPagesFromURLHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n xMsContentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n },\n blobSequenceNumber: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobUploadPagesFromURLExceptionHeaders = {\n serializedName: "PageBlob_uploadPagesFromURLExceptionHeaders",\n type: {\n name: "Composite",\n className: "PageBlobUploadPagesFromURLExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobGetPageRangesHeaders = {\n serializedName: "PageBlob_getPageRangesHeaders",\n type: {\n name: "Composite",\n className: "PageBlobGetPageRangesHeaders",\n modelProperties: {\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n blobContentLength: {\n serializedName: "x-ms-blob-content-length",\n xmlName: "x-ms-blob-content-length",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobGetPageRangesExceptionHeaders = {\n serializedName: "PageBlob_getPageRangesExceptionHeaders",\n type: {\n name: "Composite",\n className: "PageBlobGetPageRangesExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobGetPageRangesDiffHeaders = {\n serializedName: "PageBlob_getPageRangesDiffHeaders",\n type: {\n name: "Composite",\n className: "PageBlobGetPageRangesDiffHeaders",\n modelProperties: {\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n blobContentLength: {\n serializedName: "x-ms-blob-content-length",\n xmlName: "x-ms-blob-content-length",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobGetPageRangesDiffExceptionHeaders = {\n serializedName: "PageBlob_getPageRangesDiffExceptionHeaders",\n type: {\n name: "Composite",\n className: "PageBlobGetPageRangesDiffExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobResizeHeaders = {\n serializedName: "PageBlob_resizeHeaders",\n type: {\n name: "Composite",\n className: "PageBlobResizeHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n blobSequenceNumber: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobResizeExceptionHeaders = {\n serializedName: "PageBlob_resizeExceptionHeaders",\n type: {\n name: "Composite",\n className: "PageBlobResizeExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobUpdateSequenceNumberHeaders = {\n serializedName: "PageBlob_updateSequenceNumberHeaders",\n type: {\n name: "Composite",\n className: "PageBlobUpdateSequenceNumberHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n blobSequenceNumber: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobUpdateSequenceNumberExceptionHeaders = {\n serializedName: "PageBlob_updateSequenceNumberExceptionHeaders",\n type: {\n name: "Composite",\n className: "PageBlobUpdateSequenceNumberExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobCopyIncrementalHeaders = {\n serializedName: "PageBlob_copyIncrementalHeaders",\n type: {\n name: "Composite",\n className: "PageBlobCopyIncrementalHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n copyId: {\n serializedName: "x-ms-copy-id",\n xmlName: "x-ms-copy-id",\n type: {\n name: "String"\n }\n },\n copyStatus: {\n serializedName: "x-ms-copy-status",\n xmlName: "x-ms-copy-status",\n type: {\n name: "Enum",\n allowedValues: ["pending", "success", "aborted", "failed"]\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobCopyIncrementalExceptionHeaders = {\n serializedName: "PageBlob_copyIncrementalExceptionHeaders",\n type: {\n name: "Composite",\n className: "PageBlobCopyIncrementalExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst AppendBlobCreateHeaders = {\n serializedName: "AppendBlob_createHeaders",\n type: {\n name: "Composite",\n className: "AppendBlobCreateHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst AppendBlobCreateExceptionHeaders = {\n serializedName: "AppendBlob_createExceptionHeaders",\n type: {\n name: "Composite",\n className: "AppendBlobCreateExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst AppendBlobAppendBlockHeaders = {\n serializedName: "AppendBlob_appendBlockHeaders",\n type: {\n name: "Composite",\n className: "AppendBlobAppendBlockHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n xMsContentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n blobAppendOffset: {\n serializedName: "x-ms-blob-append-offset",\n xmlName: "x-ms-blob-append-offset",\n type: {\n name: "String"\n }\n },\n blobCommittedBlockCount: {\n serializedName: "x-ms-blob-committed-block-count",\n xmlName: "x-ms-blob-committed-block-count",\n type: {\n name: "Number"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst AppendBlobAppendBlockExceptionHeaders = {\n serializedName: "AppendBlob_appendBlockExceptionHeaders",\n type: {\n name: "Composite",\n className: "AppendBlobAppendBlockExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst AppendBlobAppendBlockFromUrlHeaders = {\n serializedName: "AppendBlob_appendBlockFromUrlHeaders",\n type: {\n name: "Composite",\n className: "AppendBlobAppendBlockFromUrlHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n xMsContentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n blobAppendOffset: {\n serializedName: "x-ms-blob-append-offset",\n xmlName: "x-ms-blob-append-offset",\n type: {\n name: "String"\n }\n },\n blobCommittedBlockCount: {\n serializedName: "x-ms-blob-committed-block-count",\n xmlName: "x-ms-blob-committed-block-count",\n type: {\n name: "Number"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst AppendBlobAppendBlockFromUrlExceptionHeaders = {\n serializedName: "AppendBlob_appendBlockFromUrlExceptionHeaders",\n type: {\n name: "Composite",\n className: "AppendBlobAppendBlockFromUrlExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst AppendBlobSealHeaders = {\n serializedName: "AppendBlob_sealHeaders",\n type: {\n name: "Composite",\n className: "AppendBlobSealHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isSealed: {\n serializedName: "x-ms-blob-sealed",\n xmlName: "x-ms-blob-sealed",\n type: {\n name: "Boolean"\n }\n }\n }\n }\n};\nconst AppendBlobSealExceptionHeaders = {\n serializedName: "AppendBlob_sealExceptionHeaders",\n type: {\n name: "Composite",\n className: "AppendBlobSealExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobUploadHeaders = {\n serializedName: "BlockBlob_uploadHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobUploadHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobUploadExceptionHeaders = {\n serializedName: "BlockBlob_uploadExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobUploadExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobPutBlobFromUrlHeaders = {\n serializedName: "BlockBlob_putBlobFromUrlHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobPutBlobFromUrlHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobPutBlobFromUrlExceptionHeaders = {\n serializedName: "BlockBlob_putBlobFromUrlExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobPutBlobFromUrlExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobStageBlockHeaders = {\n serializedName: "BlockBlob_stageBlockHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobStageBlockHeaders",\n modelProperties: {\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n xMsContentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobStageBlockExceptionHeaders = {\n serializedName: "BlockBlob_stageBlockExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobStageBlockExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobStageBlockFromURLHeaders = {\n serializedName: "BlockBlob_stageBlockFromURLHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobStageBlockFromURLHeaders",\n modelProperties: {\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n xMsContentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobStageBlockFromURLExceptionHeaders = {\n serializedName: "BlockBlob_stageBlockFromURLExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobStageBlockFromURLExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobCommitBlockListHeaders = {\n serializedName: "BlockBlob_commitBlockListHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobCommitBlockListHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n xMsContentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobCommitBlockListExceptionHeaders = {\n serializedName: "BlockBlob_commitBlockListExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobCommitBlockListExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobGetBlockListHeaders = {\n serializedName: "BlockBlob_getBlockListHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobGetBlockListHeaders",\n modelProperties: {\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n contentType: {\n serializedName: "content-type",\n xmlName: "content-type",\n type: {\n name: "String"\n }\n },\n blobContentLength: {\n serializedName: "x-ms-blob-content-length",\n xmlName: "x-ms-blob-content-length",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobGetBlockListExceptionHeaders = {\n serializedName: "BlockBlob_getBlockListExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobGetBlockListExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\n//# sourceMappingURL=mappers.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/queryCollectionFormat.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * The format that will be used to join an array of values together for a query parameter value.\n */\nvar QueryCollectionFormat;\n(function (QueryCollectionFormat) {\n /**\n * CSV: Each pair of segments joined by a single comma.\n */\n QueryCollectionFormat["Csv"] = ",";\n /**\n * SSV: Each pair of segments joined by a single space character.\n */\n QueryCollectionFormat["Ssv"] = " ";\n /**\n * TSV: Each pair of segments joined by a single tab character.\n */\n QueryCollectionFormat["Tsv"] = "\\t";\n /**\n * Pipes: Each pair of segments joined by a single pipe character.\n */\n QueryCollectionFormat["Pipes"] = "|";\n /**\n * Denotes this is an array of values that should be passed to the server in multiple key/value pairs, e.g. `?queryParam=value1&queryParam=value2`\n */\n QueryCollectionFormat["Multi"] = "Multi";\n})(QueryCollectionFormat || (QueryCollectionFormat = {}));\n//# sourceMappingURL=queryCollectionFormat.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generated/src/models/parameters.js\n/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\n\n\nconst contentType = {\n parameterPath: ["options", "contentType"],\n mapper: {\n defaultValue: "application/xml",\n isConstant: true,\n serializedName: "Content-Type",\n type: {\n name: "String"\n }\n }\n};\nconst blobServiceProperties = {\n parameterPath: "blobServiceProperties",\n mapper: BlobServiceProperties\n};\nconst accept = {\n parameterPath: "accept",\n mapper: {\n defaultValue: "application/xml",\n isConstant: true,\n serializedName: "Accept",\n type: {\n name: "String"\n }\n }\n};\nconst url = {\n parameterPath: "url",\n mapper: {\n serializedName: "url",\n required: true,\n xmlName: "url",\n type: {\n name: "String"\n }\n },\n skipEncoding: true\n};\nconst restype = {\n parameterPath: "restype",\n mapper: {\n defaultValue: "service",\n isConstant: true,\n serializedName: "restype",\n type: {\n name: "String"\n }\n }\n};\nconst comp = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "properties",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst timeoutInSeconds = {\n parameterPath: ["options", "timeoutInSeconds"],\n mapper: {\n constraints: {\n InclusiveMinimum: 0\n },\n serializedName: "timeout",\n xmlName: "timeout",\n type: {\n name: "Number"\n }\n }\n};\nconst version = {\n parameterPath: "version",\n mapper: {\n defaultValue: "2023-11-03",\n isConstant: true,\n serializedName: "x-ms-version",\n type: {\n name: "String"\n }\n }\n};\nconst requestId = {\n parameterPath: ["options", "requestId"],\n mapper: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n }\n};\nconst accept1 = {\n parameterPath: "accept",\n mapper: {\n defaultValue: "application/xml",\n isConstant: true,\n serializedName: "Accept",\n type: {\n name: "String"\n }\n }\n};\nconst comp1 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "stats",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst comp2 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "list",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst prefix = {\n parameterPath: ["options", "prefix"],\n mapper: {\n serializedName: "prefix",\n xmlName: "prefix",\n type: {\n name: "String"\n }\n }\n};\nconst marker = {\n parameterPath: ["options", "marker"],\n mapper: {\n serializedName: "marker",\n xmlName: "marker",\n type: {\n name: "String"\n }\n }\n};\nconst maxPageSize = {\n parameterPath: ["options", "maxPageSize"],\n mapper: {\n constraints: {\n InclusiveMinimum: 1\n },\n serializedName: "maxresults",\n xmlName: "maxresults",\n type: {\n name: "Number"\n }\n }\n};\nconst include = {\n parameterPath: ["options", "include"],\n mapper: {\n serializedName: "include",\n xmlName: "include",\n xmlElementName: "ListContainersIncludeType",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Enum",\n allowedValues: ["metadata", "deleted", "system"]\n }\n }\n }\n },\n collectionFormat: QueryCollectionFormat.Csv\n};\nconst keyInfo = {\n parameterPath: "keyInfo",\n mapper: KeyInfo\n};\nconst comp3 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "userdelegationkey",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst restype1 = {\n parameterPath: "restype",\n mapper: {\n defaultValue: "account",\n isConstant: true,\n serializedName: "restype",\n type: {\n name: "String"\n }\n }\n};\nconst body = {\n parameterPath: "body",\n mapper: {\n serializedName: "body",\n required: true,\n xmlName: "body",\n type: {\n name: "Stream"\n }\n }\n};\nconst comp4 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "batch",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst contentLength = {\n parameterPath: "contentLength",\n mapper: {\n serializedName: "Content-Length",\n required: true,\n xmlName: "Content-Length",\n type: {\n name: "Number"\n }\n }\n};\nconst multipartContentType = {\n parameterPath: "multipartContentType",\n mapper: {\n serializedName: "Content-Type",\n required: true,\n xmlName: "Content-Type",\n type: {\n name: "String"\n }\n }\n};\nconst comp5 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "blobs",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst where = {\n parameterPath: ["options", "where"],\n mapper: {\n serializedName: "where",\n xmlName: "where",\n type: {\n name: "String"\n }\n }\n};\nconst restype2 = {\n parameterPath: "restype",\n mapper: {\n defaultValue: "container",\n isConstant: true,\n serializedName: "restype",\n type: {\n name: "String"\n }\n }\n};\nconst metadata = {\n parameterPath: ["options", "metadata"],\n mapper: {\n serializedName: "x-ms-meta",\n xmlName: "x-ms-meta",\n type: {\n name: "Dictionary",\n value: { type: { name: "String" } }\n },\n headerCollectionPrefix: "x-ms-meta-"\n }\n};\nconst access = {\n parameterPath: ["options", "access"],\n mapper: {\n serializedName: "x-ms-blob-public-access",\n xmlName: "x-ms-blob-public-access",\n type: {\n name: "Enum",\n allowedValues: ["container", "blob"]\n }\n }\n};\nconst defaultEncryptionScope = {\n parameterPath: [\n "options",\n "containerEncryptionScope",\n "defaultEncryptionScope"\n ],\n mapper: {\n serializedName: "x-ms-default-encryption-scope",\n xmlName: "x-ms-default-encryption-scope",\n type: {\n name: "String"\n }\n }\n};\nconst preventEncryptionScopeOverride = {\n parameterPath: [\n "options",\n "containerEncryptionScope",\n "preventEncryptionScopeOverride"\n ],\n mapper: {\n serializedName: "x-ms-deny-encryption-scope-override",\n xmlName: "x-ms-deny-encryption-scope-override",\n type: {\n name: "Boolean"\n }\n }\n};\nconst leaseId = {\n parameterPath: ["options", "leaseAccessConditions", "leaseId"],\n mapper: {\n serializedName: "x-ms-lease-id",\n xmlName: "x-ms-lease-id",\n type: {\n name: "String"\n }\n }\n};\nconst ifModifiedSince = {\n parameterPath: ["options", "modifiedAccessConditions", "ifModifiedSince"],\n mapper: {\n serializedName: "If-Modified-Since",\n xmlName: "If-Modified-Since",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n};\nconst ifUnmodifiedSince = {\n parameterPath: ["options", "modifiedAccessConditions", "ifUnmodifiedSince"],\n mapper: {\n serializedName: "If-Unmodified-Since",\n xmlName: "If-Unmodified-Since",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n};\nconst comp6 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "metadata",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst comp7 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "acl",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst containerAcl = {\n parameterPath: ["options", "containerAcl"],\n mapper: {\n serializedName: "containerAcl",\n xmlName: "SignedIdentifiers",\n xmlIsWrapped: true,\n xmlElementName: "SignedIdentifier",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "SignedIdentifier"\n }\n }\n }\n }\n};\nconst comp8 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "undelete",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst deletedContainerName = {\n parameterPath: ["options", "deletedContainerName"],\n mapper: {\n serializedName: "x-ms-deleted-container-name",\n xmlName: "x-ms-deleted-container-name",\n type: {\n name: "String"\n }\n }\n};\nconst deletedContainerVersion = {\n parameterPath: ["options", "deletedContainerVersion"],\n mapper: {\n serializedName: "x-ms-deleted-container-version",\n xmlName: "x-ms-deleted-container-version",\n type: {\n name: "String"\n }\n }\n};\nconst comp9 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "rename",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst sourceContainerName = {\n parameterPath: "sourceContainerName",\n mapper: {\n serializedName: "x-ms-source-container-name",\n required: true,\n xmlName: "x-ms-source-container-name",\n type: {\n name: "String"\n }\n }\n};\nconst sourceLeaseId = {\n parameterPath: ["options", "sourceLeaseId"],\n mapper: {\n serializedName: "x-ms-source-lease-id",\n xmlName: "x-ms-source-lease-id",\n type: {\n name: "String"\n }\n }\n};\nconst comp10 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "lease",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst action = {\n parameterPath: "action",\n mapper: {\n defaultValue: "acquire",\n isConstant: true,\n serializedName: "x-ms-lease-action",\n type: {\n name: "String"\n }\n }\n};\nconst duration = {\n parameterPath: ["options", "duration"],\n mapper: {\n serializedName: "x-ms-lease-duration",\n xmlName: "x-ms-lease-duration",\n type: {\n name: "Number"\n }\n }\n};\nconst proposedLeaseId = {\n parameterPath: ["options", "proposedLeaseId"],\n mapper: {\n serializedName: "x-ms-proposed-lease-id",\n xmlName: "x-ms-proposed-lease-id",\n type: {\n name: "String"\n }\n }\n};\nconst action1 = {\n parameterPath: "action",\n mapper: {\n defaultValue: "release",\n isConstant: true,\n serializedName: "x-ms-lease-action",\n type: {\n name: "String"\n }\n }\n};\nconst leaseId1 = {\n parameterPath: "leaseId",\n mapper: {\n serializedName: "x-ms-lease-id",\n required: true,\n xmlName: "x-ms-lease-id",\n type: {\n name: "String"\n }\n }\n};\nconst action2 = {\n parameterPath: "action",\n mapper: {\n defaultValue: "renew",\n isConstant: true,\n serializedName: "x-ms-lease-action",\n type: {\n name: "String"\n }\n }\n};\nconst action3 = {\n parameterPath: "action",\n mapper: {\n defaultValue: "break",\n isConstant: true,\n serializedName: "x-ms-lease-action",\n type: {\n name: "String"\n }\n }\n};\nconst breakPeriod = {\n parameterPath: ["options", "breakPeriod"],\n mapper: {\n serializedName: "x-ms-lease-break-period",\n xmlName: "x-ms-lease-break-period",\n type: {\n name: "Number"\n }\n }\n};\nconst action4 = {\n parameterPath: "action",\n mapper: {\n defaultValue: "change",\n isConstant: true,\n serializedName: "x-ms-lease-action",\n type: {\n name: "String"\n }\n }\n};\nconst proposedLeaseId1 = {\n parameterPath: "proposedLeaseId",\n mapper: {\n serializedName: "x-ms-proposed-lease-id",\n required: true,\n xmlName: "x-ms-proposed-lease-id",\n type: {\n name: "String"\n }\n }\n};\nconst include1 = {\n parameterPath: ["options", "include"],\n mapper: {\n serializedName: "include",\n xmlName: "include",\n xmlElementName: "ListBlobsIncludeItem",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Enum",\n allowedValues: [\n "copy",\n "deleted",\n "metadata",\n "snapshots",\n "uncommittedblobs",\n "versions",\n "tags",\n "immutabilitypolicy",\n "legalhold",\n "deletedwithversions"\n ]\n }\n }\n }\n },\n collectionFormat: QueryCollectionFormat.Csv\n};\nconst delimiter = {\n parameterPath: "delimiter",\n mapper: {\n serializedName: "delimiter",\n required: true,\n xmlName: "delimiter",\n type: {\n name: "String"\n }\n }\n};\nconst snapshot = {\n parameterPath: ["options", "snapshot"],\n mapper: {\n serializedName: "snapshot",\n xmlName: "snapshot",\n type: {\n name: "String"\n }\n }\n};\nconst versionId = {\n parameterPath: ["options", "versionId"],\n mapper: {\n serializedName: "versionid",\n xmlName: "versionid",\n type: {\n name: "String"\n }\n }\n};\nconst range = {\n parameterPath: ["options", "range"],\n mapper: {\n serializedName: "x-ms-range",\n xmlName: "x-ms-range",\n type: {\n name: "String"\n }\n }\n};\nconst rangeGetContentMD5 = {\n parameterPath: ["options", "rangeGetContentMD5"],\n mapper: {\n serializedName: "x-ms-range-get-content-md5",\n xmlName: "x-ms-range-get-content-md5",\n type: {\n name: "Boolean"\n }\n }\n};\nconst rangeGetContentCRC64 = {\n parameterPath: ["options", "rangeGetContentCRC64"],\n mapper: {\n serializedName: "x-ms-range-get-content-crc64",\n xmlName: "x-ms-range-get-content-crc64",\n type: {\n name: "Boolean"\n }\n }\n};\nconst encryptionKey = {\n parameterPath: ["options", "cpkInfo", "encryptionKey"],\n mapper: {\n serializedName: "x-ms-encryption-key",\n xmlName: "x-ms-encryption-key",\n type: {\n name: "String"\n }\n }\n};\nconst encryptionKeySha256 = {\n parameterPath: ["options", "cpkInfo", "encryptionKeySha256"],\n mapper: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n }\n};\nconst encryptionAlgorithm = {\n parameterPath: ["options", "cpkInfo", "encryptionAlgorithm"],\n mapper: {\n serializedName: "x-ms-encryption-algorithm",\n xmlName: "x-ms-encryption-algorithm",\n type: {\n name: "String"\n }\n }\n};\nconst ifMatch = {\n parameterPath: ["options", "modifiedAccessConditions", "ifMatch"],\n mapper: {\n serializedName: "If-Match",\n xmlName: "If-Match",\n type: {\n name: "String"\n }\n }\n};\nconst ifNoneMatch = {\n parameterPath: ["options", "modifiedAccessConditions", "ifNoneMatch"],\n mapper: {\n serializedName: "If-None-Match",\n xmlName: "If-None-Match",\n type: {\n name: "String"\n }\n }\n};\nconst ifTags = {\n parameterPath: ["options", "modifiedAccessConditions", "ifTags"],\n mapper: {\n serializedName: "x-ms-if-tags",\n xmlName: "x-ms-if-tags",\n type: {\n name: "String"\n }\n }\n};\nconst deleteSnapshots = {\n parameterPath: ["options", "deleteSnapshots"],\n mapper: {\n serializedName: "x-ms-delete-snapshots",\n xmlName: "x-ms-delete-snapshots",\n type: {\n name: "Enum",\n allowedValues: ["include", "only"]\n }\n }\n};\nconst blobDeleteType = {\n parameterPath: ["options", "blobDeleteType"],\n mapper: {\n serializedName: "deletetype",\n xmlName: "deletetype",\n type: {\n name: "String"\n }\n }\n};\nconst comp11 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "expiry",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst expiryOptions = {\n parameterPath: "expiryOptions",\n mapper: {\n serializedName: "x-ms-expiry-option",\n required: true,\n xmlName: "x-ms-expiry-option",\n type: {\n name: "String"\n }\n }\n};\nconst expiresOn = {\n parameterPath: ["options", "expiresOn"],\n mapper: {\n serializedName: "x-ms-expiry-time",\n xmlName: "x-ms-expiry-time",\n type: {\n name: "String"\n }\n }\n};\nconst blobCacheControl = {\n parameterPath: ["options", "blobHttpHeaders", "blobCacheControl"],\n mapper: {\n serializedName: "x-ms-blob-cache-control",\n xmlName: "x-ms-blob-cache-control",\n type: {\n name: "String"\n }\n }\n};\nconst blobContentType = {\n parameterPath: ["options", "blobHttpHeaders", "blobContentType"],\n mapper: {\n serializedName: "x-ms-blob-content-type",\n xmlName: "x-ms-blob-content-type",\n type: {\n name: "String"\n }\n }\n};\nconst blobContentMD5 = {\n parameterPath: ["options", "blobHttpHeaders", "blobContentMD5"],\n mapper: {\n serializedName: "x-ms-blob-content-md5",\n xmlName: "x-ms-blob-content-md5",\n type: {\n name: "ByteArray"\n }\n }\n};\nconst blobContentEncoding = {\n parameterPath: ["options", "blobHttpHeaders", "blobContentEncoding"],\n mapper: {\n serializedName: "x-ms-blob-content-encoding",\n xmlName: "x-ms-blob-content-encoding",\n type: {\n name: "String"\n }\n }\n};\nconst blobContentLanguage = {\n parameterPath: ["options", "blobHttpHeaders", "blobContentLanguage"],\n mapper: {\n serializedName: "x-ms-blob-content-language",\n xmlName: "x-ms-blob-content-language",\n type: {\n name: "String"\n }\n }\n};\nconst blobContentDisposition = {\n parameterPath: ["options", "blobHttpHeaders", "blobContentDisposition"],\n mapper: {\n serializedName: "x-ms-blob-content-disposition",\n xmlName: "x-ms-blob-content-disposition",\n type: {\n name: "String"\n }\n }\n};\nconst comp12 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "immutabilityPolicies",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst immutabilityPolicyExpiry = {\n parameterPath: ["options", "immutabilityPolicyExpiry"],\n mapper: {\n serializedName: "x-ms-immutability-policy-until-date",\n xmlName: "x-ms-immutability-policy-until-date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n};\nconst immutabilityPolicyMode = {\n parameterPath: ["options", "immutabilityPolicyMode"],\n mapper: {\n serializedName: "x-ms-immutability-policy-mode",\n xmlName: "x-ms-immutability-policy-mode",\n type: {\n name: "Enum",\n allowedValues: ["Mutable", "Unlocked", "Locked"]\n }\n }\n};\nconst comp13 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "legalhold",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst legalHold = {\n parameterPath: "legalHold",\n mapper: {\n serializedName: "x-ms-legal-hold",\n required: true,\n xmlName: "x-ms-legal-hold",\n type: {\n name: "Boolean"\n }\n }\n};\nconst encryptionScope = {\n parameterPath: ["options", "encryptionScope"],\n mapper: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n }\n};\nconst comp14 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "snapshot",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst tier = {\n parameterPath: ["options", "tier"],\n mapper: {\n serializedName: "x-ms-access-tier",\n xmlName: "x-ms-access-tier",\n type: {\n name: "Enum",\n allowedValues: [\n "P4",\n "P6",\n "P10",\n "P15",\n "P20",\n "P30",\n "P40",\n "P50",\n "P60",\n "P70",\n "P80",\n "Hot",\n "Cool",\n "Archive",\n "Cold"\n ]\n }\n }\n};\nconst rehydratePriority = {\n parameterPath: ["options", "rehydratePriority"],\n mapper: {\n serializedName: "x-ms-rehydrate-priority",\n xmlName: "x-ms-rehydrate-priority",\n type: {\n name: "Enum",\n allowedValues: ["High", "Standard"]\n }\n }\n};\nconst sourceIfModifiedSince = {\n parameterPath: [\n "options",\n "sourceModifiedAccessConditions",\n "sourceIfModifiedSince"\n ],\n mapper: {\n serializedName: "x-ms-source-if-modified-since",\n xmlName: "x-ms-source-if-modified-since",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n};\nconst sourceIfUnmodifiedSince = {\n parameterPath: [\n "options",\n "sourceModifiedAccessConditions",\n "sourceIfUnmodifiedSince"\n ],\n mapper: {\n serializedName: "x-ms-source-if-unmodified-since",\n xmlName: "x-ms-source-if-unmodified-since",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n};\nconst sourceIfMatch = {\n parameterPath: ["options", "sourceModifiedAccessConditions", "sourceIfMatch"],\n mapper: {\n serializedName: "x-ms-source-if-match",\n xmlName: "x-ms-source-if-match",\n type: {\n name: "String"\n }\n }\n};\nconst sourceIfNoneMatch = {\n parameterPath: [\n "options",\n "sourceModifiedAccessConditions",\n "sourceIfNoneMatch"\n ],\n mapper: {\n serializedName: "x-ms-source-if-none-match",\n xmlName: "x-ms-source-if-none-match",\n type: {\n name: "String"\n }\n }\n};\nconst sourceIfTags = {\n parameterPath: ["options", "sourceModifiedAccessConditions", "sourceIfTags"],\n mapper: {\n serializedName: "x-ms-source-if-tags",\n xmlName: "x-ms-source-if-tags",\n type: {\n name: "String"\n }\n }\n};\nconst copySource = {\n parameterPath: "copySource",\n mapper: {\n serializedName: "x-ms-copy-source",\n required: true,\n xmlName: "x-ms-copy-source",\n type: {\n name: "String"\n }\n }\n};\nconst blobTagsString = {\n parameterPath: ["options", "blobTagsString"],\n mapper: {\n serializedName: "x-ms-tags",\n xmlName: "x-ms-tags",\n type: {\n name: "String"\n }\n }\n};\nconst sealBlob = {\n parameterPath: ["options", "sealBlob"],\n mapper: {\n serializedName: "x-ms-seal-blob",\n xmlName: "x-ms-seal-blob",\n type: {\n name: "Boolean"\n }\n }\n};\nconst legalHold1 = {\n parameterPath: ["options", "legalHold"],\n mapper: {\n serializedName: "x-ms-legal-hold",\n xmlName: "x-ms-legal-hold",\n type: {\n name: "Boolean"\n }\n }\n};\nconst xMsRequiresSync = {\n parameterPath: "xMsRequiresSync",\n mapper: {\n defaultValue: "true",\n isConstant: true,\n serializedName: "x-ms-requires-sync",\n type: {\n name: "String"\n }\n }\n};\nconst sourceContentMD5 = {\n parameterPath: ["options", "sourceContentMD5"],\n mapper: {\n serializedName: "x-ms-source-content-md5",\n xmlName: "x-ms-source-content-md5",\n type: {\n name: "ByteArray"\n }\n }\n};\nconst copySourceAuthorization = {\n parameterPath: ["options", "copySourceAuthorization"],\n mapper: {\n serializedName: "x-ms-copy-source-authorization",\n xmlName: "x-ms-copy-source-authorization",\n type: {\n name: "String"\n }\n }\n};\nconst copySourceTags = {\n parameterPath: ["options", "copySourceTags"],\n mapper: {\n serializedName: "x-ms-copy-source-tag-option",\n xmlName: "x-ms-copy-source-tag-option",\n type: {\n name: "Enum",\n allowedValues: ["REPLACE", "COPY"]\n }\n }\n};\nconst comp15 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "copy",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst copyActionAbortConstant = {\n parameterPath: "copyActionAbortConstant",\n mapper: {\n defaultValue: "abort",\n isConstant: true,\n serializedName: "x-ms-copy-action",\n type: {\n name: "String"\n }\n }\n};\nconst copyId = {\n parameterPath: "copyId",\n mapper: {\n serializedName: "copyid",\n required: true,\n xmlName: "copyid",\n type: {\n name: "String"\n }\n }\n};\nconst comp16 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "tier",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst tier1 = {\n parameterPath: "tier",\n mapper: {\n serializedName: "x-ms-access-tier",\n required: true,\n xmlName: "x-ms-access-tier",\n type: {\n name: "Enum",\n allowedValues: [\n "P4",\n "P6",\n "P10",\n "P15",\n "P20",\n "P30",\n "P40",\n "P50",\n "P60",\n "P70",\n "P80",\n "Hot",\n "Cool",\n "Archive",\n "Cold"\n ]\n }\n }\n};\nconst queryRequest = {\n parameterPath: ["options", "queryRequest"],\n mapper: QueryRequest\n};\nconst comp17 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "query",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst comp18 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "tags",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst tags = {\n parameterPath: ["options", "tags"],\n mapper: BlobTags\n};\nconst transactionalContentMD5 = {\n parameterPath: ["options", "transactionalContentMD5"],\n mapper: {\n serializedName: "Content-MD5",\n xmlName: "Content-MD5",\n type: {\n name: "ByteArray"\n }\n }\n};\nconst transactionalContentCrc64 = {\n parameterPath: ["options", "transactionalContentCrc64"],\n mapper: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n }\n};\nconst blobType = {\n parameterPath: "blobType",\n mapper: {\n defaultValue: "PageBlob",\n isConstant: true,\n serializedName: "x-ms-blob-type",\n type: {\n name: "String"\n }\n }\n};\nconst blobContentLength = {\n parameterPath: "blobContentLength",\n mapper: {\n serializedName: "x-ms-blob-content-length",\n required: true,\n xmlName: "x-ms-blob-content-length",\n type: {\n name: "Number"\n }\n }\n};\nconst blobSequenceNumber = {\n parameterPath: ["options", "blobSequenceNumber"],\n mapper: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n }\n};\nconst contentType1 = {\n parameterPath: ["options", "contentType"],\n mapper: {\n defaultValue: "application/octet-stream",\n isConstant: true,\n serializedName: "Content-Type",\n type: {\n name: "String"\n }\n }\n};\nconst body1 = {\n parameterPath: "body",\n mapper: {\n serializedName: "body",\n required: true,\n xmlName: "body",\n type: {\n name: "Stream"\n }\n }\n};\nconst accept2 = {\n parameterPath: "accept",\n mapper: {\n defaultValue: "application/xml",\n isConstant: true,\n serializedName: "Accept",\n type: {\n name: "String"\n }\n }\n};\nconst comp19 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "page",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst pageWrite = {\n parameterPath: "pageWrite",\n mapper: {\n defaultValue: "update",\n isConstant: true,\n serializedName: "x-ms-page-write",\n type: {\n name: "String"\n }\n }\n};\nconst ifSequenceNumberLessThanOrEqualTo = {\n parameterPath: [\n "options",\n "sequenceNumberAccessConditions",\n "ifSequenceNumberLessThanOrEqualTo"\n ],\n mapper: {\n serializedName: "x-ms-if-sequence-number-le",\n xmlName: "x-ms-if-sequence-number-le",\n type: {\n name: "Number"\n }\n }\n};\nconst ifSequenceNumberLessThan = {\n parameterPath: [\n "options",\n "sequenceNumberAccessConditions",\n "ifSequenceNumberLessThan"\n ],\n mapper: {\n serializedName: "x-ms-if-sequence-number-lt",\n xmlName: "x-ms-if-sequence-number-lt",\n type: {\n name: "Number"\n }\n }\n};\nconst ifSequenceNumberEqualTo = {\n parameterPath: [\n "options",\n "sequenceNumberAccessConditions",\n "ifSequenceNumberEqualTo"\n ],\n mapper: {\n serializedName: "x-ms-if-sequence-number-eq",\n xmlName: "x-ms-if-sequence-number-eq",\n type: {\n name: "Number"\n }\n }\n};\nconst pageWrite1 = {\n parameterPath: "pageWrite",\n mapper: {\n defaultValue: "clear",\n isConstant: true,\n serializedName: "x-ms-page-write",\n type: {\n name: "String"\n }\n }\n};\nconst sourceUrl = {\n parameterPath: "sourceUrl",\n mapper: {\n serializedName: "x-ms-copy-source",\n required: true,\n xmlName: "x-ms-copy-source",\n type: {\n name: "String"\n }\n }\n};\nconst sourceRange = {\n parameterPath: "sourceRange",\n mapper: {\n serializedName: "x-ms-source-range",\n required: true,\n xmlName: "x-ms-source-range",\n type: {\n name: "String"\n }\n }\n};\nconst sourceContentCrc64 = {\n parameterPath: ["options", "sourceContentCrc64"],\n mapper: {\n serializedName: "x-ms-source-content-crc64",\n xmlName: "x-ms-source-content-crc64",\n type: {\n name: "ByteArray"\n }\n }\n};\nconst range1 = {\n parameterPath: "range",\n mapper: {\n serializedName: "x-ms-range",\n required: true,\n xmlName: "x-ms-range",\n type: {\n name: "String"\n }\n }\n};\nconst comp20 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "pagelist",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst prevsnapshot = {\n parameterPath: ["options", "prevsnapshot"],\n mapper: {\n serializedName: "prevsnapshot",\n xmlName: "prevsnapshot",\n type: {\n name: "String"\n }\n }\n};\nconst prevSnapshotUrl = {\n parameterPath: ["options", "prevSnapshotUrl"],\n mapper: {\n serializedName: "x-ms-previous-snapshot-url",\n xmlName: "x-ms-previous-snapshot-url",\n type: {\n name: "String"\n }\n }\n};\nconst sequenceNumberAction = {\n parameterPath: "sequenceNumberAction",\n mapper: {\n serializedName: "x-ms-sequence-number-action",\n required: true,\n xmlName: "x-ms-sequence-number-action",\n type: {\n name: "Enum",\n allowedValues: ["max", "update", "increment"]\n }\n }\n};\nconst comp21 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "incrementalcopy",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst blobType1 = {\n parameterPath: "blobType",\n mapper: {\n defaultValue: "AppendBlob",\n isConstant: true,\n serializedName: "x-ms-blob-type",\n type: {\n name: "String"\n }\n }\n};\nconst comp22 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "appendblock",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst maxSize = {\n parameterPath: ["options", "appendPositionAccessConditions", "maxSize"],\n mapper: {\n serializedName: "x-ms-blob-condition-maxsize",\n xmlName: "x-ms-blob-condition-maxsize",\n type: {\n name: "Number"\n }\n }\n};\nconst appendPosition = {\n parameterPath: [\n "options",\n "appendPositionAccessConditions",\n "appendPosition"\n ],\n mapper: {\n serializedName: "x-ms-blob-condition-appendpos",\n xmlName: "x-ms-blob-condition-appendpos",\n type: {\n name: "Number"\n }\n }\n};\nconst sourceRange1 = {\n parameterPath: ["options", "sourceRange"],\n mapper: {\n serializedName: "x-ms-source-range",\n xmlName: "x-ms-source-range",\n type: {\n name: "String"\n }\n }\n};\nconst comp23 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "seal",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst blobType2 = {\n parameterPath: "blobType",\n mapper: {\n defaultValue: "BlockBlob",\n isConstant: true,\n serializedName: "x-ms-blob-type",\n type: {\n name: "String"\n }\n }\n};\nconst copySourceBlobProperties = {\n parameterPath: ["options", "copySourceBlobProperties"],\n mapper: {\n serializedName: "x-ms-copy-source-blob-properties",\n xmlName: "x-ms-copy-source-blob-properties",\n type: {\n name: "Boolean"\n }\n }\n};\nconst comp24 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "block",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst blockId = {\n parameterPath: "blockId",\n mapper: {\n serializedName: "blockid",\n required: true,\n xmlName: "blockid",\n type: {\n name: "String"\n }\n }\n};\nconst blocks = {\n parameterPath: "blocks",\n mapper: BlockLookupList\n};\nconst comp25 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "blocklist",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst listType = {\n parameterPath: "listType",\n mapper: {\n defaultValue: "committed",\n serializedName: "blocklisttype",\n required: true,\n xmlName: "blocklisttype",\n type: {\n name: "Enum",\n allowedValues: ["committed", "uncommitted", "all"]\n }\n }\n};\n//# sourceMappingURL=parameters.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generated/src/operations/service.js\n/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\n\n\n\n/** Class representing a Service. */\nclass Service {\n /**\n * Initialize a new instance of the class Service class.\n * @param client Reference to the service client\n */\n constructor(client) {\n this.client = client;\n }\n /**\n * Sets properties for a storage account\'s Blob service endpoint, including properties for Storage\n * Analytics and CORS (Cross-Origin Resource Sharing) rules\n * @param blobServiceProperties The StorageService properties.\n * @param options The options parameters.\n */\n setProperties(blobServiceProperties, options) {\n const operationArguments = {\n blobServiceProperties,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, setPropertiesOperationSpec);\n }\n /**\n * gets the properties of a storage account\'s Blob service, including properties for Storage Analytics\n * and CORS (Cross-Origin Resource Sharing) rules.\n * @param options The options parameters.\n */\n getProperties(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, getPropertiesOperationSpec);\n }\n /**\n * Retrieves statistics related to replication for the Blob service. It is only available on the\n * secondary location endpoint when read-access geo-redundant replication is enabled for the storage\n * account.\n * @param options The options parameters.\n */\n getStatistics(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, getStatisticsOperationSpec);\n }\n /**\n * The List Containers Segment operation returns a list of the containers under the specified account\n * @param options The options parameters.\n */\n listContainersSegment(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, listContainersSegmentOperationSpec);\n }\n /**\n * Retrieves a user delegation key for the Blob service. This is only a valid operation when using\n * bearer token authentication.\n * @param keyInfo Key information\n * @param options The options parameters.\n */\n getUserDelegationKey(keyInfo, options) {\n const operationArguments = {\n keyInfo,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, getUserDelegationKeyOperationSpec);\n }\n /**\n * Returns the sku name and account kind\n * @param options The options parameters.\n */\n getAccountInfo(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, getAccountInfoOperationSpec);\n }\n /**\n * The Batch operation allows multiple API calls to be embedded into a single HTTP request.\n * @param contentLength The length of the request.\n * @param multipartContentType Required. The value of this header must be multipart/mixed with a batch\n * boundary. Example header value: multipart/mixed; boundary=batch_\n * @param body Initial data\n * @param options The options parameters.\n */\n submitBatch(contentLength, multipartContentType, body, options) {\n const operationArguments = {\n contentLength,\n multipartContentType,\n body,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, submitBatchOperationSpec);\n }\n /**\n * The Filter Blobs operation enables callers to list blobs across all containers whose tags match a\n * given search expression. Filter blobs searches across all containers within a storage account but\n * can be scoped within the expression to a single container.\n * @param options The options parameters.\n */\n filterBlobs(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, filterBlobsOperationSpec);\n }\n}\n// Operation Specifications\nconst xmlSerializer = new Serializer(mappers_namespaceObject, /* isXml */ true);\nconst setPropertiesOperationSpec = {\n path: "/",\n httpMethod: "PUT",\n responses: {\n 202: {\n headersMapper: ServiceSetPropertiesHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ServiceSetPropertiesExceptionHeaders\n }\n },\n requestBody: blobServiceProperties,\n queryParameters: [\n restype,\n comp,\n timeoutInSeconds\n ],\n urlParameters: [url],\n headerParameters: [\n contentType,\n accept,\n version,\n requestId\n ],\n isXML: true,\n contentType: "application/xml; charset=utf-8",\n mediaType: "xml",\n serializer: xmlSerializer\n};\nconst getPropertiesOperationSpec = {\n path: "/",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: BlobServiceProperties,\n headersMapper: ServiceGetPropertiesHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ServiceGetPropertiesExceptionHeaders\n }\n },\n queryParameters: [\n restype,\n comp,\n timeoutInSeconds\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1\n ],\n isXML: true,\n serializer: xmlSerializer\n};\nconst getStatisticsOperationSpec = {\n path: "/",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: BlobServiceStatistics,\n headersMapper: ServiceGetStatisticsHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ServiceGetStatisticsExceptionHeaders\n }\n },\n queryParameters: [\n restype,\n timeoutInSeconds,\n comp1\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1\n ],\n isXML: true,\n serializer: xmlSerializer\n};\nconst listContainersSegmentOperationSpec = {\n path: "/",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: ListContainersSegmentResponse,\n headersMapper: ServiceListContainersSegmentHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ServiceListContainersSegmentExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n comp2,\n prefix,\n marker,\n maxPageSize,\n include\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1\n ],\n isXML: true,\n serializer: xmlSerializer\n};\nconst getUserDelegationKeyOperationSpec = {\n path: "/",\n httpMethod: "POST",\n responses: {\n 200: {\n bodyMapper: UserDelegationKey,\n headersMapper: ServiceGetUserDelegationKeyHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ServiceGetUserDelegationKeyExceptionHeaders\n }\n },\n requestBody: keyInfo,\n queryParameters: [\n restype,\n timeoutInSeconds,\n comp3\n ],\n urlParameters: [url],\n headerParameters: [\n contentType,\n accept,\n version,\n requestId\n ],\n isXML: true,\n contentType: "application/xml; charset=utf-8",\n mediaType: "xml",\n serializer: xmlSerializer\n};\nconst getAccountInfoOperationSpec = {\n path: "/",\n httpMethod: "GET",\n responses: {\n 200: {\n headersMapper: ServiceGetAccountInfoHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ServiceGetAccountInfoExceptionHeaders\n }\n },\n queryParameters: [comp, restype1],\n urlParameters: [url],\n headerParameters: [version, accept1],\n isXML: true,\n serializer: xmlSerializer\n};\nconst submitBatchOperationSpec = {\n path: "/",\n httpMethod: "POST",\n responses: {\n 202: {\n bodyMapper: {\n type: { name: "Stream" },\n serializedName: "parsedResponse"\n },\n headersMapper: ServiceSubmitBatchHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ServiceSubmitBatchExceptionHeaders\n }\n },\n requestBody: body,\n queryParameters: [timeoutInSeconds, comp4],\n urlParameters: [url],\n headerParameters: [\n contentType,\n accept,\n version,\n requestId,\n contentLength,\n multipartContentType\n ],\n isXML: true,\n contentType: "application/xml; charset=utf-8",\n mediaType: "xml",\n serializer: xmlSerializer\n};\nconst filterBlobsOperationSpec = {\n path: "/",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: FilterBlobSegment,\n headersMapper: ServiceFilterBlobsHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ServiceFilterBlobsExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n marker,\n maxPageSize,\n comp5,\n where\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1\n ],\n isXML: true,\n serializer: xmlSerializer\n};\n//# sourceMappingURL=service.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generated/src/operations/container.js\n/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\n\n\n\n/** Class representing a Container. */\nclass Container {\n /**\n * Initialize a new instance of the class Container class.\n * @param client Reference to the service client\n */\n constructor(client) {\n this.client = client;\n }\n /**\n * creates a new container under the specified account. If the container with the same name already\n * exists, the operation fails\n * @param options The options parameters.\n */\n create(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, createOperationSpec);\n }\n /**\n * returns all user-defined metadata and system properties for the specified container. The data\n * returned does not include the container\'s list of blobs\n * @param options The options parameters.\n */\n getProperties(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, container_getPropertiesOperationSpec);\n }\n /**\n * operation marks the specified container for deletion. The container and any blobs contained within\n * it are later deleted during garbage collection\n * @param options The options parameters.\n */\n delete(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, deleteOperationSpec);\n }\n /**\n * operation sets one or more user-defined name-value pairs for the specified container.\n * @param options The options parameters.\n */\n setMetadata(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, setMetadataOperationSpec);\n }\n /**\n * gets the permissions for the specified container. The permissions indicate whether container data\n * may be accessed publicly.\n * @param options The options parameters.\n */\n getAccessPolicy(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, getAccessPolicyOperationSpec);\n }\n /**\n * sets the permissions for the specified container. The permissions indicate whether blobs in a\n * container may be accessed publicly.\n * @param options The options parameters.\n */\n setAccessPolicy(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, setAccessPolicyOperationSpec);\n }\n /**\n * Restores a previously-deleted container.\n * @param options The options parameters.\n */\n restore(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, restoreOperationSpec);\n }\n /**\n * Renames an existing container.\n * @param sourceContainerName Required. Specifies the name of the container to rename.\n * @param options The options parameters.\n */\n rename(sourceContainerName, options) {\n const operationArguments = {\n sourceContainerName,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, renameOperationSpec);\n }\n /**\n * The Batch operation allows multiple API calls to be embedded into a single HTTP request.\n * @param contentLength The length of the request.\n * @param multipartContentType Required. The value of this header must be multipart/mixed with a batch\n * boundary. Example header value: multipart/mixed; boundary=batch_\n * @param body Initial data\n * @param options The options parameters.\n */\n submitBatch(contentLength, multipartContentType, body, options) {\n const operationArguments = {\n contentLength,\n multipartContentType,\n body,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, container_submitBatchOperationSpec);\n }\n /**\n * The Filter Blobs operation enables callers to list blobs in a container whose tags match a given\n * search expression. Filter blobs searches within the given container.\n * @param options The options parameters.\n */\n filterBlobs(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, container_filterBlobsOperationSpec);\n }\n /**\n * [Update] establishes and manages a lock on a container for delete operations. The lock duration can\n * be 15 to 60 seconds, or can be infinite\n * @param options The options parameters.\n */\n acquireLease(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, acquireLeaseOperationSpec);\n }\n /**\n * [Update] establishes and manages a lock on a container for delete operations. The lock duration can\n * be 15 to 60 seconds, or can be infinite\n * @param leaseId Specifies the current lease ID on the resource.\n * @param options The options parameters.\n */\n releaseLease(leaseId, options) {\n const operationArguments = {\n leaseId,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, releaseLeaseOperationSpec);\n }\n /**\n * [Update] establishes and manages a lock on a container for delete operations. The lock duration can\n * be 15 to 60 seconds, or can be infinite\n * @param leaseId Specifies the current lease ID on the resource.\n * @param options The options parameters.\n */\n renewLease(leaseId, options) {\n const operationArguments = {\n leaseId,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, renewLeaseOperationSpec);\n }\n /**\n * [Update] establishes and manages a lock on a container for delete operations. The lock duration can\n * be 15 to 60 seconds, or can be infinite\n * @param options The options parameters.\n */\n breakLease(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, breakLeaseOperationSpec);\n }\n /**\n * [Update] establishes and manages a lock on a container for delete operations. The lock duration can\n * be 15 to 60 seconds, or can be infinite\n * @param leaseId Specifies the current lease ID on the resource.\n * @param proposedLeaseId Proposed lease ID, in a GUID string format. The Blob service returns 400\n * (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor\n * (String) for a list of valid GUID string formats.\n * @param options The options parameters.\n */\n changeLease(leaseId, proposedLeaseId, options) {\n const operationArguments = {\n leaseId,\n proposedLeaseId,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, changeLeaseOperationSpec);\n }\n /**\n * [Update] The List Blobs operation returns a list of the blobs under the specified container\n * @param options The options parameters.\n */\n listBlobFlatSegment(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, listBlobFlatSegmentOperationSpec);\n }\n /**\n * [Update] The List Blobs operation returns a list of the blobs under the specified container\n * @param delimiter When the request includes this parameter, the operation returns a BlobPrefix\n * element in the response body that acts as a placeholder for all blobs whose names begin with the\n * same substring up to the appearance of the delimiter character. The delimiter may be a single\n * character or a string.\n * @param options The options parameters.\n */\n listBlobHierarchySegment(delimiter, options) {\n const operationArguments = {\n delimiter,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, listBlobHierarchySegmentOperationSpec);\n }\n /**\n * Returns the sku name and account kind\n * @param options The options parameters.\n */\n getAccountInfo(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, container_getAccountInfoOperationSpec);\n }\n}\n// Operation Specifications\nconst container_xmlSerializer = new Serializer(mappers_namespaceObject, /* isXml */ true);\nconst createOperationSpec = {\n path: "/{containerName}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: ContainerCreateHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerCreateExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, restype2],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n metadata,\n access,\n defaultEncryptionScope,\n preventEncryptionScopeOverride\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst container_getPropertiesOperationSpec = {\n path: "/{containerName}",\n httpMethod: "GET",\n responses: {\n 200: {\n headersMapper: ContainerGetPropertiesHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerGetPropertiesExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, restype2],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst deleteOperationSpec = {\n path: "/{containerName}",\n httpMethod: "DELETE",\n responses: {\n 202: {\n headersMapper: ContainerDeleteHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerDeleteExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, restype2],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst setMetadataOperationSpec = {\n path: "/{containerName}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: ContainerSetMetadataHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerSetMetadataExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n restype2,\n comp6\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n metadata,\n leaseId,\n ifModifiedSince\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst getAccessPolicyOperationSpec = {\n path: "/{containerName}",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: {\n type: {\n name: "Sequence",\n element: {\n type: { name: "Composite", className: "SignedIdentifier" }\n }\n },\n serializedName: "SignedIdentifiers",\n xmlName: "SignedIdentifiers",\n xmlIsWrapped: true,\n xmlElementName: "SignedIdentifier"\n },\n headersMapper: ContainerGetAccessPolicyHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerGetAccessPolicyExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n restype2,\n comp7\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst setAccessPolicyOperationSpec = {\n path: "/{containerName}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: ContainerSetAccessPolicyHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerSetAccessPolicyExceptionHeaders\n }\n },\n requestBody: containerAcl,\n queryParameters: [\n timeoutInSeconds,\n restype2,\n comp7\n ],\n urlParameters: [url],\n headerParameters: [\n contentType,\n accept,\n version,\n requestId,\n access,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince\n ],\n isXML: true,\n contentType: "application/xml; charset=utf-8",\n mediaType: "xml",\n serializer: container_xmlSerializer\n};\nconst restoreOperationSpec = {\n path: "/{containerName}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: ContainerRestoreHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerRestoreExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n restype2,\n comp8\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n deletedContainerName,\n deletedContainerVersion\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst renameOperationSpec = {\n path: "/{containerName}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: ContainerRenameHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerRenameExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n restype2,\n comp9\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n sourceContainerName,\n sourceLeaseId\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst container_submitBatchOperationSpec = {\n path: "/{containerName}",\n httpMethod: "POST",\n responses: {\n 202: {\n bodyMapper: {\n type: { name: "Stream" },\n serializedName: "parsedResponse"\n },\n headersMapper: ContainerSubmitBatchHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerSubmitBatchExceptionHeaders\n }\n },\n requestBody: body,\n queryParameters: [\n timeoutInSeconds,\n comp4,\n restype2\n ],\n urlParameters: [url],\n headerParameters: [\n contentType,\n accept,\n version,\n requestId,\n contentLength,\n multipartContentType\n ],\n isXML: true,\n contentType: "application/xml; charset=utf-8",\n mediaType: "xml",\n serializer: container_xmlSerializer\n};\nconst container_filterBlobsOperationSpec = {\n path: "/{containerName}",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: FilterBlobSegment,\n headersMapper: ContainerFilterBlobsHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerFilterBlobsExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n marker,\n maxPageSize,\n comp5,\n where,\n restype2\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst acquireLeaseOperationSpec = {\n path: "/{containerName}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: ContainerAcquireLeaseHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerAcquireLeaseExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n restype2,\n comp10\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n action,\n duration,\n proposedLeaseId\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst releaseLeaseOperationSpec = {\n path: "/{containerName}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: ContainerReleaseLeaseHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerReleaseLeaseExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n restype2,\n comp10\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n action1,\n leaseId1\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst renewLeaseOperationSpec = {\n path: "/{containerName}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: ContainerRenewLeaseHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerRenewLeaseExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n restype2,\n comp10\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n leaseId1,\n action2\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst breakLeaseOperationSpec = {\n path: "/{containerName}",\n httpMethod: "PUT",\n responses: {\n 202: {\n headersMapper: ContainerBreakLeaseHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerBreakLeaseExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n restype2,\n comp10\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n action3,\n breakPeriod\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst changeLeaseOperationSpec = {\n path: "/{containerName}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: ContainerChangeLeaseHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerChangeLeaseExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n restype2,\n comp10\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n leaseId1,\n action4,\n proposedLeaseId1\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst listBlobFlatSegmentOperationSpec = {\n path: "/{containerName}",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: ListBlobsFlatSegmentResponse,\n headersMapper: ContainerListBlobFlatSegmentHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerListBlobFlatSegmentExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n comp2,\n prefix,\n marker,\n maxPageSize,\n restype2,\n include1\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst listBlobHierarchySegmentOperationSpec = {\n path: "/{containerName}",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: ListBlobsHierarchySegmentResponse,\n headersMapper: ContainerListBlobHierarchySegmentHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerListBlobHierarchySegmentExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n comp2,\n prefix,\n marker,\n maxPageSize,\n restype2,\n include1,\n delimiter\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst container_getAccountInfoOperationSpec = {\n path: "/{containerName}",\n httpMethod: "GET",\n responses: {\n 200: {\n headersMapper: ContainerGetAccountInfoHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerGetAccountInfoExceptionHeaders\n }\n },\n queryParameters: [comp, restype1],\n urlParameters: [url],\n headerParameters: [version, accept1],\n isXML: true,\n serializer: container_xmlSerializer\n};\n//# sourceMappingURL=container.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-tracing/dist-esm/src/createSpan.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\nfunction isTracingDisabled() {\n var _a;\n if (typeof process === "undefined") {\n // not supported in browser for now without polyfills\n return false;\n }\n const azureTracingDisabledValue = (_a = process.env.AZURE_TRACING_DISABLED) === null || _a === void 0 ? void 0 : _a.toLowerCase();\n if (azureTracingDisabledValue === "false" || azureTracingDisabledValue === "0") {\n return false;\n }\n return Boolean(azureTracingDisabledValue);\n}\n/**\n * Creates a function that can be used to create spans using the global tracer.\n *\n * Usage:\n *\n * ```typescript\n * // once\n * const createSpan = createSpanFunction({ packagePrefix: "Azure.Data.AppConfiguration", namespace: "Microsoft.AppConfiguration" });\n *\n * // in each operation\n * const span = createSpan("deleteConfigurationSetting", operationOptions);\n * // code...\n * span.end();\n * ```\n *\n * @hidden\n * @param args - allows configuration of the prefix for each span as well as the az.namespace field.\n */\nfunction createSpanFunction(args) {\n return function (operationName, operationOptions) {\n const tracer = getTracer();\n const tracingOptions = (operationOptions === null || operationOptions === void 0 ? void 0 : operationOptions.tracingOptions) || {};\n const spanOptions = Object.assign({ kind: SpanKind.INTERNAL }, tracingOptions.spanOptions);\n const spanName = args.packagePrefix ? `${args.packagePrefix}.${operationName}` : operationName;\n let span;\n if (isTracingDisabled()) {\n span = trace.wrapSpanContext(INVALID_SPAN_CONTEXT);\n }\n else {\n span = tracer.startSpan(spanName, spanOptions, tracingOptions.tracingContext);\n }\n if (args.namespace) {\n span.setAttribute("az.namespace", args.namespace);\n }\n let newSpanOptions = tracingOptions.spanOptions || {};\n if (span.isRecording() && args.namespace) {\n newSpanOptions = Object.assign(Object.assign({}, tracingOptions.spanOptions), { attributes: Object.assign(Object.assign({}, spanOptions.attributes), { "az.namespace": args.namespace }) });\n }\n const newTracingOptions = Object.assign(Object.assign({}, tracingOptions), { spanOptions: newSpanOptions, tracingContext: interfaces_setSpan(tracingOptions.tracingContext || interfaces_context.active(), span) });\n const newOperationOptions = Object.assign(Object.assign({}, operationOptions), { tracingOptions: newTracingOptions });\n return {\n span,\n updatedOptions: newOperationOptions\n };\n };\n}\n//# sourceMappingURL=createSpan.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-tracing/dist-esm/src/utils/traceParentHeader.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nconst traceParentHeader_VERSION = "00";\n/**\n * Generates a `SpanContext` given a `traceparent` header value.\n * @param traceParent - Serialized span context data as a `traceparent` header value.\n * @returns The `SpanContext` generated from the `traceparent` value.\n */\nfunction extractSpanContextFromTraceParentHeader(traceParentHeader) {\n const parts = traceParentHeader.split("-");\n if (parts.length !== 4) {\n return;\n }\n const [version, traceId, spanId, traceOptions] = parts;\n if (version !== traceParentHeader_VERSION) {\n return;\n }\n const traceFlags = parseInt(traceOptions, 16);\n const spanContext = {\n spanId,\n traceId,\n traceFlags\n };\n return spanContext;\n}\n/**\n * Generates a `traceparent` value given a span context.\n * @param spanContext - Contains context for a specific span.\n * @returns The `spanContext` represented as a `traceparent` value.\n */\nfunction getTraceParentHeader(spanContext) {\n const missingFields = [];\n if (!spanContext.traceId) {\n missingFields.push("traceId");\n }\n if (!spanContext.spanId) {\n missingFields.push("spanId");\n }\n if (missingFields.length) {\n return;\n }\n const flags = spanContext.traceFlags || 0 /* NONE */;\n const hexFlags = flags.toString(16);\n const traceFlags = hexFlags.length === 1 ? `0${hexFlags}` : hexFlags;\n // https://www.w3.org/TR/trace-context/#traceparent-header-field-values\n return `${traceParentHeader_VERSION}-${spanContext.traceId}-${spanContext.spanId}-${traceFlags}`;\n}\n//# sourceMappingURL=traceParentHeader.js.map\n// EXTERNAL MODULE: external "os"\nvar external_os_ = __webpack_require__(2037);\n;// CONCATENATED MODULE: ./node_modules/@azure/logger/dist-esm/src/log.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\nfunction log(message, ...args) {\n process.stderr.write(`${external_util_default().format(message, ...args)}${external_os_.EOL}`);\n}\n//# sourceMappingURL=log.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/logger/dist-esm/src/debug.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nconst debugEnvVariable = (typeof process !== "undefined" && process.env && process.env.DEBUG) || undefined;\nlet enabledString;\nlet enabledNamespaces = [];\nlet skippedNamespaces = [];\nconst debuggers = [];\nif (debugEnvVariable) {\n enable(debugEnvVariable);\n}\nconst debugObj = Object.assign((namespace) => {\n return createDebugger(namespace);\n}, {\n enable,\n enabled,\n disable,\n log: log,\n});\nfunction enable(namespaces) {\n enabledString = namespaces;\n enabledNamespaces = [];\n skippedNamespaces = [];\n const wildcard = /\\*/g;\n const namespaceList = namespaces.split(",").map((ns) => ns.trim().replace(wildcard, ".*?"));\n for (const ns of namespaceList) {\n if (ns.startsWith("-")) {\n skippedNamespaces.push(new RegExp(`^${ns.substr(1)}$`));\n }\n else {\n enabledNamespaces.push(new RegExp(`^${ns}$`));\n }\n }\n for (const instance of debuggers) {\n instance.enabled = enabled(instance.namespace);\n }\n}\nfunction enabled(namespace) {\n if (namespace.endsWith("*")) {\n return true;\n }\n for (const skipped of skippedNamespaces) {\n if (skipped.test(namespace)) {\n return false;\n }\n }\n for (const enabledNamespace of enabledNamespaces) {\n if (enabledNamespace.test(namespace)) {\n return true;\n }\n }\n return false;\n}\nfunction disable() {\n const result = enabledString || "";\n enable("");\n return result;\n}\nfunction createDebugger(namespace) {\n const newDebugger = Object.assign(debug, {\n enabled: enabled(namespace),\n destroy,\n log: debugObj.log,\n namespace,\n extend,\n });\n function debug(...args) {\n if (!newDebugger.enabled) {\n return;\n }\n if (args.length > 0) {\n args[0] = `${namespace} ${args[0]}`;\n }\n newDebugger.log(...args);\n }\n debuggers.push(newDebugger);\n return newDebugger;\n}\nfunction destroy() {\n const index = debuggers.indexOf(this);\n if (index >= 0) {\n debuggers.splice(index, 1);\n return true;\n }\n return false;\n}\nfunction extend(namespace) {\n const newDebugger = createDebugger(`${this.namespace}:${namespace}`);\n newDebugger.log = this.log;\n return newDebugger;\n}\n/* harmony default export */ const debug = (debugObj);\n//# sourceMappingURL=debug.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/logger/dist-esm/src/index.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nconst registeredLoggers = new Set();\nconst logLevelFromEnv = (typeof process !== "undefined" && process.env && process.env.AZURE_LOG_LEVEL) || undefined;\nlet azureLogLevel;\n/**\n * The AzureLogger provides a mechanism for overriding where logs are output to.\n * By default, logs are sent to stderr.\n * Override the `log` method to redirect logs to another location.\n */\nconst AzureLogger = debug("azure");\nAzureLogger.log = (...args) => {\n debug.log(...args);\n};\nconst AZURE_LOG_LEVELS = ["verbose", "info", "warning", "error"];\nif (logLevelFromEnv) {\n // avoid calling setLogLevel because we don\'t want a mis-set environment variable to crash\n if (isAzureLogLevel(logLevelFromEnv)) {\n setLogLevel(logLevelFromEnv);\n }\n else {\n console.error(`AZURE_LOG_LEVEL set to unknown log level \'${logLevelFromEnv}\'; logging is not enabled. Acceptable values: ${AZURE_LOG_LEVELS.join(", ")}.`);\n }\n}\n/**\n * Immediately enables logging at the specified log level. If no level is specified, logging is disabled.\n * @param level - The log level to enable for logging.\n * Options from most verbose to least verbose are:\n * - verbose\n * - info\n * - warning\n * - error\n */\nfunction setLogLevel(level) {\n if (level && !isAzureLogLevel(level)) {\n throw new Error(`Unknown log level \'${level}\'. Acceptable values: ${AZURE_LOG_LEVELS.join(",")}`);\n }\n azureLogLevel = level;\n const enabledNamespaces = [];\n for (const logger of registeredLoggers) {\n if (shouldEnable(logger)) {\n enabledNamespaces.push(logger.namespace);\n }\n }\n debug.enable(enabledNamespaces.join(","));\n}\n/**\n * Retrieves the currently specified log level.\n */\nfunction getLogLevel() {\n return azureLogLevel;\n}\nconst levelMap = {\n verbose: 400,\n info: 300,\n warning: 200,\n error: 100,\n};\n/**\n * Creates a logger for use by the Azure SDKs that inherits from `AzureLogger`.\n * @param namespace - The name of the SDK package.\n * @hidden\n */\nfunction createClientLogger(namespace) {\n const clientRootLogger = AzureLogger.extend(namespace);\n patchLogMethod(AzureLogger, clientRootLogger);\n return {\n error: createLogger(clientRootLogger, "error"),\n warning: createLogger(clientRootLogger, "warning"),\n info: createLogger(clientRootLogger, "info"),\n verbose: createLogger(clientRootLogger, "verbose"),\n };\n}\nfunction patchLogMethod(parent, child) {\n child.log = (...args) => {\n parent.log(...args);\n };\n}\nfunction createLogger(parent, level) {\n const logger = Object.assign(parent.extend(level), {\n level,\n });\n patchLogMethod(parent, logger);\n if (shouldEnable(logger)) {\n const enabledNamespaces = debug.disable();\n debug.enable(enabledNamespaces + "," + logger.namespace);\n }\n registeredLoggers.add(logger);\n return logger;\n}\nfunction shouldEnable(logger) {\n return Boolean(azureLogLevel && levelMap[logger.level] <= levelMap[azureLogLevel]);\n}\nfunction isAzureLogLevel(logLevel) {\n return AZURE_LOG_LEVELS.includes(logLevel);\n}\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/log.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nconst log_logger = createClientLogger("core-http");\n//# sourceMappingURL=log.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/tracingPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\nconst createSpan = createSpanFunction({\n packagePrefix: "",\n namespace: "",\n});\n/**\n * Creates a policy that wraps outgoing requests with a tracing span.\n * @param tracingOptions - Tracing options.\n * @returns An instance of the {@link TracingPolicy} class.\n */\nfunction tracingPolicy_tracingPolicy(tracingOptions = {}) {\n return {\n create(nextPolicy, options) {\n return new TracingPolicy(nextPolicy, options, tracingOptions);\n },\n };\n}\n/**\n * A policy that wraps outgoing requests with a tracing span.\n */\nclass TracingPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options, tracingOptions) {\n super(nextPolicy, options);\n this.userAgent = tracingOptions.userAgent;\n }\n async sendRequest(request) {\n if (!request.tracingContext) {\n return this._nextPolicy.sendRequest(request);\n }\n const span = this.tryCreateSpan(request);\n if (!span) {\n return this._nextPolicy.sendRequest(request);\n }\n try {\n const response = await this._nextPolicy.sendRequest(request);\n this.tryProcessResponse(span, response);\n return response;\n }\n catch (err) {\n this.tryProcessError(span, err);\n throw err;\n }\n }\n tryCreateSpan(request) {\n var _a;\n try {\n // Passing spanOptions as part of tracingOptions to maintain compatibility @azure/core-tracing@preview.13 and earlier.\n // We can pass this as a separate parameter once we upgrade to the latest core-tracing.\n const { span } = createSpan(`HTTP ${request.method}`, {\n tracingOptions: {\n spanOptions: Object.assign(Object.assign({}, request.spanOptions), { kind: SpanKind.CLIENT }),\n tracingContext: request.tracingContext,\n },\n });\n // If the span is not recording, don\'t do any more work.\n if (!span.isRecording()) {\n span.end();\n return undefined;\n }\n const namespaceFromContext = (_a = request.tracingContext) === null || _a === void 0 ? void 0 : _a.getValue(Symbol.for("az.namespace"));\n if (typeof namespaceFromContext === "string") {\n span.setAttribute("az.namespace", namespaceFromContext);\n }\n span.setAttributes({\n "http.method": request.method,\n "http.url": request.url,\n requestId: request.requestId,\n });\n if (this.userAgent) {\n span.setAttribute("http.user_agent", this.userAgent);\n }\n // set headers\n const spanContext = span.spanContext();\n const traceParentHeader = getTraceParentHeader(spanContext);\n if (traceParentHeader && interfaces_isSpanContextValid(spanContext)) {\n request.headers.set("traceparent", traceParentHeader);\n const traceState = spanContext.traceState && spanContext.traceState.serialize();\n // if tracestate is set, traceparent MUST be set, so only set tracestate after traceparent\n if (traceState) {\n request.headers.set("tracestate", traceState);\n }\n }\n return span;\n }\n catch (error) {\n log_logger.warning(`Skipping creating a tracing span due to an error: ${error.message}`);\n return undefined;\n }\n }\n tryProcessError(span, err) {\n try {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: err.message,\n });\n if (err.statusCode) {\n span.setAttribute("http.status_code", err.statusCode);\n }\n span.end();\n }\n catch (error) {\n log_logger.warning(`Skipping tracing span processing due to an error: ${error.message}`);\n }\n }\n tryProcessResponse(span, response) {\n try {\n span.setAttribute("http.status_code", response.status);\n const serviceRequestId = response.headers.get("x-ms-request-id");\n if (serviceRequestId) {\n span.setAttribute("serviceRequestId", serviceRequestId);\n }\n span.setStatus({\n code: SpanStatusCode.OK,\n });\n span.end();\n }\n catch (error) {\n log_logger.warning(`Skipping tracing span processing due to an error: ${error.message}`);\n }\n }\n}\n//# sourceMappingURL=tracingPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/keepAlivePolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * By default, HTTP connections are maintained for future requests.\n */\nconst keepAlivePolicy_DefaultKeepAliveOptions = {\n enable: true,\n};\n/**\n * Creates a policy that controls whether HTTP connections are maintained on future requests.\n * @param keepAliveOptions - Keep alive options. By default, HTTP connections are maintained for future requests.\n * @returns An instance of the {@link KeepAlivePolicy}\n */\nfunction keepAlivePolicy_keepAlivePolicy(keepAliveOptions) {\n return {\n create: (nextPolicy, options) => {\n return new KeepAlivePolicy(nextPolicy, options, keepAliveOptions || keepAlivePolicy_DefaultKeepAliveOptions);\n },\n };\n}\n/**\n * KeepAlivePolicy is a policy used to control keep alive settings for every request.\n */\nclass KeepAlivePolicy extends BaseRequestPolicy {\n /**\n * Creates an instance of KeepAlivePolicy.\n *\n * @param nextPolicy -\n * @param options -\n * @param keepAliveOptions -\n */\n constructor(nextPolicy, options, keepAliveOptions) {\n super(nextPolicy, options);\n this.keepAliveOptions = keepAliveOptions;\n }\n /**\n * Sends out request.\n *\n * @param request -\n * @returns\n */\n async sendRequest(request) {\n request.keepAlive = this.keepAliveOptions.enable;\n return this._nextPolicy.sendRequest(request);\n }\n}\n//# sourceMappingURL=keepAlivePolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/generateClientRequestIdPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Creates a policy that assigns a unique request id to outgoing requests.\n * @param requestIdHeaderName - The name of the header to use when assigning the unique id to the request.\n */\nfunction generateClientRequestIdPolicy_generateClientRequestIdPolicy(requestIdHeaderName = "x-ms-client-request-id") {\n return {\n create: (nextPolicy, options) => {\n return new GenerateClientRequestIdPolicy(nextPolicy, options, requestIdHeaderName);\n },\n };\n}\nclass GenerateClientRequestIdPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options, _requestIdHeaderName) {\n super(nextPolicy, options);\n this._requestIdHeaderName = _requestIdHeaderName;\n }\n sendRequest(request) {\n if (!request.headers.contains(this._requestIdHeaderName)) {\n request.headers.set(this._requestIdHeaderName, request.requestId);\n }\n return this._nextPolicy.sendRequest(request);\n }\n}\n//# sourceMappingURL=generateClientRequestIdPolicy.js.map\n// EXTERNAL MODULE: ./node_modules/xml2js/lib/xml2js.js\nvar xml2js = __webpack_require__(5055);\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/util/xml.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n// Note: The reason we re-define all of the xml2js default settings (version 2.0) here is because the default settings object exposed\n// by the xm2js library is mutable. See https://github.com/Leonidas-from-XIV/node-xml2js/issues/536\n// By creating a new copy of the settings each time we instantiate the parser,\n// we are safeguarding against the possibility of the default settings being mutated elsewhere unintentionally.\nconst xml2jsDefaultOptionsV2 = {\n explicitCharkey: false,\n trim: false,\n normalize: false,\n normalizeTags: false,\n attrkey: XML_ATTRKEY,\n explicitArray: true,\n ignoreAttrs: false,\n mergeAttrs: false,\n explicitRoot: true,\n validator: undefined,\n xmlns: false,\n explicitChildren: false,\n preserveChildrenOrder: false,\n childkey: "$$",\n charsAsChildren: false,\n includeWhiteChars: false,\n async: false,\n strict: true,\n attrNameProcessors: undefined,\n attrValueProcessors: undefined,\n tagNameProcessors: undefined,\n valueProcessors: undefined,\n rootName: "root",\n xmldec: {\n version: "1.0",\n encoding: "UTF-8",\n standalone: true,\n },\n doctype: undefined,\n renderOpts: {\n pretty: true,\n indent: " ",\n newline: "\\n",\n },\n headless: false,\n chunkSize: 10000,\n emptyTag: "",\n cdata: false,\n};\n// The xml2js settings for general XML parsing operations.\nconst xml2jsParserSettings = Object.assign({}, xml2jsDefaultOptionsV2);\nxml2jsParserSettings.explicitArray = false;\n// The xml2js settings for general XML building operations.\nconst xml2jsBuilderSettings = Object.assign({}, xml2jsDefaultOptionsV2);\nxml2jsBuilderSettings.explicitArray = false;\nxml2jsBuilderSettings.renderOpts = {\n pretty: false,\n};\n/**\n * Converts given JSON object to XML string\n * @param obj - JSON object to be converted into XML string\n * @param opts - Options that govern the parsing of given JSON object\n */\nfunction stringifyXML(obj, opts = {}) {\n var _a;\n xml2jsBuilderSettings.rootName = opts.rootName;\n xml2jsBuilderSettings.charkey = (_a = opts.xmlCharKey) !== null && _a !== void 0 ? _a : XML_CHARKEY;\n const builder = new xml2js.Builder(xml2jsBuilderSettings);\n return builder.buildObject(obj);\n}\n/**\n * Converts given XML string into JSON\n * @param str - String containing the XML content to be parsed into JSON\n * @param opts - Options that govern the parsing of given xml string\n */\nfunction parseXML(str, opts = {}) {\n var _a;\n xml2jsParserSettings.explicitRoot = !!opts.includeRoot;\n xml2jsParserSettings.charkey = (_a = opts.xmlCharKey) !== null && _a !== void 0 ? _a : XML_CHARKEY;\n const xmlParser = new xml2js.Parser(xml2jsParserSettings);\n return new Promise((resolve, reject) => {\n if (!str) {\n reject(new Error("Document is empty"));\n }\n else {\n xmlParser.parseString(str, (err, res) => {\n if (err) {\n reject(err);\n }\n else {\n resolve(res);\n }\n });\n }\n });\n}\n//# sourceMappingURL=xml.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/deserializationPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n/**\n * Create a new serialization RequestPolicyCreator that will serialized HTTP request bodies as they\n * pass through the HTTP pipeline.\n */\nfunction deserializationPolicy_deserializationPolicy(deserializationContentTypes, parsingOptions) {\n return {\n create: (nextPolicy, options) => {\n return new DeserializationPolicy(nextPolicy, options, deserializationContentTypes, parsingOptions);\n },\n };\n}\nconst defaultJsonContentTypes = ["application/json", "text/json"];\nconst defaultXmlContentTypes = ["application/xml", "application/atom+xml"];\nconst deserializationPolicy_DefaultDeserializationOptions = {\n expectedContentTypes: {\n json: defaultJsonContentTypes,\n xml: defaultXmlContentTypes,\n },\n};\n/**\n * A RequestPolicy that will deserialize HTTP response bodies and headers as they pass through the\n * HTTP pipeline.\n */\nclass DeserializationPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, requestPolicyOptions, deserializationContentTypes, parsingOptions = {}) {\n var _a;\n super(nextPolicy, requestPolicyOptions);\n this.jsonContentTypes =\n (deserializationContentTypes && deserializationContentTypes.json) || defaultJsonContentTypes;\n this.xmlContentTypes =\n (deserializationContentTypes && deserializationContentTypes.xml) || defaultXmlContentTypes;\n this.xmlCharKey = (_a = parsingOptions.xmlCharKey) !== null && _a !== void 0 ? _a : XML_CHARKEY;\n }\n async sendRequest(request) {\n return this._nextPolicy.sendRequest(request).then((response) => deserializeResponseBody(this.jsonContentTypes, this.xmlContentTypes, response, {\n xmlCharKey: this.xmlCharKey,\n }));\n }\n}\nfunction getOperationResponse(parsedResponse) {\n let result;\n const request = parsedResponse.request;\n const operationSpec = request.operationSpec;\n if (operationSpec) {\n const operationResponseGetter = request.operationResponseGetter;\n if (!operationResponseGetter) {\n result = operationSpec.responses[parsedResponse.status];\n }\n else {\n result = operationResponseGetter(operationSpec, parsedResponse);\n }\n }\n return result;\n}\nfunction shouldDeserializeResponse(parsedResponse) {\n const shouldDeserialize = parsedResponse.request.shouldDeserialize;\n let result;\n if (shouldDeserialize === undefined) {\n result = true;\n }\n else if (typeof shouldDeserialize === "boolean") {\n result = shouldDeserialize;\n }\n else {\n result = shouldDeserialize(parsedResponse);\n }\n return result;\n}\n/**\n * Given a particular set of content types to parse as either JSON or XML, consumes the HTTP response to produce the result object defined by the request\'s {@link OperationSpec}.\n * @param jsonContentTypes - Response content types to parse the body as JSON.\n * @param xmlContentTypes - Response content types to parse the body as XML.\n * @param response - HTTP Response from the pipeline.\n * @param options - Options to the serializer, mostly for configuring the XML parser if needed.\n * @returns A parsed {@link HttpOperationResponse} object that can be returned by the {@link ServiceClient}.\n */\nfunction deserializeResponseBody(jsonContentTypes, xmlContentTypes, response, options = {}) {\n var _a, _b, _c;\n const updatedOptions = {\n rootName: (_a = options.rootName) !== null && _a !== void 0 ? _a : "",\n includeRoot: (_b = options.includeRoot) !== null && _b !== void 0 ? _b : false,\n xmlCharKey: (_c = options.xmlCharKey) !== null && _c !== void 0 ? _c : XML_CHARKEY,\n };\n return parse(jsonContentTypes, xmlContentTypes, response, updatedOptions).then((parsedResponse) => {\n if (!shouldDeserializeResponse(parsedResponse)) {\n return parsedResponse;\n }\n const operationSpec = parsedResponse.request.operationSpec;\n if (!operationSpec || !operationSpec.responses) {\n return parsedResponse;\n }\n const responseSpec = getOperationResponse(parsedResponse);\n const { error, shouldReturnResponse } = handleErrorResponse(parsedResponse, operationSpec, responseSpec);\n if (error) {\n throw error;\n }\n else if (shouldReturnResponse) {\n return parsedResponse;\n }\n // An operation response spec does exist for current status code, so\n // use it to deserialize the response.\n if (responseSpec) {\n if (responseSpec.bodyMapper) {\n let valueToDeserialize = parsedResponse.parsedBody;\n if (operationSpec.isXML && responseSpec.bodyMapper.type.name === MapperType.Sequence) {\n valueToDeserialize =\n typeof valueToDeserialize === "object"\n ? valueToDeserialize[responseSpec.bodyMapper.xmlElementName]\n : [];\n }\n try {\n parsedResponse.parsedBody = operationSpec.serializer.deserialize(responseSpec.bodyMapper, valueToDeserialize, "operationRes.parsedBody", options);\n }\n catch (innerError) {\n const restError = new RestError(`Error ${innerError} occurred in deserializing the responseBody - ${parsedResponse.bodyAsText}`, undefined, parsedResponse.status, parsedResponse.request, parsedResponse);\n throw restError;\n }\n }\n else if (operationSpec.httpMethod === "HEAD") {\n // head methods never have a body, but we return a boolean to indicate presence/absence of the resource\n parsedResponse.parsedBody = response.status >= 200 && response.status < 300;\n }\n if (responseSpec.headersMapper) {\n parsedResponse.parsedHeaders = operationSpec.serializer.deserialize(responseSpec.headersMapper, parsedResponse.headers.toJson(), "operationRes.parsedHeaders", options);\n }\n }\n return parsedResponse;\n });\n}\nfunction isOperationSpecEmpty(operationSpec) {\n const expectedStatusCodes = Object.keys(operationSpec.responses);\n return (expectedStatusCodes.length === 0 ||\n (expectedStatusCodes.length === 1 && expectedStatusCodes[0] === "default"));\n}\nfunction handleErrorResponse(parsedResponse, operationSpec, responseSpec) {\n var _a;\n const isSuccessByStatus = 200 <= parsedResponse.status && parsedResponse.status < 300;\n const isExpectedStatusCode = isOperationSpecEmpty(operationSpec)\n ? isSuccessByStatus\n : !!responseSpec;\n if (isExpectedStatusCode) {\n if (responseSpec) {\n if (!responseSpec.isError) {\n return { error: null, shouldReturnResponse: false };\n }\n }\n else {\n return { error: null, shouldReturnResponse: false };\n }\n }\n const errorResponseSpec = responseSpec !== null && responseSpec !== void 0 ? responseSpec : operationSpec.responses.default;\n const streaming = ((_a = parsedResponse.request.streamResponseStatusCodes) === null || _a === void 0 ? void 0 : _a.has(parsedResponse.status)) ||\n parsedResponse.request.streamResponseBody;\n const initialErrorMessage = streaming\n ? `Unexpected status code: ${parsedResponse.status}`\n : parsedResponse.bodyAsText;\n const error = new RestError(initialErrorMessage, undefined, parsedResponse.status, parsedResponse.request, parsedResponse);\n // If the item failed but there\'s no error spec or default spec to deserialize the error,\n // we should fail so we just throw the parsed response\n if (!errorResponseSpec) {\n throw error;\n }\n const defaultBodyMapper = errorResponseSpec.bodyMapper;\n const defaultHeadersMapper = errorResponseSpec.headersMapper;\n try {\n // If error response has a body, try to deserialize it using default body mapper.\n // Then try to extract error code & message from it\n if (parsedResponse.parsedBody) {\n const parsedBody = parsedResponse.parsedBody;\n let parsedError;\n if (defaultBodyMapper) {\n let valueToDeserialize = parsedBody;\n if (operationSpec.isXML && defaultBodyMapper.type.name === MapperType.Sequence) {\n valueToDeserialize =\n typeof parsedBody === "object" ? parsedBody[defaultBodyMapper.xmlElementName] : [];\n }\n parsedError = operationSpec.serializer.deserialize(defaultBodyMapper, valueToDeserialize, "error.response.parsedBody");\n }\n const internalError = parsedBody.error || parsedError || parsedBody;\n error.code = internalError.code;\n if (internalError.message) {\n error.message = internalError.message;\n }\n if (defaultBodyMapper) {\n error.response.parsedBody = parsedError;\n }\n }\n // If error response has headers, try to deserialize it using default header mapper\n if (parsedResponse.headers && defaultHeadersMapper) {\n error.response.parsedHeaders = operationSpec.serializer.deserialize(defaultHeadersMapper, parsedResponse.headers.toJson(), "operationRes.parsedHeaders");\n }\n }\n catch (defaultError) {\n error.message = `Error "${defaultError.message}" occurred in deserializing the responseBody - "${parsedResponse.bodyAsText}" for the default response.`;\n }\n return { error, shouldReturnResponse: false };\n}\nfunction parse(jsonContentTypes, xmlContentTypes, operationResponse, opts) {\n var _a;\n const errorHandler = (err) => {\n const msg = `Error "${err}" occurred while parsing the response body - ${operationResponse.bodyAsText}.`;\n const errCode = err.code || RestError.PARSE_ERROR;\n const e = new RestError(msg, errCode, operationResponse.status, operationResponse.request, operationResponse);\n return Promise.reject(e);\n };\n const streaming = ((_a = operationResponse.request.streamResponseStatusCodes) === null || _a === void 0 ? void 0 : _a.has(operationResponse.status)) ||\n operationResponse.request.streamResponseBody;\n if (!streaming && operationResponse.bodyAsText) {\n const text = operationResponse.bodyAsText;\n const contentType = operationResponse.headers.get("Content-Type") || "";\n const contentComponents = !contentType\n ? []\n : contentType.split(";").map((component) => component.toLowerCase());\n if (contentComponents.length === 0 ||\n contentComponents.some((component) => jsonContentTypes.indexOf(component) !== -1)) {\n return new Promise((resolve) => {\n operationResponse.parsedBody = JSON.parse(text);\n resolve(operationResponse);\n }).catch(errorHandler);\n }\n else if (contentComponents.some((component) => xmlContentTypes.indexOf(component) !== -1)) {\n return parseXML(text, opts)\n .then((body) => {\n operationResponse.parsedBody = body;\n return operationResponse;\n })\n .catch(errorHandler);\n }\n }\n return Promise.resolve(operationResponse);\n}\n//# sourceMappingURL=deserializationPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/logPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n/**\n * Creates a policy that logs information about the outgoing request and the incoming responses.\n * @param loggingOptions - Logging options.\n * @returns An instance of the {@link LogPolicy}\n */\nfunction logPolicy_logPolicy(loggingOptions = {}) {\n return {\n create: (nextPolicy, options) => {\n return new LogPolicy(nextPolicy, options, loggingOptions);\n },\n };\n}\n/**\n * A policy that logs information about the outgoing request and the incoming responses.\n */\nclass LogPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options, { logger = log_logger.info, allowedHeaderNames = [], allowedQueryParameters = [], } = {}) {\n super(nextPolicy, options);\n this.logger = logger;\n this.sanitizer = new Sanitizer({ allowedHeaderNames, allowedQueryParameters });\n }\n /**\n * Header names whose values will be logged when logging is enabled. Defaults to\n * Date, traceparent, x-ms-client-request-id, and x-ms-request id. Any headers\n * specified in this field will be added to that list. Any other values will\n * be written to logs as "REDACTED".\n * @deprecated Pass these into the constructor instead.\n */\n get allowedHeaderNames() {\n return this.sanitizer.allowedHeaderNames;\n }\n /**\n * Header names whose values will be logged when logging is enabled. Defaults to\n * Date, traceparent, x-ms-client-request-id, and x-ms-request id. Any headers\n * specified in this field will be added to that list. Any other values will\n * be written to logs as "REDACTED".\n * @deprecated Pass these into the constructor instead.\n */\n set allowedHeaderNames(allowedHeaderNames) {\n this.sanitizer.allowedHeaderNames = allowedHeaderNames;\n }\n /**\n * Query string names whose values will be logged when logging is enabled. By default no\n * query string values are logged.\n * @deprecated Pass these into the constructor instead.\n */\n get allowedQueryParameters() {\n return this.sanitizer.allowedQueryParameters;\n }\n /**\n * Query string names whose values will be logged when logging is enabled. By default no\n * query string values are logged.\n * @deprecated Pass these into the constructor instead.\n */\n set allowedQueryParameters(allowedQueryParameters) {\n this.sanitizer.allowedQueryParameters = allowedQueryParameters;\n }\n sendRequest(request) {\n if (!this.logger.enabled)\n return this._nextPolicy.sendRequest(request);\n this.logRequest(request);\n return this._nextPolicy.sendRequest(request).then((response) => this.logResponse(response));\n }\n logRequest(request) {\n this.logger(`Request: ${this.sanitizer.sanitize(request)}`);\n }\n logResponse(response) {\n this.logger(`Response status code: ${response.status}`);\n this.logger(`Headers: ${this.sanitizer.sanitize(response.headers)}`);\n return response;\n }\n}\n//# sourceMappingURL=logPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/disableResponseDecompressionPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Returns a request policy factory that can be used to create an instance of\n * {@link DisableResponseDecompressionPolicy}.\n */\nfunction disableResponseDecompressionPolicy_disableResponseDecompressionPolicy() {\n return {\n create: (nextPolicy, options) => {\n return new DisableResponseDecompressionPolicy(nextPolicy, options);\n },\n };\n}\n/**\n * A policy to disable response decompression according to Accept-Encoding header\n * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding\n */\nclass DisableResponseDecompressionPolicy extends BaseRequestPolicy {\n /**\n * Creates an instance of DisableResponseDecompressionPolicy.\n *\n * @param nextPolicy -\n * @param options -\n */\n // The parent constructor is protected.\n /* eslint-disable-next-line @typescript-eslint/no-useless-constructor */\n constructor(nextPolicy, options) {\n super(nextPolicy, options);\n }\n /**\n * Sends out request.\n *\n * @param request -\n * @returns\n */\n async sendRequest(request) {\n request.decompressResponse = false;\n return this._nextPolicy.sendRequest(request);\n }\n}\n//# sourceMappingURL=disableResponseDecompressionPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/httpHeaders.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * A collection of HttpHeaders that can be sent with a HTTP request.\n */\nfunction getHeaderKey(headerName) {\n return headerName.toLowerCase();\n}\nfunction isHttpHeadersLike(object) {\n if (object && typeof object === "object") {\n const castObject = object;\n if (typeof castObject.rawHeaders === "function" &&\n typeof castObject.clone === "function" &&\n typeof castObject.get === "function" &&\n typeof castObject.set === "function" &&\n typeof castObject.contains === "function" &&\n typeof castObject.remove === "function" &&\n typeof castObject.headersArray === "function" &&\n typeof castObject.headerValues === "function" &&\n typeof castObject.headerNames === "function" &&\n typeof castObject.toJson === "function") {\n return true;\n }\n }\n return false;\n}\n/**\n * A collection of HTTP header key/value pairs.\n */\nclass httpHeaders_HttpHeaders {\n constructor(rawHeaders) {\n this._headersMap = {};\n if (rawHeaders) {\n for (const headerName in rawHeaders) {\n this.set(headerName, rawHeaders[headerName]);\n }\n }\n }\n /**\n * Set a header in this collection with the provided name and value. The name is\n * case-insensitive.\n * @param headerName - The name of the header to set. This value is case-insensitive.\n * @param headerValue - The value of the header to set.\n */\n set(headerName, headerValue) {\n this._headersMap[getHeaderKey(headerName)] = {\n name: headerName,\n value: headerValue.toString().trim(),\n };\n }\n /**\n * Get the header value for the provided header name, or undefined if no header exists in this\n * collection with the provided name.\n * @param headerName - The name of the header.\n */\n get(headerName) {\n const header = this._headersMap[getHeaderKey(headerName)];\n return !header ? undefined : header.value;\n }\n /**\n * Get whether or not this header collection contains a header entry for the provided header name.\n */\n contains(headerName) {\n return !!this._headersMap[getHeaderKey(headerName)];\n }\n /**\n * Remove the header with the provided headerName. Return whether or not the header existed and\n * was removed.\n * @param headerName - The name of the header to remove.\n */\n remove(headerName) {\n const result = this.contains(headerName);\n delete this._headersMap[getHeaderKey(headerName)];\n return result;\n }\n /**\n * Get the headers that are contained this collection as an object.\n */\n rawHeaders() {\n return this.toJson({ preserveCase: true });\n }\n /**\n * Get the headers that are contained in this collection as an array.\n */\n headersArray() {\n const headers = [];\n for (const headerKey in this._headersMap) {\n headers.push(this._headersMap[headerKey]);\n }\n return headers;\n }\n /**\n * Get the header names that are contained in this collection.\n */\n headerNames() {\n const headerNames = [];\n const headers = this.headersArray();\n for (let i = 0; i < headers.length; ++i) {\n headerNames.push(headers[i].name);\n }\n return headerNames;\n }\n /**\n * Get the header values that are contained in this collection.\n */\n headerValues() {\n const headerValues = [];\n const headers = this.headersArray();\n for (let i = 0; i < headers.length; ++i) {\n headerValues.push(headers[i].value);\n }\n return headerValues;\n }\n /**\n * Get the JSON object representation of this HTTP header collection.\n */\n toJson(options = {}) {\n const result = {};\n if (options.preserveCase) {\n for (const headerKey in this._headersMap) {\n const header = this._headersMap[headerKey];\n result[header.name] = header.value;\n }\n }\n else {\n for (const headerKey in this._headersMap) {\n const header = this._headersMap[headerKey];\n result[getHeaderKey(header.name)] = header.value;\n }\n }\n return result;\n }\n /**\n * Get the string representation of this HTTP header collection.\n */\n toString() {\n return JSON.stringify(this.toJson({ preserveCase: true }));\n }\n /**\n * Create a deep clone/copy of this HttpHeaders collection.\n */\n clone() {\n const resultPreservingCasing = {};\n for (const headerKey in this._headersMap) {\n const header = this._headersMap[headerKey];\n resultPreservingCasing[header.name] = header.value;\n }\n return new httpHeaders_HttpHeaders(resultPreservingCasing);\n }\n}\n//# sourceMappingURL=httpHeaders.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/webResource.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\nfunction isWebResourceLike(object) {\n if (object && typeof object === "object") {\n const castObject = object;\n if (typeof castObject.url === "string" &&\n typeof castObject.method === "string" &&\n typeof castObject.headers === "object" &&\n isHttpHeadersLike(castObject.headers) &&\n typeof castObject.validateRequestProperties === "function" &&\n typeof castObject.prepare === "function" &&\n typeof castObject.clone === "function") {\n return true;\n }\n }\n return false;\n}\n/**\n * Creates a new WebResource object.\n *\n * This class provides an abstraction over a REST call by being library / implementation agnostic and wrapping the necessary\n * properties to initiate a request.\n */\nclass WebResource {\n constructor(url, method, body, query, headers, streamResponseBody, withCredentials, abortSignal, timeout, onUploadProgress, onDownloadProgress, proxySettings, keepAlive, decompressResponse, streamResponseStatusCodes) {\n this.streamResponseBody = streamResponseBody;\n this.streamResponseStatusCodes = streamResponseStatusCodes;\n this.url = url || "";\n this.method = method || "GET";\n this.headers = isHttpHeadersLike(headers) ? headers : new httpHeaders_HttpHeaders(headers);\n this.body = body;\n this.query = query;\n this.formData = undefined;\n this.withCredentials = withCredentials || false;\n this.abortSignal = abortSignal;\n this.timeout = timeout || 0;\n this.onUploadProgress = onUploadProgress;\n this.onDownloadProgress = onDownloadProgress;\n this.proxySettings = proxySettings;\n this.keepAlive = keepAlive;\n this.decompressResponse = decompressResponse;\n this.requestId = this.headers.get("x-ms-client-request-id") || generateUuid();\n }\n /**\n * Validates that the required properties such as method, url, headers["Content-Type"],\n * headers["accept-language"] are defined. It will throw an error if one of the above\n * mentioned properties are not defined.\n */\n validateRequestProperties() {\n if (!this.method) {\n throw new Error("WebResource.method is required.");\n }\n if (!this.url) {\n throw new Error("WebResource.url is required.");\n }\n }\n /**\n * Prepares the request.\n * @param options - Options to provide for preparing the request.\n * @returns Returns the prepared WebResource (HTTP Request) object that needs to be given to the request pipeline.\n */\n prepare(options) {\n if (!options) {\n throw new Error("options object is required");\n }\n if (options.method === undefined ||\n options.method === null ||\n typeof options.method.valueOf() !== "string") {\n throw new Error("options.method must be a string.");\n }\n if (options.url && options.pathTemplate) {\n throw new Error("options.url and options.pathTemplate are mutually exclusive. Please provide exactly one of them.");\n }\n if ((options.pathTemplate === undefined ||\n options.pathTemplate === null ||\n typeof options.pathTemplate.valueOf() !== "string") &&\n (options.url === undefined ||\n options.url === null ||\n typeof options.url.valueOf() !== "string")) {\n throw new Error("Please provide exactly one of options.pathTemplate or options.url.");\n }\n // set the url if it is provided.\n if (options.url) {\n if (typeof options.url !== "string") {\n throw new Error(\'options.url must be of type "string".\');\n }\n this.url = options.url;\n }\n // set the method\n if (options.method) {\n const validMethods = ["GET", "PUT", "HEAD", "DELETE", "OPTIONS", "POST", "PATCH", "TRACE"];\n if (validMethods.indexOf(options.method.toUpperCase()) === -1) {\n throw new Error(\'The provided method "\' +\n options.method +\n \'" is invalid. Supported HTTP methods are: \' +\n JSON.stringify(validMethods));\n }\n }\n this.method = options.method.toUpperCase();\n // construct the url if path template is provided\n if (options.pathTemplate) {\n const { pathTemplate, pathParameters } = options;\n if (typeof pathTemplate !== "string") {\n throw new Error(\'options.pathTemplate must be of type "string".\');\n }\n if (!options.baseUrl) {\n options.baseUrl = "https://management.azure.com";\n }\n const baseUrl = options.baseUrl;\n let url = baseUrl +\n (baseUrl.endsWith("/") ? "" : "/") +\n (pathTemplate.startsWith("/") ? pathTemplate.slice(1) : pathTemplate);\n const segments = url.match(/({[\\w-]*\\s*[\\w-]*})/gi);\n if (segments && segments.length) {\n if (!pathParameters) {\n throw new Error(`pathTemplate: ${pathTemplate} has been provided. Hence, options.pathParameters must also be provided.`);\n }\n segments.forEach(function (item) {\n const pathParamName = item.slice(1, -1);\n const pathParam = pathParameters[pathParamName];\n if (pathParam === null ||\n pathParam === undefined ||\n !(typeof pathParam === "string" || typeof pathParam === "object")) {\n const stringifiedPathParameters = JSON.stringify(pathParameters, undefined, 2);\n throw new Error(`pathTemplate: ${pathTemplate} contains the path parameter ${pathParamName}` +\n ` however, it is not present in parameters: ${stringifiedPathParameters}.` +\n `The value of the path parameter can either be a "string" of the form { ${pathParamName}: "some sample value" } or ` +\n `it can be an "object" of the form { "${pathParamName}": { value: "some sample value", skipUrlEncoding: true } }.`);\n }\n if (typeof pathParam.valueOf() === "string") {\n url = url.replace(item, encodeURIComponent(pathParam));\n }\n if (typeof pathParam.valueOf() === "object") {\n if (!pathParam.value) {\n throw new Error(`options.pathParameters[${pathParamName}] is of type "object" but it does not contain a "value" property.`);\n }\n if (pathParam.skipUrlEncoding) {\n url = url.replace(item, pathParam.value);\n }\n else {\n url = url.replace(item, encodeURIComponent(pathParam.value));\n }\n }\n });\n }\n this.url = url;\n }\n // append query parameters to the url if they are provided. They can be provided with pathTemplate or url option.\n if (options.queryParameters) {\n const queryParameters = options.queryParameters;\n if (typeof queryParameters !== "object") {\n throw new Error(`options.queryParameters must be of type object. It should be a JSON object ` +\n `of "query-parameter-name" as the key and the "query-parameter-value" as the value. ` +\n `The "query-parameter-value" may be fo type "string" or an "object" of the form { value: "query-parameter-value", skipUrlEncoding: true }.`);\n }\n // append question mark if it is not present in the url\n if (this.url && this.url.indexOf("?") === -1) {\n this.url += "?";\n }\n // construct queryString\n const queryParams = [];\n // We need to populate this.query as a dictionary if the request is being used for Sway\'s validateRequest().\n this.query = {};\n for (const queryParamName in queryParameters) {\n const queryParam = queryParameters[queryParamName];\n if (queryParam) {\n if (typeof queryParam === "string") {\n queryParams.push(queryParamName + "=" + encodeURIComponent(queryParam));\n this.query[queryParamName] = encodeURIComponent(queryParam);\n }\n else if (typeof queryParam === "object") {\n if (!queryParam.value) {\n throw new Error(`options.queryParameters[${queryParamName}] is of type "object" but it does not contain a "value" property.`);\n }\n if (queryParam.skipUrlEncoding) {\n queryParams.push(queryParamName + "=" + queryParam.value);\n this.query[queryParamName] = queryParam.value;\n }\n else {\n queryParams.push(queryParamName + "=" + encodeURIComponent(queryParam.value));\n this.query[queryParamName] = encodeURIComponent(queryParam.value);\n }\n }\n }\n } // end-of-for\n // append the queryString\n this.url += queryParams.join("&");\n }\n // add headers to the request if they are provided\n if (options.headers) {\n const headers = options.headers;\n for (const headerName of Object.keys(options.headers)) {\n this.headers.set(headerName, headers[headerName]);\n }\n }\n // ensure accept-language is set correctly\n if (!this.headers.get("accept-language")) {\n this.headers.set("accept-language", "en-US");\n }\n // ensure the request-id is set correctly\n if (!this.headers.get("x-ms-client-request-id") && !options.disableClientRequestId) {\n this.headers.set("x-ms-client-request-id", this.requestId);\n }\n // default\n if (!this.headers.get("Content-Type")) {\n this.headers.set("Content-Type", "application/json; charset=utf-8");\n }\n // set the request body. request.js automatically sets the Content-Length request header, so we need not set it explicitly\n this.body = options.body;\n if (options.body !== undefined && options.body !== null) {\n // body as a stream special case. set the body as-is and check for some special request headers specific to sending a stream.\n if (options.bodyIsStream) {\n if (!this.headers.get("Transfer-Encoding")) {\n this.headers.set("Transfer-Encoding", "chunked");\n }\n if (this.headers.get("Content-Type") !== "application/octet-stream") {\n this.headers.set("Content-Type", "application/octet-stream");\n }\n }\n else {\n if (options.serializationMapper) {\n this.body = new Serializer(options.mappers).serialize(options.serializationMapper, options.body, "requestBody");\n }\n if (!options.disableJsonStringifyOnBody) {\n this.body = JSON.stringify(options.body);\n }\n }\n }\n if (options.spanOptions) {\n this.spanOptions = options.spanOptions;\n }\n if (options.tracingContext) {\n this.tracingContext = options.tracingContext;\n }\n this.abortSignal = options.abortSignal;\n this.onDownloadProgress = options.onDownloadProgress;\n this.onUploadProgress = options.onUploadProgress;\n return this;\n }\n /**\n * Clone this WebResource HTTP request object.\n * @returns The clone of this WebResource HTTP request object.\n */\n clone() {\n const result = new WebResource(this.url, this.method, this.body, this.query, this.headers && this.headers.clone(), this.streamResponseBody, this.withCredentials, this.abortSignal, this.timeout, this.onUploadProgress, this.onDownloadProgress, this.proxySettings, this.keepAlive, this.decompressResponse, this.streamResponseStatusCodes);\n if (this.formData) {\n result.formData = this.formData;\n }\n if (this.operationSpec) {\n result.operationSpec = this.operationSpec;\n }\n if (this.shouldDeserialize) {\n result.shouldDeserialize = this.shouldDeserialize;\n }\n if (this.operationResponseGetter) {\n result.operationResponseGetter = this.operationResponseGetter;\n }\n return result;\n }\n}\n//# sourceMappingURL=webResource.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/log.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * The `@azure/logger` configuration for this package.\n */\nconst logger = createClientLogger("storage-blob");\n//# sourceMappingURL=log.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/utils/constants.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nconst SDK_VERSION = "12.17.0";\nconst SERVICE_VERSION = "2023-11-03";\nconst BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES = 256 * 1024 * 1024; // 256MB\nconst BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES = 4000 * 1024 * 1024; // 4000MB\nconst BLOCK_BLOB_MAX_BLOCKS = 50000;\nconst DEFAULT_BLOCK_BUFFER_SIZE_BYTES = 8 * 1024 * 1024; // 8MB\nconst DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES = 4 * 1024 * 1024; // 4MB\nconst DEFAULT_MAX_DOWNLOAD_RETRY_REQUESTS = 5;\nconst REQUEST_TIMEOUT = 100 * 1000; // In ms\n/**\n * The OAuth scope to use with Azure Storage.\n */\nconst StorageOAuthScopes = "https://storage.azure.com/.default";\nconst constants_URLConstants = {\n Parameters: {\n FORCE_BROWSER_NO_CACHE: "_",\n SIGNATURE: "sig",\n SNAPSHOT: "snapshot",\n VERSIONID: "versionid",\n TIMEOUT: "timeout",\n },\n};\nconst HTTPURLConnection = {\n HTTP_ACCEPTED: 202,\n HTTP_CONFLICT: 409,\n HTTP_NOT_FOUND: 404,\n HTTP_PRECON_FAILED: 412,\n HTTP_RANGE_NOT_SATISFIABLE: 416,\n};\nconst constants_HeaderConstants = {\n AUTHORIZATION: "Authorization",\n AUTHORIZATION_SCHEME: "Bearer",\n CONTENT_ENCODING: "Content-Encoding",\n CONTENT_ID: "Content-ID",\n CONTENT_LANGUAGE: "Content-Language",\n CONTENT_LENGTH: "Content-Length",\n CONTENT_MD5: "Content-Md5",\n CONTENT_TRANSFER_ENCODING: "Content-Transfer-Encoding",\n CONTENT_TYPE: "Content-Type",\n COOKIE: "Cookie",\n DATE: "date",\n IF_MATCH: "if-match",\n IF_MODIFIED_SINCE: "if-modified-since",\n IF_NONE_MATCH: "if-none-match",\n IF_UNMODIFIED_SINCE: "if-unmodified-since",\n PREFIX_FOR_STORAGE: "x-ms-",\n RANGE: "Range",\n USER_AGENT: "User-Agent",\n X_MS_CLIENT_REQUEST_ID: "x-ms-client-request-id",\n X_MS_COPY_SOURCE: "x-ms-copy-source",\n X_MS_DATE: "x-ms-date",\n X_MS_ERROR_CODE: "x-ms-error-code",\n X_MS_VERSION: "x-ms-version",\n};\nconst ETagNone = "";\nconst ETagAny = "*";\nconst SIZE_1_MB = 1 * 1024 * 1024;\nconst BATCH_MAX_REQUEST = 256;\nconst BATCH_MAX_PAYLOAD_IN_BYTES = 4 * SIZE_1_MB;\nconst HTTP_LINE_ENDING = "\\r\\n";\nconst HTTP_VERSION_1_1 = "HTTP/1.1";\nconst EncryptionAlgorithmAES25 = "AES256";\nconst DevelopmentConnectionString = `DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;`;\nconst StorageBlobLoggingAllowedHeaderNames = [\n "Access-Control-Allow-Origin",\n "Cache-Control",\n "Content-Length",\n "Content-Type",\n "Date",\n "Request-Id",\n "traceparent",\n "Transfer-Encoding",\n "User-Agent",\n "x-ms-client-request-id",\n "x-ms-date",\n "x-ms-error-code",\n "x-ms-request-id",\n "x-ms-return-client-request-id",\n "x-ms-version",\n "Accept-Ranges",\n "Content-Disposition",\n "Content-Encoding",\n "Content-Language",\n "Content-MD5",\n "Content-Range",\n "ETag",\n "Last-Modified",\n "Server",\n "Vary",\n "x-ms-content-crc64",\n "x-ms-copy-action",\n "x-ms-copy-completion-time",\n "x-ms-copy-id",\n "x-ms-copy-progress",\n "x-ms-copy-status",\n "x-ms-has-immutability-policy",\n "x-ms-has-legal-hold",\n "x-ms-lease-state",\n "x-ms-lease-status",\n "x-ms-range",\n "x-ms-request-server-encrypted",\n "x-ms-server-encrypted",\n "x-ms-snapshot",\n "x-ms-source-range",\n "If-Match",\n "If-Modified-Since",\n "If-None-Match",\n "If-Unmodified-Since",\n "x-ms-access-tier",\n "x-ms-access-tier-change-time",\n "x-ms-access-tier-inferred",\n "x-ms-account-kind",\n "x-ms-archive-status",\n "x-ms-blob-append-offset",\n "x-ms-blob-cache-control",\n "x-ms-blob-committed-block-count",\n "x-ms-blob-condition-appendpos",\n "x-ms-blob-condition-maxsize",\n "x-ms-blob-content-disposition",\n "x-ms-blob-content-encoding",\n "x-ms-blob-content-language",\n "x-ms-blob-content-length",\n "x-ms-blob-content-md5",\n "x-ms-blob-content-type",\n "x-ms-blob-public-access",\n "x-ms-blob-sequence-number",\n "x-ms-blob-type",\n "x-ms-copy-destination-snapshot",\n "x-ms-creation-time",\n "x-ms-default-encryption-scope",\n "x-ms-delete-snapshots",\n "x-ms-delete-type-permanent",\n "x-ms-deny-encryption-scope-override",\n "x-ms-encryption-algorithm",\n "x-ms-if-sequence-number-eq",\n "x-ms-if-sequence-number-le",\n "x-ms-if-sequence-number-lt",\n "x-ms-incremental-copy",\n "x-ms-lease-action",\n "x-ms-lease-break-period",\n "x-ms-lease-duration",\n "x-ms-lease-id",\n "x-ms-lease-time",\n "x-ms-page-write",\n "x-ms-proposed-lease-id",\n "x-ms-range-get-content-md5",\n "x-ms-rehydrate-priority",\n "x-ms-sequence-number-action",\n "x-ms-sku-name",\n "x-ms-source-content-md5",\n "x-ms-source-if-match",\n "x-ms-source-if-modified-since",\n "x-ms-source-if-none-match",\n "x-ms-source-if-unmodified-since",\n "x-ms-tag-count",\n "x-ms-encryption-key-sha256",\n "x-ms-if-tags",\n "x-ms-source-if-tags",\n];\nconst StorageBlobLoggingAllowedQueryParameters = [\n "comp",\n "maxresults",\n "rscc",\n "rscd",\n "rsce",\n "rscl",\n "rsct",\n "se",\n "si",\n "sip",\n "sp",\n "spr",\n "sr",\n "srt",\n "ss",\n "st",\n "sv",\n "include",\n "marker",\n "prefix",\n "copyid",\n "restype",\n "blockid",\n "blocklisttype",\n "delimiter",\n "prevsnapshot",\n "ske",\n "skoid",\n "sks",\n "skt",\n "sktid",\n "skv",\n "snapshot",\n];\nconst BlobUsesCustomerSpecifiedEncryptionMsg = "BlobUsesCustomerSpecifiedEncryption";\nconst BlobDoesNotUseCustomerSpecifiedEncryption = "BlobDoesNotUseCustomerSpecifiedEncryption";\n/// List of ports used for path style addressing.\n/// Path style addressing means that storage account is put in URI\'s Path segment in instead of in host.\nconst PathStylePorts = [\n "10000",\n "10001",\n "10002",\n "10003",\n "10004",\n "10100",\n "10101",\n "10102",\n "10103",\n "10104",\n "11000",\n "11001",\n "11002",\n "11003",\n "11004",\n "11100",\n "11101",\n "11102",\n "11103",\n "11104",\n];\n//# sourceMappingURL=constants.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/utils/utils.common.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * Reserved URL characters must be properly escaped for Storage services like Blob or File.\n *\n * ## URL encode and escape strategy for JS SDKs\n *\n * When customers pass a URL string into XxxClient classes constructor, the URL string may already be URL encoded or not.\n * But before sending to Azure Storage server, the URL must be encoded. However, it\'s hard for a SDK to guess whether the URL\n * string has been encoded or not. We have 2 potential strategies, and chose strategy two for the XxxClient constructors.\n *\n * ### Strategy One: Assume the customer URL string is not encoded, and always encode URL string in SDK.\n *\n * This is what legacy V2 SDK does, simple and works for most of the cases.\n * - When customer URL string is "http://account.blob.core.windows.net/con/b:",\n * SDK will encode it to "http://account.blob.core.windows.net/con/b%3A" and send to server. A blob named "b:" will be created.\n * - When customer URL string is "http://account.blob.core.windows.net/con/b%3A",\n * SDK will encode it to "http://account.blob.core.windows.net/con/b%253A" and send to server. A blob named "b%3A" will be created.\n *\n * But this strategy will make it not possible to create a blob with "?" in it\'s name. Because when customer URL string is\n * "http://account.blob.core.windows.net/con/blob?name", the "?name" will be treated as URL paramter instead of blob name.\n * If customer URL string is "http://account.blob.core.windows.net/con/blob%3Fname", a blob named "blob%3Fname" will be created.\n * V2 SDK doesn\'t have this issue because it doesn\'t allow customer pass in a full URL, it accepts a separate blob name and encodeURIComponent for it.\n * We cannot accept a SDK cannot create a blob name with "?". So we implement strategy two:\n *\n * ### Strategy Two: SDK doesn\'t assume the URL has been encoded or not. It will just escape the special characters.\n *\n * This is what V10 Blob Go SDK does. It accepts a URL type in Go, and call url.EscapedPath() to escape the special chars unescaped.\n * - When customer URL string is "http://account.blob.core.windows.net/con/b:",\n * SDK will escape ":" like "http://account.blob.core.windows.net/con/b%3A" and send to server. A blob named "b:" will be created.\n * - When customer URL string is "http://account.blob.core.windows.net/con/b%3A",\n * There is no special characters, so send "http://account.blob.core.windows.net/con/b%3A" to server. A blob named "b:" will be created.\n * - When customer URL string is "http://account.blob.core.windows.net/con/b%253A",\n * There is no special characters, so send "http://account.blob.core.windows.net/con/b%253A" to server. A blob named "b%3A" will be created.\n *\n * This strategy gives us flexibility to create with any special characters. But "%" will be treated as a special characters, if the URL string\n * is not encoded, there shouldn\'t a "%" in the URL string, otherwise the URL is not a valid URL.\n * If customer needs to create a blob with "%" in it\'s blob name, use "%25" instead of "%". Just like above 3rd sample.\n * And following URL strings are invalid:\n * - "http://account.blob.core.windows.net/con/b%"\n * - "http://account.blob.core.windows.net/con/b%2"\n * - "http://account.blob.core.windows.net/con/b%G"\n *\n * Another special character is "?", use "%2F" to represent a blob name with "?" in a URL string.\n *\n * ### Strategy for containerName, blobName or other specific XXXName parameters in methods such as `containerClient.getBlobClient(blobName)`\n *\n * We will apply strategy one, and call encodeURIComponent for these parameters like blobName. Because what customers passes in is a plain name instead of a URL.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-shares--directories--files--and-metadata\n *\n * @param url -\n */\nfunction escapeURLPath(url) {\n const urlParsed = URLBuilder.parse(url);\n let path = urlParsed.getPath();\n path = path || "/";\n path = utils_common_escape(path);\n urlParsed.setPath(path);\n return urlParsed.toString();\n}\nfunction getProxyUriFromDevConnString(connectionString) {\n // Development Connection String\n // https://docs.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string#connect-to-the-emulator-account-using-the-well-known-account-name-and-key\n let proxyUri = "";\n if (connectionString.search("DevelopmentStorageProxyUri=") !== -1) {\n // CONNECTION_STRING=UseDevelopmentStorage=true;DevelopmentStorageProxyUri=http://myProxyUri\n const matchCredentials = connectionString.split(";");\n for (const element of matchCredentials) {\n if (element.trim().startsWith("DevelopmentStorageProxyUri=")) {\n proxyUri = element.trim().match("DevelopmentStorageProxyUri=(.*)")[1];\n }\n }\n }\n return proxyUri;\n}\nfunction getValueInConnString(connectionString, argument) {\n const elements = connectionString.split(";");\n for (const element of elements) {\n if (element.trim().startsWith(argument)) {\n return element.trim().match(argument + "=(.*)")[1];\n }\n }\n return "";\n}\n/**\n * Extracts the parts of an Azure Storage account connection string.\n *\n * @param connectionString - Connection string.\n * @returns String key value pairs of the storage account\'s url and credentials.\n */\nfunction extractConnectionStringParts(connectionString) {\n let proxyUri = "";\n if (connectionString.startsWith("UseDevelopmentStorage=true")) {\n // Development connection string\n proxyUri = getProxyUriFromDevConnString(connectionString);\n connectionString = DevelopmentConnectionString;\n }\n // Matching BlobEndpoint in the Account connection string\n let blobEndpoint = getValueInConnString(connectionString, "BlobEndpoint");\n // Slicing off \'/\' at the end if exists\n // (The methods that use `extractConnectionStringParts` expect the url to not have `/` at the end)\n blobEndpoint = blobEndpoint.endsWith("/") ? blobEndpoint.slice(0, -1) : blobEndpoint;\n if (connectionString.search("DefaultEndpointsProtocol=") !== -1 &&\n connectionString.search("AccountKey=") !== -1) {\n // Account connection string\n let defaultEndpointsProtocol = "";\n let accountName = "";\n let accountKey = Buffer.from("accountKey", "base64");\n let endpointSuffix = "";\n // Get account name and key\n accountName = getValueInConnString(connectionString, "AccountName");\n accountKey = Buffer.from(getValueInConnString(connectionString, "AccountKey"), "base64");\n if (!blobEndpoint) {\n // BlobEndpoint is not present in the Account connection string\n // Can be obtained from `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`\n defaultEndpointsProtocol = getValueInConnString(connectionString, "DefaultEndpointsProtocol");\n const protocol = defaultEndpointsProtocol.toLowerCase();\n if (protocol !== "https" && protocol !== "http") {\n throw new Error("Invalid DefaultEndpointsProtocol in the provided Connection String. Expecting \'https\' or \'http\'");\n }\n endpointSuffix = getValueInConnString(connectionString, "EndpointSuffix");\n if (!endpointSuffix) {\n throw new Error("Invalid EndpointSuffix in the provided Connection String");\n }\n blobEndpoint = `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`;\n }\n if (!accountName) {\n throw new Error("Invalid AccountName in the provided Connection String");\n }\n else if (accountKey.length === 0) {\n throw new Error("Invalid AccountKey in the provided Connection String");\n }\n return {\n kind: "AccountConnString",\n url: blobEndpoint,\n accountName,\n accountKey,\n proxyUri,\n };\n }\n else {\n // SAS connection string\n const accountSas = getValueInConnString(connectionString, "SharedAccessSignature");\n let accountName = getValueInConnString(connectionString, "AccountName");\n // if accountName is empty, try to read it from BlobEndpoint\n if (!accountName) {\n accountName = getAccountNameFromUrl(blobEndpoint);\n }\n if (!blobEndpoint) {\n throw new Error("Invalid BlobEndpoint in the provided SAS Connection String");\n }\n else if (!accountSas) {\n throw new Error("Invalid SharedAccessSignature in the provided SAS Connection String");\n }\n return { kind: "SASConnString", url: blobEndpoint, accountName, accountSas };\n }\n}\n/**\n * Internal escape method implemented Strategy Two mentioned in escapeURL() description.\n *\n * @param text -\n */\nfunction utils_common_escape(text) {\n return encodeURIComponent(text)\n .replace(/%2F/g, "/") // Don\'t escape for "/"\n .replace(/\'/g, "%27") // Escape for "\'"\n .replace(/\\+/g, "%20")\n .replace(/%25/g, "%"); // Revert encoded "%"\n}\n/**\n * Append a string to URL path. Will remove duplicated "/" in front of the string\n * when URL path ends with a "/".\n *\n * @param url - Source URL string\n * @param name - String to be appended to URL\n * @returns An updated URL string\n */\nfunction appendToURLPath(url, name) {\n const urlParsed = URLBuilder.parse(url);\n let path = urlParsed.getPath();\n path = path ? (path.endsWith("/") ? `${path}${name}` : `${path}/${name}`) : name;\n urlParsed.setPath(path);\n const normalizedUrl = new URL(urlParsed.toString());\n return normalizedUrl.toString();\n}\n/**\n * Set URL parameter name and value. If name exists in URL parameters, old value\n * will be replaced by name key. If not provide value, the parameter will be deleted.\n *\n * @param url - Source URL string\n * @param name - Parameter name\n * @param value - Parameter value\n * @returns An updated URL string\n */\nfunction setURLParameter(url, name, value) {\n const urlParsed = URLBuilder.parse(url);\n urlParsed.setQueryParameter(name, value);\n return urlParsed.toString();\n}\n/**\n * Get URL parameter by name.\n *\n * @param url -\n * @param name -\n */\nfunction getURLParameter(url, name) {\n const urlParsed = URLBuilder.parse(url);\n return urlParsed.getQueryParameterValue(name);\n}\n/**\n * Set URL host.\n *\n * @param url - Source URL string\n * @param host - New host string\n * @returns An updated URL string\n */\nfunction setURLHost(url, host) {\n const urlParsed = URLBuilder.parse(url);\n urlParsed.setHost(host);\n return urlParsed.toString();\n}\n/**\n * Get URL path from an URL string.\n *\n * @param url - Source URL string\n */\nfunction getURLPath(url) {\n const urlParsed = URLBuilder.parse(url);\n return urlParsed.getPath();\n}\n/**\n * Get URL scheme from an URL string.\n *\n * @param url - Source URL string\n */\nfunction getURLScheme(url) {\n const urlParsed = URLBuilder.parse(url);\n return urlParsed.getScheme();\n}\n/**\n * Get URL path and query from an URL string.\n *\n * @param url - Source URL string\n */\nfunction getURLPathAndQuery(url) {\n const urlParsed = URLBuilder.parse(url);\n const pathString = urlParsed.getPath();\n if (!pathString) {\n throw new RangeError("Invalid url without valid path.");\n }\n let queryString = urlParsed.getQuery() || "";\n queryString = queryString.trim();\n if (queryString !== "") {\n queryString = queryString.startsWith("?") ? queryString : `?${queryString}`; // Ensure query string start with \'?\'\n }\n return `${pathString}${queryString}`;\n}\n/**\n * Get URL query key value pairs from an URL string.\n *\n * @param url -\n */\nfunction getURLQueries(url) {\n let queryString = URLBuilder.parse(url).getQuery();\n if (!queryString) {\n return {};\n }\n queryString = queryString.trim();\n queryString = queryString.startsWith("?") ? queryString.substr(1) : queryString;\n let querySubStrings = queryString.split("&");\n querySubStrings = querySubStrings.filter((value) => {\n const indexOfEqual = value.indexOf("=");\n const lastIndexOfEqual = value.lastIndexOf("=");\n return (indexOfEqual > 0 && indexOfEqual === lastIndexOfEqual && lastIndexOfEqual < value.length - 1);\n });\n const queries = {};\n for (const querySubString of querySubStrings) {\n const splitResults = querySubString.split("=");\n const key = splitResults[0];\n const value = splitResults[1];\n queries[key] = value;\n }\n return queries;\n}\n/**\n * Append a string to URL query.\n *\n * @param url - Source URL string.\n * @param queryParts - String to be appended to the URL query.\n * @returns An updated URL string.\n */\nfunction appendToURLQuery(url, queryParts) {\n const urlParsed = URLBuilder.parse(url);\n let query = urlParsed.getQuery();\n if (query) {\n query += "&" + queryParts;\n }\n else {\n query = queryParts;\n }\n urlParsed.setQuery(query);\n return urlParsed.toString();\n}\n/**\n * Rounds a date off to seconds.\n *\n * @param date -\n * @param withMilliseconds - If true, YYYY-MM-DDThh:mm:ss.fffffffZ will be returned;\n * If false, YYYY-MM-DDThh:mm:ssZ will be returned.\n * @returns Date string in ISO8061 format, with or without 7 milliseconds component\n */\nfunction truncatedISO8061Date(date, withMilliseconds = true) {\n // Date.toISOString() will return like "2018-10-29T06:34:36.139Z"\n const dateString = date.toISOString();\n return withMilliseconds\n ? dateString.substring(0, dateString.length - 1) + "0000" + "Z"\n : dateString.substring(0, dateString.length - 5) + "Z";\n}\n/**\n * Base64 encode.\n *\n * @param content -\n */\nfunction base64encode(content) {\n return !checkEnvironment_isNode ? btoa(content) : Buffer.from(content).toString("base64");\n}\n/**\n * Base64 decode.\n *\n * @param encodedString -\n */\nfunction base64decode(encodedString) {\n return !isNode ? atob(encodedString) : Buffer.from(encodedString, "base64").toString();\n}\n/**\n * Generate a 64 bytes base64 block ID string.\n *\n * @param blockIndex -\n */\nfunction generateBlockID(blockIDPrefix, blockIndex) {\n // To generate a 64 bytes base64 string, source string should be 48\n const maxSourceStringLength = 48;\n // A blob can have a maximum of 100,000 uncommitted blocks at any given time\n const maxBlockIndexLength = 6;\n const maxAllowedBlockIDPrefixLength = maxSourceStringLength - maxBlockIndexLength;\n if (blockIDPrefix.length > maxAllowedBlockIDPrefixLength) {\n blockIDPrefix = blockIDPrefix.slice(0, maxAllowedBlockIDPrefixLength);\n }\n const res = blockIDPrefix +\n padStart(blockIndex.toString(), maxSourceStringLength - blockIDPrefix.length, "0");\n return base64encode(res);\n}\n/**\n * Delay specified time interval.\n *\n * @param timeInMs -\n * @param aborter -\n * @param abortError -\n */\nasync function delay(timeInMs, aborter, abortError) {\n return new Promise((resolve, reject) => {\n /* eslint-disable-next-line prefer-const */\n let timeout;\n const abortHandler = () => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n reject(abortError);\n };\n const resolveHandler = () => {\n if (aborter !== undefined) {\n aborter.removeEventListener("abort", abortHandler);\n }\n resolve();\n };\n timeout = setTimeout(resolveHandler, timeInMs);\n if (aborter !== undefined) {\n aborter.addEventListener("abort", abortHandler);\n }\n });\n}\n/**\n * String.prototype.padStart()\n *\n * @param currentString -\n * @param targetLength -\n * @param padString -\n */\nfunction padStart(currentString, targetLength, padString = " ") {\n // @ts-expect-error: TS doesn\'t know this code needs to run downlevel sometimes\n if (String.prototype.padStart) {\n return currentString.padStart(targetLength, padString);\n }\n padString = padString || " ";\n if (currentString.length > targetLength) {\n return currentString;\n }\n else {\n targetLength = targetLength - currentString.length;\n if (targetLength > padString.length) {\n padString += padString.repeat(targetLength / padString.length);\n }\n return padString.slice(0, targetLength) + currentString;\n }\n}\nfunction sanitizeURL(url) {\n let safeURL = url;\n if (getURLParameter(safeURL, URLConstants.Parameters.SIGNATURE)) {\n safeURL = setURLParameter(safeURL, URLConstants.Parameters.SIGNATURE, "*****");\n }\n return safeURL;\n}\nfunction sanitizeHeaders(originalHeader) {\n const headers = new HttpHeaders();\n for (const header of originalHeader.headersArray()) {\n if (header.name.toLowerCase() === HeaderConstants.AUTHORIZATION.toLowerCase()) {\n headers.set(header.name, "*****");\n }\n else if (header.name.toLowerCase() === HeaderConstants.X_MS_COPY_SOURCE) {\n headers.set(header.name, sanitizeURL(header.value));\n }\n else {\n headers.set(header.name, header.value);\n }\n }\n return headers;\n}\n/**\n * If two strings are equal when compared case insensitive.\n *\n * @param str1 -\n * @param str2 -\n */\nfunction iEqual(str1, str2) {\n return str1.toLocaleLowerCase() === str2.toLocaleLowerCase();\n}\n/**\n * Extracts account name from the url\n * @param url - url to extract the account name from\n * @returns with the account name\n */\nfunction getAccountNameFromUrl(url) {\n const parsedUrl = URLBuilder.parse(url);\n let accountName;\n try {\n if (parsedUrl.getHost().split(".")[1] === "blob") {\n // `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`;\n accountName = parsedUrl.getHost().split(".")[0];\n }\n else if (isIpEndpointStyle(parsedUrl)) {\n // IPv4/IPv6 address hosts... Example - http://192.0.0.10:10001/devstoreaccount1/\n // Single word domain without a [dot] in the endpoint... Example - http://localhost:10001/devstoreaccount1/\n // .getPath() -> /devstoreaccount1/\n accountName = parsedUrl.getPath().split("/")[1];\n }\n else {\n // Custom domain case: "https://customdomain.com/containername/blob".\n accountName = "";\n }\n return accountName;\n }\n catch (error) {\n throw new Error("Unable to extract accountName with provided information.");\n }\n}\nfunction isIpEndpointStyle(parsedUrl) {\n if (parsedUrl.getHost() === undefined) {\n return false;\n }\n const host = parsedUrl.getHost() + (parsedUrl.getPort() === undefined ? "" : ":" + parsedUrl.getPort());\n // Case 1: Ipv6, use a broad regex to find out candidates whose host contains two \':\'.\n // Case 2: localhost(:port) or host.docker.internal, use broad regex to match port part.\n // Case 3: Ipv4, use broad regex which just check if host contains Ipv4.\n // For valid host please refer to https://man7.org/linux/man-pages/man7/hostname.7.html.\n return (/^.*:.*:.*$|^(localhost|host.docker.internal)(:[0-9]+)?$|^(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])){3}(:[0-9]+)?$/.test(host) ||\n (parsedUrl.getPort() !== undefined && PathStylePorts.includes(parsedUrl.getPort())));\n}\n/**\n * Convert Tags to encoded string.\n *\n * @param tags -\n */\nfunction toBlobTagsString(tags) {\n if (tags === undefined) {\n return undefined;\n }\n const tagPairs = [];\n for (const key in tags) {\n if (Object.prototype.hasOwnProperty.call(tags, key)) {\n const value = tags[key];\n tagPairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n }\n }\n return tagPairs.join("&");\n}\n/**\n * Convert Tags type to BlobTags.\n *\n * @param tags -\n */\nfunction toBlobTags(tags) {\n if (tags === undefined) {\n return undefined;\n }\n const res = {\n blobTagSet: [],\n };\n for (const key in tags) {\n if (Object.prototype.hasOwnProperty.call(tags, key)) {\n const value = tags[key];\n res.blobTagSet.push({\n key,\n value,\n });\n }\n }\n return res;\n}\n/**\n * Covert BlobTags to Tags type.\n *\n * @param tags -\n */\nfunction toTags(tags) {\n if (tags === undefined) {\n return undefined;\n }\n const res = {};\n for (const blobTag of tags.blobTagSet) {\n res[blobTag.key] = blobTag.value;\n }\n return res;\n}\n/**\n * Convert BlobQueryTextConfiguration to QuerySerialization type.\n *\n * @param textConfiguration -\n */\nfunction toQuerySerialization(textConfiguration) {\n if (textConfiguration === undefined) {\n return undefined;\n }\n switch (textConfiguration.kind) {\n case "csv":\n return {\n format: {\n type: "delimited",\n delimitedTextConfiguration: {\n columnSeparator: textConfiguration.columnSeparator || ",",\n fieldQuote: textConfiguration.fieldQuote || "",\n recordSeparator: textConfiguration.recordSeparator,\n escapeChar: textConfiguration.escapeCharacter || "",\n headersPresent: textConfiguration.hasHeaders || false,\n },\n },\n };\n case "json":\n return {\n format: {\n type: "json",\n jsonTextConfiguration: {\n recordSeparator: textConfiguration.recordSeparator,\n },\n },\n };\n case "arrow":\n return {\n format: {\n type: "arrow",\n arrowConfiguration: {\n schema: textConfiguration.schema,\n },\n },\n };\n case "parquet":\n return {\n format: {\n type: "parquet",\n },\n };\n default:\n throw Error("Invalid BlobQueryTextConfiguration.");\n }\n}\nfunction parseObjectReplicationRecord(objectReplicationRecord) {\n if (!objectReplicationRecord) {\n return undefined;\n }\n if ("policy-id" in objectReplicationRecord) {\n // If the dictionary contains a key with policy id, we are not required to do any parsing since\n // the policy id should already be stored in the ObjectReplicationDestinationPolicyId.\n return undefined;\n }\n const orProperties = [];\n for (const key in objectReplicationRecord) {\n const ids = key.split("_");\n const policyPrefix = "or-";\n if (ids[0].startsWith(policyPrefix)) {\n ids[0] = ids[0].substring(policyPrefix.length);\n }\n const rule = {\n ruleId: ids[1],\n replicationStatus: objectReplicationRecord[key],\n };\n const policyIndex = orProperties.findIndex((policy) => policy.policyId === ids[0]);\n if (policyIndex > -1) {\n orProperties[policyIndex].rules.push(rule);\n }\n else {\n orProperties.push({\n policyId: ids[0],\n rules: [rule],\n });\n }\n }\n return orProperties;\n}\n/**\n * Attach a TokenCredential to an object.\n *\n * @param thing -\n * @param credential -\n */\nfunction attachCredential(thing, credential) {\n thing.credential = credential;\n return thing;\n}\nfunction httpAuthorizationToString(httpAuthorization) {\n return httpAuthorization ? httpAuthorization.scheme + " " + httpAuthorization.value : undefined;\n}\nfunction BlobNameToString(name) {\n if (name.encoded) {\n return decodeURIComponent(name.content);\n }\n else {\n return name.content;\n }\n}\nfunction ConvertInternalResponseOfListBlobFlat(internalResponse) {\n return Object.assign(Object.assign({}, internalResponse), { segment: {\n blobItems: internalResponse.segment.blobItems.map((blobItemInteral) => {\n const blobItem = Object.assign(Object.assign({}, blobItemInteral), { name: BlobNameToString(blobItemInteral.name) });\n return blobItem;\n }),\n } });\n}\nfunction ConvertInternalResponseOfListBlobHierarchy(internalResponse) {\n var _a;\n return Object.assign(Object.assign({}, internalResponse), { segment: {\n blobPrefixes: (_a = internalResponse.segment.blobPrefixes) === null || _a === void 0 ? void 0 : _a.map((blobPrefixInternal) => {\n const blobPrefix = Object.assign(Object.assign({}, blobPrefixInternal), { name: BlobNameToString(blobPrefixInternal.name) });\n return blobPrefix;\n }),\n blobItems: internalResponse.segment.blobItems.map((blobItemInteral) => {\n const blobItem = Object.assign(Object.assign({}, blobItemInteral), { name: BlobNameToString(blobItemInteral.name) });\n return blobItem;\n }),\n } });\n}\nfunction* ExtractPageRangeInfoItems(getPageRangesSegment) {\n let pageRange = [];\n let clearRange = [];\n if (getPageRangesSegment.pageRange)\n pageRange = getPageRangesSegment.pageRange;\n if (getPageRangesSegment.clearRange)\n clearRange = getPageRangesSegment.clearRange;\n let pageRangeIndex = 0;\n let clearRangeIndex = 0;\n while (pageRangeIndex < pageRange.length && clearRangeIndex < clearRange.length) {\n if (pageRange[pageRangeIndex].start < clearRange[clearRangeIndex].start) {\n yield {\n start: pageRange[pageRangeIndex].start,\n end: pageRange[pageRangeIndex].end,\n isClear: false,\n };\n ++pageRangeIndex;\n }\n else {\n yield {\n start: clearRange[clearRangeIndex].start,\n end: clearRange[clearRangeIndex].end,\n isClear: true,\n };\n ++clearRangeIndex;\n }\n }\n for (; pageRangeIndex < pageRange.length; ++pageRangeIndex) {\n yield {\n start: pageRange[pageRangeIndex].start,\n end: pageRange[pageRangeIndex].end,\n isClear: false,\n };\n }\n for (; clearRangeIndex < clearRange.length; ++clearRangeIndex) {\n yield {\n start: clearRange[clearRangeIndex].start,\n end: clearRange[clearRangeIndex].end,\n isClear: true,\n };\n }\n}\n/**\n * Escape the blobName but keep path separator (\'/\').\n */\nfunction EscapePath(blobName) {\n const split = blobName.split("/");\n for (let i = 0; i < split.length; i++) {\n split[i] = encodeURIComponent(split[i]);\n }\n return split.join("/");\n}\n//# sourceMappingURL=utils.common.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/policies/StorageBrowserPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n/**\n * StorageBrowserPolicy will handle differences between Node.js and browser runtime, including:\n *\n * 1. Browsers cache GET/HEAD requests by adding conditional headers such as \'IF_MODIFIED_SINCE\'.\n * StorageBrowserPolicy is a policy used to add a timestamp query to GET/HEAD request URL\n * thus avoid the browser cache.\n *\n * 2. Remove cookie header for security\n *\n * 3. Remove content-length header to avoid browsers warning\n */\nclass StorageBrowserPolicy extends BaseRequestPolicy {\n /**\n * Creates an instance of StorageBrowserPolicy.\n * @param nextPolicy -\n * @param options -\n */\n // The base class has a protected constructor. Adding a public one to enable constructing of this class.\n /* eslint-disable-next-line @typescript-eslint/no-useless-constructor*/\n constructor(nextPolicy, options) {\n super(nextPolicy, options);\n }\n /**\n * Sends out request.\n *\n * @param request -\n */\n async sendRequest(request) {\n if (checkEnvironment_isNode) {\n return this._nextPolicy.sendRequest(request);\n }\n if (request.method.toUpperCase() === "GET" || request.method.toUpperCase() === "HEAD") {\n request.url = setURLParameter(request.url, constants_URLConstants.Parameters.FORCE_BROWSER_NO_CACHE, new Date().getTime().toString());\n }\n request.headers.remove(constants_HeaderConstants.COOKIE);\n // According to XHR standards, content-length should be fully controlled by browsers\n request.headers.remove(constants_HeaderConstants.CONTENT_LENGTH);\n return this._nextPolicy.sendRequest(request);\n }\n}\n//# sourceMappingURL=StorageBrowserPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/StorageBrowserPolicyFactory.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * StorageBrowserPolicyFactory is a factory class helping generating StorageBrowserPolicy objects.\n */\nclass StorageBrowserPolicyFactory {\n /**\n * Creates a StorageBrowserPolicyFactory object.\n *\n * @param nextPolicy -\n * @param options -\n */\n create(nextPolicy, options) {\n return new StorageBrowserPolicy(nextPolicy, options);\n }\n}\n//# sourceMappingURL=StorageBrowserPolicyFactory.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/abort-controller/dist-esm/src/AbortSignal.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/// \nconst listenersMap = new WeakMap();\nconst abortedMap = new WeakMap();\n/**\n * An aborter instance implements AbortSignal interface, can abort HTTP requests.\n *\n * - Call AbortSignal.none to create a new AbortSignal instance that cannot be cancelled.\n * Use `AbortSignal.none` when you are required to pass a cancellation token but the operation\n * cannot or will not ever be cancelled.\n *\n * @example\n * Abort without timeout\n * ```ts\n * await doAsyncWork(AbortSignal.none);\n * ```\n */\nclass AbortSignal {\n constructor() {\n /**\n * onabort event listener.\n */\n this.onabort = null;\n listenersMap.set(this, []);\n abortedMap.set(this, false);\n }\n /**\n * Status of whether aborted or not.\n *\n * @readonly\n */\n get aborted() {\n if (!abortedMap.has(this)) {\n throw new TypeError("Expected `this` to be an instance of AbortSignal.");\n }\n return abortedMap.get(this);\n }\n /**\n * Creates a new AbortSignal instance that will never be aborted.\n *\n * @readonly\n */\n static get none() {\n return new AbortSignal();\n }\n /**\n * Added new "abort" event listener, only support "abort" event.\n *\n * @param _type - Only support "abort" event\n * @param listener - The listener to be added\n */\n addEventListener(\n // tslint:disable-next-line:variable-name\n _type, listener) {\n if (!listenersMap.has(this)) {\n throw new TypeError("Expected `this` to be an instance of AbortSignal.");\n }\n const listeners = listenersMap.get(this);\n listeners.push(listener);\n }\n /**\n * Remove "abort" event listener, only support "abort" event.\n *\n * @param _type - Only support "abort" event\n * @param listener - The listener to be removed\n */\n removeEventListener(\n // tslint:disable-next-line:variable-name\n _type, listener) {\n if (!listenersMap.has(this)) {\n throw new TypeError("Expected `this` to be an instance of AbortSignal.");\n }\n const listeners = listenersMap.get(this);\n const index = listeners.indexOf(listener);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n }\n /**\n * Dispatches a synthetic event to the AbortSignal.\n */\n dispatchEvent(_event) {\n throw new Error("This is a stub dispatchEvent implementation that should not be used. It only exists for type-checking purposes.");\n }\n}\n/**\n * Helper to trigger an abort event immediately, the onabort and all abort event listeners will be triggered.\n * Will try to trigger abort event for all linked AbortSignal nodes.\n *\n * - If there is a timeout, the timer will be cancelled.\n * - If aborted is true, nothing will happen.\n *\n * @internal\n */\n// eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters\nfunction abortSignal(signal) {\n if (signal.aborted) {\n return;\n }\n if (signal.onabort) {\n signal.onabort.call(signal);\n }\n const listeners = listenersMap.get(signal);\n if (listeners) {\n // Create a copy of listeners so mutations to the array\n // (e.g. via removeListener calls) don\'t affect the listeners\n // we invoke.\n listeners.slice().forEach((listener) => {\n listener.call(signal, { type: "abort" });\n });\n }\n abortedMap.set(signal, true);\n}\n//# sourceMappingURL=AbortSignal.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/abort-controller/dist-esm/src/AbortController.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * This error is thrown when an asynchronous operation has been aborted.\n * Check for this error by testing the `name` that the name property of the\n * error matches `"AbortError"`.\n *\n * @example\n * ```ts\n * const controller = new AbortController();\n * controller.abort();\n * try {\n * doAsyncWork(controller.signal)\n * } catch (e) {\n * if (e.name === \'AbortError\') {\n * // handle abort error here.\n * }\n * }\n * ```\n */\nclass AbortError extends Error {\n constructor(message) {\n super(message);\n this.name = "AbortError";\n }\n}\n/**\n * An AbortController provides an AbortSignal and the associated controls to signal\n * that an asynchronous operation should be aborted.\n *\n * @example\n * Abort an operation when another event fires\n * ```ts\n * const controller = new AbortController();\n * const signal = controller.signal;\n * doAsyncWork(signal);\n * button.addEventListener(\'click\', () => controller.abort());\n * ```\n *\n * @example\n * Share aborter cross multiple operations in 30s\n * ```ts\n * // Upload the same data to 2 different data centers at the same time,\n * // abort another when any of them is finished\n * const controller = AbortController.withTimeout(30 * 1000);\n * doAsyncWork(controller.signal).then(controller.abort);\n * doAsyncWork(controller.signal).then(controller.abort);\n *```\n *\n * @example\n * Cascaded aborting\n * ```ts\n * // All operations can\'t take more than 30 seconds\n * const aborter = Aborter.timeout(30 * 1000);\n *\n * // Following 2 operations can\'t take more than 25 seconds\n * await doAsyncWork(aborter.withTimeout(25 * 1000));\n * await doAsyncWork(aborter.withTimeout(25 * 1000));\n * ```\n */\nclass AbortController {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n constructor(parentSignals) {\n this._signal = new AbortSignal();\n if (!parentSignals) {\n return;\n }\n // coerce parentSignals into an array\n if (!Array.isArray(parentSignals)) {\n // eslint-disable-next-line prefer-rest-params\n parentSignals = arguments;\n }\n for (const parentSignal of parentSignals) {\n // if the parent signal has already had abort() called,\n // then call abort on this signal as well.\n if (parentSignal.aborted) {\n this.abort();\n }\n else {\n // when the parent signal aborts, this signal should as well.\n parentSignal.addEventListener("abort", () => {\n this.abort();\n });\n }\n }\n }\n /**\n * The AbortSignal associated with this controller that will signal aborted\n * when the abort method is called on this controller.\n *\n * @readonly\n */\n get signal() {\n return this._signal;\n }\n /**\n * Signal that any operations passed this controller\'s associated abort signal\n * to cancel any remaining work and throw an `AbortError`.\n */\n abort() {\n abortSignal(this._signal);\n }\n /**\n * Creates a new AbortSignal instance that will abort after the provided ms.\n * @param ms - Elapsed time in milliseconds to trigger an abort.\n */\n static timeout(ms) {\n const signal = new AbortSignal();\n const timer = setTimeout(abortSignal, ms, signal);\n // Prevent the active Timer from keeping the Node.js event loop active.\n if (typeof timer.unref === "function") {\n timer.unref();\n }\n return signal;\n }\n}\n//# sourceMappingURL=AbortController.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/policies/StorageRetryPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n/**\n * A factory method used to generated a RetryPolicy factory.\n *\n * @param retryOptions -\n */\nfunction NewRetryPolicyFactory(retryOptions) {\n return {\n create: (nextPolicy, options) => {\n return new StorageRetryPolicy(nextPolicy, options, retryOptions);\n },\n };\n}\n/**\n * RetryPolicy types.\n */\nvar StorageRetryPolicyType;\n(function (StorageRetryPolicyType) {\n /**\n * Exponential retry. Retry time delay grows exponentially.\n */\n StorageRetryPolicyType[StorageRetryPolicyType["EXPONENTIAL"] = 0] = "EXPONENTIAL";\n /**\n * Linear retry. Retry time delay grows linearly.\n */\n StorageRetryPolicyType[StorageRetryPolicyType["FIXED"] = 1] = "FIXED";\n})(StorageRetryPolicyType || (StorageRetryPolicyType = {}));\n// Default values of StorageRetryOptions\nconst DEFAULT_RETRY_OPTIONS = {\n maxRetryDelayInMs: 120 * 1000,\n maxTries: 4,\n retryDelayInMs: 4 * 1000,\n retryPolicyType: StorageRetryPolicyType.EXPONENTIAL,\n secondaryHost: "",\n tryTimeoutInMs: undefined, // Use server side default timeout strategy\n};\nconst RETRY_ABORT_ERROR = new AbortError("The operation was aborted.");\n/**\n * Retry policy with exponential retry and linear retry implemented.\n */\nclass StorageRetryPolicy extends BaseRequestPolicy {\n /**\n * Creates an instance of RetryPolicy.\n *\n * @param nextPolicy -\n * @param options -\n * @param retryOptions -\n */\n constructor(nextPolicy, options, retryOptions = DEFAULT_RETRY_OPTIONS) {\n super(nextPolicy, options);\n // Initialize retry options\n this.retryOptions = {\n retryPolicyType: retryOptions.retryPolicyType\n ? retryOptions.retryPolicyType\n : DEFAULT_RETRY_OPTIONS.retryPolicyType,\n maxTries: retryOptions.maxTries && retryOptions.maxTries >= 1\n ? Math.floor(retryOptions.maxTries)\n : DEFAULT_RETRY_OPTIONS.maxTries,\n tryTimeoutInMs: retryOptions.tryTimeoutInMs && retryOptions.tryTimeoutInMs >= 0\n ? retryOptions.tryTimeoutInMs\n : DEFAULT_RETRY_OPTIONS.tryTimeoutInMs,\n retryDelayInMs: retryOptions.retryDelayInMs && retryOptions.retryDelayInMs >= 0\n ? Math.min(retryOptions.retryDelayInMs, retryOptions.maxRetryDelayInMs\n ? retryOptions.maxRetryDelayInMs\n : DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs)\n : DEFAULT_RETRY_OPTIONS.retryDelayInMs,\n maxRetryDelayInMs: retryOptions.maxRetryDelayInMs && retryOptions.maxRetryDelayInMs >= 0\n ? retryOptions.maxRetryDelayInMs\n : DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs,\n secondaryHost: retryOptions.secondaryHost\n ? retryOptions.secondaryHost\n : DEFAULT_RETRY_OPTIONS.secondaryHost,\n };\n }\n /**\n * Sends request.\n *\n * @param request -\n */\n async sendRequest(request) {\n return this.attemptSendRequest(request, false, 1);\n }\n /**\n * Decide and perform next retry. Won\'t mutate request parameter.\n *\n * @param request -\n * @param secondaryHas404 - If attempt was against the secondary & it returned a StatusNotFound (404), then\n * the resource was not found. This may be due to replication delay. So, in this\n * case, we\'ll never try the secondary again for this operation.\n * @param attempt - How many retries has been attempted to performed, starting from 1, which includes\n * the attempt will be performed by this method call.\n */\n async attemptSendRequest(request, secondaryHas404, attempt) {\n const newRequest = request.clone();\n const isPrimaryRetry = secondaryHas404 ||\n !this.retryOptions.secondaryHost ||\n !(request.method === "GET" || request.method === "HEAD" || request.method === "OPTIONS") ||\n attempt % 2 === 1;\n if (!isPrimaryRetry) {\n newRequest.url = setURLHost(newRequest.url, this.retryOptions.secondaryHost);\n }\n // Set the server-side timeout query parameter "timeout=[seconds]"\n if (this.retryOptions.tryTimeoutInMs) {\n newRequest.url = setURLParameter(newRequest.url, constants_URLConstants.Parameters.TIMEOUT, Math.floor(this.retryOptions.tryTimeoutInMs / 1000).toString());\n }\n let response;\n try {\n logger.info(`RetryPolicy: =====> Try=${attempt} ${isPrimaryRetry ? "Primary" : "Secondary"}`);\n response = await this._nextPolicy.sendRequest(newRequest);\n if (!this.shouldRetry(isPrimaryRetry, attempt, response)) {\n return response;\n }\n secondaryHas404 = secondaryHas404 || (!isPrimaryRetry && response.status === 404);\n }\n catch (err) {\n logger.error(`RetryPolicy: Caught error, message: ${err.message}, code: ${err.code}`);\n if (!this.shouldRetry(isPrimaryRetry, attempt, response, err)) {\n throw err;\n }\n }\n await this.delay(isPrimaryRetry, attempt, request.abortSignal);\n return this.attemptSendRequest(request, secondaryHas404, ++attempt);\n }\n /**\n * Decide whether to retry according to last HTTP response and retry counters.\n *\n * @param isPrimaryRetry -\n * @param attempt -\n * @param response -\n * @param err -\n */\n shouldRetry(isPrimaryRetry, attempt, response, err) {\n if (attempt >= this.retryOptions.maxTries) {\n logger.info(`RetryPolicy: Attempt(s) ${attempt} >= maxTries ${this.retryOptions\n .maxTries}, no further try.`);\n return false;\n }\n // Handle network failures, you may need to customize the list when you implement\n // your own http client\n const retriableErrors = [\n "ETIMEDOUT",\n "ESOCKETTIMEDOUT",\n "ECONNREFUSED",\n "ECONNRESET",\n "ENOENT",\n "ENOTFOUND",\n "TIMEOUT",\n "EPIPE",\n "REQUEST_SEND_ERROR", // For default xhr based http client provided in ms-rest-js\n ];\n if (err) {\n for (const retriableError of retriableErrors) {\n if (err.name.toUpperCase().includes(retriableError) ||\n err.message.toUpperCase().includes(retriableError) ||\n (err.code && err.code.toString().toUpperCase() === retriableError)) {\n logger.info(`RetryPolicy: Network error ${retriableError} found, will retry.`);\n return true;\n }\n }\n }\n // If attempt was against the secondary & it returned a StatusNotFound (404), then\n // the resource was not found. This may be due to replication delay. So, in this\n // case, we\'ll never try the secondary again for this operation.\n if (response || err) {\n const statusCode = response ? response.status : err ? err.statusCode : 0;\n if (!isPrimaryRetry && statusCode === 404) {\n logger.info(`RetryPolicy: Secondary access with 404, will retry.`);\n return true;\n }\n // Server internal error or server timeout\n if (statusCode === 503 || statusCode === 500) {\n logger.info(`RetryPolicy: Will retry for status code ${statusCode}.`);\n return true;\n }\n }\n if ((err === null || err === void 0 ? void 0 : err.code) === "PARSE_ERROR" && (err === null || err === void 0 ? void 0 : err.message.startsWith(`Error "Error: Unclosed root tag`))) {\n logger.info("RetryPolicy: Incomplete XML response likely due to service timeout, will retry.");\n return true;\n }\n return false;\n }\n /**\n * Delay a calculated time between retries.\n *\n * @param isPrimaryRetry -\n * @param attempt -\n * @param abortSignal -\n */\n async delay(isPrimaryRetry, attempt, abortSignal) {\n let delayTimeInMs = 0;\n if (isPrimaryRetry) {\n switch (this.retryOptions.retryPolicyType) {\n case StorageRetryPolicyType.EXPONENTIAL:\n delayTimeInMs = Math.min((Math.pow(2, attempt - 1) - 1) * this.retryOptions.retryDelayInMs, this.retryOptions.maxRetryDelayInMs);\n break;\n case StorageRetryPolicyType.FIXED:\n delayTimeInMs = this.retryOptions.retryDelayInMs;\n break;\n }\n }\n else {\n delayTimeInMs = Math.random() * 1000;\n }\n logger.info(`RetryPolicy: Delay for ${delayTimeInMs}ms`);\n return delay(delayTimeInMs, abortSignal, RETRY_ABORT_ERROR);\n }\n}\n//# sourceMappingURL=StorageRetryPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/StorageRetryPolicyFactory.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * StorageRetryPolicyFactory is a factory class helping generating {@link StorageRetryPolicy} objects.\n */\nclass StorageRetryPolicyFactory {\n /**\n * Creates an instance of StorageRetryPolicyFactory.\n * @param retryOptions -\n */\n constructor(retryOptions) {\n this.retryOptions = retryOptions;\n }\n /**\n * Creates a StorageRetryPolicy object.\n *\n * @param nextPolicy -\n * @param options -\n */\n create(nextPolicy, options) {\n return new StorageRetryPolicy(nextPolicy, options, this.retryOptions);\n }\n}\n//# sourceMappingURL=StorageRetryPolicyFactory.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/policies/CredentialPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Credential policy used to sign HTTP(S) requests before sending. This is an\n * abstract class.\n */\nclass CredentialPolicy extends BaseRequestPolicy {\n /**\n * Sends out request.\n *\n * @param request -\n */\n sendRequest(request) {\n return this._nextPolicy.sendRequest(this.signRequest(request));\n }\n /**\n * Child classes must implement this method with request signing. This method\n * will be executed in {@link sendRequest}.\n *\n * @param request -\n */\n signRequest(request) {\n // Child classes must override this method with request signing. This method\n // will be executed in sendRequest().\n return request;\n }\n}\n//# sourceMappingURL=CredentialPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/policies/AnonymousCredentialPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * AnonymousCredentialPolicy is used with HTTP(S) requests that read public resources\n * or for use with Shared Access Signatures (SAS).\n */\nclass AnonymousCredentialPolicy extends CredentialPolicy {\n /**\n * Creates an instance of AnonymousCredentialPolicy.\n * @param nextPolicy -\n * @param options -\n */\n // The base class has a protected constructor. Adding a public one to enable constructing of this class.\n /* eslint-disable-next-line @typescript-eslint/no-useless-constructor*/\n constructor(nextPolicy, options) {\n super(nextPolicy, options);\n }\n}\n//# sourceMappingURL=AnonymousCredentialPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/credentials/Credential.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * Credential is an abstract class for Azure Storage HTTP requests signing. This\n * class will host an credentialPolicyCreator factory which generates CredentialPolicy.\n */\nclass Credential {\n /**\n * Creates a RequestPolicy object.\n *\n * @param _nextPolicy -\n * @param _options -\n */\n create(_nextPolicy, _options) {\n throw new Error("Method should be implemented in children classes.");\n }\n}\n//# sourceMappingURL=Credential.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/credentials/AnonymousCredential.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * AnonymousCredential provides a credentialPolicyCreator member used to create\n * AnonymousCredentialPolicy objects. AnonymousCredentialPolicy is used with\n * HTTP(S) requests that read public resources or for use with Shared Access\n * Signatures (SAS).\n */\nclass AnonymousCredential extends Credential {\n /**\n * Creates an {@link AnonymousCredentialPolicy} object.\n *\n * @param nextPolicy -\n * @param options -\n */\n create(nextPolicy, options) {\n return new AnonymousCredentialPolicy(nextPolicy, options);\n }\n}\n//# sourceMappingURL=AnonymousCredential.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/policies/TelemetryPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * TelemetryPolicy is a policy used to tag user-agent header for every requests.\n */\nclass TelemetryPolicy extends BaseRequestPolicy {\n /**\n * Creates an instance of TelemetryPolicy.\n * @param nextPolicy -\n * @param options -\n * @param telemetry -\n */\n constructor(nextPolicy, options, telemetry) {\n super(nextPolicy, options);\n this.telemetry = telemetry;\n }\n /**\n * Sends out request.\n *\n * @param request -\n */\n async sendRequest(request) {\n if (checkEnvironment_isNode) {\n if (!request.headers) {\n request.headers = new httpHeaders_HttpHeaders();\n }\n if (!request.headers.get(constants_HeaderConstants.USER_AGENT)) {\n request.headers.set(constants_HeaderConstants.USER_AGENT, this.telemetry);\n }\n }\n return this._nextPolicy.sendRequest(request);\n }\n}\n//# sourceMappingURL=TelemetryPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/TelemetryPolicyFactory.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n/**\n * TelemetryPolicyFactory is a factory class helping generating {@link TelemetryPolicy} objects.\n */\nclass TelemetryPolicyFactory {\n /**\n * Creates an instance of TelemetryPolicyFactory.\n * @param telemetry -\n */\n constructor(telemetry) {\n const userAgentInfo = [];\n if (checkEnvironment_isNode) {\n if (telemetry) {\n const telemetryString = telemetry.userAgentPrefix || "";\n if (telemetryString.length > 0 && userAgentInfo.indexOf(telemetryString) === -1) {\n userAgentInfo.push(telemetryString);\n }\n }\n // e.g. azsdk-js-storageblob/10.0.0\n const libInfo = `azsdk-js-storageblob/${SDK_VERSION}`;\n if (userAgentInfo.indexOf(libInfo) === -1) {\n userAgentInfo.push(libInfo);\n }\n // e.g. (NODE-VERSION 4.9.1; Windows_NT 10.0.16299)\n let runtimeInfo = `(NODE-VERSION ${process.version})`;\n if (external_os_) {\n runtimeInfo = `(NODE-VERSION ${process.version}; ${external_os_.type()} ${external_os_.release()})`;\n }\n if (userAgentInfo.indexOf(runtimeInfo) === -1) {\n userAgentInfo.push(runtimeInfo);\n }\n }\n this.telemetryString = userAgentInfo.join(" ");\n }\n /**\n * Creates a TelemetryPolicy object.\n *\n * @param nextPolicy -\n * @param options -\n */\n create(nextPolicy, options) {\n return new TelemetryPolicy(nextPolicy, options, this.telemetryString);\n }\n}\n//# sourceMappingURL=TelemetryPolicyFactory.js.map\n// EXTERNAL MODULE: external "http"\nvar external_http_ = __webpack_require__(3685);\n// EXTERNAL MODULE: external "https"\nvar external_https_ = __webpack_require__(5687);\n// EXTERNAL MODULE: ./node_modules/tunnel/index.js\nvar tunnel = __webpack_require__(6149);\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/proxyAgent.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\nfunction createProxyAgent(requestUrl, proxySettings, headers) {\n const host = URLBuilder.parse(proxySettings.host).getHost();\n if (!host) {\n throw new Error("Expecting a non-empty host in proxy settings.");\n }\n if (!isValidPort(proxySettings.port)) {\n throw new Error("Expecting a valid port number in the range of [0, 65535] in proxy settings.");\n }\n const tunnelOptions = {\n proxy: {\n host: host,\n port: proxySettings.port,\n headers: (headers && headers.rawHeaders()) || {},\n },\n };\n if (proxySettings.username && proxySettings.password) {\n tunnelOptions.proxy.proxyAuth = `${proxySettings.username}:${proxySettings.password}`;\n }\n else if (proxySettings.username) {\n tunnelOptions.proxy.proxyAuth = `${proxySettings.username}`;\n }\n const isRequestHttps = isUrlHttps(requestUrl);\n const isProxyHttps = isUrlHttps(proxySettings.host);\n const proxyAgent = {\n isHttps: isRequestHttps,\n agent: createTunnel(isRequestHttps, isProxyHttps, tunnelOptions),\n };\n return proxyAgent;\n}\nfunction isUrlHttps(url) {\n const urlScheme = URLBuilder.parse(url).getScheme() || "";\n return urlScheme.toLowerCase() === "https";\n}\nfunction createTunnel(isRequestHttps, isProxyHttps, tunnelOptions) {\n if (isRequestHttps && isProxyHttps) {\n return tunnel.httpsOverHttps(tunnelOptions);\n }\n else if (isRequestHttps && !isProxyHttps) {\n return tunnel.httpsOverHttp(tunnelOptions);\n }\n else if (!isRequestHttps && isProxyHttps) {\n return tunnel.httpOverHttps(tunnelOptions);\n }\n else {\n return tunnel.httpOverHttp(tunnelOptions);\n }\n}\nfunction isValidPort(port) {\n // any port in 0-65535 range is valid (RFC 793) even though almost all implementations\n // will reserve 0 for a specific purpose, and a range of numbers for ephemeral ports\n return 0 <= port && port <= 65535;\n}\n//# sourceMappingURL=proxyAgent.js.map\n// EXTERNAL MODULE: external "stream"\nvar external_stream_ = __webpack_require__(2781);\n// EXTERNAL MODULE: ./node_modules/form-data/lib/form_data.js\nvar form_data = __webpack_require__(6882);\nvar form_data_default = /*#__PURE__*/__webpack_require__.n(form_data);\n// EXTERNAL MODULE: ./node_modules/node-fetch/lib/index.mjs\nvar lib = __webpack_require__(6292);\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/nodeFetchHttpClient.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n\n\n\n\nfunction getCachedAgent(isHttps, agentCache) {\n return isHttps ? agentCache.httpsAgent : agentCache.httpAgent;\n}\nclass ReportTransform extends external_stream_.Transform {\n constructor(progressCallback) {\n super();\n this.progressCallback = progressCallback;\n this.loadedBytes = 0;\n }\n _transform(chunk, _encoding, callback) {\n this.push(chunk);\n this.loadedBytes += chunk.length;\n this.progressCallback({ loadedBytes: this.loadedBytes });\n callback(undefined);\n }\n}\nfunction isReadableStream(body) {\n return body && typeof body.pipe === "function";\n}\nfunction isStreamComplete(stream, aborter) {\n return new Promise((resolve) => {\n stream.once("close", () => {\n aborter === null || aborter === void 0 ? void 0 : aborter.abort();\n resolve();\n });\n stream.once("end", resolve);\n stream.once("error", resolve);\n });\n}\n/**\n * Transforms a set of headers into the key/value pair defined by {@link HttpHeadersLike}\n */\nfunction parseHeaders(headers) {\n const httpHeaders = new httpHeaders_HttpHeaders();\n headers.forEach((value, key) => {\n httpHeaders.set(key, value);\n });\n return httpHeaders;\n}\n/**\n * An HTTP client that uses `node-fetch`.\n */\nclass NodeFetchHttpClient {\n constructor() {\n // a mapping of proxy settings string `${host}:${port}:${username}:${password}` to agent\n this.proxyAgentMap = new Map();\n this.keepAliveAgents = {};\n }\n /**\n * Provides minimum viable error handling and the logic that executes the abstract methods.\n * @param httpRequest - Object representing the outgoing HTTP request.\n * @returns An object representing the incoming HTTP response.\n */\n async sendRequest(httpRequest) {\n var _a;\n if (!httpRequest && typeof httpRequest !== "object") {\n throw new Error("\'httpRequest\' (WebResourceLike) cannot be null or undefined and must be of type object.");\n }\n const abortController = new AbortController();\n let abortListener;\n if (httpRequest.abortSignal) {\n if (httpRequest.abortSignal.aborted) {\n throw new AbortError("The operation was aborted.");\n }\n abortListener = (event) => {\n if (event.type === "abort") {\n abortController.abort();\n }\n };\n httpRequest.abortSignal.addEventListener("abort", abortListener);\n }\n if (httpRequest.timeout) {\n setTimeout(() => {\n abortController.abort();\n }, httpRequest.timeout);\n }\n if (httpRequest.formData) {\n const formData = httpRequest.formData;\n const requestForm = new (form_data_default())();\n const appendFormValue = (key, value) => {\n // value function probably returns a stream so we can provide a fresh stream on each retry\n if (typeof value === "function") {\n value = value();\n }\n if (value &&\n Object.prototype.hasOwnProperty.call(value, "value") &&\n Object.prototype.hasOwnProperty.call(value, "options")) {\n requestForm.append(key, value.value, value.options);\n }\n else {\n requestForm.append(key, value);\n }\n };\n for (const formKey of Object.keys(formData)) {\n const formValue = formData[formKey];\n if (Array.isArray(formValue)) {\n for (let j = 0; j < formValue.length; j++) {\n appendFormValue(formKey, formValue[j]);\n }\n }\n else {\n appendFormValue(formKey, formValue);\n }\n }\n httpRequest.body = requestForm;\n httpRequest.formData = undefined;\n const contentType = httpRequest.headers.get("Content-Type");\n if (contentType && contentType.indexOf("multipart/form-data") !== -1) {\n if (typeof requestForm.getBoundary === "function") {\n httpRequest.headers.set("Content-Type", `multipart/form-data; boundary=${requestForm.getBoundary()}`);\n }\n else {\n // browser will automatically apply a suitable content-type header\n httpRequest.headers.remove("Content-Type");\n }\n }\n }\n let body = httpRequest.body\n ? typeof httpRequest.body === "function"\n ? httpRequest.body()\n : httpRequest.body\n : undefined;\n if (httpRequest.onUploadProgress && httpRequest.body) {\n const onUploadProgress = httpRequest.onUploadProgress;\n const uploadReportStream = new ReportTransform(onUploadProgress);\n if (isReadableStream(body)) {\n body.pipe(uploadReportStream);\n }\n else {\n uploadReportStream.end(body);\n }\n body = uploadReportStream;\n }\n const platformSpecificRequestInit = await this.prepareRequest(httpRequest);\n const requestInit = Object.assign({ body: body, headers: httpRequest.headers.rawHeaders(), method: httpRequest.method, \n // the types for RequestInit are from the browser, which expects AbortSignal to\n // have `reason` and `throwIfAborted`, but these don\'t exist on our polyfill\n // for Node.\n signal: abortController.signal, redirect: "manual" }, platformSpecificRequestInit);\n let operationResponse;\n try {\n const response = await this.fetch(httpRequest.url, requestInit);\n const headers = parseHeaders(response.headers);\n const streaming = ((_a = httpRequest.streamResponseStatusCodes) === null || _a === void 0 ? void 0 : _a.has(response.status)) ||\n httpRequest.streamResponseBody;\n operationResponse = {\n headers: headers,\n request: httpRequest,\n status: response.status,\n readableStreamBody: streaming\n ? response.body\n : undefined,\n bodyAsText: !streaming ? await response.text() : undefined,\n };\n const onDownloadProgress = httpRequest.onDownloadProgress;\n if (onDownloadProgress) {\n const responseBody = response.body || undefined;\n if (isReadableStream(responseBody)) {\n const downloadReportStream = new ReportTransform(onDownloadProgress);\n responseBody.pipe(downloadReportStream);\n operationResponse.readableStreamBody = downloadReportStream;\n }\n else {\n const length = parseInt(headers.get("Content-Length")) || undefined;\n if (length) {\n // Calling callback for non-stream response for consistency with browser\n onDownloadProgress({ loadedBytes: length });\n }\n }\n }\n await this.processRequest(operationResponse);\n return operationResponse;\n }\n catch (error) {\n const fetchError = error;\n if (fetchError.code === "ENOTFOUND") {\n throw new RestError(fetchError.message, RestError.REQUEST_SEND_ERROR, undefined, httpRequest);\n }\n else if (fetchError.type === "aborted") {\n throw new AbortError("The operation was aborted.");\n }\n throw fetchError;\n }\n finally {\n // clean up event listener\n if (httpRequest.abortSignal && abortListener) {\n let uploadStreamDone = Promise.resolve();\n if (isReadableStream(body)) {\n uploadStreamDone = isStreamComplete(body);\n }\n let downloadStreamDone = Promise.resolve();\n if (isReadableStream(operationResponse === null || operationResponse === void 0 ? void 0 : operationResponse.readableStreamBody)) {\n downloadStreamDone = isStreamComplete(operationResponse.readableStreamBody, abortController);\n }\n Promise.all([uploadStreamDone, downloadStreamDone])\n .then(() => {\n var _a;\n (_a = httpRequest.abortSignal) === null || _a === void 0 ? void 0 : _a.removeEventListener("abort", abortListener);\n return;\n })\n .catch((e) => {\n log_logger.warning("Error when cleaning up abortListener on httpRequest", e);\n });\n }\n }\n }\n getOrCreateAgent(httpRequest) {\n var _a;\n const isHttps = isUrlHttps(httpRequest.url);\n // At the moment, proxy settings and keepAlive are mutually\n // exclusive because the \'tunnel\' library currently lacks the\n // ability to create a proxy with keepAlive turned on.\n if (httpRequest.proxySettings) {\n const { host, port, username, password } = httpRequest.proxySettings;\n const key = `${host}:${port}:${username}:${password}`;\n const proxyAgents = (_a = this.proxyAgentMap.get(key)) !== null && _a !== void 0 ? _a : {};\n let agent = getCachedAgent(isHttps, proxyAgents);\n if (agent) {\n return agent;\n }\n const tunnel = createProxyAgent(httpRequest.url, httpRequest.proxySettings, httpRequest.headers);\n agent = tunnel.agent;\n if (tunnel.isHttps) {\n proxyAgents.httpsAgent = tunnel.agent;\n }\n else {\n proxyAgents.httpAgent = tunnel.agent;\n }\n this.proxyAgentMap.set(key, proxyAgents);\n return agent;\n }\n else if (httpRequest.keepAlive) {\n let agent = getCachedAgent(isHttps, this.keepAliveAgents);\n if (agent) {\n return agent;\n }\n const agentOptions = {\n keepAlive: httpRequest.keepAlive,\n };\n if (isHttps) {\n agent = this.keepAliveAgents.httpsAgent = new external_https_.Agent(agentOptions);\n }\n else {\n agent = this.keepAliveAgents.httpAgent = new external_http_.Agent(agentOptions);\n }\n return agent;\n }\n else {\n return isHttps ? external_https_.globalAgent : external_http_.globalAgent;\n }\n }\n /**\n * Uses `node-fetch` to perform the request.\n */\n // eslint-disable-next-line @azure/azure-sdk/ts-apisurface-standardized-verbs\n async fetch(input, init) {\n return (0,lib/* default */.ZP)(input, init);\n }\n /**\n * Prepares a request based on the provided web resource.\n */\n async prepareRequest(httpRequest) {\n const requestInit = {};\n // Set the http(s) agent\n requestInit.agent = this.getOrCreateAgent(httpRequest);\n requestInit.compress = httpRequest.decompressResponse;\n return requestInit;\n }\n /**\n * Process an HTTP response.\n */\n async processRequest(_operationResponse) {\n /* no_op */\n }\n}\n//# sourceMappingURL=nodeFetchHttpClient.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/utils/cache.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nconst _defaultHttpClient = new NodeFetchHttpClient();\nfunction getCachedDefaultHttpClient() {\n return _defaultHttpClient;\n}\n//# sourceMappingURL=cache.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-util/dist-esm/src/createAbortablePromise.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Creates an abortable promise.\n * @param buildPromise - A function that takes the resolve and reject functions as parameters.\n * @param options - The options for the abortable promise.\n * @returns A promise that can be aborted.\n */\nfunction createAbortablePromise(buildPromise, options) {\n const { cleanupBeforeAbort, abortSignal, abortErrorMsg } = options !== null && options !== void 0 ? options : {};\n return new Promise((resolve, reject) => {\n function rejectOnAbort() {\n reject(new AbortError(abortErrorMsg !== null && abortErrorMsg !== void 0 ? abortErrorMsg : "The operation was aborted."));\n }\n function removeListeners() {\n abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.removeEventListener("abort", onAbort);\n }\n function onAbort() {\n cleanupBeforeAbort === null || cleanupBeforeAbort === void 0 ? void 0 : cleanupBeforeAbort();\n removeListeners();\n rejectOnAbort();\n }\n if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {\n return rejectOnAbort();\n }\n try {\n buildPromise((x) => {\n removeListeners();\n resolve(x);\n }, (x) => {\n removeListeners();\n reject(x);\n });\n }\n catch (err) {\n reject(err);\n }\n abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.addEventListener("abort", onAbort);\n });\n}\n//# sourceMappingURL=createAbortablePromise.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-util/dist-esm/src/delay.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nconst StandardAbortMessage = "The delay was aborted.";\n/**\n * A wrapper for setTimeout that resolves a promise after timeInMs milliseconds.\n * @param timeInMs - The number of milliseconds to be delayed.\n * @param options - The options for delay - currently abort options\n * @returns Promise that is resolved after timeInMs\n */\nfunction delay_delay(timeInMs, options) {\n let token;\n const { abortSignal, abortErrorMsg } = options !== null && options !== void 0 ? options : {};\n return createAbortablePromise((resolve) => {\n token = setTimeout(resolve, timeInMs);\n }, {\n cleanupBeforeAbort: () => clearTimeout(token),\n abortSignal,\n abortErrorMsg: abortErrorMsg !== null && abortErrorMsg !== void 0 ? abortErrorMsg : StandardAbortMessage,\n });\n}\n//# sourceMappingURL=delay.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/policies/StorageBearerTokenChallengeAuthenticationPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n/**\n * A set of constants used internally when processing requests.\n */\nconst StorageBearerTokenChallengeAuthenticationPolicy_Constants = {\n DefaultScope: "/.default",\n /**\n * Defines constants for use with HTTP headers.\n */\n HeaderConstants: {\n /**\n * The Authorization header.\n */\n AUTHORIZATION: "authorization",\n },\n};\n// Default options for the cycler if none are provided\nconst DEFAULT_CYCLER_OPTIONS = {\n forcedRefreshWindowInMs: 1000,\n retryIntervalInMs: 3000,\n refreshWindowInMs: 1000 * 60 * 2, // Start refreshing 2m before expiry\n};\n/**\n * Converts an an unreliable access token getter (which may resolve with null)\n * into an AccessTokenGetter by retrying the unreliable getter in a regular\n * interval.\n *\n * @param getAccessToken - a function that produces a promise of an access\n * token that may fail by returning null\n * @param retryIntervalInMs - the time (in milliseconds) to wait between retry\n * attempts\n * @param timeoutInMs - the timestamp after which the refresh attempt will fail,\n * throwing an exception\n * @returns - a promise that, if it resolves, will resolve with an access token\n */\nasync function beginRefresh(getAccessToken, retryIntervalInMs, timeoutInMs) {\n // This wrapper handles exceptions gracefully as long as we haven\'t exceeded\n // the timeout.\n async function tryGetAccessToken() {\n if (Date.now() < timeoutInMs) {\n try {\n return await getAccessToken();\n }\n catch (_a) {\n return null;\n }\n }\n else {\n const finalToken = await getAccessToken();\n // Timeout is up, so throw if it\'s still null\n if (finalToken === null) {\n throw new Error("Failed to refresh access token.");\n }\n return finalToken;\n }\n }\n let token = await tryGetAccessToken();\n while (token === null) {\n await delay_delay(retryIntervalInMs);\n token = await tryGetAccessToken();\n }\n return token;\n}\n/**\n * Creates a token cycler from a credential, scopes, and optional settings.\n *\n * A token cycler represents a way to reliably retrieve a valid access token\n * from a TokenCredential. It will handle initializing the token, refreshing it\n * when it nears expiration, and synchronizes refresh attempts to avoid\n * concurrency hazards.\n *\n * @param credential - the underlying TokenCredential that provides the access\n * token\n * @param scopes - the scopes to request authorization for\n * @param tokenCyclerOptions - optionally override default settings for the cycler\n *\n * @returns - a function that reliably produces a valid access token\n */\nfunction createTokenCycler(credential, scopes, tokenCyclerOptions) {\n let refreshWorker = null;\n let token = null;\n const options = Object.assign(Object.assign({}, DEFAULT_CYCLER_OPTIONS), tokenCyclerOptions);\n /**\n * This little holder defines several predicates that we use to construct\n * the rules of refreshing the token.\n */\n const cycler = {\n /**\n * Produces true if a refresh job is currently in progress.\n */\n get isRefreshing() {\n return refreshWorker !== null;\n },\n /**\n * Produces true if the cycler SHOULD refresh (we are within the refresh\n * window and not already refreshing)\n */\n get shouldRefresh() {\n var _a;\n return (!cycler.isRefreshing &&\n ((_a = token === null || token === void 0 ? void 0 : token.expiresOnTimestamp) !== null && _a !== void 0 ? _a : 0) - options.refreshWindowInMs < Date.now());\n },\n /**\n * Produces true if the cycler MUST refresh (null or nearly-expired\n * token).\n */\n get mustRefresh() {\n return (token === null || token.expiresOnTimestamp - options.forcedRefreshWindowInMs < Date.now());\n },\n };\n /**\n * Starts a refresh job or returns the existing job if one is already\n * running.\n */\n function refresh(getTokenOptions) {\n var _a;\n if (!cycler.isRefreshing) {\n // We bind `scopes` here to avoid passing it around a lot\n const tryGetAccessToken = () => credential.getToken(scopes, getTokenOptions);\n // Take advantage of promise chaining to insert an assignment to `token`\n // before the refresh can be considered done.\n refreshWorker = beginRefresh(tryGetAccessToken, options.retryIntervalInMs, \n // If we don\'t have a token, then we should timeout immediately\n (_a = token === null || token === void 0 ? void 0 : token.expiresOnTimestamp) !== null && _a !== void 0 ? _a : Date.now())\n .then((_token) => {\n refreshWorker = null;\n token = _token;\n return token;\n })\n .catch((reason) => {\n // We also should reset the refresher if we enter a failed state. All\n // existing awaiters will throw, but subsequent requests will start a\n // new retry chain.\n refreshWorker = null;\n token = null;\n throw reason;\n });\n }\n return refreshWorker;\n }\n return async (tokenOptions) => {\n //\n // Simple rules:\n // - If we MUST refresh, then return the refresh task, blocking\n // the pipeline until a token is available.\n // - If we SHOULD refresh, then run refresh but don\'t return it\n // (we can still use the cached token).\n // - Return the token, since it\'s fine if we didn\'t return in\n // step 1.\n //\n if (cycler.mustRefresh)\n return refresh(tokenOptions);\n if (cycler.shouldRefresh) {\n refresh(tokenOptions);\n }\n return token;\n };\n}\n/**\n * We will retrieve the challenge only if the response status code was 401,\n * and if the response contained the header "WWW-Authenticate" with a non-empty value.\n */\nfunction getChallenge(response) {\n const challenge = response.headers.get("WWW-Authenticate");\n if (response.status === 401 && challenge) {\n return challenge;\n }\n return;\n}\n/**\n * Converts: `Bearer a="b" c="d"`.\n * Into: `[ { a: \'b\', c: \'d\' }]`.\n *\n * @internal\n */\nfunction parseChallenge(challenge) {\n const bearerChallenge = challenge.slice("Bearer ".length);\n const challengeParts = `${bearerChallenge.trim()} `.split(" ").filter((x) => x);\n const keyValuePairs = challengeParts.map((keyValue) => (([key, value]) => ({ [key]: value }))(keyValue.trim().split("=")));\n // Key-value pairs to plain object:\n return keyValuePairs.reduce((a, b) => (Object.assign(Object.assign({}, a), b)), {});\n}\n// #endregion\n/**\n * Creates a new factory for a RequestPolicy that applies a bearer token to\n * the requests\' `Authorization` headers.\n *\n * @param credential - The TokenCredential implementation that can supply the bearer token.\n * @param scopes - The scopes for which the bearer token applies.\n */\nfunction storageBearerTokenChallengeAuthenticationPolicy(credential, scopes) {\n // This simple function encapsulates the entire process of reliably retrieving the token\n let getToken = createTokenCycler(credential, scopes);\n class StorageBearerTokenChallengeAuthenticationPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options) {\n super(nextPolicy, options);\n }\n async sendRequest(webResource) {\n if (!webResource.url.toLowerCase().startsWith("https://")) {\n throw new Error("Bearer token authentication is not permitted for non-TLS protected (non-https) URLs.");\n }\n const getTokenInternal = getToken;\n const token = (await getTokenInternal({\n abortSignal: webResource.abortSignal,\n tracingOptions: {\n tracingContext: webResource.tracingContext,\n },\n })).token;\n webResource.headers.set(StorageBearerTokenChallengeAuthenticationPolicy_Constants.HeaderConstants.AUTHORIZATION, `Bearer ${token}`);\n const response = await this._nextPolicy.sendRequest(webResource);\n if ((response === null || response === void 0 ? void 0 : response.status) === 401) {\n const challenge = getChallenge(response);\n if (challenge) {\n const challengeInfo = parseChallenge(challenge);\n const challengeScopes = challengeInfo.resource_id + StorageBearerTokenChallengeAuthenticationPolicy_Constants.DefaultScope;\n const parsedAuthUri = URLBuilder.parse(challengeInfo.authorization_uri);\n const pathSegments = parsedAuthUri.getPath().split("/");\n const tenantId = pathSegments[1];\n const getTokenForChallenge = createTokenCycler(credential, challengeScopes);\n const tokenForChallenge = (await getTokenForChallenge({\n abortSignal: webResource.abortSignal,\n tracingOptions: {\n tracingContext: webResource.tracingContext,\n },\n tenantId: tenantId,\n })).token;\n getToken = getTokenForChallenge;\n webResource.headers.set(StorageBearerTokenChallengeAuthenticationPolicy_Constants.HeaderConstants.AUTHORIZATION, `Bearer ${tokenForChallenge}`);\n return this._nextPolicy.sendRequest(webResource);\n }\n }\n return response;\n }\n }\n return {\n create: (nextPolicy, options) => {\n return new StorageBearerTokenChallengeAuthenticationPolicy(nextPolicy, options);\n },\n };\n}\n//# sourceMappingURL=StorageBearerTokenChallengeAuthenticationPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/Pipeline.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n\n\n\n\n// Export following interfaces and types for customers who want to implement their\n// own RequestPolicy or HTTPClient\n\n/**\n * A helper to decide if a given argument satisfies the Pipeline contract\n * @param pipeline - An argument that may be a Pipeline\n * @returns true when the argument satisfies the Pipeline contract\n */\nfunction isPipelineLike(pipeline) {\n if (!pipeline || typeof pipeline !== "object") {\n return false;\n }\n const castPipeline = pipeline;\n return (Array.isArray(castPipeline.factories) &&\n typeof castPipeline.options === "object" &&\n typeof castPipeline.toServiceClientOptions === "function");\n}\n/**\n * A Pipeline class containing HTTP request policies.\n * You can create a default Pipeline by calling {@link newPipeline}.\n * Or you can create a Pipeline with your own policies by the constructor of Pipeline.\n *\n * Refer to {@link newPipeline} and provided policies before implementing your\n * customized Pipeline.\n */\nclass Pipeline {\n /**\n * Creates an instance of Pipeline. Customize HTTPClient by implementing IHttpClient interface.\n *\n * @param factories -\n * @param options -\n */\n constructor(factories, options = {}) {\n this.factories = factories;\n // when options.httpClient is not specified, passing in a DefaultHttpClient instance to\n // avoid each client creating its own http client.\n this.options = Object.assign(Object.assign({}, options), { httpClient: options.httpClient || getCachedDefaultHttpClient() });\n }\n /**\n * Transfer Pipeline object to ServiceClientOptions object which is required by\n * ServiceClient constructor.\n *\n * @returns The ServiceClientOptions object from this Pipeline.\n */\n toServiceClientOptions() {\n return {\n httpClient: this.options.httpClient,\n requestPolicyFactories: this.factories,\n };\n }\n}\n/**\n * Creates a new Pipeline object with Credential provided.\n *\n * @param credential - Such as AnonymousCredential, StorageSharedKeyCredential or any credential from the `@azure/identity` package to authenticate requests to the service. You can also provide an object that implements the TokenCredential interface. If not specified, AnonymousCredential is used.\n * @param pipelineOptions - Optional. Options.\n * @returns A new Pipeline object.\n */\nfunction newPipeline(credential, pipelineOptions = {}) {\n var _a;\n if (credential === undefined) {\n credential = new AnonymousCredential();\n }\n // Order is important. Closer to the API at the top & closer to the network at the bottom.\n // The credential\'s policy factory must appear close to the wire so it can sign any\n // changes made by other factories (like UniqueRequestIDPolicyFactory)\n const telemetryPolicy = new TelemetryPolicyFactory(pipelineOptions.userAgentOptions);\n const factories = [\n tracingPolicy_tracingPolicy({ userAgent: telemetryPolicy.telemetryString }),\n keepAlivePolicy_keepAlivePolicy(pipelineOptions.keepAliveOptions),\n telemetryPolicy,\n generateClientRequestIdPolicy_generateClientRequestIdPolicy(),\n new StorageBrowserPolicyFactory(),\n new StorageRetryPolicyFactory(pipelineOptions.retryOptions),\n // Default deserializationPolicy is provided by protocol layer\n // Use customized XML char key of "#" so we could deserialize metadata\n // with "_" key\n deserializationPolicy_deserializationPolicy(undefined, { xmlCharKey: "#" }),\n logPolicy_logPolicy({\n logger: logger.info,\n allowedHeaderNames: StorageBlobLoggingAllowedHeaderNames,\n allowedQueryParameters: StorageBlobLoggingAllowedQueryParameters,\n }),\n ];\n if (checkEnvironment_isNode) {\n // policies only available in Node.js runtime, not in browsers\n factories.push(proxyPolicy_proxyPolicy(pipelineOptions.proxyOptions));\n factories.push(disableResponseDecompressionPolicy_disableResponseDecompressionPolicy());\n }\n factories.push(isTokenCredential(credential)\n ? attachCredential(storageBearerTokenChallengeAuthenticationPolicy(credential, (_a = pipelineOptions.audience) !== null && _a !== void 0 ? _a : StorageOAuthScopes), credential)\n : credential);\n return new Pipeline(factories, pipelineOptions);\n}\n//# sourceMappingURL=Pipeline.js.map\n// EXTERNAL MODULE: external "crypto"\nvar external_crypto_ = __webpack_require__(6113);\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/policies/StorageSharedKeyCredentialPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n/**\n * StorageSharedKeyCredentialPolicy is a policy used to sign HTTP request with a shared key.\n */\nclass StorageSharedKeyCredentialPolicy extends CredentialPolicy {\n /**\n * Creates an instance of StorageSharedKeyCredentialPolicy.\n * @param nextPolicy -\n * @param options -\n * @param factory -\n */\n constructor(nextPolicy, options, factory) {\n super(nextPolicy, options);\n this.factory = factory;\n }\n /**\n * Signs request.\n *\n * @param request -\n */\n signRequest(request) {\n request.headers.set(constants_HeaderConstants.X_MS_DATE, new Date().toUTCString());\n if (request.body &&\n (typeof request.body === "string" || request.body !== undefined) &&\n request.body.length > 0) {\n request.headers.set(constants_HeaderConstants.CONTENT_LENGTH, Buffer.byteLength(request.body));\n }\n const stringToSign = [\n request.method.toUpperCase(),\n this.getHeaderValueToSign(request, constants_HeaderConstants.CONTENT_LANGUAGE),\n this.getHeaderValueToSign(request, constants_HeaderConstants.CONTENT_ENCODING),\n this.getHeaderValueToSign(request, constants_HeaderConstants.CONTENT_LENGTH),\n this.getHeaderValueToSign(request, constants_HeaderConstants.CONTENT_MD5),\n this.getHeaderValueToSign(request, constants_HeaderConstants.CONTENT_TYPE),\n this.getHeaderValueToSign(request, constants_HeaderConstants.DATE),\n this.getHeaderValueToSign(request, constants_HeaderConstants.IF_MODIFIED_SINCE),\n this.getHeaderValueToSign(request, constants_HeaderConstants.IF_MATCH),\n this.getHeaderValueToSign(request, constants_HeaderConstants.IF_NONE_MATCH),\n this.getHeaderValueToSign(request, constants_HeaderConstants.IF_UNMODIFIED_SINCE),\n this.getHeaderValueToSign(request, constants_HeaderConstants.RANGE),\n ].join("\\n") +\n "\\n" +\n this.getCanonicalizedHeadersString(request) +\n this.getCanonicalizedResourceString(request);\n const signature = this.factory.computeHMACSHA256(stringToSign);\n request.headers.set(constants_HeaderConstants.AUTHORIZATION, `SharedKey ${this.factory.accountName}:${signature}`);\n // console.log(`[URL]:${request.url}`);\n // console.log(`[HEADERS]:${request.headers.toString()}`);\n // console.log(`[STRING TO SIGN]:${JSON.stringify(stringToSign)}`);\n // console.log(`[KEY]: ${request.headers.get(HeaderConstants.AUTHORIZATION)}`);\n return request;\n }\n /**\n * Retrieve header value according to shared key sign rules.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/authenticate-with-shared-key\n *\n * @param request -\n * @param headerName -\n */\n getHeaderValueToSign(request, headerName) {\n const value = request.headers.get(headerName);\n if (!value) {\n return "";\n }\n // When using version 2015-02-21 or later, if Content-Length is zero, then\n // set the Content-Length part of the StringToSign to an empty string.\n // https://docs.microsoft.com/en-us/rest/api/storageservices/authenticate-with-shared-key\n if (headerName === constants_HeaderConstants.CONTENT_LENGTH && value === "0") {\n return "";\n }\n return value;\n }\n /**\n * To construct the CanonicalizedHeaders portion of the signature string, follow these steps:\n * 1. Retrieve all headers for the resource that begin with x-ms-, including the x-ms-date header.\n * 2. Convert each HTTP header name to lowercase.\n * 3. Sort the headers lexicographically by header name, in ascending order.\n * Each header may appear only once in the string.\n * 4. Replace any linear whitespace in the header value with a single space.\n * 5. Trim any whitespace around the colon in the header.\n * 6. Finally, append a new-line character to each canonicalized header in the resulting list.\n * Construct the CanonicalizedHeaders string by concatenating all headers in this list into a single string.\n *\n * @param request -\n */\n getCanonicalizedHeadersString(request) {\n let headersArray = request.headers.headersArray().filter((value) => {\n return value.name.toLowerCase().startsWith(constants_HeaderConstants.PREFIX_FOR_STORAGE);\n });\n headersArray.sort((a, b) => {\n return a.name.toLowerCase().localeCompare(b.name.toLowerCase());\n });\n // Remove duplicate headers\n headersArray = headersArray.filter((value, index, array) => {\n if (index > 0 && value.name.toLowerCase() === array[index - 1].name.toLowerCase()) {\n return false;\n }\n return true;\n });\n let canonicalizedHeadersStringToSign = "";\n headersArray.forEach((header) => {\n canonicalizedHeadersStringToSign += `${header.name\n .toLowerCase()\n .trimRight()}:${header.value.trimLeft()}\\n`;\n });\n return canonicalizedHeadersStringToSign;\n }\n /**\n * Retrieves the webResource canonicalized resource string.\n *\n * @param request -\n */\n getCanonicalizedResourceString(request) {\n const path = getURLPath(request.url) || "/";\n let canonicalizedResourceString = "";\n canonicalizedResourceString += `/${this.factory.accountName}${path}`;\n const queries = getURLQueries(request.url);\n const lowercaseQueries = {};\n if (queries) {\n const queryKeys = [];\n for (const key in queries) {\n if (Object.prototype.hasOwnProperty.call(queries, key)) {\n const lowercaseKey = key.toLowerCase();\n lowercaseQueries[lowercaseKey] = queries[key];\n queryKeys.push(lowercaseKey);\n }\n }\n queryKeys.sort();\n for (const key of queryKeys) {\n canonicalizedResourceString += `\\n${key}:${decodeURIComponent(lowercaseQueries[key])}`;\n }\n }\n return canonicalizedResourceString;\n }\n}\n//# sourceMappingURL=StorageSharedKeyCredentialPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/credentials/StorageSharedKeyCredential.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * StorageSharedKeyCredential for account key authorization of Azure Storage service.\n */\nclass StorageSharedKeyCredential extends Credential {\n /**\n * Creates an instance of StorageSharedKeyCredential.\n * @param accountName -\n * @param accountKey -\n */\n constructor(accountName, accountKey) {\n super();\n this.accountName = accountName;\n this.accountKey = Buffer.from(accountKey, "base64");\n }\n /**\n * Creates a StorageSharedKeyCredentialPolicy object.\n *\n * @param nextPolicy -\n * @param options -\n */\n create(nextPolicy, options) {\n return new StorageSharedKeyCredentialPolicy(nextPolicy, options, this);\n }\n /**\n * Generates a hash signature for an HTTP request or for a SAS.\n *\n * @param stringToSign -\n */\n computeHMACSHA256(stringToSign) {\n return (0,external_crypto_.createHmac)("sha256", this.accountKey).update(stringToSign, "utf8").digest("base64");\n }\n}\n//# sourceMappingURL=StorageSharedKeyCredential.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/redirectPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * Methods that are allowed to follow redirects 301 and 302\n */\nconst allowedRedirect = ["GET", "HEAD"];\nconst redirectPolicy_DefaultRedirectOptions = {\n handleRedirects: true,\n maxRetries: 20,\n};\n/**\n * Creates a redirect policy, which sends a repeats the request to a new destination if a response arrives with a "location" header, and a status code between 300 and 307.\n * @param maximumRetries - Maximum number of redirects to follow.\n * @returns An instance of the {@link RedirectPolicy}\n */\nfunction redirectPolicy_redirectPolicy(maximumRetries = 20) {\n return {\n create: (nextPolicy, options) => {\n return new RedirectPolicy(nextPolicy, options, maximumRetries);\n },\n };\n}\n/**\n * Resends the request to a new destination if a response arrives with a "location" header, and a status code between 300 and 307.\n */\nclass RedirectPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options, maxRetries = 20) {\n super(nextPolicy, options);\n this.maxRetries = maxRetries;\n }\n sendRequest(request) {\n return this._nextPolicy\n .sendRequest(request)\n .then((response) => handleRedirect(this, response, 0));\n }\n}\nfunction handleRedirect(policy, response, currentRetries) {\n const { request, status } = response;\n const locationHeader = response.headers.get("location");\n if (locationHeader &&\n (status === 300 ||\n (status === 301 && allowedRedirect.includes(request.method)) ||\n (status === 302 && allowedRedirect.includes(request.method)) ||\n (status === 303 && request.method === "POST") ||\n status === 307) &&\n (!policy.maxRetries || currentRetries < policy.maxRetries)) {\n const builder = URLBuilder.parse(request.url);\n builder.setPath(locationHeader);\n request.url = builder.toString();\n // POST request with Status code 303 should be converted into a\n // redirected GET request if the redirect url is present in the location header\n if (status === 303) {\n request.method = "GET";\n delete request.body;\n }\n return policy._nextPolicy\n .sendRequest(request)\n .then((res) => handleRedirect(policy, res, currentRetries + 1));\n }\n return Promise.resolve(response);\n}\n//# sourceMappingURL=redirectPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/util/exponentialBackoffStrategy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nconst DEFAULT_CLIENT_RETRY_COUNT = 3;\n// intervals are in ms\nconst DEFAULT_CLIENT_RETRY_INTERVAL = 1000 * 30;\nconst DEFAULT_CLIENT_MAX_RETRY_INTERVAL = 1000 * 90;\nconst DEFAULT_CLIENT_MIN_RETRY_INTERVAL = 1000 * 3;\nfunction isNumber(n) {\n return typeof n === "number";\n}\n/**\n * @internal\n * Determines if the operation should be retried.\n *\n * @param retryLimit - Specifies the max number of retries.\n * @param predicate - Initial chekck on whether to retry based on given responses or errors\n * @param retryData - The retry data.\n * @returns True if the operation qualifies for a retry; false otherwise.\n */\nfunction shouldRetry(retryLimit, predicate, retryData, response, error) {\n if (!predicate(response, error)) {\n return false;\n }\n return retryData.retryCount < retryLimit;\n}\n/**\n * @internal\n * Updates the retry data for the next attempt.\n *\n * @param retryOptions - specifies retry interval, and its lower bound and upper bound.\n * @param retryData - The retry data.\n * @param err - The operation"s error, if any.\n */\nfunction updateRetryData(retryOptions, retryData = { retryCount: 0, retryInterval: 0 }, err) {\n if (err) {\n if (retryData.error) {\n err.innerError = retryData.error;\n }\n retryData.error = err;\n }\n // Adjust retry count\n retryData.retryCount++;\n // Adjust retry interval\n let incrementDelta = Math.pow(2, retryData.retryCount - 1) - 1;\n const boundedRandDelta = retryOptions.retryInterval * 0.8 +\n Math.floor(Math.random() * (retryOptions.retryInterval * 0.4));\n incrementDelta *= boundedRandDelta;\n retryData.retryInterval = Math.min(retryOptions.minRetryInterval + incrementDelta, retryOptions.maxRetryInterval);\n return retryData;\n}\n//# sourceMappingURL=exponentialBackoffStrategy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/exponentialRetryPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n/**\n * Policy that retries the request as many times as configured for as long as the max retry time interval specified, each retry waiting longer to begin than the last time.\n * @param retryCount - Maximum number of retries.\n * @param retryInterval - Base time between retries.\n * @param maxRetryInterval - Maximum time to wait between retries.\n */\nfunction exponentialRetryPolicy_exponentialRetryPolicy(retryCount, retryInterval, maxRetryInterval) {\n return {\n create: (nextPolicy, options) => {\n return new ExponentialRetryPolicy(nextPolicy, options, retryCount, retryInterval, maxRetryInterval);\n },\n };\n}\n/**\n * Describes the Retry Mode type. Currently supporting only Exponential.\n */\nvar RetryMode;\n(function (RetryMode) {\n /**\n * Currently supported retry mode.\n * Each time a retry happens, it will take exponentially more time than the last time.\n */\n RetryMode[RetryMode["Exponential"] = 0] = "Exponential";\n})(RetryMode || (RetryMode = {}));\nconst exponentialRetryPolicy_DefaultRetryOptions = {\n maxRetries: DEFAULT_CLIENT_RETRY_COUNT,\n retryDelayInMs: DEFAULT_CLIENT_RETRY_INTERVAL,\n maxRetryDelayInMs: DEFAULT_CLIENT_MAX_RETRY_INTERVAL,\n};\n/**\n * Instantiates a new "ExponentialRetryPolicyFilter" instance.\n */\nclass ExponentialRetryPolicy extends BaseRequestPolicy {\n /**\n * @param nextPolicy - The next RequestPolicy in the pipeline chain.\n * @param options - The options for this RequestPolicy.\n * @param retryCount - The client retry count.\n * @param retryInterval - The client retry interval, in milliseconds.\n * @param minRetryInterval - The minimum retry interval, in milliseconds.\n * @param maxRetryInterval - The maximum retry interval, in milliseconds.\n */\n constructor(nextPolicy, options, retryCount, retryInterval, maxRetryInterval) {\n super(nextPolicy, options);\n this.retryCount = isNumber(retryCount) ? retryCount : DEFAULT_CLIENT_RETRY_COUNT;\n this.retryInterval = isNumber(retryInterval) ? retryInterval : DEFAULT_CLIENT_RETRY_INTERVAL;\n this.maxRetryInterval = isNumber(maxRetryInterval)\n ? maxRetryInterval\n : DEFAULT_CLIENT_MAX_RETRY_INTERVAL;\n }\n sendRequest(request) {\n return this._nextPolicy\n .sendRequest(request.clone())\n .then((response) => retry(this, request, response))\n .catch((error) => retry(this, request, error.response, undefined, error));\n }\n}\nasync function retry(policy, request, response, retryData, requestError) {\n function shouldPolicyRetry(responseParam) {\n const statusCode = responseParam === null || responseParam === void 0 ? void 0 : responseParam.status;\n if (statusCode === 503 && (response === null || response === void 0 ? void 0 : response.headers.get(constants_Constants.HeaderConstants.RETRY_AFTER))) {\n return false;\n }\n if (statusCode === undefined ||\n (statusCode < 500 && statusCode !== 408) ||\n statusCode === 501 ||\n statusCode === 505) {\n return false;\n }\n return true;\n }\n retryData = updateRetryData({\n retryInterval: policy.retryInterval,\n minRetryInterval: 0,\n maxRetryInterval: policy.maxRetryInterval,\n }, retryData, requestError);\n const isAborted = request.abortSignal && request.abortSignal.aborted;\n if (!isAborted && shouldRetry(policy.retryCount, shouldPolicyRetry, retryData, response)) {\n log_logger.info(`Retrying request in ${retryData.retryInterval}`);\n try {\n await delay_delay(retryData.retryInterval);\n const res = await policy._nextPolicy.sendRequest(request.clone());\n return retry(policy, request, res, retryData);\n }\n catch (err) {\n return retry(policy, request, response, retryData, err);\n }\n }\n else if (isAborted || requestError || !response) {\n // If the operation failed in the end, return all errors instead of just the last one\n const err = retryData.error ||\n new RestError("Failed to send the request.", RestError.REQUEST_SEND_ERROR, response && response.status, response && response.request, response);\n throw err;\n }\n else {\n return response;\n }\n}\n//# sourceMappingURL=exponentialRetryPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/operationParameter.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * Get the path to this parameter\'s value as a dotted string (a.b.c).\n * @param parameter - The parameter to get the path string for.\n * @returns The path to this parameter\'s value as a dotted string.\n */\nfunction getPathStringFromParameter(parameter) {\n return getPathStringFromParameterPath(parameter.parameterPath, parameter.mapper);\n}\nfunction getPathStringFromParameterPath(parameterPath, mapper) {\n let result;\n if (typeof parameterPath === "string") {\n result = parameterPath;\n }\n else if (Array.isArray(parameterPath)) {\n result = parameterPath.join(".");\n }\n else {\n result = mapper.serializedName;\n }\n return result;\n}\n//# sourceMappingURL=operationParameter.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/operationSpec.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Gets the list of status codes for streaming responses.\n * @internal\n */\nfunction getStreamResponseStatusCodes(operationSpec) {\n const result = new Set();\n for (const statusCode in operationSpec.responses) {\n const operationResponse = operationSpec.responses[statusCode];\n if (operationResponse.bodyMapper &&\n operationResponse.bodyMapper.type.name === MapperType.Stream) {\n result.add(Number(statusCode));\n }\n }\n return result;\n}\n//# sourceMappingURL=operationSpec.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/msRestUserAgentPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\nfunction getDefaultUserAgentKey() {\n return constants_Constants.HeaderConstants.USER_AGENT;\n}\nfunction getPlatformSpecificData() {\n const runtimeInfo = {\n key: "Node",\n value: process.version,\n };\n const osInfo = {\n key: "OS",\n value: `(${external_os_.arch()}-${external_os_.type()}-${external_os_.release()})`,\n };\n return [runtimeInfo, osInfo];\n}\n//# sourceMappingURL=msRestUserAgentPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/userAgentPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\nfunction getRuntimeInfo() {\n const msRestRuntime = {\n key: "core-http",\n value: constants_Constants.coreHttpVersion,\n };\n return [msRestRuntime];\n}\nfunction getUserAgentString(telemetryInfo, keySeparator = " ", valueSeparator = "/") {\n return telemetryInfo\n .map((info) => {\n const value = info.value ? `${valueSeparator}${info.value}` : "";\n return `${info.key}${value}`;\n })\n .join(keySeparator);\n}\nconst getDefaultUserAgentHeaderName = getDefaultUserAgentKey;\n/**\n * The default approach to generate user agents.\n * Uses static information from this package, plus system information available from the runtime.\n */\nfunction userAgentPolicy_getDefaultUserAgentValue() {\n const runtimeInfo = getRuntimeInfo();\n const platformSpecificData = getPlatformSpecificData();\n const userAgent = getUserAgentString(runtimeInfo.concat(platformSpecificData));\n return userAgent;\n}\n/**\n * Returns a policy that adds the user agent header to outgoing requests based on the given {@link TelemetryInfo}.\n * @param userAgentData - Telemetry information.\n * @returns A new {@link UserAgentPolicy}.\n */\nfunction userAgentPolicy_userAgentPolicy(userAgentData) {\n const key = !userAgentData || userAgentData.key === undefined || userAgentData.key === null\n ? getDefaultUserAgentKey()\n : userAgentData.key;\n const value = !userAgentData || userAgentData.value === undefined || userAgentData.value === null\n ? userAgentPolicy_getDefaultUserAgentValue()\n : userAgentData.value;\n return {\n create: (nextPolicy, options) => {\n return new UserAgentPolicy(nextPolicy, options, key, value);\n },\n };\n}\n/**\n * A policy that adds the user agent header to outgoing requests based on the given {@link TelemetryInfo}.\n */\nclass UserAgentPolicy extends BaseRequestPolicy {\n constructor(_nextPolicy, _options, headerKey, headerValue) {\n super(_nextPolicy, _options);\n this._nextPolicy = _nextPolicy;\n this._options = _options;\n this.headerKey = headerKey;\n this.headerValue = headerValue;\n }\n sendRequest(request) {\n this.addUserAgentHeader(request);\n return this._nextPolicy.sendRequest(request);\n }\n /**\n * Adds the user agent header to the outgoing request.\n */\n addUserAgentHeader(request) {\n if (!request.headers) {\n request.headers = new httpHeaders_HttpHeaders();\n }\n if (!request.headers.get(this.headerKey) && this.headerValue) {\n request.headers.set(this.headerKey, this.headerValue);\n }\n }\n}\n//# sourceMappingURL=userAgentPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/bearerTokenAuthenticationPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n// Default options for the cycler if none are provided\nconst bearerTokenAuthenticationPolicy_DEFAULT_CYCLER_OPTIONS = {\n forcedRefreshWindowInMs: 1000,\n retryIntervalInMs: 3000,\n refreshWindowInMs: 1000 * 60 * 2, // Start refreshing 2m before expiry\n};\n/**\n * Converts an an unreliable access token getter (which may resolve with null)\n * into an AccessTokenGetter by retrying the unreliable getter in a regular\n * interval.\n *\n * @param getAccessToken - a function that produces a promise of an access\n * token that may fail by returning null\n * @param retryIntervalInMs - the time (in milliseconds) to wait between retry\n * attempts\n * @param timeoutInMs - the timestamp after which the refresh attempt will fail,\n * throwing an exception\n * @returns - a promise that, if it resolves, will resolve with an access token\n */\nasync function bearerTokenAuthenticationPolicy_beginRefresh(getAccessToken, retryIntervalInMs, timeoutInMs) {\n // This wrapper handles exceptions gracefully as long as we haven\'t exceeded\n // the timeout.\n async function tryGetAccessToken() {\n if (Date.now() < timeoutInMs) {\n try {\n return await getAccessToken();\n }\n catch (_a) {\n return null;\n }\n }\n else {\n const finalToken = await getAccessToken();\n // Timeout is up, so throw if it\'s still null\n if (finalToken === null) {\n throw new Error("Failed to refresh access token.");\n }\n return finalToken;\n }\n }\n let token = await tryGetAccessToken();\n while (token === null) {\n await delay_delay(retryIntervalInMs);\n token = await tryGetAccessToken();\n }\n return token;\n}\n/**\n * Creates a token cycler from a credential, scopes, and optional settings.\n *\n * A token cycler represents a way to reliably retrieve a valid access token\n * from a TokenCredential. It will handle initializing the token, refreshing it\n * when it nears expiration, and synchronizes refresh attempts to avoid\n * concurrency hazards.\n *\n * @param credential - the underlying TokenCredential that provides the access\n * token\n * @param scopes - the scopes to request authorization for\n * @param tokenCyclerOptions - optionally override default settings for the cycler\n *\n * @returns - a function that reliably produces a valid access token\n */\nfunction bearerTokenAuthenticationPolicy_createTokenCycler(credential, scopes, tokenCyclerOptions) {\n let refreshWorker = null;\n let token = null;\n const options = Object.assign(Object.assign({}, bearerTokenAuthenticationPolicy_DEFAULT_CYCLER_OPTIONS), tokenCyclerOptions);\n /**\n * This little holder defines several predicates that we use to construct\n * the rules of refreshing the token.\n */\n const cycler = {\n /**\n * Produces true if a refresh job is currently in progress.\n */\n get isRefreshing() {\n return refreshWorker !== null;\n },\n /**\n * Produces true if the cycler SHOULD refresh (we are within the refresh\n * window and not already refreshing)\n */\n get shouldRefresh() {\n var _a;\n return (!cycler.isRefreshing &&\n ((_a = token === null || token === void 0 ? void 0 : token.expiresOnTimestamp) !== null && _a !== void 0 ? _a : 0) - options.refreshWindowInMs < Date.now());\n },\n /**\n * Produces true if the cycler MUST refresh (null or nearly-expired\n * token).\n */\n get mustRefresh() {\n return (token === null || token.expiresOnTimestamp - options.forcedRefreshWindowInMs < Date.now());\n },\n };\n /**\n * Starts a refresh job or returns the existing job if one is already\n * running.\n */\n function refresh(getTokenOptions) {\n var _a;\n if (!cycler.isRefreshing) {\n // We bind `scopes` here to avoid passing it around a lot\n const tryGetAccessToken = () => credential.getToken(scopes, getTokenOptions);\n // Take advantage of promise chaining to insert an assignment to `token`\n // before the refresh can be considered done.\n refreshWorker = bearerTokenAuthenticationPolicy_beginRefresh(tryGetAccessToken, options.retryIntervalInMs, \n // If we don\'t have a token, then we should timeout immediately\n (_a = token === null || token === void 0 ? void 0 : token.expiresOnTimestamp) !== null && _a !== void 0 ? _a : Date.now())\n .then((_token) => {\n refreshWorker = null;\n token = _token;\n return token;\n })\n .catch((reason) => {\n // We also should reset the refresher if we enter a failed state. All\n // existing awaiters will throw, but subsequent requests will start a\n // new retry chain.\n refreshWorker = null;\n token = null;\n throw reason;\n });\n }\n return refreshWorker;\n }\n return async (tokenOptions) => {\n //\n // Simple rules:\n // - If we MUST refresh, then return the refresh task, blocking\n // the pipeline until a token is available.\n // - If we SHOULD refresh, then run refresh but don\'t return it\n // (we can still use the cached token).\n // - Return the token, since it\'s fine if we didn\'t return in\n // step 1.\n //\n if (cycler.mustRefresh)\n return refresh(tokenOptions);\n if (cycler.shouldRefresh) {\n refresh(tokenOptions);\n }\n return token;\n };\n}\n// #endregion\n/**\n * Creates a new factory for a RequestPolicy that applies a bearer token to\n * the requests\' `Authorization` headers.\n *\n * @param credential - The TokenCredential implementation that can supply the bearer token.\n * @param scopes - The scopes for which the bearer token applies.\n */\nfunction bearerTokenAuthenticationPolicy(credential, scopes) {\n // This simple function encapsulates the entire process of reliably retrieving the token\n const getToken = bearerTokenAuthenticationPolicy_createTokenCycler(credential, scopes /* , options */);\n class BearerTokenAuthenticationPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options) {\n super(nextPolicy, options);\n }\n async sendRequest(webResource) {\n if (!webResource.url.toLowerCase().startsWith("https://")) {\n throw new Error("Bearer token authentication is not permitted for non-TLS protected (non-https) URLs.");\n }\n const { token } = await getToken({\n abortSignal: webResource.abortSignal,\n tracingOptions: {\n tracingContext: webResource.tracingContext,\n },\n });\n webResource.headers.set(constants_Constants.HeaderConstants.AUTHORIZATION, `Bearer ${token}`);\n return this._nextPolicy.sendRequest(webResource);\n }\n }\n return {\n create: (nextPolicy, options) => {\n return new BearerTokenAuthenticationPolicy(nextPolicy, options);\n },\n };\n}\n//# sourceMappingURL=bearerTokenAuthenticationPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/httpClientCache.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nlet cachedHttpClient;\nfunction httpClientCache_getCachedDefaultHttpClient() {\n if (!cachedHttpClient) {\n cachedHttpClient = new NodeFetchHttpClient();\n }\n return cachedHttpClient;\n}\n//# sourceMappingURL=httpClientCache.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/rpRegistrationPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\nfunction rpRegistrationPolicy(retryTimeout = 30) {\n return {\n create: (nextPolicy, options) => {\n return new RPRegistrationPolicy(nextPolicy, options, retryTimeout);\n },\n };\n}\nclass RPRegistrationPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options, _retryTimeout = 30) {\n super(nextPolicy, options);\n this._retryTimeout = _retryTimeout;\n }\n sendRequest(request) {\n return this._nextPolicy\n .sendRequest(request.clone())\n .then((response) => registerIfNeeded(this, request, response));\n }\n}\nfunction registerIfNeeded(policy, request, response) {\n if (response.status === 409) {\n const rpName = checkRPNotRegisteredError(response.bodyAsText);\n if (rpName) {\n const urlPrefix = extractSubscriptionUrl(request.url);\n return (registerRP(policy, urlPrefix, rpName, request)\n // Autoregistration of ${provider} failed for some reason. We will not return this error\n // instead will return the initial response with 409 status code back to the user.\n // do nothing here as we are returning the original response at the end of this method.\n .catch(() => false)\n .then((registrationStatus) => {\n if (registrationStatus) {\n // Retry the original request. We have to change the x-ms-client-request-id\n // otherwise Azure endpoint will return the initial 409 (cached) response.\n request.headers.set("x-ms-client-request-id", generateUuid());\n return policy._nextPolicy.sendRequest(request.clone());\n }\n return response;\n }));\n }\n }\n return Promise.resolve(response);\n}\n/**\n * Reuses the headers of the original request and url (if specified).\n * @param originalRequest - The original request\n * @param reuseUrlToo - Should the url from the original request be reused as well. Default false.\n * @returns A new request object with desired headers.\n */\nfunction getRequestEssentials(originalRequest, reuseUrlToo = false) {\n const reqOptions = originalRequest.clone();\n if (reuseUrlToo) {\n reqOptions.url = originalRequest.url;\n }\n // We have to change the x-ms-client-request-id otherwise Azure endpoint\n // will return the initial 409 (cached) response.\n reqOptions.headers.set("x-ms-client-request-id", generateUuid());\n // Set content-type to application/json\n reqOptions.headers.set("Content-Type", "application/json; charset=utf-8");\n return reqOptions;\n}\n/**\n * Validates the error code and message associated with 409 response status code. If it matches to that of\n * RP not registered then it returns the name of the RP else returns undefined.\n * @param body - The response body received after making the original request.\n * @returns The name of the RP if condition is satisfied else undefined.\n */\nfunction checkRPNotRegisteredError(body) {\n let result, responseBody;\n if (body) {\n try {\n responseBody = JSON.parse(body);\n }\n catch (err) {\n // do nothing;\n }\n if (responseBody &&\n responseBody.error &&\n responseBody.error.message &&\n responseBody.error.code &&\n responseBody.error.code === "MissingSubscriptionRegistration") {\n const matchRes = responseBody.error.message.match(/.*\'(.*)\'/i);\n if (matchRes) {\n result = matchRes.pop();\n }\n }\n }\n return result;\n}\n/**\n * Extracts the first part of the URL, just after subscription:\n * https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/\n * @param url - The original request url\n * @returns The url prefix as explained above.\n */\nfunction extractSubscriptionUrl(url) {\n let result;\n const matchRes = url.match(/.*\\/subscriptions\\/[a-f0-9-]+\\//gi);\n if (matchRes && matchRes[0]) {\n result = matchRes[0];\n }\n else {\n throw new Error(`Unable to extract subscriptionId from the given url - ${url}.`);\n }\n return result;\n}\n/**\n * Registers the given provider.\n * @param policy - The RPRegistrationPolicy this function is being called against.\n * @param urlPrefix - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/\n * @param provider - The provider name to be registered.\n * @param originalRequest - The original request sent by the user that returned a 409 response\n * with a message that the provider is not registered.\n */\nasync function registerRP(policy, urlPrefix, provider, originalRequest) {\n const postUrl = `${urlPrefix}providers/${provider}/register?api-version=2016-02-01`;\n const getUrl = `${urlPrefix}providers/${provider}?api-version=2016-02-01`;\n const reqOptions = getRequestEssentials(originalRequest);\n reqOptions.method = "POST";\n reqOptions.url = postUrl;\n const response = await policy._nextPolicy.sendRequest(reqOptions);\n if (response.status !== 200) {\n throw new Error(`Autoregistration of ${provider} failed. Please try registering manually.`);\n }\n return getRegistrationStatus(policy, getUrl, originalRequest);\n}\n/**\n * Polls the registration status of the provider that was registered. Polling happens at an interval of 30 seconds.\n * Polling will happen till the registrationState property of the response body is "Registered".\n * @param policy - The RPRegistrationPolicy this function is being called against.\n * @param url - The request url for polling\n * @param originalRequest - The original request sent by the user that returned a 409 response\n * with a message that the provider is not registered.\n * @returns True if RP Registration is successful.\n */\nasync function getRegistrationStatus(policy, url, originalRequest) {\n const reqOptions = getRequestEssentials(originalRequest);\n reqOptions.url = url;\n reqOptions.method = "GET";\n const res = await policy._nextPolicy.sendRequest(reqOptions);\n const obj = res.parsedBody;\n if (res.parsedBody && obj.registrationState && obj.registrationState === "Registered") {\n return true;\n }\n else {\n await delay_delay(policy._retryTimeout * 1000);\n return getRegistrationStatus(policy, url, originalRequest);\n }\n}\n//# sourceMappingURL=rpRegistrationPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/signingPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Creates a policy that signs outgoing requests by calling to the provided `authenticationProvider`\'s `signRequest` method.\n * @param authenticationProvider - The authentication provider.\n * @returns An instance of the {@link SigningPolicy}.\n */\nfunction signingPolicy(authenticationProvider) {\n return {\n create: (nextPolicy, options) => {\n return new SigningPolicy(nextPolicy, options, authenticationProvider);\n },\n };\n}\n/**\n * A policy that signs outgoing requests by calling to the provided `authenticationProvider`\'s `signRequest` method.\n */\nclass SigningPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options, authenticationProvider) {\n super(nextPolicy, options);\n this.authenticationProvider = authenticationProvider;\n }\n signRequest(request) {\n return this.authenticationProvider.signRequest(request);\n }\n sendRequest(request) {\n return this.signRequest(request).then((nextRequest) => this._nextPolicy.sendRequest(nextRequest));\n }\n}\n//# sourceMappingURL=signingPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/systemErrorRetryPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n/**\n * A policy that retries when there\'s a system error, identified by the codes "ETIMEDOUT", "ESOCKETTIMEDOUT", "ECONNREFUSED", "ECONNRESET" or "ENOENT".\n * @param retryCount - Maximum number of retries.\n * @param retryInterval - The client retry interval, in milliseconds.\n * @param minRetryInterval - The minimum retry interval, in milliseconds.\n * @param maxRetryInterval - The maximum retry interval, in milliseconds.\n * @returns An instance of the {@link SystemErrorRetryPolicy}\n */\nfunction systemErrorRetryPolicy_systemErrorRetryPolicy(retryCount, retryInterval, minRetryInterval, maxRetryInterval) {\n return {\n create: (nextPolicy, options) => {\n return new SystemErrorRetryPolicy(nextPolicy, options, retryCount, retryInterval, minRetryInterval, maxRetryInterval);\n },\n };\n}\n/**\n * A policy that retries when there\'s a system error, identified by the codes "ETIMEDOUT", "ESOCKETTIMEDOUT", "ECONNREFUSED", "ECONNRESET" or "ENOENT".\n * @param retryCount - The client retry count.\n * @param retryInterval - The client retry interval, in milliseconds.\n * @param minRetryInterval - The minimum retry interval, in milliseconds.\n * @param maxRetryInterval - The maximum retry interval, in milliseconds.\n */\nclass SystemErrorRetryPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options, retryCount, retryInterval, minRetryInterval, maxRetryInterval) {\n super(nextPolicy, options);\n this.retryCount = isNumber(retryCount) ? retryCount : DEFAULT_CLIENT_RETRY_COUNT;\n this.retryInterval = isNumber(retryInterval) ? retryInterval : DEFAULT_CLIENT_RETRY_INTERVAL;\n this.minRetryInterval = isNumber(minRetryInterval)\n ? minRetryInterval\n : DEFAULT_CLIENT_MIN_RETRY_INTERVAL;\n this.maxRetryInterval = isNumber(maxRetryInterval)\n ? maxRetryInterval\n : DEFAULT_CLIENT_MAX_RETRY_INTERVAL;\n }\n sendRequest(request) {\n return this._nextPolicy\n .sendRequest(request.clone())\n .catch((error) => systemErrorRetryPolicy_retry(this, request, error.response, error));\n }\n}\nasync function systemErrorRetryPolicy_retry(policy, request, operationResponse, err, retryData) {\n retryData = updateRetryData(policy, retryData, err);\n function shouldPolicyRetry(_response, error) {\n if (error &&\n error.code &&\n (error.code === "ETIMEDOUT" ||\n error.code === "ESOCKETTIMEDOUT" ||\n error.code === "ECONNREFUSED" ||\n error.code === "ECONNRESET" ||\n error.code === "ENOENT")) {\n return true;\n }\n return false;\n }\n if (shouldRetry(policy.retryCount, shouldPolicyRetry, retryData, operationResponse, err)) {\n // If previous operation ended with an error and the policy allows a retry, do that\n try {\n await delay_delay(retryData.retryInterval);\n return policy._nextPolicy.sendRequest(request.clone());\n }\n catch (nestedErr) {\n return systemErrorRetryPolicy_retry(policy, request, operationResponse, nestedErr, retryData);\n }\n }\n else {\n if (err) {\n // If the operation failed in the end, return all errors instead of just the last one\n return Promise.reject(retryData.error);\n }\n return operationResponse;\n }\n}\n//# sourceMappingURL=systemErrorRetryPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/util/throttlingRetryStrategy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * Maximum number of retries for the throttling retry policy\n */\nconst DEFAULT_CLIENT_MAX_RETRY_COUNT = 3;\n//# sourceMappingURL=throttlingRetryStrategy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/throttlingRetryPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\nconst StatusCodes = constants_Constants.HttpConstants.StatusCodes;\n/**\n * Creates a policy that re-sends the request if the response indicates the request failed because of throttling reasons.\n * For example, if the response contains a `Retry-After` header, it will retry sending the request based on the value of that header.\n *\n * To learn more, please refer to\n * https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-request-limits,\n * https://docs.microsoft.com/en-us/azure/azure-subscription-service-limits and\n * https://docs.microsoft.com/en-us/azure/virtual-machines/troubleshooting/troubleshooting-throttling-errors\n * @returns\n */\nfunction throttlingRetryPolicy_throttlingRetryPolicy() {\n return {\n create: (nextPolicy, options) => {\n return new ThrottlingRetryPolicy(nextPolicy, options);\n },\n };\n}\nconst throttlingRetryPolicy_StandardAbortMessage = "The operation was aborted.";\n/**\n * Creates a policy that re-sends the request if the response indicates the request failed because of throttling reasons.\n * For example, if the response contains a `Retry-After` header, it will retry sending the request based on the value of that header.\n *\n * To learn more, please refer to\n * https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-request-limits,\n * https://docs.microsoft.com/en-us/azure/azure-subscription-service-limits and\n * https://docs.microsoft.com/en-us/azure/virtual-machines/troubleshooting/troubleshooting-throttling-errors\n */\nclass ThrottlingRetryPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options, _handleResponse) {\n super(nextPolicy, options);\n this.numberOfRetries = 0;\n this._handleResponse = _handleResponse || this._defaultResponseHandler;\n }\n async sendRequest(httpRequest) {\n const response = await this._nextPolicy.sendRequest(httpRequest.clone());\n if (response.status !== StatusCodes.TooManyRequests &&\n response.status !== StatusCodes.ServiceUnavailable) {\n return response;\n }\n else {\n return this._handleResponse(httpRequest, response);\n }\n }\n async _defaultResponseHandler(httpRequest, httpResponse) {\n var _a;\n const retryAfterHeader = httpResponse.headers.get(constants_Constants.HeaderConstants.RETRY_AFTER);\n if (retryAfterHeader) {\n const delayInMs = ThrottlingRetryPolicy.parseRetryAfterHeader(retryAfterHeader);\n if (delayInMs) {\n this.numberOfRetries += 1;\n await delay_delay(delayInMs, {\n abortSignal: httpRequest.abortSignal,\n abortErrorMsg: throttlingRetryPolicy_StandardAbortMessage,\n });\n if ((_a = httpRequest.abortSignal) === null || _a === void 0 ? void 0 : _a.aborted) {\n throw new AbortError(throttlingRetryPolicy_StandardAbortMessage);\n }\n if (this.numberOfRetries < DEFAULT_CLIENT_MAX_RETRY_COUNT) {\n return this.sendRequest(httpRequest);\n }\n else {\n return this._nextPolicy.sendRequest(httpRequest);\n }\n }\n }\n return httpResponse;\n }\n static parseRetryAfterHeader(headerValue) {\n const retryAfterInSeconds = Number(headerValue);\n if (Number.isNaN(retryAfterInSeconds)) {\n return ThrottlingRetryPolicy.parseDateRetryAfterHeader(headerValue);\n }\n else {\n return retryAfterInSeconds * 1000;\n }\n }\n static parseDateRetryAfterHeader(headerValue) {\n try {\n const now = Date.now();\n const date = Date.parse(headerValue);\n const diff = date - now;\n return Number.isNaN(diff) ? undefined : diff;\n }\n catch (error) {\n return undefined;\n }\n }\n}\n//# sourceMappingURL=throttlingRetryPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/serviceClient.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * ServiceClient sends service requests and receives responses.\n */\nclass ServiceClient {\n /**\n * The ServiceClient constructor\n * @param credentials - The credentials used for authentication with the service.\n * @param options - The service client options that govern the behavior of the client.\n */\n constructor(credentials, \n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */\n options) {\n if (!options) {\n options = {};\n }\n this._withCredentials = options.withCredentials || false;\n this._httpClient = options.httpClient || httpClientCache_getCachedDefaultHttpClient();\n this._requestPolicyOptions = new RequestPolicyOptions(options.httpPipelineLogger);\n let requestPolicyFactories;\n if (Array.isArray(options.requestPolicyFactories)) {\n log_logger.info("ServiceClient: using custom request policies");\n requestPolicyFactories = options.requestPolicyFactories;\n }\n else {\n let authPolicyFactory = undefined;\n if (isTokenCredential(credentials)) {\n log_logger.info("ServiceClient: creating bearer token authentication policy from provided credentials");\n // Create a wrapped RequestPolicyFactory here so that we can provide the\n // correct scope to the BearerTokenAuthenticationPolicy at the first time\n // one is requested. This is needed because generated ServiceClient\n // implementations do not set baseUri until after ServiceClient\'s constructor\n // is finished, leaving baseUri empty at the time when it is needed to\n // build the correct scope name.\n const wrappedPolicyFactory = () => {\n let bearerTokenPolicyFactory = undefined;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const serviceClient = this;\n const serviceClientOptions = options;\n return {\n create(nextPolicy, createOptions) {\n const credentialScopes = getCredentialScopes(serviceClientOptions, serviceClient.baseUri);\n if (!credentialScopes) {\n throw new Error(`When using credential, the ServiceClient must contain a baseUri or a credentialScopes in ServiceClientOptions. Unable to create a bearerTokenAuthenticationPolicy`);\n }\n if (bearerTokenPolicyFactory === undefined || bearerTokenPolicyFactory === null) {\n bearerTokenPolicyFactory = bearerTokenAuthenticationPolicy(credentials, credentialScopes);\n }\n return bearerTokenPolicyFactory.create(nextPolicy, createOptions);\n },\n };\n };\n authPolicyFactory = wrappedPolicyFactory();\n }\n else if (credentials && typeof credentials.signRequest === "function") {\n log_logger.info("ServiceClient: creating signing policy from provided credentials");\n authPolicyFactory = signingPolicy(credentials);\n }\n else if (credentials !== undefined && credentials !== null) {\n throw new Error("The credentials argument must implement the TokenCredential interface");\n }\n log_logger.info("ServiceClient: using default request policies");\n requestPolicyFactories = createDefaultRequestPolicyFactories(authPolicyFactory, options);\n if (options.requestPolicyFactories) {\n // options.requestPolicyFactories can also be a function that manipulates\n // the default requestPolicyFactories array\n const newRequestPolicyFactories = options.requestPolicyFactories(requestPolicyFactories);\n if (newRequestPolicyFactories) {\n requestPolicyFactories = newRequestPolicyFactories;\n }\n }\n }\n this._requestPolicyFactories = requestPolicyFactories;\n }\n /**\n * Send the provided httpRequest.\n */\n sendRequest(options) {\n if (options === null || options === undefined || typeof options !== "object") {\n throw new Error("options cannot be null or undefined and it must be of type object.");\n }\n let httpRequest;\n try {\n if (isWebResourceLike(options)) {\n options.validateRequestProperties();\n httpRequest = options;\n }\n else {\n httpRequest = new WebResource();\n httpRequest = httpRequest.prepare(options);\n }\n }\n catch (error) {\n return Promise.reject(error);\n }\n let httpPipeline = this._httpClient;\n if (this._requestPolicyFactories && this._requestPolicyFactories.length > 0) {\n for (let i = this._requestPolicyFactories.length - 1; i >= 0; --i) {\n httpPipeline = this._requestPolicyFactories[i].create(httpPipeline, this._requestPolicyOptions);\n }\n }\n return httpPipeline.sendRequest(httpRequest);\n }\n /**\n * Send an HTTP request that is populated using the provided OperationSpec.\n * @param operationArguments - The arguments that the HTTP request\'s templated values will be populated from.\n * @param operationSpec - The OperationSpec to use to populate the httpRequest.\n * @param callback - The callback to call when the response is received.\n */\n async sendOperationRequest(operationArguments, operationSpec, callback) {\n var _a;\n if (typeof operationArguments.options === "function") {\n callback = operationArguments.options;\n operationArguments.options = undefined;\n }\n const serializerOptions = (_a = operationArguments.options) === null || _a === void 0 ? void 0 : _a.serializerOptions;\n const httpRequest = new WebResource();\n let result;\n try {\n const baseUri = operationSpec.baseUrl || this.baseUri;\n if (!baseUri) {\n throw new Error("If operationSpec.baseUrl is not specified, then the ServiceClient must have a baseUri string property that contains the base URL to use.");\n }\n httpRequest.method = operationSpec.httpMethod;\n httpRequest.operationSpec = operationSpec;\n const requestUrl = URLBuilder.parse(baseUri);\n if (operationSpec.path) {\n requestUrl.appendPath(operationSpec.path);\n }\n if (operationSpec.urlParameters && operationSpec.urlParameters.length > 0) {\n for (const urlParameter of operationSpec.urlParameters) {\n let urlParameterValue = getOperationArgumentValueFromParameter(this, operationArguments, urlParameter, operationSpec.serializer);\n urlParameterValue = operationSpec.serializer.serialize(urlParameter.mapper, urlParameterValue, getPathStringFromParameter(urlParameter), serializerOptions);\n if (!urlParameter.skipEncoding) {\n urlParameterValue = encodeURIComponent(urlParameterValue);\n }\n requestUrl.replaceAll(`{${urlParameter.mapper.serializedName || getPathStringFromParameter(urlParameter)}}`, urlParameterValue);\n }\n }\n if (operationSpec.queryParameters && operationSpec.queryParameters.length > 0) {\n for (const queryParameter of operationSpec.queryParameters) {\n let queryParameterValue = getOperationArgumentValueFromParameter(this, operationArguments, queryParameter, operationSpec.serializer);\n if (queryParameterValue !== undefined && queryParameterValue !== null) {\n queryParameterValue = operationSpec.serializer.serialize(queryParameter.mapper, queryParameterValue, getPathStringFromParameter(queryParameter), serializerOptions);\n if (queryParameter.collectionFormat !== undefined &&\n queryParameter.collectionFormat !== null) {\n if (queryParameter.collectionFormat === QueryCollectionFormat.Multi) {\n if (queryParameterValue.length === 0) {\n // The collection is empty, no need to try serializing the current queryParam\n continue;\n }\n else {\n for (const index in queryParameterValue) {\n const item = queryParameterValue[index];\n queryParameterValue[index] =\n item === undefined || item === null ? "" : item.toString();\n }\n }\n }\n else if (queryParameter.collectionFormat === QueryCollectionFormat.Ssv ||\n queryParameter.collectionFormat === QueryCollectionFormat.Tsv) {\n queryParameterValue = queryParameterValue.join(queryParameter.collectionFormat);\n }\n }\n if (!queryParameter.skipEncoding) {\n if (Array.isArray(queryParameterValue)) {\n for (const index in queryParameterValue) {\n if (queryParameterValue[index] !== undefined &&\n queryParameterValue[index] !== null) {\n queryParameterValue[index] = encodeURIComponent(queryParameterValue[index]);\n }\n }\n }\n else {\n queryParameterValue = encodeURIComponent(queryParameterValue);\n }\n }\n if (queryParameter.collectionFormat !== undefined &&\n queryParameter.collectionFormat !== null &&\n queryParameter.collectionFormat !== QueryCollectionFormat.Multi &&\n queryParameter.collectionFormat !== QueryCollectionFormat.Ssv &&\n queryParameter.collectionFormat !== QueryCollectionFormat.Tsv) {\n queryParameterValue = queryParameterValue.join(queryParameter.collectionFormat);\n }\n requestUrl.setQueryParameter(queryParameter.mapper.serializedName || getPathStringFromParameter(queryParameter), queryParameterValue);\n }\n }\n }\n httpRequest.url = requestUrl.toString();\n const contentType = operationSpec.contentType || this.requestContentType;\n if (contentType && operationSpec.requestBody) {\n httpRequest.headers.set("Content-Type", contentType);\n }\n if (operationSpec.headerParameters) {\n for (const headerParameter of operationSpec.headerParameters) {\n let headerValue = getOperationArgumentValueFromParameter(this, operationArguments, headerParameter, operationSpec.serializer);\n if (headerValue !== undefined && headerValue !== null) {\n headerValue = operationSpec.serializer.serialize(headerParameter.mapper, headerValue, getPathStringFromParameter(headerParameter), serializerOptions);\n const headerCollectionPrefix = headerParameter.mapper\n .headerCollectionPrefix;\n if (headerCollectionPrefix) {\n for (const key of Object.keys(headerValue)) {\n httpRequest.headers.set(headerCollectionPrefix + key, headerValue[key]);\n }\n }\n else {\n httpRequest.headers.set(headerParameter.mapper.serializedName ||\n getPathStringFromParameter(headerParameter), headerValue);\n }\n }\n }\n }\n const options = operationArguments.options;\n if (options) {\n if (options.customHeaders) {\n for (const customHeaderName in options.customHeaders) {\n httpRequest.headers.set(customHeaderName, options.customHeaders[customHeaderName]);\n }\n }\n if (options.abortSignal) {\n httpRequest.abortSignal = options.abortSignal;\n }\n if (options.timeout) {\n httpRequest.timeout = options.timeout;\n }\n if (options.onUploadProgress) {\n httpRequest.onUploadProgress = options.onUploadProgress;\n }\n if (options.onDownloadProgress) {\n httpRequest.onDownloadProgress = options.onDownloadProgress;\n }\n if (options.spanOptions) {\n // By passing spanOptions if they exist at runtime, we\'re backwards compatible with @azure/core-tracing@preview.13 and earlier.\n httpRequest.spanOptions = options.spanOptions;\n }\n if (options.tracingContext) {\n httpRequest.tracingContext = options.tracingContext;\n }\n if (options.shouldDeserialize !== undefined && options.shouldDeserialize !== null) {\n httpRequest.shouldDeserialize = options.shouldDeserialize;\n }\n }\n httpRequest.withCredentials = this._withCredentials;\n serializeRequestBody(this, httpRequest, operationArguments, operationSpec);\n if (httpRequest.streamResponseStatusCodes === undefined) {\n httpRequest.streamResponseStatusCodes = getStreamResponseStatusCodes(operationSpec);\n }\n let rawResponse;\n let sendRequestError;\n try {\n rawResponse = await this.sendRequest(httpRequest);\n }\n catch (error) {\n sendRequestError = error;\n }\n if (sendRequestError) {\n if (sendRequestError.response) {\n sendRequestError.details = flattenResponse(sendRequestError.response, operationSpec.responses[sendRequestError.statusCode] ||\n operationSpec.responses["default"]);\n }\n result = Promise.reject(sendRequestError);\n }\n else {\n result = Promise.resolve(flattenResponse(rawResponse, operationSpec.responses[rawResponse.status]));\n }\n }\n catch (error) {\n result = Promise.reject(error);\n }\n const cb = callback;\n if (cb) {\n result\n .then((res) => cb(null, res._response.parsedBody, res._response.request, res._response))\n .catch((err) => cb(err));\n }\n return result;\n }\n}\nfunction serializeRequestBody(serviceClient, httpRequest, operationArguments, operationSpec) {\n var _a, _b, _c, _d, _e, _f;\n const serializerOptions = (_b = (_a = operationArguments.options) === null || _a === void 0 ? void 0 : _a.serializerOptions) !== null && _b !== void 0 ? _b : {};\n const updatedOptions = {\n rootName: (_c = serializerOptions.rootName) !== null && _c !== void 0 ? _c : "",\n includeRoot: (_d = serializerOptions.includeRoot) !== null && _d !== void 0 ? _d : false,\n xmlCharKey: (_e = serializerOptions.xmlCharKey) !== null && _e !== void 0 ? _e : XML_CHARKEY,\n };\n const xmlCharKey = serializerOptions.xmlCharKey;\n if (operationSpec.requestBody && operationSpec.requestBody.mapper) {\n httpRequest.body = getOperationArgumentValueFromParameter(serviceClient, operationArguments, operationSpec.requestBody, operationSpec.serializer);\n const bodyMapper = operationSpec.requestBody.mapper;\n const { required, xmlName, xmlElementName, serializedName, xmlNamespace, xmlNamespacePrefix } = bodyMapper;\n const typeName = bodyMapper.type.name;\n try {\n if ((httpRequest.body !== undefined && httpRequest.body !== null) || required) {\n const requestBodyParameterPathString = getPathStringFromParameter(operationSpec.requestBody);\n httpRequest.body = operationSpec.serializer.serialize(bodyMapper, httpRequest.body, requestBodyParameterPathString, updatedOptions);\n const isStream = typeName === MapperType.Stream;\n if (operationSpec.isXML) {\n const xmlnsKey = xmlNamespacePrefix ? `xmlns:${xmlNamespacePrefix}` : "xmlns";\n const value = getXmlValueWithNamespace(xmlNamespace, xmlnsKey, typeName, httpRequest.body, updatedOptions);\n if (typeName === MapperType.Sequence) {\n httpRequest.body = stringifyXML(prepareXMLRootList(value, xmlElementName || xmlName || serializedName, xmlnsKey, xmlNamespace), {\n rootName: xmlName || serializedName,\n xmlCharKey,\n });\n }\n else if (!isStream) {\n httpRequest.body = stringifyXML(value, {\n rootName: xmlName || serializedName,\n xmlCharKey,\n });\n }\n }\n else if (typeName === MapperType.String &&\n (((_f = operationSpec.contentType) === null || _f === void 0 ? void 0 : _f.match("text/plain")) || operationSpec.mediaType === "text")) {\n // the String serializer has validated that request body is a string\n // so just send the string.\n return;\n }\n else if (!isStream) {\n httpRequest.body = JSON.stringify(httpRequest.body);\n }\n }\n }\n catch (error) {\n throw new Error(`Error "${error.message}" occurred in serializing the payload - ${JSON.stringify(serializedName, undefined, " ")}.`);\n }\n }\n else if (operationSpec.formDataParameters && operationSpec.formDataParameters.length > 0) {\n httpRequest.formData = {};\n for (const formDataParameter of operationSpec.formDataParameters) {\n const formDataParameterValue = getOperationArgumentValueFromParameter(serviceClient, operationArguments, formDataParameter, operationSpec.serializer);\n if (formDataParameterValue !== undefined && formDataParameterValue !== null) {\n const formDataParameterPropertyName = formDataParameter.mapper.serializedName || getPathStringFromParameter(formDataParameter);\n httpRequest.formData[formDataParameterPropertyName] = operationSpec.serializer.serialize(formDataParameter.mapper, formDataParameterValue, getPathStringFromParameter(formDataParameter), updatedOptions);\n }\n }\n }\n}\n/**\n * Adds an xml namespace to the xml serialized object if needed, otherwise it just returns the value itself\n */\nfunction getXmlValueWithNamespace(xmlNamespace, xmlnsKey, typeName, serializedValue, options) {\n // Composite and Sequence schemas already got their root namespace set during serialization\n // We just need to add xmlns to the other schema types\n if (xmlNamespace && !["Composite", "Sequence", "Dictionary"].includes(typeName)) {\n const result = {};\n result[options.xmlCharKey] = serializedValue;\n result[XML_ATTRKEY] = { [xmlnsKey]: xmlNamespace };\n return result;\n }\n return serializedValue;\n}\nfunction getValueOrFunctionResult(value, defaultValueCreator) {\n let result;\n if (typeof value === "string") {\n result = value;\n }\n else {\n result = defaultValueCreator();\n if (typeof value === "function") {\n result = value(result);\n }\n }\n return result;\n}\nfunction createDefaultRequestPolicyFactories(authPolicyFactory, options) {\n const factories = [];\n if (options.generateClientRequestIdHeader) {\n factories.push(generateClientRequestIdPolicy_generateClientRequestIdPolicy(options.clientRequestIdHeaderName));\n }\n if (authPolicyFactory) {\n factories.push(authPolicyFactory);\n }\n const userAgentHeaderName = getValueOrFunctionResult(options.userAgentHeaderName, getDefaultUserAgentHeaderName);\n const userAgentHeaderValue = getValueOrFunctionResult(options.userAgent, userAgentPolicy_getDefaultUserAgentValue);\n if (userAgentHeaderName && userAgentHeaderValue) {\n factories.push(userAgentPolicy_userAgentPolicy({ key: userAgentHeaderName, value: userAgentHeaderValue }));\n }\n factories.push(redirectPolicy_redirectPolicy());\n factories.push(rpRegistrationPolicy(options.rpRegistrationRetryTimeout));\n if (!options.noRetryPolicy) {\n factories.push(exponentialRetryPolicy_exponentialRetryPolicy());\n factories.push(systemErrorRetryPolicy_systemErrorRetryPolicy());\n factories.push(throttlingRetryPolicy_throttlingRetryPolicy());\n }\n factories.push(deserializationPolicy_deserializationPolicy(options.deserializationContentTypes));\n if (checkEnvironment_isNode) {\n factories.push(proxyPolicy_proxyPolicy(options.proxySettings));\n }\n factories.push(logPolicy_logPolicy({ logger: log_logger.info }));\n return factories;\n}\n/**\n * Creates an HTTP pipeline based on the given options.\n * @param pipelineOptions - Defines options that are used to configure policies in the HTTP pipeline for an SDK client.\n * @param authPolicyFactory - An optional authentication policy factory to use for signing requests.\n * @returns A set of options that can be passed to create a new {@link ServiceClient}.\n */\nfunction createPipelineFromOptions(pipelineOptions, authPolicyFactory) {\n const requestPolicyFactories = [];\n if (pipelineOptions.sendStreamingJson) {\n requestPolicyFactories.push(ndJsonPolicy());\n }\n let userAgentValue = undefined;\n if (pipelineOptions.userAgentOptions && pipelineOptions.userAgentOptions.userAgentPrefix) {\n const userAgentInfo = [];\n userAgentInfo.push(pipelineOptions.userAgentOptions.userAgentPrefix);\n // Add the default user agent value if it isn\'t already specified\n // by the userAgentPrefix option.\n const defaultUserAgentInfo = getDefaultUserAgentValue();\n if (userAgentInfo.indexOf(defaultUserAgentInfo) === -1) {\n userAgentInfo.push(defaultUserAgentInfo);\n }\n userAgentValue = userAgentInfo.join(" ");\n }\n const keepAliveOptions = Object.assign(Object.assign({}, DefaultKeepAliveOptions), pipelineOptions.keepAliveOptions);\n const retryOptions = Object.assign(Object.assign({}, DefaultRetryOptions), pipelineOptions.retryOptions);\n const redirectOptions = Object.assign(Object.assign({}, DefaultRedirectOptions), pipelineOptions.redirectOptions);\n if (isNode) {\n requestPolicyFactories.push(proxyPolicy(pipelineOptions.proxyOptions));\n }\n const deserializationOptions = Object.assign(Object.assign({}, DefaultDeserializationOptions), pipelineOptions.deserializationOptions);\n const loggingOptions = Object.assign({}, pipelineOptions.loggingOptions);\n requestPolicyFactories.push(tracingPolicy({ userAgent: userAgentValue }), keepAlivePolicy(keepAliveOptions), userAgentPolicy({ value: userAgentValue }), generateClientRequestIdPolicy(), deserializationPolicy(deserializationOptions.expectedContentTypes), throttlingRetryPolicy(), systemErrorRetryPolicy(), exponentialRetryPolicy(retryOptions.maxRetries, retryOptions.retryDelayInMs, retryOptions.maxRetryDelayInMs));\n if (redirectOptions.handleRedirects) {\n requestPolicyFactories.push(redirectPolicy(redirectOptions.maxRetries));\n }\n if (authPolicyFactory) {\n requestPolicyFactories.push(authPolicyFactory);\n }\n requestPolicyFactories.push(logPolicy(loggingOptions));\n if (isNode && pipelineOptions.decompressResponse === false) {\n requestPolicyFactories.push(disableResponseDecompressionPolicy());\n }\n return {\n httpClient: pipelineOptions.httpClient,\n requestPolicyFactories,\n };\n}\n/**\n * Get the property parent for the property at the provided path when starting with the provided\n * parent object.\n */\nfunction getPropertyParent(parent, propertyPath) {\n if (parent && propertyPath) {\n const propertyPathLength = propertyPath.length;\n for (let i = 0; i < propertyPathLength - 1; ++i) {\n const propertyName = propertyPath[i];\n if (!parent[propertyName]) {\n parent[propertyName] = {};\n }\n parent = parent[propertyName];\n }\n }\n return parent;\n}\nfunction getOperationArgumentValueFromParameter(serviceClient, operationArguments, parameter, serializer) {\n return getOperationArgumentValueFromParameterPath(serviceClient, operationArguments, parameter.parameterPath, parameter.mapper, serializer);\n}\nfunction getOperationArgumentValueFromParameterPath(serviceClient, operationArguments, parameterPath, parameterMapper, serializer) {\n var _a;\n let value;\n if (typeof parameterPath === "string") {\n parameterPath = [parameterPath];\n }\n const serializerOptions = (_a = operationArguments.options) === null || _a === void 0 ? void 0 : _a.serializerOptions;\n if (Array.isArray(parameterPath)) {\n if (parameterPath.length > 0) {\n if (parameterMapper.isConstant) {\n value = parameterMapper.defaultValue;\n }\n else {\n let propertySearchResult = getPropertyFromParameterPath(operationArguments, parameterPath);\n if (!propertySearchResult.propertyFound) {\n propertySearchResult = getPropertyFromParameterPath(serviceClient, parameterPath);\n }\n let useDefaultValue = false;\n if (!propertySearchResult.propertyFound) {\n useDefaultValue =\n parameterMapper.required ||\n (parameterPath[0] === "options" && parameterPath.length === 2);\n }\n value = useDefaultValue ? parameterMapper.defaultValue : propertySearchResult.propertyValue;\n }\n // Serialize just for validation purposes.\n const parameterPathString = getPathStringFromParameterPath(parameterPath, parameterMapper);\n serializer.serialize(parameterMapper, value, parameterPathString, serializerOptions);\n }\n }\n else {\n if (parameterMapper.required) {\n value = {};\n }\n for (const propertyName in parameterPath) {\n const propertyMapper = parameterMapper.type.modelProperties[propertyName];\n const propertyPath = parameterPath[propertyName];\n const propertyValue = getOperationArgumentValueFromParameterPath(serviceClient, operationArguments, propertyPath, propertyMapper, serializer);\n // Serialize just for validation purposes.\n const propertyPathString = getPathStringFromParameterPath(propertyPath, propertyMapper);\n serializer.serialize(propertyMapper, propertyValue, propertyPathString, serializerOptions);\n if (propertyValue !== undefined && propertyValue !== null) {\n if (!value) {\n value = {};\n }\n value[propertyName] = propertyValue;\n }\n }\n }\n return value;\n}\nfunction getPropertyFromParameterPath(parent, parameterPath) {\n const result = { propertyFound: false };\n let i = 0;\n for (; i < parameterPath.length; ++i) {\n const parameterPathPart = parameterPath[i];\n // Make sure to check inherited properties too, so don\'t use hasOwnProperty().\n if (parent !== undefined && parent !== null && parameterPathPart in parent) {\n parent = parent[parameterPathPart];\n }\n else {\n break;\n }\n }\n if (i === parameterPath.length) {\n result.propertyValue = parent;\n result.propertyFound = true;\n }\n return result;\n}\n/**\n * Parses an {@link HttpOperationResponse} into a normalized HTTP response object ({@link RestResponse}).\n * @param _response - Wrapper object for http response.\n * @param responseSpec - Mappers for how to parse the response properties.\n * @returns - A normalized response object.\n */\nfunction flattenResponse(_response, responseSpec) {\n const parsedHeaders = _response.parsedHeaders;\n const bodyMapper = responseSpec && responseSpec.bodyMapper;\n const addOperationResponse = (obj) => {\n return Object.defineProperty(obj, "_response", {\n value: _response,\n });\n };\n if (bodyMapper) {\n const typeName = bodyMapper.type.name;\n if (typeName === "Stream") {\n return addOperationResponse(Object.assign(Object.assign({}, parsedHeaders), { blobBody: _response.blobBody, readableStreamBody: _response.readableStreamBody }));\n }\n const modelProperties = (typeName === "Composite" && bodyMapper.type.modelProperties) || {};\n const isPageableResponse = Object.keys(modelProperties).some((k) => modelProperties[k].serializedName === "");\n if (typeName === "Sequence" || isPageableResponse) {\n const arrayResponse = [...(_response.parsedBody || [])];\n for (const key of Object.keys(modelProperties)) {\n if (modelProperties[key].serializedName) {\n arrayResponse[key] = _response.parsedBody[key];\n }\n }\n if (parsedHeaders) {\n for (const key of Object.keys(parsedHeaders)) {\n arrayResponse[key] = parsedHeaders[key];\n }\n }\n addOperationResponse(arrayResponse);\n return arrayResponse;\n }\n if (typeName === "Composite" || typeName === "Dictionary") {\n return addOperationResponse(Object.assign(Object.assign({}, parsedHeaders), _response.parsedBody));\n }\n }\n if (bodyMapper ||\n _response.request.method === "HEAD" ||\n isPrimitiveType(_response.parsedBody)) {\n // primitive body types and HEAD booleans\n return addOperationResponse(Object.assign(Object.assign({}, parsedHeaders), { body: _response.parsedBody }));\n }\n return addOperationResponse(Object.assign(Object.assign({}, parsedHeaders), _response.parsedBody));\n}\nfunction getCredentialScopes(options, baseUri) {\n if (options === null || options === void 0 ? void 0 : options.credentialScopes) {\n return options.credentialScopes;\n }\n if (baseUri) {\n return `${baseUri}/.default`;\n }\n return undefined;\n}\n//# sourceMappingURL=serviceClient.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generated/src/storageClientContext.js\n/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\n\nconst packageName = "azure-storage-blob";\nconst packageVersion = "12.17.0";\nclass StorageClientContext extends ServiceClient {\n /**\n * Initializes a new instance of the StorageClientContext class.\n * @param url The URL of the service account, container, or blob that is the target of the desired\n * operation.\n * @param options The parameter options\n */\n constructor(url, options) {\n if (url === undefined) {\n throw new Error("\'url\' cannot be null");\n }\n // Initializing default values for options\n if (!options) {\n options = {};\n }\n if (!options.userAgent) {\n const defaultUserAgent = userAgentPolicy_getDefaultUserAgentValue();\n options.userAgent = `${packageName}/${packageVersion} ${defaultUserAgent}`;\n }\n super(undefined, options);\n this.requestContentType = "application/json; charset=utf-8";\n this.baseUri = options.endpoint || "{url}";\n // Parameter assignments\n this.url = url;\n // Assigning values to Constant parameters\n this.version = options.version || "2023-11-03";\n }\n}\n//# sourceMappingURL=storageClientContext.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/StorageClient.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n/**\n * A StorageClient represents a based URL class for {@link BlobServiceClient}, {@link ContainerClient}\n * and etc.\n */\nclass StorageClient {\n /**\n * Creates an instance of StorageClient.\n * @param url - url to resource\n * @param pipeline - request policy pipeline.\n */\n constructor(url, pipeline) {\n // URL should be encoded and only once, protocol layer shouldn\'t encode URL again\n this.url = escapeURLPath(url);\n this.accountName = getAccountNameFromUrl(url);\n this.pipeline = pipeline;\n this.storageClientContext = new StorageClientContext(this.url, pipeline.toServiceClientOptions());\n this.isHttps = iEqual(getURLScheme(this.url) || "", "https");\n this.credential = new AnonymousCredential();\n for (const factory of this.pipeline.factories) {\n if ((checkEnvironment_isNode && factory instanceof StorageSharedKeyCredential) ||\n factory instanceof AnonymousCredential) {\n this.credential = factory;\n }\n else if (isTokenCredential(factory.credential)) {\n // Only works if the factory has been attached a "credential" property.\n // We do that in newPipeline() when using TokenCredential.\n this.credential = factory.credential;\n }\n }\n // Override protocol layer\'s default content-type\n const storageClientContext = this.storageClientContext;\n storageClientContext.requestContentType = undefined;\n }\n}\n//# sourceMappingURL=StorageClient.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/utils/tracing.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Creates a span using the global tracer.\n * @internal\n */\nconst tracing_createSpan = createSpanFunction({\n packagePrefix: "Azure.Storage.Blob",\n namespace: "Microsoft.Storage",\n});\n/**\n * @internal\n *\n * Adapt the tracing options from OperationOptions to what they need to be for\n * RequestOptionsBase (when we update to later OpenTelemetry versions this is now\n * two separate fields, not just one).\n */\nfunction convertTracingToRequestOptionsBase(options) {\n var _a, _b;\n return {\n // By passing spanOptions if they exist at runtime, we\'re backwards compatible with @azure/core-tracing@preview.13 and earlier.\n spanOptions: (_a = options === null || options === void 0 ? void 0 : options.tracingOptions) === null || _a === void 0 ? void 0 : _a.spanOptions,\n tracingContext: (_b = options === null || options === void 0 ? void 0 : options.tracingOptions) === null || _b === void 0 ? void 0 : _b.tracingContext,\n };\n}\n//# sourceMappingURL=tracing.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/sas/BlobSASPermissions.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * This is a helper class to construct a string representing the permissions granted by a ServiceSAS to a blob. Setting\n * a value to true means that any SAS which uses these permissions will grant permissions for that operation. Once all\n * the values are set, this should be serialized with toString and set as the permissions field on a\n * {@link BlobSASSignatureValues} object. It is possible to construct the permissions string without this class, but\n * the order of the permissions is particular and this class guarantees correctness.\n */\nclass BlobSASPermissions {\n constructor() {\n /**\n * Specifies Read access granted.\n */\n this.read = false;\n /**\n * Specifies Add access granted.\n */\n this.add = false;\n /**\n * Specifies Create access granted.\n */\n this.create = false;\n /**\n * Specifies Write access granted.\n */\n this.write = false;\n /**\n * Specifies Delete access granted.\n */\n this.delete = false;\n /**\n * Specifies Delete version access granted.\n */\n this.deleteVersion = false;\n /**\n * Specfies Tag access granted.\n */\n this.tag = false;\n /**\n * Specifies Move access granted.\n */\n this.move = false;\n /**\n * Specifies Execute access granted.\n */\n this.execute = false;\n /**\n * Specifies SetImmutabilityPolicy access granted.\n */\n this.setImmutabilityPolicy = false;\n /**\n * Specifies that Permanent Delete is permitted.\n */\n this.permanentDelete = false;\n }\n /**\n * Creates a {@link BlobSASPermissions} from the specified permissions string. This method will throw an\n * Error if it encounters a character that does not correspond to a valid permission.\n *\n * @param permissions -\n */\n static parse(permissions) {\n const blobSASPermissions = new BlobSASPermissions();\n for (const char of permissions) {\n switch (char) {\n case "r":\n blobSASPermissions.read = true;\n break;\n case "a":\n blobSASPermissions.add = true;\n break;\n case "c":\n blobSASPermissions.create = true;\n break;\n case "w":\n blobSASPermissions.write = true;\n break;\n case "d":\n blobSASPermissions.delete = true;\n break;\n case "x":\n blobSASPermissions.deleteVersion = true;\n break;\n case "t":\n blobSASPermissions.tag = true;\n break;\n case "m":\n blobSASPermissions.move = true;\n break;\n case "e":\n blobSASPermissions.execute = true;\n break;\n case "i":\n blobSASPermissions.setImmutabilityPolicy = true;\n break;\n case "y":\n blobSASPermissions.permanentDelete = true;\n break;\n default:\n throw new RangeError(`Invalid permission: ${char}`);\n }\n }\n return blobSASPermissions;\n }\n /**\n * Creates a {@link BlobSASPermissions} from a raw object which contains same keys as it\n * and boolean values for them.\n *\n * @param permissionLike -\n */\n static from(permissionLike) {\n const blobSASPermissions = new BlobSASPermissions();\n if (permissionLike.read) {\n blobSASPermissions.read = true;\n }\n if (permissionLike.add) {\n blobSASPermissions.add = true;\n }\n if (permissionLike.create) {\n blobSASPermissions.create = true;\n }\n if (permissionLike.write) {\n blobSASPermissions.write = true;\n }\n if (permissionLike.delete) {\n blobSASPermissions.delete = true;\n }\n if (permissionLike.deleteVersion) {\n blobSASPermissions.deleteVersion = true;\n }\n if (permissionLike.tag) {\n blobSASPermissions.tag = true;\n }\n if (permissionLike.move) {\n blobSASPermissions.move = true;\n }\n if (permissionLike.execute) {\n blobSASPermissions.execute = true;\n }\n if (permissionLike.setImmutabilityPolicy) {\n blobSASPermissions.setImmutabilityPolicy = true;\n }\n if (permissionLike.permanentDelete) {\n blobSASPermissions.permanentDelete = true;\n }\n return blobSASPermissions;\n }\n /**\n * Converts the given permissions to a string. Using this method will guarantee the permissions are in an\n * order accepted by the service.\n *\n * @returns A string which represents the BlobSASPermissions\n */\n toString() {\n const permissions = [];\n if (this.read) {\n permissions.push("r");\n }\n if (this.add) {\n permissions.push("a");\n }\n if (this.create) {\n permissions.push("c");\n }\n if (this.write) {\n permissions.push("w");\n }\n if (this.delete) {\n permissions.push("d");\n }\n if (this.deleteVersion) {\n permissions.push("x");\n }\n if (this.tag) {\n permissions.push("t");\n }\n if (this.move) {\n permissions.push("m");\n }\n if (this.execute) {\n permissions.push("e");\n }\n if (this.setImmutabilityPolicy) {\n permissions.push("i");\n }\n if (this.permanentDelete) {\n permissions.push("y");\n }\n return permissions.join("");\n }\n}\n//# sourceMappingURL=BlobSASPermissions.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/sas/ContainerSASPermissions.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * This is a helper class to construct a string representing the permissions granted by a ServiceSAS to a container.\n * Setting a value to true means that any SAS which uses these permissions will grant permissions for that operation.\n * Once all the values are set, this should be serialized with toString and set as the permissions field on a\n * {@link BlobSASSignatureValues} object. It is possible to construct the permissions string without this class, but\n * the order of the permissions is particular and this class guarantees correctness.\n */\nclass ContainerSASPermissions {\n constructor() {\n /**\n * Specifies Read access granted.\n */\n this.read = false;\n /**\n * Specifies Add access granted.\n */\n this.add = false;\n /**\n * Specifies Create access granted.\n */\n this.create = false;\n /**\n * Specifies Write access granted.\n */\n this.write = false;\n /**\n * Specifies Delete access granted.\n */\n this.delete = false;\n /**\n * Specifies Delete version access granted.\n */\n this.deleteVersion = false;\n /**\n * Specifies List access granted.\n */\n this.list = false;\n /**\n * Specfies Tag access granted.\n */\n this.tag = false;\n /**\n * Specifies Move access granted.\n */\n this.move = false;\n /**\n * Specifies Execute access granted.\n */\n this.execute = false;\n /**\n * Specifies SetImmutabilityPolicy access granted.\n */\n this.setImmutabilityPolicy = false;\n /**\n * Specifies that Permanent Delete is permitted.\n */\n this.permanentDelete = false;\n /**\n * Specifies that Filter Blobs by Tags is permitted.\n */\n this.filterByTags = false;\n }\n /**\n * Creates an {@link ContainerSASPermissions} from the specified permissions string. This method will throw an\n * Error if it encounters a character that does not correspond to a valid permission.\n *\n * @param permissions -\n */\n static parse(permissions) {\n const containerSASPermissions = new ContainerSASPermissions();\n for (const char of permissions) {\n switch (char) {\n case "r":\n containerSASPermissions.read = true;\n break;\n case "a":\n containerSASPermissions.add = true;\n break;\n case "c":\n containerSASPermissions.create = true;\n break;\n case "w":\n containerSASPermissions.write = true;\n break;\n case "d":\n containerSASPermissions.delete = true;\n break;\n case "l":\n containerSASPermissions.list = true;\n break;\n case "t":\n containerSASPermissions.tag = true;\n break;\n case "x":\n containerSASPermissions.deleteVersion = true;\n break;\n case "m":\n containerSASPermissions.move = true;\n break;\n case "e":\n containerSASPermissions.execute = true;\n break;\n case "i":\n containerSASPermissions.setImmutabilityPolicy = true;\n break;\n case "y":\n containerSASPermissions.permanentDelete = true;\n break;\n case "f":\n containerSASPermissions.filterByTags = true;\n break;\n default:\n throw new RangeError(`Invalid permission ${char}`);\n }\n }\n return containerSASPermissions;\n }\n /**\n * Creates a {@link ContainerSASPermissions} from a raw object which contains same keys as it\n * and boolean values for them.\n *\n * @param permissionLike -\n */\n static from(permissionLike) {\n const containerSASPermissions = new ContainerSASPermissions();\n if (permissionLike.read) {\n containerSASPermissions.read = true;\n }\n if (permissionLike.add) {\n containerSASPermissions.add = true;\n }\n if (permissionLike.create) {\n containerSASPermissions.create = true;\n }\n if (permissionLike.write) {\n containerSASPermissions.write = true;\n }\n if (permissionLike.delete) {\n containerSASPermissions.delete = true;\n }\n if (permissionLike.list) {\n containerSASPermissions.list = true;\n }\n if (permissionLike.deleteVersion) {\n containerSASPermissions.deleteVersion = true;\n }\n if (permissionLike.tag) {\n containerSASPermissions.tag = true;\n }\n if (permissionLike.move) {\n containerSASPermissions.move = true;\n }\n if (permissionLike.execute) {\n containerSASPermissions.execute = true;\n }\n if (permissionLike.setImmutabilityPolicy) {\n containerSASPermissions.setImmutabilityPolicy = true;\n }\n if (permissionLike.permanentDelete) {\n containerSASPermissions.permanentDelete = true;\n }\n if (permissionLike.filterByTags) {\n containerSASPermissions.filterByTags = true;\n }\n return containerSASPermissions;\n }\n /**\n * Converts the given permissions to a string. Using this method will guarantee the permissions are in an\n * order accepted by the service.\n *\n * The order of the characters should be as specified here to ensure correctness.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas\n *\n */\n toString() {\n const permissions = [];\n if (this.read) {\n permissions.push("r");\n }\n if (this.add) {\n permissions.push("a");\n }\n if (this.create) {\n permissions.push("c");\n }\n if (this.write) {\n permissions.push("w");\n }\n if (this.delete) {\n permissions.push("d");\n }\n if (this.deleteVersion) {\n permissions.push("x");\n }\n if (this.list) {\n permissions.push("l");\n }\n if (this.tag) {\n permissions.push("t");\n }\n if (this.move) {\n permissions.push("m");\n }\n if (this.execute) {\n permissions.push("e");\n }\n if (this.setImmutabilityPolicy) {\n permissions.push("i");\n }\n if (this.permanentDelete) {\n permissions.push("y");\n }\n if (this.filterByTags) {\n permissions.push("f");\n }\n return permissions.join("");\n }\n}\n//# sourceMappingURL=ContainerSASPermissions.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/credentials/UserDelegationKeyCredential.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * UserDelegationKeyCredential is only used for generation of user delegation SAS.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas\n */\nclass UserDelegationKeyCredential {\n /**\n * Creates an instance of UserDelegationKeyCredential.\n * @param accountName -\n * @param userDelegationKey -\n */\n constructor(accountName, userDelegationKey) {\n this.accountName = accountName;\n this.userDelegationKey = userDelegationKey;\n this.key = Buffer.from(userDelegationKey.value, "base64");\n }\n /**\n * Generates a hash signature for an HTTP request or for a SAS.\n *\n * @param stringToSign -\n */\n computeHMACSHA256(stringToSign) {\n // console.log(`stringToSign: ${JSON.stringify(stringToSign)}`);\n return (0,external_crypto_.createHmac)("sha256", this.key).update(stringToSign, "utf8").digest("base64");\n }\n}\n//# sourceMappingURL=UserDelegationKeyCredential.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/sas/SasIPRange.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * Generate SasIPRange format string. For example:\n *\n * "8.8.8.8" or "1.1.1.1-255.255.255.255"\n *\n * @param ipRange -\n */\nfunction ipRangeToString(ipRange) {\n return ipRange.end ? `${ipRange.start}-${ipRange.end}` : ipRange.start;\n}\n//# sourceMappingURL=SasIPRange.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/sas/SASQueryParameters.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * Protocols for generated SAS.\n */\nvar SASProtocol;\n(function (SASProtocol) {\n /**\n * Protocol that allows HTTPS only\n */\n SASProtocol["Https"] = "https";\n /**\n * Protocol that allows both HTTPS and HTTP\n */\n SASProtocol["HttpsAndHttp"] = "https,http";\n})(SASProtocol || (SASProtocol = {}));\n/**\n * Represents the components that make up an Azure Storage SAS\' query parameters. This type is not constructed directly\n * by the user; it is only generated by the {@link AccountSASSignatureValues} and {@link BlobSASSignatureValues}\n * types. Once generated, it can be encoded into a {@link String} and appended to a URL directly (though caution should\n * be taken here in case there are existing query parameters, which might affect the appropriate means of appending\n * these query parameters).\n *\n * NOTE: Instances of this class are immutable.\n */\nclass SASQueryParameters {\n constructor(version, signature, permissionsOrOptions, services, resourceTypes, protocol, startsOn, expiresOn, ipRange, identifier, resource, cacheControl, contentDisposition, contentEncoding, contentLanguage, contentType, userDelegationKey, preauthorizedAgentObjectId, correlationId, encryptionScope) {\n this.version = version;\n this.signature = signature;\n if (permissionsOrOptions !== undefined && typeof permissionsOrOptions !== "string") {\n // SASQueryParametersOptions\n this.permissions = permissionsOrOptions.permissions;\n this.services = permissionsOrOptions.services;\n this.resourceTypes = permissionsOrOptions.resourceTypes;\n this.protocol = permissionsOrOptions.protocol;\n this.startsOn = permissionsOrOptions.startsOn;\n this.expiresOn = permissionsOrOptions.expiresOn;\n this.ipRangeInner = permissionsOrOptions.ipRange;\n this.identifier = permissionsOrOptions.identifier;\n this.encryptionScope = permissionsOrOptions.encryptionScope;\n this.resource = permissionsOrOptions.resource;\n this.cacheControl = permissionsOrOptions.cacheControl;\n this.contentDisposition = permissionsOrOptions.contentDisposition;\n this.contentEncoding = permissionsOrOptions.contentEncoding;\n this.contentLanguage = permissionsOrOptions.contentLanguage;\n this.contentType = permissionsOrOptions.contentType;\n if (permissionsOrOptions.userDelegationKey) {\n this.signedOid = permissionsOrOptions.userDelegationKey.signedObjectId;\n this.signedTenantId = permissionsOrOptions.userDelegationKey.signedTenantId;\n this.signedStartsOn = permissionsOrOptions.userDelegationKey.signedStartsOn;\n this.signedExpiresOn = permissionsOrOptions.userDelegationKey.signedExpiresOn;\n this.signedService = permissionsOrOptions.userDelegationKey.signedService;\n this.signedVersion = permissionsOrOptions.userDelegationKey.signedVersion;\n this.preauthorizedAgentObjectId = permissionsOrOptions.preauthorizedAgentObjectId;\n this.correlationId = permissionsOrOptions.correlationId;\n }\n }\n else {\n this.services = services;\n this.resourceTypes = resourceTypes;\n this.expiresOn = expiresOn;\n this.permissions = permissionsOrOptions;\n this.protocol = protocol;\n this.startsOn = startsOn;\n this.ipRangeInner = ipRange;\n this.encryptionScope = encryptionScope;\n this.identifier = identifier;\n this.resource = resource;\n this.cacheControl = cacheControl;\n this.contentDisposition = contentDisposition;\n this.contentEncoding = contentEncoding;\n this.contentLanguage = contentLanguage;\n this.contentType = contentType;\n if (userDelegationKey) {\n this.signedOid = userDelegationKey.signedObjectId;\n this.signedTenantId = userDelegationKey.signedTenantId;\n this.signedStartsOn = userDelegationKey.signedStartsOn;\n this.signedExpiresOn = userDelegationKey.signedExpiresOn;\n this.signedService = userDelegationKey.signedService;\n this.signedVersion = userDelegationKey.signedVersion;\n this.preauthorizedAgentObjectId = preauthorizedAgentObjectId;\n this.correlationId = correlationId;\n }\n }\n }\n /**\n * Optional. IP range allowed for this SAS.\n *\n * @readonly\n */\n get ipRange() {\n if (this.ipRangeInner) {\n return {\n end: this.ipRangeInner.end,\n start: this.ipRangeInner.start,\n };\n }\n return undefined;\n }\n /**\n * Encodes all SAS query parameters into a string that can be appended to a URL.\n *\n */\n toString() {\n const params = [\n "sv",\n "ss",\n "srt",\n "spr",\n "st",\n "se",\n "sip",\n "si",\n "ses",\n "skoid",\n "sktid",\n "skt",\n "ske",\n "sks",\n "skv",\n "sr",\n "sp",\n "sig",\n "rscc",\n "rscd",\n "rsce",\n "rscl",\n "rsct",\n "saoid",\n "scid",\n ];\n const queries = [];\n for (const param of params) {\n switch (param) {\n case "sv":\n this.tryAppendQueryParameter(queries, param, this.version);\n break;\n case "ss":\n this.tryAppendQueryParameter(queries, param, this.services);\n break;\n case "srt":\n this.tryAppendQueryParameter(queries, param, this.resourceTypes);\n break;\n case "spr":\n this.tryAppendQueryParameter(queries, param, this.protocol);\n break;\n case "st":\n this.tryAppendQueryParameter(queries, param, this.startsOn ? truncatedISO8061Date(this.startsOn, false) : undefined);\n break;\n case "se":\n this.tryAppendQueryParameter(queries, param, this.expiresOn ? truncatedISO8061Date(this.expiresOn, false) : undefined);\n break;\n case "sip":\n this.tryAppendQueryParameter(queries, param, this.ipRange ? ipRangeToString(this.ipRange) : undefined);\n break;\n case "si":\n this.tryAppendQueryParameter(queries, param, this.identifier);\n break;\n case "ses":\n this.tryAppendQueryParameter(queries, param, this.encryptionScope);\n break;\n case "skoid": // Signed object ID\n this.tryAppendQueryParameter(queries, param, this.signedOid);\n break;\n case "sktid": // Signed tenant ID\n this.tryAppendQueryParameter(queries, param, this.signedTenantId);\n break;\n case "skt": // Signed key start time\n this.tryAppendQueryParameter(queries, param, this.signedStartsOn ? truncatedISO8061Date(this.signedStartsOn, false) : undefined);\n break;\n case "ske": // Signed key expiry time\n this.tryAppendQueryParameter(queries, param, this.signedExpiresOn ? truncatedISO8061Date(this.signedExpiresOn, false) : undefined);\n break;\n case "sks": // Signed key service\n this.tryAppendQueryParameter(queries, param, this.signedService);\n break;\n case "skv": // Signed key version\n this.tryAppendQueryParameter(queries, param, this.signedVersion);\n break;\n case "sr":\n this.tryAppendQueryParameter(queries, param, this.resource);\n break;\n case "sp":\n this.tryAppendQueryParameter(queries, param, this.permissions);\n break;\n case "sig":\n this.tryAppendQueryParameter(queries, param, this.signature);\n break;\n case "rscc":\n this.tryAppendQueryParameter(queries, param, this.cacheControl);\n break;\n case "rscd":\n this.tryAppendQueryParameter(queries, param, this.contentDisposition);\n break;\n case "rsce":\n this.tryAppendQueryParameter(queries, param, this.contentEncoding);\n break;\n case "rscl":\n this.tryAppendQueryParameter(queries, param, this.contentLanguage);\n break;\n case "rsct":\n this.tryAppendQueryParameter(queries, param, this.contentType);\n break;\n case "saoid":\n this.tryAppendQueryParameter(queries, param, this.preauthorizedAgentObjectId);\n break;\n case "scid":\n this.tryAppendQueryParameter(queries, param, this.correlationId);\n break;\n }\n }\n return queries.join("&");\n }\n /**\n * A private helper method used to filter and append query key/value pairs into an array.\n *\n * @param queries -\n * @param key -\n * @param value -\n */\n tryAppendQueryParameter(queries, key, value) {\n if (!value) {\n return;\n }\n key = encodeURIComponent(key);\n value = encodeURIComponent(value);\n if (key.length > 0 && value.length > 0) {\n queries.push(`${key}=${value}`);\n }\n }\n}\n//# sourceMappingURL=SASQueryParameters.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/sas/BlobSASSignatureValues.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n\n\nfunction generateBlobSASQueryParameters(blobSASSignatureValues, sharedKeyCredentialOrUserDelegationKey, accountName) {\n const version = blobSASSignatureValues.version ? blobSASSignatureValues.version : SERVICE_VERSION;\n const sharedKeyCredential = sharedKeyCredentialOrUserDelegationKey instanceof StorageSharedKeyCredential\n ? sharedKeyCredentialOrUserDelegationKey\n : undefined;\n let userDelegationKeyCredential;\n if (sharedKeyCredential === undefined && accountName !== undefined) {\n userDelegationKeyCredential = new UserDelegationKeyCredential(accountName, sharedKeyCredentialOrUserDelegationKey);\n }\n if (sharedKeyCredential === undefined && userDelegationKeyCredential === undefined) {\n throw TypeError("Invalid sharedKeyCredential, userDelegationKey or accountName.");\n }\n // Version 2020-12-06 adds support for encryptionscope in SAS.\n if (version >= "2020-12-06") {\n if (sharedKeyCredential !== undefined) {\n return generateBlobSASQueryParameters20201206(blobSASSignatureValues, sharedKeyCredential);\n }\n else {\n return generateBlobSASQueryParametersUDK20201206(blobSASSignatureValues, userDelegationKeyCredential);\n }\n }\n // Version 2019-12-12 adds support for the blob tags permission.\n // Version 2018-11-09 adds support for the signed resource and signed blob snapshot time fields.\n // https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas#constructing-the-signature-string\n if (version >= "2018-11-09") {\n if (sharedKeyCredential !== undefined) {\n return generateBlobSASQueryParameters20181109(blobSASSignatureValues, sharedKeyCredential);\n }\n else {\n // Version 2020-02-10 delegation SAS signature construction includes preauthorizedAgentObjectId, agentObjectId, correlationId.\n if (version >= "2020-02-10") {\n return generateBlobSASQueryParametersUDK20200210(blobSASSignatureValues, userDelegationKeyCredential);\n }\n else {\n return generateBlobSASQueryParametersUDK20181109(blobSASSignatureValues, userDelegationKeyCredential);\n }\n }\n }\n if (version >= "2015-04-05") {\n if (sharedKeyCredential !== undefined) {\n return generateBlobSASQueryParameters20150405(blobSASSignatureValues, sharedKeyCredential);\n }\n else {\n throw new RangeError("\'version\' must be >= \'2018-11-09\' when generating user delegation SAS using user delegation key.");\n }\n }\n throw new RangeError("\'version\' must be >= \'2015-04-05\'.");\n}\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n * IMPLEMENTATION FOR API VERSION FROM 2015-04-05 AND BEFORE 2018-11-09.\n *\n * Creates an instance of SASQueryParameters.\n *\n * Only accepts required settings needed to create a SAS. For optional settings please\n * set corresponding properties directly, such as permissions, startsOn and identifier.\n *\n * WARNING: When identifier is not provided, permissions and expiresOn are required.\n * You MUST assign value to identifier or expiresOn & permissions manually if you initial with\n * this constructor.\n *\n * @param blobSASSignatureValues -\n * @param sharedKeyCredential -\n */\nfunction generateBlobSASQueryParameters20150405(blobSASSignatureValues, sharedKeyCredential) {\n blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);\n if (!blobSASSignatureValues.identifier &&\n !(blobSASSignatureValues.permissions && blobSASSignatureValues.expiresOn)) {\n throw new RangeError("Must provide \'permissions\' and \'expiresOn\' for Blob SAS generation when \'identifier\' is not provided.");\n }\n let resource = "c";\n if (blobSASSignatureValues.blobName) {\n resource = "b";\n }\n // Calling parse and toString guarantees the proper ordering and throws on invalid characters.\n let verifiedPermissions;\n if (blobSASSignatureValues.permissions) {\n if (blobSASSignatureValues.blobName) {\n verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n else {\n verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n }\n // Signature is generated on the un-url-encoded values.\n const stringToSign = [\n verifiedPermissions ? verifiedPermissions : "",\n blobSASSignatureValues.startsOn\n ? truncatedISO8061Date(blobSASSignatureValues.startsOn, false)\n : "",\n blobSASSignatureValues.expiresOn\n ? truncatedISO8061Date(blobSASSignatureValues.expiresOn, false)\n : "",\n getCanonicalName(sharedKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),\n blobSASSignatureValues.identifier,\n blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "",\n blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",\n blobSASSignatureValues.version,\n blobSASSignatureValues.cacheControl ? blobSASSignatureValues.cacheControl : "",\n blobSASSignatureValues.contentDisposition ? blobSASSignatureValues.contentDisposition : "",\n blobSASSignatureValues.contentEncoding ? blobSASSignatureValues.contentEncoding : "",\n blobSASSignatureValues.contentLanguage ? blobSASSignatureValues.contentLanguage : "",\n blobSASSignatureValues.contentType ? blobSASSignatureValues.contentType : "",\n ].join("\\n");\n const signature = sharedKeyCredential.computeHMACSHA256(stringToSign);\n return new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType);\n}\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n * IMPLEMENTATION FOR API VERSION FROM 2018-11-09.\n *\n * Creates an instance of SASQueryParameters.\n *\n * Only accepts required settings needed to create a SAS. For optional settings please\n * set corresponding properties directly, such as permissions, startsOn and identifier.\n *\n * WARNING: When identifier is not provided, permissions and expiresOn are required.\n * You MUST assign value to identifier or expiresOn & permissions manually if you initial with\n * this constructor.\n *\n * @param blobSASSignatureValues -\n * @param sharedKeyCredential -\n */\nfunction generateBlobSASQueryParameters20181109(blobSASSignatureValues, sharedKeyCredential) {\n blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);\n if (!blobSASSignatureValues.identifier &&\n !(blobSASSignatureValues.permissions && blobSASSignatureValues.expiresOn)) {\n throw new RangeError("Must provide \'permissions\' and \'expiresOn\' for Blob SAS generation when \'identifier\' is not provided.");\n }\n let resource = "c";\n let timestamp = blobSASSignatureValues.snapshotTime;\n if (blobSASSignatureValues.blobName) {\n resource = "b";\n if (blobSASSignatureValues.snapshotTime) {\n resource = "bs";\n }\n else if (blobSASSignatureValues.versionId) {\n resource = "bv";\n timestamp = blobSASSignatureValues.versionId;\n }\n }\n // Calling parse and toString guarantees the proper ordering and throws on invalid characters.\n let verifiedPermissions;\n if (blobSASSignatureValues.permissions) {\n if (blobSASSignatureValues.blobName) {\n verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n else {\n verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n }\n // Signature is generated on the un-url-encoded values.\n const stringToSign = [\n verifiedPermissions ? verifiedPermissions : "",\n blobSASSignatureValues.startsOn\n ? truncatedISO8061Date(blobSASSignatureValues.startsOn, false)\n : "",\n blobSASSignatureValues.expiresOn\n ? truncatedISO8061Date(blobSASSignatureValues.expiresOn, false)\n : "",\n getCanonicalName(sharedKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),\n blobSASSignatureValues.identifier,\n blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "",\n blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",\n blobSASSignatureValues.version,\n resource,\n timestamp,\n blobSASSignatureValues.cacheControl ? blobSASSignatureValues.cacheControl : "",\n blobSASSignatureValues.contentDisposition ? blobSASSignatureValues.contentDisposition : "",\n blobSASSignatureValues.contentEncoding ? blobSASSignatureValues.contentEncoding : "",\n blobSASSignatureValues.contentLanguage ? blobSASSignatureValues.contentLanguage : "",\n blobSASSignatureValues.contentType ? blobSASSignatureValues.contentType : "",\n ].join("\\n");\n const signature = sharedKeyCredential.computeHMACSHA256(stringToSign);\n return new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType);\n}\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n * IMPLEMENTATION FOR API VERSION FROM 2020-12-06.\n *\n * Creates an instance of SASQueryParameters.\n *\n * Only accepts required settings needed to create a SAS. For optional settings please\n * set corresponding properties directly, such as permissions, startsOn and identifier.\n *\n * WARNING: When identifier is not provided, permissions and expiresOn are required.\n * You MUST assign value to identifier or expiresOn & permissions manually if you initial with\n * this constructor.\n *\n * @param blobSASSignatureValues -\n * @param sharedKeyCredential -\n */\nfunction generateBlobSASQueryParameters20201206(blobSASSignatureValues, sharedKeyCredential) {\n blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);\n if (!blobSASSignatureValues.identifier &&\n !(blobSASSignatureValues.permissions && blobSASSignatureValues.expiresOn)) {\n throw new RangeError("Must provide \'permissions\' and \'expiresOn\' for Blob SAS generation when \'identifier\' is not provided.");\n }\n let resource = "c";\n let timestamp = blobSASSignatureValues.snapshotTime;\n if (blobSASSignatureValues.blobName) {\n resource = "b";\n if (blobSASSignatureValues.snapshotTime) {\n resource = "bs";\n }\n else if (blobSASSignatureValues.versionId) {\n resource = "bv";\n timestamp = blobSASSignatureValues.versionId;\n }\n }\n // Calling parse and toString guarantees the proper ordering and throws on invalid characters.\n let verifiedPermissions;\n if (blobSASSignatureValues.permissions) {\n if (blobSASSignatureValues.blobName) {\n verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n else {\n verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n }\n // Signature is generated on the un-url-encoded values.\n const stringToSign = [\n verifiedPermissions ? verifiedPermissions : "",\n blobSASSignatureValues.startsOn\n ? truncatedISO8061Date(blobSASSignatureValues.startsOn, false)\n : "",\n blobSASSignatureValues.expiresOn\n ? truncatedISO8061Date(blobSASSignatureValues.expiresOn, false)\n : "",\n getCanonicalName(sharedKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),\n blobSASSignatureValues.identifier,\n blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "",\n blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",\n blobSASSignatureValues.version,\n resource,\n timestamp,\n blobSASSignatureValues.encryptionScope,\n blobSASSignatureValues.cacheControl ? blobSASSignatureValues.cacheControl : "",\n blobSASSignatureValues.contentDisposition ? blobSASSignatureValues.contentDisposition : "",\n blobSASSignatureValues.contentEncoding ? blobSASSignatureValues.contentEncoding : "",\n blobSASSignatureValues.contentLanguage ? blobSASSignatureValues.contentLanguage : "",\n blobSASSignatureValues.contentType ? blobSASSignatureValues.contentType : "",\n ].join("\\n");\n const signature = sharedKeyCredential.computeHMACSHA256(stringToSign);\n return new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, undefined, undefined, undefined, blobSASSignatureValues.encryptionScope);\n}\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n * IMPLEMENTATION FOR API VERSION FROM 2018-11-09.\n *\n * Creates an instance of SASQueryParameters.\n *\n * Only accepts required settings needed to create a SAS. For optional settings please\n * set corresponding properties directly, such as permissions, startsOn.\n *\n * WARNING: identifier will be ignored, permissions and expiresOn are required.\n *\n * @param blobSASSignatureValues -\n * @param userDelegationKeyCredential -\n */\nfunction generateBlobSASQueryParametersUDK20181109(blobSASSignatureValues, userDelegationKeyCredential) {\n blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);\n // Stored access policies are not supported for a user delegation SAS.\n if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) {\n throw new RangeError("Must provide \'permissions\' and \'expiresOn\' for Blob SAS generation when generating user delegation SAS.");\n }\n let resource = "c";\n let timestamp = blobSASSignatureValues.snapshotTime;\n if (blobSASSignatureValues.blobName) {\n resource = "b";\n if (blobSASSignatureValues.snapshotTime) {\n resource = "bs";\n }\n else if (blobSASSignatureValues.versionId) {\n resource = "bv";\n timestamp = blobSASSignatureValues.versionId;\n }\n }\n // Calling parse and toString guarantees the proper ordering and throws on invalid characters.\n let verifiedPermissions;\n if (blobSASSignatureValues.permissions) {\n if (blobSASSignatureValues.blobName) {\n verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n else {\n verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n }\n // Signature is generated on the un-url-encoded values.\n const stringToSign = [\n verifiedPermissions ? verifiedPermissions : "",\n blobSASSignatureValues.startsOn\n ? truncatedISO8061Date(blobSASSignatureValues.startsOn, false)\n : "",\n blobSASSignatureValues.expiresOn\n ? truncatedISO8061Date(blobSASSignatureValues.expiresOn, false)\n : "",\n getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),\n userDelegationKeyCredential.userDelegationKey.signedObjectId,\n userDelegationKeyCredential.userDelegationKey.signedTenantId,\n userDelegationKeyCredential.userDelegationKey.signedStartsOn\n ? truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false)\n : "",\n userDelegationKeyCredential.userDelegationKey.signedExpiresOn\n ? truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false)\n : "",\n userDelegationKeyCredential.userDelegationKey.signedService,\n userDelegationKeyCredential.userDelegationKey.signedVersion,\n blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "",\n blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",\n blobSASSignatureValues.version,\n resource,\n timestamp,\n blobSASSignatureValues.cacheControl,\n blobSASSignatureValues.contentDisposition,\n blobSASSignatureValues.contentEncoding,\n blobSASSignatureValues.contentLanguage,\n blobSASSignatureValues.contentType,\n ].join("\\n");\n const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign);\n return new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey);\n}\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n * IMPLEMENTATION FOR API VERSION FROM 2020-02-10.\n *\n * Creates an instance of SASQueryParameters.\n *\n * Only accepts required settings needed to create a SAS. For optional settings please\n * set corresponding properties directly, such as permissions, startsOn.\n *\n * WARNING: identifier will be ignored, permissions and expiresOn are required.\n *\n * @param blobSASSignatureValues -\n * @param userDelegationKeyCredential -\n */\nfunction generateBlobSASQueryParametersUDK20200210(blobSASSignatureValues, userDelegationKeyCredential) {\n blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);\n // Stored access policies are not supported for a user delegation SAS.\n if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) {\n throw new RangeError("Must provide \'permissions\' and \'expiresOn\' for Blob SAS generation when generating user delegation SAS.");\n }\n let resource = "c";\n let timestamp = blobSASSignatureValues.snapshotTime;\n if (blobSASSignatureValues.blobName) {\n resource = "b";\n if (blobSASSignatureValues.snapshotTime) {\n resource = "bs";\n }\n else if (blobSASSignatureValues.versionId) {\n resource = "bv";\n timestamp = blobSASSignatureValues.versionId;\n }\n }\n // Calling parse and toString guarantees the proper ordering and throws on invalid characters.\n let verifiedPermissions;\n if (blobSASSignatureValues.permissions) {\n if (blobSASSignatureValues.blobName) {\n verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n else {\n verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n }\n // Signature is generated on the un-url-encoded values.\n const stringToSign = [\n verifiedPermissions ? verifiedPermissions : "",\n blobSASSignatureValues.startsOn\n ? truncatedISO8061Date(blobSASSignatureValues.startsOn, false)\n : "",\n blobSASSignatureValues.expiresOn\n ? truncatedISO8061Date(blobSASSignatureValues.expiresOn, false)\n : "",\n getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),\n userDelegationKeyCredential.userDelegationKey.signedObjectId,\n userDelegationKeyCredential.userDelegationKey.signedTenantId,\n userDelegationKeyCredential.userDelegationKey.signedStartsOn\n ? truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false)\n : "",\n userDelegationKeyCredential.userDelegationKey.signedExpiresOn\n ? truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false)\n : "",\n userDelegationKeyCredential.userDelegationKey.signedService,\n userDelegationKeyCredential.userDelegationKey.signedVersion,\n blobSASSignatureValues.preauthorizedAgentObjectId,\n undefined,\n blobSASSignatureValues.correlationId,\n blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "",\n blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",\n blobSASSignatureValues.version,\n resource,\n timestamp,\n blobSASSignatureValues.cacheControl,\n blobSASSignatureValues.contentDisposition,\n blobSASSignatureValues.contentEncoding,\n blobSASSignatureValues.contentLanguage,\n blobSASSignatureValues.contentType,\n ].join("\\n");\n const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign);\n return new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId);\n}\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n * IMPLEMENTATION FOR API VERSION FROM 2020-12-06.\n *\n * Creates an instance of SASQueryParameters.\n *\n * Only accepts required settings needed to create a SAS. For optional settings please\n * set corresponding properties directly, such as permissions, startsOn.\n *\n * WARNING: identifier will be ignored, permissions and expiresOn are required.\n *\n * @param blobSASSignatureValues -\n * @param userDelegationKeyCredential -\n */\nfunction generateBlobSASQueryParametersUDK20201206(blobSASSignatureValues, userDelegationKeyCredential) {\n blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);\n // Stored access policies are not supported for a user delegation SAS.\n if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) {\n throw new RangeError("Must provide \'permissions\' and \'expiresOn\' for Blob SAS generation when generating user delegation SAS.");\n }\n let resource = "c";\n let timestamp = blobSASSignatureValues.snapshotTime;\n if (blobSASSignatureValues.blobName) {\n resource = "b";\n if (blobSASSignatureValues.snapshotTime) {\n resource = "bs";\n }\n else if (blobSASSignatureValues.versionId) {\n resource = "bv";\n timestamp = blobSASSignatureValues.versionId;\n }\n }\n // Calling parse and toString guarantees the proper ordering and throws on invalid characters.\n let verifiedPermissions;\n if (blobSASSignatureValues.permissions) {\n if (blobSASSignatureValues.blobName) {\n verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n else {\n verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n }\n // Signature is generated on the un-url-encoded values.\n const stringToSign = [\n verifiedPermissions ? verifiedPermissions : "",\n blobSASSignatureValues.startsOn\n ? truncatedISO8061Date(blobSASSignatureValues.startsOn, false)\n : "",\n blobSASSignatureValues.expiresOn\n ? truncatedISO8061Date(blobSASSignatureValues.expiresOn, false)\n : "",\n getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),\n userDelegationKeyCredential.userDelegationKey.signedObjectId,\n userDelegationKeyCredential.userDelegationKey.signedTenantId,\n userDelegationKeyCredential.userDelegationKey.signedStartsOn\n ? truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false)\n : "",\n userDelegationKeyCredential.userDelegationKey.signedExpiresOn\n ? truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false)\n : "",\n userDelegationKeyCredential.userDelegationKey.signedService,\n userDelegationKeyCredential.userDelegationKey.signedVersion,\n blobSASSignatureValues.preauthorizedAgentObjectId,\n undefined,\n blobSASSignatureValues.correlationId,\n blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "",\n blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",\n blobSASSignatureValues.version,\n resource,\n timestamp,\n blobSASSignatureValues.encryptionScope,\n blobSASSignatureValues.cacheControl,\n blobSASSignatureValues.contentDisposition,\n blobSASSignatureValues.contentEncoding,\n blobSASSignatureValues.contentLanguage,\n blobSASSignatureValues.contentType,\n ].join("\\n");\n const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign);\n return new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId, blobSASSignatureValues.encryptionScope);\n}\nfunction getCanonicalName(accountName, containerName, blobName) {\n // Container: "/blob/account/containerName"\n // Blob: "/blob/account/containerName/blobName"\n const elements = [`/blob/${accountName}/${containerName}`];\n if (blobName) {\n elements.push(`/${blobName}`);\n }\n return elements.join("");\n}\nfunction SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues) {\n const version = blobSASSignatureValues.version ? blobSASSignatureValues.version : SERVICE_VERSION;\n if (blobSASSignatureValues.snapshotTime && version < "2018-11-09") {\n throw RangeError("\'version\' must be >= \'2018-11-09\' when providing \'snapshotTime\'.");\n }\n if (blobSASSignatureValues.blobName === undefined && blobSASSignatureValues.snapshotTime) {\n throw RangeError("Must provide \'blobName\' when providing \'snapshotTime\'.");\n }\n if (blobSASSignatureValues.versionId && version < "2019-10-10") {\n throw RangeError("\'version\' must be >= \'2019-10-10\' when providing \'versionId\'.");\n }\n if (blobSASSignatureValues.blobName === undefined && blobSASSignatureValues.versionId) {\n throw RangeError("Must provide \'blobName\' when providing \'versionId\'.");\n }\n if (blobSASSignatureValues.permissions &&\n blobSASSignatureValues.permissions.setImmutabilityPolicy &&\n version < "2020-08-04") {\n throw RangeError("\'version\' must be >= \'2020-08-04\' when provided \'i\' permission.");\n }\n if (blobSASSignatureValues.permissions &&\n blobSASSignatureValues.permissions.deleteVersion &&\n version < "2019-10-10") {\n throw RangeError("\'version\' must be >= \'2019-10-10\' when providing \'x\' permission.");\n }\n if (blobSASSignatureValues.permissions &&\n blobSASSignatureValues.permissions.permanentDelete &&\n version < "2019-10-10") {\n throw RangeError("\'version\' must be >= \'2019-10-10\' when providing \'y\' permission.");\n }\n if (blobSASSignatureValues.permissions &&\n blobSASSignatureValues.permissions.tag &&\n version < "2019-12-12") {\n throw RangeError("\'version\' must be >= \'2019-12-12\' when providing \'t\' permission.");\n }\n if (version < "2020-02-10" &&\n blobSASSignatureValues.permissions &&\n (blobSASSignatureValues.permissions.move || blobSASSignatureValues.permissions.execute)) {\n throw RangeError("\'version\' must be >= \'2020-02-10\' when providing the \'m\' or \'e\' permission.");\n }\n if (version < "2021-04-10" &&\n blobSASSignatureValues.permissions &&\n blobSASSignatureValues.permissions.filterByTags) {\n throw RangeError("\'version\' must be >= \'2021-04-10\' when providing the \'f\' permission.");\n }\n if (version < "2020-02-10" &&\n (blobSASSignatureValues.preauthorizedAgentObjectId || blobSASSignatureValues.correlationId)) {\n throw RangeError("\'version\' must be >= \'2020-02-10\' when providing \'preauthorizedAgentObjectId\' or \'correlationId\'.");\n }\n if (blobSASSignatureValues.encryptionScope && version < "2020-12-06") {\n throw RangeError("\'version\' must be >= \'2020-12-06\' when provided \'encryptionScope\' in SAS.");\n }\n blobSASSignatureValues.version = version;\n return blobSASSignatureValues;\n}\n//# sourceMappingURL=BlobSASSignatureValues.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generated/src/operations/blob.js\n/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\n\n\n\n/** Class representing a Blob. */\nclass blob_Blob {\n /**\n * Initialize a new instance of the class Blob class.\n * @param client Reference to the service client\n */\n constructor(client) {\n this.client = client;\n }\n /**\n * The Download operation reads or downloads a blob from the system, including its metadata and\n * properties. You can also call Download to read a snapshot.\n * @param options The options parameters.\n */\n download(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, downloadOperationSpec);\n }\n /**\n * The Get Properties operation returns all user-defined metadata, standard HTTP properties, and system\n * properties for the blob. It does not return the content of the blob.\n * @param options The options parameters.\n */\n getProperties(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, blob_getPropertiesOperationSpec);\n }\n /**\n * If the storage account\'s soft delete feature is disabled then, when a blob is deleted, it is\n * permanently removed from the storage account. If the storage account\'s soft delete feature is\n * enabled, then, when a blob is deleted, it is marked for deletion and becomes inaccessible\n * immediately. However, the blob service retains the blob or snapshot for the number of days specified\n * by the DeleteRetentionPolicy section of [Storage service properties]\n * (Set-Blob-Service-Properties.md). After the specified number of days has passed, the blob\'s data is\n * permanently removed from the storage account. Note that you continue to be charged for the\n * soft-deleted blob\'s storage until it is permanently removed. Use the List Blobs API and specify the\n * "include=deleted" query parameter to discover which blobs and snapshots have been soft deleted. You\n * can then use the Undelete Blob API to restore a soft-deleted blob. All other operations on a\n * soft-deleted blob or snapshot causes the service to return an HTTP status code of 404\n * (ResourceNotFound).\n * @param options The options parameters.\n */\n delete(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, blob_deleteOperationSpec);\n }\n /**\n * Undelete a blob that was previously soft deleted\n * @param options The options parameters.\n */\n undelete(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, undeleteOperationSpec);\n }\n /**\n * Sets the time a blob will expire and be deleted.\n * @param expiryOptions Required. Indicates mode of the expiry time\n * @param options The options parameters.\n */\n setExpiry(expiryOptions, options) {\n const operationArguments = {\n expiryOptions,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, setExpiryOperationSpec);\n }\n /**\n * The Set HTTP Headers operation sets system properties on the blob\n * @param options The options parameters.\n */\n setHttpHeaders(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, setHttpHeadersOperationSpec);\n }\n /**\n * The Set Immutability Policy operation sets the immutability policy on the blob\n * @param options The options parameters.\n */\n setImmutabilityPolicy(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, setImmutabilityPolicyOperationSpec);\n }\n /**\n * The Delete Immutability Policy operation deletes the immutability policy on the blob\n * @param options The options parameters.\n */\n deleteImmutabilityPolicy(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, deleteImmutabilityPolicyOperationSpec);\n }\n /**\n * The Set Legal Hold operation sets a legal hold on the blob.\n * @param legalHold Specified if a legal hold should be set on the blob.\n * @param options The options parameters.\n */\n setLegalHold(legalHold, options) {\n const operationArguments = {\n legalHold,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, setLegalHoldOperationSpec);\n }\n /**\n * The Set Blob Metadata operation sets user-defined metadata for the specified blob as one or more\n * name-value pairs\n * @param options The options parameters.\n */\n setMetadata(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, blob_setMetadataOperationSpec);\n }\n /**\n * [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete\n * operations\n * @param options The options parameters.\n */\n acquireLease(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, blob_acquireLeaseOperationSpec);\n }\n /**\n * [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete\n * operations\n * @param leaseId Specifies the current lease ID on the resource.\n * @param options The options parameters.\n */\n releaseLease(leaseId, options) {\n const operationArguments = {\n leaseId,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, blob_releaseLeaseOperationSpec);\n }\n /**\n * [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete\n * operations\n * @param leaseId Specifies the current lease ID on the resource.\n * @param options The options parameters.\n */\n renewLease(leaseId, options) {\n const operationArguments = {\n leaseId,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, blob_renewLeaseOperationSpec);\n }\n /**\n * [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete\n * operations\n * @param leaseId Specifies the current lease ID on the resource.\n * @param proposedLeaseId Proposed lease ID, in a GUID string format. The Blob service returns 400\n * (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor\n * (String) for a list of valid GUID string formats.\n * @param options The options parameters.\n */\n changeLease(leaseId, proposedLeaseId, options) {\n const operationArguments = {\n leaseId,\n proposedLeaseId,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, blob_changeLeaseOperationSpec);\n }\n /**\n * [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete\n * operations\n * @param options The options parameters.\n */\n breakLease(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, blob_breakLeaseOperationSpec);\n }\n /**\n * The Create Snapshot operation creates a read-only snapshot of a blob\n * @param options The options parameters.\n */\n createSnapshot(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, createSnapshotOperationSpec);\n }\n /**\n * The Start Copy From URL operation copies a blob or an internet resource to a new blob.\n * @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to\n * 2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would\n * appear in a request URI. The source blob must either be public or must be authenticated via a shared\n * access signature.\n * @param options The options parameters.\n */\n startCopyFromURL(copySource, options) {\n const operationArguments = {\n copySource,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, startCopyFromURLOperationSpec);\n }\n /**\n * The Copy From URL operation copies a blob or an internet resource to a new blob. It will not return\n * a response until the copy is complete.\n * @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to\n * 2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would\n * appear in a request URI. The source blob must either be public or must be authenticated via a shared\n * access signature.\n * @param options The options parameters.\n */\n copyFromURL(copySource, options) {\n const operationArguments = {\n copySource,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, copyFromURLOperationSpec);\n }\n /**\n * The Abort Copy From URL operation aborts a pending Copy From URL operation, and leaves a destination\n * blob with zero length and full metadata.\n * @param copyId The copy identifier provided in the x-ms-copy-id header of the original Copy Blob\n * operation.\n * @param options The options parameters.\n */\n abortCopyFromURL(copyId, options) {\n const operationArguments = {\n copyId,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, abortCopyFromURLOperationSpec);\n }\n /**\n * The Set Tier operation sets the tier on a blob. The operation is allowed on a page blob in a premium\n * storage account and on a block blob in a blob storage account (locally redundant storage only). A\n * premium page blob\'s tier determines the allowed size, IOPS, and bandwidth of the blob. A block\n * blob\'s tier determines Hot/Cool/Archive storage type. This operation does not update the blob\'s\n * ETag.\n * @param tier Indicates the tier to be set on the blob.\n * @param options The options parameters.\n */\n setTier(tier, options) {\n const operationArguments = {\n tier,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, setTierOperationSpec);\n }\n /**\n * Returns the sku name and account kind\n * @param options The options parameters.\n */\n getAccountInfo(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, blob_getAccountInfoOperationSpec);\n }\n /**\n * The Query operation enables users to select/project on blob data by providing simple query\n * expressions.\n * @param options The options parameters.\n */\n query(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, queryOperationSpec);\n }\n /**\n * The Get Tags operation enables users to get the tags associated with a blob.\n * @param options The options parameters.\n */\n getTags(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, getTagsOperationSpec);\n }\n /**\n * The Set Tags operation enables users to set tags on a blob.\n * @param options The options parameters.\n */\n setTags(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, setTagsOperationSpec);\n }\n}\n// Operation Specifications\nconst blob_xmlSerializer = new Serializer(mappers_namespaceObject, /* isXml */ true);\nconst downloadOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: {\n type: { name: "Stream" },\n serializedName: "parsedResponse"\n },\n headersMapper: BlobDownloadHeaders\n },\n 206: {\n bodyMapper: {\n type: { name: "Stream" },\n serializedName: "parsedResponse"\n },\n headersMapper: BlobDownloadHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobDownloadExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n snapshot,\n versionId\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n range,\n rangeGetContentMD5,\n rangeGetContentCRC64,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst blob_getPropertiesOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "HEAD",\n responses: {\n 200: {\n headersMapper: BlobGetPropertiesHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobGetPropertiesExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n snapshot,\n versionId\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst blob_deleteOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "DELETE",\n responses: {\n 202: {\n headersMapper: BlobDeleteHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobDeleteExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n snapshot,\n versionId,\n blobDeleteType\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n ifMatch,\n ifNoneMatch,\n ifTags,\n deleteSnapshots\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst undeleteOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: BlobUndeleteHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobUndeleteExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp8],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst setExpiryOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: BlobSetExpiryHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobSetExpiryExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp11],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n expiryOptions,\n expiresOn\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst setHttpHeadersOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: BlobSetHttpHeadersHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobSetHttpHeadersExceptionHeaders\n }\n },\n queryParameters: [comp, timeoutInSeconds],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n ifMatch,\n ifNoneMatch,\n ifTags,\n blobCacheControl,\n blobContentType,\n blobContentMD5,\n blobContentEncoding,\n blobContentLanguage,\n blobContentDisposition\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst setImmutabilityPolicyOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: BlobSetImmutabilityPolicyHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobSetImmutabilityPolicyExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp12],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifUnmodifiedSince,\n immutabilityPolicyExpiry,\n immutabilityPolicyMode\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst deleteImmutabilityPolicyOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "DELETE",\n responses: {\n 200: {\n headersMapper: BlobDeleteImmutabilityPolicyHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobDeleteImmutabilityPolicyExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp12],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst setLegalHoldOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: BlobSetLegalHoldHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobSetLegalHoldExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp13],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n legalHold\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst blob_setMetadataOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: BlobSetMetadataHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobSetMetadataExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp6],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n metadata,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n encryptionScope\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst blob_acquireLeaseOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: BlobAcquireLeaseHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobAcquireLeaseExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp10],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n action,\n duration,\n proposedLeaseId,\n ifMatch,\n ifNoneMatch,\n ifTags\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst blob_releaseLeaseOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: BlobReleaseLeaseHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobReleaseLeaseExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp10],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n action1,\n leaseId1,\n ifMatch,\n ifNoneMatch,\n ifTags\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst blob_renewLeaseOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: BlobRenewLeaseHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobRenewLeaseExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp10],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n leaseId1,\n action2,\n ifMatch,\n ifNoneMatch,\n ifTags\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst blob_changeLeaseOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: BlobChangeLeaseHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobChangeLeaseExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp10],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n leaseId1,\n action4,\n proposedLeaseId1,\n ifMatch,\n ifNoneMatch,\n ifTags\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst blob_breakLeaseOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 202: {\n headersMapper: BlobBreakLeaseHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobBreakLeaseExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp10],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n action3,\n breakPeriod,\n ifMatch,\n ifNoneMatch,\n ifTags\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst createSnapshotOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: BlobCreateSnapshotHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobCreateSnapshotExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp14],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n metadata,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n encryptionScope\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst startCopyFromURLOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 202: {\n headersMapper: BlobStartCopyFromURLHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobStartCopyFromURLExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n metadata,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n ifMatch,\n ifNoneMatch,\n ifTags,\n immutabilityPolicyExpiry,\n immutabilityPolicyMode,\n tier,\n rehydratePriority,\n sourceIfModifiedSince,\n sourceIfUnmodifiedSince,\n sourceIfMatch,\n sourceIfNoneMatch,\n sourceIfTags,\n copySource,\n blobTagsString,\n sealBlob,\n legalHold1\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst copyFromURLOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 202: {\n headersMapper: BlobCopyFromURLHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobCopyFromURLExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n metadata,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n ifMatch,\n ifNoneMatch,\n ifTags,\n immutabilityPolicyExpiry,\n immutabilityPolicyMode,\n encryptionScope,\n tier,\n sourceIfModifiedSince,\n sourceIfUnmodifiedSince,\n sourceIfMatch,\n sourceIfNoneMatch,\n copySource,\n blobTagsString,\n legalHold1,\n xMsRequiresSync,\n sourceContentMD5,\n copySourceAuthorization,\n copySourceTags\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst abortCopyFromURLOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 204: {\n headersMapper: BlobAbortCopyFromURLHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobAbortCopyFromURLExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n comp15,\n copyId\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n copyActionAbortConstant\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst setTierOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: BlobSetTierHeaders\n },\n 202: {\n headersMapper: BlobSetTierHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobSetTierExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n snapshot,\n versionId,\n comp16\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifTags,\n rehydratePriority,\n tier1\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst blob_getAccountInfoOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "GET",\n responses: {\n 200: {\n headersMapper: BlobGetAccountInfoHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobGetAccountInfoExceptionHeaders\n }\n },\n queryParameters: [comp, restype1],\n urlParameters: [url],\n headerParameters: [version, accept1],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst queryOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "POST",\n responses: {\n 200: {\n bodyMapper: {\n type: { name: "Stream" },\n serializedName: "parsedResponse"\n },\n headersMapper: BlobQueryHeaders\n },\n 206: {\n bodyMapper: {\n type: { name: "Stream" },\n serializedName: "parsedResponse"\n },\n headersMapper: BlobQueryHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobQueryExceptionHeaders\n }\n },\n requestBody: queryRequest,\n queryParameters: [\n timeoutInSeconds,\n snapshot,\n comp17\n ],\n urlParameters: [url],\n headerParameters: [\n contentType,\n accept,\n version,\n requestId,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags\n ],\n isXML: true,\n contentType: "application/xml; charset=utf-8",\n mediaType: "xml",\n serializer: blob_xmlSerializer\n};\nconst getTagsOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: BlobTags,\n headersMapper: BlobGetTagsHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobGetTagsExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n snapshot,\n versionId,\n comp18\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifTags\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst setTagsOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 204: {\n headersMapper: BlobSetTagsHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobSetTagsExceptionHeaders\n }\n },\n requestBody: tags,\n queryParameters: [\n timeoutInSeconds,\n versionId,\n comp18\n ],\n urlParameters: [url],\n headerParameters: [\n contentType,\n accept,\n version,\n requestId,\n leaseId,\n ifTags,\n transactionalContentMD5,\n transactionalContentCrc64\n ],\n isXML: true,\n contentType: "application/xml; charset=utf-8",\n mediaType: "xml",\n serializer: blob_xmlSerializer\n};\n//# sourceMappingURL=blob.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/BlobLeaseClient.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n/**\n * A client that manages leases for a {@link ContainerClient} or a {@link BlobClient}.\n */\nclass BlobLeaseClient {\n /**\n * Creates an instance of BlobLeaseClient.\n * @param client - The client to make the lease operation requests.\n * @param leaseId - Initial proposed lease id.\n */\n constructor(client, leaseId) {\n const clientContext = new StorageClientContext(client.url, client.pipeline.toServiceClientOptions());\n this._url = client.url;\n if (client.name === undefined) {\n this._isContainer = true;\n this._containerOrBlobOperation = new Container(clientContext);\n }\n else {\n this._isContainer = false;\n this._containerOrBlobOperation = new blob_Blob(clientContext);\n }\n if (!leaseId) {\n leaseId = generateUuid();\n }\n this._leaseId = leaseId;\n }\n /**\n * Gets the lease Id.\n *\n * @readonly\n */\n get leaseId() {\n return this._leaseId;\n }\n /**\n * Gets the url.\n *\n * @readonly\n */\n get url() {\n return this._url;\n }\n /**\n * Establishes and manages a lock on a container for delete operations, or on a blob\n * for write and delete operations.\n * The lock duration can be 15 to 60 seconds, or can be infinite.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-container\n * and\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-blob\n *\n * @param duration - Must be between 15 to 60 seconds, or infinite (-1)\n * @param options - option to configure lease management operations.\n * @returns Response data for acquire lease operation.\n */\n async acquireLease(duration, options = {}) {\n var _a, _b, _c, _d, _e, _f;\n const { span, updatedOptions } = tracing_createSpan("BlobLeaseClient-acquireLease", options);\n if (this._isContainer &&\n ((((_a = options.conditions) === null || _a === void 0 ? void 0 : _a.ifMatch) && ((_b = options.conditions) === null || _b === void 0 ? void 0 : _b.ifMatch) !== ETagNone) ||\n (((_c = options.conditions) === null || _c === void 0 ? void 0 : _c.ifNoneMatch) && ((_d = options.conditions) === null || _d === void 0 ? void 0 : _d.ifNoneMatch) !== ETagNone) ||\n ((_e = options.conditions) === null || _e === void 0 ? void 0 : _e.tagConditions))) {\n throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");\n }\n try {\n return await this._containerOrBlobOperation.acquireLease(Object.assign({ abortSignal: options.abortSignal, duration, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_f = options.conditions) === null || _f === void 0 ? void 0 : _f.tagConditions }), proposedLeaseId: this._leaseId }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * To change the ID of the lease.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-container\n * and\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-blob\n *\n * @param proposedLeaseId - the proposed new lease Id.\n * @param options - option to configure lease management operations.\n * @returns Response data for change lease operation.\n */\n async changeLease(proposedLeaseId, options = {}) {\n var _a, _b, _c, _d, _e, _f;\n const { span, updatedOptions } = tracing_createSpan("BlobLeaseClient-changeLease", options);\n if (this._isContainer &&\n ((((_a = options.conditions) === null || _a === void 0 ? void 0 : _a.ifMatch) && ((_b = options.conditions) === null || _b === void 0 ? void 0 : _b.ifMatch) !== ETagNone) ||\n (((_c = options.conditions) === null || _c === void 0 ? void 0 : _c.ifNoneMatch) && ((_d = options.conditions) === null || _d === void 0 ? void 0 : _d.ifNoneMatch) !== ETagNone) ||\n ((_e = options.conditions) === null || _e === void 0 ? void 0 : _e.tagConditions))) {\n throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");\n }\n try {\n const response = await this._containerOrBlobOperation.changeLease(this._leaseId, proposedLeaseId, Object.assign({ abortSignal: options.abortSignal, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_f = options.conditions) === null || _f === void 0 ? void 0 : _f.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));\n this._leaseId = proposedLeaseId;\n return response;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * To free the lease if it is no longer needed so that another client may\n * immediately acquire a lease against the container or the blob.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-container\n * and\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-blob\n *\n * @param options - option to configure lease management operations.\n * @returns Response data for release lease operation.\n */\n async releaseLease(options = {}) {\n var _a, _b, _c, _d, _e, _f;\n const { span, updatedOptions } = tracing_createSpan("BlobLeaseClient-releaseLease", options);\n if (this._isContainer &&\n ((((_a = options.conditions) === null || _a === void 0 ? void 0 : _a.ifMatch) && ((_b = options.conditions) === null || _b === void 0 ? void 0 : _b.ifMatch) !== ETagNone) ||\n (((_c = options.conditions) === null || _c === void 0 ? void 0 : _c.ifNoneMatch) && ((_d = options.conditions) === null || _d === void 0 ? void 0 : _d.ifNoneMatch) !== ETagNone) ||\n ((_e = options.conditions) === null || _e === void 0 ? void 0 : _e.tagConditions))) {\n throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");\n }\n try {\n return await this._containerOrBlobOperation.releaseLease(this._leaseId, Object.assign({ abortSignal: options.abortSignal, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_f = options.conditions) === null || _f === void 0 ? void 0 : _f.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * To renew the lease.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-container\n * and\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-blob\n *\n * @param options - Optional option to configure lease management operations.\n * @returns Response data for renew lease operation.\n */\n async renewLease(options = {}) {\n var _a, _b, _c, _d, _e, _f;\n const { span, updatedOptions } = tracing_createSpan("BlobLeaseClient-renewLease", options);\n if (this._isContainer &&\n ((((_a = options.conditions) === null || _a === void 0 ? void 0 : _a.ifMatch) && ((_b = options.conditions) === null || _b === void 0 ? void 0 : _b.ifMatch) !== ETagNone) ||\n (((_c = options.conditions) === null || _c === void 0 ? void 0 : _c.ifNoneMatch) && ((_d = options.conditions) === null || _d === void 0 ? void 0 : _d.ifNoneMatch) !== ETagNone) ||\n ((_e = options.conditions) === null || _e === void 0 ? void 0 : _e.tagConditions))) {\n throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");\n }\n try {\n return await this._containerOrBlobOperation.renewLease(this._leaseId, Object.assign({ abortSignal: options.abortSignal, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_f = options.conditions) === null || _f === void 0 ? void 0 : _f.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * To end the lease but ensure that another client cannot acquire a new lease\n * until the current lease period has expired.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-container\n * and\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-blob\n *\n * @param breakPeriod - Break period\n * @param options - Optional options to configure lease management operations.\n * @returns Response data for break lease operation.\n */\n async breakLease(breakPeriod, options = {}) {\n var _a, _b, _c, _d, _e, _f;\n const { span, updatedOptions } = tracing_createSpan("BlobLeaseClient-breakLease", options);\n if (this._isContainer &&\n ((((_a = options.conditions) === null || _a === void 0 ? void 0 : _a.ifMatch) && ((_b = options.conditions) === null || _b === void 0 ? void 0 : _b.ifMatch) !== ETagNone) ||\n (((_c = options.conditions) === null || _c === void 0 ? void 0 : _c.ifNoneMatch) && ((_d = options.conditions) === null || _d === void 0 ? void 0 : _d.ifNoneMatch) !== ETagNone) ||\n ((_e = options.conditions) === null || _e === void 0 ? void 0 : _e.tagConditions))) {\n throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");\n }\n try {\n const operationOptions = Object.assign({ abortSignal: options.abortSignal, breakPeriod, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_f = options.conditions) === null || _f === void 0 ? void 0 : _f.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions));\n return await this._containerOrBlobOperation.breakLease(operationOptions);\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n}\n//# sourceMappingURL=BlobLeaseClient.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/utils/RetriableReadableStream.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * A Node.js ReadableStream will internally retry when internal ReadableStream unexpected ends.\n */\nclass RetriableReadableStream extends external_stream_.Readable {\n /**\n * Creates an instance of RetriableReadableStream.\n *\n * @param source - The current ReadableStream returned from getter\n * @param getter - A method calling downloading request returning\n * a new ReadableStream from specified offset\n * @param offset - Offset position in original data source to read\n * @param count - How much data in original data source to read\n * @param options -\n */\n constructor(source, getter, offset, count, options = {}) {\n super({ highWaterMark: options.highWaterMark });\n this.retries = 0;\n this.sourceDataHandler = (data) => {\n if (this.options.doInjectErrorOnce) {\n this.options.doInjectErrorOnce = undefined;\n this.source.pause();\n this.source.removeAllListeners("data");\n this.source.emit("end");\n return;\n }\n // console.log(\n // `Offset: ${this.offset}, Received ${data.length} from internal stream`\n // );\n this.offset += data.length;\n if (this.onProgress) {\n this.onProgress({ loadedBytes: this.offset - this.start });\n }\n if (!this.push(data)) {\n this.source.pause();\n }\n };\n this.sourceErrorOrEndHandler = (err) => {\n if (err && err.name === "AbortError") {\n this.destroy(err);\n return;\n }\n // console.log(\n // `Source stream emits end or error, offset: ${\n // this.offset\n // }, dest end : ${this.end}`\n // );\n this.removeSourceEventHandlers();\n if (this.offset - 1 === this.end) {\n this.push(null);\n }\n else if (this.offset <= this.end) {\n // console.log(\n // `retries: ${this.retries}, max retries: ${this.maxRetries}`\n // );\n if (this.retries < this.maxRetryRequests) {\n this.retries += 1;\n this.getter(this.offset)\n .then((newSource) => {\n this.source = newSource;\n this.setSourceEventHandlers();\n return;\n })\n .catch((error) => {\n this.destroy(error);\n });\n }\n else {\n this.destroy(new Error(`Data corruption failure: received less data than required and reached maxRetires limitation. Received data offset: ${this.offset - 1}, data needed offset: ${this.end}, retries: ${this.retries}, max retries: ${this.maxRetryRequests}`));\n }\n }\n else {\n this.destroy(new Error(`Data corruption failure: Received more data than original request, data needed offset is ${this.end}, received offset: ${this.offset - 1}`));\n }\n };\n this.getter = getter;\n this.source = source;\n this.start = offset;\n this.offset = offset;\n this.end = offset + count - 1;\n this.maxRetryRequests =\n options.maxRetryRequests && options.maxRetryRequests >= 0 ? options.maxRetryRequests : 0;\n this.onProgress = options.onProgress;\n this.options = options;\n this.setSourceEventHandlers();\n }\n _read() {\n this.source.resume();\n }\n setSourceEventHandlers() {\n this.source.on("data", this.sourceDataHandler);\n this.source.on("end", this.sourceErrorOrEndHandler);\n this.source.on("error", this.sourceErrorOrEndHandler);\n }\n removeSourceEventHandlers() {\n this.source.removeListener("data", this.sourceDataHandler);\n this.source.removeListener("end", this.sourceErrorOrEndHandler);\n this.source.removeListener("error", this.sourceErrorOrEndHandler);\n }\n _destroy(error, callback) {\n // remove listener from source and release source\n this.removeSourceEventHandlers();\n this.source.destroy();\n callback(error === null ? undefined : error);\n }\n}\n//# sourceMappingURL=RetriableReadableStream.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/BlobDownloadResponse.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * BlobDownloadResponse implements BlobDownloadResponseParsed interface, and in Node.js runtime it will\n * automatically retry when internal read stream unexpected ends. (This kind of unexpected ends cannot\n * trigger retries defined in pipeline retry policy.)\n *\n * The {@link readableStreamBody} stream will retry underlayer, you can just use it as a normal Node.js\n * Readable stream.\n */\nclass BlobDownloadResponse {\n /**\n * Creates an instance of BlobDownloadResponse.\n *\n * @param originalResponse -\n * @param getter -\n * @param offset -\n * @param count -\n * @param options -\n */\n constructor(originalResponse, getter, offset, count, options = {}) {\n this.originalResponse = originalResponse;\n this.blobDownloadStream = new RetriableReadableStream(this.originalResponse.readableStreamBody, getter, offset, count, options);\n }\n /**\n * Indicates that the service supports\n * requests for partial file content.\n *\n * @readonly\n */\n get acceptRanges() {\n return this.originalResponse.acceptRanges;\n }\n /**\n * Returns if it was previously specified\n * for the file.\n *\n * @readonly\n */\n get cacheControl() {\n return this.originalResponse.cacheControl;\n }\n /**\n * Returns the value that was specified\n * for the \'x-ms-content-disposition\' header and specifies how to process the\n * response.\n *\n * @readonly\n */\n get contentDisposition() {\n return this.originalResponse.contentDisposition;\n }\n /**\n * Returns the value that was specified\n * for the Content-Encoding request header.\n *\n * @readonly\n */\n get contentEncoding() {\n return this.originalResponse.contentEncoding;\n }\n /**\n * Returns the value that was specified\n * for the Content-Language request header.\n *\n * @readonly\n */\n get contentLanguage() {\n return this.originalResponse.contentLanguage;\n }\n /**\n * The current sequence number for a\n * page blob. This header is not returned for block blobs or append blobs.\n *\n * @readonly\n */\n get blobSequenceNumber() {\n return this.originalResponse.blobSequenceNumber;\n }\n /**\n * The blob\'s type. Possible values include:\n * \'BlockBlob\', \'PageBlob\', \'AppendBlob\'.\n *\n * @readonly\n */\n get blobType() {\n return this.originalResponse.blobType;\n }\n /**\n * The number of bytes present in the\n * response body.\n *\n * @readonly\n */\n get contentLength() {\n return this.originalResponse.contentLength;\n }\n /**\n * If the file has an MD5 hash and the\n * request is to read the full file, this response header is returned so that\n * the client can check for message content integrity. If the request is to\n * read a specified range and the \'x-ms-range-get-content-md5\' is set to\n * true, then the request returns an MD5 hash for the range, as long as the\n * range size is less than or equal to 4 MB. If neither of these sets of\n * conditions is true, then no value is returned for the \'Content-MD5\'\n * header.\n *\n * @readonly\n */\n get contentMD5() {\n return this.originalResponse.contentMD5;\n }\n /**\n * Indicates the range of bytes returned if\n * the client requested a subset of the file by setting the Range request\n * header.\n *\n * @readonly\n */\n get contentRange() {\n return this.originalResponse.contentRange;\n }\n /**\n * The content type specified for the file.\n * The default content type is \'application/octet-stream\'\n *\n * @readonly\n */\n get contentType() {\n return this.originalResponse.contentType;\n }\n /**\n * Conclusion time of the last attempted\n * Copy File operation where this file was the destination file. This value\n * can specify the time of a completed, aborted, or failed copy attempt.\n *\n * @readonly\n */\n get copyCompletedOn() {\n return this.originalResponse.copyCompletedOn;\n }\n /**\n * String identifier for the last attempted Copy\n * File operation where this file was the destination file.\n *\n * @readonly\n */\n get copyId() {\n return this.originalResponse.copyId;\n }\n /**\n * Contains the number of bytes copied and\n * the total bytes in the source in the last attempted Copy File operation\n * where this file was the destination file. Can show between 0 and\n * Content-Length bytes copied.\n *\n * @readonly\n */\n get copyProgress() {\n return this.originalResponse.copyProgress;\n }\n /**\n * URL up to 2KB in length that specifies the\n * source file used in the last attempted Copy File operation where this file\n * was the destination file.\n *\n * @readonly\n */\n get copySource() {\n return this.originalResponse.copySource;\n }\n /**\n * State of the copy operation\n * identified by \'x-ms-copy-id\'. Possible values include: \'pending\',\n * \'success\', \'aborted\', \'failed\'\n *\n * @readonly\n */\n get copyStatus() {\n return this.originalResponse.copyStatus;\n }\n /**\n * Only appears when\n * x-ms-copy-status is failed or pending. Describes cause of fatal or\n * non-fatal copy operation failure.\n *\n * @readonly\n */\n get copyStatusDescription() {\n return this.originalResponse.copyStatusDescription;\n }\n /**\n * When a blob is leased,\n * specifies whether the lease is of infinite or fixed duration. Possible\n * values include: \'infinite\', \'fixed\'.\n *\n * @readonly\n */\n get leaseDuration() {\n return this.originalResponse.leaseDuration;\n }\n /**\n * Lease state of the blob. Possible\n * values include: \'available\', \'leased\', \'expired\', \'breaking\', \'broken\'.\n *\n * @readonly\n */\n get leaseState() {\n return this.originalResponse.leaseState;\n }\n /**\n * The current lease status of the\n * blob. Possible values include: \'locked\', \'unlocked\'.\n *\n * @readonly\n */\n get leaseStatus() {\n return this.originalResponse.leaseStatus;\n }\n /**\n * A UTC date/time value generated by the service that\n * indicates the time at which the response was initiated.\n *\n * @readonly\n */\n get date() {\n return this.originalResponse.date;\n }\n /**\n * The number of committed blocks\n * present in the blob. This header is returned only for append blobs.\n *\n * @readonly\n */\n get blobCommittedBlockCount() {\n return this.originalResponse.blobCommittedBlockCount;\n }\n /**\n * The ETag contains a value that you can use to\n * perform operations conditionally, in quotes.\n *\n * @readonly\n */\n get etag() {\n return this.originalResponse.etag;\n }\n /**\n * The number of tags associated with the blob\n *\n * @readonly\n */\n get tagCount() {\n return this.originalResponse.tagCount;\n }\n /**\n * The error code.\n *\n * @readonly\n */\n get errorCode() {\n return this.originalResponse.errorCode;\n }\n /**\n * The value of this header is set to\n * true if the file data and application metadata are completely encrypted\n * using the specified algorithm. Otherwise, the value is set to false (when\n * the file is unencrypted, or if only parts of the file/application metadata\n * are encrypted).\n *\n * @readonly\n */\n get isServerEncrypted() {\n return this.originalResponse.isServerEncrypted;\n }\n /**\n * If the blob has a MD5 hash, and if\n * request contains range header (Range or x-ms-range), this response header\n * is returned with the value of the whole blob\'s MD5 value. This value may\n * or may not be equal to the value returned in Content-MD5 header, with the\n * latter calculated from the requested range.\n *\n * @readonly\n */\n get blobContentMD5() {\n return this.originalResponse.blobContentMD5;\n }\n /**\n * Returns the date and time the file was last\n * modified. Any operation that modifies the file or its properties updates\n * the last modified time.\n *\n * @readonly\n */\n get lastModified() {\n return this.originalResponse.lastModified;\n }\n /**\n * Returns the UTC date and time generated by the service that indicates the time at which the blob was\n * last read or written to.\n *\n * @readonly\n */\n get lastAccessed() {\n return this.originalResponse.lastAccessed;\n }\n /**\n * Returns the date and time the blob was created.\n *\n * @readonly\n */\n get createdOn() {\n return this.originalResponse.createdOn;\n }\n /**\n * A name-value pair\n * to associate with a file storage object.\n *\n * @readonly\n */\n get metadata() {\n return this.originalResponse.metadata;\n }\n /**\n * This header uniquely identifies the request\n * that was made and can be used for troubleshooting the request.\n *\n * @readonly\n */\n get requestId() {\n return this.originalResponse.requestId;\n }\n /**\n * If a client request id header is sent in the request, this header will be present in the\n * response with the same value.\n *\n * @readonly\n */\n get clientRequestId() {\n return this.originalResponse.clientRequestId;\n }\n /**\n * Indicates the version of the Blob service used\n * to execute the request.\n *\n * @readonly\n */\n get version() {\n return this.originalResponse.version;\n }\n /**\n * Indicates the versionId of the downloaded blob version.\n *\n * @readonly\n */\n get versionId() {\n return this.originalResponse.versionId;\n }\n /**\n * Indicates whether version of this blob is a current version.\n *\n * @readonly\n */\n get isCurrentVersion() {\n return this.originalResponse.isCurrentVersion;\n }\n /**\n * The SHA-256 hash of the encryption key used to encrypt the blob. This value is only returned\n * when the blob was encrypted with a customer-provided key.\n *\n * @readonly\n */\n get encryptionKeySha256() {\n return this.originalResponse.encryptionKeySha256;\n }\n /**\n * If the request is to read a specified range and the x-ms-range-get-content-crc64 is set to\n * true, then the request returns a crc64 for the range, as long as the range size is less than\n * or equal to 4 MB. If both x-ms-range-get-content-crc64 & x-ms-range-get-content-md5 is\n * specified in the same request, it will fail with 400(Bad Request)\n */\n get contentCrc64() {\n return this.originalResponse.contentCrc64;\n }\n /**\n * Object Replication Policy Id of the destination blob.\n *\n * @readonly\n */\n get objectReplicationDestinationPolicyId() {\n return this.originalResponse.objectReplicationDestinationPolicyId;\n }\n /**\n * Parsed Object Replication Policy Id, Rule Id(s) and status of the source blob.\n *\n * @readonly\n */\n get objectReplicationSourceProperties() {\n return this.originalResponse.objectReplicationSourceProperties;\n }\n /**\n * If this blob has been sealed.\n *\n * @readonly\n */\n get isSealed() {\n return this.originalResponse.isSealed;\n }\n /**\n * UTC date/time value generated by the service that indicates the time at which the blob immutability policy will expire.\n *\n * @readonly\n */\n get immutabilityPolicyExpiresOn() {\n return this.originalResponse.immutabilityPolicyExpiresOn;\n }\n /**\n * Indicates immutability policy mode.\n *\n * @readonly\n */\n get immutabilityPolicyMode() {\n return this.originalResponse.immutabilityPolicyMode;\n }\n /**\n * Indicates if a legal hold is present on the blob.\n *\n * @readonly\n */\n get legalHold() {\n return this.originalResponse.legalHold;\n }\n /**\n * The response body as a browser Blob.\n * Always undefined in node.js.\n *\n * @readonly\n */\n get contentAsBlob() {\n return this.originalResponse.blobBody;\n }\n /**\n * The response body as a node.js Readable stream.\n * Always undefined in the browser.\n *\n * It will automatically retry when internal read stream unexpected ends.\n *\n * @readonly\n */\n get readableStreamBody() {\n return checkEnvironment_isNode ? this.blobDownloadStream : undefined;\n }\n /**\n * The HTTP response.\n */\n get _response() {\n return this.originalResponse._response;\n }\n}\n//# sourceMappingURL=BlobDownloadResponse.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-paging/dist-esm/src/models.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n//# sourceMappingURL=models.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-paging/dist-esm/src/getPagedAsyncIterator.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * returns an async iterator that iterates over results. It also has a `byPage`\n * method that returns pages of items at once.\n *\n * @param pagedResult - an object that specifies how to get pages.\n * @returns a paged async iterator that iterates over results.\n */\nfunction getPagedAsyncIterator(pagedResult) {\n var _a;\n const iter = getItemAsyncIterator(pagedResult);\n return {\n next() {\n return iter.next();\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n byPage: (_a = pagedResult === null || pagedResult === void 0 ? void 0 : pagedResult.byPage) !== null && _a !== void 0 ? _a : ((settings) => {\n const { continuationToken, maxPageSize } = settings !== null && settings !== void 0 ? settings : {};\n return getPageAsyncIterator(pagedResult, {\n pageLink: continuationToken,\n maxPageSize,\n });\n }),\n };\n}\nfunction getItemAsyncIterator(pagedResult) {\n return __asyncGenerator(this, arguments, function* getItemAsyncIterator_1() {\n var e_1, _a, e_2, _b;\n const pages = getPageAsyncIterator(pagedResult);\n const firstVal = yield __await(pages.next());\n // if the result does not have an array shape, i.e. TPage = TElement, then we return it as is\n if (!Array.isArray(firstVal.value)) {\n // can extract elements from this page\n const { toElements } = pagedResult;\n if (toElements) {\n yield __await(yield* __asyncDelegator(__asyncValues(toElements(firstVal.value))));\n try {\n for (var pages_1 = __asyncValues(pages), pages_1_1; pages_1_1 = yield __await(pages_1.next()), !pages_1_1.done;) {\n const page = pages_1_1.value;\n yield __await(yield* __asyncDelegator(__asyncValues(toElements(page))));\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (pages_1_1 && !pages_1_1.done && (_a = pages_1.return)) yield __await(_a.call(pages_1));\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n else {\n yield yield __await(firstVal.value);\n // `pages` is of type `AsyncIterableIterator` but TPage = TElement in this case\n yield __await(yield* __asyncDelegator(__asyncValues(pages)));\n }\n }\n else {\n yield __await(yield* __asyncDelegator(__asyncValues(firstVal.value)));\n try {\n for (var pages_2 = __asyncValues(pages), pages_2_1; pages_2_1 = yield __await(pages_2.next()), !pages_2_1.done;) {\n const page = pages_2_1.value;\n // pages is of type `AsyncIterableIterator` so `page` is of type `TPage`. In this branch,\n // it must be the case that `TPage = TElement[]`\n yield __await(yield* __asyncDelegator(__asyncValues(page)));\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (pages_2_1 && !pages_2_1.done && (_b = pages_2.return)) yield __await(_b.call(pages_2));\n }\n finally { if (e_2) throw e_2.error; }\n }\n }\n });\n}\nfunction getPageAsyncIterator(pagedResult, options = {}) {\n return __asyncGenerator(this, arguments, function* getPageAsyncIterator_1() {\n const { pageLink, maxPageSize } = options;\n let response = yield __await(pagedResult.getPage(pageLink !== null && pageLink !== void 0 ? pageLink : pagedResult.firstPageLink, maxPageSize));\n if (!response) {\n return yield __await(void 0);\n }\n yield yield __await(response.page);\n while (response.nextPageLink) {\n response = yield __await(pagedResult.getPage(response.nextPageLink, maxPageSize));\n if (!response) {\n return yield __await(void 0);\n }\n yield yield __await(response.page);\n }\n });\n}\n//# sourceMappingURL=getPagedAsyncIterator.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-paging/dist-esm/src/index.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-internal-avro/src/AvroConstants.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nconst AVRO_SYNC_MARKER_SIZE = 16;\nconst AVRO_INIT_BYTES = new Uint8Array([79, 98, 106, 1]);\nconst AVRO_CODEC_KEY = "avro.codec";\nconst AVRO_SCHEMA_KEY = "avro.schema";\n//# sourceMappingURL=AvroConstants.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-internal-avro/src/AvroParser.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nclass AvroParser {\n /**\n * Reads a fixed number of bytes from the stream.\n *\n * @param stream -\n * @param length -\n * @param options -\n */\n static async readFixedBytes(stream, length, options = {}) {\n const bytes = await stream.read(length, { abortSignal: options.abortSignal });\n if (bytes.length !== length) {\n throw new Error("Hit stream end.");\n }\n return bytes;\n }\n /**\n * Reads a single byte from the stream.\n *\n * @param stream -\n * @param options -\n */\n static async readByte(stream, options = {}) {\n const buf = await AvroParser.readFixedBytes(stream, 1, options);\n return buf[0];\n }\n // int and long are stored in variable-length zig-zag coding.\n // variable-length: https://lucene.apache.org/core/3_5_0/fileformats.html#VInt\n // zig-zag: https://developers.google.com/protocol-buffers/docs/encoding?csw=1#types\n static async readZigZagLong(stream, options = {}) {\n let zigZagEncoded = 0;\n let significanceInBit = 0;\n let byte, haveMoreByte, significanceInFloat;\n do {\n byte = await AvroParser.readByte(stream, options);\n haveMoreByte = byte & 0x80;\n zigZagEncoded |= (byte & 0x7f) << significanceInBit;\n significanceInBit += 7;\n } while (haveMoreByte && significanceInBit < 28); // bitwise operation only works for 32-bit integers\n if (haveMoreByte) {\n // Switch to float arithmetic\n // eslint-disable-next-line no-self-assign\n zigZagEncoded = zigZagEncoded;\n significanceInFloat = 268435456; // 2 ** 28.\n do {\n byte = await AvroParser.readByte(stream, options);\n zigZagEncoded += (byte & 0x7f) * significanceInFloat;\n significanceInFloat *= 128; // 2 ** 7\n } while (byte & 0x80);\n const res = (zigZagEncoded % 2 ? -(zigZagEncoded + 1) : zigZagEncoded) / 2;\n if (res < Number.MIN_SAFE_INTEGER || res > Number.MAX_SAFE_INTEGER) {\n throw new Error("Integer overflow.");\n }\n return res;\n }\n return (zigZagEncoded >> 1) ^ -(zigZagEncoded & 1);\n }\n static async readLong(stream, options = {}) {\n return AvroParser.readZigZagLong(stream, options);\n }\n static async readInt(stream, options = {}) {\n return AvroParser.readZigZagLong(stream, options);\n }\n static async readNull() {\n return null;\n }\n static async readBoolean(stream, options = {}) {\n const b = await AvroParser.readByte(stream, options);\n if (b === 1) {\n return true;\n }\n else if (b === 0) {\n return false;\n }\n else {\n throw new Error("Byte was not a boolean.");\n }\n }\n static async readFloat(stream, options = {}) {\n const u8arr = await AvroParser.readFixedBytes(stream, 4, options);\n const view = new DataView(u8arr.buffer, u8arr.byteOffset, u8arr.byteLength);\n return view.getFloat32(0, true); // littleEndian = true\n }\n static async readDouble(stream, options = {}) {\n const u8arr = await AvroParser.readFixedBytes(stream, 8, options);\n const view = new DataView(u8arr.buffer, u8arr.byteOffset, u8arr.byteLength);\n return view.getFloat64(0, true); // littleEndian = true\n }\n static async readBytes(stream, options = {}) {\n const size = await AvroParser.readLong(stream, options);\n if (size < 0) {\n throw new Error("Bytes size was negative.");\n }\n return stream.read(size, { abortSignal: options.abortSignal });\n }\n static async readString(stream, options = {}) {\n const u8arr = await AvroParser.readBytes(stream, options);\n const utf8decoder = new TextDecoder();\n return utf8decoder.decode(u8arr);\n }\n static async readMapPair(stream, readItemMethod, options = {}) {\n const key = await AvroParser.readString(stream, options);\n // FUTURE: this won\'t work with readFixed (currently not supported) which needs a length as the parameter.\n const value = await readItemMethod(stream, options);\n return { key, value };\n }\n static async readMap(stream, readItemMethod, options = {}) {\n const readPairMethod = (s, opts = {}) => {\n return AvroParser.readMapPair(s, readItemMethod, opts);\n };\n const pairs = await AvroParser.readArray(stream, readPairMethod, options);\n const dict = {};\n for (const pair of pairs) {\n dict[pair.key] = pair.value;\n }\n return dict;\n }\n static async readArray(stream, readItemMethod, options = {}) {\n const items = [];\n for (let count = await AvroParser.readLong(stream, options); count !== 0; count = await AvroParser.readLong(stream, options)) {\n if (count < 0) {\n // Ignore block sizes\n await AvroParser.readLong(stream, options);\n count = -count;\n }\n while (count--) {\n const item = await readItemMethod(stream, options);\n items.push(item);\n }\n }\n return items;\n }\n}\nvar AvroComplex;\n(function (AvroComplex) {\n AvroComplex["RECORD"] = "record";\n AvroComplex["ENUM"] = "enum";\n AvroComplex["ARRAY"] = "array";\n AvroComplex["MAP"] = "map";\n AvroComplex["UNION"] = "union";\n AvroComplex["FIXED"] = "fixed";\n})(AvroComplex || (AvroComplex = {}));\nvar AvroPrimitive;\n(function (AvroPrimitive) {\n AvroPrimitive["NULL"] = "null";\n AvroPrimitive["BOOLEAN"] = "boolean";\n AvroPrimitive["INT"] = "int";\n AvroPrimitive["LONG"] = "long";\n AvroPrimitive["FLOAT"] = "float";\n AvroPrimitive["DOUBLE"] = "double";\n AvroPrimitive["BYTES"] = "bytes";\n AvroPrimitive["STRING"] = "string";\n})(AvroPrimitive || (AvroPrimitive = {}));\nclass AvroType {\n /**\n * Determines the AvroType from the Avro Schema.\n */\n static fromSchema(schema) {\n if (typeof schema === "string") {\n return AvroType.fromStringSchema(schema);\n }\n else if (Array.isArray(schema)) {\n return AvroType.fromArraySchema(schema);\n }\n else {\n return AvroType.fromObjectSchema(schema);\n }\n }\n static fromStringSchema(schema) {\n switch (schema) {\n case AvroPrimitive.NULL:\n case AvroPrimitive.BOOLEAN:\n case AvroPrimitive.INT:\n case AvroPrimitive.LONG:\n case AvroPrimitive.FLOAT:\n case AvroPrimitive.DOUBLE:\n case AvroPrimitive.BYTES:\n case AvroPrimitive.STRING:\n return new AvroPrimitiveType(schema);\n default:\n throw new Error(`Unexpected Avro type ${schema}`);\n }\n }\n static fromArraySchema(schema) {\n return new AvroUnionType(schema.map(AvroType.fromSchema));\n }\n static fromObjectSchema(schema) {\n const type = schema.type;\n // Primitives can be defined as strings or objects\n try {\n return AvroType.fromStringSchema(type);\n }\n catch (err) {\n // eslint-disable-line no-empty\n }\n switch (type) {\n case AvroComplex.RECORD:\n if (schema.aliases) {\n throw new Error(`aliases currently is not supported, schema: ${schema}`);\n }\n if (!schema.name) {\n throw new Error(`Required attribute \'name\' doesn\'t exist on schema: ${schema}`);\n }\n // eslint-disable-next-line no-case-declarations\n const fields = {};\n if (!schema.fields) {\n throw new Error(`Required attribute \'fields\' doesn\'t exist on schema: ${schema}`);\n }\n for (const field of schema.fields) {\n fields[field.name] = AvroType.fromSchema(field.type);\n }\n return new AvroRecordType(fields, schema.name);\n case AvroComplex.ENUM:\n if (schema.aliases) {\n throw new Error(`aliases currently is not supported, schema: ${schema}`);\n }\n if (!schema.symbols) {\n throw new Error(`Required attribute \'symbols\' doesn\'t exist on schema: ${schema}`);\n }\n return new AvroEnumType(schema.symbols);\n case AvroComplex.MAP:\n if (!schema.values) {\n throw new Error(`Required attribute \'values\' doesn\'t exist on schema: ${schema}`);\n }\n return new AvroMapType(AvroType.fromSchema(schema.values));\n case AvroComplex.ARRAY: // Unused today\n case AvroComplex.FIXED: // Unused today\n default:\n throw new Error(`Unexpected Avro type ${type} in ${schema}`);\n }\n }\n}\nclass AvroPrimitiveType extends AvroType {\n constructor(primitive) {\n super();\n this._primitive = primitive;\n }\n read(stream, options = {}) {\n switch (this._primitive) {\n case AvroPrimitive.NULL:\n return AvroParser.readNull();\n case AvroPrimitive.BOOLEAN:\n return AvroParser.readBoolean(stream, options);\n case AvroPrimitive.INT:\n return AvroParser.readInt(stream, options);\n case AvroPrimitive.LONG:\n return AvroParser.readLong(stream, options);\n case AvroPrimitive.FLOAT:\n return AvroParser.readFloat(stream, options);\n case AvroPrimitive.DOUBLE:\n return AvroParser.readDouble(stream, options);\n case AvroPrimitive.BYTES:\n return AvroParser.readBytes(stream, options);\n case AvroPrimitive.STRING:\n return AvroParser.readString(stream, options);\n default:\n throw new Error("Unknown Avro Primitive");\n }\n }\n}\nclass AvroEnumType extends AvroType {\n constructor(symbols) {\n super();\n this._symbols = symbols;\n }\n async read(stream, options = {}) {\n const value = await AvroParser.readInt(stream, options);\n return this._symbols[value];\n }\n}\nclass AvroUnionType extends AvroType {\n constructor(types) {\n super();\n this._types = types;\n }\n async read(stream, options = {}) {\n // eslint-disable-line @typescript-eslint/ban-types\n const typeIndex = await AvroParser.readInt(stream, options);\n return this._types[typeIndex].read(stream, options);\n }\n}\nclass AvroMapType extends AvroType {\n constructor(itemType) {\n super();\n this._itemType = itemType;\n }\n read(stream, options = {}) {\n const readItemMethod = (s, opts) => {\n return this._itemType.read(s, opts);\n };\n return AvroParser.readMap(stream, readItemMethod, options);\n }\n}\nclass AvroRecordType extends AvroType {\n constructor(fields, name) {\n super();\n this._fields = fields;\n this._name = name;\n }\n async read(stream, options = {}) {\n const record = {};\n record["$schema"] = this._name;\n for (const key in this._fields) {\n if (Object.prototype.hasOwnProperty.call(this._fields, key)) {\n record[key] = await this._fields[key].read(stream, options);\n }\n }\n return record;\n }\n}\n//# sourceMappingURL=AvroParser.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-internal-avro/src/utils/utils.common.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nfunction arraysEqual(a, b) {\n if (a === b)\n return true;\n // eslint-disable-next-line eqeqeq\n if (a == null || b == null)\n return false;\n if (a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; ++i) {\n if (a[i] !== b[i])\n return false;\n }\n return true;\n}\n//# sourceMappingURL=utils.common.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-internal-avro/src/AvroReader.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n// TODO: Do a review of non-interfaces\n/* eslint-disable @azure/azure-sdk/ts-use-interface-parameters */\n\n\n\n\nclass AvroReader {\n constructor(dataStream, headerStream, currentBlockOffset, indexWithinCurrentBlock) {\n this._dataStream = dataStream;\n this._headerStream = headerStream || dataStream;\n this._initialized = false;\n this._blockOffset = currentBlockOffset || 0;\n this._objectIndex = indexWithinCurrentBlock || 0;\n this._initialBlockOffset = currentBlockOffset || 0;\n }\n get blockOffset() {\n return this._blockOffset;\n }\n get objectIndex() {\n return this._objectIndex;\n }\n async initialize(options = {}) {\n const header = await AvroParser.readFixedBytes(this._headerStream, AVRO_INIT_BYTES.length, {\n abortSignal: options.abortSignal,\n });\n if (!arraysEqual(header, AVRO_INIT_BYTES)) {\n throw new Error("Stream is not an Avro file.");\n }\n // File metadata is written as if defined by the following map schema:\n // { "type": "map", "values": "bytes"}\n this._metadata = await AvroParser.readMap(this._headerStream, AvroParser.readString, {\n abortSignal: options.abortSignal,\n });\n // Validate codec\n const codec = this._metadata[AVRO_CODEC_KEY];\n if (!(codec === undefined || codec === null || codec === "null")) {\n throw new Error("Codecs are not supported");\n }\n // The 16-byte, randomly-generated sync marker for this file.\n this._syncMarker = await AvroParser.readFixedBytes(this._headerStream, AVRO_SYNC_MARKER_SIZE, {\n abortSignal: options.abortSignal,\n });\n // Parse the schema\n const schema = JSON.parse(this._metadata[AVRO_SCHEMA_KEY]);\n this._itemType = AvroType.fromSchema(schema);\n if (this._blockOffset === 0) {\n this._blockOffset = this._initialBlockOffset + this._dataStream.position;\n }\n this._itemsRemainingInBlock = await AvroParser.readLong(this._dataStream, {\n abortSignal: options.abortSignal,\n });\n // skip block length\n await AvroParser.readLong(this._dataStream, { abortSignal: options.abortSignal });\n this._initialized = true;\n if (this._objectIndex && this._objectIndex > 0) {\n for (let i = 0; i < this._objectIndex; i++) {\n await this._itemType.read(this._dataStream, { abortSignal: options.abortSignal });\n this._itemsRemainingInBlock--;\n }\n }\n }\n hasNext() {\n return !this._initialized || this._itemsRemainingInBlock > 0;\n }\n parseObjects(options = {}) {\n return tslib_es6_asyncGenerator(this, arguments, function* parseObjects_1() {\n if (!this._initialized) {\n yield tslib_es6_await(this.initialize(options));\n }\n while (this.hasNext()) {\n const result = yield tslib_es6_await(this._itemType.read(this._dataStream, {\n abortSignal: options.abortSignal,\n }));\n this._itemsRemainingInBlock--;\n this._objectIndex++;\n if (this._itemsRemainingInBlock === 0) {\n const marker = yield tslib_es6_await(AvroParser.readFixedBytes(this._dataStream, AVRO_SYNC_MARKER_SIZE, {\n abortSignal: options.abortSignal,\n }));\n this._blockOffset = this._initialBlockOffset + this._dataStream.position;\n this._objectIndex = 0;\n if (!arraysEqual(this._syncMarker, marker)) {\n throw new Error("Stream is not a valid Avro file.");\n }\n try {\n this._itemsRemainingInBlock = yield tslib_es6_await(AvroParser.readLong(this._dataStream, {\n abortSignal: options.abortSignal,\n }));\n }\n catch (err) {\n // We hit the end of the stream.\n this._itemsRemainingInBlock = 0;\n }\n if (this._itemsRemainingInBlock > 0) {\n // Ignore block size\n yield tslib_es6_await(AvroParser.readLong(this._dataStream, { abortSignal: options.abortSignal }));\n }\n }\n yield yield tslib_es6_await(result);\n }\n });\n }\n}\n//# sourceMappingURL=AvroReader.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-internal-avro/src/AvroReadable.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nclass AvroReadable {\n}\n//# sourceMappingURL=AvroReadable.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-internal-avro/src/AvroReadableFromStream.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\nconst ABORT_ERROR = new AbortError("Reading from the avro stream was aborted.");\nclass AvroReadableFromStream extends AvroReadable {\n constructor(readable) {\n super();\n this._readable = readable;\n this._position = 0;\n }\n toUint8Array(data) {\n if (typeof data === "string") {\n return Buffer.from(data);\n }\n return data;\n }\n get position() {\n return this._position;\n }\n async read(size, options = {}) {\n var _a;\n if ((_a = options.abortSignal) === null || _a === void 0 ? void 0 : _a.aborted) {\n throw ABORT_ERROR;\n }\n if (size < 0) {\n throw new Error(`size parameter should be positive: ${size}`);\n }\n if (size === 0) {\n return new Uint8Array();\n }\n if (!this._readable.readable) {\n throw new Error("Stream no longer readable.");\n }\n // See if there is already enough data.\n const chunk = this._readable.read(size);\n if (chunk) {\n this._position += chunk.length;\n // chunk.length maybe less than desired size if the stream ends.\n return this.toUint8Array(chunk);\n }\n else {\n // register callback to wait for enough data to read\n return new Promise((resolve, reject) => {\n /* eslint-disable @typescript-eslint/no-use-before-define */\n const cleanUp = () => {\n this._readable.removeListener("readable", readableCallback);\n this._readable.removeListener("error", rejectCallback);\n this._readable.removeListener("end", rejectCallback);\n this._readable.removeListener("close", rejectCallback);\n if (options.abortSignal) {\n options.abortSignal.removeEventListener("abort", abortHandler);\n }\n };\n const readableCallback = () => {\n const callbackChunk = this._readable.read(size);\n if (callbackChunk) {\n this._position += callbackChunk.length;\n cleanUp();\n // callbackChunk.length maybe less than desired size if the stream ends.\n resolve(this.toUint8Array(callbackChunk));\n }\n };\n const rejectCallback = () => {\n cleanUp();\n reject();\n };\n const abortHandler = () => {\n cleanUp();\n reject(ABORT_ERROR);\n };\n this._readable.on("readable", readableCallback);\n this._readable.once("error", rejectCallback);\n this._readable.once("end", rejectCallback);\n this._readable.once("close", rejectCallback);\n if (options.abortSignal) {\n options.abortSignal.addEventListener("abort", abortHandler);\n }\n /* eslint-enable @typescript-eslint/no-use-before-define */\n });\n }\n }\n}\n//# sourceMappingURL=AvroReadableFromStream.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/utils/BlobQuickQueryStream.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * A Node.js BlobQuickQueryStream will internally parse avro data stream for blob query.\n */\nclass BlobQuickQueryStream extends external_stream_.Readable {\n /**\n * Creates an instance of BlobQuickQueryStream.\n *\n * @param source - The current ReadableStream returned from getter\n * @param options -\n */\n constructor(source, options = {}) {\n super();\n this.avroPaused = true;\n this.source = source;\n this.onProgress = options.onProgress;\n this.onError = options.onError;\n this.avroReader = new AvroReader(new AvroReadableFromStream(this.source));\n this.avroIter = this.avroReader.parseObjects({ abortSignal: options.abortSignal });\n }\n _read() {\n if (this.avroPaused) {\n this.readInternal().catch((err) => {\n this.emit("error", err);\n });\n }\n }\n async readInternal() {\n this.avroPaused = false;\n let avroNext;\n do {\n avroNext = await this.avroIter.next();\n if (avroNext.done) {\n break;\n }\n const obj = avroNext.value;\n const schema = obj.$schema;\n if (typeof schema !== "string") {\n throw Error("Missing schema in avro record.");\n }\n switch (schema) {\n case "com.microsoft.azure.storage.queryBlobContents.resultData":\n {\n const data = obj.data;\n if (data instanceof Uint8Array === false) {\n throw Error("Invalid data in avro result record.");\n }\n if (!this.push(Buffer.from(data))) {\n this.avroPaused = true;\n }\n }\n break;\n case "com.microsoft.azure.storage.queryBlobContents.progress":\n {\n const bytesScanned = obj.bytesScanned;\n if (typeof bytesScanned !== "number") {\n throw Error("Invalid bytesScanned in avro progress record.");\n }\n if (this.onProgress) {\n this.onProgress({ loadedBytes: bytesScanned });\n }\n }\n break;\n case "com.microsoft.azure.storage.queryBlobContents.end":\n if (this.onProgress) {\n const totalBytes = obj.totalBytes;\n if (typeof totalBytes !== "number") {\n throw Error("Invalid totalBytes in avro end record.");\n }\n this.onProgress({ loadedBytes: totalBytes });\n }\n this.push(null);\n break;\n case "com.microsoft.azure.storage.queryBlobContents.error":\n if (this.onError) {\n const fatal = obj.fatal;\n if (typeof fatal !== "boolean") {\n throw Error("Invalid fatal in avro error record.");\n }\n const name = obj.name;\n if (typeof name !== "string") {\n throw Error("Invalid name in avro error record.");\n }\n const description = obj.description;\n if (typeof description !== "string") {\n throw Error("Invalid description in avro error record.");\n }\n const position = obj.position;\n if (typeof position !== "number") {\n throw Error("Invalid position in avro error record.");\n }\n this.onError({\n position,\n name,\n isFatal: fatal,\n description,\n });\n }\n break;\n default:\n throw Error(`Unknown schema ${schema} in avro progress record.`);\n }\n } while (!avroNext.done && !this.avroPaused);\n }\n}\n//# sourceMappingURL=BlobQuickQueryStream.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/BlobQueryResponse.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * BlobQueryResponse implements BlobDownloadResponseModel interface, and in Node.js runtime it will\n * parse avor data returned by blob query.\n */\nclass BlobQueryResponse {\n /**\n * Creates an instance of BlobQueryResponse.\n *\n * @param originalResponse -\n * @param options -\n */\n constructor(originalResponse, options = {}) {\n this.originalResponse = originalResponse;\n this.blobDownloadStream = new BlobQuickQueryStream(this.originalResponse.readableStreamBody, options);\n }\n /**\n * Indicates that the service supports\n * requests for partial file content.\n *\n * @readonly\n */\n get acceptRanges() {\n return this.originalResponse.acceptRanges;\n }\n /**\n * Returns if it was previously specified\n * for the file.\n *\n * @readonly\n */\n get cacheControl() {\n return this.originalResponse.cacheControl;\n }\n /**\n * Returns the value that was specified\n * for the \'x-ms-content-disposition\' header and specifies how to process the\n * response.\n *\n * @readonly\n */\n get contentDisposition() {\n return this.originalResponse.contentDisposition;\n }\n /**\n * Returns the value that was specified\n * for the Content-Encoding request header.\n *\n * @readonly\n */\n get contentEncoding() {\n return this.originalResponse.contentEncoding;\n }\n /**\n * Returns the value that was specified\n * for the Content-Language request header.\n *\n * @readonly\n */\n get contentLanguage() {\n return this.originalResponse.contentLanguage;\n }\n /**\n * The current sequence number for a\n * page blob. This header is not returned for block blobs or append blobs.\n *\n * @readonly\n */\n get blobSequenceNumber() {\n return this.originalResponse.blobSequenceNumber;\n }\n /**\n * The blob\'s type. Possible values include:\n * \'BlockBlob\', \'PageBlob\', \'AppendBlob\'.\n *\n * @readonly\n */\n get blobType() {\n return this.originalResponse.blobType;\n }\n /**\n * The number of bytes present in the\n * response body.\n *\n * @readonly\n */\n get contentLength() {\n return this.originalResponse.contentLength;\n }\n /**\n * If the file has an MD5 hash and the\n * request is to read the full file, this response header is returned so that\n * the client can check for message content integrity. If the request is to\n * read a specified range and the \'x-ms-range-get-content-md5\' is set to\n * true, then the request returns an MD5 hash for the range, as long as the\n * range size is less than or equal to 4 MB. If neither of these sets of\n * conditions is true, then no value is returned for the \'Content-MD5\'\n * header.\n *\n * @readonly\n */\n get contentMD5() {\n return this.originalResponse.contentMD5;\n }\n /**\n * Indicates the range of bytes returned if\n * the client requested a subset of the file by setting the Range request\n * header.\n *\n * @readonly\n */\n get contentRange() {\n return this.originalResponse.contentRange;\n }\n /**\n * The content type specified for the file.\n * The default content type is \'application/octet-stream\'\n *\n * @readonly\n */\n get contentType() {\n return this.originalResponse.contentType;\n }\n /**\n * Conclusion time of the last attempted\n * Copy File operation where this file was the destination file. This value\n * can specify the time of a completed, aborted, or failed copy attempt.\n *\n * @readonly\n */\n get copyCompletedOn() {\n return undefined;\n }\n /**\n * String identifier for the last attempted Copy\n * File operation where this file was the destination file.\n *\n * @readonly\n */\n get copyId() {\n return this.originalResponse.copyId;\n }\n /**\n * Contains the number of bytes copied and\n * the total bytes in the source in the last attempted Copy File operation\n * where this file was the destination file. Can show between 0 and\n * Content-Length bytes copied.\n *\n * @readonly\n */\n get copyProgress() {\n return this.originalResponse.copyProgress;\n }\n /**\n * URL up to 2KB in length that specifies the\n * source file used in the last attempted Copy File operation where this file\n * was the destination file.\n *\n * @readonly\n */\n get copySource() {\n return this.originalResponse.copySource;\n }\n /**\n * State of the copy operation\n * identified by \'x-ms-copy-id\'. Possible values include: \'pending\',\n * \'success\', \'aborted\', \'failed\'\n *\n * @readonly\n */\n get copyStatus() {\n return this.originalResponse.copyStatus;\n }\n /**\n * Only appears when\n * x-ms-copy-status is failed or pending. Describes cause of fatal or\n * non-fatal copy operation failure.\n *\n * @readonly\n */\n get copyStatusDescription() {\n return this.originalResponse.copyStatusDescription;\n }\n /**\n * When a blob is leased,\n * specifies whether the lease is of infinite or fixed duration. Possible\n * values include: \'infinite\', \'fixed\'.\n *\n * @readonly\n */\n get leaseDuration() {\n return this.originalResponse.leaseDuration;\n }\n /**\n * Lease state of the blob. Possible\n * values include: \'available\', \'leased\', \'expired\', \'breaking\', \'broken\'.\n *\n * @readonly\n */\n get leaseState() {\n return this.originalResponse.leaseState;\n }\n /**\n * The current lease status of the\n * blob. Possible values include: \'locked\', \'unlocked\'.\n *\n * @readonly\n */\n get leaseStatus() {\n return this.originalResponse.leaseStatus;\n }\n /**\n * A UTC date/time value generated by the service that\n * indicates the time at which the response was initiated.\n *\n * @readonly\n */\n get date() {\n return this.originalResponse.date;\n }\n /**\n * The number of committed blocks\n * present in the blob. This header is returned only for append blobs.\n *\n * @readonly\n */\n get blobCommittedBlockCount() {\n return this.originalResponse.blobCommittedBlockCount;\n }\n /**\n * The ETag contains a value that you can use to\n * perform operations conditionally, in quotes.\n *\n * @readonly\n */\n get etag() {\n return this.originalResponse.etag;\n }\n /**\n * The error code.\n *\n * @readonly\n */\n get errorCode() {\n return this.originalResponse.errorCode;\n }\n /**\n * The value of this header is set to\n * true if the file data and application metadata are completely encrypted\n * using the specified algorithm. Otherwise, the value is set to false (when\n * the file is unencrypted, or if only parts of the file/application metadata\n * are encrypted).\n *\n * @readonly\n */\n get isServerEncrypted() {\n return this.originalResponse.isServerEncrypted;\n }\n /**\n * If the blob has a MD5 hash, and if\n * request contains range header (Range or x-ms-range), this response header\n * is returned with the value of the whole blob\'s MD5 value. This value may\n * or may not be equal to the value returned in Content-MD5 header, with the\n * latter calculated from the requested range.\n *\n * @readonly\n */\n get blobContentMD5() {\n return this.originalResponse.blobContentMD5;\n }\n /**\n * Returns the date and time the file was last\n * modified. Any operation that modifies the file or its properties updates\n * the last modified time.\n *\n * @readonly\n */\n get lastModified() {\n return this.originalResponse.lastModified;\n }\n /**\n * A name-value pair\n * to associate with a file storage object.\n *\n * @readonly\n */\n get metadata() {\n return this.originalResponse.metadata;\n }\n /**\n * This header uniquely identifies the request\n * that was made and can be used for troubleshooting the request.\n *\n * @readonly\n */\n get requestId() {\n return this.originalResponse.requestId;\n }\n /**\n * If a client request id header is sent in the request, this header will be present in the\n * response with the same value.\n *\n * @readonly\n */\n get clientRequestId() {\n return this.originalResponse.clientRequestId;\n }\n /**\n * Indicates the version of the File service used\n * to execute the request.\n *\n * @readonly\n */\n get version() {\n return this.originalResponse.version;\n }\n /**\n * The SHA-256 hash of the encryption key used to encrypt the blob. This value is only returned\n * when the blob was encrypted with a customer-provided key.\n *\n * @readonly\n */\n get encryptionKeySha256() {\n return this.originalResponse.encryptionKeySha256;\n }\n /**\n * If the request is to read a specified range and the x-ms-range-get-content-crc64 is set to\n * true, then the request returns a crc64 for the range, as long as the range size is less than\n * or equal to 4 MB. If both x-ms-range-get-content-crc64 & x-ms-range-get-content-md5 is\n * specified in the same request, it will fail with 400(Bad Request)\n */\n get contentCrc64() {\n return this.originalResponse.contentCrc64;\n }\n /**\n * The response body as a browser Blob.\n * Always undefined in node.js.\n *\n * @readonly\n */\n get blobBody() {\n return undefined;\n }\n /**\n * The response body as a node.js Readable stream.\n * Always undefined in the browser.\n *\n * It will parse avor data returned by blob query.\n *\n * @readonly\n */\n get readableStreamBody() {\n return checkEnvironment_isNode ? this.blobDownloadStream : undefined;\n }\n /**\n * The HTTP response.\n */\n get _response() {\n return this.originalResponse._response;\n }\n}\n//# sourceMappingURL=BlobQueryResponse.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generated/src/operations/appendBlob.js\n/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\n\n\n\n/** Class representing a AppendBlob. */\nclass AppendBlob {\n /**\n * Initialize a new instance of the class AppendBlob class.\n * @param client Reference to the service client\n */\n constructor(client) {\n this.client = client;\n }\n /**\n * The Create Append Blob operation creates a new append blob.\n * @param contentLength The length of the request.\n * @param options The options parameters.\n */\n create(contentLength, options) {\n const operationArguments = {\n contentLength,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, appendBlob_createOperationSpec);\n }\n /**\n * The Append Block operation commits a new block of data to the end of an existing append blob. The\n * Append Block operation is permitted only if the blob was created with x-ms-blob-type set to\n * AppendBlob. Append Block is supported only on version 2015-02-21 version or later.\n * @param contentLength The length of the request.\n * @param body Initial data\n * @param options The options parameters.\n */\n appendBlock(contentLength, body, options) {\n const operationArguments = {\n contentLength,\n body,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, appendBlockOperationSpec);\n }\n /**\n * The Append Block operation commits a new block of data to the end of an existing append blob where\n * the contents are read from a source url. The Append Block operation is permitted only if the blob\n * was created with x-ms-blob-type set to AppendBlob. Append Block is supported only on version\n * 2015-02-21 version or later.\n * @param sourceUrl Specify a URL to the copy source.\n * @param contentLength The length of the request.\n * @param options The options parameters.\n */\n appendBlockFromUrl(sourceUrl, contentLength, options) {\n const operationArguments = {\n sourceUrl,\n contentLength,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, appendBlockFromUrlOperationSpec);\n }\n /**\n * The Seal operation seals the Append Blob to make it read-only. Seal is supported only on version\n * 2019-12-12 version or later.\n * @param options The options parameters.\n */\n seal(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, sealOperationSpec);\n }\n}\n// Operation Specifications\nconst appendBlob_xmlSerializer = new Serializer(mappers_namespaceObject, /* isXml */ true);\nconst serializer = new Serializer(mappers_namespaceObject, /* isXml */ false);\nconst appendBlob_createOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: AppendBlobCreateHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: AppendBlobCreateExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n contentLength,\n metadata,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n blobCacheControl,\n blobContentType,\n blobContentMD5,\n blobContentEncoding,\n blobContentLanguage,\n blobContentDisposition,\n immutabilityPolicyExpiry,\n immutabilityPolicyMode,\n encryptionScope,\n blobTagsString,\n legalHold1,\n blobType1\n ],\n isXML: true,\n serializer: appendBlob_xmlSerializer\n};\nconst appendBlockOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: AppendBlobAppendBlockHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: AppendBlobAppendBlockExceptionHeaders\n }\n },\n requestBody: body1,\n queryParameters: [timeoutInSeconds, comp22],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n contentLength,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n encryptionScope,\n transactionalContentMD5,\n transactionalContentCrc64,\n contentType1,\n accept2,\n maxSize,\n appendPosition\n ],\n mediaType: "binary",\n serializer\n};\nconst appendBlockFromUrlOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: AppendBlobAppendBlockFromUrlHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: AppendBlobAppendBlockFromUrlExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp22],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n contentLength,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n encryptionScope,\n sourceIfModifiedSince,\n sourceIfUnmodifiedSince,\n sourceIfMatch,\n sourceIfNoneMatch,\n sourceContentMD5,\n copySourceAuthorization,\n transactionalContentMD5,\n sourceUrl,\n sourceContentCrc64,\n maxSize,\n appendPosition,\n sourceRange1\n ],\n isXML: true,\n serializer: appendBlob_xmlSerializer\n};\nconst sealOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: AppendBlobSealHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: AppendBlobSealExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp23],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n ifMatch,\n ifNoneMatch,\n appendPosition\n ],\n isXML: true,\n serializer: appendBlob_xmlSerializer\n};\n//# sourceMappingURL=appendBlob.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generated/src/operations/blockBlob.js\n/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\n\n\n\n/** Class representing a BlockBlob. */\nclass BlockBlob {\n /**\n * Initialize a new instance of the class BlockBlob class.\n * @param client Reference to the service client\n */\n constructor(client) {\n this.client = client;\n }\n /**\n * The Upload Block Blob operation updates the content of an existing block blob. Updating an existing\n * block blob overwrites any existing metadata on the blob. Partial updates are not supported with Put\n * Blob; the content of the existing blob is overwritten with the content of the new blob. To perform a\n * partial update of the content of a block blob, use the Put Block List operation.\n * @param contentLength The length of the request.\n * @param body Initial data\n * @param options The options parameters.\n */\n upload(contentLength, body, options) {\n const operationArguments = {\n contentLength,\n body,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, uploadOperationSpec);\n }\n /**\n * The Put Blob from URL operation creates a new Block Blob where the contents of the blob are read\n * from a given URL. This API is supported beginning with the 2020-04-08 version. Partial updates are\n * not supported with Put Blob from URL; the content of an existing blob is overwritten with the\n * content of the new blob. To perform partial updates to a block blob’s contents using a source URL,\n * use the Put Block from URL API in conjunction with Put Block List.\n * @param contentLength The length of the request.\n * @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to\n * 2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would\n * appear in a request URI. The source blob must either be public or must be authenticated via a shared\n * access signature.\n * @param options The options parameters.\n */\n putBlobFromUrl(contentLength, copySource, options) {\n const operationArguments = {\n contentLength,\n copySource,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, putBlobFromUrlOperationSpec);\n }\n /**\n * The Stage Block operation creates a new block to be committed as part of a blob\n * @param blockId A valid Base64 string value that identifies the block. Prior to encoding, the string\n * must be less than or equal to 64 bytes in size. For a given blob, the length of the value specified\n * for the blockid parameter must be the same size for each block.\n * @param contentLength The length of the request.\n * @param body Initial data\n * @param options The options parameters.\n */\n stageBlock(blockId, contentLength, body, options) {\n const operationArguments = {\n blockId,\n contentLength,\n body,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, stageBlockOperationSpec);\n }\n /**\n * The Stage Block operation creates a new block to be committed as part of a blob where the contents\n * are read from a URL.\n * @param blockId A valid Base64 string value that identifies the block. Prior to encoding, the string\n * must be less than or equal to 64 bytes in size. For a given blob, the length of the value specified\n * for the blockid parameter must be the same size for each block.\n * @param contentLength The length of the request.\n * @param sourceUrl Specify a URL to the copy source.\n * @param options The options parameters.\n */\n stageBlockFromURL(blockId, contentLength, sourceUrl, options) {\n const operationArguments = {\n blockId,\n contentLength,\n sourceUrl,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, stageBlockFromURLOperationSpec);\n }\n /**\n * The Commit Block List operation writes a blob by specifying the list of block IDs that make up the\n * blob. In order to be written as part of a blob, a block must have been successfully written to the\n * server in a prior Put Block operation. You can call Put Block List to update a blob by uploading\n * only those blocks that have changed, then committing the new and existing blocks together. You can\n * do this by specifying whether to commit a block from the committed block list or from the\n * uncommitted block list, or to commit the most recently uploaded version of the block, whichever list\n * it may belong to.\n * @param blocks Blob Blocks.\n * @param options The options parameters.\n */\n commitBlockList(blocks, options) {\n const operationArguments = {\n blocks,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, commitBlockListOperationSpec);\n }\n /**\n * The Get Block List operation retrieves the list of blocks that have been uploaded as part of a block\n * blob\n * @param listType Specifies whether to return the list of committed blocks, the list of uncommitted\n * blocks, or both lists together.\n * @param options The options parameters.\n */\n getBlockList(listType, options) {\n const operationArguments = {\n listType,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, getBlockListOperationSpec);\n }\n}\n// Operation Specifications\nconst blockBlob_xmlSerializer = new Serializer(mappers_namespaceObject, /* isXml */ true);\nconst blockBlob_serializer = new Serializer(mappers_namespaceObject, /* isXml */ false);\nconst uploadOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: BlockBlobUploadHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlockBlobUploadExceptionHeaders\n }\n },\n requestBody: body1,\n queryParameters: [timeoutInSeconds],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n contentLength,\n metadata,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n blobCacheControl,\n blobContentType,\n blobContentMD5,\n blobContentEncoding,\n blobContentLanguage,\n blobContentDisposition,\n immutabilityPolicyExpiry,\n immutabilityPolicyMode,\n encryptionScope,\n tier,\n blobTagsString,\n legalHold1,\n transactionalContentMD5,\n transactionalContentCrc64,\n contentType1,\n accept2,\n blobType2\n ],\n mediaType: "binary",\n serializer: blockBlob_serializer\n};\nconst putBlobFromUrlOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: BlockBlobPutBlobFromUrlHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlockBlobPutBlobFromUrlExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n contentLength,\n metadata,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n blobCacheControl,\n blobContentType,\n blobContentMD5,\n blobContentEncoding,\n blobContentLanguage,\n blobContentDisposition,\n encryptionScope,\n tier,\n sourceIfModifiedSince,\n sourceIfUnmodifiedSince,\n sourceIfMatch,\n sourceIfNoneMatch,\n sourceIfTags,\n copySource,\n blobTagsString,\n sourceContentMD5,\n copySourceAuthorization,\n copySourceTags,\n transactionalContentMD5,\n blobType2,\n copySourceBlobProperties\n ],\n isXML: true,\n serializer: blockBlob_xmlSerializer\n};\nconst stageBlockOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: BlockBlobStageBlockHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlockBlobStageBlockExceptionHeaders\n }\n },\n requestBody: body1,\n queryParameters: [\n timeoutInSeconds,\n comp24,\n blockId\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n contentLength,\n leaseId,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n encryptionScope,\n transactionalContentMD5,\n transactionalContentCrc64,\n contentType1,\n accept2\n ],\n mediaType: "binary",\n serializer: blockBlob_serializer\n};\nconst stageBlockFromURLOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: BlockBlobStageBlockFromURLHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlockBlobStageBlockFromURLExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n comp24,\n blockId\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n contentLength,\n leaseId,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n encryptionScope,\n sourceIfModifiedSince,\n sourceIfUnmodifiedSince,\n sourceIfMatch,\n sourceIfNoneMatch,\n sourceContentMD5,\n copySourceAuthorization,\n sourceUrl,\n sourceContentCrc64,\n sourceRange1\n ],\n isXML: true,\n serializer: blockBlob_xmlSerializer\n};\nconst commitBlockListOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: BlockBlobCommitBlockListHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlockBlobCommitBlockListExceptionHeaders\n }\n },\n requestBody: blocks,\n queryParameters: [timeoutInSeconds, comp25],\n urlParameters: [url],\n headerParameters: [\n contentType,\n accept,\n version,\n requestId,\n metadata,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n blobCacheControl,\n blobContentType,\n blobContentMD5,\n blobContentEncoding,\n blobContentLanguage,\n blobContentDisposition,\n immutabilityPolicyExpiry,\n immutabilityPolicyMode,\n encryptionScope,\n tier,\n blobTagsString,\n legalHold1,\n transactionalContentMD5,\n transactionalContentCrc64\n ],\n isXML: true,\n contentType: "application/xml; charset=utf-8",\n mediaType: "xml",\n serializer: blockBlob_xmlSerializer\n};\nconst getBlockListOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: BlockList,\n headersMapper: BlockBlobGetBlockListHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlockBlobGetBlockListExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n snapshot,\n comp25,\n listType\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifTags\n ],\n isXML: true,\n serializer: blockBlob_xmlSerializer\n};\n//# sourceMappingURL=blockBlob.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generated/src/operations/pageBlob.js\n/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\n\n\n\n/** Class representing a PageBlob. */\nclass PageBlob {\n /**\n * Initialize a new instance of the class PageBlob class.\n * @param client Reference to the service client\n */\n constructor(client) {\n this.client = client;\n }\n /**\n * The Create operation creates a new page blob.\n * @param contentLength The length of the request.\n * @param blobContentLength This header specifies the maximum size for the page blob, up to 1 TB. The\n * page blob size must be aligned to a 512-byte boundary.\n * @param options The options parameters.\n */\n create(contentLength, blobContentLength, options) {\n const operationArguments = {\n contentLength,\n blobContentLength,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, pageBlob_createOperationSpec);\n }\n /**\n * The Upload Pages operation writes a range of pages to a page blob\n * @param contentLength The length of the request.\n * @param body Initial data\n * @param options The options parameters.\n */\n uploadPages(contentLength, body, options) {\n const operationArguments = {\n contentLength,\n body,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, uploadPagesOperationSpec);\n }\n /**\n * The Clear Pages operation clears a set of pages from a page blob\n * @param contentLength The length of the request.\n * @param options The options parameters.\n */\n clearPages(contentLength, options) {\n const operationArguments = {\n contentLength,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, clearPagesOperationSpec);\n }\n /**\n * The Upload Pages operation writes a range of pages to a page blob where the contents are read from a\n * URL\n * @param sourceUrl Specify a URL to the copy source.\n * @param sourceRange Bytes of source data in the specified range. The length of this range should\n * match the ContentLength header and x-ms-range/Range destination range header.\n * @param contentLength The length of the request.\n * @param range The range of bytes to which the source range would be written. The range should be 512\n * aligned and range-end is required.\n * @param options The options parameters.\n */\n uploadPagesFromURL(sourceUrl, sourceRange, contentLength, range, options) {\n const operationArguments = {\n sourceUrl,\n sourceRange,\n contentLength,\n range,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, uploadPagesFromURLOperationSpec);\n }\n /**\n * The Get Page Ranges operation returns the list of valid page ranges for a page blob or snapshot of a\n * page blob\n * @param options The options parameters.\n */\n getPageRanges(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, getPageRangesOperationSpec);\n }\n /**\n * The Get Page Ranges Diff operation returns the list of valid page ranges for a page blob that were\n * changed between target blob and previous snapshot.\n * @param options The options parameters.\n */\n getPageRangesDiff(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, getPageRangesDiffOperationSpec);\n }\n /**\n * Resize the Blob\n * @param blobContentLength This header specifies the maximum size for the page blob, up to 1 TB. The\n * page blob size must be aligned to a 512-byte boundary.\n * @param options The options parameters.\n */\n resize(blobContentLength, options) {\n const operationArguments = {\n blobContentLength,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, resizeOperationSpec);\n }\n /**\n * Update the sequence number of the blob\n * @param sequenceNumberAction Required if the x-ms-blob-sequence-number header is set for the request.\n * This property applies to page blobs only. This property indicates how the service should modify the\n * blob\'s sequence number\n * @param options The options parameters.\n */\n updateSequenceNumber(sequenceNumberAction, options) {\n const operationArguments = {\n sequenceNumberAction,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, updateSequenceNumberOperationSpec);\n }\n /**\n * The Copy Incremental operation copies a snapshot of the source page blob to a destination page blob.\n * The snapshot is copied such that only the differential changes between the previously copied\n * snapshot are transferred to the destination. The copied snapshots are complete copies of the\n * original snapshot and can be read or copied from as usual. This API is supported since REST version\n * 2016-05-31.\n * @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to\n * 2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would\n * appear in a request URI. The source blob must either be public or must be authenticated via a shared\n * access signature.\n * @param options The options parameters.\n */\n copyIncremental(copySource, options) {\n const operationArguments = {\n copySource,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, copyIncrementalOperationSpec);\n }\n}\n// Operation Specifications\nconst pageBlob_xmlSerializer = new Serializer(mappers_namespaceObject, /* isXml */ true);\nconst pageBlob_serializer = new Serializer(mappers_namespaceObject, /* isXml */ false);\nconst pageBlob_createOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: PageBlobCreateHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: PageBlobCreateExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n contentLength,\n metadata,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n blobCacheControl,\n blobContentType,\n blobContentMD5,\n blobContentEncoding,\n blobContentLanguage,\n blobContentDisposition,\n immutabilityPolicyExpiry,\n immutabilityPolicyMode,\n encryptionScope,\n tier,\n blobTagsString,\n legalHold1,\n blobType,\n blobContentLength,\n blobSequenceNumber\n ],\n isXML: true,\n serializer: pageBlob_xmlSerializer\n};\nconst uploadPagesOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: PageBlobUploadPagesHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: PageBlobUploadPagesExceptionHeaders\n }\n },\n requestBody: body1,\n queryParameters: [timeoutInSeconds, comp19],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n contentLength,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n range,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n encryptionScope,\n transactionalContentMD5,\n transactionalContentCrc64,\n contentType1,\n accept2,\n pageWrite,\n ifSequenceNumberLessThanOrEqualTo,\n ifSequenceNumberLessThan,\n ifSequenceNumberEqualTo\n ],\n mediaType: "binary",\n serializer: pageBlob_serializer\n};\nconst clearPagesOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: PageBlobClearPagesHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: PageBlobClearPagesExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp19],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n contentLength,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n range,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n encryptionScope,\n ifSequenceNumberLessThanOrEqualTo,\n ifSequenceNumberLessThan,\n ifSequenceNumberEqualTo,\n pageWrite1\n ],\n isXML: true,\n serializer: pageBlob_xmlSerializer\n};\nconst uploadPagesFromURLOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: PageBlobUploadPagesFromURLHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: PageBlobUploadPagesFromURLExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp19],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n contentLength,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n encryptionScope,\n sourceIfModifiedSince,\n sourceIfUnmodifiedSince,\n sourceIfMatch,\n sourceIfNoneMatch,\n sourceContentMD5,\n copySourceAuthorization,\n pageWrite,\n ifSequenceNumberLessThanOrEqualTo,\n ifSequenceNumberLessThan,\n ifSequenceNumberEqualTo,\n sourceUrl,\n sourceRange,\n sourceContentCrc64,\n range1\n ],\n isXML: true,\n serializer: pageBlob_xmlSerializer\n};\nconst getPageRangesOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: PageList,\n headersMapper: PageBlobGetPageRangesHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: PageBlobGetPageRangesExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n marker,\n maxPageSize,\n snapshot,\n comp20\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n range,\n ifMatch,\n ifNoneMatch,\n ifTags\n ],\n isXML: true,\n serializer: pageBlob_xmlSerializer\n};\nconst getPageRangesDiffOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: PageList,\n headersMapper: PageBlobGetPageRangesDiffHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: PageBlobGetPageRangesDiffExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n marker,\n maxPageSize,\n snapshot,\n comp20,\n prevsnapshot\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n range,\n ifMatch,\n ifNoneMatch,\n ifTags,\n prevSnapshotUrl\n ],\n isXML: true,\n serializer: pageBlob_xmlSerializer\n};\nconst resizeOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: PageBlobResizeHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: PageBlobResizeExceptionHeaders\n }\n },\n queryParameters: [comp, timeoutInSeconds],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n encryptionScope,\n blobContentLength\n ],\n isXML: true,\n serializer: pageBlob_xmlSerializer\n};\nconst updateSequenceNumberOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: PageBlobUpdateSequenceNumberHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: PageBlobUpdateSequenceNumberExceptionHeaders\n }\n },\n queryParameters: [comp, timeoutInSeconds],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n ifMatch,\n ifNoneMatch,\n ifTags,\n blobSequenceNumber,\n sequenceNumberAction\n ],\n isXML: true,\n serializer: pageBlob_xmlSerializer\n};\nconst copyIncrementalOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 202: {\n headersMapper: PageBlobCopyIncrementalHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: PageBlobCopyIncrementalExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp21],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n ifMatch,\n ifNoneMatch,\n ifTags,\n copySource\n ],\n isXML: true,\n serializer: pageBlob_xmlSerializer\n};\n//# sourceMappingURL=pageBlob.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/models.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Represents the access tier on a blob.\n * For detailed information about block blob level tiering see {@link https://docs.microsoft.com/azure/storage/blobs/storage-blob-storage-tiers|Hot, cool and archive storage tiers.}\n */\nvar BlockBlobTier;\n(function (BlockBlobTier) {\n /**\n * Optimized for storing data that is accessed frequently.\n */\n BlockBlobTier["Hot"] = "Hot";\n /**\n * Optimized for storing data that is infrequently accessed and stored for at least 30 days.\n */\n BlockBlobTier["Cool"] = "Cool";\n /**\n * Optimized for storing data that is rarely accessed.\n */\n BlockBlobTier["Cold"] = "Cold";\n /**\n * Optimized for storing data that is rarely accessed and stored for at least 180 days\n * with flexible latency requirements (on the order of hours).\n */\n BlockBlobTier["Archive"] = "Archive";\n})(BlockBlobTier || (BlockBlobTier = {}));\n/**\n * Specifies the page blob tier to set the blob to. This is only applicable to page blobs on premium storage accounts.\n * Please see {@link https://docs.microsoft.com/azure/storage/storage-premium-storage#scalability-and-performance-targets|here}\n * for detailed information on the corresponding IOPS and throughput per PageBlobTier.\n */\nvar PremiumPageBlobTier;\n(function (PremiumPageBlobTier) {\n /**\n * P4 Tier.\n */\n PremiumPageBlobTier["P4"] = "P4";\n /**\n * P6 Tier.\n */\n PremiumPageBlobTier["P6"] = "P6";\n /**\n * P10 Tier.\n */\n PremiumPageBlobTier["P10"] = "P10";\n /**\n * P15 Tier.\n */\n PremiumPageBlobTier["P15"] = "P15";\n /**\n * P20 Tier.\n */\n PremiumPageBlobTier["P20"] = "P20";\n /**\n * P30 Tier.\n */\n PremiumPageBlobTier["P30"] = "P30";\n /**\n * P40 Tier.\n */\n PremiumPageBlobTier["P40"] = "P40";\n /**\n * P50 Tier.\n */\n PremiumPageBlobTier["P50"] = "P50";\n /**\n * P60 Tier.\n */\n PremiumPageBlobTier["P60"] = "P60";\n /**\n * P70 Tier.\n */\n PremiumPageBlobTier["P70"] = "P70";\n /**\n * P80 Tier.\n */\n PremiumPageBlobTier["P80"] = "P80";\n})(PremiumPageBlobTier || (PremiumPageBlobTier = {}));\nfunction toAccessTier(tier) {\n if (tier === undefined) {\n return undefined;\n }\n return tier; // No more check if string is a valid AccessTier, and left this to underlay logic to decide(service).\n}\nfunction ensureCpkIfSpecified(cpk, isHttps) {\n if (cpk && !isHttps) {\n throw new RangeError("Customer-provided encryption key must be used over HTTPS.");\n }\n if (cpk && !cpk.encryptionAlgorithm) {\n cpk.encryptionAlgorithm = EncryptionAlgorithmAES25;\n }\n}\n/**\n * Defines the known cloud audiences for Storage.\n */\nvar StorageBlobAudience;\n(function (StorageBlobAudience) {\n /**\n * The OAuth scope to use to retrieve an AAD token for Azure Storage.\n */\n StorageBlobAudience["StorageOAuthScopes"] = "https://storage.azure.com/.default";\n /**\n * The OAuth scope to use to retrieve an AAD token for Azure Disk.\n */\n StorageBlobAudience["DiskComputeOAuthScopes"] = "https://disk.compute.azure.com/.default";\n})(StorageBlobAudience || (StorageBlobAudience = {}));\nfunction getBlobServiceAccountAudience(storageAccountName) {\n return `https://${storageAccountName}.blob.core.windows.net/.default`;\n}\n//# sourceMappingURL=models.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/PageBlobRangeResponse.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * Function that converts PageRange and ClearRange to a common Range object.\n * PageRange and ClearRange have start and end while Range offset and count\n * this function normalizes to Range.\n * @param response - Model PageBlob Range response\n */\nfunction rangeResponseFromModel(response) {\n const pageRange = (response._response.parsedBody.pageRange || []).map((x) => ({\n offset: x.start,\n count: x.end - x.start,\n }));\n const clearRange = (response._response.parsedBody.clearRange || []).map((x) => ({\n offset: x.start,\n count: x.end - x.start,\n }));\n return Object.assign(Object.assign({}, response), { pageRange,\n clearRange, _response: Object.assign(Object.assign({}, response._response), { parsedBody: {\n pageRange,\n clearRange,\n } }) });\n}\n//# sourceMappingURL=PageBlobRangeResponse.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist-esm/src/legacy/poller.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * When a poller is manually stopped through the `stopPolling` method,\n * the poller will be rejected with an instance of the PollerStoppedError.\n */\nclass PollerStoppedError extends Error {\n constructor(message) {\n super(message);\n this.name = "PollerStoppedError";\n Object.setPrototypeOf(this, PollerStoppedError.prototype);\n }\n}\n/**\n * When the operation is cancelled, the poller will be rejected with an instance\n * of the PollerCancelledError.\n */\nclass PollerCancelledError extends Error {\n constructor(message) {\n super(message);\n this.name = "PollerCancelledError";\n Object.setPrototypeOf(this, PollerCancelledError.prototype);\n }\n}\n/**\n * A class that represents the definition of a program that polls through consecutive requests\n * until it reaches a state of completion.\n *\n * A poller can be executed manually, by polling request by request by calling to the `poll()` method repeatedly, until its operation is completed.\n * It also provides a way to wait until the operation completes, by calling `pollUntilDone()` and waiting until the operation finishes.\n * Pollers can also request the cancellation of the ongoing process to whom is providing the underlying long running operation.\n *\n * ```ts\n * const poller = new MyPoller();\n *\n * // Polling just once:\n * await poller.poll();\n *\n * // We can try to cancel the request here, by calling:\n * //\n * // await poller.cancelOperation();\n * //\n *\n * // Getting the final result:\n * const result = await poller.pollUntilDone();\n * ```\n *\n * The Poller is defined by two types, a type representing the state of the poller, which\n * must include a basic set of properties from `PollOperationState`,\n * and a return type defined by `TResult`, which can be anything.\n *\n * The Poller class implements the `PollerLike` interface, which allows poller implementations to avoid having\n * to export the Poller\'s class directly, and instead only export the already instantiated poller with the PollerLike type.\n *\n * ```ts\n * class Client {\n * public async makePoller: PollerLike {\n * const poller = new MyPoller({});\n * // It might be preferred to return the poller after the first request is made,\n * // so that some information can be obtained right away.\n * await poller.poll();\n * return poller;\n * }\n * }\n *\n * const poller: PollerLike = myClient.makePoller();\n * ```\n *\n * A poller can be created through its constructor, then it can be polled until it\'s completed.\n * At any point in time, the state of the poller can be obtained without delay through the getOperationState method.\n * At any point in time, the intermediate forms of the result type can be requested without delay.\n * Once the underlying operation is marked as completed, the poller will stop and the final value will be returned.\n *\n * ```ts\n * const poller = myClient.makePoller();\n * const state: MyOperationState = poller.getOperationState();\n *\n * // The intermediate result can be obtained at any time.\n * const result: MyResult | undefined = poller.getResult();\n *\n * // The final result can only be obtained after the poller finishes.\n * const result: MyResult = await poller.pollUntilDone();\n * ```\n *\n */\n// eslint-disable-next-line no-use-before-define\nclass Poller {\n /**\n * A poller needs to be initialized by passing in at least the basic properties of the `PollOperation`.\n *\n * When writing an implementation of a Poller, this implementation needs to deal with the initialization\n * of any custom state beyond the basic definition of the poller. The basic poller assumes that the poller\'s\n * operation has already been defined, at least its basic properties. The code below shows how to approach\n * the definition of the constructor of a new custom poller.\n *\n * ```ts\n * export class MyPoller extends Poller {\n * constructor({\n * // Anything you might need outside of the basics\n * }) {\n * let state: MyOperationState = {\n * privateProperty: private,\n * publicProperty: public,\n * };\n *\n * const operation = {\n * state,\n * update,\n * cancel,\n * toString\n * }\n *\n * // Sending the operation to the parent\'s constructor.\n * super(operation);\n *\n * // You can assign more local properties here.\n * }\n * }\n * ```\n *\n * Inside of this constructor, a new promise is created. This will be used to\n * tell the user when the poller finishes (see `pollUntilDone()`). The promise\'s\n * resolve and reject methods are also used internally to control when to resolve\n * or reject anyone waiting for the poller to finish.\n *\n * The constructor of a custom implementation of a poller is where any serialized version of\n * a previous poller\'s operation should be deserialized into the operation sent to the\n * base constructor. For example:\n *\n * ```ts\n * export class MyPoller extends Poller {\n * constructor(\n * baseOperation: string | undefined\n * ) {\n * let state: MyOperationState = {};\n * if (baseOperation) {\n * state = {\n * ...JSON.parse(baseOperation).state,\n * ...state\n * };\n * }\n * const operation = {\n * state,\n * // ...\n * }\n * super(operation);\n * }\n * }\n * ```\n *\n * @param operation - Must contain the basic properties of `PollOperation`.\n */\n constructor(operation) {\n /** controls whether to throw an error if the operation failed or was canceled. */\n this.resolveOnUnsuccessful = false;\n this.stopped = true;\n this.pollProgressCallbacks = [];\n this.operation = operation;\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n // This prevents the UnhandledPromiseRejectionWarning in node.js from being thrown.\n // The above warning would get thrown if `poller.poll` is called, it returns an error,\n // and pullUntilDone did not have a .catch or await try/catch on it\'s return value.\n this.promise.catch(() => {\n /* intentionally blank */\n });\n }\n /**\n * Starts a loop that will break only if the poller is done\n * or if the poller is stopped.\n */\n async startPolling(pollOptions = {}) {\n if (this.stopped) {\n this.stopped = false;\n }\n while (!this.isStopped() && !this.isDone()) {\n await this.poll(pollOptions);\n await this.delay();\n }\n }\n /**\n * pollOnce does one polling, by calling to the update method of the underlying\n * poll operation to make any relevant change effective.\n *\n * It only optionally receives an object with an abortSignal property, from \\@azure/abort-controller\'s AbortSignalLike.\n *\n * @param options - Optional properties passed to the operation\'s update method.\n */\n async pollOnce(options = {}) {\n if (!this.isDone()) {\n this.operation = await this.operation.update({\n abortSignal: options.abortSignal,\n fireProgress: this.fireProgress.bind(this),\n });\n }\n this.processUpdatedState();\n }\n /**\n * fireProgress calls the functions passed in via onProgress the method of the poller.\n *\n * It loops over all of the callbacks received from onProgress, and executes them, sending them\n * the current operation state.\n *\n * @param state - The current operation state.\n */\n fireProgress(state) {\n for (const callback of this.pollProgressCallbacks) {\n callback(state);\n }\n }\n /**\n * Invokes the underlying operation\'s cancel method.\n */\n async cancelOnce(options = {}) {\n this.operation = await this.operation.cancel(options);\n }\n /**\n * Returns a promise that will resolve once a single polling request finishes.\n * It does this by calling the update method of the Poller\'s operation.\n *\n * It only optionally receives an object with an abortSignal property, from \\@azure/abort-controller\'s AbortSignalLike.\n *\n * @param options - Optional properties passed to the operation\'s update method.\n */\n poll(options = {}) {\n if (!this.pollOncePromise) {\n this.pollOncePromise = this.pollOnce(options);\n const clearPollOncePromise = () => {\n this.pollOncePromise = undefined;\n };\n this.pollOncePromise.then(clearPollOncePromise, clearPollOncePromise).catch(this.reject);\n }\n return this.pollOncePromise;\n }\n processUpdatedState() {\n if (this.operation.state.error) {\n this.stopped = true;\n if (!this.resolveOnUnsuccessful) {\n this.reject(this.operation.state.error);\n throw this.operation.state.error;\n }\n }\n if (this.operation.state.isCancelled) {\n this.stopped = true;\n if (!this.resolveOnUnsuccessful) {\n const error = new PollerCancelledError("Operation was canceled");\n this.reject(error);\n throw error;\n }\n }\n if (this.isDone() && this.resolve) {\n // If the poller has finished polling, this means we now have a result.\n // However, it can be the case that TResult is instantiated to void, so\n // we are not expecting a result anyway. To assert that we might not\n // have a result eventually after finishing polling, we cast the result\n // to TResult.\n this.resolve(this.getResult());\n }\n }\n /**\n * Returns a promise that will resolve once the underlying operation is completed.\n */\n async pollUntilDone(pollOptions = {}) {\n if (this.stopped) {\n this.startPolling(pollOptions).catch(this.reject);\n }\n // This is needed because the state could have been updated by\n // `cancelOperation`, e.g. the operation is canceled or an error occurred.\n this.processUpdatedState();\n return this.promise;\n }\n /**\n * Invokes the provided callback after each polling is completed,\n * sending the current state of the poller\'s operation.\n *\n * It returns a method that can be used to stop receiving updates on the given callback function.\n */\n onProgress(callback) {\n this.pollProgressCallbacks.push(callback);\n return () => {\n this.pollProgressCallbacks = this.pollProgressCallbacks.filter((c) => c !== callback);\n };\n }\n /**\n * Returns true if the poller has finished polling.\n */\n isDone() {\n const state = this.operation.state;\n return Boolean(state.isCompleted || state.isCancelled || state.error);\n }\n /**\n * Stops the poller from continuing to poll.\n */\n stopPolling() {\n if (!this.stopped) {\n this.stopped = true;\n if (this.reject) {\n this.reject(new PollerStoppedError("This poller is already stopped"));\n }\n }\n }\n /**\n * Returns true if the poller is stopped.\n */\n isStopped() {\n return this.stopped;\n }\n /**\n * Attempts to cancel the underlying operation.\n *\n * It only optionally receives an object with an abortSignal property, from \\@azure/abort-controller\'s AbortSignalLike.\n *\n * If it\'s called again before it finishes, it will throw an error.\n *\n * @param options - Optional properties passed to the operation\'s update method.\n */\n cancelOperation(options = {}) {\n if (!this.cancelPromise) {\n this.cancelPromise = this.cancelOnce(options);\n }\n else if (options.abortSignal) {\n throw new Error("A cancel request is currently pending");\n }\n return this.cancelPromise;\n }\n /**\n * Returns the state of the operation.\n *\n * Even though TState will be the same type inside any of the methods of any extension of the Poller class,\n * implementations of the pollers can customize what\'s shared with the public by writing their own\n * version of the `getOperationState` method, and by defining two types, one representing the internal state of the poller\n * and a public type representing a safe to share subset of the properties of the internal state.\n * Their definition of getOperationState can then return their public type.\n *\n * Example:\n *\n * ```ts\n * // Let\'s say we have our poller\'s operation state defined as:\n * interface MyOperationState extends PollOperationState {\n * privateProperty?: string;\n * publicProperty?: string;\n * }\n *\n * // To allow us to have a true separation of public and private state, we have to define another interface:\n * interface PublicState extends PollOperationState {\n * publicProperty?: string;\n * }\n *\n * // Then, we define our Poller as follows:\n * export class MyPoller extends Poller {\n * // ... More content is needed here ...\n *\n * public getOperationState(): PublicState {\n * const state: PublicState = this.operation.state;\n * return {\n * // Properties from PollOperationState\n * isStarted: state.isStarted,\n * isCompleted: state.isCompleted,\n * isCancelled: state.isCancelled,\n * error: state.error,\n * result: state.result,\n *\n * // The only other property needed by PublicState.\n * publicProperty: state.publicProperty\n * }\n * }\n * }\n * ```\n *\n * You can see this in the tests of this repository, go to the file:\n * `../test/utils/testPoller.ts`\n * and look for the getOperationState implementation.\n */\n getOperationState() {\n return this.operation.state;\n }\n /**\n * Returns the result value of the operation,\n * regardless of the state of the poller.\n * It can return undefined or an incomplete form of the final TResult value\n * depending on the implementation.\n */\n getResult() {\n const state = this.operation.state;\n return state.result;\n }\n /**\n * Returns a serialized version of the poller\'s operation\n * by invoking the operation\'s toString method.\n */\n toString() {\n return this.operation.toString();\n }\n}\n//# sourceMappingURL=poller.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/pollers/BlobStartCopyFromUrlPoller.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * This is the poller returned by {@link BlobClient.beginCopyFromURL}.\n * This can not be instantiated directly outside of this package.\n *\n * @hidden\n */\nclass BlobBeginCopyFromUrlPoller extends Poller {\n constructor(options) {\n const { blobClient, copySource, intervalInMs = 15000, onProgress, resumeFrom, startCopyFromURLOptions, } = options;\n let state;\n if (resumeFrom) {\n state = JSON.parse(resumeFrom).state;\n }\n const operation = makeBlobBeginCopyFromURLPollOperation(Object.assign(Object.assign({}, state), { blobClient,\n copySource,\n startCopyFromURLOptions }));\n super(operation);\n if (typeof onProgress === "function") {\n this.onProgress(onProgress);\n }\n this.intervalInMs = intervalInMs;\n }\n delay() {\n return delay_delay(this.intervalInMs);\n }\n}\n/**\n * Note: Intentionally using function expression over arrow function expression\n * so that the function can be invoked with a different context.\n * This affects what `this` refers to.\n * @hidden\n */\nconst cancel = async function cancel(options = {}) {\n const state = this.state;\n const { copyId } = state;\n if (state.isCompleted) {\n return makeBlobBeginCopyFromURLPollOperation(state);\n }\n if (!copyId) {\n state.isCancelled = true;\n return makeBlobBeginCopyFromURLPollOperation(state);\n }\n // if abortCopyFromURL throws, it will bubble up to user\'s poller.cancelOperation call\n await state.blobClient.abortCopyFromURL(copyId, {\n abortSignal: options.abortSignal,\n });\n state.isCancelled = true;\n return makeBlobBeginCopyFromURLPollOperation(state);\n};\n/**\n * Note: Intentionally using function expression over arrow function expression\n * so that the function can be invoked with a different context.\n * This affects what `this` refers to.\n * @hidden\n */\nconst update = async function update(options = {}) {\n const state = this.state;\n const { blobClient, copySource, startCopyFromURLOptions } = state;\n if (!state.isStarted) {\n state.isStarted = true;\n const result = await blobClient.startCopyFromURL(copySource, startCopyFromURLOptions);\n // copyId is needed to abort\n state.copyId = result.copyId;\n if (result.copyStatus === "success") {\n state.result = result;\n state.isCompleted = true;\n }\n }\n else if (!state.isCompleted) {\n try {\n const result = await state.blobClient.getProperties({ abortSignal: options.abortSignal });\n const { copyStatus, copyProgress } = result;\n const prevCopyProgress = state.copyProgress;\n if (copyProgress) {\n state.copyProgress = copyProgress;\n }\n if (copyStatus === "pending" &&\n copyProgress !== prevCopyProgress &&\n typeof options.fireProgress === "function") {\n // trigger in setTimeout, or swallow error?\n options.fireProgress(state);\n }\n else if (copyStatus === "success") {\n state.result = result;\n state.isCompleted = true;\n }\n else if (copyStatus === "failed") {\n state.error = new Error(`Blob copy failed with reason: "${result.copyStatusDescription || "unknown"}"`);\n state.isCompleted = true;\n }\n }\n catch (err) {\n state.error = err;\n state.isCompleted = true;\n }\n }\n return makeBlobBeginCopyFromURLPollOperation(state);\n};\n/**\n * Note: Intentionally using function expression over arrow function expression\n * so that the function can be invoked with a different context.\n * This affects what `this` refers to.\n * @hidden\n */\nconst BlobStartCopyFromUrlPoller_toString = function toString() {\n return JSON.stringify({ state: this.state }, (key, value) => {\n // remove blobClient from serialized state since a client can\'t be hydrated from this info.\n if (key === "blobClient") {\n return undefined;\n }\n return value;\n });\n};\n/**\n * Creates a poll operation given the provided state.\n * @hidden\n */\nfunction makeBlobBeginCopyFromURLPollOperation(state) {\n return {\n state: Object.assign({}, state),\n cancel,\n toString: BlobStartCopyFromUrlPoller_toString,\n update,\n };\n}\n//# sourceMappingURL=BlobStartCopyFromUrlPoller.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/Range.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * Generate a range string. For example:\n *\n * "bytes=255-" or "bytes=0-511"\n *\n * @param iRange -\n */\nfunction rangeToString(iRange) {\n if (iRange.offset < 0) {\n throw new RangeError(`Range.offset cannot be smaller than 0.`);\n }\n if (iRange.count && iRange.count <= 0) {\n throw new RangeError(`Range.count must be larger than 0. Leave it undefined if you want a range from offset to the end.`);\n }\n return iRange.count\n ? `bytes=${iRange.offset}-${iRange.offset + iRange.count - 1}`\n : `bytes=${iRange.offset}-`;\n}\n//# sourceMappingURL=Range.js.map\n// EXTERNAL MODULE: external "events"\nvar external_events_ = __webpack_require__(2361);\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/utils/Batch.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n// In browser, during webpack or browserify bundling, this module will be replaced by \'events\'\n// https://github.com/Gozala/events\n\n/**\n * States for Batch.\n */\nvar BatchStates;\n(function (BatchStates) {\n BatchStates[BatchStates["Good"] = 0] = "Good";\n BatchStates[BatchStates["Error"] = 1] = "Error";\n})(BatchStates || (BatchStates = {}));\n/**\n * Batch provides basic parallel execution with concurrency limits.\n * Will stop execute left operations when one of the executed operation throws an error.\n * But Batch cannot cancel ongoing operations, you need to cancel them by yourself.\n */\nclass Batch {\n /**\n * Creates an instance of Batch.\n * @param concurrency -\n */\n constructor(concurrency = 5) {\n /**\n * Number of active operations under execution.\n */\n this.actives = 0;\n /**\n * Number of completed operations under execution.\n */\n this.completed = 0;\n /**\n * Offset of next operation to be executed.\n */\n this.offset = 0;\n /**\n * Operation array to be executed.\n */\n this.operations = [];\n /**\n * States of Batch. When an error happens, state will turn into error.\n * Batch will stop execute left operations.\n */\n this.state = BatchStates.Good;\n if (concurrency < 1) {\n throw new RangeError("concurrency must be larger than 0");\n }\n this.concurrency = concurrency;\n this.emitter = new external_events_.EventEmitter();\n }\n /**\n * Add a operation into queue.\n *\n * @param operation -\n */\n addOperation(operation) {\n this.operations.push(async () => {\n try {\n this.actives++;\n await operation();\n this.actives--;\n this.completed++;\n this.parallelExecute();\n }\n catch (error) {\n this.emitter.emit("error", error);\n }\n });\n }\n /**\n * Start execute operations in the queue.\n *\n */\n async do() {\n if (this.operations.length === 0) {\n return Promise.resolve();\n }\n this.parallelExecute();\n return new Promise((resolve, reject) => {\n this.emitter.on("finish", resolve);\n this.emitter.on("error", (error) => {\n this.state = BatchStates.Error;\n reject(error);\n });\n });\n }\n /**\n * Get next operation to be executed. Return null when reaching ends.\n *\n */\n nextOperation() {\n if (this.offset < this.operations.length) {\n return this.operations[this.offset++];\n }\n return null;\n }\n /**\n * Start execute operations. One one the most important difference between\n * this method with do() is that do() wraps as an sync method.\n *\n */\n parallelExecute() {\n if (this.state === BatchStates.Error) {\n return;\n }\n if (this.completed >= this.operations.length) {\n this.emitter.emit("finish");\n return;\n }\n while (this.actives < this.concurrency) {\n const operation = this.nextOperation();\n if (operation) {\n operation();\n }\n else {\n return;\n }\n }\n }\n}\n//# sourceMappingURL=Batch.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-common/src/BuffersStream.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * This class generates a readable stream from the data in an array of buffers.\n */\nclass BuffersStream extends external_stream_.Readable {\n /**\n * Creates an instance of BuffersStream that will emit the data\n * contained in the array of buffers.\n *\n * @param buffers - Array of buffers containing the data\n * @param byteLength - The total length of data contained in the buffers\n */\n constructor(buffers, byteLength, options) {\n super(options);\n this.buffers = buffers;\n this.byteLength = byteLength;\n this.byteOffsetInCurrentBuffer = 0;\n this.bufferIndex = 0;\n this.pushedBytesLength = 0;\n // check byteLength is no larger than buffers[] total length\n let buffersLength = 0;\n for (const buf of this.buffers) {\n buffersLength += buf.byteLength;\n }\n if (buffersLength < this.byteLength) {\n throw new Error("Data size shouldn\'t be larger than the total length of buffers.");\n }\n }\n /**\n * Internal _read() that will be called when the stream wants to pull more data in.\n *\n * @param size - Optional. The size of data to be read\n */\n _read(size) {\n if (this.pushedBytesLength >= this.byteLength) {\n this.push(null);\n }\n if (!size) {\n size = this.readableHighWaterMark;\n }\n const outBuffers = [];\n let i = 0;\n while (i < size && this.pushedBytesLength < this.byteLength) {\n // The last buffer may be longer than the data it contains.\n const remainingDataInAllBuffers = this.byteLength - this.pushedBytesLength;\n const remainingCapacityInThisBuffer = this.buffers[this.bufferIndex].byteLength - this.byteOffsetInCurrentBuffer;\n const remaining = Math.min(remainingCapacityInThisBuffer, remainingDataInAllBuffers);\n if (remaining > size - i) {\n // chunkSize = size - i\n const end = this.byteOffsetInCurrentBuffer + size - i;\n outBuffers.push(this.buffers[this.bufferIndex].slice(this.byteOffsetInCurrentBuffer, end));\n this.pushedBytesLength += size - i;\n this.byteOffsetInCurrentBuffer = end;\n i = size;\n break;\n }\n else {\n // chunkSize = remaining\n const end = this.byteOffsetInCurrentBuffer + remaining;\n outBuffers.push(this.buffers[this.bufferIndex].slice(this.byteOffsetInCurrentBuffer, end));\n if (remaining === remainingCapacityInThisBuffer) {\n // this.buffers[this.bufferIndex] used up, shift to next one\n this.byteOffsetInCurrentBuffer = 0;\n this.bufferIndex++;\n }\n else {\n this.byteOffsetInCurrentBuffer = end;\n }\n this.pushedBytesLength += remaining;\n i += remaining;\n }\n }\n if (outBuffers.length > 1) {\n this.push(Buffer.concat(outBuffers));\n }\n else if (outBuffers.length === 1) {\n this.push(outBuffers[0]);\n }\n }\n}\n//# sourceMappingURL=BuffersStream.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-common/src/PooledBuffer.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * maxBufferLength is max size of each buffer in the pooled buffers.\n */\n// Can\'t use import as Typescript doesn\'t recognize "buffer".\nconst maxBufferLength = (__webpack_require__(4300).constants).MAX_LENGTH;\n/**\n * This class provides a buffer container which conceptually has no hard size limit.\n * It accepts a capacity, an array of input buffers and the total length of input data.\n * It will allocate an internal "buffer" of the capacity and fill the data in the input buffers\n * into the internal "buffer" serially with respect to the total length.\n * Then by calling PooledBuffer.getReadableStream(), you can get a readable stream\n * assembled from all the data in the internal "buffer".\n */\nclass PooledBuffer {\n constructor(capacity, buffers, totalLength) {\n /**\n * Internal buffers used to keep the data.\n * Each buffer has a length of the maxBufferLength except last one.\n */\n this.buffers = [];\n this.capacity = capacity;\n this._size = 0;\n // allocate\n const bufferNum = Math.ceil(capacity / maxBufferLength);\n for (let i = 0; i < bufferNum; i++) {\n let len = i === bufferNum - 1 ? capacity % maxBufferLength : maxBufferLength;\n if (len === 0) {\n len = maxBufferLength;\n }\n this.buffers.push(Buffer.allocUnsafe(len));\n }\n if (buffers) {\n this.fill(buffers, totalLength);\n }\n }\n /**\n * The size of the data contained in the pooled buffers.\n */\n get size() {\n return this._size;\n }\n /**\n * Fill the internal buffers with data in the input buffers serially\n * with respect to the total length and the total capacity of the internal buffers.\n * Data copied will be shift out of the input buffers.\n *\n * @param buffers - Input buffers containing the data to be filled in the pooled buffer\n * @param totalLength - Total length of the data to be filled in.\n *\n */\n fill(buffers, totalLength) {\n this._size = Math.min(this.capacity, totalLength);\n let i = 0, j = 0, targetOffset = 0, sourceOffset = 0, totalCopiedNum = 0;\n while (totalCopiedNum < this._size) {\n const source = buffers[i];\n const target = this.buffers[j];\n const copiedNum = source.copy(target, targetOffset, sourceOffset);\n totalCopiedNum += copiedNum;\n sourceOffset += copiedNum;\n targetOffset += copiedNum;\n if (sourceOffset === source.length) {\n i++;\n sourceOffset = 0;\n }\n if (targetOffset === target.length) {\n j++;\n targetOffset = 0;\n }\n }\n // clear copied from source buffers\n buffers.splice(0, i);\n if (buffers.length > 0) {\n buffers[0] = buffers[0].slice(sourceOffset);\n }\n }\n /**\n * Get the readable stream assembled from all the data in the internal buffers.\n *\n */\n getReadableStream() {\n return new BuffersStream(this.buffers, this.size);\n }\n}\n//# sourceMappingURL=PooledBuffer.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-common/src/BufferScheduler.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * This class accepts a Node.js Readable stream as input, and keeps reading data\n * from the stream into the internal buffer structure, until it reaches maxBuffers.\n * Every available buffer will try to trigger outgoingHandler.\n *\n * The internal buffer structure includes an incoming buffer array, and a outgoing\n * buffer array. The incoming buffer array includes the "empty" buffers can be filled\n * with new incoming data. The outgoing array includes the filled buffers to be\n * handled by outgoingHandler. Every above buffer size is defined by parameter bufferSize.\n *\n * NUM_OF_ALL_BUFFERS = BUFFERS_IN_INCOMING + BUFFERS_IN_OUTGOING + BUFFERS_UNDER_HANDLING\n *\n * NUM_OF_ALL_BUFFERS lesser than or equal to maxBuffers\n *\n * PERFORMANCE IMPROVEMENT TIPS:\n * 1. Input stream highWaterMark is better to set a same value with bufferSize\n * parameter, which will avoid Buffer.concat() operations.\n * 2. concurrency should set a smaller value than maxBuffers, which is helpful to\n * reduce the possibility when a outgoing handler waits for the stream data.\n * in this situation, outgoing handlers are blocked.\n * Outgoing queue shouldn\'t be empty.\n */\nclass BufferScheduler {\n /**\n * Creates an instance of BufferScheduler.\n *\n * @param readable - A Node.js Readable stream\n * @param bufferSize - Buffer size of every maintained buffer\n * @param maxBuffers - How many buffers can be allocated\n * @param outgoingHandler - An async function scheduled to be\n * triggered when a buffer fully filled\n * with stream data\n * @param concurrency - Concurrency of executing outgoingHandlers (>0)\n * @param encoding - [Optional] Encoding of Readable stream when it\'s a string stream\n */\n constructor(readable, bufferSize, maxBuffers, outgoingHandler, concurrency, encoding) {\n /**\n * An internal event emitter.\n */\n this.emitter = new external_events_.EventEmitter();\n /**\n * An internal offset marker to track data offset in bytes of next outgoingHandler.\n */\n this.offset = 0;\n /**\n * An internal marker to track whether stream is end.\n */\n this.isStreamEnd = false;\n /**\n * An internal marker to track whether stream or outgoingHandler returns error.\n */\n this.isError = false;\n /**\n * How many handlers are executing.\n */\n this.executingOutgoingHandlers = 0;\n /**\n * How many buffers have been allocated.\n */\n this.numBuffers = 0;\n /**\n * Because this class doesn\'t know how much data every time stream pops, which\n * is defined by highWaterMarker of the stream. So BufferScheduler will cache\n * data received from the stream, when data in unresolvedDataArray exceeds the\n * blockSize defined, it will try to concat a blockSize of buffer, fill into available\n * buffers from incoming and push to outgoing array.\n */\n this.unresolvedDataArray = [];\n /**\n * How much data consisted in unresolvedDataArray.\n */\n this.unresolvedLength = 0;\n /**\n * The array includes all the available buffers can be used to fill data from stream.\n */\n this.incoming = [];\n /**\n * The array (queue) includes all the buffers filled from stream data.\n */\n this.outgoing = [];\n if (bufferSize <= 0) {\n throw new RangeError(`bufferSize must be larger than 0, current is ${bufferSize}`);\n }\n if (maxBuffers <= 0) {\n throw new RangeError(`maxBuffers must be larger than 0, current is ${maxBuffers}`);\n }\n if (concurrency <= 0) {\n throw new RangeError(`concurrency must be larger than 0, current is ${concurrency}`);\n }\n this.bufferSize = bufferSize;\n this.maxBuffers = maxBuffers;\n this.readable = readable;\n this.outgoingHandler = outgoingHandler;\n this.concurrency = concurrency;\n this.encoding = encoding;\n }\n /**\n * Start the scheduler, will return error when stream of any of the outgoingHandlers\n * returns error.\n *\n */\n async do() {\n return new Promise((resolve, reject) => {\n this.readable.on("data", (data) => {\n data = typeof data === "string" ? Buffer.from(data, this.encoding) : data;\n this.appendUnresolvedData(data);\n if (!this.resolveData()) {\n this.readable.pause();\n }\n });\n this.readable.on("error", (err) => {\n this.emitter.emit("error", err);\n });\n this.readable.on("end", () => {\n this.isStreamEnd = true;\n this.emitter.emit("checkEnd");\n });\n this.emitter.on("error", (err) => {\n this.isError = true;\n this.readable.pause();\n reject(err);\n });\n this.emitter.on("checkEnd", () => {\n if (this.outgoing.length > 0) {\n this.triggerOutgoingHandlers();\n return;\n }\n if (this.isStreamEnd && this.executingOutgoingHandlers === 0) {\n if (this.unresolvedLength > 0 && this.unresolvedLength < this.bufferSize) {\n const buffer = this.shiftBufferFromUnresolvedDataArray();\n this.outgoingHandler(() => buffer.getReadableStream(), buffer.size, this.offset)\n .then(resolve)\n .catch(reject);\n }\n else if (this.unresolvedLength >= this.bufferSize) {\n return;\n }\n else {\n resolve();\n }\n }\n });\n });\n }\n /**\n * Insert a new data into unresolved array.\n *\n * @param data -\n */\n appendUnresolvedData(data) {\n this.unresolvedDataArray.push(data);\n this.unresolvedLength += data.length;\n }\n /**\n * Try to shift a buffer with size in blockSize. The buffer returned may be less\n * than blockSize when data in unresolvedDataArray is less than bufferSize.\n *\n */\n shiftBufferFromUnresolvedDataArray(buffer) {\n if (!buffer) {\n buffer = new PooledBuffer(this.bufferSize, this.unresolvedDataArray, this.unresolvedLength);\n }\n else {\n buffer.fill(this.unresolvedDataArray, this.unresolvedLength);\n }\n this.unresolvedLength -= buffer.size;\n return buffer;\n }\n /**\n * Resolve data in unresolvedDataArray. For every buffer with size in blockSize\n * shifted, it will try to get (or allocate a buffer) from incoming, and fill it,\n * then push it into outgoing to be handled by outgoing handler.\n *\n * Return false when available buffers in incoming are not enough, else true.\n *\n * @returns Return false when buffers in incoming are not enough, else true.\n */\n resolveData() {\n while (this.unresolvedLength >= this.bufferSize) {\n let buffer;\n if (this.incoming.length > 0) {\n buffer = this.incoming.shift();\n this.shiftBufferFromUnresolvedDataArray(buffer);\n }\n else {\n if (this.numBuffers < this.maxBuffers) {\n buffer = this.shiftBufferFromUnresolvedDataArray();\n this.numBuffers++;\n }\n else {\n // No available buffer, wait for buffer returned\n return false;\n }\n }\n this.outgoing.push(buffer);\n this.triggerOutgoingHandlers();\n }\n return true;\n }\n /**\n * Try to trigger a outgoing handler for every buffer in outgoing. Stop when\n * concurrency reaches.\n */\n async triggerOutgoingHandlers() {\n let buffer;\n do {\n if (this.executingOutgoingHandlers >= this.concurrency) {\n return;\n }\n buffer = this.outgoing.shift();\n if (buffer) {\n this.triggerOutgoingHandler(buffer);\n }\n } while (buffer);\n }\n /**\n * Trigger a outgoing handler for a buffer shifted from outgoing.\n *\n * @param buffer -\n */\n async triggerOutgoingHandler(buffer) {\n const bufferLength = buffer.size;\n this.executingOutgoingHandlers++;\n this.offset += bufferLength;\n try {\n await this.outgoingHandler(() => buffer.getReadableStream(), bufferLength, this.offset - bufferLength);\n }\n catch (err) {\n this.emitter.emit("error", err);\n return;\n }\n this.executingOutgoingHandlers--;\n this.reuseBuffer(buffer);\n this.emitter.emit("checkEnd");\n }\n /**\n * Return buffer used by outgoing handler into incoming.\n *\n * @param buffer -\n */\n reuseBuffer(buffer) {\n this.incoming.push(buffer);\n if (!this.isError && this.resolveData() && !this.isStreamEnd) {\n this.readable.resume();\n }\n }\n}\n//# sourceMappingURL=BufferScheduler.js.map\n// EXTERNAL MODULE: external "fs"\nvar external_fs_ = __webpack_require__(7147);\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/utils/utils.node.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n/**\n * Reads a readable stream into buffer. Fill the buffer from offset to end.\n *\n * @param stream - A Node.js Readable stream\n * @param buffer - Buffer to be filled, length must greater than or equal to offset\n * @param offset - From which position in the buffer to be filled, inclusive\n * @param end - To which position in the buffer to be filled, exclusive\n * @param encoding - Encoding of the Readable stream\n */\nasync function streamToBuffer(stream, buffer, offset, end, encoding) {\n let pos = 0; // Position in stream\n const count = end - offset; // Total amount of data needed in stream\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => reject(new Error(`The operation cannot be completed in timeout.`)), REQUEST_TIMEOUT);\n stream.on("readable", () => {\n if (pos >= count) {\n clearTimeout(timeout);\n resolve();\n return;\n }\n let chunk = stream.read();\n if (!chunk) {\n return;\n }\n if (typeof chunk === "string") {\n chunk = Buffer.from(chunk, encoding);\n }\n // How much data needed in this chunk\n const chunkLength = pos + chunk.length > count ? count - pos : chunk.length;\n buffer.fill(chunk.slice(0, chunkLength), offset + pos, offset + pos + chunkLength);\n pos += chunkLength;\n });\n stream.on("end", () => {\n clearTimeout(timeout);\n if (pos < count) {\n reject(new Error(`Stream drains before getting enough data needed. Data read: ${pos}, data need: ${count}`));\n }\n resolve();\n });\n stream.on("error", (msg) => {\n clearTimeout(timeout);\n reject(msg);\n });\n });\n}\n/**\n * Reads a readable stream into buffer entirely.\n *\n * @param stream - A Node.js Readable stream\n * @param buffer - Buffer to be filled, length must greater than or equal to offset\n * @param encoding - Encoding of the Readable stream\n * @returns with the count of bytes read.\n * @throws `RangeError` If buffer size is not big enough.\n */\nasync function streamToBuffer2(stream, buffer, encoding) {\n let pos = 0; // Position in stream\n const bufferSize = buffer.length;\n return new Promise((resolve, reject) => {\n stream.on("readable", () => {\n let chunk = stream.read();\n if (!chunk) {\n return;\n }\n if (typeof chunk === "string") {\n chunk = Buffer.from(chunk, encoding);\n }\n if (pos + chunk.length > bufferSize) {\n reject(new Error(`Stream exceeds buffer size. Buffer size: ${bufferSize}`));\n return;\n }\n buffer.fill(chunk, pos, pos + chunk.length);\n pos += chunk.length;\n });\n stream.on("end", () => {\n resolve(pos);\n });\n stream.on("error", reject);\n });\n}\n/**\n * Reads a readable stream into a buffer.\n *\n * @param stream - A Node.js Readable stream\n * @param encoding - Encoding of the Readable stream\n * @returns with the count of bytes read.\n */\nasync function streamToBuffer3(readableStream, encoding) {\n return new Promise((resolve, reject) => {\n const chunks = [];\n readableStream.on("data", (data) => {\n chunks.push(data instanceof Buffer ? data : Buffer.from(data, encoding));\n });\n readableStream.on("end", () => {\n resolve(Buffer.concat(chunks));\n });\n readableStream.on("error", reject);\n });\n}\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * Writes the content of a readstream to a local file. Returns a Promise which is completed after the file handle is closed.\n *\n * @param rs - The read stream.\n * @param file - Destination file path.\n */\nasync function readStreamToLocalFile(rs, file) {\n return new Promise((resolve, reject) => {\n const ws = external_fs_.createWriteStream(file);\n rs.on("error", (err) => {\n reject(err);\n });\n ws.on("error", (err) => {\n reject(err);\n });\n ws.on("close", resolve);\n rs.pipe(ws);\n });\n}\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * Promisified version of fs.stat().\n */\nconst fsStat = external_util_.promisify(external_fs_.stat);\nconst fsCreateReadStream = external_fs_.createReadStream;\n//# sourceMappingURL=utils.node.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/Clients.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * A BlobClient represents a URL to an Azure Storage blob; the blob may be a block blob,\n * append blob, or page blob.\n */\nclass BlobClient extends StorageClient {\n constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions, \n // Legacy, no fix for eslint error without breaking. Disable it for this interface.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/\n options) {\n options = options || {};\n let pipeline;\n let url;\n if (isPipelineLike(credentialOrPipelineOrContainerName)) {\n // (url: string, pipeline: Pipeline)\n url = urlOrConnectionString;\n pipeline = credentialOrPipelineOrContainerName;\n }\n else if ((checkEnvironment_isNode && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential) ||\n credentialOrPipelineOrContainerName instanceof AnonymousCredential ||\n isTokenCredential(credentialOrPipelineOrContainerName)) {\n // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)\n url = urlOrConnectionString;\n options = blobNameOrOptions;\n pipeline = newPipeline(credentialOrPipelineOrContainerName, options);\n }\n else if (!credentialOrPipelineOrContainerName &&\n typeof credentialOrPipelineOrContainerName !== "string") {\n // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)\n // The second parameter is undefined. Use anonymous credential.\n url = urlOrConnectionString;\n if (blobNameOrOptions && typeof blobNameOrOptions !== "string") {\n options = blobNameOrOptions;\n }\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else if (credentialOrPipelineOrContainerName &&\n typeof credentialOrPipelineOrContainerName === "string" &&\n blobNameOrOptions &&\n typeof blobNameOrOptions === "string") {\n // (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)\n const containerName = credentialOrPipelineOrContainerName;\n const blobName = blobNameOrOptions;\n const extractedCreds = extractConnectionStringParts(urlOrConnectionString);\n if (extractedCreds.kind === "AccountConnString") {\n if (checkEnvironment_isNode) {\n const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);\n url = appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName));\n if (!options.proxyOptions) {\n options.proxyOptions = getDefaultProxySettings(extractedCreds.proxyUri);\n }\n pipeline = newPipeline(sharedKeyCredential, options);\n }\n else {\n throw new Error("Account connection string is only supported in Node.js environment");\n }\n }\n else if (extractedCreds.kind === "SASConnString") {\n url =\n appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) +\n "?" +\n extractedCreds.accountSas;\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else {\n throw new Error("Connection string must be either an Account connection string or a SAS connection string");\n }\n }\n else {\n throw new Error("Expecting non-empty strings for containerName and blobName parameters");\n }\n super(url, pipeline);\n ({ blobName: this._name, containerName: this._containerName } =\n this.getBlobAndContainerNamesFromUrl());\n this.blobContext = new blob_Blob(this.storageClientContext);\n this._snapshot = getURLParameter(this.url, constants_URLConstants.Parameters.SNAPSHOT);\n this._versionId = getURLParameter(this.url, constants_URLConstants.Parameters.VERSIONID);\n }\n /**\n * The name of the blob.\n */\n get name() {\n return this._name;\n }\n /**\n * The name of the storage container the blob is associated with.\n */\n get containerName() {\n return this._containerName;\n }\n /**\n * Creates a new BlobClient object identical to the source but with the specified snapshot timestamp.\n * Provide "" will remove the snapshot and return a Client to the base blob.\n *\n * @param snapshot - The snapshot timestamp.\n * @returns A new BlobClient object identical to the source but with the specified snapshot timestamp\n */\n withSnapshot(snapshot) {\n return new BlobClient(setURLParameter(this.url, constants_URLConstants.Parameters.SNAPSHOT, snapshot.length === 0 ? undefined : snapshot), this.pipeline);\n }\n /**\n * Creates a new BlobClient object pointing to a version of this blob.\n * Provide "" will remove the versionId and return a Client to the base blob.\n *\n * @param versionId - The versionId.\n * @returns A new BlobClient object pointing to the version of this blob.\n */\n withVersion(versionId) {\n return new BlobClient(setURLParameter(this.url, constants_URLConstants.Parameters.VERSIONID, versionId.length === 0 ? undefined : versionId), this.pipeline);\n }\n /**\n * Creates a AppendBlobClient object.\n *\n */\n getAppendBlobClient() {\n return new AppendBlobClient(this.url, this.pipeline);\n }\n /**\n * Creates a BlockBlobClient object.\n *\n */\n getBlockBlobClient() {\n return new BlockBlobClient(this.url, this.pipeline);\n }\n /**\n * Creates a PageBlobClient object.\n *\n */\n getPageBlobClient() {\n return new PageBlobClient(this.url, this.pipeline);\n }\n /**\n * Reads or downloads a blob from the system, including its metadata and properties.\n * You can also call Get Blob to read a snapshot.\n *\n * * In Node.js, data returns in a Readable stream readableStreamBody\n * * In browsers, data returns in a promise blobBody\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob\n *\n * @param offset - From which position of the blob to download, greater than or equal to 0\n * @param count - How much data to be downloaded, greater than 0. Will download to the end when undefined\n * @param options - Optional options to Blob Download operation.\n *\n *\n * Example usage (Node.js):\n *\n * ```js\n * // Download and convert a blob to a string\n * const downloadBlockBlobResponse = await blobClient.download();\n * const downloaded = await streamToBuffer(downloadBlockBlobResponse.readableStreamBody);\n * console.log("Downloaded blob content:", downloaded.toString());\n *\n * async function streamToBuffer(readableStream) {\n * return new Promise((resolve, reject) => {\n * const chunks = [];\n * readableStream.on("data", (data) => {\n * chunks.push(data instanceof Buffer ? data : Buffer.from(data));\n * });\n * readableStream.on("end", () => {\n * resolve(Buffer.concat(chunks));\n * });\n * readableStream.on("error", reject);\n * });\n * }\n * ```\n *\n * Example usage (browser):\n *\n * ```js\n * // Download and convert a blob to a string\n * const downloadBlockBlobResponse = await blobClient.download();\n * const downloaded = await blobToString(await downloadBlockBlobResponse.blobBody);\n * console.log(\n * "Downloaded blob content",\n * downloaded\n * );\n *\n * async function blobToString(blob: Blob): Promise {\n * const fileReader = new FileReader();\n * return new Promise((resolve, reject) => {\n * fileReader.onloadend = (ev: any) => {\n * resolve(ev.target!.result);\n * };\n * fileReader.onerror = reject;\n * fileReader.readAsText(blob);\n * });\n * }\n * ```\n */\n async download(offset = 0, count, options = {}) {\n var _a;\n options.conditions = options.conditions || {};\n options.conditions = options.conditions || {};\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n const { span, updatedOptions } = tracing_createSpan("BlobClient-download", options);\n try {\n const res = await this.blobContext.download(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), requestOptions: {\n onDownloadProgress: checkEnvironment_isNode ? undefined : options.onProgress, // for Node.js, progress is reported by RetriableReadableStream\n }, range: offset === 0 && !count ? undefined : rangeToString({ offset, count }), rangeGetContentMD5: options.rangeGetContentMD5, rangeGetContentCRC64: options.rangeGetContentCrc64, snapshot: options.snapshot, cpkInfo: options.customerProvidedKey }, convertTracingToRequestOptionsBase(updatedOptions)));\n const wrappedRes = Object.assign(Object.assign({}, res), { _response: res._response, objectReplicationDestinationPolicyId: res.objectReplicationPolicyId, objectReplicationSourceProperties: parseObjectReplicationRecord(res.objectReplicationRules) });\n // Return browser response immediately\n if (!checkEnvironment_isNode) {\n return wrappedRes;\n }\n // We support retrying when download stream unexpected ends in Node.js runtime\n // Following code shouldn\'t be bundled into browser build, however some\n // bundlers may try to bundle following code and "FileReadResponse.ts".\n // In this case, "FileDownloadResponse.browser.ts" will be used as a shim of "FileDownloadResponse.ts"\n // The config is in package.json "browser" field\n if (options.maxRetryRequests === undefined || options.maxRetryRequests < 0) {\n // TODO: Default value or make it a required parameter?\n options.maxRetryRequests = DEFAULT_MAX_DOWNLOAD_RETRY_REQUESTS;\n }\n if (res.contentLength === undefined) {\n throw new RangeError(`File download response doesn\'t contain valid content length header`);\n }\n if (!res.etag) {\n throw new RangeError(`File download response doesn\'t contain valid etag header`);\n }\n return new BlobDownloadResponse(wrappedRes, async (start) => {\n var _a;\n const updatedDownloadOptions = {\n leaseAccessConditions: options.conditions,\n modifiedAccessConditions: {\n ifMatch: options.conditions.ifMatch || res.etag,\n ifModifiedSince: options.conditions.ifModifiedSince,\n ifNoneMatch: options.conditions.ifNoneMatch,\n ifUnmodifiedSince: options.conditions.ifUnmodifiedSince,\n ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions,\n },\n range: rangeToString({\n count: offset + res.contentLength - start,\n offset: start,\n }),\n rangeGetContentMD5: options.rangeGetContentMD5,\n rangeGetContentCRC64: options.rangeGetContentCrc64,\n snapshot: options.snapshot,\n cpkInfo: options.customerProvidedKey,\n };\n // Debug purpose only\n // console.log(\n // `Read from internal stream, range: ${\n // updatedOptions.range\n // }, options: ${JSON.stringify(updatedOptions)}`\n // );\n return (await this.blobContext.download(Object.assign({ abortSignal: options.abortSignal }, updatedDownloadOptions))).readableStreamBody;\n }, offset, res.contentLength, {\n maxRetryRequests: options.maxRetryRequests,\n onProgress: options.onProgress,\n });\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns true if the Azure blob resource represented by this client exists; false otherwise.\n *\n * NOTE: use this function with care since an existing blob might be deleted by other clients or\n * applications. Vice versa new blobs might be added by other clients or applications after this\n * function completes.\n *\n * @param options - options to Exists operation.\n */\n async exists(options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobClient-exists", options);\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n await this.getProperties({\n abortSignal: options.abortSignal,\n customerProvidedKey: options.customerProvidedKey,\n conditions: options.conditions,\n tracingOptions: updatedOptions.tracingOptions,\n });\n return true;\n }\n catch (e) {\n if (e.statusCode === 404) {\n // Expected exception when checking blob existence\n return false;\n }\n else if (e.statusCode === 409 &&\n (e.details.errorCode === BlobUsesCustomerSpecifiedEncryptionMsg ||\n e.details.errorCode === BlobDoesNotUseCustomerSpecifiedEncryption)) {\n // Expected exception when checking blob existence\n return true;\n }\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns all user-defined metadata, standard HTTP properties, and system properties\n * for the blob. It does not return the content of the blob.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-properties\n *\n * WARNING: The `metadata` object returned in the response will have its keys in lowercase, even if\n * they originally contained uppercase characters. This differs from the metadata keys returned by\n * the methods of {@link ContainerClient} that list blobs using the `includeMetadata` option, which\n * will retain their original casing.\n *\n * @param options - Optional options to Get Properties operation.\n */\n async getProperties(options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-getProperties", options);\n try {\n options.conditions = options.conditions || {};\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n const res = await this.blobContext.getProperties(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), cpkInfo: options.customerProvidedKey }, convertTracingToRequestOptionsBase(updatedOptions)));\n return Object.assign(Object.assign({}, res), { _response: res._response, objectReplicationDestinationPolicyId: res.objectReplicationPolicyId, objectReplicationSourceProperties: parseObjectReplicationRecord(res.objectReplicationRules) });\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Marks the specified blob or snapshot for deletion. The blob is later deleted\n * during garbage collection. Note that in order to delete a blob, you must delete\n * all of its snapshots. You can delete both at the same time with the Delete\n * Blob operation.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/delete-blob\n *\n * @param options - Optional options to Blob Delete operation.\n */\n async delete(options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-delete", options);\n options.conditions = options.conditions || {};\n try {\n return await this.blobContext.delete(Object.assign({ abortSignal: options.abortSignal, deleteSnapshots: options.deleteSnapshots, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Marks the specified blob or snapshot for deletion if it exists. The blob is later deleted\n * during garbage collection. Note that in order to delete a blob, you must delete\n * all of its snapshots. You can delete both at the same time with the Delete\n * Blob operation.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/delete-blob\n *\n * @param options - Optional options to Blob Delete operation.\n */\n async deleteIfExists(options = {}) {\n var _a, _b;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-deleteIfExists", options);\n try {\n const res = await this.delete(updatedOptions);\n return Object.assign(Object.assign({ succeeded: true }, res), { _response: res._response });\n }\n catch (e) {\n if (((_a = e.details) === null || _a === void 0 ? void 0 : _a.errorCode) === "BlobNotFound") {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: "Expected exception when deleting a blob or snapshot only if it exists.",\n });\n return Object.assign(Object.assign({ succeeded: false }, (_b = e.response) === null || _b === void 0 ? void 0 : _b.parsedHeaders), { _response: e.response });\n }\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Restores the contents and metadata of soft deleted blob and any associated\n * soft deleted snapshots. Undelete Blob is supported only on version 2017-07-29\n * or later.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/undelete-blob\n *\n * @param options - Optional options to Blob Undelete operation.\n */\n async undelete(options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobClient-undelete", options);\n try {\n return await this.blobContext.undelete(Object.assign({ abortSignal: options.abortSignal }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Sets system properties on the blob.\n *\n * If no value provided, or no value provided for the specified blob HTTP headers,\n * these blob HTTP headers without a value will be cleared.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/set-blob-properties\n *\n * @param blobHTTPHeaders - If no value provided, or no value provided for\n * the specified blob HTTP headers, these blob HTTP\n * headers without a value will be cleared.\n * A common header to set is `blobContentType`\n * enabling the browser to provide functionality\n * based on file type.\n * @param options - Optional options to Blob Set HTTP Headers operation.\n */\n async setHTTPHeaders(blobHTTPHeaders, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-setHTTPHeaders", options);\n options.conditions = options.conditions || {};\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.blobContext.setHttpHeaders(Object.assign({ abortSignal: options.abortSignal, blobHttpHeaders: blobHTTPHeaders, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Sets user-defined metadata for the specified blob as one or more name-value pairs.\n *\n * If no option provided, or no metadata defined in the parameter, the blob\n * metadata will be removed.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/set-blob-metadata\n *\n * @param metadata - Replace existing metadata with this value.\n * If no value provided the existing metadata will be removed.\n * @param options - Optional options to Set Metadata operation.\n */\n async setMetadata(metadata, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-setMetadata", options);\n options.conditions = options.conditions || {};\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.blobContext.setMetadata(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, metadata, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Sets tags on the underlying blob.\n * A blob can have up to 10 tags. Tag keys must be between 1 and 128 characters. Tag values must be between 0 and 256 characters.\n * Valid tag key and value characters include lower and upper case letters, digits (0-9),\n * space (\' \'), plus (\'+\'), minus (\'-\'), period (\'.\'), foward slash (\'/\'), colon (\':\'), equals (\'=\'), and underscore (\'_\').\n *\n * @param tags -\n * @param options -\n */\n async setTags(tags, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-setTags", options);\n try {\n return await this.blobContext.setTags(Object.assign(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)), { tags: toBlobTags(tags) }));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Gets the tags associated with the underlying blob.\n *\n * @param options -\n */\n async getTags(options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-getTags", options);\n try {\n const response = await this.blobContext.getTags(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));\n const wrappedResponse = Object.assign(Object.assign({}, response), { _response: response._response, tags: toTags({ blobTagSet: response.blobTagSet }) || {} });\n return wrappedResponse;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Get a {@link BlobLeaseClient} that manages leases on the blob.\n *\n * @param proposeLeaseId - Initial proposed lease Id.\n * @returns A new BlobLeaseClient object for managing leases on the blob.\n */\n getBlobLeaseClient(proposeLeaseId) {\n return new BlobLeaseClient(this, proposeLeaseId);\n }\n /**\n * Creates a read-only snapshot of a blob.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/snapshot-blob\n *\n * @param options - Optional options to the Blob Create Snapshot operation.\n */\n async createSnapshot(options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-createSnapshot", options);\n options.conditions = options.conditions || {};\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.blobContext.createSnapshot(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, metadata: options.metadata, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Asynchronously copies a blob to a destination within the storage account.\n * This method returns a long running operation poller that allows you to wait\n * indefinitely until the copy is completed.\n * You can also cancel a copy before it is completed by calling `cancelOperation` on the poller.\n * Note that the onProgress callback will not be invoked if the operation completes in the first\n * request, and attempting to cancel a completed copy will result in an error being thrown.\n *\n * In version 2012-02-12 and later, the source for a Copy Blob operation can be\n * a committed blob in any Azure storage account.\n * Beginning with version 2015-02-21, the source for a Copy Blob operation can be\n * an Azure file in any Azure storage account.\n * Only storage accounts created on or after June 7th, 2012 allow the Copy Blob\n * operation to copy from another storage account.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/copy-blob\n *\n * Example using automatic polling:\n *\n * ```js\n * const copyPoller = await blobClient.beginCopyFromURL(\'url\');\n * const result = await copyPoller.pollUntilDone();\n * ```\n *\n * Example using manual polling:\n *\n * ```js\n * const copyPoller = await blobClient.beginCopyFromURL(\'url\');\n * while (!poller.isDone()) {\n * await poller.poll();\n * }\n * const result = copyPoller.getResult();\n * ```\n *\n * Example using progress updates:\n *\n * ```js\n * const copyPoller = await blobClient.beginCopyFromURL(\'url\', {\n * onProgress(state) {\n * console.log(`Progress: ${state.copyProgress}`);\n * }\n * });\n * const result = await copyPoller.pollUntilDone();\n * ```\n *\n * Example using a changing polling interval (default 15 seconds):\n *\n * ```js\n * const copyPoller = await blobClient.beginCopyFromURL(\'url\', {\n * intervalInMs: 1000 // poll blob every 1 second for copy progress\n * });\n * const result = await copyPoller.pollUntilDone();\n * ```\n *\n * Example using copy cancellation:\n *\n * ```js\n * const copyPoller = await blobClient.beginCopyFromURL(\'url\');\n * // cancel operation after starting it.\n * try {\n * await copyPoller.cancelOperation();\n * // calls to get the result now throw PollerCancelledError\n * await copyPoller.getResult();\n * } catch (err) {\n * if (err.name === \'PollerCancelledError\') {\n * console.log(\'The copy was cancelled.\');\n * }\n * }\n * ```\n *\n * @param copySource - url to the source Azure Blob/File.\n * @param options - Optional options to the Blob Start Copy From URL operation.\n */\n async beginCopyFromURL(copySource, options = {}) {\n const client = {\n abortCopyFromURL: (...args) => this.abortCopyFromURL(...args),\n getProperties: (...args) => this.getProperties(...args),\n startCopyFromURL: (...args) => this.startCopyFromURL(...args),\n };\n const poller = new BlobBeginCopyFromUrlPoller({\n blobClient: client,\n copySource,\n intervalInMs: options.intervalInMs,\n onProgress: options.onProgress,\n resumeFrom: options.resumeFrom,\n startCopyFromURLOptions: options,\n });\n // Trigger the startCopyFromURL call by calling poll.\n // Any errors from this method should be surfaced to the user.\n await poller.poll();\n return poller;\n }\n /**\n * Aborts a pending asynchronous Copy Blob operation, and leaves a destination blob with zero\n * length and full metadata. Version 2012-02-12 and newer.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/abort-copy-blob\n *\n * @param copyId - Id of the Copy From URL operation.\n * @param options - Optional options to the Blob Abort Copy From URL operation.\n */\n async abortCopyFromURL(copyId, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobClient-abortCopyFromURL", options);\n try {\n return await this.blobContext.abortCopyFromURL(copyId, Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * The synchronous Copy From URL operation copies a blob or an internet resource to a new blob. It will not\n * return a response until the copy is complete.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url\n *\n * @param copySource - The source URL to copy from, Shared Access Signature(SAS) maybe needed for authentication\n * @param options -\n */\n async syncCopyFromURL(copySource, options = {}) {\n var _a, _b, _c;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-syncCopyFromURL", options);\n options.conditions = options.conditions || {};\n options.sourceConditions = options.sourceConditions || {};\n try {\n return await this.blobContext.copyFromURL(copySource, Object.assign({ abortSignal: options.abortSignal, metadata: options.metadata, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), sourceModifiedAccessConditions: {\n sourceIfMatch: options.sourceConditions.ifMatch,\n sourceIfModifiedSince: options.sourceConditions.ifModifiedSince,\n sourceIfNoneMatch: options.sourceConditions.ifNoneMatch,\n sourceIfUnmodifiedSince: options.sourceConditions.ifUnmodifiedSince,\n }, sourceContentMD5: options.sourceContentMD5, copySourceAuthorization: httpAuthorizationToString(options.sourceAuthorization), tier: toAccessTier(options.tier), blobTagsString: toBlobTagsString(options.tags), immutabilityPolicyExpiry: (_b = options.immutabilityPolicy) === null || _b === void 0 ? void 0 : _b.expiriesOn, immutabilityPolicyMode: (_c = options.immutabilityPolicy) === null || _c === void 0 ? void 0 : _c.policyMode, legalHold: options.legalHold, encryptionScope: options.encryptionScope, copySourceTags: options.copySourceTags }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Sets the tier on a blob. The operation is allowed on a page blob in a premium\n * storage account and on a block blob in a blob storage account (locally redundant\n * storage only). A premium page blob\'s tier determines the allowed size, IOPS,\n * and bandwidth of the blob. A block blob\'s tier determines Hot/Cool/Archive\n * storage type. This operation does not update the blob\'s ETag.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/set-blob-tier\n *\n * @param tier - The tier to be set on the blob. Valid values are Hot, Cool, or Archive.\n * @param options - Optional options to the Blob Set Tier operation.\n */\n async setAccessTier(tier, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-setAccessTier", options);\n try {\n return await this.blobContext.setTier(toAccessTier(tier), Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), rehydratePriority: options.rehydratePriority }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n async downloadToBuffer(param1, param2, param3, param4 = {}) {\n let buffer;\n let offset = 0;\n let count = 0;\n let options = param4;\n if (param1 instanceof Buffer) {\n buffer = param1;\n offset = param2 || 0;\n count = typeof param3 === "number" ? param3 : 0;\n }\n else {\n offset = typeof param1 === "number" ? param1 : 0;\n count = typeof param2 === "number" ? param2 : 0;\n options = param3 || {};\n }\n const { span, updatedOptions } = tracing_createSpan("BlobClient-downloadToBuffer", options);\n try {\n if (!options.blockSize) {\n options.blockSize = 0;\n }\n if (options.blockSize < 0) {\n throw new RangeError("blockSize option must be >= 0");\n }\n if (options.blockSize === 0) {\n options.blockSize = DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES;\n }\n if (offset < 0) {\n throw new RangeError("offset option must be >= 0");\n }\n if (count && count <= 0) {\n throw new RangeError("count option must be greater than 0");\n }\n if (!options.conditions) {\n options.conditions = {};\n }\n // Customer doesn\'t specify length, get it\n if (!count) {\n const response = await this.getProperties(Object.assign(Object.assign({}, options), { tracingOptions: Object.assign(Object.assign({}, options.tracingOptions), convertTracingToRequestOptionsBase(updatedOptions)) }));\n count = response.contentLength - offset;\n if (count < 0) {\n throw new RangeError(`offset ${offset} shouldn\'t be larger than blob size ${response.contentLength}`);\n }\n }\n // Allocate the buffer of size = count if the buffer is not provided\n if (!buffer) {\n try {\n buffer = Buffer.alloc(count);\n }\n catch (error) {\n throw new Error(`Unable to allocate the buffer of size: ${count}(in bytes). Please try passing your own buffer to the "downloadToBuffer" method or try using other methods like "download" or "downloadToFile".\\t ${error.message}`);\n }\n }\n if (buffer.length < count) {\n throw new RangeError(`The buffer\'s size should be equal to or larger than the request count of bytes: ${count}`);\n }\n let transferProgress = 0;\n const batch = new Batch(options.concurrency);\n for (let off = offset; off < offset + count; off = off + options.blockSize) {\n batch.addOperation(async () => {\n // Exclusive chunk end position\n let chunkEnd = offset + count;\n if (off + options.blockSize < chunkEnd) {\n chunkEnd = off + options.blockSize;\n }\n const response = await this.download(off, chunkEnd - off, {\n abortSignal: options.abortSignal,\n conditions: options.conditions,\n maxRetryRequests: options.maxRetryRequestsPerBlock,\n customerProvidedKey: options.customerProvidedKey,\n tracingOptions: Object.assign(Object.assign({}, options.tracingOptions), convertTracingToRequestOptionsBase(updatedOptions)),\n });\n const stream = response.readableStreamBody;\n await streamToBuffer(stream, buffer, off - offset, chunkEnd - offset);\n // Update progress after block is downloaded, in case of block trying\n // Could provide finer grained progress updating inside HTTP requests,\n // only if convenience layer download try is enabled\n transferProgress += chunkEnd - off;\n if (options.onProgress) {\n options.onProgress({ loadedBytes: transferProgress });\n }\n });\n }\n await batch.do();\n return buffer;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * Downloads an Azure Blob to a local file.\n * Fails if the the given file path already exits.\n * Offset and count are optional, pass 0 and undefined respectively to download the entire blob.\n *\n * @param filePath -\n * @param offset - From which position of the block blob to download.\n * @param count - How much data to be downloaded. Will download to the end when passing undefined.\n * @param options - Options to Blob download options.\n * @returns The response data for blob download operation,\n * but with readableStreamBody set to undefined since its\n * content is already read and written into a local file\n * at the specified path.\n */\n async downloadToFile(filePath, offset = 0, count, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobClient-downloadToFile", options);\n try {\n const response = await this.download(offset, count, Object.assign(Object.assign({}, options), { tracingOptions: Object.assign(Object.assign({}, options.tracingOptions), convertTracingToRequestOptionsBase(updatedOptions)) }));\n if (response.readableStreamBody) {\n await readStreamToLocalFile(response.readableStreamBody, filePath);\n }\n // The stream is no longer accessible so setting it to undefined.\n response.blobDownloadStream = undefined;\n return response;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n getBlobAndContainerNamesFromUrl() {\n let containerName;\n let blobName;\n try {\n // URL may look like the following\n // "https://myaccount.blob.core.windows.net/mycontainer/blob?sasString";\n // "https://myaccount.blob.core.windows.net/mycontainer/blob";\n // "https://myaccount.blob.core.windows.net/mycontainer/blob/a.txt?sasString";\n // "https://myaccount.blob.core.windows.net/mycontainer/blob/a.txt";\n // IPv4/IPv6 address hosts, Endpoints - `http://127.0.0.1:10000/devstoreaccount1/containername/blob`\n // http://localhost:10001/devstoreaccount1/containername/blob\n const parsedUrl = URLBuilder.parse(this.url);\n if (parsedUrl.getHost().split(".")[1] === "blob") {\n // "https://myaccount.blob.core.windows.net/containername/blob".\n // .getPath() -> /containername/blob\n const pathComponents = parsedUrl.getPath().match("/([^/]*)(/(.*))?");\n containerName = pathComponents[1];\n blobName = pathComponents[3];\n }\n else if (isIpEndpointStyle(parsedUrl)) {\n // IPv4/IPv6 address hosts... Example - http://192.0.0.10:10001/devstoreaccount1/containername/blob\n // Single word domain without a [dot] in the endpoint... Example - http://localhost:10001/devstoreaccount1/containername/blob\n // .getPath() -> /devstoreaccount1/containername/blob\n const pathComponents = parsedUrl.getPath().match("/([^/]*)/([^/]*)(/(.*))?");\n containerName = pathComponents[2];\n blobName = pathComponents[4];\n }\n else {\n // "https://customdomain.com/containername/blob".\n // .getPath() -> /containername/blob\n const pathComponents = parsedUrl.getPath().match("/([^/]*)(/(.*))?");\n containerName = pathComponents[1];\n blobName = pathComponents[3];\n }\n // decode the encoded blobName, containerName - to get all the special characters that might be present in them\n containerName = decodeURIComponent(containerName);\n blobName = decodeURIComponent(blobName);\n // Azure Storage Server will replace "\\" with "/" in the blob names\n // doing the same in the SDK side so that the user doesn\'t have to replace "\\" instances in the blobName\n blobName = blobName.replace(/\\\\/g, "/");\n if (!containerName) {\n throw new Error("Provided containerName is invalid.");\n }\n return { blobName, containerName };\n }\n catch (error) {\n throw new Error("Unable to extract blobName and containerName with provided information.");\n }\n }\n /**\n * Asynchronously copies a blob to a destination within the storage account.\n * In version 2012-02-12 and later, the source for a Copy Blob operation can be\n * a committed blob in any Azure storage account.\n * Beginning with version 2015-02-21, the source for a Copy Blob operation can be\n * an Azure file in any Azure storage account.\n * Only storage accounts created on or after June 7th, 2012 allow the Copy Blob\n * operation to copy from another storage account.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/copy-blob\n *\n * @param copySource - url to the source Azure Blob/File.\n * @param options - Optional options to the Blob Start Copy From URL operation.\n */\n async startCopyFromURL(copySource, options = {}) {\n var _a, _b, _c;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-startCopyFromURL", options);\n options.conditions = options.conditions || {};\n options.sourceConditions = options.sourceConditions || {};\n try {\n return await this.blobContext.startCopyFromURL(copySource, Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, metadata: options.metadata, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), sourceModifiedAccessConditions: {\n sourceIfMatch: options.sourceConditions.ifMatch,\n sourceIfModifiedSince: options.sourceConditions.ifModifiedSince,\n sourceIfNoneMatch: options.sourceConditions.ifNoneMatch,\n sourceIfUnmodifiedSince: options.sourceConditions.ifUnmodifiedSince,\n sourceIfTags: options.sourceConditions.tagConditions,\n }, immutabilityPolicyExpiry: (_b = options.immutabilityPolicy) === null || _b === void 0 ? void 0 : _b.expiriesOn, immutabilityPolicyMode: (_c = options.immutabilityPolicy) === null || _c === void 0 ? void 0 : _c.policyMode, legalHold: options.legalHold, rehydratePriority: options.rehydratePriority, tier: toAccessTier(options.tier), blobTagsString: toBlobTagsString(options.tags), sealBlob: options.sealBlob }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Only available for BlobClient constructed with a shared key credential.\n *\n * Generates a Blob Service Shared Access Signature (SAS) URI based on the client properties\n * and parameters passed in. The SAS is signed by the shared key credential of the client.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas\n *\n * @param options - Optional parameters.\n * @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.\n */\n generateSasUrl(options) {\n return new Promise((resolve) => {\n if (!(this.credential instanceof StorageSharedKeyCredential)) {\n throw new RangeError("Can only generate the SAS when the client is initialized with a shared key credential");\n }\n const sas = generateBlobSASQueryParameters(Object.assign({ containerName: this._containerName, blobName: this._name, snapshotTime: this._snapshot, versionId: this._versionId }, options), this.credential).toString();\n resolve(appendToURLQuery(this.url, sas));\n });\n }\n /**\n * Delete the immutablility policy on the blob.\n *\n * @param options - Optional options to delete immutability policy on the blob.\n */\n async deleteImmutabilityPolicy(options) {\n const { span, updatedOptions } = tracing_createSpan("BlobClient-deleteImmutabilityPolicy", options);\n try {\n return await this.blobContext.deleteImmutabilityPolicy(Object.assign({ abortSignal: options === null || options === void 0 ? void 0 : options.abortSignal }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Set immutablility policy on the blob.\n *\n * @param options - Optional options to set immutability policy on the blob.\n */\n async setImmutabilityPolicy(immutabilityPolicy, options) {\n const { span, updatedOptions } = tracing_createSpan("BlobClient-setImmutabilityPolicy", options);\n try {\n return await this.blobContext.setImmutabilityPolicy(Object.assign({ abortSignal: options === null || options === void 0 ? void 0 : options.abortSignal, immutabilityPolicyExpiry: immutabilityPolicy.expiriesOn, immutabilityPolicyMode: immutabilityPolicy.policyMode, modifiedAccessConditions: options === null || options === void 0 ? void 0 : options.modifiedAccessCondition }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Set legal hold on the blob.\n *\n * @param options - Optional options to set legal hold on the blob.\n */\n async setLegalHold(legalHoldEnabled, options) {\n const { span, updatedOptions } = tracing_createSpan("BlobClient-setLegalHold", options);\n try {\n return await this.blobContext.setLegalHold(legalHoldEnabled, Object.assign({ abortSignal: options === null || options === void 0 ? void 0 : options.abortSignal }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n}\n/**\n * AppendBlobClient defines a set of operations applicable to append blobs.\n */\nclass AppendBlobClient extends BlobClient {\n constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions, \n // Legacy, no fix for eslint error without breaking. Disable it for this interface.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/\n options) {\n // In TypeScript we cannot simply pass all parameters to super() like below so have to duplicate the code instead.\n // super(s, credentialOrPipelineOrContainerNameOrOptions, blobNameOrOptions, options);\n let pipeline;\n let url;\n options = options || {};\n if (isPipelineLike(credentialOrPipelineOrContainerName)) {\n // (url: string, pipeline: Pipeline)\n url = urlOrConnectionString;\n pipeline = credentialOrPipelineOrContainerName;\n }\n else if ((checkEnvironment_isNode && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential) ||\n credentialOrPipelineOrContainerName instanceof AnonymousCredential ||\n isTokenCredential(credentialOrPipelineOrContainerName)) {\n // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions) url = urlOrConnectionString;\n url = urlOrConnectionString;\n options = blobNameOrOptions;\n pipeline = newPipeline(credentialOrPipelineOrContainerName, options);\n }\n else if (!credentialOrPipelineOrContainerName &&\n typeof credentialOrPipelineOrContainerName !== "string") {\n // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)\n url = urlOrConnectionString;\n // The second parameter is undefined. Use anonymous credential.\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else if (credentialOrPipelineOrContainerName &&\n typeof credentialOrPipelineOrContainerName === "string" &&\n blobNameOrOptions &&\n typeof blobNameOrOptions === "string") {\n // (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)\n const containerName = credentialOrPipelineOrContainerName;\n const blobName = blobNameOrOptions;\n const extractedCreds = extractConnectionStringParts(urlOrConnectionString);\n if (extractedCreds.kind === "AccountConnString") {\n if (checkEnvironment_isNode) {\n const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);\n url = appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName));\n if (!options.proxyOptions) {\n options.proxyOptions = getDefaultProxySettings(extractedCreds.proxyUri);\n }\n pipeline = newPipeline(sharedKeyCredential, options);\n }\n else {\n throw new Error("Account connection string is only supported in Node.js environment");\n }\n }\n else if (extractedCreds.kind === "SASConnString") {\n url =\n appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) +\n "?" +\n extractedCreds.accountSas;\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else {\n throw new Error("Connection string must be either an Account connection string or a SAS connection string");\n }\n }\n else {\n throw new Error("Expecting non-empty strings for containerName and blobName parameters");\n }\n super(url, pipeline);\n this.appendBlobContext = new AppendBlob(this.storageClientContext);\n }\n /**\n * Creates a new AppendBlobClient object identical to the source but with the\n * specified snapshot timestamp.\n * Provide "" will remove the snapshot and return a Client to the base blob.\n *\n * @param snapshot - The snapshot timestamp.\n * @returns A new AppendBlobClient object identical to the source but with the specified snapshot timestamp.\n */\n withSnapshot(snapshot) {\n return new AppendBlobClient(setURLParameter(this.url, constants_URLConstants.Parameters.SNAPSHOT, snapshot.length === 0 ? undefined : snapshot), this.pipeline);\n }\n /**\n * Creates a 0-length append blob. Call AppendBlock to append data to an append blob.\n * @see https://docs.microsoft.com/rest/api/storageservices/put-blob\n *\n * @param options - Options to the Append Block Create operation.\n *\n *\n * Example usage:\n *\n * ```js\n * const appendBlobClient = containerClient.getAppendBlobClient("");\n * await appendBlobClient.create();\n * ```\n */\n async create(options = {}) {\n var _a, _b, _c;\n const { span, updatedOptions } = tracing_createSpan("AppendBlobClient-create", options);\n options.conditions = options.conditions || {};\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.appendBlobContext.create(0, Object.assign({ abortSignal: options.abortSignal, blobHttpHeaders: options.blobHTTPHeaders, leaseAccessConditions: options.conditions, metadata: options.metadata, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope, immutabilityPolicyExpiry: (_b = options.immutabilityPolicy) === null || _b === void 0 ? void 0 : _b.expiriesOn, immutabilityPolicyMode: (_c = options.immutabilityPolicy) === null || _c === void 0 ? void 0 : _c.policyMode, legalHold: options.legalHold, blobTagsString: toBlobTagsString(options.tags) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Creates a 0-length append blob. Call AppendBlock to append data to an append blob.\n * If the blob with the same name already exists, the content of the existing blob will remain unchanged.\n * @see https://docs.microsoft.com/rest/api/storageservices/put-blob\n *\n * @param options -\n */\n async createIfNotExists(options = {}) {\n var _a, _b;\n const { span, updatedOptions } = tracing_createSpan("AppendBlobClient-createIfNotExists", options);\n const conditions = { ifNoneMatch: ETagAny };\n try {\n const res = await this.create(Object.assign(Object.assign({}, updatedOptions), { conditions }));\n return Object.assign(Object.assign({ succeeded: true }, res), { _response: res._response });\n }\n catch (e) {\n if (((_a = e.details) === null || _a === void 0 ? void 0 : _a.errorCode) === "BlobAlreadyExists") {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: "Expected exception when creating a blob only if it does not already exist.",\n });\n return Object.assign(Object.assign({ succeeded: false }, (_b = e.response) === null || _b === void 0 ? void 0 : _b.parsedHeaders), { _response: e.response });\n }\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Seals the append blob, making it read only.\n *\n * @param options -\n */\n async seal(options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("AppendBlobClient-seal", options);\n options.conditions = options.conditions || {};\n try {\n return await this.appendBlobContext.seal(Object.assign({ abortSignal: options.abortSignal, appendPositionAccessConditions: options.conditions, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Commits a new block of data to the end of the existing append blob.\n * @see https://docs.microsoft.com/rest/api/storageservices/append-block\n *\n * @param body - Data to be appended.\n * @param contentLength - Length of the body in bytes.\n * @param options - Options to the Append Block operation.\n *\n *\n * Example usage:\n *\n * ```js\n * const content = "Hello World!";\n *\n * // Create a new append blob and append data to the blob.\n * const newAppendBlobClient = containerClient.getAppendBlobClient("");\n * await newAppendBlobClient.create();\n * await newAppendBlobClient.appendBlock(content, content.length);\n *\n * // Append data to an existing append blob.\n * const existingAppendBlobClient = containerClient.getAppendBlobClient("");\n * await existingAppendBlobClient.appendBlock(content, content.length);\n * ```\n */\n async appendBlock(body, contentLength, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("AppendBlobClient-appendBlock", options);\n options.conditions = options.conditions || {};\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.appendBlobContext.appendBlock(contentLength, body, Object.assign({ abortSignal: options.abortSignal, appendPositionAccessConditions: options.conditions, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), requestOptions: {\n onUploadProgress: options.onProgress,\n }, transactionalContentMD5: options.transactionalContentMD5, transactionalContentCrc64: options.transactionalContentCrc64, cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * The Append Block operation commits a new block of data to the end of an existing append blob\n * where the contents are read from a source url.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/append-block-from-url\n *\n * @param sourceURL -\n * The url to the blob that will be the source of the copy. A source blob in the same storage account can\n * be authenticated via Shared Key. However, if the source is a blob in another account, the source blob\n * must either be public or must be authenticated via a shared access signature. If the source blob is\n * public, no authentication is required to perform the operation.\n * @param sourceOffset - Offset in source to be appended\n * @param count - Number of bytes to be appended as a block\n * @param options -\n */\n async appendBlockFromURL(sourceURL, sourceOffset, count, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("AppendBlobClient-appendBlockFromURL", options);\n options.conditions = options.conditions || {};\n options.sourceConditions = options.sourceConditions || {};\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.appendBlobContext.appendBlockFromUrl(sourceURL, 0, Object.assign({ abortSignal: options.abortSignal, sourceRange: rangeToString({ offset: sourceOffset, count }), sourceContentMD5: options.sourceContentMD5, sourceContentCrc64: options.sourceContentCrc64, leaseAccessConditions: options.conditions, appendPositionAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), sourceModifiedAccessConditions: {\n sourceIfMatch: options.sourceConditions.ifMatch,\n sourceIfModifiedSince: options.sourceConditions.ifModifiedSince,\n sourceIfNoneMatch: options.sourceConditions.ifNoneMatch,\n sourceIfUnmodifiedSince: options.sourceConditions.ifUnmodifiedSince,\n }, copySourceAuthorization: httpAuthorizationToString(options.sourceAuthorization), cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n}\n/**\n * BlockBlobClient defines a set of operations applicable to block blobs.\n */\nclass BlockBlobClient extends BlobClient {\n constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions, \n // Legacy, no fix for eslint error without breaking. Disable it for this interface.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/\n options) {\n // In TypeScript we cannot simply pass all parameters to super() like below so have to duplicate the code instead.\n // super(s, credentialOrPipelineOrContainerNameOrOptions, blobNameOrOptions, options);\n let pipeline;\n let url;\n options = options || {};\n if (isPipelineLike(credentialOrPipelineOrContainerName)) {\n // (url: string, pipeline: Pipeline)\n url = urlOrConnectionString;\n pipeline = credentialOrPipelineOrContainerName;\n }\n else if ((checkEnvironment_isNode && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential) ||\n credentialOrPipelineOrContainerName instanceof AnonymousCredential ||\n isTokenCredential(credentialOrPipelineOrContainerName)) {\n // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)\n url = urlOrConnectionString;\n options = blobNameOrOptions;\n pipeline = newPipeline(credentialOrPipelineOrContainerName, options);\n }\n else if (!credentialOrPipelineOrContainerName &&\n typeof credentialOrPipelineOrContainerName !== "string") {\n // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)\n // The second parameter is undefined. Use anonymous credential.\n url = urlOrConnectionString;\n if (blobNameOrOptions && typeof blobNameOrOptions !== "string") {\n options = blobNameOrOptions;\n }\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else if (credentialOrPipelineOrContainerName &&\n typeof credentialOrPipelineOrContainerName === "string" &&\n blobNameOrOptions &&\n typeof blobNameOrOptions === "string") {\n // (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)\n const containerName = credentialOrPipelineOrContainerName;\n const blobName = blobNameOrOptions;\n const extractedCreds = extractConnectionStringParts(urlOrConnectionString);\n if (extractedCreds.kind === "AccountConnString") {\n if (checkEnvironment_isNode) {\n const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);\n url = appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName));\n if (!options.proxyOptions) {\n options.proxyOptions = getDefaultProxySettings(extractedCreds.proxyUri);\n }\n pipeline = newPipeline(sharedKeyCredential, options);\n }\n else {\n throw new Error("Account connection string is only supported in Node.js environment");\n }\n }\n else if (extractedCreds.kind === "SASConnString") {\n url =\n appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) +\n "?" +\n extractedCreds.accountSas;\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else {\n throw new Error("Connection string must be either an Account connection string or a SAS connection string");\n }\n }\n else {\n throw new Error("Expecting non-empty strings for containerName and blobName parameters");\n }\n super(url, pipeline);\n this.blockBlobContext = new BlockBlob(this.storageClientContext);\n this._blobContext = new blob_Blob(this.storageClientContext);\n }\n /**\n * Creates a new BlockBlobClient object identical to the source but with the\n * specified snapshot timestamp.\n * Provide "" will remove the snapshot and return a URL to the base blob.\n *\n * @param snapshot - The snapshot timestamp.\n * @returns A new BlockBlobClient object identical to the source but with the specified snapshot timestamp.\n */\n withSnapshot(snapshot) {\n return new BlockBlobClient(setURLParameter(this.url, constants_URLConstants.Parameters.SNAPSHOT, snapshot.length === 0 ? undefined : snapshot), this.pipeline);\n }\n /**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * Quick query for a JSON or CSV formatted blob.\n *\n * Example usage (Node.js):\n *\n * ```js\n * // Query and convert a blob to a string\n * const queryBlockBlobResponse = await blockBlobClient.query("select * from BlobStorage");\n * const downloaded = (await streamToBuffer(queryBlockBlobResponse.readableStreamBody)).toString();\n * console.log("Query blob content:", downloaded);\n *\n * async function streamToBuffer(readableStream) {\n * return new Promise((resolve, reject) => {\n * const chunks = [];\n * readableStream.on("data", (data) => {\n * chunks.push(data instanceof Buffer ? data : Buffer.from(data));\n * });\n * readableStream.on("end", () => {\n * resolve(Buffer.concat(chunks));\n * });\n * readableStream.on("error", reject);\n * });\n * }\n * ```\n *\n * @param query -\n * @param options -\n */\n async query(query, options = {}) {\n var _a;\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-query", options);\n try {\n if (!checkEnvironment_isNode) {\n throw new Error("This operation currently is only supported in Node.js.");\n }\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n const response = await this._blobContext.query(Object.assign({ abortSignal: options.abortSignal, queryRequest: {\n queryType: "SQL",\n expression: query,\n inputSerialization: toQuerySerialization(options.inputTextConfiguration),\n outputSerialization: toQuerySerialization(options.outputTextConfiguration),\n }, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), cpkInfo: options.customerProvidedKey }, convertTracingToRequestOptionsBase(updatedOptions)));\n return new BlobQueryResponse(response, {\n abortSignal: options.abortSignal,\n onProgress: options.onProgress,\n onError: options.onError,\n });\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Creates a new block blob, or updates the content of an existing block blob.\n * Updating an existing block blob overwrites any existing metadata on the blob.\n * Partial updates are not supported; the content of the existing blob is\n * overwritten with the new content. To perform a partial update of a block blob\'s,\n * use {@link stageBlock} and {@link commitBlockList}.\n *\n * This is a non-parallel uploading method, please use {@link uploadFile},\n * {@link uploadStream} or {@link uploadBrowserData} for better performance\n * with concurrency uploading.\n *\n * @see https://docs.microsoft.com/rest/api/storageservices/put-blob\n *\n * @param body - Blob, string, ArrayBuffer, ArrayBufferView or a function\n * which returns a new Readable stream whose offset is from data source beginning.\n * @param contentLength - Length of body in bytes. Use Buffer.byteLength() to calculate body length for a\n * string including non non-Base64/Hex-encoded characters.\n * @param options - Options to the Block Blob Upload operation.\n * @returns Response data for the Block Blob Upload operation.\n *\n * Example usage:\n *\n * ```js\n * const content = "Hello world!";\n * const uploadBlobResponse = await blockBlobClient.upload(content, content.length);\n * ```\n */\n async upload(body, contentLength, options = {}) {\n var _a, _b, _c;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-upload", options);\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.blockBlobContext.upload(contentLength, body, Object.assign({ abortSignal: options.abortSignal, blobHttpHeaders: options.blobHTTPHeaders, leaseAccessConditions: options.conditions, metadata: options.metadata, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), requestOptions: {\n onUploadProgress: options.onProgress,\n }, cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope, immutabilityPolicyExpiry: (_b = options.immutabilityPolicy) === null || _b === void 0 ? void 0 : _b.expiriesOn, immutabilityPolicyMode: (_c = options.immutabilityPolicy) === null || _c === void 0 ? void 0 : _c.policyMode, legalHold: options.legalHold, tier: toAccessTier(options.tier), blobTagsString: toBlobTagsString(options.tags) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Creates a new Block Blob where the contents of the blob are read from a given URL.\n * This API is supported beginning with the 2020-04-08 version. Partial updates\n * are not supported with Put Blob from URL; the content of an existing blob is overwritten with\n * the content of the new blob. To perform partial updates to a block blob’s contents using a\n * source URL, use {@link stageBlockFromURL} and {@link commitBlockList}.\n *\n * @param sourceURL - Specifies the URL of the blob. The value\n * may be a URL of up to 2 KB in length that specifies a blob.\n * The value should be URL-encoded as it would appear\n * in a request URI. The source blob must either be public\n * or must be authenticated via a shared access signature.\n * If the source blob is public, no authentication is required\n * to perform the operation. Here are some examples of source object URLs:\n * - https://myaccount.blob.core.windows.net/mycontainer/myblob\n * - https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot=\n * @param options - Optional parameters.\n */\n async syncUploadFromURL(sourceURL, options = {}) {\n var _a, _b, _c, _d, _e;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-syncUploadFromURL", options);\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.blockBlobContext.putBlobFromUrl(0, sourceURL, Object.assign(Object.assign(Object.assign({}, options), { blobHttpHeaders: options.blobHTTPHeaders, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: options.conditions.tagConditions }), sourceModifiedAccessConditions: {\n sourceIfMatch: (_a = options.sourceConditions) === null || _a === void 0 ? void 0 : _a.ifMatch,\n sourceIfModifiedSince: (_b = options.sourceConditions) === null || _b === void 0 ? void 0 : _b.ifModifiedSince,\n sourceIfNoneMatch: (_c = options.sourceConditions) === null || _c === void 0 ? void 0 : _c.ifNoneMatch,\n sourceIfUnmodifiedSince: (_d = options.sourceConditions) === null || _d === void 0 ? void 0 : _d.ifUnmodifiedSince,\n sourceIfTags: (_e = options.sourceConditions) === null || _e === void 0 ? void 0 : _e.tagConditions,\n }, cpkInfo: options.customerProvidedKey, copySourceAuthorization: httpAuthorizationToString(options.sourceAuthorization), tier: toAccessTier(options.tier), blobTagsString: toBlobTagsString(options.tags), copySourceTags: options.copySourceTags }), convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Uploads the specified block to the block blob\'s "staging area" to be later\n * committed by a call to commitBlockList.\n * @see https://docs.microsoft.com/rest/api/storageservices/put-block\n *\n * @param blockId - A 64-byte value that is base64-encoded\n * @param body - Data to upload to the staging area.\n * @param contentLength - Number of bytes to upload.\n * @param options - Options to the Block Blob Stage Block operation.\n * @returns Response data for the Block Blob Stage Block operation.\n */\n async stageBlock(blockId, body, contentLength, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-stageBlock", options);\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.blockBlobContext.stageBlock(blockId, contentLength, body, Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, requestOptions: {\n onUploadProgress: options.onProgress,\n }, transactionalContentMD5: options.transactionalContentMD5, transactionalContentCrc64: options.transactionalContentCrc64, cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * The Stage Block From URL operation creates a new block to be committed as part\n * of a blob where the contents are read from a URL.\n * This API is available starting in version 2018-03-28.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/put-block-from-url\n *\n * @param blockId - A 64-byte value that is base64-encoded\n * @param sourceURL - Specifies the URL of the blob. The value\n * may be a URL of up to 2 KB in length that specifies a blob.\n * The value should be URL-encoded as it would appear\n * in a request URI. The source blob must either be public\n * or must be authenticated via a shared access signature.\n * If the source blob is public, no authentication is required\n * to perform the operation. Here are some examples of source object URLs:\n * - https://myaccount.blob.core.windows.net/mycontainer/myblob\n * - https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot=\n * @param offset - From which position of the blob to download, greater than or equal to 0\n * @param count - How much data to be downloaded, greater than 0. Will download to the end when undefined\n * @param options - Options to the Block Blob Stage Block From URL operation.\n * @returns Response data for the Block Blob Stage Block From URL operation.\n */\n async stageBlockFromURL(blockId, sourceURL, offset = 0, count, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-stageBlockFromURL", options);\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.blockBlobContext.stageBlockFromURL(blockId, 0, sourceURL, Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, sourceContentMD5: options.sourceContentMD5, sourceContentCrc64: options.sourceContentCrc64, sourceRange: offset === 0 && !count ? undefined : rangeToString({ offset, count }), cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope, copySourceAuthorization: httpAuthorizationToString(options.sourceAuthorization) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Writes a blob by specifying the list of block IDs that make up the blob.\n * In order to be written as part of a blob, a block must have been successfully written\n * to the server in a prior {@link stageBlock} operation. You can call {@link commitBlockList} to\n * update a blob by uploading only those blocks that have changed, then committing the new and existing\n * blocks together. Any blocks not specified in the block list and permanently deleted.\n * @see https://docs.microsoft.com/rest/api/storageservices/put-block-list\n *\n * @param blocks - Array of 64-byte value that is base64-encoded\n * @param options - Options to the Block Blob Commit Block List operation.\n * @returns Response data for the Block Blob Commit Block List operation.\n */\n async commitBlockList(blocks, options = {}) {\n var _a, _b, _c;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-commitBlockList", options);\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.blockBlobContext.commitBlockList({ latest: blocks }, Object.assign({ abortSignal: options.abortSignal, blobHttpHeaders: options.blobHTTPHeaders, leaseAccessConditions: options.conditions, metadata: options.metadata, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope, immutabilityPolicyExpiry: (_b = options.immutabilityPolicy) === null || _b === void 0 ? void 0 : _b.expiriesOn, immutabilityPolicyMode: (_c = options.immutabilityPolicy) === null || _c === void 0 ? void 0 : _c.policyMode, legalHold: options.legalHold, tier: toAccessTier(options.tier), blobTagsString: toBlobTagsString(options.tags) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns the list of blocks that have been uploaded as part of a block blob\n * using the specified block list filter.\n * @see https://docs.microsoft.com/rest/api/storageservices/get-block-list\n *\n * @param listType - Specifies whether to return the list of committed blocks,\n * the list of uncommitted blocks, or both lists together.\n * @param options - Options to the Block Blob Get Block List operation.\n * @returns Response data for the Block Blob Get Block List operation.\n */\n async getBlockList(listType, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-getBlockList", options);\n try {\n const res = await this.blockBlobContext.getBlockList(listType, Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));\n if (!res.committedBlocks) {\n res.committedBlocks = [];\n }\n if (!res.uncommittedBlocks) {\n res.uncommittedBlocks = [];\n }\n return res;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n // High level functions\n /**\n * Uploads a Buffer(Node.js)/Blob(browsers)/ArrayBuffer/ArrayBufferView object to a BlockBlob.\n *\n * When data length is no more than the specifiled {@link BlockBlobParallelUploadOptions.maxSingleShotSize} (default is\n * {@link BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES}), this method will use 1 {@link upload} call to finish the upload.\n * Otherwise, this method will call {@link stageBlock} to upload blocks, and finally call {@link commitBlockList}\n * to commit the block list.\n *\n * A common {@link BlockBlobParallelUploadOptions.blobHTTPHeaders} option to set is\n * `blobContentType`, enabling the browser to provide\n * functionality based on file type.\n *\n * @param data - Buffer(Node.js), Blob, ArrayBuffer or ArrayBufferView\n * @param options -\n */\n async uploadData(data, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-uploadData", options);\n try {\n if (checkEnvironment_isNode) {\n let buffer;\n if (data instanceof Buffer) {\n buffer = data;\n }\n else if (data instanceof ArrayBuffer) {\n buffer = Buffer.from(data);\n }\n else {\n data = data;\n buffer = Buffer.from(data.buffer, data.byteOffset, data.byteLength);\n }\n return this.uploadSeekableInternal((offset, size) => buffer.slice(offset, offset + size), buffer.byteLength, updatedOptions);\n }\n else {\n const browserBlob = new Blob([data]);\n return this.uploadSeekableInternal((offset, size) => browserBlob.slice(offset, offset + size), browserBlob.size, updatedOptions);\n }\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * ONLY AVAILABLE IN BROWSERS.\n *\n * Uploads a browser Blob/File/ArrayBuffer/ArrayBufferView object to block blob.\n *\n * When buffer length lesser than or equal to 256MB, this method will use 1 upload call to finish the upload.\n * Otherwise, this method will call {@link stageBlock} to upload blocks, and finally call\n * {@link commitBlockList} to commit the block list.\n *\n * A common {@link BlockBlobParallelUploadOptions.blobHTTPHeaders} option to set is\n * `blobContentType`, enabling the browser to provide\n * functionality based on file type.\n *\n * @deprecated Use {@link uploadData} instead.\n *\n * @param browserData - Blob, File, ArrayBuffer or ArrayBufferView\n * @param options - Options to upload browser data.\n * @returns Response data for the Blob Upload operation.\n */\n async uploadBrowserData(browserData, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-uploadBrowserData", options);\n try {\n const browserBlob = new Blob([browserData]);\n return await this.uploadSeekableInternal((offset, size) => browserBlob.slice(offset, offset + size), browserBlob.size, updatedOptions);\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n *\n * Uploads data to block blob. Requires a bodyFactory as the data source,\n * which need to return a {@link HttpRequestBody} object with the offset and size provided.\n *\n * When data length is no more than the specified {@link BlockBlobParallelUploadOptions.maxSingleShotSize} (default is\n * {@link BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES}), this method will use 1 {@link upload} call to finish the upload.\n * Otherwise, this method will call {@link stageBlock} to upload blocks, and finally call {@link commitBlockList}\n * to commit the block list.\n *\n * @param bodyFactory -\n * @param size - size of the data to upload.\n * @param options - Options to Upload to Block Blob operation.\n * @returns Response data for the Blob Upload operation.\n */\n async uploadSeekableInternal(bodyFactory, size, options = {}) {\n if (!options.blockSize) {\n options.blockSize = 0;\n }\n if (options.blockSize < 0 || options.blockSize > BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES) {\n throw new RangeError(`blockSize option must be >= 0 and <= ${BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES}`);\n }\n if (options.maxSingleShotSize !== 0 && !options.maxSingleShotSize) {\n options.maxSingleShotSize = BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES;\n }\n if (options.maxSingleShotSize < 0 ||\n options.maxSingleShotSize > BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES) {\n throw new RangeError(`maxSingleShotSize option must be >= 0 and <= ${BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES}`);\n }\n if (options.blockSize === 0) {\n if (size > BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES * BLOCK_BLOB_MAX_BLOCKS) {\n throw new RangeError(`${size} is too larger to upload to a block blob.`);\n }\n if (size > options.maxSingleShotSize) {\n options.blockSize = Math.ceil(size / BLOCK_BLOB_MAX_BLOCKS);\n if (options.blockSize < DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES) {\n options.blockSize = DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES;\n }\n }\n }\n if (!options.blobHTTPHeaders) {\n options.blobHTTPHeaders = {};\n }\n if (!options.conditions) {\n options.conditions = {};\n }\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-uploadSeekableInternal", options);\n try {\n if (size <= options.maxSingleShotSize) {\n return await this.upload(bodyFactory(0, size), size, updatedOptions);\n }\n const numBlocks = Math.floor((size - 1) / options.blockSize) + 1;\n if (numBlocks > BLOCK_BLOB_MAX_BLOCKS) {\n throw new RangeError(`The buffer\'s size is too big or the BlockSize is too small;` +\n `the number of blocks must be <= ${BLOCK_BLOB_MAX_BLOCKS}`);\n }\n const blockList = [];\n const blockIDPrefix = generateUuid();\n let transferProgress = 0;\n const batch = new Batch(options.concurrency);\n for (let i = 0; i < numBlocks; i++) {\n batch.addOperation(async () => {\n const blockID = generateBlockID(blockIDPrefix, i);\n const start = options.blockSize * i;\n const end = i === numBlocks - 1 ? size : start + options.blockSize;\n const contentLength = end - start;\n blockList.push(blockID);\n await this.stageBlock(blockID, bodyFactory(start, contentLength), contentLength, {\n abortSignal: options.abortSignal,\n conditions: options.conditions,\n encryptionScope: options.encryptionScope,\n tracingOptions: updatedOptions.tracingOptions,\n });\n // Update progress after block is successfully uploaded to server, in case of block trying\n // TODO: Hook with convenience layer progress event in finer level\n transferProgress += contentLength;\n if (options.onProgress) {\n options.onProgress({\n loadedBytes: transferProgress,\n });\n }\n });\n }\n await batch.do();\n return this.commitBlockList(blockList, updatedOptions);\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * Uploads a local file in blocks to a block blob.\n *\n * When file size lesser than or equal to 256MB, this method will use 1 upload call to finish the upload.\n * Otherwise, this method will call stageBlock to upload blocks, and finally call commitBlockList\n * to commit the block list.\n *\n * @param filePath - Full path of local file\n * @param options - Options to Upload to Block Blob operation.\n * @returns Response data for the Blob Upload operation.\n */\n async uploadFile(filePath, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-uploadFile", options);\n try {\n const size = (await fsStat(filePath)).size;\n return await this.uploadSeekableInternal((offset, count) => {\n return () => fsCreateReadStream(filePath, {\n autoClose: true,\n end: count ? offset + count - 1 : Infinity,\n start: offset,\n });\n }, size, Object.assign(Object.assign({}, options), { tracingOptions: Object.assign(Object.assign({}, options.tracingOptions), convertTracingToRequestOptionsBase(updatedOptions)) }));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * Uploads a Node.js Readable stream into block blob.\n *\n * PERFORMANCE IMPROVEMENT TIPS:\n * * Input stream highWaterMark is better to set a same value with bufferSize\n * parameter, which will avoid Buffer.concat() operations.\n *\n * @param stream - Node.js Readable stream\n * @param bufferSize - Size of every buffer allocated, also the block size in the uploaded block blob. Default value is 8MB\n * @param maxConcurrency - Max concurrency indicates the max number of buffers that can be allocated,\n * positive correlation with max uploading concurrency. Default value is 5\n * @param options - Options to Upload Stream to Block Blob operation.\n * @returns Response data for the Blob Upload operation.\n */\n async uploadStream(stream, bufferSize = DEFAULT_BLOCK_BUFFER_SIZE_BYTES, maxConcurrency = 5, options = {}) {\n if (!options.blobHTTPHeaders) {\n options.blobHTTPHeaders = {};\n }\n if (!options.conditions) {\n options.conditions = {};\n }\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-uploadStream", options);\n try {\n let blockNum = 0;\n const blockIDPrefix = generateUuid();\n let transferProgress = 0;\n const blockList = [];\n const scheduler = new BufferScheduler(stream, bufferSize, maxConcurrency, async (body, length) => {\n const blockID = generateBlockID(blockIDPrefix, blockNum);\n blockList.push(blockID);\n blockNum++;\n await this.stageBlock(blockID, body, length, {\n conditions: options.conditions,\n encryptionScope: options.encryptionScope,\n tracingOptions: updatedOptions.tracingOptions,\n });\n // Update progress after block is successfully uploaded to server, in case of block trying\n transferProgress += length;\n if (options.onProgress) {\n options.onProgress({ loadedBytes: transferProgress });\n }\n }, \n // concurrency should set a smaller value than maxConcurrency, which is helpful to\n // reduce the possibility when a outgoing handler waits for stream data, in\n // this situation, outgoing handlers are blocked.\n // Outgoing queue shouldn\'t be empty.\n Math.ceil((maxConcurrency / 4) * 3));\n await scheduler.do();\n return await this.commitBlockList(blockList, Object.assign(Object.assign({}, options), { tracingOptions: Object.assign(Object.assign({}, options.tracingOptions), convertTracingToRequestOptionsBase(updatedOptions)) }));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n}\n/**\n * PageBlobClient defines a set of operations applicable to page blobs.\n */\nclass PageBlobClient extends BlobClient {\n constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions, \n // Legacy, no fix for eslint error without breaking. Disable it for this interface.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/\n options) {\n // In TypeScript we cannot simply pass all parameters to super() like below so have to duplicate the code instead.\n // super(s, credentialOrPipelineOrContainerNameOrOptions, blobNameOrOptions, options);\n let pipeline;\n let url;\n options = options || {};\n if (isPipelineLike(credentialOrPipelineOrContainerName)) {\n // (url: string, pipeline: Pipeline)\n url = urlOrConnectionString;\n pipeline = credentialOrPipelineOrContainerName;\n }\n else if ((checkEnvironment_isNode && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential) ||\n credentialOrPipelineOrContainerName instanceof AnonymousCredential ||\n isTokenCredential(credentialOrPipelineOrContainerName)) {\n // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)\n url = urlOrConnectionString;\n options = blobNameOrOptions;\n pipeline = newPipeline(credentialOrPipelineOrContainerName, options);\n }\n else if (!credentialOrPipelineOrContainerName &&\n typeof credentialOrPipelineOrContainerName !== "string") {\n // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)\n // The second parameter is undefined. Use anonymous credential.\n url = urlOrConnectionString;\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else if (credentialOrPipelineOrContainerName &&\n typeof credentialOrPipelineOrContainerName === "string" &&\n blobNameOrOptions &&\n typeof blobNameOrOptions === "string") {\n // (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)\n const containerName = credentialOrPipelineOrContainerName;\n const blobName = blobNameOrOptions;\n const extractedCreds = extractConnectionStringParts(urlOrConnectionString);\n if (extractedCreds.kind === "AccountConnString") {\n if (checkEnvironment_isNode) {\n const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);\n url = appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName));\n if (!options.proxyOptions) {\n options.proxyOptions = getDefaultProxySettings(extractedCreds.proxyUri);\n }\n pipeline = newPipeline(sharedKeyCredential, options);\n }\n else {\n throw new Error("Account connection string is only supported in Node.js environment");\n }\n }\n else if (extractedCreds.kind === "SASConnString") {\n url =\n appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) +\n "?" +\n extractedCreds.accountSas;\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else {\n throw new Error("Connection string must be either an Account connection string or a SAS connection string");\n }\n }\n else {\n throw new Error("Expecting non-empty strings for containerName and blobName parameters");\n }\n super(url, pipeline);\n this.pageBlobContext = new PageBlob(this.storageClientContext);\n }\n /**\n * Creates a new PageBlobClient object identical to the source but with the\n * specified snapshot timestamp.\n * Provide "" will remove the snapshot and return a Client to the base blob.\n *\n * @param snapshot - The snapshot timestamp.\n * @returns A new PageBlobClient object identical to the source but with the specified snapshot timestamp.\n */\n withSnapshot(snapshot) {\n return new PageBlobClient(setURLParameter(this.url, constants_URLConstants.Parameters.SNAPSHOT, snapshot.length === 0 ? undefined : snapshot), this.pipeline);\n }\n /**\n * Creates a page blob of the specified length. Call uploadPages to upload data\n * data to a page blob.\n * @see https://docs.microsoft.com/rest/api/storageservices/put-blob\n *\n * @param size - size of the page blob.\n * @param options - Options to the Page Blob Create operation.\n * @returns Response data for the Page Blob Create operation.\n */\n async create(size, options = {}) {\n var _a, _b, _c;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-create", options);\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.pageBlobContext.create(0, size, Object.assign({ abortSignal: options.abortSignal, blobHttpHeaders: options.blobHTTPHeaders, blobSequenceNumber: options.blobSequenceNumber, leaseAccessConditions: options.conditions, metadata: options.metadata, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope, immutabilityPolicyExpiry: (_b = options.immutabilityPolicy) === null || _b === void 0 ? void 0 : _b.expiriesOn, immutabilityPolicyMode: (_c = options.immutabilityPolicy) === null || _c === void 0 ? void 0 : _c.policyMode, legalHold: options.legalHold, tier: toAccessTier(options.tier), blobTagsString: toBlobTagsString(options.tags) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Creates a page blob of the specified length. Call uploadPages to upload data\n * data to a page blob. If the blob with the same name already exists, the content\n * of the existing blob will remain unchanged.\n * @see https://docs.microsoft.com/rest/api/storageservices/put-blob\n *\n * @param size - size of the page blob.\n * @param options -\n */\n async createIfNotExists(size, options = {}) {\n var _a, _b;\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-createIfNotExists", options);\n try {\n const conditions = { ifNoneMatch: ETagAny };\n const res = await this.create(size, Object.assign(Object.assign({}, options), { conditions, tracingOptions: updatedOptions.tracingOptions }));\n return Object.assign(Object.assign({ succeeded: true }, res), { _response: res._response });\n }\n catch (e) {\n if (((_a = e.details) === null || _a === void 0 ? void 0 : _a.errorCode) === "BlobAlreadyExists") {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: "Expected exception when creating a blob only if it does not already exist.",\n });\n return Object.assign(Object.assign({ succeeded: false }, (_b = e.response) === null || _b === void 0 ? void 0 : _b.parsedHeaders), { _response: e.response });\n }\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Writes 1 or more pages to the page blob. The start and end offsets must be a multiple of 512.\n * @see https://docs.microsoft.com/rest/api/storageservices/put-page\n *\n * @param body - Data to upload\n * @param offset - Offset of destination page blob\n * @param count - Content length of the body, also number of bytes to be uploaded\n * @param options - Options to the Page Blob Upload Pages operation.\n * @returns Response data for the Page Blob Upload Pages operation.\n */\n async uploadPages(body, offset, count, options = {}) {\n var _a;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-uploadPages", options);\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.pageBlobContext.uploadPages(count, body, Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), requestOptions: {\n onUploadProgress: options.onProgress,\n }, range: rangeToString({ offset, count }), sequenceNumberAccessConditions: options.conditions, transactionalContentMD5: options.transactionalContentMD5, transactionalContentCrc64: options.transactionalContentCrc64, cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * The Upload Pages operation writes a range of pages to a page blob where the\n * contents are read from a URL.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/put-page-from-url\n *\n * @param sourceURL - Specify a URL to the copy source, Shared Access Signature(SAS) maybe needed for authentication\n * @param sourceOffset - The source offset to copy from. Pass 0 to copy from the beginning of source page blob\n * @param destOffset - Offset of destination page blob\n * @param count - Number of bytes to be uploaded from source page blob\n * @param options -\n */\n async uploadPagesFromURL(sourceURL, sourceOffset, destOffset, count, options = {}) {\n var _a;\n options.conditions = options.conditions || {};\n options.sourceConditions = options.sourceConditions || {};\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-uploadPagesFromURL", options);\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.pageBlobContext.uploadPagesFromURL(sourceURL, rangeToString({ offset: sourceOffset, count }), 0, rangeToString({ offset: destOffset, count }), Object.assign({ abortSignal: options.abortSignal, sourceContentMD5: options.sourceContentMD5, sourceContentCrc64: options.sourceContentCrc64, leaseAccessConditions: options.conditions, sequenceNumberAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), sourceModifiedAccessConditions: {\n sourceIfMatch: options.sourceConditions.ifMatch,\n sourceIfModifiedSince: options.sourceConditions.ifModifiedSince,\n sourceIfNoneMatch: options.sourceConditions.ifNoneMatch,\n sourceIfUnmodifiedSince: options.sourceConditions.ifUnmodifiedSince,\n }, cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope, copySourceAuthorization: httpAuthorizationToString(options.sourceAuthorization) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Frees the specified pages from the page blob.\n * @see https://docs.microsoft.com/rest/api/storageservices/put-page\n *\n * @param offset - Starting byte position of the pages to clear.\n * @param count - Number of bytes to clear.\n * @param options - Options to the Page Blob Clear Pages operation.\n * @returns Response data for the Page Blob Clear Pages operation.\n */\n async clearPages(offset = 0, count, options = {}) {\n var _a;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-clearPages", options);\n try {\n return await this.pageBlobContext.clearPages(0, Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), range: rangeToString({ offset, count }), sequenceNumberAccessConditions: options.conditions, cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns the list of valid page ranges for a page blob or snapshot of a page blob.\n * @see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges\n *\n * @param offset - Starting byte position of the page ranges.\n * @param count - Number of bytes to get.\n * @param options - Options to the Page Blob Get Ranges operation.\n * @returns Response data for the Page Blob Get Ranges operation.\n */\n async getPageRanges(offset = 0, count, options = {}) {\n var _a;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-getPageRanges", options);\n try {\n return await this.pageBlobContext\n .getPageRanges(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), range: rangeToString({ offset, count }) }, convertTracingToRequestOptionsBase(updatedOptions)))\n .then(rangeResponseFromModel);\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * getPageRangesSegment returns a single segment of page ranges starting from the\n * specified Marker. Use an empty Marker to start enumeration from the beginning.\n * After getting a segment, process it, and then call getPageRangesSegment again\n * (passing the the previously-returned Marker) to get the next segment.\n * @see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges\n *\n * @param offset - Starting byte position of the page ranges.\n * @param count - Number of bytes to get.\n * @param marker - A string value that identifies the portion of the list to be returned with the next list operation.\n * @param options - Options to PageBlob Get Page Ranges Segment operation.\n */\n async listPageRangesSegment(offset = 0, count, marker, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-getPageRangesSegment", options);\n try {\n return await this.pageBlobContext.getPageRanges(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), range: rangeToString({ offset, count }), marker: marker, maxPageSize: options.maxPageSize }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns an AsyncIterableIterator for {@link PageBlobGetPageRangesResponseModel}\n *\n * @param offset - Starting byte position of the page ranges.\n * @param count - Number of bytes to get.\n * @param marker - A string value that identifies the portion of\n * the get of page ranges to be returned with the next getting operation. The\n * operation returns the ContinuationToken value within the response body if the\n * getting operation did not return all page ranges remaining within the current page.\n * The ContinuationToken value can be used as the value for\n * the marker parameter in a subsequent call to request the next page of get\n * items. The marker value is opaque to the client.\n * @param options - Options to List Page Ranges operation.\n */\n listPageRangeItemSegments(offset = 0, count, marker, options = {}) {\n return tslib_es6_asyncGenerator(this, arguments, function* listPageRangeItemSegments_1() {\n let getPageRangeItemSegmentsResponse;\n if (!!marker || marker === undefined) {\n do {\n getPageRangeItemSegmentsResponse = yield tslib_es6_await(this.listPageRangesSegment(offset, count, marker, options));\n marker = getPageRangeItemSegmentsResponse.continuationToken;\n yield yield tslib_es6_await(yield tslib_es6_await(getPageRangeItemSegmentsResponse));\n } while (marker);\n }\n });\n }\n /**\n * Returns an AsyncIterableIterator of {@link PageRangeInfo} objects\n *\n * @param offset - Starting byte position of the page ranges.\n * @param count - Number of bytes to get.\n * @param options - Options to List Page Ranges operation.\n */\n listPageRangeItems(offset = 0, count, options = {}) {\n return tslib_es6_asyncGenerator(this, arguments, function* listPageRangeItems_1() {\n var e_1, _a;\n let marker;\n try {\n for (var _b = tslib_es6_asyncValues(this.listPageRangeItemSegments(offset, count, marker, options)), _c; _c = yield tslib_es6_await(_b.next()), !_c.done;) {\n const getPageRangesSegment = _c.value;\n yield tslib_es6_await(yield* tslib_es6_asyncDelegator(tslib_es6_asyncValues(ExtractPageRangeInfoItems(getPageRangesSegment))));\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) yield tslib_es6_await(_a.call(_b));\n }\n finally { if (e_1) throw e_1.error; }\n }\n });\n }\n /**\n * Returns an async iterable iterator to list of page ranges for a page blob.\n * @see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges\n *\n * .byPage() returns an async iterable iterator to list of page ranges for a page blob.\n *\n * Example using `for await` syntax:\n *\n * ```js\n * // Get the pageBlobClient before you run these snippets,\n * // Can be obtained from `blobServiceClient.getContainerClient("").getPageBlobClient("");`\n * let i = 1;\n * for await (const pageRange of pageBlobClient.listPageRanges()) {\n * console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);\n * }\n * ```\n *\n * Example using `iter.next()`:\n *\n * ```js\n * let i = 1;\n * let iter = pageBlobClient.listPageRanges();\n * let pageRangeItem = await iter.next();\n * while (!pageRangeItem.done) {\n * console.log(`Page range ${i++}: ${pageRangeItem.value.start} - ${pageRangeItem.value.end}, IsClear: ${pageRangeItem.value.isClear}`);\n * pageRangeItem = await iter.next();\n * }\n * ```\n *\n * Example using `byPage()`:\n *\n * ```js\n * // passing optional maxPageSize in the page settings\n * let i = 1;\n * for await (const response of pageBlobClient.listPageRanges().byPage({ maxPageSize: 20 })) {\n * for (const pageRange of response) {\n * console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);\n * }\n * }\n * ```\n *\n * Example using paging with a marker:\n *\n * ```js\n * let i = 1;\n * let iterator = pageBlobClient.listPageRanges().byPage({ maxPageSize: 2 });\n * let response = (await iterator.next()).value;\n *\n * // Prints 2 page ranges\n * for (const pageRange of response) {\n * console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);\n * }\n *\n * // Gets next marker\n * let marker = response.continuationToken;\n *\n * // Passing next marker as continuationToken\n *\n * iterator = pageBlobClient.listPageRanges().byPage({ continuationToken: marker, maxPageSize: 10 });\n * response = (await iterator.next()).value;\n *\n * // Prints 10 page ranges\n * for (const blob of response) {\n * console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);\n * }\n * ```\n * @param offset - Starting byte position of the page ranges.\n * @param count - Number of bytes to get.\n * @param options - Options to the Page Blob Get Ranges operation.\n * @returns An asyncIterableIterator that supports paging.\n */\n listPageRanges(offset = 0, count, options = {}) {\n options.conditions = options.conditions || {};\n // AsyncIterableIterator to iterate over blobs\n const iter = this.listPageRangeItems(offset, count, options);\n return {\n /**\n * The next method, part of the iteration protocol\n */\n next() {\n return iter.next();\n },\n /**\n * The connection to the async iterator, part of the iteration protocol\n */\n [Symbol.asyncIterator]() {\n return this;\n },\n /**\n * Return an AsyncIterableIterator that works a page at a time\n */\n byPage: (settings = {}) => {\n return this.listPageRangeItemSegments(offset, count, settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, options));\n },\n };\n }\n /**\n * Gets the collection of page ranges that differ between a specified snapshot and this page blob.\n * @see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges\n *\n * @param offset - Starting byte position of the page blob\n * @param count - Number of bytes to get ranges diff.\n * @param prevSnapshot - Timestamp of snapshot to retrieve the difference.\n * @param options - Options to the Page Blob Get Page Ranges Diff operation.\n * @returns Response data for the Page Blob Get Page Range Diff operation.\n */\n async getPageRangesDiff(offset, count, prevSnapshot, options = {}) {\n var _a;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-getPageRangesDiff", options);\n try {\n return await this.pageBlobContext\n .getPageRangesDiff(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), prevsnapshot: prevSnapshot, range: rangeToString({ offset, count }) }, convertTracingToRequestOptionsBase(updatedOptions)))\n .then(rangeResponseFromModel);\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * getPageRangesDiffSegment returns a single segment of page ranges starting from the\n * specified Marker for difference between previous snapshot and the target page blob.\n * Use an empty Marker to start enumeration from the beginning.\n * After getting a segment, process it, and then call getPageRangesDiffSegment again\n * (passing the the previously-returned Marker) to get the next segment.\n * @see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges\n *\n * @param offset - Starting byte position of the page ranges.\n * @param count - Number of bytes to get.\n * @param prevSnapshotOrUrl - Timestamp of snapshot to retrieve the difference or URL of snapshot to retrieve the difference.\n * @param marker - A string value that identifies the portion of the get to be returned with the next get operation.\n * @param options - Options to the Page Blob Get Page Ranges Diff operation.\n */\n async listPageRangesDiffSegment(offset, count, prevSnapshotOrUrl, marker, options) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-getPageRangesDiffSegment", options);\n try {\n return await this.pageBlobContext.getPageRangesDiff(Object.assign({ abortSignal: options === null || options === void 0 ? void 0 : options.abortSignal, leaseAccessConditions: options === null || options === void 0 ? void 0 : options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options === null || options === void 0 ? void 0 : options.conditions), { ifTags: (_a = options === null || options === void 0 ? void 0 : options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), prevsnapshot: prevSnapshotOrUrl, range: rangeToString({\n offset: offset,\n count: count,\n }), marker: marker, maxPageSize: options === null || options === void 0 ? void 0 : options.maxPageSize }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns an AsyncIterableIterator for {@link PageBlobGetPageRangesDiffResponseModel}\n *\n *\n * @param offset - Starting byte position of the page ranges.\n * @param count - Number of bytes to get.\n * @param prevSnapshotOrUrl - Timestamp of snapshot to retrieve the difference or URL of snapshot to retrieve the difference.\n * @param marker - A string value that identifies the portion of\n * the get of page ranges to be returned with the next getting operation. The\n * operation returns the ContinuationToken value within the response body if the\n * getting operation did not return all page ranges remaining within the current page.\n * The ContinuationToken value can be used as the value for\n * the marker parameter in a subsequent call to request the next page of get\n * items. The marker value is opaque to the client.\n * @param options - Options to the Page Blob Get Page Ranges Diff operation.\n */\n listPageRangeDiffItemSegments(offset, count, prevSnapshotOrUrl, marker, options) {\n return tslib_es6_asyncGenerator(this, arguments, function* listPageRangeDiffItemSegments_1() {\n let getPageRangeItemSegmentsResponse;\n if (!!marker || marker === undefined) {\n do {\n getPageRangeItemSegmentsResponse = yield tslib_es6_await(this.listPageRangesDiffSegment(offset, count, prevSnapshotOrUrl, marker, options));\n marker = getPageRangeItemSegmentsResponse.continuationToken;\n yield yield tslib_es6_await(yield tslib_es6_await(getPageRangeItemSegmentsResponse));\n } while (marker);\n }\n });\n }\n /**\n * Returns an AsyncIterableIterator of {@link PageRangeInfo} objects\n *\n * @param offset - Starting byte position of the page ranges.\n * @param count - Number of bytes to get.\n * @param prevSnapshotOrUrl - Timestamp of snapshot to retrieve the difference or URL of snapshot to retrieve the difference.\n * @param options - Options to the Page Blob Get Page Ranges Diff operation.\n */\n listPageRangeDiffItems(offset, count, prevSnapshotOrUrl, options) {\n return tslib_es6_asyncGenerator(this, arguments, function* listPageRangeDiffItems_1() {\n var e_2, _a;\n let marker;\n try {\n for (var _b = tslib_es6_asyncValues(this.listPageRangeDiffItemSegments(offset, count, prevSnapshotOrUrl, marker, options)), _c; _c = yield tslib_es6_await(_b.next()), !_c.done;) {\n const getPageRangesSegment = _c.value;\n yield tslib_es6_await(yield* tslib_es6_asyncDelegator(tslib_es6_asyncValues(ExtractPageRangeInfoItems(getPageRangesSegment))));\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) yield tslib_es6_await(_a.call(_b));\n }\n finally { if (e_2) throw e_2.error; }\n }\n });\n }\n /**\n * Returns an async iterable iterator to list of page ranges that differ between a specified snapshot and this page blob.\n * @see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges\n *\n * .byPage() returns an async iterable iterator to list of page ranges that differ between a specified snapshot and this page blob.\n *\n * Example using `for await` syntax:\n *\n * ```js\n * // Get the pageBlobClient before you run these snippets,\n * // Can be obtained from `blobServiceClient.getContainerClient("").getPageBlobClient("");`\n * let i = 1;\n * for await (const pageRange of pageBlobClient.listPageRangesDiff()) {\n * console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);\n * }\n * ```\n *\n * Example using `iter.next()`:\n *\n * ```js\n * let i = 1;\n * let iter = pageBlobClient.listPageRangesDiff();\n * let pageRangeItem = await iter.next();\n * while (!pageRangeItem.done) {\n * console.log(`Page range ${i++}: ${pageRangeItem.value.start} - ${pageRangeItem.value.end}, IsClear: ${pageRangeItem.value.isClear}`);\n * pageRangeItem = await iter.next();\n * }\n * ```\n *\n * Example using `byPage()`:\n *\n * ```js\n * // passing optional maxPageSize in the page settings\n * let i = 1;\n * for await (const response of pageBlobClient.listPageRangesDiff().byPage({ maxPageSize: 20 })) {\n * for (const pageRange of response) {\n * console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);\n * }\n * }\n * ```\n *\n * Example using paging with a marker:\n *\n * ```js\n * let i = 1;\n * let iterator = pageBlobClient.listPageRangesDiff().byPage({ maxPageSize: 2 });\n * let response = (await iterator.next()).value;\n *\n * // Prints 2 page ranges\n * for (const pageRange of response) {\n * console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);\n * }\n *\n * // Gets next marker\n * let marker = response.continuationToken;\n *\n * // Passing next marker as continuationToken\n *\n * iterator = pageBlobClient.listPageRangesDiff().byPage({ continuationToken: marker, maxPageSize: 10 });\n * response = (await iterator.next()).value;\n *\n * // Prints 10 page ranges\n * for (const blob of response) {\n * console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);\n * }\n * ```\n * @param offset - Starting byte position of the page ranges.\n * @param count - Number of bytes to get.\n * @param prevSnapshot - Timestamp of snapshot to retrieve the difference.\n * @param options - Options to the Page Blob Get Ranges operation.\n * @returns An asyncIterableIterator that supports paging.\n */\n listPageRangesDiff(offset, count, prevSnapshot, options = {}) {\n options.conditions = options.conditions || {};\n // AsyncIterableIterator to iterate over blobs\n const iter = this.listPageRangeDiffItems(offset, count, prevSnapshot, Object.assign({}, options));\n return {\n /**\n * The next method, part of the iteration protocol\n */\n next() {\n return iter.next();\n },\n /**\n * The connection to the async iterator, part of the iteration protocol\n */\n [Symbol.asyncIterator]() {\n return this;\n },\n /**\n * Return an AsyncIterableIterator that works a page at a time\n */\n byPage: (settings = {}) => {\n return this.listPageRangeDiffItemSegments(offset, count, prevSnapshot, settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, options));\n },\n };\n }\n /**\n * Gets the collection of page ranges that differ between a specified snapshot and this page blob for managed disks.\n * @see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges\n *\n * @param offset - Starting byte position of the page blob\n * @param count - Number of bytes to get ranges diff.\n * @param prevSnapshotUrl - URL of snapshot to retrieve the difference.\n * @param options - Options to the Page Blob Get Page Ranges Diff operation.\n * @returns Response data for the Page Blob Get Page Range Diff operation.\n */\n async getPageRangesDiffForManagedDisks(offset, count, prevSnapshotUrl, options = {}) {\n var _a;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-GetPageRangesDiffForManagedDisks", options);\n try {\n return await this.pageBlobContext\n .getPageRangesDiff(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), prevSnapshotUrl, range: rangeToString({ offset, count }) }, convertTracingToRequestOptionsBase(updatedOptions)))\n .then(rangeResponseFromModel);\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Resizes the page blob to the specified size (which must be a multiple of 512).\n * @see https://docs.microsoft.com/rest/api/storageservices/set-blob-properties\n *\n * @param size - Target size\n * @param options - Options to the Page Blob Resize operation.\n * @returns Response data for the Page Blob Resize operation.\n */\n async resize(size, options = {}) {\n var _a;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-resize", options);\n try {\n return await this.pageBlobContext.resize(size, Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), encryptionScope: options.encryptionScope }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Sets a page blob\'s sequence number.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/set-blob-properties\n *\n * @param sequenceNumberAction - Indicates how the service should modify the blob\'s sequence number.\n * @param sequenceNumber - Required if sequenceNumberAction is max or update\n * @param options - Options to the Page Blob Update Sequence Number operation.\n * @returns Response data for the Page Blob Update Sequence Number operation.\n */\n async updateSequenceNumber(sequenceNumberAction, sequenceNumber, options = {}) {\n var _a;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-updateSequenceNumber", options);\n try {\n return await this.pageBlobContext.updateSequenceNumber(sequenceNumberAction, Object.assign({ abortSignal: options.abortSignal, blobSequenceNumber: sequenceNumber, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Begins an operation to start an incremental copy from one page blob\'s snapshot to this page blob.\n * The snapshot is copied such that only the differential changes between the previously\n * copied snapshot are transferred to the destination.\n * The copied snapshots are complete copies of the original snapshot and can be read or copied from as usual.\n * @see https://docs.microsoft.com/rest/api/storageservices/incremental-copy-blob\n * @see https://docs.microsoft.com/en-us/azure/virtual-machines/windows/incremental-snapshots\n *\n * @param copySource - Specifies the name of the source page blob snapshot. For example,\n * https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot=\n * @param options - Options to the Page Blob Copy Incremental operation.\n * @returns Response data for the Page Blob Copy Incremental operation.\n */\n async startCopyIncremental(copySource, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-startCopyIncremental", options);\n try {\n return await this.pageBlobContext.copyIncremental(copySource, Object.assign({ abortSignal: options.abortSignal, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n}\n//# sourceMappingURL=Clients.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/BatchUtils.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\nasync function getBodyAsText(batchResponse) {\n let buffer = Buffer.alloc(BATCH_MAX_PAYLOAD_IN_BYTES);\n const responseLength = await streamToBuffer2(batchResponse.readableStreamBody, buffer);\n // Slice the buffer to trim the empty ending.\n buffer = buffer.slice(0, responseLength);\n return buffer.toString();\n}\nfunction utf8ByteLength(str) {\n return Buffer.byteLength(str);\n}\n//# sourceMappingURL=BatchUtils.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/BatchResponseParser.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\nconst HTTP_HEADER_DELIMITER = ": ";\nconst SPACE_DELIMITER = " ";\nconst NOT_FOUND = -1;\n/**\n * Util class for parsing batch response.\n */\nclass BatchResponseParser {\n constructor(batchResponse, subRequests) {\n if (!batchResponse || !batchResponse.contentType) {\n // In special case(reported), server may return invalid content-type which could not be parsed.\n throw new RangeError("batchResponse is malformed or doesn\'t contain valid content-type.");\n }\n if (!subRequests || subRequests.size === 0) {\n // This should be prevent during coding.\n throw new RangeError("Invalid state: subRequests is not provided or size is 0.");\n }\n this.batchResponse = batchResponse;\n this.subRequests = subRequests;\n this.responseBatchBoundary = this.batchResponse.contentType.split("=")[1];\n this.perResponsePrefix = `--${this.responseBatchBoundary}${HTTP_LINE_ENDING}`;\n this.batchResponseEnding = `--${this.responseBatchBoundary}--`;\n }\n // For example of response, please refer to https://docs.microsoft.com/en-us/rest/api/storageservices/blob-batch#response\n async parseBatchResponse() {\n // When logic reach here, suppose batch request has already succeeded with 202, so we can further parse\n // sub request\'s response.\n if (this.batchResponse._response.status !== HTTPURLConnection.HTTP_ACCEPTED) {\n throw new Error(`Invalid state: batch request failed with status: \'${this.batchResponse._response.status}\'.`);\n }\n const responseBodyAsText = await getBodyAsText(this.batchResponse);\n const subResponses = responseBodyAsText\n .split(this.batchResponseEnding)[0] // string after ending is useless\n .split(this.perResponsePrefix)\n .slice(1); // string before first response boundary is useless\n const subResponseCount = subResponses.length;\n // Defensive coding in case of potential error parsing.\n // Note: subResponseCount == 1 is special case where sub request is invalid.\n // We try to prevent such cases through early validation, e.g. validate sub request count >= 1.\n // While in unexpected sub request invalid case, we allow sub response to be parsed and return to user.\n if (subResponseCount !== this.subRequests.size && subResponseCount !== 1) {\n throw new Error("Invalid state: sub responses\' count is not equal to sub requests\' count.");\n }\n const deserializedSubResponses = new Array(subResponseCount);\n let subResponsesSucceededCount = 0;\n let subResponsesFailedCount = 0;\n // Parse sub subResponses.\n for (let index = 0; index < subResponseCount; index++) {\n const subResponse = subResponses[index];\n const deserializedSubResponse = {};\n deserializedSubResponse.headers = new httpHeaders_HttpHeaders();\n const responseLines = subResponse.split(`${HTTP_LINE_ENDING}`);\n let subRespHeaderStartFound = false;\n let subRespHeaderEndFound = false;\n let subRespFailed = false;\n let contentId = NOT_FOUND;\n for (const responseLine of responseLines) {\n if (!subRespHeaderStartFound) {\n // Convention line to indicate content ID\n if (responseLine.startsWith(constants_HeaderConstants.CONTENT_ID)) {\n contentId = parseInt(responseLine.split(HTTP_HEADER_DELIMITER)[1]);\n }\n // Http version line with status code indicates the start of sub request\'s response.\n // Example: HTTP/1.1 202 Accepted\n if (responseLine.startsWith(HTTP_VERSION_1_1)) {\n subRespHeaderStartFound = true;\n const tokens = responseLine.split(SPACE_DELIMITER);\n deserializedSubResponse.status = parseInt(tokens[1]);\n deserializedSubResponse.statusMessage = tokens.slice(2).join(SPACE_DELIMITER);\n }\n continue; // Skip convention headers not specifically for sub request i.e. Content-Type: application/http and Content-ID: *\n }\n if (responseLine.trim() === "") {\n // Sub response\'s header start line already found, and the first empty line indicates header end line found.\n if (!subRespHeaderEndFound) {\n subRespHeaderEndFound = true;\n }\n continue; // Skip empty line\n }\n // Note: when code reach here, it indicates subRespHeaderStartFound == true\n if (!subRespHeaderEndFound) {\n if (responseLine.indexOf(HTTP_HEADER_DELIMITER) === -1) {\n // Defensive coding to prevent from missing valuable lines.\n throw new Error(`Invalid state: find non-empty line \'${responseLine}\' without HTTP header delimiter \'${HTTP_HEADER_DELIMITER}\'.`);\n }\n // Parse headers of sub response.\n const tokens = responseLine.split(HTTP_HEADER_DELIMITER);\n deserializedSubResponse.headers.set(tokens[0], tokens[1]);\n if (tokens[0] === constants_HeaderConstants.X_MS_ERROR_CODE) {\n deserializedSubResponse.errorCode = tokens[1];\n subRespFailed = true;\n }\n }\n else {\n // Assemble body of sub response.\n if (!deserializedSubResponse.bodyAsText) {\n deserializedSubResponse.bodyAsText = "";\n }\n deserializedSubResponse.bodyAsText += responseLine;\n }\n } // Inner for end\n // The response will contain the Content-ID header for each corresponding subrequest response to use for tracking.\n // The Content-IDs are set to a valid index in the subrequests we sent. In the status code 202 path, we could expect it\n // to be 1-1 mapping from the [0, subRequests.size) to the Content-IDs returned. If not, we simply don\'t return that\n // unexpected subResponse in the parsed reponse and we can always look it up in the raw response for debugging purpose.\n if (contentId !== NOT_FOUND &&\n Number.isInteger(contentId) &&\n contentId >= 0 &&\n contentId < this.subRequests.size &&\n deserializedSubResponses[contentId] === undefined) {\n deserializedSubResponse._request = this.subRequests.get(contentId);\n deserializedSubResponses[contentId] = deserializedSubResponse;\n }\n else {\n logger.error(`subResponses[${index}] is dropped as the Content-ID is not found or invalid, Content-ID: ${contentId}`);\n }\n if (subRespFailed) {\n subResponsesFailedCount++;\n }\n else {\n subResponsesSucceededCount++;\n }\n }\n return {\n subResponses: deserializedSubResponses,\n subResponsesSucceededCount: subResponsesSucceededCount,\n subResponsesFailedCount: subResponsesFailedCount,\n };\n }\n}\n//# sourceMappingURL=BatchResponseParser.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/utils/Mutex.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nvar MutexLockStatus;\n(function (MutexLockStatus) {\n MutexLockStatus[MutexLockStatus["LOCKED"] = 0] = "LOCKED";\n MutexLockStatus[MutexLockStatus["UNLOCKED"] = 1] = "UNLOCKED";\n})(MutexLockStatus || (MutexLockStatus = {}));\n/**\n * An async mutex lock.\n */\nclass Mutex {\n /**\n * Lock for a specific key. If the lock has been acquired by another customer, then\n * will wait until getting the lock.\n *\n * @param key - lock key\n */\n static async lock(key) {\n return new Promise((resolve) => {\n if (this.keys[key] === undefined || this.keys[key] === MutexLockStatus.UNLOCKED) {\n this.keys[key] = MutexLockStatus.LOCKED;\n resolve();\n }\n else {\n this.onUnlockEvent(key, () => {\n this.keys[key] = MutexLockStatus.LOCKED;\n resolve();\n });\n }\n });\n }\n /**\n * Unlock a key.\n *\n * @param key -\n */\n static async unlock(key) {\n return new Promise((resolve) => {\n if (this.keys[key] === MutexLockStatus.LOCKED) {\n this.emitUnlockEvent(key);\n }\n delete this.keys[key];\n resolve();\n });\n }\n static onUnlockEvent(key, handler) {\n if (this.listeners[key] === undefined) {\n this.listeners[key] = [handler];\n }\n else {\n this.listeners[key].push(handler);\n }\n }\n static emitUnlockEvent(key) {\n if (this.listeners[key] !== undefined && this.listeners[key].length > 0) {\n const handler = this.listeners[key].shift();\n setImmediate(() => {\n handler.call(this);\n });\n }\n }\n}\nMutex.keys = {};\nMutex.listeners = {};\n//# sourceMappingURL=Mutex.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/BlobBatch.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n\n\n\n\n/**\n * A BlobBatch represents an aggregated set of operations on blobs.\n * Currently, only `delete` and `setAccessTier` are supported.\n */\nclass BlobBatch {\n constructor() {\n this.batch = "batch";\n this.batchRequest = new InnerBatchRequest();\n }\n /**\n * Get the value of Content-Type for a batch request.\n * The value must be multipart/mixed with a batch boundary.\n * Example: multipart/mixed; boundary=batch_a81786c8-e301-4e42-a729-a32ca24ae252\n */\n getMultiPartContentType() {\n return this.batchRequest.getMultipartContentType();\n }\n /**\n * Get assembled HTTP request body for sub requests.\n */\n getHttpRequestBody() {\n return this.batchRequest.getHttpRequestBody();\n }\n /**\n * Get sub requests that are added into the batch request.\n */\n getSubRequests() {\n return this.batchRequest.getSubRequests();\n }\n async addSubRequestInternal(subRequest, assembleSubRequestFunc) {\n await Mutex.lock(this.batch);\n try {\n this.batchRequest.preAddSubRequest(subRequest);\n await assembleSubRequestFunc();\n this.batchRequest.postAddSubRequest(subRequest);\n }\n finally {\n await Mutex.unlock(this.batch);\n }\n }\n setBatchType(batchType) {\n if (!this.batchType) {\n this.batchType = batchType;\n }\n if (this.batchType !== batchType) {\n throw new RangeError(`BlobBatch only supports one operation type per batch and it already is being used for ${this.batchType} operations.`);\n }\n }\n async deleteBlob(urlOrBlobClient, credentialOrOptions, options) {\n let url;\n let credential;\n if (typeof urlOrBlobClient === "string" &&\n ((checkEnvironment_isNode && credentialOrOptions instanceof StorageSharedKeyCredential) ||\n credentialOrOptions instanceof AnonymousCredential ||\n isTokenCredential(credentialOrOptions))) {\n // First overload\n url = urlOrBlobClient;\n credential = credentialOrOptions;\n }\n else if (urlOrBlobClient instanceof BlobClient) {\n // Second overload\n url = urlOrBlobClient.url;\n credential = urlOrBlobClient.credential;\n options = credentialOrOptions;\n }\n else {\n throw new RangeError("Invalid arguments. Either url and credential, or BlobClient need be provided.");\n }\n if (!options) {\n options = {};\n }\n const { span, updatedOptions } = tracing_createSpan("BatchDeleteRequest-addSubRequest", options);\n try {\n this.setBatchType("delete");\n await this.addSubRequestInternal({\n url: url,\n credential: credential,\n }, async () => {\n await new BlobClient(url, this.batchRequest.createPipeline(credential)).delete(updatedOptions);\n });\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n async setBlobAccessTier(urlOrBlobClient, credentialOrTier, tierOrOptions, options) {\n let url;\n let credential;\n let tier;\n if (typeof urlOrBlobClient === "string" &&\n ((checkEnvironment_isNode && credentialOrTier instanceof StorageSharedKeyCredential) ||\n credentialOrTier instanceof AnonymousCredential ||\n isTokenCredential(credentialOrTier))) {\n // First overload\n url = urlOrBlobClient;\n credential = credentialOrTier;\n tier = tierOrOptions;\n }\n else if (urlOrBlobClient instanceof BlobClient) {\n // Second overload\n url = urlOrBlobClient.url;\n credential = urlOrBlobClient.credential;\n tier = credentialOrTier;\n options = tierOrOptions;\n }\n else {\n throw new RangeError("Invalid arguments. Either url and credential, or BlobClient need be provided.");\n }\n if (!options) {\n options = {};\n }\n const { span, updatedOptions } = tracing_createSpan("BatchSetTierRequest-addSubRequest", options);\n try {\n this.setBatchType("setAccessTier");\n await this.addSubRequestInternal({\n url: url,\n credential: credential,\n }, async () => {\n await new BlobClient(url, this.batchRequest.createPipeline(credential)).setAccessTier(tier, updatedOptions);\n });\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n}\n/**\n * Inner batch request class which is responsible for assembling and serializing sub requests.\n * See https://docs.microsoft.com/en-us/rest/api/storageservices/blob-batch#request-body for how requests are assembled.\n */\nclass InnerBatchRequest {\n constructor() {\n this.operationCount = 0;\n this.body = "";\n const tempGuid = generateUuid();\n // batch_{batchid}\n this.boundary = `batch_${tempGuid}`;\n // --batch_{batchid}\n // Content-Type: application/http\n // Content-Transfer-Encoding: binary\n this.subRequestPrefix = `--${this.boundary}${HTTP_LINE_ENDING}${constants_HeaderConstants.CONTENT_TYPE}: application/http${HTTP_LINE_ENDING}${constants_HeaderConstants.CONTENT_TRANSFER_ENCODING}: binary`;\n // multipart/mixed; boundary=batch_{batchid}\n this.multipartContentType = `multipart/mixed; boundary=${this.boundary}`;\n // --batch_{batchid}--\n this.batchRequestEnding = `--${this.boundary}--`;\n this.subRequests = new Map();\n }\n /**\n * Create pipeline to assemble sub requests. The idea here is to use existing\n * credential and serialization/deserialization components, with additional policies to\n * filter unnecessary headers, assemble sub requests into request\'s body\n * and intercept request from going to wire.\n * @param credential - Such as AnonymousCredential, StorageSharedKeyCredential or any credential from the `@azure/identity` package to authenticate requests to the service. You can also provide an object that implements the TokenCredential interface. If not specified, AnonymousCredential is used.\n */\n createPipeline(credential) {\n const isAnonymousCreds = credential instanceof AnonymousCredential;\n const policyFactoryLength = 3 + (isAnonymousCreds ? 0 : 1); // [deserializationPolicy, BatchHeaderFilterPolicyFactory, (Optional)Credential, BatchRequestAssemblePolicyFactory]\n const factories = new Array(policyFactoryLength);\n factories[0] = deserializationPolicy_deserializationPolicy(); // Default deserializationPolicy is provided by protocol layer\n factories[1] = new BatchHeaderFilterPolicyFactory(); // Use batch header filter policy to exclude unnecessary headers\n if (!isAnonymousCreds) {\n factories[2] = isTokenCredential(credential)\n ? attachCredential(bearerTokenAuthenticationPolicy(credential, StorageOAuthScopes), credential)\n : credential;\n }\n factories[policyFactoryLength - 1] = new BatchRequestAssemblePolicyFactory(this); // Use batch assemble policy to assemble request and intercept request from going to wire\n return new Pipeline(factories, {});\n }\n appendSubRequestToBody(request) {\n // Start to assemble sub request\n this.body += [\n this.subRequestPrefix,\n `${constants_HeaderConstants.CONTENT_ID}: ${this.operationCount}`,\n "",\n `${request.method.toString()} ${getURLPathAndQuery(request.url)} ${HTTP_VERSION_1_1}${HTTP_LINE_ENDING}`, // sub request start line with method\n ].join(HTTP_LINE_ENDING);\n for (const header of request.headers.headersArray()) {\n this.body += `${header.name}: ${header.value}${HTTP_LINE_ENDING}`;\n }\n this.body += HTTP_LINE_ENDING; // sub request\'s headers need be ending with an empty line\n // No body to assemble for current batch request support\n // End to assemble sub request\n }\n preAddSubRequest(subRequest) {\n if (this.operationCount >= BATCH_MAX_REQUEST) {\n throw new RangeError(`Cannot exceed ${BATCH_MAX_REQUEST} sub requests in a single batch`);\n }\n // Fast fail if url for sub request is invalid\n const path = getURLPath(subRequest.url);\n if (!path || path === "") {\n throw new RangeError(`Invalid url for sub request: \'${subRequest.url}\'`);\n }\n }\n postAddSubRequest(subRequest) {\n this.subRequests.set(this.operationCount, subRequest);\n this.operationCount++;\n }\n // Return the http request body with assembling the ending line to the sub request body.\n getHttpRequestBody() {\n return `${this.body}${this.batchRequestEnding}${HTTP_LINE_ENDING}`;\n }\n getMultipartContentType() {\n return this.multipartContentType;\n }\n getSubRequests() {\n return this.subRequests;\n }\n}\nclass BatchRequestAssemblePolicy extends BaseRequestPolicy {\n constructor(batchRequest, nextPolicy, options) {\n super(nextPolicy, options);\n this.dummyResponse = {\n request: new WebResource(),\n status: 200,\n headers: new httpHeaders_HttpHeaders(),\n };\n this.batchRequest = batchRequest;\n }\n async sendRequest(request) {\n await this.batchRequest.appendSubRequestToBody(request);\n return this.dummyResponse; // Intercept request from going to wire\n }\n}\nclass BatchRequestAssemblePolicyFactory {\n constructor(batchRequest) {\n this.batchRequest = batchRequest;\n }\n create(nextPolicy, options) {\n return new BatchRequestAssemblePolicy(this.batchRequest, nextPolicy, options);\n }\n}\nclass BatchHeaderFilterPolicy extends BaseRequestPolicy {\n // The base class has a protected constructor. Adding a public one to enable constructing of this class.\n /* eslint-disable-next-line @typescript-eslint/no-useless-constructor*/\n constructor(nextPolicy, options) {\n super(nextPolicy, options);\n }\n async sendRequest(request) {\n let xMsHeaderName = "";\n for (const header of request.headers.headersArray()) {\n if (iEqual(header.name, constants_HeaderConstants.X_MS_VERSION)) {\n xMsHeaderName = header.name;\n }\n }\n if (xMsHeaderName !== "") {\n request.headers.remove(xMsHeaderName); // The subrequests should not have the x-ms-version header.\n }\n return this._nextPolicy.sendRequest(request);\n }\n}\nclass BatchHeaderFilterPolicyFactory {\n create(nextPolicy, options) {\n return new BatchHeaderFilterPolicy(nextPolicy, options);\n }\n}\n//# sourceMappingURL=BlobBatch.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/BlobBatchClient.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n\n\n\n\n/**\n * A BlobBatchClient allows you to make batched requests to the Azure Storage Blob service.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/blob-batch\n */\nclass BlobBatchClient {\n constructor(url, credentialOrPipeline, \n // Legacy, no fix for eslint error without breaking. Disable it for this interface.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/\n options) {\n let pipeline;\n if (isPipelineLike(credentialOrPipeline)) {\n pipeline = credentialOrPipeline;\n }\n else if (!credentialOrPipeline) {\n // no credential provided\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else {\n pipeline = newPipeline(credentialOrPipeline, options);\n }\n const storageClientContext = new StorageClientContext(url, pipeline.toServiceClientOptions());\n const path = getURLPath(url);\n if (path && path !== "/") {\n // Container scoped.\n this.serviceOrContainerContext = new Container(storageClientContext);\n }\n else {\n this.serviceOrContainerContext = new Service(storageClientContext);\n }\n }\n /**\n * Creates a {@link BlobBatch}.\n * A BlobBatch represents an aggregated set of operations on blobs.\n */\n createBatch() {\n return new BlobBatch();\n }\n async deleteBlobs(urlsOrBlobClients, credentialOrOptions, \n // Legacy, no fix for eslint error without breaking. Disable it for this interface.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/\n options) {\n const batch = new BlobBatch();\n for (const urlOrBlobClient of urlsOrBlobClients) {\n if (typeof urlOrBlobClient === "string") {\n await batch.deleteBlob(urlOrBlobClient, credentialOrOptions, options);\n }\n else {\n await batch.deleteBlob(urlOrBlobClient, credentialOrOptions);\n }\n }\n return this.submitBatch(batch);\n }\n async setBlobsAccessTier(urlsOrBlobClients, credentialOrTier, tierOrOptions, \n // Legacy, no fix for eslint error without breaking. Disable it for this interface.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/\n options) {\n const batch = new BlobBatch();\n for (const urlOrBlobClient of urlsOrBlobClients) {\n if (typeof urlOrBlobClient === "string") {\n await batch.setBlobAccessTier(urlOrBlobClient, credentialOrTier, tierOrOptions, options);\n }\n else {\n await batch.setBlobAccessTier(urlOrBlobClient, credentialOrTier, tierOrOptions);\n }\n }\n return this.submitBatch(batch);\n }\n /**\n * Submit batch request which consists of multiple subrequests.\n *\n * Get `blobBatchClient` and other details before running the snippets.\n * `blobServiceClient.getBlobBatchClient()` gives the `blobBatchClient`\n *\n * Example usage:\n *\n * ```js\n * let batchRequest = new BlobBatch();\n * await batchRequest.deleteBlob(urlInString0, credential0);\n * await batchRequest.deleteBlob(urlInString1, credential1, {\n * deleteSnapshots: "include"\n * });\n * const batchResp = await blobBatchClient.submitBatch(batchRequest);\n * console.log(batchResp.subResponsesSucceededCount);\n * ```\n *\n * Example using a lease:\n *\n * ```js\n * let batchRequest = new BlobBatch();\n * await batchRequest.setBlobAccessTier(blockBlobClient0, "Cool");\n * await batchRequest.setBlobAccessTier(blockBlobClient1, "Cool", {\n * conditions: { leaseId: leaseId }\n * });\n * const batchResp = await blobBatchClient.submitBatch(batchRequest);\n * console.log(batchResp.subResponsesSucceededCount);\n * ```\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/blob-batch\n *\n * @param batchRequest - A set of Delete or SetTier operations.\n * @param options -\n */\n async submitBatch(batchRequest, options = {}) {\n if (!batchRequest || batchRequest.getSubRequests().size === 0) {\n throw new RangeError("Batch request should contain one or more sub requests.");\n }\n const { span, updatedOptions } = tracing_createSpan("BlobBatchClient-submitBatch", options);\n try {\n const batchRequestBody = batchRequest.getHttpRequestBody();\n // ServiceSubmitBatchResponseModel and ContainerSubmitBatchResponse are compatible for now.\n const rawBatchResponse = await this.serviceOrContainerContext.submitBatch(utf8ByteLength(batchRequestBody), batchRequest.getMultiPartContentType(), batchRequestBody, Object.assign(Object.assign({}, options), convertTracingToRequestOptionsBase(updatedOptions)));\n // Parse the sub responses result, if logic reaches here(i.e. the batch request succeeded with status code 202).\n const batchResponseParser = new BatchResponseParser(rawBatchResponse, batchRequest.getSubRequests());\n const responseSummary = await batchResponseParser.parseBatchResponse();\n const res = {\n _response: rawBatchResponse._response,\n contentType: rawBatchResponse.contentType,\n errorCode: rawBatchResponse.errorCode,\n requestId: rawBatchResponse.requestId,\n clientRequestId: rawBatchResponse.clientRequestId,\n version: rawBatchResponse.version,\n subResponses: responseSummary.subResponses,\n subResponsesSucceededCount: responseSummary.subResponsesSucceededCount,\n subResponsesFailedCount: responseSummary.subResponsesFailedCount,\n };\n return res;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n}\n//# sourceMappingURL=BlobBatchClient.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/ContainerClient.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * A ContainerClient represents a URL to the Azure Storage container allowing you to manipulate its blobs.\n */\nclass ContainerClient extends StorageClient {\n constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, \n // Legacy, no fix for eslint error without breaking. Disable it for this interface.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/\n options) {\n let pipeline;\n let url;\n options = options || {};\n if (isPipelineLike(credentialOrPipelineOrContainerName)) {\n // (url: string, pipeline: Pipeline)\n url = urlOrConnectionString;\n pipeline = credentialOrPipelineOrContainerName;\n }\n else if ((checkEnvironment_isNode && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential) ||\n credentialOrPipelineOrContainerName instanceof AnonymousCredential ||\n isTokenCredential(credentialOrPipelineOrContainerName)) {\n // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)\n url = urlOrConnectionString;\n pipeline = newPipeline(credentialOrPipelineOrContainerName, options);\n }\n else if (!credentialOrPipelineOrContainerName &&\n typeof credentialOrPipelineOrContainerName !== "string") {\n // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)\n // The second parameter is undefined. Use anonymous credential.\n url = urlOrConnectionString;\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else if (credentialOrPipelineOrContainerName &&\n typeof credentialOrPipelineOrContainerName === "string") {\n // (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)\n const containerName = credentialOrPipelineOrContainerName;\n const extractedCreds = extractConnectionStringParts(urlOrConnectionString);\n if (extractedCreds.kind === "AccountConnString") {\n if (checkEnvironment_isNode) {\n const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);\n url = appendToURLPath(extractedCreds.url, encodeURIComponent(containerName));\n if (!options.proxyOptions) {\n options.proxyOptions = getDefaultProxySettings(extractedCreds.proxyUri);\n }\n pipeline = newPipeline(sharedKeyCredential, options);\n }\n else {\n throw new Error("Account connection string is only supported in Node.js environment");\n }\n }\n else if (extractedCreds.kind === "SASConnString") {\n url =\n appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)) +\n "?" +\n extractedCreds.accountSas;\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else {\n throw new Error("Connection string must be either an Account connection string or a SAS connection string");\n }\n }\n else {\n throw new Error("Expecting non-empty strings for containerName parameter");\n }\n super(url, pipeline);\n this._containerName = this.getContainerNameFromUrl();\n this.containerContext = new Container(this.storageClientContext);\n }\n /**\n * The name of the container.\n */\n get containerName() {\n return this._containerName;\n }\n /**\n * Creates a new container under the specified account. If the container with\n * the same name already exists, the operation fails.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/create-container\n * Naming rules: @see https://learn.microsoft.com/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata\n *\n * @param options - Options to Container Create operation.\n *\n *\n * Example usage:\n *\n * ```js\n * const containerClient = blobServiceClient.getContainerClient("");\n * const createContainerResponse = await containerClient.create();\n * console.log("Container was created successfully", createContainerResponse.requestId);\n * ```\n */\n async create(options = {}) {\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-create", options);\n try {\n // Spread operator in destructuring assignments,\n // this will filter out unwanted properties from the response object into result object\n return await this.containerContext.create(Object.assign(Object.assign({}, options), convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Creates a new container under the specified account. If the container with\n * the same name already exists, it is not changed.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/create-container\n * Naming rules: @see https://learn.microsoft.com/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata\n *\n * @param options -\n */\n async createIfNotExists(options = {}) {\n var _a, _b;\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-createIfNotExists", options);\n try {\n const res = await this.create(updatedOptions);\n return Object.assign(Object.assign({ succeeded: true }, res), { _response: res._response });\n }\n catch (e) {\n if (((_a = e.details) === null || _a === void 0 ? void 0 : _a.errorCode) === "ContainerAlreadyExists") {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: "Expected exception when creating a container only if it does not already exist.",\n });\n return Object.assign(Object.assign({ succeeded: false }, (_b = e.response) === null || _b === void 0 ? void 0 : _b.parsedHeaders), { _response: e.response });\n }\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns true if the Azure container resource represented by this client exists; false otherwise.\n *\n * NOTE: use this function with care since an existing container might be deleted by other clients or\n * applications. Vice versa new containers with the same name might be added by other clients or\n * applications after this function completes.\n *\n * @param options -\n */\n async exists(options = {}) {\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-exists", options);\n try {\n await this.getProperties({\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n });\n return true;\n }\n catch (e) {\n if (e.statusCode === 404) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: "Expected exception when checking container existence",\n });\n return false;\n }\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Creates a {@link BlobClient}\n *\n * @param blobName - A blob name\n * @returns A new BlobClient object for the given blob name.\n */\n getBlobClient(blobName) {\n return new BlobClient(appendToURLPath(this.url, EscapePath(blobName)), this.pipeline);\n }\n /**\n * Creates an {@link AppendBlobClient}\n *\n * @param blobName - An append blob name\n */\n getAppendBlobClient(blobName) {\n return new AppendBlobClient(appendToURLPath(this.url, EscapePath(blobName)), this.pipeline);\n }\n /**\n * Creates a {@link BlockBlobClient}\n *\n * @param blobName - A block blob name\n *\n *\n * Example usage:\n *\n * ```js\n * const content = "Hello world!";\n *\n * const blockBlobClient = containerClient.getBlockBlobClient("");\n * const uploadBlobResponse = await blockBlobClient.upload(content, content.length);\n * ```\n */\n getBlockBlobClient(blobName) {\n return new BlockBlobClient(appendToURLPath(this.url, EscapePath(blobName)), this.pipeline);\n }\n /**\n * Creates a {@link PageBlobClient}\n *\n * @param blobName - A page blob name\n */\n getPageBlobClient(blobName) {\n return new PageBlobClient(appendToURLPath(this.url, EscapePath(blobName)), this.pipeline);\n }\n /**\n * Returns all user-defined metadata and system properties for the specified\n * container. The data returned does not include the container\'s list of blobs.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-container-properties\n *\n * WARNING: The `metadata` object returned in the response will have its keys in lowercase, even if\n * they originally contained uppercase characters. This differs from the metadata keys returned by\n * the `listContainers` method of {@link BlobServiceClient} using the `includeMetadata` option, which\n * will retain their original casing.\n *\n * @param options - Options to Container Get Properties operation.\n */\n async getProperties(options = {}) {\n if (!options.conditions) {\n options.conditions = {};\n }\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-getProperties", options);\n try {\n return await this.containerContext.getProperties(Object.assign(Object.assign({ abortSignal: options.abortSignal }, options.conditions), convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Marks the specified container for deletion. The container and any blobs\n * contained within it are later deleted during garbage collection.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/delete-container\n *\n * @param options - Options to Container Delete operation.\n */\n async delete(options = {}) {\n if (!options.conditions) {\n options.conditions = {};\n }\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-delete", options);\n try {\n return await this.containerContext.delete(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: options.conditions }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Marks the specified container for deletion if it exists. The container and any blobs\n * contained within it are later deleted during garbage collection.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/delete-container\n *\n * @param options - Options to Container Delete operation.\n */\n async deleteIfExists(options = {}) {\n var _a, _b;\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-deleteIfExists", options);\n try {\n const res = await this.delete(updatedOptions);\n return Object.assign(Object.assign({ succeeded: true }, res), { _response: res._response });\n }\n catch (e) {\n if (((_a = e.details) === null || _a === void 0 ? void 0 : _a.errorCode) === "ContainerNotFound") {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: "Expected exception when deleting a container only if it exists.",\n });\n return Object.assign(Object.assign({ succeeded: false }, (_b = e.response) === null || _b === void 0 ? void 0 : _b.parsedHeaders), { _response: e.response });\n }\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Sets one or more user-defined name-value pairs for the specified container.\n *\n * If no option provided, or no metadata defined in the parameter, the container\n * metadata will be removed.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/set-container-metadata\n *\n * @param metadata - Replace existing metadata with this value.\n * If no value provided the existing metadata will be removed.\n * @param options - Options to Container Set Metadata operation.\n */\n async setMetadata(metadata, options = {}) {\n if (!options.conditions) {\n options.conditions = {};\n }\n if (options.conditions.ifUnmodifiedSince) {\n throw new RangeError("the IfUnmodifiedSince must have their default values because they are ignored by the blob service");\n }\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-setMetadata", options);\n try {\n return await this.containerContext.setMetadata(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, metadata, modifiedAccessConditions: options.conditions }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Gets the permissions for the specified container. The permissions indicate\n * whether container data may be accessed publicly.\n *\n * WARNING: JavaScript Date will potentially lose precision when parsing startsOn and expiresOn strings.\n * For example, new Date("2018-12-31T03:44:23.8827891Z").toISOString() will get "2018-12-31T03:44:23.882Z".\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-container-acl\n *\n * @param options - Options to Container Get Access Policy operation.\n */\n async getAccessPolicy(options = {}) {\n if (!options.conditions) {\n options.conditions = {};\n }\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-getAccessPolicy", options);\n try {\n const response = await this.containerContext.getAccessPolicy(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions }, convertTracingToRequestOptionsBase(updatedOptions)));\n const res = {\n _response: response._response,\n blobPublicAccess: response.blobPublicAccess,\n date: response.date,\n etag: response.etag,\n errorCode: response.errorCode,\n lastModified: response.lastModified,\n requestId: response.requestId,\n clientRequestId: response.clientRequestId,\n signedIdentifiers: [],\n version: response.version,\n };\n for (const identifier of response) {\n let accessPolicy = undefined;\n if (identifier.accessPolicy) {\n accessPolicy = {\n permissions: identifier.accessPolicy.permissions,\n };\n if (identifier.accessPolicy.expiresOn) {\n accessPolicy.expiresOn = new Date(identifier.accessPolicy.expiresOn);\n }\n if (identifier.accessPolicy.startsOn) {\n accessPolicy.startsOn = new Date(identifier.accessPolicy.startsOn);\n }\n }\n res.signedIdentifiers.push({\n accessPolicy,\n id: identifier.id,\n });\n }\n return res;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Sets the permissions for the specified container. The permissions indicate\n * whether blobs in a container may be accessed publicly.\n *\n * When you set permissions for a container, the existing permissions are replaced.\n * If no access or containerAcl provided, the existing container ACL will be\n * removed.\n *\n * When you establish a stored access policy on a container, it may take up to 30 seconds to take effect.\n * During this interval, a shared access signature that is associated with the stored access policy will\n * fail with status code 403 (Forbidden), until the access policy becomes active.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/set-container-acl\n *\n * @param access - The level of public access to data in the container.\n * @param containerAcl - Array of elements each having a unique Id and details of the access policy.\n * @param options - Options to Container Set Access Policy operation.\n */\n async setAccessPolicy(access, containerAcl, options = {}) {\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-setAccessPolicy", options);\n try {\n const acl = [];\n for (const identifier of containerAcl || []) {\n acl.push({\n accessPolicy: {\n expiresOn: identifier.accessPolicy.expiresOn\n ? truncatedISO8061Date(identifier.accessPolicy.expiresOn)\n : "",\n permissions: identifier.accessPolicy.permissions,\n startsOn: identifier.accessPolicy.startsOn\n ? truncatedISO8061Date(identifier.accessPolicy.startsOn)\n : "",\n },\n id: identifier.id,\n });\n }\n return await this.containerContext.setAccessPolicy(Object.assign({ abortSignal: options.abortSignal, access, containerAcl: acl, leaseAccessConditions: options.conditions, modifiedAccessConditions: options.conditions }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Get a {@link BlobLeaseClient} that manages leases on the container.\n *\n * @param proposeLeaseId - Initial proposed lease Id.\n * @returns A new BlobLeaseClient object for managing leases on the container.\n */\n getBlobLeaseClient(proposeLeaseId) {\n return new BlobLeaseClient(this, proposeLeaseId);\n }\n /**\n * Creates a new block blob, or updates the content of an existing block blob.\n *\n * Updating an existing block blob overwrites any existing metadata on the blob.\n * Partial updates are not supported; the content of the existing blob is\n * overwritten with the new content. To perform a partial update of a block blob\'s,\n * use {@link BlockBlobClient.stageBlock} and {@link BlockBlobClient.commitBlockList}.\n *\n * This is a non-parallel uploading method, please use {@link BlockBlobClient.uploadFile},\n * {@link BlockBlobClient.uploadStream} or {@link BlockBlobClient.uploadBrowserData} for better\n * performance with concurrency uploading.\n *\n * @see https://docs.microsoft.com/rest/api/storageservices/put-blob\n *\n * @param blobName - Name of the block blob to create or update.\n * @param body - Blob, string, ArrayBuffer, ArrayBufferView or a function\n * which returns a new Readable stream whose offset is from data source beginning.\n * @param contentLength - Length of body in bytes. Use Buffer.byteLength() to calculate body length for a\n * string including non non-Base64/Hex-encoded characters.\n * @param options - Options to configure the Block Blob Upload operation.\n * @returns Block Blob upload response data and the corresponding BlockBlobClient instance.\n */\n async uploadBlockBlob(blobName, body, contentLength, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-uploadBlockBlob", options);\n try {\n const blockBlobClient = this.getBlockBlobClient(blobName);\n const response = await blockBlobClient.upload(body, contentLength, updatedOptions);\n return {\n blockBlobClient,\n response,\n };\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Marks the specified blob or snapshot for deletion. The blob is later deleted\n * during garbage collection. Note that in order to delete a blob, you must delete\n * all of its snapshots. You can delete both at the same time with the Delete\n * Blob operation.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/delete-blob\n *\n * @param blobName -\n * @param options - Options to Blob Delete operation.\n * @returns Block blob deletion response data.\n */\n async deleteBlob(blobName, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-deleteBlob", options);\n try {\n let blobClient = this.getBlobClient(blobName);\n if (options.versionId) {\n blobClient = blobClient.withVersion(options.versionId);\n }\n return await blobClient.delete(updatedOptions);\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * listBlobFlatSegment returns a single segment of blobs starting from the\n * specified Marker. Use an empty Marker to start enumeration from the beginning.\n * After getting a segment, process it, and then call listBlobsFlatSegment again\n * (passing the the previously-returned Marker) to get the next segment.\n * @see https://docs.microsoft.com/rest/api/storageservices/list-blobs\n *\n * @param marker - A string value that identifies the portion of the list to be returned with the next list operation.\n * @param options - Options to Container List Blob Flat Segment operation.\n */\n async listBlobFlatSegment(marker, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-listBlobFlatSegment", options);\n try {\n const response = await this.containerContext.listBlobFlatSegment(Object.assign(Object.assign({ marker }, options), convertTracingToRequestOptionsBase(updatedOptions)));\n const wrappedResponse = Object.assign(Object.assign({}, response), { _response: Object.assign(Object.assign({}, response._response), { parsedBody: ConvertInternalResponseOfListBlobFlat(response._response.parsedBody) }), segment: Object.assign(Object.assign({}, response.segment), { blobItems: response.segment.blobItems.map((blobItemInteral) => {\n const blobItem = Object.assign(Object.assign({}, blobItemInteral), { name: BlobNameToString(blobItemInteral.name), tags: toTags(blobItemInteral.blobTags), objectReplicationSourceProperties: parseObjectReplicationRecord(blobItemInteral.objectReplicationMetadata) });\n return blobItem;\n }) }) });\n return wrappedResponse;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * listBlobHierarchySegment returns a single segment of blobs starting from\n * the specified Marker. Use an empty Marker to start enumeration from the\n * beginning. After getting a segment, process it, and then call listBlobsHierarchicalSegment\n * again (passing the the previously-returned Marker) to get the next segment.\n * @see https://docs.microsoft.com/rest/api/storageservices/list-blobs\n *\n * @param delimiter - The character or string used to define the virtual hierarchy\n * @param marker - A string value that identifies the portion of the list to be returned with the next list operation.\n * @param options - Options to Container List Blob Hierarchy Segment operation.\n */\n async listBlobHierarchySegment(delimiter, marker, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-listBlobHierarchySegment", options);\n try {\n const response = await this.containerContext.listBlobHierarchySegment(delimiter, Object.assign(Object.assign({ marker }, options), convertTracingToRequestOptionsBase(updatedOptions)));\n const wrappedResponse = Object.assign(Object.assign({}, response), { _response: Object.assign(Object.assign({}, response._response), { parsedBody: ConvertInternalResponseOfListBlobHierarchy(response._response.parsedBody) }), segment: Object.assign(Object.assign({}, response.segment), { blobItems: response.segment.blobItems.map((blobItemInteral) => {\n const blobItem = Object.assign(Object.assign({}, blobItemInteral), { name: BlobNameToString(blobItemInteral.name), tags: toTags(blobItemInteral.blobTags), objectReplicationSourceProperties: parseObjectReplicationRecord(blobItemInteral.objectReplicationMetadata) });\n return blobItem;\n }), blobPrefixes: (_a = response.segment.blobPrefixes) === null || _a === void 0 ? void 0 : _a.map((blobPrefixInternal) => {\n const blobPrefix = Object.assign(Object.assign({}, blobPrefixInternal), { name: BlobNameToString(blobPrefixInternal.name) });\n return blobPrefix;\n }) }) });\n return wrappedResponse;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns an AsyncIterableIterator for ContainerListBlobFlatSegmentResponse\n *\n * @param marker - A string value that identifies the portion of\n * the list of blobs to be returned with the next listing operation. The\n * operation returns the ContinuationToken value within the response body if the\n * listing operation did not return all blobs remaining to be listed\n * with the current page. The ContinuationToken value can be used as the value for\n * the marker parameter in a subsequent call to request the next page of list\n * items. The marker value is opaque to the client.\n * @param options - Options to list blobs operation.\n */\n listSegments(marker, options = {}) {\n return tslib_es6_asyncGenerator(this, arguments, function* listSegments_1() {\n let listBlobsFlatSegmentResponse;\n if (!!marker || marker === undefined) {\n do {\n listBlobsFlatSegmentResponse = yield tslib_es6_await(this.listBlobFlatSegment(marker, options));\n marker = listBlobsFlatSegmentResponse.continuationToken;\n yield yield tslib_es6_await(yield tslib_es6_await(listBlobsFlatSegmentResponse));\n } while (marker);\n }\n });\n }\n /**\n * Returns an AsyncIterableIterator of {@link BlobItem} objects\n *\n * @param options - Options to list blobs operation.\n */\n listItems(options = {}) {\n return tslib_es6_asyncGenerator(this, arguments, function* listItems_1() {\n var e_1, _a;\n let marker;\n try {\n for (var _b = tslib_es6_asyncValues(this.listSegments(marker, options)), _c; _c = yield tslib_es6_await(_b.next()), !_c.done;) {\n const listBlobsFlatSegmentResponse = _c.value;\n yield tslib_es6_await(yield* tslib_es6_asyncDelegator(tslib_es6_asyncValues(listBlobsFlatSegmentResponse.segment.blobItems)));\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) yield tslib_es6_await(_a.call(_b));\n }\n finally { if (e_1) throw e_1.error; }\n }\n });\n }\n /**\n * Returns an async iterable iterator to list all the blobs\n * under the specified account.\n *\n * .byPage() returns an async iterable iterator to list the blobs in pages.\n *\n * Example using `for await` syntax:\n *\n * ```js\n * // Get the containerClient before you run these snippets,\n * // Can be obtained from `blobServiceClient.getContainerClient("");`\n * let i = 1;\n * for await (const blob of containerClient.listBlobsFlat()) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n * ```\n *\n * Example using `iter.next()`:\n *\n * ```js\n * let i = 1;\n * let iter = containerClient.listBlobsFlat();\n * let blobItem = await iter.next();\n * while (!blobItem.done) {\n * console.log(`Blob ${i++}: ${blobItem.value.name}`);\n * blobItem = await iter.next();\n * }\n * ```\n *\n * Example using `byPage()`:\n *\n * ```js\n * // passing optional maxPageSize in the page settings\n * let i = 1;\n * for await (const response of containerClient.listBlobsFlat().byPage({ maxPageSize: 20 })) {\n * for (const blob of response.segment.blobItems) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n * }\n * ```\n *\n * Example using paging with a marker:\n *\n * ```js\n * let i = 1;\n * let iterator = containerClient.listBlobsFlat().byPage({ maxPageSize: 2 });\n * let response = (await iterator.next()).value;\n *\n * // Prints 2 blob names\n * for (const blob of response.segment.blobItems) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n *\n * // Gets next marker\n * let marker = response.continuationToken;\n *\n * // Passing next marker as continuationToken\n *\n * iterator = containerClient.listBlobsFlat().byPage({ continuationToken: marker, maxPageSize: 10 });\n * response = (await iterator.next()).value;\n *\n * // Prints 10 blob names\n * for (const blob of response.segment.blobItems) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n * ```\n *\n * @param options - Options to list blobs.\n * @returns An asyncIterableIterator that supports paging.\n */\n listBlobsFlat(options = {}) {\n const include = [];\n if (options.includeCopy) {\n include.push("copy");\n }\n if (options.includeDeleted) {\n include.push("deleted");\n }\n if (options.includeMetadata) {\n include.push("metadata");\n }\n if (options.includeSnapshots) {\n include.push("snapshots");\n }\n if (options.includeVersions) {\n include.push("versions");\n }\n if (options.includeUncommitedBlobs) {\n include.push("uncommittedblobs");\n }\n if (options.includeTags) {\n include.push("tags");\n }\n if (options.includeDeletedWithVersions) {\n include.push("deletedwithversions");\n }\n if (options.includeImmutabilityPolicy) {\n include.push("immutabilitypolicy");\n }\n if (options.includeLegalHold) {\n include.push("legalhold");\n }\n if (options.prefix === "") {\n options.prefix = undefined;\n }\n const updatedOptions = Object.assign(Object.assign({}, options), (include.length > 0 ? { include: include } : {}));\n // AsyncIterableIterator to iterate over blobs\n const iter = this.listItems(updatedOptions);\n return {\n /**\n * The next method, part of the iteration protocol\n */\n next() {\n return iter.next();\n },\n /**\n * The connection to the async iterator, part of the iteration protocol\n */\n [Symbol.asyncIterator]() {\n return this;\n },\n /**\n * Return an AsyncIterableIterator that works a page at a time\n */\n byPage: (settings = {}) => {\n return this.listSegments(settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, updatedOptions));\n },\n };\n }\n /**\n * Returns an AsyncIterableIterator for ContainerListBlobHierarchySegmentResponse\n *\n * @param delimiter - The character or string used to define the virtual hierarchy\n * @param marker - A string value that identifies the portion of\n * the list of blobs to be returned with the next listing operation. The\n * operation returns the ContinuationToken value within the response body if the\n * listing operation did not return all blobs remaining to be listed\n * with the current page. The ContinuationToken value can be used as the value for\n * the marker parameter in a subsequent call to request the next page of list\n * items. The marker value is opaque to the client.\n * @param options - Options to list blobs operation.\n */\n listHierarchySegments(delimiter, marker, options = {}) {\n return tslib_es6_asyncGenerator(this, arguments, function* listHierarchySegments_1() {\n let listBlobsHierarchySegmentResponse;\n if (!!marker || marker === undefined) {\n do {\n listBlobsHierarchySegmentResponse = yield tslib_es6_await(this.listBlobHierarchySegment(delimiter, marker, options));\n marker = listBlobsHierarchySegmentResponse.continuationToken;\n yield yield tslib_es6_await(yield tslib_es6_await(listBlobsHierarchySegmentResponse));\n } while (marker);\n }\n });\n }\n /**\n * Returns an AsyncIterableIterator for {@link BlobPrefix} and {@link BlobItem} objects.\n *\n * @param delimiter - The character or string used to define the virtual hierarchy\n * @param options - Options to list blobs operation.\n */\n listItemsByHierarchy(delimiter, options = {}) {\n return tslib_es6_asyncGenerator(this, arguments, function* listItemsByHierarchy_1() {\n var e_2, _a;\n let marker;\n try {\n for (var _b = tslib_es6_asyncValues(this.listHierarchySegments(delimiter, marker, options)), _c; _c = yield tslib_es6_await(_b.next()), !_c.done;) {\n const listBlobsHierarchySegmentResponse = _c.value;\n const segment = listBlobsHierarchySegmentResponse.segment;\n if (segment.blobPrefixes) {\n for (const prefix of segment.blobPrefixes) {\n yield yield tslib_es6_await(Object.assign({ kind: "prefix" }, prefix));\n }\n }\n for (const blob of segment.blobItems) {\n yield yield tslib_es6_await(Object.assign({ kind: "blob" }, blob));\n }\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) yield tslib_es6_await(_a.call(_b));\n }\n finally { if (e_2) throw e_2.error; }\n }\n });\n }\n /**\n * Returns an async iterable iterator to list all the blobs by hierarchy.\n * under the specified account.\n *\n * .byPage() returns an async iterable iterator to list the blobs by hierarchy in pages.\n *\n * Example using `for await` syntax:\n *\n * ```js\n * for await (const item of containerClient.listBlobsByHierarchy("/")) {\n * if (item.kind === "prefix") {\n * console.log(`\\tBlobPrefix: ${item.name}`);\n * } else {\n * console.log(`\\tBlobItem: name - ${item.name}`);\n * }\n * }\n * ```\n *\n * Example using `iter.next()`:\n *\n * ```js\n * let iter = containerClient.listBlobsByHierarchy("/", { prefix: "prefix1/" });\n * let entity = await iter.next();\n * while (!entity.done) {\n * let item = entity.value;\n * if (item.kind === "prefix") {\n * console.log(`\\tBlobPrefix: ${item.name}`);\n * } else {\n * console.log(`\\tBlobItem: name - ${item.name}`);\n * }\n * entity = await iter.next();\n * }\n * ```\n *\n * Example using `byPage()`:\n *\n * ```js\n * console.log("Listing blobs by hierarchy by page");\n * for await (const response of containerClient.listBlobsByHierarchy("/").byPage()) {\n * const segment = response.segment;\n * if (segment.blobPrefixes) {\n * for (const prefix of segment.blobPrefixes) {\n * console.log(`\\tBlobPrefix: ${prefix.name}`);\n * }\n * }\n * for (const blob of response.segment.blobItems) {\n * console.log(`\\tBlobItem: name - ${blob.name}`);\n * }\n * }\n * ```\n *\n * Example using paging with a max page size:\n *\n * ```js\n * console.log("Listing blobs by hierarchy by page, specifying a prefix and a max page size");\n *\n * let i = 1;\n * for await (const response of containerClient\n * .listBlobsByHierarchy("/", { prefix: "prefix2/sub1/" })\n * .byPage({ maxPageSize: 2 })) {\n * console.log(`Page ${i++}`);\n * const segment = response.segment;\n *\n * if (segment.blobPrefixes) {\n * for (const prefix of segment.blobPrefixes) {\n * console.log(`\\tBlobPrefix: ${prefix.name}`);\n * }\n * }\n *\n * for (const blob of response.segment.blobItems) {\n * console.log(`\\tBlobItem: name - ${blob.name}`);\n * }\n * }\n * ```\n *\n * @param delimiter - The character or string used to define the virtual hierarchy\n * @param options - Options to list blobs operation.\n */\n listBlobsByHierarchy(delimiter, options = {}) {\n if (delimiter === "") {\n throw new RangeError("delimiter should contain one or more characters");\n }\n const include = [];\n if (options.includeCopy) {\n include.push("copy");\n }\n if (options.includeDeleted) {\n include.push("deleted");\n }\n if (options.includeMetadata) {\n include.push("metadata");\n }\n if (options.includeSnapshots) {\n include.push("snapshots");\n }\n if (options.includeVersions) {\n include.push("versions");\n }\n if (options.includeUncommitedBlobs) {\n include.push("uncommittedblobs");\n }\n if (options.includeTags) {\n include.push("tags");\n }\n if (options.includeDeletedWithVersions) {\n include.push("deletedwithversions");\n }\n if (options.includeImmutabilityPolicy) {\n include.push("immutabilitypolicy");\n }\n if (options.includeLegalHold) {\n include.push("legalhold");\n }\n if (options.prefix === "") {\n options.prefix = undefined;\n }\n const updatedOptions = Object.assign(Object.assign({}, options), (include.length > 0 ? { include: include } : {}));\n // AsyncIterableIterator to iterate over blob prefixes and blobs\n const iter = this.listItemsByHierarchy(delimiter, updatedOptions);\n return {\n /**\n * The next method, part of the iteration protocol\n */\n async next() {\n return iter.next();\n },\n /**\n * The connection to the async iterator, part of the iteration protocol\n */\n [Symbol.asyncIterator]() {\n return this;\n },\n /**\n * Return an AsyncIterableIterator that works a page at a time\n */\n byPage: (settings = {}) => {\n return this.listHierarchySegments(delimiter, settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, updatedOptions));\n },\n };\n }\n /**\n * The Filter Blobs operation enables callers to list blobs in the container whose tags\n * match a given search expression.\n *\n * @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.\n * The given expression must evaluate to true for a blob to be returned in the results.\n * The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;\n * however, only a subset of the OData filter syntax is supported in the Blob service.\n * @param marker - A string value that identifies the portion of\n * the list of blobs to be returned with the next listing operation. The\n * operation returns the continuationToken value within the response body if the\n * listing operation did not return all blobs remaining to be listed\n * with the current page. The continuationToken value can be used as the value for\n * the marker parameter in a subsequent call to request the next page of list\n * items. The marker value is opaque to the client.\n * @param options - Options to find blobs by tags.\n */\n async findBlobsByTagsSegment(tagFilterSqlExpression, marker, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-findBlobsByTagsSegment", options);\n try {\n const response = await this.containerContext.filterBlobs(Object.assign({ abortSignal: options.abortSignal, where: tagFilterSqlExpression, marker, maxPageSize: options.maxPageSize }, convertTracingToRequestOptionsBase(updatedOptions)));\n const wrappedResponse = Object.assign(Object.assign({}, response), { _response: response._response, blobs: response.blobs.map((blob) => {\n var _a;\n let tagValue = "";\n if (((_a = blob.tags) === null || _a === void 0 ? void 0 : _a.blobTagSet.length) === 1) {\n tagValue = blob.tags.blobTagSet[0].value;\n }\n return Object.assign(Object.assign({}, blob), { tags: toTags(blob.tags), tagValue });\n }) });\n return wrappedResponse;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns an AsyncIterableIterator for ContainerFindBlobsByTagsSegmentResponse.\n *\n * @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.\n * The given expression must evaluate to true for a blob to be returned in the results.\n * The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;\n * however, only a subset of the OData filter syntax is supported in the Blob service.\n * @param marker - A string value that identifies the portion of\n * the list of blobs to be returned with the next listing operation. The\n * operation returns the continuationToken value within the response body if the\n * listing operation did not return all blobs remaining to be listed\n * with the current page. The continuationToken value can be used as the value for\n * the marker parameter in a subsequent call to request the next page of list\n * items. The marker value is opaque to the client.\n * @param options - Options to find blobs by tags.\n */\n findBlobsByTagsSegments(tagFilterSqlExpression, marker, options = {}) {\n return tslib_es6_asyncGenerator(this, arguments, function* findBlobsByTagsSegments_1() {\n let response;\n if (!!marker || marker === undefined) {\n do {\n response = yield tslib_es6_await(this.findBlobsByTagsSegment(tagFilterSqlExpression, marker, options));\n response.blobs = response.blobs || [];\n marker = response.continuationToken;\n yield yield tslib_es6_await(response);\n } while (marker);\n }\n });\n }\n /**\n * Returns an AsyncIterableIterator for blobs.\n *\n * @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.\n * The given expression must evaluate to true for a blob to be returned in the results.\n * The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;\n * however, only a subset of the OData filter syntax is supported in the Blob service.\n * @param options - Options to findBlobsByTagsItems.\n */\n findBlobsByTagsItems(tagFilterSqlExpression, options = {}) {\n return tslib_es6_asyncGenerator(this, arguments, function* findBlobsByTagsItems_1() {\n var e_3, _a;\n let marker;\n try {\n for (var _b = tslib_es6_asyncValues(this.findBlobsByTagsSegments(tagFilterSqlExpression, marker, options)), _c; _c = yield tslib_es6_await(_b.next()), !_c.done;) {\n const segment = _c.value;\n yield tslib_es6_await(yield* tslib_es6_asyncDelegator(tslib_es6_asyncValues(segment.blobs)));\n }\n }\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) yield tslib_es6_await(_a.call(_b));\n }\n finally { if (e_3) throw e_3.error; }\n }\n });\n }\n /**\n * Returns an async iterable iterator to find all blobs with specified tag\n * under the specified container.\n *\n * .byPage() returns an async iterable iterator to list the blobs in pages.\n *\n * Example using `for await` syntax:\n *\n * ```js\n * let i = 1;\n * for await (const blob of containerClient.findBlobsByTags("tagkey=\'tagvalue\'")) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n * ```\n *\n * Example using `iter.next()`:\n *\n * ```js\n * let i = 1;\n * const iter = containerClient.findBlobsByTags("tagkey=\'tagvalue\'");\n * let blobItem = await iter.next();\n * while (!blobItem.done) {\n * console.log(`Blob ${i++}: ${blobItem.value.name}`);\n * blobItem = await iter.next();\n * }\n * ```\n *\n * Example using `byPage()`:\n *\n * ```js\n * // passing optional maxPageSize in the page settings\n * let i = 1;\n * for await (const response of containerClient.findBlobsByTags("tagkey=\'tagvalue\'").byPage({ maxPageSize: 20 })) {\n * if (response.blobs) {\n * for (const blob of response.blobs) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n * }\n * }\n * ```\n *\n * Example using paging with a marker:\n *\n * ```js\n * let i = 1;\n * let iterator = containerClient.findBlobsByTags("tagkey=\'tagvalue\'").byPage({ maxPageSize: 2 });\n * let response = (await iterator.next()).value;\n *\n * // Prints 2 blob names\n * if (response.blobs) {\n * for (const blob of response.blobs) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n * }\n *\n * // Gets next marker\n * let marker = response.continuationToken;\n * // Passing next marker as continuationToken\n * iterator = containerClient\n * .findBlobsByTags("tagkey=\'tagvalue\'")\n * .byPage({ continuationToken: marker, maxPageSize: 10 });\n * response = (await iterator.next()).value;\n *\n * // Prints blob names\n * if (response.blobs) {\n * for (const blob of response.blobs) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n * }\n * ```\n *\n * @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.\n * The given expression must evaluate to true for a blob to be returned in the results.\n * The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;\n * however, only a subset of the OData filter syntax is supported in the Blob service.\n * @param options - Options to find blobs by tags.\n */\n findBlobsByTags(tagFilterSqlExpression, options = {}) {\n // AsyncIterableIterator to iterate over blobs\n const listSegmentOptions = Object.assign({}, options);\n const iter = this.findBlobsByTagsItems(tagFilterSqlExpression, listSegmentOptions);\n return {\n /**\n * The next method, part of the iteration protocol\n */\n next() {\n return iter.next();\n },\n /**\n * The connection to the async iterator, part of the iteration protocol\n */\n [Symbol.asyncIterator]() {\n return this;\n },\n /**\n * Return an AsyncIterableIterator that works a page at a time\n */\n byPage: (settings = {}) => {\n return this.findBlobsByTagsSegments(tagFilterSqlExpression, settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, listSegmentOptions));\n },\n };\n }\n getContainerNameFromUrl() {\n let containerName;\n try {\n // URL may look like the following\n // "https://myaccount.blob.core.windows.net/mycontainer?sasString";\n // "https://myaccount.blob.core.windows.net/mycontainer";\n // IPv4/IPv6 address hosts, Endpoints - `http://127.0.0.1:10000/devstoreaccount1/containername`\n // http://localhost:10001/devstoreaccount1/containername\n const parsedUrl = URLBuilder.parse(this.url);\n if (parsedUrl.getHost().split(".")[1] === "blob") {\n // "https://myaccount.blob.core.windows.net/containername".\n // "https://customdomain.com/containername".\n // .getPath() -> /containername\n containerName = parsedUrl.getPath().split("/")[1];\n }\n else if (isIpEndpointStyle(parsedUrl)) {\n // IPv4/IPv6 address hosts... Example - http://192.0.0.10:10001/devstoreaccount1/containername\n // Single word domain without a [dot] in the endpoint... Example - http://localhost:10001/devstoreaccount1/containername\n // .getPath() -> /devstoreaccount1/containername\n containerName = parsedUrl.getPath().split("/")[2];\n }\n else {\n // "https://customdomain.com/containername".\n // .getPath() -> /containername\n containerName = parsedUrl.getPath().split("/")[1];\n }\n // decode the encoded containerName - to get all the special characters that might be present in it\n containerName = decodeURIComponent(containerName);\n if (!containerName) {\n throw new Error("Provided containerName is invalid.");\n }\n return containerName;\n }\n catch (error) {\n throw new Error("Unable to extract containerName with provided information.");\n }\n }\n /**\n * Only available for ContainerClient constructed with a shared key credential.\n *\n * Generates a Blob Container Service Shared Access Signature (SAS) URI based on the client properties\n * and parameters passed in. The SAS is signed by the shared key credential of the client.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas\n *\n * @param options - Optional parameters.\n * @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.\n */\n generateSasUrl(options) {\n return new Promise((resolve) => {\n if (!(this.credential instanceof StorageSharedKeyCredential)) {\n throw new RangeError("Can only generate the SAS when the client is initialized with a shared key credential");\n }\n const sas = generateBlobSASQueryParameters(Object.assign({ containerName: this._containerName }, options), this.credential).toString();\n resolve(appendToURLQuery(this.url, sas));\n });\n }\n /**\n * Creates a BlobBatchClient object to conduct batch operations.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/blob-batch\n *\n * @returns A new BlobBatchClient object for this container.\n */\n getBlobBatchClient() {\n return new BlobBatchClient(this.url, this.pipeline);\n }\n}\n//# sourceMappingURL=ContainerClient.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/sas/AccountSASPermissions.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * This is a helper class to construct a string representing the permissions granted by an AccountSAS. Setting a value\n * to true means that any SAS which uses these permissions will grant permissions for that operation. Once all the\n * values are set, this should be serialized with toString and set as the permissions field on an\n * {@link AccountSASSignatureValues} object. It is possible to construct the permissions string without this class, but\n * the order of the permissions is particular and this class guarantees correctness.\n */\nclass AccountSASPermissions {\n constructor() {\n /**\n * Permission to read resources and list queues and tables granted.\n */\n this.read = false;\n /**\n * Permission to write resources granted.\n */\n this.write = false;\n /**\n * Permission to create blobs and files granted.\n */\n this.delete = false;\n /**\n * Permission to delete versions granted.\n */\n this.deleteVersion = false;\n /**\n * Permission to list blob containers, blobs, shares, directories, and files granted.\n */\n this.list = false;\n /**\n * Permission to add messages, table entities, and append to blobs granted.\n */\n this.add = false;\n /**\n * Permission to create blobs and files granted.\n */\n this.create = false;\n /**\n * Permissions to update messages and table entities granted.\n */\n this.update = false;\n /**\n * Permission to get and delete messages granted.\n */\n this.process = false;\n /**\n * Specfies Tag access granted.\n */\n this.tag = false;\n /**\n * Permission to filter blobs.\n */\n this.filter = false;\n /**\n * Permission to set immutability policy.\n */\n this.setImmutabilityPolicy = false;\n /**\n * Specifies that Permanent Delete is permitted.\n */\n this.permanentDelete = false;\n }\n /**\n * Parse initializes the AccountSASPermissions fields from a string.\n *\n * @param permissions -\n */\n static parse(permissions) {\n const accountSASPermissions = new AccountSASPermissions();\n for (const c of permissions) {\n switch (c) {\n case "r":\n accountSASPermissions.read = true;\n break;\n case "w":\n accountSASPermissions.write = true;\n break;\n case "d":\n accountSASPermissions.delete = true;\n break;\n case "x":\n accountSASPermissions.deleteVersion = true;\n break;\n case "l":\n accountSASPermissions.list = true;\n break;\n case "a":\n accountSASPermissions.add = true;\n break;\n case "c":\n accountSASPermissions.create = true;\n break;\n case "u":\n accountSASPermissions.update = true;\n break;\n case "p":\n accountSASPermissions.process = true;\n break;\n case "t":\n accountSASPermissions.tag = true;\n break;\n case "f":\n accountSASPermissions.filter = true;\n break;\n case "i":\n accountSASPermissions.setImmutabilityPolicy = true;\n break;\n case "y":\n accountSASPermissions.permanentDelete = true;\n break;\n default:\n throw new RangeError(`Invalid permission character: ${c}`);\n }\n }\n return accountSASPermissions;\n }\n /**\n * Creates a {@link AccountSASPermissions} from a raw object which contains same keys as it\n * and boolean values for them.\n *\n * @param permissionLike -\n */\n static from(permissionLike) {\n const accountSASPermissions = new AccountSASPermissions();\n if (permissionLike.read) {\n accountSASPermissions.read = true;\n }\n if (permissionLike.write) {\n accountSASPermissions.write = true;\n }\n if (permissionLike.delete) {\n accountSASPermissions.delete = true;\n }\n if (permissionLike.deleteVersion) {\n accountSASPermissions.deleteVersion = true;\n }\n if (permissionLike.filter) {\n accountSASPermissions.filter = true;\n }\n if (permissionLike.tag) {\n accountSASPermissions.tag = true;\n }\n if (permissionLike.list) {\n accountSASPermissions.list = true;\n }\n if (permissionLike.add) {\n accountSASPermissions.add = true;\n }\n if (permissionLike.create) {\n accountSASPermissions.create = true;\n }\n if (permissionLike.update) {\n accountSASPermissions.update = true;\n }\n if (permissionLike.process) {\n accountSASPermissions.process = true;\n }\n if (permissionLike.setImmutabilityPolicy) {\n accountSASPermissions.setImmutabilityPolicy = true;\n }\n if (permissionLike.permanentDelete) {\n accountSASPermissions.permanentDelete = true;\n }\n return accountSASPermissions;\n }\n /**\n * Produces the SAS permissions string for an Azure Storage account.\n * Call this method to set AccountSASSignatureValues Permissions field.\n *\n * Using this method will guarantee the resource types are in\n * an order accepted by the service.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-an-account-sas\n *\n */\n toString() {\n // The order of the characters should be as specified here to ensure correctness:\n // https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-an-account-sas\n // Use a string array instead of string concatenating += operator for performance\n const permissions = [];\n if (this.read) {\n permissions.push("r");\n }\n if (this.write) {\n permissions.push("w");\n }\n if (this.delete) {\n permissions.push("d");\n }\n if (this.deleteVersion) {\n permissions.push("x");\n }\n if (this.filter) {\n permissions.push("f");\n }\n if (this.tag) {\n permissions.push("t");\n }\n if (this.list) {\n permissions.push("l");\n }\n if (this.add) {\n permissions.push("a");\n }\n if (this.create) {\n permissions.push("c");\n }\n if (this.update) {\n permissions.push("u");\n }\n if (this.process) {\n permissions.push("p");\n }\n if (this.setImmutabilityPolicy) {\n permissions.push("i");\n }\n if (this.permanentDelete) {\n permissions.push("y");\n }\n return permissions.join("");\n }\n}\n//# sourceMappingURL=AccountSASPermissions.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/sas/AccountSASResourceTypes.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * This is a helper class to construct a string representing the resources accessible by an AccountSAS. Setting a value\n * to true means that any SAS which uses these permissions will grant access to that resource type. Once all the\n * values are set, this should be serialized with toString and set as the resources field on an\n * {@link AccountSASSignatureValues} object. It is possible to construct the resources string without this class, but\n * the order of the resources is particular and this class guarantees correctness.\n */\nclass AccountSASResourceTypes {\n constructor() {\n /**\n * Permission to access service level APIs granted.\n */\n this.service = false;\n /**\n * Permission to access container level APIs (Blob Containers, Tables, Queues, File Shares) granted.\n */\n this.container = false;\n /**\n * Permission to access object level APIs (Blobs, Table Entities, Queue Messages, Files) granted.\n */\n this.object = false;\n }\n /**\n * Creates an {@link AccountSASResourceTypes} from the specified resource types string. This method will throw an\n * Error if it encounters a character that does not correspond to a valid resource type.\n *\n * @param resourceTypes -\n */\n static parse(resourceTypes) {\n const accountSASResourceTypes = new AccountSASResourceTypes();\n for (const c of resourceTypes) {\n switch (c) {\n case "s":\n accountSASResourceTypes.service = true;\n break;\n case "c":\n accountSASResourceTypes.container = true;\n break;\n case "o":\n accountSASResourceTypes.object = true;\n break;\n default:\n throw new RangeError(`Invalid resource type: ${c}`);\n }\n }\n return accountSASResourceTypes;\n }\n /**\n * Converts the given resource types to a string.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-an-account-sas\n *\n */\n toString() {\n const resourceTypes = [];\n if (this.service) {\n resourceTypes.push("s");\n }\n if (this.container) {\n resourceTypes.push("c");\n }\n if (this.object) {\n resourceTypes.push("o");\n }\n return resourceTypes.join("");\n }\n}\n//# sourceMappingURL=AccountSASResourceTypes.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/sas/AccountSASServices.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * This is a helper class to construct a string representing the services accessible by an AccountSAS. Setting a value\n * to true means that any SAS which uses these permissions will grant access to that service. Once all the\n * values are set, this should be serialized with toString and set as the services field on an\n * {@link AccountSASSignatureValues} object. It is possible to construct the services string without this class, but\n * the order of the services is particular and this class guarantees correctness.\n */\nclass AccountSASServices {\n constructor() {\n /**\n * Permission to access blob resources granted.\n */\n this.blob = false;\n /**\n * Permission to access file resources granted.\n */\n this.file = false;\n /**\n * Permission to access queue resources granted.\n */\n this.queue = false;\n /**\n * Permission to access table resources granted.\n */\n this.table = false;\n }\n /**\n * Creates an {@link AccountSASServices} from the specified services string. This method will throw an\n * Error if it encounters a character that does not correspond to a valid service.\n *\n * @param services -\n */\n static parse(services) {\n const accountSASServices = new AccountSASServices();\n for (const c of services) {\n switch (c) {\n case "b":\n accountSASServices.blob = true;\n break;\n case "f":\n accountSASServices.file = true;\n break;\n case "q":\n accountSASServices.queue = true;\n break;\n case "t":\n accountSASServices.table = true;\n break;\n default:\n throw new RangeError(`Invalid service character: ${c}`);\n }\n }\n return accountSASServices;\n }\n /**\n * Converts the given services to a string.\n *\n */\n toString() {\n const services = [];\n if (this.blob) {\n services.push("b");\n }\n if (this.table) {\n services.push("t");\n }\n if (this.queue) {\n services.push("q");\n }\n if (this.file) {\n services.push("f");\n }\n return services.join("");\n }\n}\n//# sourceMappingURL=AccountSASServices.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/sas/AccountSASSignatureValues.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * Generates a {@link SASQueryParameters} object which contains all SAS query parameters needed to make an actual\n * REST request.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-an-account-sas\n *\n * @param accountSASSignatureValues -\n * @param sharedKeyCredential -\n */\nfunction generateAccountSASQueryParameters(accountSASSignatureValues, sharedKeyCredential) {\n const version = accountSASSignatureValues.version\n ? accountSASSignatureValues.version\n : SERVICE_VERSION;\n if (accountSASSignatureValues.permissions &&\n accountSASSignatureValues.permissions.setImmutabilityPolicy &&\n version < "2020-08-04") {\n throw RangeError("\'version\' must be >= \'2020-08-04\' when provided \'i\' permission.");\n }\n if (accountSASSignatureValues.permissions &&\n accountSASSignatureValues.permissions.deleteVersion &&\n version < "2019-10-10") {\n throw RangeError("\'version\' must be >= \'2019-10-10\' when provided \'x\' permission.");\n }\n if (accountSASSignatureValues.permissions &&\n accountSASSignatureValues.permissions.permanentDelete &&\n version < "2019-10-10") {\n throw RangeError("\'version\' must be >= \'2019-10-10\' when provided \'y\' permission.");\n }\n if (accountSASSignatureValues.permissions &&\n accountSASSignatureValues.permissions.tag &&\n version < "2019-12-12") {\n throw RangeError("\'version\' must be >= \'2019-12-12\' when provided \'t\' permission.");\n }\n if (accountSASSignatureValues.permissions &&\n accountSASSignatureValues.permissions.filter &&\n version < "2019-12-12") {\n throw RangeError("\'version\' must be >= \'2019-12-12\' when provided \'f\' permission.");\n }\n if (accountSASSignatureValues.encryptionScope && version < "2020-12-06") {\n throw RangeError("\'version\' must be >= \'2020-12-06\' when provided \'encryptionScope\' in SAS.");\n }\n const parsedPermissions = AccountSASPermissions.parse(accountSASSignatureValues.permissions.toString());\n const parsedServices = AccountSASServices.parse(accountSASSignatureValues.services).toString();\n const parsedResourceTypes = AccountSASResourceTypes.parse(accountSASSignatureValues.resourceTypes).toString();\n let stringToSign;\n if (version >= "2020-12-06") {\n stringToSign = [\n sharedKeyCredential.accountName,\n parsedPermissions,\n parsedServices,\n parsedResourceTypes,\n accountSASSignatureValues.startsOn\n ? truncatedISO8061Date(accountSASSignatureValues.startsOn, false)\n : "",\n truncatedISO8061Date(accountSASSignatureValues.expiresOn, false),\n accountSASSignatureValues.ipRange ? ipRangeToString(accountSASSignatureValues.ipRange) : "",\n accountSASSignatureValues.protocol ? accountSASSignatureValues.protocol : "",\n version,\n accountSASSignatureValues.encryptionScope ? accountSASSignatureValues.encryptionScope : "",\n "", // Account SAS requires an additional newline character\n ].join("\\n");\n }\n else {\n stringToSign = [\n sharedKeyCredential.accountName,\n parsedPermissions,\n parsedServices,\n parsedResourceTypes,\n accountSASSignatureValues.startsOn\n ? truncatedISO8061Date(accountSASSignatureValues.startsOn, false)\n : "",\n truncatedISO8061Date(accountSASSignatureValues.expiresOn, false),\n accountSASSignatureValues.ipRange ? ipRangeToString(accountSASSignatureValues.ipRange) : "",\n accountSASSignatureValues.protocol ? accountSASSignatureValues.protocol : "",\n version,\n "", // Account SAS requires an additional newline character\n ].join("\\n");\n }\n const signature = sharedKeyCredential.computeHMACSHA256(stringToSign);\n return new SASQueryParameters(version, signature, parsedPermissions.toString(), parsedServices, parsedResourceTypes, accountSASSignatureValues.protocol, accountSASSignatureValues.startsOn, accountSASSignatureValues.expiresOn, accountSASSignatureValues.ipRange, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, accountSASSignatureValues.encryptionScope);\n}\n//# sourceMappingURL=AccountSASSignatureValues.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/BlobServiceClient.js\n\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * A BlobServiceClient represents a Client to the Azure Storage Blob service allowing you\n * to manipulate blob containers.\n */\nclass BlobServiceClient extends StorageClient {\n constructor(url, credentialOrPipeline, \n // Legacy, no fix for eslint error without breaking. Disable it for this interface.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/\n options) {\n let pipeline;\n if (isPipelineLike(credentialOrPipeline)) {\n pipeline = credentialOrPipeline;\n }\n else if ((checkEnvironment_isNode && credentialOrPipeline instanceof StorageSharedKeyCredential) ||\n credentialOrPipeline instanceof AnonymousCredential ||\n isTokenCredential(credentialOrPipeline)) {\n pipeline = newPipeline(credentialOrPipeline, options);\n }\n else {\n // The second parameter is undefined. Use anonymous credential\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n super(url, pipeline);\n this.serviceContext = new Service(this.storageClientContext);\n }\n /**\n *\n * Creates an instance of BlobServiceClient from connection string.\n *\n * @param connectionString - Account connection string or a SAS connection string of an Azure storage account.\n * [ Note - Account connection string can only be used in NODE.JS runtime. ]\n * Account connection string example -\n * `DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=accountKey;EndpointSuffix=core.windows.net`\n * SAS connection string example -\n * `BlobEndpoint=https://myaccount.blob.core.windows.net/;QueueEndpoint=https://myaccount.queue.core.windows.net/;FileEndpoint=https://myaccount.file.core.windows.net/;TableEndpoint=https://myaccount.table.core.windows.net/;SharedAccessSignature=sasString`\n * @param options - Optional. Options to configure the HTTP pipeline.\n */\n static fromConnectionString(connectionString, \n // Legacy, no fix for eslint error without breaking. Disable it for this interface.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/\n options) {\n options = options || {};\n const extractedCreds = extractConnectionStringParts(connectionString);\n if (extractedCreds.kind === "AccountConnString") {\n if (checkEnvironment_isNode) {\n const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);\n if (!options.proxyOptions) {\n options.proxyOptions = getDefaultProxySettings(extractedCreds.proxyUri);\n }\n const pipeline = newPipeline(sharedKeyCredential, options);\n return new BlobServiceClient(extractedCreds.url, pipeline);\n }\n else {\n throw new Error("Account connection string is only supported in Node.js environment");\n }\n }\n else if (extractedCreds.kind === "SASConnString") {\n const pipeline = newPipeline(new AnonymousCredential(), options);\n return new BlobServiceClient(extractedCreds.url + "?" + extractedCreds.accountSas, pipeline);\n }\n else {\n throw new Error("Connection string must be either an Account connection string or a SAS connection string");\n }\n }\n /**\n * Creates a {@link ContainerClient} object\n *\n * @param containerName - A container name\n * @returns A new ContainerClient object for the given container name.\n *\n * Example usage:\n *\n * ```js\n * const containerClient = blobServiceClient.getContainerClient("");\n * ```\n */\n getContainerClient(containerName) {\n return new ContainerClient(appendToURLPath(this.url, encodeURIComponent(containerName)), this.pipeline);\n }\n /**\n * Create a Blob container. @see https://docs.microsoft.com/en-us/rest/api/storageservices/create-container\n *\n * @param containerName - Name of the container to create.\n * @param options - Options to configure Container Create operation.\n * @returns Container creation response and the corresponding container client.\n */\n async createContainer(containerName, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-createContainer", options);\n try {\n const containerClient = this.getContainerClient(containerName);\n const containerCreateResponse = await containerClient.create(updatedOptions);\n return {\n containerClient,\n containerCreateResponse,\n };\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Deletes a Blob container.\n *\n * @param containerName - Name of the container to delete.\n * @param options - Options to configure Container Delete operation.\n * @returns Container deletion response.\n */\n async deleteContainer(containerName, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-deleteContainer", options);\n try {\n const containerClient = this.getContainerClient(containerName);\n return await containerClient.delete(updatedOptions);\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Restore a previously deleted Blob container.\n * This API is only functional if Container Soft Delete is enabled for the storage account associated with the container.\n *\n * @param deletedContainerName - Name of the previously deleted container.\n * @param deletedContainerVersion - Version of the previously deleted container, used to uniquely identify the deleted container.\n * @param options - Options to configure Container Restore operation.\n * @returns Container deletion response.\n */\n async undeleteContainer(deletedContainerName, deletedContainerVersion, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-undeleteContainer", options);\n try {\n const containerClient = this.getContainerClient(options.destinationContainerName || deletedContainerName);\n // Hack to access a protected member.\n const containerContext = new Container(containerClient["storageClientContext"]);\n const containerUndeleteResponse = await containerContext.restore(Object.assign({ deletedContainerName,\n deletedContainerVersion }, updatedOptions));\n return { containerClient, containerUndeleteResponse };\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Rename an existing Blob Container.\n *\n * @param sourceContainerName - The name of the source container.\n * @param destinationContainerName - The new name of the container.\n * @param options - Options to configure Container Rename operation.\n */\n /* eslint-disable-next-line @typescript-eslint/ban-ts-comment */\n // @ts-ignore Need to hide this interface for now. Make it public and turn on the live tests for it when the service is ready.\n async renameContainer(sourceContainerName, destinationContainerName, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-renameContainer", options);\n try {\n const containerClient = this.getContainerClient(destinationContainerName);\n // Hack to access a protected member.\n const containerContext = new Container(containerClient["storageClientContext"]);\n const containerRenameResponse = await containerContext.rename(sourceContainerName, Object.assign(Object.assign({}, updatedOptions), { sourceLeaseId: (_a = options.sourceCondition) === null || _a === void 0 ? void 0 : _a.leaseId }));\n return { containerClient, containerRenameResponse };\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Gets the properties of a storage account’s Blob service, including properties\n * for Storage Analytics and CORS (Cross-Origin Resource Sharing) rules.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-service-properties\n *\n * @param options - Options to the Service Get Properties operation.\n * @returns Response data for the Service Get Properties operation.\n */\n async getProperties(options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-getProperties", options);\n try {\n return await this.serviceContext.getProperties(Object.assign({ abortSignal: options.abortSignal }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Sets properties for a storage account’s Blob service endpoint, including properties\n * for Storage Analytics, CORS (Cross-Origin Resource Sharing) rules and soft delete settings.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/set-blob-service-properties\n *\n * @param properties -\n * @param options - Options to the Service Set Properties operation.\n * @returns Response data for the Service Set Properties operation.\n */\n async setProperties(properties, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-setProperties", options);\n try {\n return await this.serviceContext.setProperties(properties, Object.assign({ abortSignal: options.abortSignal }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Retrieves statistics related to replication for the Blob service. It is only\n * available on the secondary location endpoint when read-access geo-redundant\n * replication is enabled for the storage account.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-service-stats\n *\n * @param options - Options to the Service Get Statistics operation.\n * @returns Response data for the Service Get Statistics operation.\n */\n async getStatistics(options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-getStatistics", options);\n try {\n return await this.serviceContext.getStatistics(Object.assign({ abortSignal: options.abortSignal }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * The Get Account Information operation returns the sku name and account kind\n * for the specified account.\n * The Get Account Information operation is available on service versions beginning\n * with version 2018-03-28.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-account-information\n *\n * @param options - Options to the Service Get Account Info operation.\n * @returns Response data for the Service Get Account Info operation.\n */\n async getAccountInfo(options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-getAccountInfo", options);\n try {\n return await this.serviceContext.getAccountInfo(Object.assign({ abortSignal: options.abortSignal }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns a list of the containers under the specified account.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/list-containers2\n *\n * @param marker - A string value that identifies the portion of\n * the list of containers to be returned with the next listing operation. The\n * operation returns the continuationToken value within the response body if the\n * listing operation did not return all containers remaining to be listed\n * with the current page. The continuationToken value can be used as the value for\n * the marker parameter in a subsequent call to request the next page of list\n * items. The marker value is opaque to the client.\n * @param options - Options to the Service List Container Segment operation.\n * @returns Response data for the Service List Container Segment operation.\n */\n async listContainersSegment(marker, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-listContainersSegment", options);\n try {\n return await this.serviceContext.listContainersSegment(Object.assign(Object.assign(Object.assign({ abortSignal: options.abortSignal, marker }, options), { include: typeof options.include === "string" ? [options.include] : options.include }), convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * The Filter Blobs operation enables callers to list blobs across all containers whose tags\n * match a given search expression. Filter blobs searches across all containers within a\n * storage account but can be scoped within the expression to a single container.\n *\n * @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.\n * The given expression must evaluate to true for a blob to be returned in the results.\n * The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;\n * however, only a subset of the OData filter syntax is supported in the Blob service.\n * @param marker - A string value that identifies the portion of\n * the list of blobs to be returned with the next listing operation. The\n * operation returns the continuationToken value within the response body if the\n * listing operation did not return all blobs remaining to be listed\n * with the current page. The continuationToken value can be used as the value for\n * the marker parameter in a subsequent call to request the next page of list\n * items. The marker value is opaque to the client.\n * @param options - Options to find blobs by tags.\n */\n async findBlobsByTagsSegment(tagFilterSqlExpression, marker, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-findBlobsByTagsSegment", options);\n try {\n const response = await this.serviceContext.filterBlobs(Object.assign({ abortSignal: options.abortSignal, where: tagFilterSqlExpression, marker, maxPageSize: options.maxPageSize }, convertTracingToRequestOptionsBase(updatedOptions)));\n const wrappedResponse = Object.assign(Object.assign({}, response), { _response: response._response, blobs: response.blobs.map((blob) => {\n var _a;\n let tagValue = "";\n if (((_a = blob.tags) === null || _a === void 0 ? void 0 : _a.blobTagSet.length) === 1) {\n tagValue = blob.tags.blobTagSet[0].value;\n }\n return Object.assign(Object.assign({}, blob), { tags: toTags(blob.tags), tagValue });\n }) });\n return wrappedResponse;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns an AsyncIterableIterator for ServiceFindBlobsByTagsSegmentResponse.\n *\n * @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.\n * The given expression must evaluate to true for a blob to be returned in the results.\n * The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;\n * however, only a subset of the OData filter syntax is supported in the Blob service.\n * @param marker - A string value that identifies the portion of\n * the list of blobs to be returned with the next listing operation. The\n * operation returns the continuationToken value within the response body if the\n * listing operation did not return all blobs remaining to be listed\n * with the current page. The continuationToken value can be used as the value for\n * the marker parameter in a subsequent call to request the next page of list\n * items. The marker value is opaque to the client.\n * @param options - Options to find blobs by tags.\n */\n findBlobsByTagsSegments(tagFilterSqlExpression, marker, options = {}) {\n return tslib_es6_asyncGenerator(this, arguments, function* findBlobsByTagsSegments_1() {\n let response;\n if (!!marker || marker === undefined) {\n do {\n response = yield tslib_es6_await(this.findBlobsByTagsSegment(tagFilterSqlExpression, marker, options));\n response.blobs = response.blobs || [];\n marker = response.continuationToken;\n yield yield tslib_es6_await(response);\n } while (marker);\n }\n });\n }\n /**\n * Returns an AsyncIterableIterator for blobs.\n *\n * @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.\n * The given expression must evaluate to true for a blob to be returned in the results.\n * The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;\n * however, only a subset of the OData filter syntax is supported in the Blob service.\n * @param options - Options to findBlobsByTagsItems.\n */\n findBlobsByTagsItems(tagFilterSqlExpression, options = {}) {\n return tslib_es6_asyncGenerator(this, arguments, function* findBlobsByTagsItems_1() {\n var e_1, _a;\n let marker;\n try {\n for (var _b = tslib_es6_asyncValues(this.findBlobsByTagsSegments(tagFilterSqlExpression, marker, options)), _c; _c = yield tslib_es6_await(_b.next()), !_c.done;) {\n const segment = _c.value;\n yield tslib_es6_await(yield* tslib_es6_asyncDelegator(tslib_es6_asyncValues(segment.blobs)));\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) yield tslib_es6_await(_a.call(_b));\n }\n finally { if (e_1) throw e_1.error; }\n }\n });\n }\n /**\n * Returns an async iterable iterator to find all blobs with specified tag\n * under the specified account.\n *\n * .byPage() returns an async iterable iterator to list the blobs in pages.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-service-properties\n *\n * Example using `for await` syntax:\n *\n * ```js\n * let i = 1;\n * for await (const blob of blobServiceClient.findBlobsByTags("tagkey=\'tagvalue\'")) {\n * console.log(`Blob ${i++}: ${container.name}`);\n * }\n * ```\n *\n * Example using `iter.next()`:\n *\n * ```js\n * let i = 1;\n * const iter = blobServiceClient.findBlobsByTags("tagkey=\'tagvalue\'");\n * let blobItem = await iter.next();\n * while (!blobItem.done) {\n * console.log(`Blob ${i++}: ${blobItem.value.name}`);\n * blobItem = await iter.next();\n * }\n * ```\n *\n * Example using `byPage()`:\n *\n * ```js\n * // passing optional maxPageSize in the page settings\n * let i = 1;\n * for await (const response of blobServiceClient.findBlobsByTags("tagkey=\'tagvalue\'").byPage({ maxPageSize: 20 })) {\n * if (response.blobs) {\n * for (const blob of response.blobs) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n * }\n * }\n * ```\n *\n * Example using paging with a marker:\n *\n * ```js\n * let i = 1;\n * let iterator = blobServiceClient.findBlobsByTags("tagkey=\'tagvalue\'").byPage({ maxPageSize: 2 });\n * let response = (await iterator.next()).value;\n *\n * // Prints 2 blob names\n * if (response.blobs) {\n * for (const blob of response.blobs) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n * }\n *\n * // Gets next marker\n * let marker = response.continuationToken;\n * // Passing next marker as continuationToken\n * iterator = blobServiceClient\n * .findBlobsByTags("tagkey=\'tagvalue\'")\n * .byPage({ continuationToken: marker, maxPageSize: 10 });\n * response = (await iterator.next()).value;\n *\n * // Prints blob names\n * if (response.blobs) {\n * for (const blob of response.blobs) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n * }\n * ```\n *\n * @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.\n * The given expression must evaluate to true for a blob to be returned in the results.\n * The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;\n * however, only a subset of the OData filter syntax is supported in the Blob service.\n * @param options - Options to find blobs by tags.\n */\n findBlobsByTags(tagFilterSqlExpression, options = {}) {\n // AsyncIterableIterator to iterate over blobs\n const listSegmentOptions = Object.assign({}, options);\n const iter = this.findBlobsByTagsItems(tagFilterSqlExpression, listSegmentOptions);\n return {\n /**\n * The next method, part of the iteration protocol\n */\n next() {\n return iter.next();\n },\n /**\n * The connection to the async iterator, part of the iteration protocol\n */\n [Symbol.asyncIterator]() {\n return this;\n },\n /**\n * Return an AsyncIterableIterator that works a page at a time\n */\n byPage: (settings = {}) => {\n return this.findBlobsByTagsSegments(tagFilterSqlExpression, settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, listSegmentOptions));\n },\n };\n }\n /**\n * Returns an AsyncIterableIterator for ServiceListContainersSegmentResponses\n *\n * @param marker - A string value that identifies the portion of\n * the list of containers to be returned with the next listing operation. The\n * operation returns the continuationToken value within the response body if the\n * listing operation did not return all containers remaining to be listed\n * with the current page. The continuationToken value can be used as the value for\n * the marker parameter in a subsequent call to request the next page of list\n * items. The marker value is opaque to the client.\n * @param options - Options to list containers operation.\n */\n listSegments(marker, options = {}) {\n return tslib_es6_asyncGenerator(this, arguments, function* listSegments_1() {\n let listContainersSegmentResponse;\n if (!!marker || marker === undefined) {\n do {\n listContainersSegmentResponse = yield tslib_es6_await(this.listContainersSegment(marker, options));\n listContainersSegmentResponse.containerItems =\n listContainersSegmentResponse.containerItems || [];\n marker = listContainersSegmentResponse.continuationToken;\n yield yield tslib_es6_await(yield tslib_es6_await(listContainersSegmentResponse));\n } while (marker);\n }\n });\n }\n /**\n * Returns an AsyncIterableIterator for Container Items\n *\n * @param options - Options to list containers operation.\n */\n listItems(options = {}) {\n return tslib_es6_asyncGenerator(this, arguments, function* listItems_1() {\n var e_2, _a;\n let marker;\n try {\n for (var _b = tslib_es6_asyncValues(this.listSegments(marker, options)), _c; _c = yield tslib_es6_await(_b.next()), !_c.done;) {\n const segment = _c.value;\n yield tslib_es6_await(yield* tslib_es6_asyncDelegator(tslib_es6_asyncValues(segment.containerItems)));\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) yield tslib_es6_await(_a.call(_b));\n }\n finally { if (e_2) throw e_2.error; }\n }\n });\n }\n /**\n * Returns an async iterable iterator to list all the containers\n * under the specified account.\n *\n * .byPage() returns an async iterable iterator to list the containers in pages.\n *\n * Example using `for await` syntax:\n *\n * ```js\n * let i = 1;\n * for await (const container of blobServiceClient.listContainers()) {\n * console.log(`Container ${i++}: ${container.name}`);\n * }\n * ```\n *\n * Example using `iter.next()`:\n *\n * ```js\n * let i = 1;\n * const iter = blobServiceClient.listContainers();\n * let containerItem = await iter.next();\n * while (!containerItem.done) {\n * console.log(`Container ${i++}: ${containerItem.value.name}`);\n * containerItem = await iter.next();\n * }\n * ```\n *\n * Example using `byPage()`:\n *\n * ```js\n * // passing optional maxPageSize in the page settings\n * let i = 1;\n * for await (const response of blobServiceClient.listContainers().byPage({ maxPageSize: 20 })) {\n * if (response.containerItems) {\n * for (const container of response.containerItems) {\n * console.log(`Container ${i++}: ${container.name}`);\n * }\n * }\n * }\n * ```\n *\n * Example using paging with a marker:\n *\n * ```js\n * let i = 1;\n * let iterator = blobServiceClient.listContainers().byPage({ maxPageSize: 2 });\n * let response = (await iterator.next()).value;\n *\n * // Prints 2 container names\n * if (response.containerItems) {\n * for (const container of response.containerItems) {\n * console.log(`Container ${i++}: ${container.name}`);\n * }\n * }\n *\n * // Gets next marker\n * let marker = response.continuationToken;\n * // Passing next marker as continuationToken\n * iterator = blobServiceClient\n * .listContainers()\n * .byPage({ continuationToken: marker, maxPageSize: 10 });\n * response = (await iterator.next()).value;\n *\n * // Prints 10 container names\n * if (response.containerItems) {\n * for (const container of response.containerItems) {\n * console.log(`Container ${i++}: ${container.name}`);\n * }\n * }\n * ```\n *\n * @param options - Options to list containers.\n * @returns An asyncIterableIterator that supports paging.\n */\n listContainers(options = {}) {\n if (options.prefix === "") {\n options.prefix = undefined;\n }\n const include = [];\n if (options.includeDeleted) {\n include.push("deleted");\n }\n if (options.includeMetadata) {\n include.push("metadata");\n }\n if (options.includeSystem) {\n include.push("system");\n }\n // AsyncIterableIterator to iterate over containers\n const listSegmentOptions = Object.assign(Object.assign({}, options), (include.length > 0 ? { include } : {}));\n const iter = this.listItems(listSegmentOptions);\n return {\n /**\n * The next method, part of the iteration protocol\n */\n next() {\n return iter.next();\n },\n /**\n * The connection to the async iterator, part of the iteration protocol\n */\n [Symbol.asyncIterator]() {\n return this;\n },\n /**\n * Return an AsyncIterableIterator that works a page at a time\n */\n byPage: (settings = {}) => {\n return this.listSegments(settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, listSegmentOptions));\n },\n };\n }\n /**\n * ONLY AVAILABLE WHEN USING BEARER TOKEN AUTHENTICATION (TokenCredential).\n *\n * Retrieves a user delegation key for the Blob service. This is only a valid operation when using\n * bearer token authentication.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-user-delegation-key\n *\n * @param startsOn - The start time for the user delegation SAS. Must be within 7 days of the current time\n * @param expiresOn - The end time for the user delegation SAS. Must be within 7 days of the current time\n */\n async getUserDelegationKey(startsOn, expiresOn, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-getUserDelegationKey", options);\n try {\n const response = await this.serviceContext.getUserDelegationKey({\n startsOn: truncatedISO8061Date(startsOn, false),\n expiresOn: truncatedISO8061Date(expiresOn, false),\n }, Object.assign({ abortSignal: options.abortSignal }, convertTracingToRequestOptionsBase(updatedOptions)));\n const userDelegationKey = {\n signedObjectId: response.signedObjectId,\n signedTenantId: response.signedTenantId,\n signedStartsOn: new Date(response.signedStartsOn),\n signedExpiresOn: new Date(response.signedExpiresOn),\n signedService: response.signedService,\n signedVersion: response.signedVersion,\n value: response.value,\n };\n const res = Object.assign({ _response: response._response, requestId: response.requestId, clientRequestId: response.clientRequestId, version: response.version, date: response.date, errorCode: response.errorCode }, userDelegationKey);\n return res;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Creates a BlobBatchClient object to conduct batch operations.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/blob-batch\n *\n * @returns A new BlobBatchClient object for this service.\n */\n getBlobBatchClient() {\n return new BlobBatchClient(this.url, this.pipeline);\n }\n /**\n * Only available for BlobServiceClient constructed with a shared key credential.\n *\n * Generates a Blob account Shared Access Signature (SAS) URI based on the client properties\n * and parameters passed in. The SAS is signed by the shared key credential of the client.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/create-account-sas\n *\n * @param expiresOn - Optional. The time at which the shared access signature becomes invalid. Default to an hour later if not provided.\n * @param permissions - Specifies the list of permissions to be associated with the SAS.\n * @param resourceTypes - Specifies the resource types associated with the shared access signature.\n * @param options - Optional parameters.\n * @returns An account SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.\n */\n generateAccountSasUrl(expiresOn, permissions = AccountSASPermissions.parse("r"), resourceTypes = "sco", options = {}) {\n if (!(this.credential instanceof StorageSharedKeyCredential)) {\n throw RangeError("Can only generate the account SAS when the client is initialized with a shared key credential");\n }\n if (expiresOn === undefined) {\n const now = new Date();\n expiresOn = new Date(now.getTime() + 3600 * 1000);\n }\n const sas = generateAccountSASQueryParameters(Object.assign({ permissions,\n expiresOn,\n resourceTypes, services: AccountSASServices.parse("b").toString() }, options), this.credential).toString();\n return appendToURLQuery(this.url, sas);\n }\n}\n//# sourceMappingURL=BlobServiceClient.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generatedModels.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/** Known values of {@link EncryptionAlgorithmType} that the service accepts. */\nvar KnownEncryptionAlgorithmType;\n(function (KnownEncryptionAlgorithmType) {\n KnownEncryptionAlgorithmType["AES256"] = "AES256";\n})(KnownEncryptionAlgorithmType || (KnownEncryptionAlgorithmType = {}));\n//# sourceMappingURL=generatedModels.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/index.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTIzNC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUCw2Qzs7OztBQ1ZBO0FBQ0E7QUFDd0M7QUFDVTtBQUNkO0FBQ3BDLHFDQUFxQyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsR0FBRztBQUNwRztBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsV0FBVyxxQkFBTTtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLHFCQUFxQjtBQUNyQixXQUFXLFdBQVcsTUFBTTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUM7O0FDN01BO0FBQ0E7QUFDMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsY0FBYyxHQUFHLHNCQUFzQjtBQUNwRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixjQUFjLEdBQUcsZUFBZTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixpQkFBaUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFLFdBQVc7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixhQUFhO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsV0FBVztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHVCQUF1QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsVUFBVTtBQUNyQyx5QkFBeUIsVUFBVTtBQUNuQyx5QkFBeUIsVUFBVTtBQUNuQyx5QkFBeUIsVUFBVTtBQUNuQywwQkFBMEIsVUFBVTtBQUNwQztBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsaUJBQWlCO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUUsbUJBQW1CO0FBQzFGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxzQzs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLG1DOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDJDQUEyQyxPQUFPO0FBQ3pELGtDOztBQ3JIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDMEM7QUFDTDtBQUNH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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxXQUFXO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsV0FBVztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix5QkFBeUI7QUFDakQsK0VBQStFLFdBQVcsR0FBRyxFQUFFO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix3QkFBd0I7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0M7O0FDcjVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixRQUFRO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLFFBQVE7QUFDckM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixRQUFRO0FBQ3JDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixRQUFRO0FBQ3JDLGlCQUFpQjtBQUNqQjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsUUFBUTtBQUNyQyxpQkFBaUI7QUFDakI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsUUFBUTtBQUNyQyxpQkFBaUI7QUFDakI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixRQUFRO0FBQ3JDLGlCQUFpQjtBQUNqQjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixRQUFRO0FBQ3JDLGlCQUFpQjtBQUNqQjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixRQUFRO0FBQ3JDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUM7O0FDemdRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLHNEQUFzRDtBQUN2RCxpRDs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDeUQ7QUFDb0s7QUFDdE47QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSxZQUFZLHFCQUEyQjtBQUN2QztBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLHNCQUFzQixxQkFBcUI7QUFDM0M7QUFDTztBQUNQO0FBQ0EsWUFBWSxPQUFhO0FBQ3pCO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLFFBQVE7QUFDN0IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLHNCQUFzQixxQkFBcUI7QUFDM0M7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsWUFBWSxZQUFrQjtBQUM5QjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLFlBQVksUUFBYztBQUMxQjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLFlBQVksZUFBcUI7QUFDakM7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0EsTUFBTSxzQkFBWTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLE1BQU0seUJBQWU7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRSw2QkFBNkIsb0dBQW9HLHFEQUFxRDtBQUN6UDtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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ekMsV0FBVyxzQkFBc0I7QUFDakM7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsaUM7O0FDckJBO0FBQ0E7QUFDOEM7QUFDUTtBQUNiO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBLE1BQU0seURBQVM7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFdBQUs7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDBCQUEwQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0UsS0FBSztBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDBCQUEwQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDOztBQ2xNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLDhCQUE4QjtBQUNsQztBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwrQkFBK0I7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStELEtBQUs7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiwrQkFBK0I7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSx1QkFBTTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0Q7O0FDOWNBO0FBQ0E7QUFDVTtBQUNWLGtDOztBQ0hBO0FBQ0E7QUFDbUY7QUFDbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLG9CQUFvQixpQ0FBaUM7QUFDckQ7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixhQUFhO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLHdFQUF3RSwyREFBMkQ7QUFDbkk7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsUUFBUTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLDJEQUEyRDtBQUMvSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsUUFBUTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0EsZ0JBQWdCLHdCQUF3QjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxpRDs7QUNqR0E7QUFDQTtBQUN5QjtBQUNlO0FBQ3hDLGlDOztBQ0pBO0FBQ0E7QUFDTztBQUNBO0FBQ0E7QUFDQTtBQUNQLHlDOztBQ05BO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTREO0FBQzVELGtEQUFrRCxrQ0FBa0M7QUFDcEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsZ0RBQWdEO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QyxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsa0NBQWtDO0FBQ3JFO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLDZEQUE2RDtBQUM3RCw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStEO0FBQy9EO0FBQ0EscUVBQXFFLGFBQWE7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxrQ0FBa0M7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLHNDQUFzQztBQUNoQztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0QsT0FBTztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUZBQW1GLE9BQU87QUFDMUY7QUFDQTtBQUNBLDBGQUEwRixPQUFPO0FBQ2pHO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEZBQTRGLE9BQU87QUFDbkc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRkFBbUYsT0FBTztBQUMxRjtBQUNBO0FBQ0EsNkZBQTZGLE9BQU87QUFDcEc7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0RkFBNEYsT0FBTztBQUNuRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdELE1BQU0sS0FBSyxPQUFPO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQzs7QUN2VEE7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0M7O0FDaEJBO0FBQ0E7QUFDa0Q7QUFDbEQ7QUFDQTtBQUM0QjtBQUMrRTtBQUN2RDtBQUNEO0FBQzVDO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyw2QkFBNkIsVUFBVSxvQ0FBb0MsZUFBZTtBQUMxRjtBQUNBLFNBQVM7QUFDVCxhQUFhLFdBQVcsU0FBUyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYiwrQkFBK0IsVUFBVSw2QkFBNkIsVUFBVTtBQUNoRjtBQUNBLFNBQVM7QUFDVDtBQUNBLHFDQUFxQyxjQUFjO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLFVBQVUsb0NBQW9DLHFCQUFxQjtBQUNwRztBQUNBLFNBQVM7QUFDVDtBQUNBLGlEQUFpRCxlQUFlO0FBQ2hFLHlCQUF5QixRQUFRO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxVQUFVO0FBQ3REO0FBQ0EsU0FBUztBQUNUO0FBQ0EsY0FBYyxVQUFVLDhCQUE4QixrQ0FBa0M7QUFDeEY7QUFDQTtBQUNBLDRCQUE0Qix1QkFBdUI7QUFDbkQsOERBQThELGtDQUFrQztBQUNoRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QixlQUFlLHdCQUFnQjtBQUMvQjtBQUNBLHNCQUFzQixlQUFPO0FBQzdCO0FBQ0E7QUFDQSxxQ0FBcUMsZUFBTztBQUM1QztBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsZUFBTyxDQUFDLFVBQVUsa0NBQWtDLHFCQUFxQjtBQUNsSDtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EseUJBQXlCLFdBQVc7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsNERBQTRELGVBQU8sQ0FBQyxVQUFVO0FBQzlFO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLGVBQU8sQ0FBQyxVQUFVLDhCQUE4QixrQ0FBa0M7QUFDaEg7QUFDQTtBQUNBLDRCQUE0QixlQUFPO0FBQ25DO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxzQzs7QUMxR0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSx3Qzs7QUNKQTtBQUNBO0FBQzhDO0FBQ087QUFDckQsd0JBQXdCLFVBQVU7QUFDM0IscUNBQXFDLFlBQVk7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFLEtBQUs7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0Esa0Q7O0FDbkZBO0FBQ0E7QUFDa0M7QUFDc0Q7QUFDeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLG1DQUFtQyx5QkFBUTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixVQUFVLEtBQUssc0JBQXNCO0FBQ25FLHVEQUF1RCxrQ0FBa0M7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QywyQkFBMkI7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLHlCQUF5QjtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxRQUFRO0FBQzFEO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxnRDs7QUM5R0E7QUFDQTtBQUMwQztBQUMwQjtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBLHNDQUFzQyxvQkFBb0I7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHVCQUFNO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Qzs7QUM5V0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDNkM7QUFDQTtBQUNNO0FBQ25EO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQzs7QUM1WUE7QUFDQTtBQUN5QztBQUNBO0FBQ3pDO0FBQ0EsbUNBQW1DLGtDQUFrQztBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNPLHlDQUF5QyxNQUFNO0FBQ3REO0FBQ0EsZ0JBQWdCLGlHQUFpRztBQUNqSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhGQUE4RixZQUFZO0FBQzFHO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxXQUFLO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQSxZQUFZLFNBQVM7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlEO0FBQ2pEO0FBQ0EsWUFBWSxrREFBa0Q7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFLGtDQUFrQztBQUNwRyxvQkFBb0IsMkJBQTJCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBFQUEwRSwwQ0FBMEM7QUFDcEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLG1DQUFRO0FBQ2QsNEJBQTRCLG1CQUFtQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBLHNEOztBQ2pJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGNBQWMsR0FBRyxpQ0FBaUM7QUFDckUsbUJBQW1CLGNBQWM7QUFDakM7QUFDQSxpQzs7OztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsa0NBQWtDO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiw2QkFBWTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUM7O0FDekhBO0FBQ0E7QUFDa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ08sNEJBQTRCLHlCQUFRO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDOztBQ2xGQTtBQUNBO0FBQ2dEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHFDQUEyQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixlQUFlO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGFBQWE7QUFDaEM7QUFDQTtBQUNBLHdDOztBQ3RGQTtBQUNBO0FBQ3NDO0FBQ1E7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLDZCQUFZO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpRkFBaUYsV0FBVztBQUM1RjtBQUNBO0FBQ0EsaUZBQWlGLFdBQVc7QUFDNUY7QUFDQTtBQUNBLGtGQUFrRixZQUFZO0FBQzlGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixZQUFZO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEVBQTBFLEVBQUU7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiw2QkFBNkI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEOztBQ2xPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxpQ0FBaUM7QUFDckM7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLCtCQUErQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRUFBbUUsRUFBRTtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRDs7QUN2RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksaUNBQWlDO0FBQ3JDO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDBCQUEwQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUUsRUFBRTtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDOztBQy9FQTtBQUNBO0FBQ2dFO0FBQ0k7QUFDVjtBQUNYO0FBQ1c7QUFDTDtBQUNRO0FBQzdEO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQiwwQkFBMEI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSxVQUFVLGVBQWU7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIscUJBQXFCO0FBQ25ELDJCQUEyQixrQkFBa0I7QUFDN0MsZ0NBQWdDLHVCQUF1QjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG9CQUFvQjtBQUN0QztBQUNBLFlBQVksb0JBQW9CO0FBQ2hDLGdEQUFnRCxlQUFlO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG9CQUFvQjtBQUN0QztBQUNBLFlBQVksb0JBQW9CO0FBQ2hDLGdEQUFnRCxlQUFlO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0JBQWtCO0FBQ2pDO0FBQ0EscUQ7O0FDNUZtRjtBQUNuRjtBQUNBO0FBQ3VGO0FBQ2xDO0FBQ1c7QUFDUDtBQUNKO0FBQzJEO0FBQzFCO0FBQ2Q7QUFDNUM7QUFDZ0M7QUFDcUI7QUFDN0I7QUFDSjtBQUNvQjtBQUNnQjtBQUN0QjtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNPLGdDQUFnQyxhQUFhO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGNBQWM7QUFDMUI7QUFDQTtBQUNBLGtCQUFrQix1QkFBTSxvQ0FBb0MsMEJBQTBCO0FBQ3RGLDRDQUE0QyxtQkFBbUI7QUFDL0QsWUFBWSxpQkFBaUI7QUFDN0IsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFdBQVcsS0FBSyxtQkFBbUI7QUFDMUQ7QUFDQTtBQUNBLGtDQUFrQyxPQUFPO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0Usc0JBQXNCLHNCQUFzQjtBQUNwSDtBQUNBLCtGQUErRix3REFBd0Qsc0RBQXNELHdEQUF3RDtBQUNyUTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQiw0QkFBNEI7QUFDM0Q7QUFDQSxnQkFBZ0IsdUJBQU07QUFDdEIsZ0RBQWdELDBCQUEwQjtBQUMxRTtBQUNBLDJDQUEyQyx1QkFBdUI7QUFDbEU7QUFDQSxpQ0FBaUMsV0FBVztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixXQUFXLEtBQUssbUJBQW1CO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHVCQUF1QjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGVBQWUsQ0FBQyxlQUFlO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVGQUF1RjtBQUN2RixnQkFBZ0IsdUJBQXVCLEVBQUUsa0JBQVU7QUFDbkQ7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLFNBQVM7QUFDbEQsNkZBQTZGO0FBQzdGLHlDQUF5QztBQUN6QyxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUZBQXFGO0FBQ3JGO0FBQ0EsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxTQUFTO0FBQ2xELDZIQUE2SCxxQkFBcUIsK0ZBQStGO0FBQ2pQLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBLDJFQUEyRSxrQ0FBa0MsRUFBRSxrQ0FBa0M7QUFDako7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hELGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBLHVGQUF1RixrQ0FBa0MsRUFBRSxrQ0FBa0M7QUFDN0o7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBLDJFQUEyRSxrQ0FBa0MsRUFBRSxrQ0FBa0M7QUFDako7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckMsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0EsNEVBQTRFLGtDQUFrQyxFQUFFLGtDQUFrQztBQUNsSjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BELGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBLCtHQUErRywwQ0FBMEMsY0FBYyxvRkFBb0YsR0FBRyxrQ0FBa0M7QUFDaFM7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkVBQTZFO0FBQzdFLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBLG1GQUFtRiwyR0FBMkcsRUFBRSxrQ0FBa0M7QUFDbE8sa0VBQWtFLGVBQWU7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCxXQUFXLE1BQU0sTUFBTSx1QkFBdUI7QUFDdkcsaUJBQWlCLEdBQUc7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdFQUF3RTtBQUN4RSxlQUFlLHdCQUFnQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsZUFBTztBQUM1QztBQUNBO0FBQ0EsZ0NBQWdDLGVBQU87QUFDdkMsa0JBQWtCO0FBQ2xCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZEO0FBQzdELGVBQWUsd0JBQWdCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixxQkFBYSw2RUFBNkUsV0FBVyxlQUFPLHNCQUFzQjtBQUNoSztBQUNBLDBCQUEwQixlQUFPLFFBQVEsd0JBQWdCLENBQUMscUJBQWE7QUFDdkU7QUFDQTtBQUNBLDRCQUE0QixRQUFRO0FBQ3BDO0FBQ0E7QUFDQSxrRUFBa0UsZUFBTztBQUN6RTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLElBQUksSUFBSSxlQUFlO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLElBQUksSUFBSSxvQkFBb0I7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0dBQW9HLGlCQUFpQjtBQUNySDtBQUNBO0FBQ0EsaUNBQWlDLElBQUksSUFBSSxVQUFVO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNGQUFzRixnQkFBZ0I7QUFDdEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixJQUFJLElBQUksVUFBVTtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDRDQUE0QztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLElBQUksSUFBSSxVQUFVO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDLHdIQUF3SCxtQ0FBbUM7QUFDM0osYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckMsZUFBZSx3QkFBZ0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsMERBQTBELGVBQU87QUFDakU7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLGVBQU8sT0FBTyxlQUFPO0FBQ3JELGtCQUFrQjtBQUNsQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUIsZUFBZSx3QkFBZ0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLHFCQUFhLDBDQUEwQyxXQUFXLGVBQU8sc0JBQXNCO0FBQzdIO0FBQ0EsMEJBQTBCLGVBQU8sUUFBUSx3QkFBZ0IsQ0FBQyxxQkFBYTtBQUN2RTtBQUNBO0FBQ0EsNEJBQTRCLFFBQVE7QUFDcEM7QUFDQTtBQUNBLGtFQUFrRSxlQUFPO0FBQ3pFO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxJQUFJLElBQUksZUFBZTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxJQUFJLElBQUkseUJBQXlCO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdGQUFnRixpQkFBaUI7QUFDakc7QUFDQTtBQUNBLHNDQUFzQyxJQUFJLElBQUksZUFBZTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0UsZ0JBQWdCO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsSUFBSSxJQUFJLGVBQWU7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiw0Q0FBNEM7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxJQUFJLElBQUksZUFBZTtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFLG9DQUFvQyxVQUFVLElBQUk7QUFDbkg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEMscUZBQXFGLG1DQUFtQztBQUN4SCxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0U7QUFDaEUsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0E7QUFDQSwwQkFBMEIsb0JBQW9CO0FBQzlDLDJCQUEyQixvQkFBb0I7QUFDL0MsYUFBYSxrQkFBa0Isa0NBQWtDLEVBQUUsa0NBQWtDO0FBQ3JHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3Qyx3TEFBd0w7QUFDaE87QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELHFCQUFxQixnREFBZ0Q7QUFDeEgseUNBQXlDLDBCQUEwQjtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsaUNBQWlDLGlCQUFpQjtBQUN0RTtBQUNBLHFDQUFxQyxrQkFBa0Isd0JBQXdCO0FBQy9FLGVBQWUsZ0JBQWdCO0FBQy9CO0FBQ0E7QUFDQSw2Qzs7QUNqeEJBO0FBQ0E7QUFDQSxxQkFBcUIsK0JBQStCO0FBQzdDO0FBQ1A7QUFDQTtBQUNBLENBQUMsb0VBQW9FO0FBQ3JFLDJDOztBQ1BBO0FBQ0E7QUFDNkM7QUFDVDtBQUNWO0FBQ1E7QUFDQTtBQUNVO0FBQ0U7QUFDTDtBQUNPO0FBQ3BCO0FBQ007QUFDRjtBQUNTO0FBQ0k7QUFDQztBQUNBO0FBQ0k7QUFDVDtBQUNnQjtBQUMwRDtBQUN4RjtBQUMwQjtBQUNUO0FBQ0E7QUFDZ0I7QUFDbkI7QUFDUDtBQUNiO0FBQ1U7QUFDL0IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy91dGlsL3NlcmlhbGl6ZXIuY29tbW9uLmpzPzNhNjkiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvdXRpbC91dGlscy5qcz81YTkyIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3VybC5qcz8zZmY4Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3V0aWwvc2FuaXRpemVyLmpzPzJjODQiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvdXRpbC9pbnNwZWN0LmpzPzhjZjMiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvcmVzdEVycm9yLmpzPzVmMTUiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2Lm1qcz9kMzU1Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXV0aWwvZGlzdC1lc20vc3JjL2NoZWNrRW52aXJvbm1lbnQuanM/NDY1ZCIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1hdXRoL2Rpc3QtZXNtL3NyYy90b2tlbkNyZWRlbnRpYWwuanM/MGFjNiIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy9odHRwUGlwZWxpbmVMb2dMZXZlbC5qcz85NGY3Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3BvbGljaWVzL3JlcXVlc3RQb2xpY3kuanM/MTRkOCIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy91dGlsL2NvbnN0YW50cy5qcz9jZGMzIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3BvbGljaWVzL3Byb3h5UG9saWN5LmpzPzQ5YjgiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS9wbGF0Zm9ybS9ub2RlL2dsb2JhbFRoaXMuanM/MjJkNSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3ZlcnNpb24uanM/MGZkOSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2ludGVybmFsL3NlbXZlci5qcz9jNTYwIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vaW50ZXJuYWwvZ2xvYmFsLXV0aWxzLmpzPzFkMjAiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS9jb250ZXh0L2NvbnRleHQuanM/OWZiNCIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2NvbnRleHQvTm9vcENvbnRleHRNYW5hZ2VyLmpzPzE3NjYiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS9kaWFnL0NvbXBvbmVudExvZ2dlci5qcz81NGFhIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vZGlhZy90eXBlcy5qcz9iOGE4Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vZGlhZy9pbnRlcm5hbC9sb2dMZXZlbExvZ2dlci5qcz9iNTBjIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYXBpL2RpYWcuanM/OGQ3MSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2FwaS9jb250ZXh0LmpzP2ZkN2QiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS90cmFjZS90cmFjZV9mbGFncy5qcz9jYTkzIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvaW52YWxpZC1zcGFuLWNvbnN0YW50cy5qcz9kMGZlIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvTm9uUmVjb3JkaW5nU3Bhbi5qcz84NjNhIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvY29udGV4dC11dGlscy5qcz85NWM4Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2Uvc3BhbmNvbnRleHQtdXRpbHMuanM/M2YwOSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3RyYWNlL05vb3BUcmFjZXIuanM/MDJhNSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3RyYWNlL1Byb3h5VHJhY2VyLmpzPzkyMWEiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS90cmFjZS9Ob29wVHJhY2VyUHJvdmlkZXIuanM/ODUwYyIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3RyYWNlL1Byb3h5VHJhY2VyUHJvdmlkZXIuanM/NTYwNSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2FwaS90cmFjZS5qcz9jYjYyIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UtYXBpLmpzPzJiYmMiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS9jb250ZXh0LWFwaS5qcz82N2E0Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXRyYWNpbmcvZGlzdC1lc20vc3JjL2ludGVyZmFjZXMuanM/YjU2MCIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy9vcGVyYXRpb25PcHRpb25zLmpzPzEyYjEiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvdXRpbC9iYXNlNjQuanM/YmM0NiIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy9zZXJpYWxpemVyLmpzPzNkOWMiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL2dlbmVyYXRlZC9zcmMvbW9kZWxzL21hcHBlcnMuanM/MTc2NCIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy9xdWVyeUNvbGxlY3Rpb25Gb3JtYXQuanM/MzQwMCIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvZ2VuZXJhdGVkL3NyYy9tb2RlbHMvcGFyYW1ldGVycy5qcz8xOGQwIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9nZW5lcmF0ZWQvc3JjL29wZXJhdGlvbnMvc2VydmljZS5qcz9hYzg5Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9nZW5lcmF0ZWQvc3JjL29wZXJhdGlvbnMvY29udGFpbmVyLmpzPzRkMDMiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtdHJhY2luZy9kaXN0LWVzbS9zcmMvY3JlYXRlU3Bhbi5qcz81NzhkIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXRyYWNpbmcvZGlzdC1lc20vc3JjL3V0aWxzL3RyYWNlUGFyZW50SGVhZGVyLmpzPzUwZGYiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2xvZ2dlci9kaXN0LWVzbS9zcmMvbG9nLmpzP2I3NjgiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2xvZ2dlci9kaXN0LWVzbS9zcmMvZGVidWcuanM/MmM0YyIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbG9nZ2VyL2Rpc3QtZXNtL3NyYy9pbmRleC5qcz83ZTNiIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL2xvZy5qcz9kZTZkIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3BvbGljaWVzL3RyYWNpbmdQb2xpY3kuanM/ZTQzOCIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy9wb2xpY2llcy9rZWVwQWxpdmVQb2xpY3kuanM/N2M2YSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy9wb2xpY2llcy9nZW5lcmF0ZUNsaWVudFJlcXVlc3RJZFBvbGljeS5qcz8zZTQwIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3V0aWwveG1sLmpzPzljYzMiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvcG9saWNpZXMvZGVzZXJpYWxpemF0aW9uUG9saWN5LmpzPzA1YWMiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvcG9saWNpZXMvbG9nUG9saWN5LmpzPzZjZWMiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvcG9saWNpZXMvZGlzYWJsZVJlc3BvbnNlRGVjb21wcmVzc2lvblBvbGljeS5qcz9mZWRlIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL2h0dHBIZWFkZXJzLmpzP2M3NjIiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvd2ViUmVzb3VyY2UuanM/NWIwYiIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvbG9nLmpzP2YxNTUiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL3V0aWxzL2NvbnN0YW50cy5qcz83ZmI4Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy91dGlscy91dGlscy5jb21tb24uanM/NGE0ZSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvcG9saWNpZXMvU3RvcmFnZUJyb3dzZXJQb2xpY3kuanM/ZjVkNCIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvU3RvcmFnZUJyb3dzZXJQb2xpY3lGYWN0b3J5LmpzPzZlMDkiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2Fib3J0LWNvbnRyb2xsZXIvZGlzdC1lc20vc3JjL0Fib3J0U2lnbmFsLmpzP2FiMWEiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2Fib3J0LWNvbnRyb2xsZXIvZGlzdC1lc20vc3JjL0Fib3J0Q29udHJvbGxlci5qcz8yMzI1Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9wb2xpY2llcy9TdG9yYWdlUmV0cnlQb2xpY3kuanM/ZmQzNyIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvU3RvcmFnZVJldHJ5UG9saWN5RmFjdG9yeS5qcz9jMDgyIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9wb2xpY2llcy9DcmVkZW50aWFsUG9saWN5LmpzPzc2NGUiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL3BvbGljaWVzL0Fub255bW91c0NyZWRlbnRpYWxQb2xpY3kuanM/NTczOSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvY3JlZGVudGlhbHMvQ3JlZGVudGlhbC5qcz9iMGQ4Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9jcmVkZW50aWFscy9Bbm9ueW1vdXNDcmVkZW50aWFsLmpzP2U1ZGUiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL3BvbGljaWVzL1RlbGVtZXRyeVBvbGljeS5qcz8wMWZhIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9UZWxlbWV0cnlQb2xpY3lGYWN0b3J5LmpzPzMxZDciLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvcHJveHlBZ2VudC5qcz83ODZiIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL25vZGVGZXRjaEh0dHBDbGllbnQuanM/ZTc5ZCIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvdXRpbHMvY2FjaGUuanM/MWVlOSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS11dGlsL2Rpc3QtZXNtL3NyYy9jcmVhdGVBYm9ydGFibGVQcm9taXNlLmpzP2RhNzMiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtdXRpbC9kaXN0LWVzbS9zcmMvZGVsYXkuanM/NmRhOSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvcG9saWNpZXMvU3RvcmFnZUJlYXJlclRva2VuQ2hhbGxlbmdlQXV0aGVudGljYXRpb25Qb2xpY3kuanM/YTRiYiIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvUGlwZWxpbmUuanM/MzE4YyIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvcG9saWNpZXMvU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxQb2xpY3kuanM/Y2NkZSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvY3JlZGVudGlhbHMvU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwuanM/NjBmMiIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy9wb2xpY2llcy9yZWRpcmVjdFBvbGljeS5qcz85NDBlIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3V0aWwvZXhwb25lbnRpYWxCYWNrb2ZmU3RyYXRlZ3kuanM/MDZmYiIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy9wb2xpY2llcy9leHBvbmVudGlhbFJldHJ5UG9saWN5LmpzPzdlNWQiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvb3BlcmF0aW9uUGFyYW1ldGVyLmpzP2Y0ZDQiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvb3BlcmF0aW9uU3BlYy5qcz9lY2YwIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3BvbGljaWVzL21zUmVzdFVzZXJBZ2VudFBvbGljeS5qcz84MWU1Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3BvbGljaWVzL3VzZXJBZ2VudFBvbGljeS5qcz9mOTc5Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3BvbGljaWVzL2JlYXJlclRva2VuQXV0aGVudGljYXRpb25Qb2xpY3kuanM/NDZjYiIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy9odHRwQ2xpZW50Q2FjaGUuanM/YzY2ZCIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy9wb2xpY2llcy9ycFJlZ2lzdHJhdGlvblBvbGljeS5qcz9jODVmIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3BvbGljaWVzL3NpZ25pbmdQb2xpY3kuanM/MGRhNCIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy9wb2xpY2llcy9zeXN0ZW1FcnJvclJldHJ5UG9saWN5LmpzPzJkMjciLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvdXRpbC90aHJvdHRsaW5nUmV0cnlTdHJhdGVneS5qcz9mNDg4Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3BvbGljaWVzL3Rocm90dGxpbmdSZXRyeVBvbGljeS5qcz8zN2RhIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3NlcnZpY2VDbGllbnQuanM/NWY3MyIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvZ2VuZXJhdGVkL3NyYy9zdG9yYWdlQ2xpZW50Q29udGV4dC5qcz9hYzY2Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9TdG9yYWdlQ2xpZW50LmpzPzkzZTUiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL3V0aWxzL3RyYWNpbmcuanM/ZTViOCIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvc2FzL0Jsb2JTQVNQZXJtaXNzaW9ucy5qcz80NTExIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9zYXMvQ29udGFpbmVyU0FTUGVybWlzc2lvbnMuanM/OTNkNyIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvY3JlZGVudGlhbHMvVXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLmpzP2FiOTQiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL3Nhcy9TYXNJUFJhbmdlLmpzPzYxMjAiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL3Nhcy9TQVNRdWVyeVBhcmFtZXRlcnMuanM/ODhhYSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvc2FzL0Jsb2JTQVNTaWduYXR1cmVWYWx1ZXMuanM/MjY2NiIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvZ2VuZXJhdGVkL3NyYy9vcGVyYXRpb25zL2Jsb2IuanM/M2M2ZCIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvQmxvYkxlYXNlQ2xpZW50LmpzPzQzNTciLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL3V0aWxzL1JldHJpYWJsZVJlYWRhYmxlU3RyZWFtLmpzPzk4MDUiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL0Jsb2JEb3dubG9hZFJlc3BvbnNlLmpzP2U2OTAiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtcGFnaW5nL2Rpc3QtZXNtL3NyYy9tb2RlbHMuanM/YmFlNyIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1wYWdpbmcvZGlzdC1lc20vc3JjL2dldFBhZ2VkQXN5bmNJdGVyYXRvci5qcz85MGI3Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXBhZ2luZy9kaXN0LWVzbS9zcmMvaW5kZXguanM/NDIzNiIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtaW50ZXJuYWwtYXZyby9zcmMvQXZyb0NvbnN0YW50cy5qcz80ZDkxIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1pbnRlcm5hbC1hdnJvL3NyYy9BdnJvUGFyc2VyLmpzPzdmOWEiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWludGVybmFsLWF2cm8vc3JjL3V0aWxzL3V0aWxzLmNvbW1vbi5qcz9hNDM1Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1pbnRlcm5hbC1hdnJvL3NyYy9BdnJvUmVhZGVyLmpzP2RjYTgiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWludGVybmFsLWF2cm8vc3JjL0F2cm9SZWFkYWJsZS5qcz9kZmU2Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1pbnRlcm5hbC1hdnJvL3NyYy9BdnJvUmVhZGFibGVGcm9tU3RyZWFtLmpzPzZlZTUiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL3V0aWxzL0Jsb2JRdWlja1F1ZXJ5U3RyZWFtLmpzPzgwZmYiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL0Jsb2JRdWVyeVJlc3BvbnNlLmpzPzA0OGEiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL2dlbmVyYXRlZC9zcmMvb3BlcmF0aW9ucy9hcHBlbmRCbG9iLmpzP2ZjYjYiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL2dlbmVyYXRlZC9zcmMvb3BlcmF0aW9ucy9ibG9ja0Jsb2IuanM/ZmFlOSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvZ2VuZXJhdGVkL3NyYy9vcGVyYXRpb25zL3BhZ2VCbG9iLmpzPzg1ODkiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL21vZGVscy5qcz8xMjU5Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9QYWdlQmxvYlJhbmdlUmVzcG9uc2UuanM/NjVjNiIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1scm8vZGlzdC1lc20vc3JjL2xlZ2FjeS9wb2xsZXIuanM/OTA4ZiIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvcG9sbGVycy9CbG9iU3RhcnRDb3B5RnJvbVVybFBvbGxlci5qcz8wYmRjIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9SYW5nZS5qcz9hYjBmIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy91dGlscy9CYXRjaC5qcz83MGFmIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1jb21tb24vc3JjL0J1ZmZlcnNTdHJlYW0uanM/OWFjMiIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtY29tbW9uL3NyYy9Qb29sZWRCdWZmZXIuanM/YzExNyIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtY29tbW9uL3NyYy9CdWZmZXJTY2hlZHVsZXIuanM/MDc4NiIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvdXRpbHMvdXRpbHMubm9kZS5qcz8yM2YyIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9DbGllbnRzLmpzPzFjNzYiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL0JhdGNoVXRpbHMuanM/YzU5ZSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvQmF0Y2hSZXNwb25zZVBhcnNlci5qcz8yMjYzIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy91dGlscy9NdXRleC5qcz8xNzg1Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9CbG9iQmF0Y2guanM/Mzc1ZSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvQmxvYkJhdGNoQ2xpZW50LmpzPzhiODQiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL0NvbnRhaW5lckNsaWVudC5qcz8zOWJkIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9zYXMvQWNjb3VudFNBU1Blcm1pc3Npb25zLmpzP2Q0ZDAiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL3Nhcy9BY2NvdW50U0FTUmVzb3VyY2VUeXBlcy5qcz82Y2M4Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9zYXMvQWNjb3VudFNBU1NlcnZpY2VzLmpzPzNiNTIiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL3Nhcy9BY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLmpzPzkyYjUiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL0Jsb2JTZXJ2aWNlQ2xpZW50LmpzPzZiZDEiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL2dlbmVyYXRlZE1vZGVscy5qcz9mMDkyIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9pbmRleC5qcz84ZjJlIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLyoqXG4gKiBEZWZhdWx0IGtleSB1c2VkIHRvIGFjY2VzcyB0aGUgWE1MIGF0dHJpYnV0ZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBYTUxfQVRUUktFWSA9IFwiJFwiO1xuLyoqXG4gKiBEZWZhdWx0IGtleSB1c2VkIHRvIGFjY2VzcyB0aGUgWE1MIHZhbHVlIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBYTUxfQ0hBUktFWSA9IFwiX1wiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VyaWFsaXplci5jb21tb24uanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFhNTF9BVFRSS0VZIH0gZnJvbSBcIi4vc2VyaWFsaXplci5jb21tb25cIjtcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gXCJ1dWlkXCI7XG5jb25zdCB2YWxpZFV1aWRSZWdleCA9IC9eWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JC9pO1xuLyoqXG4gKiBDaGVja3MgaWYgYSBwYXJzZWQgVVJMIGlzIEhUVFBTXG4gKlxuICogQHBhcmFtIHVybFRvQ2hlY2sgLSBUaGUgdXJsIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBVUkwgaXMgSFRUUFM7IGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVybElzSFRUUFModXJsVG9DaGVjaykge1xuICAgIHJldHVybiB1cmxUb0NoZWNrLnByb3RvY29sLnRvTG93ZXJDYXNlKCkgPT09IENvbnN0YW50cy5IVFRQUztcbn1cbi8qKlxuICogRW5jb2RlcyBhbiBVUkkuXG4gKlxuICogQHBhcmFtIHVyaSAtIFRoZSBVUkkgdG8gYmUgZW5jb2RlZC5cbiAqIEByZXR1cm5zIFRoZSBlbmNvZGVkIFVSSS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVVyaSh1cmkpIHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHVyaSlcbiAgICAgICAgLnJlcGxhY2UoLyEvZywgXCIlMjFcIilcbiAgICAgICAgLnJlcGxhY2UoL1wiL2csIFwiJTI3XCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXCgvZywgXCIlMjhcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcKS9nLCBcIiUyOVwiKVxuICAgICAgICAucmVwbGFjZSgvXFwqL2csIFwiJTJBXCIpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaXBwZWQgdmVyc2lvbiBvZiB0aGUgSHR0cCBSZXNwb25zZSB3aGljaCBvbmx5IGNvbnRhaW5zIGJvZHksXG4gKiBoZWFkZXJzIGFuZCB0aGUgc3RhdHVzLlxuICpcbiAqIEBwYXJhbSByZXNwb25zZSAtIFRoZSBIdHRwIFJlc3BvbnNlXG4gKiBAcmV0dXJucyBUaGUgc3RyaXBwZWQgdmVyc2lvbiBvZiBIdHRwIFJlc3BvbnNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBSZXNwb25zZShyZXNwb25zZSkge1xuICAgIGNvbnN0IHN0cmlwcGVkUmVzcG9uc2UgPSB7fTtcbiAgICBzdHJpcHBlZFJlc3BvbnNlLmJvZHkgPSByZXNwb25zZS5ib2R5QXNUZXh0O1xuICAgIHN0cmlwcGVkUmVzcG9uc2UuaGVhZGVycyA9IHJlc3BvbnNlLmhlYWRlcnM7XG4gICAgc3RyaXBwZWRSZXNwb25zZS5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgcmV0dXJuIHN0cmlwcGVkUmVzcG9uc2U7XG59XG4vKipcbiAqIFJldHVybnMgYSBzdHJpcHBlZCB2ZXJzaW9uIG9mIHRoZSBIdHRwIFJlcXVlc3QgdGhhdCBkb2VzIG5vdCBjb250YWluIHRoZVxuICogQXV0aG9yaXphdGlvbiBoZWFkZXIuXG4gKlxuICogQHBhcmFtIHJlcXVlc3QgLSBUaGUgSHR0cCBSZXF1ZXN0IG9iamVjdFxuICogQHJldHVybnMgVGhlIHN0cmlwcGVkIHZlcnNpb24gb2YgSHR0cCBSZXF1ZXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICBjb25zdCBzdHJpcHBlZFJlcXVlc3QgPSByZXF1ZXN0LmNsb25lKCk7XG4gICAgaWYgKHN0cmlwcGVkUmVxdWVzdC5oZWFkZXJzKSB7XG4gICAgICAgIHN0cmlwcGVkUmVxdWVzdC5oZWFkZXJzLnJlbW92ZShcImF1dGhvcml6YXRpb25cIik7XG4gICAgfVxuICAgIHJldHVybiBzdHJpcHBlZFJlcXVlc3Q7XG59XG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgZ2l2ZW4gdXVpZCBhcyBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB1dWlkIC0gVGhlIHV1aWQgYXMgYSBzdHJpbmcgdGhhdCBuZWVkcyB0byBiZSB2YWxpZGF0ZWRcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHV1aWQgaXMgdmFsaWQ7IGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRVdWlkKHV1aWQpIHtcbiAgICByZXR1cm4gdmFsaWRVdWlkUmVnZXgudGVzdCh1dWlkKTtcbn1cbi8qKlxuICogR2VuZXJhdGVkIFVVSURcbiAqXG4gKiBAcmV0dXJucyBSRkM0MTIyIHY0IFVVSUQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVV1aWQoKSB7XG4gICAgcmV0dXJuIHV1aWR2NCgpO1xufVxuLyoqXG4gKiBFeGVjdXRlcyBhbiBhcnJheSBvZiBwcm9taXNlcyBzZXF1ZW50aWFsbHkuIEluc3BpcmF0aW9uIG9mIHRoaXMgbWV0aG9kIGlzIGhlcmU6XG4gKiBodHRwczovL3BvdWNoZGIuY29tLzIwMTUvMDUvMTgvd2UtaGF2ZS1hLXByb2JsZW0td2l0aC1wcm9taXNlcy5odG1sLiBBbiBhd2Vzb21lIGJsb2cgb24gcHJvbWlzZXMhXG4gKlxuICogQHBhcmFtIHByb21pc2VGYWN0b3JpZXMgLSBBbiBhcnJheSBvZiBwcm9taXNlIGZhY3RvcmllcyhBIGZ1bmN0aW9uIHRoYXQgcmV0dXJuIGEgcHJvbWlzZSlcbiAqIEBwYXJhbSBraWNrc3RhcnQgLSBJbnB1dCB0byB0aGUgZmlyc3QgcHJvbWlzZSB0aGF0IGlzIHVzZWQgdG8ga2lja3N0YXJ0IHRoZSBwcm9taXNlIGNoYWluLlxuICogSWYgbm90IHByb3ZpZGVkIHRoZW4gdGhlIHByb21pc2UgY2hhaW4gc3RhcnRzIHdpdGggdW5kZWZpbmVkLlxuICogQHJldHVybnMgQSBjaGFpbiBvZiByZXNvbHZlZCBvciByZWplY3RlZCBwcm9taXNlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZVByb21pc2VzU2VxdWVudGlhbGx5KHByb21pc2VGYWN0b3JpZXMsIGtpY2tzdGFydCkge1xuICAgIGxldCByZXN1bHQgPSBQcm9taXNlLnJlc29sdmUoa2lja3N0YXJ0KTtcbiAgICBwcm9taXNlRmFjdG9yaWVzLmZvckVhY2goKHByb21pc2VGYWN0b3J5KSA9PiB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC50aGVuKHByb21pc2VGYWN0b3J5KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhIFByb21pc2UgdG8gYSBjYWxsYmFjay5cbiAqIEBwYXJhbSBwcm9taXNlIC0gVGhlIFByb21pc2UgdG8gYmUgY29udmVydGVkIHRvIGEgY2FsbGJhY2tcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgY2FsbGJhY2sgYChjYjogRnVuY3Rpb24pID0+IHZvaWRgXG4gKiBAZGVwcmVjYXRlZCBnZW5lcmF0ZWQgY29kZSBzaG91bGQgaW5zdGVhZCBkZXBlbmQgb24gcmVzcG9uc2VUb0JvZHlcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbmV4cG9ydCBmdW5jdGlvbiBwcm9taXNlVG9DYWxsYmFjayhwcm9taXNlKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9taXNlLnRoZW4gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcHJvdmlkZWQgaW5wdXQgaXMgbm90IGEgUHJvbWlzZS5cIik7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gICAgcmV0dXJuIChjYikgPT4ge1xuICAgICAgICBwcm9taXNlXG4gICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2Uvbm8tY2FsbGJhY2staW4tcHJvbWlzZVxuICAgICAgICAgICAgcmV0dXJuIGNiKHVuZGVmaW5lZCwgZGF0YSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2Uvbm8tY2FsbGJhY2staW4tcHJvbWlzZVxuICAgICAgICAgICAgY2IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbi8qKlxuICogQ29udmVydHMgYSBQcm9taXNlIHRvIGEgc2VydmljZSBjYWxsYmFjay5cbiAqIEBwYXJhbSBwcm9taXNlIC0gVGhlIFByb21pc2Ugb2YgSHR0cE9wZXJhdGlvblJlc3BvbnNlIHRvIGJlIGNvbnZlcnRlZCB0byBhIHNlcnZpY2UgY2FsbGJhY2tcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgc2VydmljZSBjYWxsYmFjayAoY2I6IFNlcnZpY2VDYWxsYmFjazxUPik6IHZvaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb21pc2VUb1NlcnZpY2VDYWxsYmFjayhwcm9taXNlKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9taXNlLnRoZW4gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcHJvdmlkZWQgaW5wdXQgaXMgbm90IGEgUHJvbWlzZS5cIik7XG4gICAgfVxuICAgIHJldHVybiAoY2IpID0+IHtcbiAgICAgICAgcHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGNiLCB1bmRlZmluZWQsIGRhdGEucGFyc2VkQm9keSwgZGF0YS5yZXF1ZXN0LCBkYXRhKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGNiLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVYTUxSb290TGlzdChvYmosIGVsZW1lbnROYW1lLCB4bWxOYW1lc3BhY2VLZXksIHhtbE5hbWVzcGFjZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIG9iaiA9IFtvYmpdO1xuICAgIH1cbiAgICBpZiAoIXhtbE5hbWVzcGFjZUtleSB8fCAheG1sTmFtZXNwYWNlKSB7XG4gICAgICAgIHJldHVybiB7IFtlbGVtZW50TmFtZV06IG9iaiB9O1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB7IFtlbGVtZW50TmFtZV06IG9iaiB9O1xuICAgIHJlc3VsdFtYTUxfQVRUUktFWV0gPSB7IFt4bWxOYW1lc3BhY2VLZXldOiB4bWxOYW1lc3BhY2UgfTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBBcHBsaWVzIHRoZSBwcm9wZXJ0aWVzIG9uIHRoZSBwcm90b3R5cGUgb2Ygc291cmNlQ3RvcnMgdG8gdGhlIHByb3RvdHlwZSBvZiB0YXJnZXRDdG9yXG4gKiBAcGFyYW0gdGFyZ2V0Q3RvciAtIFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBwcm9wZXJ0aWVzIG5lZWQgdG8gYmUgYXBwbGllZC5cbiAqIEBwYXJhbSBzb3VyY2VDdG9ycyAtIEFuIGFycmF5IG9mIHNvdXJjZSBvYmplY3RzIGZyb20gd2hpY2ggdGhlIHByb3BlcnRpZXMgbmVlZCB0byBiZSB0YWtlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TWl4aW5zKHRhcmdldEN0b3JQYXJhbSwgc291cmNlQ3RvcnMpIHtcbiAgICBjb25zdCBjYXN0VGFyZ2V0Q3RvclBhcmFtID0gdGFyZ2V0Q3RvclBhcmFtO1xuICAgIHNvdXJjZUN0b3JzLmZvckVhY2goKHNvdXJjZUN0b3IpID0+IHtcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoc291cmNlQ3Rvci5wcm90b3R5cGUpLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgICAgIGNhc3RUYXJnZXRDdG9yUGFyYW0ucHJvdG90eXBlW25hbWVdID0gc291cmNlQ3Rvci5wcm90b3R5cGVbbmFtZV07XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuY29uc3QgdmFsaWRhdGVJU09EdXJhdGlvbiA9IC9eKC18XFwrKT9QKD86KFstK10/WzAtOSwuXSopWSk/KD86KFstK10/WzAtOSwuXSopTSk/KD86KFstK10/WzAtOSwuXSopVyk/KD86KFstK10/WzAtOSwuXSopRCk/KD86VCg/OihbLStdP1swLTksLl0qKUgpPyg/OihbLStdP1swLTksLl0qKU0pPyg/OihbLStdP1swLTksLl0qKVMpPyk/JC87XG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBnaXZlbiBzdHJpbmcgaXMgaW4gSVNPIDg2MDEgZm9ybWF0LlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHZhbGlkYXRlZCBmb3IgSVNPIDg2MDEgZHVyYXRpb24gZm9ybWF0LlxuICogQHJldHVybnMgYHRydWVgIGlmIHZhbGlkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRHVyYXRpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsaWRhdGVJU09EdXJhdGlvbi50ZXN0KHZhbHVlKTtcbn1cbi8qKlxuICogUmVwbGFjZSBhbGwgb2YgdGhlIGluc3RhbmNlcyBvZiBzZWFyY2hWYWx1ZSBpbiB2YWx1ZSB3aXRoIHRoZSBwcm92aWRlZCByZXBsYWNlVmFsdWUuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2VhcmNoIGFuZCByZXBsYWNlIGluLlxuICogQHBhcmFtIHNlYXJjaFZhbHVlIC0gVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IgaW4gdGhlIHZhbHVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHJlcGxhY2VWYWx1ZSAtIFRoZSB2YWx1ZSB0byByZXBsYWNlIHNlYXJjaFZhbHVlIHdpdGggaW4gdGhlIHZhbHVlIGFyZ3VtZW50LlxuICogQHJldHVybnMgVGhlIHZhbHVlIHdoZXJlIGVhY2ggaW5zdGFuY2Ugb2Ygc2VhcmNoVmFsdWUgd2FzIHJlcGxhY2VkIHdpdGggcmVwbGFjZWRWYWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VBbGwodmFsdWUsIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpIHtcbiAgICByZXR1cm4gIXZhbHVlIHx8ICFzZWFyY2hWYWx1ZSA/IHZhbHVlIDogdmFsdWUuc3BsaXQoc2VhcmNoVmFsdWUpLmpvaW4ocmVwbGFjZVZhbHVlIHx8IFwiXCIpO1xufVxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIGVudGl0eSBpcyBhIGJhc2ljL3ByaW1pdGl2ZSB0eXBlXG4gKiAoc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG51bGwsIHVuZGVmaW5lZCkuXG4gKiBAcGFyYW0gdmFsdWUgLSBBbnkgZW50aXR5XG4gKiBAcmV0dXJucyB0cnVlIGlzIGl0IGlzIHByaW1pdGl2ZSB0eXBlLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaW1pdGl2ZVR5cGUodmFsdWUpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgfHwgdmFsdWUgPT09IG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RW52aXJvbm1lbnRWYWx1ZShuYW1lKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52W25hbWVdKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudltuYW1lXTtcbiAgICB9XG4gICAgZWxzZSBpZiAocHJvY2Vzcy5lbnZbbmFtZS50b0xvd2VyQ2FzZSgpXSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnZbbmFtZS50b0xvd2VyQ2FzZSgpXTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKiBAcmV0dXJucyB0cnVlIHdoZW4gaW5wdXQgaXMgYW4gb2JqZWN0IHR5cGUgdGhhdCBpcyBub3QgbnVsbCwgQXJyYXksIFJlZ0V4cCwgb3IgRGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KGlucHV0KSB7XG4gICAgcmV0dXJuICh0eXBlb2YgaW5wdXQgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgaW5wdXQgIT09IG51bGwgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoaW5wdXQpICYmXG4gICAgICAgICEoaW5wdXQgaW5zdGFuY2VvZiBSZWdFeHApICYmXG4gICAgICAgICEoaW5wdXQgaW5zdGFuY2VvZiBEYXRlKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IHJlcGxhY2VBbGwgfSBmcm9tIFwiLi91dGlsL3V0aWxzXCI7XG4vKipcbiAqIEEgY2xhc3MgdGhhdCBoYW5kbGVzIHRoZSBxdWVyeSBwb3J0aW9uIG9mIGEgVVJMQnVpbGRlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFVSTFF1ZXJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fcmF3UXVlcnkgPSB7fTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHdoZXRoZXIgb3Igbm90IHRoZXJlIGFueSBxdWVyeSBwYXJhbWV0ZXJzIGluIHRoaXMgVVJMUXVlcnkuXG4gICAgICovXG4gICAgYW55KCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fcmF3UXVlcnkpLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5cyBvZiB0aGUgcXVlcnkgc3RyaW5nLlxuICAgICAqL1xuICAgIGtleXMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9yYXdRdWVyeSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBhIHF1ZXJ5IHBhcmFtZXRlciB3aXRoIHRoZSBwcm92aWRlZCBuYW1lIGFuZCB2YWx1ZS4gSWYgdGhlIHBhcmFtZXRlclZhbHVlIGlzIHVuZGVmaW5lZCBvclxuICAgICAqIGVtcHR5LCB0aGVuIHRoaXMgd2lsbCBhdHRlbXB0IHRvIHJlbW92ZSBhbiBleGlzdGluZyBxdWVyeSBwYXJhbWV0ZXIgd2l0aCB0aGUgcHJvdmlkZWRcbiAgICAgKiBwYXJhbWV0ZXJOYW1lLlxuICAgICAqL1xuICAgIHNldChwYXJhbWV0ZXJOYW1lLCBwYXJhbWV0ZXJWYWx1ZSkge1xuICAgICAgICBjb25zdCBjYXNlUGFyYW1ldGVyVmFsdWUgPSBwYXJhbWV0ZXJWYWx1ZTtcbiAgICAgICAgaWYgKHBhcmFtZXRlck5hbWUpIHtcbiAgICAgICAgICAgIGlmIChjYXNlUGFyYW1ldGVyVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBjYXNlUGFyYW1ldGVyVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IEFycmF5LmlzQXJyYXkoY2FzZVBhcmFtZXRlclZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA/IGNhc2VQYXJhbWV0ZXJWYWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IGNhc2VQYXJhbWV0ZXJWYWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Jhd1F1ZXJ5W3BhcmFtZXRlck5hbWVdID0gbmV3VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fcmF3UXVlcnlbcGFyYW1ldGVyTmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUuIElmIG5vIHBhcmFtZXRlciBleGlzdHMgd2l0aCB0aGVcbiAgICAgKiBwcm92aWRlZCBwYXJhbWV0ZXIgbmFtZSwgdGhlbiB1bmRlZmluZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBnZXQocGFyYW1ldGVyTmFtZSkge1xuICAgICAgICByZXR1cm4gcGFyYW1ldGVyTmFtZSA/IHRoaXMuX3Jhd1F1ZXJ5W3BhcmFtZXRlck5hbWVdIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHF1ZXJ5LiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgbm90IHN0YXJ0IHdpdGggYSBcIj9cIi5cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAoY29uc3QgcGFyYW1ldGVyTmFtZSBpbiB0aGlzLl9yYXdRdWVyeSkge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIiZcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlclZhbHVlID0gdGhpcy5fcmF3UXVlcnlbcGFyYW1ldGVyTmFtZV07XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbWV0ZXJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJTdHJpbmdzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYXJhbWV0ZXJWYWx1ZUVsZW1lbnQgb2YgcGFyYW1ldGVyVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyU3RyaW5ncy5wdXNoKGAke3BhcmFtZXRlck5hbWV9PSR7cGFyYW1ldGVyVmFsdWVFbGVtZW50fWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gcGFyYW1ldGVyU3RyaW5ncy5qb2luKFwiJlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBgJHtwYXJhbWV0ZXJOYW1lfT0ke3BhcmFtZXRlclZhbHVlfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2UgYSBVUkxRdWVyeSBmcm9tIHRoZSBwcm92aWRlZCB0ZXh0LlxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZSh0ZXh0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVUkxRdWVyeSgpO1xuICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgICAgaWYgKHRleHQuc3RhcnRzV2l0aChcIj9cIikpIHtcbiAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY3VycmVudFN0YXRlID0gXCJQYXJhbWV0ZXJOYW1lXCI7XG4gICAgICAgICAgICBsZXQgcGFyYW1ldGVyTmFtZSA9IFwiXCI7XG4gICAgICAgICAgICBsZXQgcGFyYW1ldGVyVmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudENoYXJhY3RlciA9IHRleHRbaV07XG4gICAgICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50U3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlBhcmFtZXRlck5hbWVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3VycmVudENoYXJhY3Rlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI9XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IFwiUGFyYW1ldGVyVmFsdWVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIiZcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTmFtZSArPSBjdXJyZW50Q2hhcmFjdGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUGFyYW1ldGVyVmFsdWVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3VycmVudENoYXJhY3Rlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCImXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQocGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJOYW1lID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBcIlBhcmFtZXRlck5hbWVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWUgKz0gY3VycmVudENoYXJhY3RlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCBVUkxRdWVyeSBwYXJzZSBzdGF0ZTogXCIgKyBjdXJyZW50U3RhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXJyZW50U3RhdGUgPT09IFwiUGFyYW1ldGVyVmFsdWVcIikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQocGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgaGFuZGxlcyBjcmVhdGluZywgbW9kaWZ5aW5nLCBhbmQgcGFyc2luZyBVUkxzLlxuICovXG5leHBvcnQgY2xhc3MgVVJMQnVpbGRlciB7XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBzY2hlbWUvcHJvdG9jb2wgZm9yIHRoaXMgVVJMLiBJZiB0aGUgcHJvdmlkZWQgc2NoZW1lIGNvbnRhaW5zIG90aGVyIHBhcnRzIG9mIGEgVVJMXG4gICAgICogKHN1Y2ggYXMgYSBob3N0LCBwb3J0LCBwYXRoLCBvciBxdWVyeSksIHRob3NlIHBhcnRzIHdpbGwgYmUgYWRkZWQgdG8gdGhpcyBVUkwgYXMgd2VsbC5cbiAgICAgKi9cbiAgICBzZXRTY2hlbWUoc2NoZW1lKSB7XG4gICAgICAgIGlmICghc2NoZW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9zY2hlbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldChzY2hlbWUsIFwiU0NIRU1FXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2NoZW1lIHRoYXQgaGFzIGJlZW4gc2V0IGluIHRoaXMgVVJMLlxuICAgICAqL1xuICAgIGdldFNjaGVtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NjaGVtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBob3N0IGZvciB0aGlzIFVSTC4gSWYgdGhlIHByb3ZpZGVkIGhvc3QgY29udGFpbnMgb3RoZXIgcGFydHMgb2YgYSBVUkwgKHN1Y2ggYXMgYVxuICAgICAqIHBvcnQsIHBhdGgsIG9yIHF1ZXJ5KSwgdGhvc2UgcGFydHMgd2lsbCBiZSBhZGRlZCB0byB0aGlzIFVSTCBhcyB3ZWxsLlxuICAgICAqL1xuICAgIHNldEhvc3QoaG9zdCkge1xuICAgICAgICBpZiAoIWhvc3QpIHtcbiAgICAgICAgICAgIHRoaXMuX2hvc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldChob3N0LCBcIlNDSEVNRV9PUl9IT1NUXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgaG9zdCB0aGF0IGhhcyBiZWVuIHNldCBpbiB0aGlzIFVSTC5cbiAgICAgKi9cbiAgICBnZXRIb3N0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faG9zdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBwb3J0IGZvciB0aGlzIFVSTC4gSWYgdGhlIHByb3ZpZGVkIHBvcnQgY29udGFpbnMgb3RoZXIgcGFydHMgb2YgYSBVUkwgKHN1Y2ggYXMgYVxuICAgICAqIHBhdGggb3IgcXVlcnkpLCB0aG9zZSBwYXJ0cyB3aWxsIGJlIGFkZGVkIHRvIHRoaXMgVVJMIGFzIHdlbGwuXG4gICAgICovXG4gICAgc2V0UG9ydChwb3J0KSB7XG4gICAgICAgIGlmIChwb3J0ID09PSB1bmRlZmluZWQgfHwgcG9ydCA9PT0gbnVsbCB8fCBwb3J0ID09PSBcIlwiKSB7XG4gICAgICAgICAgICB0aGlzLl9wb3J0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXQocG9ydC50b1N0cmluZygpLCBcIlBPUlRcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwb3J0IHRoYXQgaGFzIGJlZW4gc2V0IGluIHRoaXMgVVJMLlxuICAgICAqL1xuICAgIGdldFBvcnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3J0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHBhdGggZm9yIHRoaXMgVVJMLiBJZiB0aGUgcHJvdmlkZWQgcGF0aCBjb250YWlucyBhIHF1ZXJ5LCB0aGVuIGl0IHdpbGwgYmUgYWRkZWQgdG9cbiAgICAgKiB0aGlzIFVSTCBhcyB3ZWxsLlxuICAgICAqL1xuICAgIHNldFBhdGgocGF0aCkge1xuICAgICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgICAgIHRoaXMuX3BhdGggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzY2hlbWVJbmRleCA9IHBhdGguaW5kZXhPZihcIjovL1wiKTtcbiAgICAgICAgICAgIGlmIChzY2hlbWVJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWVTdGFydCA9IHBhdGgubGFzdEluZGV4T2YoXCIvXCIsIHNjaGVtZUluZGV4KTtcbiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdG8gb25seSBncmFiIHRoZSBVUkwgcGFydCBvZiB0aGUgcGF0aCBiZWZvcmUgc2V0dGluZyB0aGUgc3RhdGUgYmFjayB0byBTQ0hFTUVcbiAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgaGFuZGxlIGNhc2VzIHN1Y2ggYXMgXCIvYS9iL2MvaHR0cHM6Ly9taWNyb3NvZnQuY29tXCIgPT4gXCJodHRwczovL21pY3Jvc29mdC5jb21cIlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0KHNjaGVtZVN0YXJ0ID09PSAtMSA/IHBhdGggOiBwYXRoLnN1YnN0cihzY2hlbWVTdGFydCArIDEpLCBcIlNDSEVNRVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KHBhdGgsIFwiUEFUSFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBcHBlbmQgdGhlIHByb3ZpZGVkIHBhdGggdG8gdGhpcyBVUkwncyBleGlzdGluZyBwYXRoLiBJZiB0aGUgcHJvdmlkZWQgcGF0aCBjb250YWlucyBhIHF1ZXJ5LFxuICAgICAqIHRoZW4gaXQgd2lsbCBiZSBhZGRlZCB0byB0aGlzIFVSTCBhcyB3ZWxsLlxuICAgICAqL1xuICAgIGFwcGVuZFBhdGgocGF0aCkge1xuICAgICAgICBpZiAocGF0aCkge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRQYXRoID0gdGhpcy5nZXRQYXRoKCk7XG4gICAgICAgICAgICBpZiAoY3VycmVudFBhdGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRQYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCArPSBcIi9cIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXRoID0gY3VycmVudFBhdGggKyBwYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXQocGF0aCwgXCJQQVRIXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcGF0aCB0aGF0IGhhcyBiZWVuIHNldCBpbiB0aGlzIFVSTC5cbiAgICAgKi9cbiAgICBnZXRQYXRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGF0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBxdWVyeSBpbiB0aGlzIFVSTC5cbiAgICAgKi9cbiAgICBzZXRRdWVyeShxdWVyeSkge1xuICAgICAgICBpZiAoIXF1ZXJ5KSB7XG4gICAgICAgICAgICB0aGlzLl9xdWVyeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3F1ZXJ5ID0gVVJMUXVlcnkucGFyc2UocXVlcnkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBhIHF1ZXJ5IHBhcmFtZXRlciB3aXRoIHRoZSBwcm92aWRlZCBuYW1lIGFuZCB2YWx1ZSBpbiB0aGlzIFVSTCdzIHF1ZXJ5LiBJZiB0aGUgcHJvdmlkZWRcbiAgICAgKiBxdWVyeSBwYXJhbWV0ZXIgdmFsdWUgaXMgdW5kZWZpbmVkIG9yIGVtcHR5LCB0aGVuIHRoZSBxdWVyeSBwYXJhbWV0ZXIgd2lsbCBiZSByZW1vdmVkIGlmIGl0XG4gICAgICogZXhpc3RlZC5cbiAgICAgKi9cbiAgICBzZXRRdWVyeVBhcmFtZXRlcihxdWVyeVBhcmFtZXRlck5hbWUsIHF1ZXJ5UGFyYW1ldGVyVmFsdWUpIHtcbiAgICAgICAgaWYgKHF1ZXJ5UGFyYW1ldGVyTmFtZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9xdWVyeSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3F1ZXJ5ID0gbmV3IFVSTFF1ZXJ5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9xdWVyeS5zZXQocXVlcnlQYXJhbWV0ZXJOYW1lLCBxdWVyeVBhcmFtZXRlclZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXIgd2l0aCB0aGUgcHJvdmlkZWQgcXVlcnkgcGFyYW1ldGVyIG5hbWUuIElmIG5vIHF1ZXJ5XG4gICAgICogcGFyYW1ldGVyIGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLCB0aGVuIHVuZGVmaW5lZCB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqL1xuICAgIGdldFF1ZXJ5UGFyYW1ldGVyVmFsdWUocXVlcnlQYXJhbWV0ZXJOYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9xdWVyeSA/IHRoaXMuX3F1ZXJ5LmdldChxdWVyeVBhcmFtZXRlck5hbWUpIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHF1ZXJ5IGluIHRoaXMgVVJMLlxuICAgICAqL1xuICAgIGdldFF1ZXJ5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcXVlcnkgPyB0aGlzLl9xdWVyeS50b1N0cmluZygpIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHBhcnRzIG9mIHRoaXMgVVJMIGJ5IHBhcnNpbmcgdGhlIHByb3ZpZGVkIHRleHQgdXNpbmcgdGhlIHByb3ZpZGVkIHN0YXJ0U3RhdGUuXG4gICAgICovXG4gICAgc2V0KHRleHQsIHN0YXJ0U3RhdGUpIHtcbiAgICAgICAgY29uc3QgdG9rZW5pemVyID0gbmV3IFVSTFRva2VuaXplcih0ZXh0LCBzdGFydFN0YXRlKTtcbiAgICAgICAgd2hpbGUgKHRva2VuaXplci5uZXh0KCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5pemVyLmN1cnJlbnQoKTtcbiAgICAgICAgICAgIGxldCB0b2tlblBhdGg7XG4gICAgICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlNDSEVNRVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2NoZW1lID0gdG9rZW4udGV4dCB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkhPU1RcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hvc3QgPSB0b2tlbi50ZXh0IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUE9SVFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcG9ydCA9IHRva2VuLnRleHQgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJQQVRIXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlblBhdGggPSB0b2tlbi50ZXh0IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fcGF0aCB8fCB0aGlzLl9wYXRoID09PSBcIi9cIiB8fCB0b2tlblBhdGggIT09IFwiL1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGF0aCA9IHRva2VuUGF0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUVVFUllcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3F1ZXJ5ID0gVVJMUXVlcnkucGFyc2UodG9rZW4udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIFVSTFRva2VuVHlwZTogJHt0b2tlbi50eXBlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemVzIHRoZSBVUkwgYXMgYSBzdHJpbmcuXG4gICAgICogQHJldHVybnMgdGhlIFVSTCBhcyBhIHN0cmluZy5cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGlmICh0aGlzLl9zY2hlbWUpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBgJHt0aGlzLl9zY2hlbWV9Oi8vYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faG9zdCkge1xuICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMuX2hvc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3BvcnQpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBgOiR7dGhpcy5fcG9ydH1gO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9wYXRoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3BhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIvXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgKz0gdGhpcy5fcGF0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcXVlcnkgJiYgdGhpcy5fcXVlcnkuYW55KCkpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBgPyR7dGhpcy5fcXVlcnkudG9TdHJpbmcoKX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRoZSBwcm92aWRlZCBzZWFyY2hWYWx1ZSBpcyBmb3VuZCBpbiB0aGlzIFVSTEJ1aWxkZXIsIHRoZW4gcmVwbGFjZSBpdCB3aXRoIHRoZSBwcm92aWRlZFxuICAgICAqIHJlcGxhY2VWYWx1ZS5cbiAgICAgKi9cbiAgICByZXBsYWNlQWxsKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpIHtcbiAgICAgICAgaWYgKHNlYXJjaFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnNldFNjaGVtZShyZXBsYWNlQWxsKHRoaXMuZ2V0U2NoZW1lKCksIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpKTtcbiAgICAgICAgICAgIHRoaXMuc2V0SG9zdChyZXBsYWNlQWxsKHRoaXMuZ2V0SG9zdCgpLCBzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKSk7XG4gICAgICAgICAgICB0aGlzLnNldFBvcnQocmVwbGFjZUFsbCh0aGlzLmdldFBvcnQoKSwgc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSkpO1xuICAgICAgICAgICAgdGhpcy5zZXRQYXRoKHJlcGxhY2VBbGwodGhpcy5nZXRQYXRoKCksIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpKTtcbiAgICAgICAgICAgIHRoaXMuc2V0UXVlcnkocmVwbGFjZUFsbCh0aGlzLmdldFF1ZXJ5KCksIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBnaXZlbiBzdHJpbmcgVVJMIGludG8gYSBuZXcge0BsaW5rIFVSTEJ1aWxkZXJ9LlxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZSh0ZXh0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVUkxCdWlsZGVyKCk7XG4gICAgICAgIHJlc3VsdC5zZXQodGV4dCwgXCJTQ0hFTUVfT1JfSE9TVFwiKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgVVJMVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKHRleHQsIHR5cGUpIHtcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB9XG4gICAgc3RhdGljIHNjaGVtZSh0ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgVVJMVG9rZW4odGV4dCwgXCJTQ0hFTUVcIik7XG4gICAgfVxuICAgIHN0YXRpYyBob3N0KHRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVUkxUb2tlbih0ZXh0LCBcIkhPU1RcIik7XG4gICAgfVxuICAgIHN0YXRpYyBwb3J0KHRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVUkxUb2tlbih0ZXh0LCBcIlBPUlRcIik7XG4gICAgfVxuICAgIHN0YXRpYyBwYXRoKHRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVUkxUb2tlbih0ZXh0LCBcIlBBVEhcIik7XG4gICAgfVxuICAgIHN0YXRpYyBxdWVyeSh0ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgVVJMVG9rZW4odGV4dCwgXCJRVUVSWVwiKTtcbiAgICB9XG59XG4vKipcbiAqIEdldCB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvdmlkZWQgY2hhcmFjdGVyIChzaW5nbGUgY2hhcmFjdGVyIHN0cmluZykgaXMgYW4gYWxwaGFudW1lcmljIChsZXR0ZXIgb3JcbiAqIGRpZ2l0KSBjaGFyYWN0ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FscGhhTnVtZXJpY0NoYXJhY3RlcihjaGFyYWN0ZXIpIHtcbiAgICBjb25zdCBjaGFyYWN0ZXJDb2RlID0gY2hhcmFjdGVyLmNoYXJDb2RlQXQoMCk7XG4gICAgcmV0dXJuICgoNDggLyogJzAnICovIDw9IGNoYXJhY3RlckNvZGUgJiYgY2hhcmFjdGVyQ29kZSA8PSA1NykgLyogJzknICovIHx8XG4gICAgICAgICg2NSAvKiAnQScgKi8gPD0gY2hhcmFjdGVyQ29kZSAmJiBjaGFyYWN0ZXJDb2RlIDw9IDkwKSAvKiAnWicgKi8gfHxcbiAgICAgICAgKDk3IC8qICdhJyAqLyA8PSBjaGFyYWN0ZXJDb2RlICYmIGNoYXJhY3RlckNvZGUgPD0gMTIyKSAvKiAneicgKi8pO1xufVxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgdG9rZW5pemVzIFVSTCBzdHJpbmdzLlxuICovXG5leHBvcnQgY2xhc3MgVVJMVG9rZW5pemVyIHtcbiAgICBjb25zdHJ1Y3RvcihfdGV4dCwgc3RhdGUpIHtcbiAgICAgICAgdGhpcy5fdGV4dCA9IF90ZXh0O1xuICAgICAgICB0aGlzLl90ZXh0TGVuZ3RoID0gX3RleHQgPyBfdGV4dC5sZW5ndGggOiAwO1xuICAgICAgICB0aGlzLl9jdXJyZW50U3RhdGUgPSBzdGF0ZSAhPT0gdW5kZWZpbmVkICYmIHN0YXRlICE9PSBudWxsID8gc3RhdGUgOiBcIlNDSEVNRV9PUl9IT1NUXCI7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRJbmRleCA9IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBVUkxUb2tlbiB0aGlzIFVSTFRva2VuaXplciBpcyBwb2ludGluZyBhdCwgb3IgdW5kZWZpbmVkIGlmIHRoZSBVUkxUb2tlbml6ZXJcbiAgICAgKiBoYXNuJ3Qgc3RhcnRlZCBvciBoYXMgZmluaXNoZWQgdG9rZW5pemluZy5cbiAgICAgKi9cbiAgICBjdXJyZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudFRva2VuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZHZhbmNlIHRvIHRoZSBuZXh0IFVSTFRva2VuIGFuZCByZXR1cm4gd2hldGhlciBvciBub3QgYSBVUkxUb2tlbiB3YXMgZm91bmQuXG4gICAgICovXG4gICAgbmV4dCgpIHtcbiAgICAgICAgaWYgKCFoYXNDdXJyZW50Q2hhcmFjdGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VG9rZW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuX2N1cnJlbnRTdGF0ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJTQ0hFTUVcIjpcbiAgICAgICAgICAgICAgICAgICAgbmV4dFNjaGVtZSh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlNDSEVNRV9PUl9IT1NUXCI6XG4gICAgICAgICAgICAgICAgICAgIG5leHRTY2hlbWVPckhvc3QodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJIT1NUXCI6XG4gICAgICAgICAgICAgICAgICAgIG5leHRIb3N0KHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiUE9SVFwiOlxuICAgICAgICAgICAgICAgICAgICBuZXh0UG9ydCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlBBVEhcIjpcbiAgICAgICAgICAgICAgICAgICAgbmV4dFBhdGgodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJRVUVSWVwiOlxuICAgICAgICAgICAgICAgICAgICBuZXh0UXVlcnkodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIFVSTFRva2VuaXplclN0YXRlOiAke3RoaXMuX2N1cnJlbnRTdGF0ZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gISF0aGlzLl9jdXJyZW50VG9rZW47XG4gICAgfVxufVxuLyoqXG4gKiBSZWFkIHRoZSByZW1haW5pbmcgY2hhcmFjdGVycyBmcm9tIHRoaXMgVG9rZW5pemVyJ3MgY2hhcmFjdGVyIHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gcmVhZFJlbWFpbmluZyh0b2tlbml6ZXIpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBpZiAodG9rZW5pemVyLl9jdXJyZW50SW5kZXggPCB0b2tlbml6ZXIuX3RleHRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0ID0gdG9rZW5pemVyLl90ZXh0LnN1YnN0cmluZyh0b2tlbml6ZXIuX2N1cnJlbnRJbmRleCk7XG4gICAgICAgIHRva2VuaXplci5fY3VycmVudEluZGV4ID0gdG9rZW5pemVyLl90ZXh0TGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBXaGV0aGVyIG9yIG5vdCB0aGlzIFVSTFRva2VuaXplciBoYXMgYSBjdXJyZW50IGNoYXJhY3Rlci5cbiAqL1xuZnVuY3Rpb24gaGFzQ3VycmVudENoYXJhY3Rlcih0b2tlbml6ZXIpIHtcbiAgICByZXR1cm4gdG9rZW5pemVyLl9jdXJyZW50SW5kZXggPCB0b2tlbml6ZXIuX3RleHRMZW5ndGg7XG59XG4vKipcbiAqIEdldCB0aGUgY2hhcmFjdGVyIGluIHRoZSB0ZXh0IHN0cmluZyBhdCB0aGUgY3VycmVudCBpbmRleC5cbiAqL1xuZnVuY3Rpb24gZ2V0Q3VycmVudENoYXJhY3Rlcih0b2tlbml6ZXIpIHtcbiAgICByZXR1cm4gdG9rZW5pemVyLl90ZXh0W3Rva2VuaXplci5fY3VycmVudEluZGV4XTtcbn1cbi8qKlxuICogQWR2YW5jZSB0byB0aGUgY2hhcmFjdGVyIGluIHRleHQgdGhhdCBpcyBcInN0ZXBcIiBjaGFyYWN0ZXJzIGFoZWFkLiBJZiBubyBzdGVwIHZhbHVlIGlzIHByb3ZpZGVkLFxuICogdGhlbiBzdGVwIHdpbGwgZGVmYXVsdCB0byAxLlxuICovXG5mdW5jdGlvbiBuZXh0Q2hhcmFjdGVyKHRva2VuaXplciwgc3RlcCkge1xuICAgIGlmIChoYXNDdXJyZW50Q2hhcmFjdGVyKHRva2VuaXplcikpIHtcbiAgICAgICAgaWYgKCFzdGVwKSB7XG4gICAgICAgICAgICBzdGVwID0gMTtcbiAgICAgICAgfVxuICAgICAgICB0b2tlbml6ZXIuX2N1cnJlbnRJbmRleCArPSBzdGVwO1xuICAgIH1cbn1cbi8qKlxuICogU3RhcnRpbmcgd2l0aCB0aGUgY3VycmVudCBjaGFyYWN0ZXIsIHBlZWsgXCJjaGFyYWN0ZXJzVG9QZWVrXCIgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWhlYWQgaW4gdGhpc1xuICogVG9rZW5pemVyJ3Mgc3RyZWFtIG9mIGNoYXJhY3RlcnMuXG4gKi9cbmZ1bmN0aW9uIHBlZWtDaGFyYWN0ZXJzKHRva2VuaXplciwgY2hhcmFjdGVyc1RvUGVlaykge1xuICAgIGxldCBlbmRJbmRleCA9IHRva2VuaXplci5fY3VycmVudEluZGV4ICsgY2hhcmFjdGVyc1RvUGVlaztcbiAgICBpZiAodG9rZW5pemVyLl90ZXh0TGVuZ3RoIDwgZW5kSW5kZXgpIHtcbiAgICAgICAgZW5kSW5kZXggPSB0b2tlbml6ZXIuX3RleHRMZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiB0b2tlbml6ZXIuX3RleHQuc3Vic3RyaW5nKHRva2VuaXplci5fY3VycmVudEluZGV4LCBlbmRJbmRleCk7XG59XG4vKipcbiAqIFJlYWQgY2hhcmFjdGVycyBmcm9tIHRoaXMgVG9rZW5pemVyIHVudGlsIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBvciB1bnRpbCB0aGUgcHJvdmlkZWQgY29uZGl0aW9uXG4gKiBpcyBmYWxzZSB3aGVuIHByb3ZpZGVkIHRoZSBjdXJyZW50IGNoYXJhY3Rlci5cbiAqL1xuZnVuY3Rpb24gcmVhZFdoaWxlKHRva2VuaXplciwgY29uZGl0aW9uKSB7XG4gICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgd2hpbGUgKGhhc0N1cnJlbnRDaGFyYWN0ZXIodG9rZW5pemVyKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50Q2hhcmFjdGVyID0gZ2V0Q3VycmVudENoYXJhY3Rlcih0b2tlbml6ZXIpO1xuICAgICAgICBpZiAoIWNvbmRpdGlvbihjdXJyZW50Q2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gY3VycmVudENoYXJhY3RlcjtcbiAgICAgICAgICAgIG5leHRDaGFyYWN0ZXIodG9rZW5pemVyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBSZWFkIGNoYXJhY3RlcnMgZnJvbSB0aGlzIFRva2VuaXplciB1bnRpbCBhIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVyIG9yIHRoZSBlbmQgb2YgdGhlXG4gKiBjaGFyYWN0ZXIgc3RyZWFtIGlzIHJlYWNoZWQuXG4gKi9cbmZ1bmN0aW9uIHJlYWRXaGlsZUxldHRlck9yRGlnaXQodG9rZW5pemVyKSB7XG4gICAgcmV0dXJuIHJlYWRXaGlsZSh0b2tlbml6ZXIsIChjaGFyYWN0ZXIpID0+IGlzQWxwaGFOdW1lcmljQ2hhcmFjdGVyKGNoYXJhY3RlcikpO1xufVxuLyoqXG4gKiBSZWFkIGNoYXJhY3RlcnMgZnJvbSB0aGlzIFRva2VuaXplciB1bnRpbCBvbmUgb2YgdGhlIHByb3ZpZGVkIHRlcm1pbmF0aW5nIGNoYXJhY3RlcnMgaXMgcmVhZCBvclxuICogdGhlIGVuZCBvZiB0aGUgY2hhcmFjdGVyIHN0cmVhbSBpcyByZWFjaGVkLlxuICovXG5mdW5jdGlvbiByZWFkVW50aWxDaGFyYWN0ZXIodG9rZW5pemVyLCAuLi50ZXJtaW5hdGluZ0NoYXJhY3RlcnMpIHtcbiAgICByZXR1cm4gcmVhZFdoaWxlKHRva2VuaXplciwgKGNoYXJhY3RlcikgPT4gdGVybWluYXRpbmdDaGFyYWN0ZXJzLmluZGV4T2YoY2hhcmFjdGVyKSA9PT0gLTEpO1xufVxuZnVuY3Rpb24gbmV4dFNjaGVtZSh0b2tlbml6ZXIpIHtcbiAgICBjb25zdCBzY2hlbWUgPSByZWFkV2hpbGVMZXR0ZXJPckRpZ2l0KHRva2VuaXplcik7XG4gICAgdG9rZW5pemVyLl9jdXJyZW50VG9rZW4gPSBVUkxUb2tlbi5zY2hlbWUoc2NoZW1lKTtcbiAgICBpZiAoIWhhc0N1cnJlbnRDaGFyYWN0ZXIodG9rZW5pemVyKSkge1xuICAgICAgICB0b2tlbml6ZXIuX2N1cnJlbnRTdGF0ZSA9IFwiRE9ORVwiO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdG9rZW5pemVyLl9jdXJyZW50U3RhdGUgPSBcIkhPU1RcIjtcbiAgICB9XG59XG5mdW5jdGlvbiBuZXh0U2NoZW1lT3JIb3N0KHRva2VuaXplcikge1xuICAgIGNvbnN0IHNjaGVtZU9ySG9zdCA9IHJlYWRVbnRpbENoYXJhY3Rlcih0b2tlbml6ZXIsIFwiOlwiLCBcIi9cIiwgXCI/XCIpO1xuICAgIGlmICghaGFzQ3VycmVudENoYXJhY3Rlcih0b2tlbml6ZXIpKSB7XG4gICAgICAgIHRva2VuaXplci5fY3VycmVudFRva2VuID0gVVJMVG9rZW4uaG9zdChzY2hlbWVPckhvc3QpO1xuICAgICAgICB0b2tlbml6ZXIuX2N1cnJlbnRTdGF0ZSA9IFwiRE9ORVwiO1xuICAgIH1cbiAgICBlbHNlIGlmIChnZXRDdXJyZW50Q2hhcmFjdGVyKHRva2VuaXplcikgPT09IFwiOlwiKSB7XG4gICAgICAgIGlmIChwZWVrQ2hhcmFjdGVycyh0b2tlbml6ZXIsIDMpID09PSBcIjovL1wiKSB7XG4gICAgICAgICAgICB0b2tlbml6ZXIuX2N1cnJlbnRUb2tlbiA9IFVSTFRva2VuLnNjaGVtZShzY2hlbWVPckhvc3QpO1xuICAgICAgICAgICAgdG9rZW5pemVyLl9jdXJyZW50U3RhdGUgPSBcIkhPU1RcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRva2VuaXplci5fY3VycmVudFRva2VuID0gVVJMVG9rZW4uaG9zdChzY2hlbWVPckhvc3QpO1xuICAgICAgICAgICAgdG9rZW5pemVyLl9jdXJyZW50U3RhdGUgPSBcIlBPUlRcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdG9rZW5pemVyLl9jdXJyZW50VG9rZW4gPSBVUkxUb2tlbi5ob3N0KHNjaGVtZU9ySG9zdCk7XG4gICAgICAgIGlmIChnZXRDdXJyZW50Q2hhcmFjdGVyKHRva2VuaXplcikgPT09IFwiL1wiKSB7XG4gICAgICAgICAgICB0b2tlbml6ZXIuX2N1cnJlbnRTdGF0ZSA9IFwiUEFUSFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdG9rZW5pemVyLl9jdXJyZW50U3RhdGUgPSBcIlFVRVJZXCI7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBuZXh0SG9zdCh0b2tlbml6ZXIpIHtcbiAgICBpZiAocGVla0NoYXJhY3RlcnModG9rZW5pemVyLCAzKSA9PT0gXCI6Ly9cIikge1xuICAgICAgICBuZXh0Q2hhcmFjdGVyKHRva2VuaXplciwgMyk7XG4gICAgfVxuICAgIGNvbnN0IGhvc3QgPSByZWFkVW50aWxDaGFyYWN0ZXIodG9rZW5pemVyLCBcIjpcIiwgXCIvXCIsIFwiP1wiKTtcbiAgICB0b2tlbml6ZXIuX2N1cnJlbnRUb2tlbiA9IFVSTFRva2VuLmhvc3QoaG9zdCk7XG4gICAgaWYgKCFoYXNDdXJyZW50Q2hhcmFjdGVyKHRva2VuaXplcikpIHtcbiAgICAgICAgdG9rZW5pemVyLl9jdXJyZW50U3RhdGUgPSBcIkRPTkVcIjtcbiAgICB9XG4gICAgZWxzZSBpZiAoZ2V0Q3VycmVudENoYXJhY3Rlcih0b2tlbml6ZXIpID09PSBcIjpcIikge1xuICAgICAgICB0b2tlbml6ZXIuX2N1cnJlbnRTdGF0ZSA9IFwiUE9SVFwiO1xuICAgIH1cbiAgICBlbHNlIGlmIChnZXRDdXJyZW50Q2hhcmFjdGVyKHRva2VuaXplcikgPT09IFwiL1wiKSB7XG4gICAgICAgIHRva2VuaXplci5fY3VycmVudFN0YXRlID0gXCJQQVRIXCI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0b2tlbml6ZXIuX2N1cnJlbnRTdGF0ZSA9IFwiUVVFUllcIjtcbiAgICB9XG59XG5mdW5jdGlvbiBuZXh0UG9ydCh0b2tlbml6ZXIpIHtcbiAgICBpZiAoZ2V0Q3VycmVudENoYXJhY3Rlcih0b2tlbml6ZXIpID09PSBcIjpcIikge1xuICAgICAgICBuZXh0Q2hhcmFjdGVyKHRva2VuaXplcik7XG4gICAgfVxuICAgIGNvbnN0IHBvcnQgPSByZWFkVW50aWxDaGFyYWN0ZXIodG9rZW5pemVyLCBcIi9cIiwgXCI/XCIpO1xuICAgIHRva2VuaXplci5fY3VycmVudFRva2VuID0gVVJMVG9rZW4ucG9ydChwb3J0KTtcbiAgICBpZiAoIWhhc0N1cnJlbnRDaGFyYWN0ZXIodG9rZW5pemVyKSkge1xuICAgICAgICB0b2tlbml6ZXIuX2N1cnJlbnRTdGF0ZSA9IFwiRE9ORVwiO1xuICAgIH1cbiAgICBlbHNlIGlmIChnZXRDdXJyZW50Q2hhcmFjdGVyKHRva2VuaXplcikgPT09IFwiL1wiKSB7XG4gICAgICAgIHRva2VuaXplci5fY3VycmVudFN0YXRlID0gXCJQQVRIXCI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0b2tlbml6ZXIuX2N1cnJlbnRTdGF0ZSA9IFwiUVVFUllcIjtcbiAgICB9XG59XG5mdW5jdGlvbiBuZXh0UGF0aCh0b2tlbml6ZXIpIHtcbiAgICBjb25zdCBwYXRoID0gcmVhZFVudGlsQ2hhcmFjdGVyKHRva2VuaXplciwgXCI/XCIpO1xuICAgIHRva2VuaXplci5fY3VycmVudFRva2VuID0gVVJMVG9rZW4ucGF0aChwYXRoKTtcbiAgICBpZiAoIWhhc0N1cnJlbnRDaGFyYWN0ZXIodG9rZW5pemVyKSkge1xuICAgICAgICB0b2tlbml6ZXIuX2N1cnJlbnRTdGF0ZSA9IFwiRE9ORVwiO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdG9rZW5pemVyLl9jdXJyZW50U3RhdGUgPSBcIlFVRVJZXCI7XG4gICAgfVxufVxuZnVuY3Rpb24gbmV4dFF1ZXJ5KHRva2VuaXplcikge1xuICAgIGlmIChnZXRDdXJyZW50Q2hhcmFjdGVyKHRva2VuaXplcikgPT09IFwiP1wiKSB7XG4gICAgICAgIG5leHRDaGFyYWN0ZXIodG9rZW5pemVyKTtcbiAgICB9XG4gICAgY29uc3QgcXVlcnkgPSByZWFkUmVtYWluaW5nKHRva2VuaXplcik7XG4gICAgdG9rZW5pemVyLl9jdXJyZW50VG9rZW4gPSBVUkxUb2tlbi5xdWVyeShxdWVyeSk7XG4gICAgdG9rZW5pemVyLl9jdXJyZW50U3RhdGUgPSBcIkRPTkVcIjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVybC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IFVSTEJ1aWxkZXIsIFVSTFF1ZXJ5IH0gZnJvbSBcIi4uL3VybFwiO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tIFwiLi91dGlsc1wiO1xuY29uc3QgUmVkYWN0ZWRTdHJpbmcgPSBcIlJFREFDVEVEXCI7XG5jb25zdCBkZWZhdWx0QWxsb3dlZEhlYWRlck5hbWVzID0gW1xuICAgIFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgIFwieC1tcy1yZXR1cm4tY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICBcIngtbXMtdXNlcmFnZW50XCIsXG4gICAgXCJ4LW1zLWNvcnJlbGF0aW9uLXJlcXVlc3QtaWRcIixcbiAgICBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgIFwiY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICBcIm1zLWN2XCIsXG4gICAgXCJyZXR1cm4tY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICBcInRyYWNlcGFyZW50XCIsXG4gICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFsc1wiLFxuICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVyc1wiLFxuICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kc1wiLFxuICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCIsXG4gICAgXCJBY2Nlc3MtQ29udHJvbC1FeHBvc2UtSGVhZGVyc1wiLFxuICAgIFwiQWNjZXNzLUNvbnRyb2wtTWF4LUFnZVwiLFxuICAgIFwiQWNjZXNzLUNvbnRyb2wtUmVxdWVzdC1IZWFkZXJzXCIsXG4gICAgXCJBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LU1ldGhvZFwiLFxuICAgIFwiT3JpZ2luXCIsXG4gICAgXCJBY2NlcHRcIixcbiAgICBcIkFjY2VwdC1FbmNvZGluZ1wiLFxuICAgIFwiQ2FjaGUtQ29udHJvbFwiLFxuICAgIFwiQ29ubmVjdGlvblwiLFxuICAgIFwiQ29udGVudC1MZW5ndGhcIixcbiAgICBcIkNvbnRlbnQtVHlwZVwiLFxuICAgIFwiRGF0ZVwiLFxuICAgIFwiRVRhZ1wiLFxuICAgIFwiRXhwaXJlc1wiLFxuICAgIFwiSWYtTWF0Y2hcIixcbiAgICBcIklmLU1vZGlmaWVkLVNpbmNlXCIsXG4gICAgXCJJZi1Ob25lLU1hdGNoXCIsXG4gICAgXCJJZi1Vbm1vZGlmaWVkLVNpbmNlXCIsXG4gICAgXCJMYXN0LU1vZGlmaWVkXCIsXG4gICAgXCJQcmFnbWFcIixcbiAgICBcIlJlcXVlc3QtSWRcIixcbiAgICBcIlJldHJ5LUFmdGVyXCIsXG4gICAgXCJTZXJ2ZXJcIixcbiAgICBcIlRyYW5zZmVyLUVuY29kaW5nXCIsXG4gICAgXCJVc2VyLUFnZW50XCIsXG4gICAgXCJXV1ctQXV0aGVudGljYXRlXCIsXG5dO1xuY29uc3QgZGVmYXVsdEFsbG93ZWRRdWVyeVBhcmFtZXRlcnMgPSBbXCJhcGktdmVyc2lvblwiXTtcbmV4cG9ydCBjbGFzcyBTYW5pdGl6ZXIge1xuICAgIGNvbnN0cnVjdG9yKHsgYWxsb3dlZEhlYWRlck5hbWVzID0gW10sIGFsbG93ZWRRdWVyeVBhcmFtZXRlcnMgPSBbXSB9ID0ge30pIHtcbiAgICAgICAgYWxsb3dlZEhlYWRlck5hbWVzID0gQXJyYXkuaXNBcnJheShhbGxvd2VkSGVhZGVyTmFtZXMpXG4gICAgICAgICAgICA/IGRlZmF1bHRBbGxvd2VkSGVhZGVyTmFtZXMuY29uY2F0KGFsbG93ZWRIZWFkZXJOYW1lcylcbiAgICAgICAgICAgIDogZGVmYXVsdEFsbG93ZWRIZWFkZXJOYW1lcztcbiAgICAgICAgYWxsb3dlZFF1ZXJ5UGFyYW1ldGVycyA9IEFycmF5LmlzQXJyYXkoYWxsb3dlZFF1ZXJ5UGFyYW1ldGVycylcbiAgICAgICAgICAgID8gZGVmYXVsdEFsbG93ZWRRdWVyeVBhcmFtZXRlcnMuY29uY2F0KGFsbG93ZWRRdWVyeVBhcmFtZXRlcnMpXG4gICAgICAgICAgICA6IGRlZmF1bHRBbGxvd2VkUXVlcnlQYXJhbWV0ZXJzO1xuICAgICAgICB0aGlzLmFsbG93ZWRIZWFkZXJOYW1lcyA9IG5ldyBTZXQoYWxsb3dlZEhlYWRlck5hbWVzLm1hcCgobikgPT4gbi50b0xvd2VyQ2FzZSgpKSk7XG4gICAgICAgIHRoaXMuYWxsb3dlZFF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBTZXQoYWxsb3dlZFF1ZXJ5UGFyYW1ldGVycy5tYXAoKHApID0+IHAudG9Mb3dlckNhc2UoKSkpO1xuICAgIH1cbiAgICBzYW5pdGl6ZShvYmopIHtcbiAgICAgICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaiwgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIC8vIEVuc3VyZSBFcnJvcnMgaW5jbHVkZSB0aGVpciBpbnRlcmVzdGluZyBub24tZW51bWVyYWJsZSBtZW1iZXJzXG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHZhbHVlKSwgeyBuYW1lOiB2YWx1ZS5uYW1lLCBtZXNzYWdlOiB2YWx1ZS5tZXNzYWdlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGtleSA9PT0gXCJfaGVhZGVyc01hcFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVIZWFkZXJzKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGtleSA9PT0gXCJ1cmxcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNhbml0aXplVXJsKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGtleSA9PT0gXCJxdWVyeVwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVRdWVyeSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChrZXkgPT09IFwiYm9keVwiKSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgbG9nIHRoZSByZXF1ZXN0IGJvZHlcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoa2V5ID09PSBcInJlc3BvbnNlXCIpIHtcbiAgICAgICAgICAgICAgICAvLyBEb24ndCBsb2cgcmVzcG9uc2UgYWdhaW5cbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoa2V5ID09PSBcIm9wZXJhdGlvblNwZWNcIikge1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgc2VuZE9wZXJhdGlvblJlcXVlc3QsIHRoZSByZXF1ZXN0IGNhcnJpZXMgYSBtYXNzaXZlXG4gICAgICAgICAgICAgICAgLy8gZmllbGQgd2l0aCB0aGUgYXV0b3Jlc3Qgc3BlYy4gTm8gbmVlZCB0byBsb2cgaXQuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWVuLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW0NpcmN1bGFyXVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0sIDIpO1xuICAgIH1cbiAgICBzYW5pdGl6ZUhlYWRlcnModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVPYmplY3QodmFsdWUsIHRoaXMuYWxsb3dlZEhlYWRlck5hbWVzLCAodiwgaykgPT4gdltrXS52YWx1ZSk7XG4gICAgfVxuICAgIHNhbml0aXplUXVlcnkodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVPYmplY3QodmFsdWUsIHRoaXMuYWxsb3dlZFF1ZXJ5UGFyYW1ldGVycywgKHYsIGspID0+IHZba10pO1xuICAgIH1cbiAgICBzYW5pdGl6ZU9iamVjdCh2YWx1ZSwgYWxsb3dlZEtleXMsIGFjY2Vzc29yKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzYW5pdGl6ZWQgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKGFsbG93ZWRLZXlzLmhhcyhrLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgc2FuaXRpemVkW2tdID0gYWNjZXNzb3IodmFsdWUsIGspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2FuaXRpemVkW2tdID0gUmVkYWN0ZWRTdHJpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNhbml0aXplZDtcbiAgICB9XG4gICAgc2FuaXRpemVVcmwodmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBVUkxCdWlsZGVyLnBhcnNlKHZhbHVlKTtcbiAgICAgICAgY29uc3QgcXVlcnlTdHJpbmcgPSB1cmxCdWlsZGVyLmdldFF1ZXJ5KCk7XG4gICAgICAgIGlmICghcXVlcnlTdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBxdWVyeSA9IFVSTFF1ZXJ5LnBhcnNlKHF1ZXJ5U3RyaW5nKTtcbiAgICAgICAgZm9yIChjb25zdCBrIG9mIHF1ZXJ5LmtleXMoKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFsbG93ZWRRdWVyeVBhcmFtZXRlcnMuaGFzKGsudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICBxdWVyeS5zZXQoaywgUmVkYWN0ZWRTdHJpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHVybEJ1aWxkZXIuc2V0UXVlcnkocXVlcnkudG9TdHJpbmcoKSk7XG4gICAgICAgIHJldHVybiB1cmxCdWlsZGVyLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2FuaXRpemVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gXCJ1dGlsXCI7XG5leHBvcnQgY29uc3QgY3VzdG9tID0gaW5zcGVjdC5jdXN0b207XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnNwZWN0LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgU2FuaXRpemVyIH0gZnJvbSBcIi4vdXRpbC9zYW5pdGl6ZXJcIjtcbmltcG9ydCB7IGN1c3RvbSB9IGZyb20gXCIuL3V0aWwvaW5zcGVjdFwiO1xuY29uc3QgZXJyb3JTYW5pdGl6ZXIgPSBuZXcgU2FuaXRpemVyKCk7XG4vKipcbiAqIEFuIGVycm9yIHJlc3VsdGluZyBmcm9tIGFuIEhUVFAgcmVxdWVzdCB0byBhIHNlcnZpY2UgZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgY29kZSwgc3RhdHVzQ29kZSwgcmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUmVzdEVycm9yXCI7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG4gICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFJlc3RFcnJvci5wcm90b3R5cGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2dnaW5nIG1ldGhvZCBmb3IgdXRpbC5pbnNwZWN0IGluIE5vZGVcbiAgICAgKi9cbiAgICBbY3VzdG9tXSgpIHtcbiAgICAgICAgcmV0dXJuIGBSZXN0RXJyb3I6ICR7dGhpcy5tZXNzYWdlfSBcXG4gJHtlcnJvclNhbml0aXplci5zYW5pdGl6ZSh0aGlzKX1gO1xuICAgIH1cbn1cbi8qKlxuICogQSBjb25zdGFudCBzdHJpbmcgdG8gaWRlbnRpZnkgZXJyb3JzIHRoYXQgbWF5IGFyaXNlIHdoZW4gbWFraW5nIGFuIEhUVFAgcmVxdWVzdCB0aGF0IGluZGljYXRlcyBhbiBpc3N1ZSB3aXRoIHRoZSB0cmFuc3BvcnQgbGF5ZXIgKGUuZy4gdGhlIGhvc3RuYW1lIG9mIHRoZSBVUkwgY2Fubm90IGJlIHJlc29sdmVkIHZpYSBETlMuKVxuICovXG5SZXN0RXJyb3IuUkVRVUVTVF9TRU5EX0VSUk9SID0gXCJSRVFVRVNUX1NFTkRfRVJST1JcIjtcbi8qKlxuICogQSBjb25zdGFudCBzdHJpbmcgdG8gaWRlbnRpZnkgZXJyb3JzIHRoYXQgbWF5IGFyaXNlIGZyb20gcGFyc2luZyBhbiBpbmNvbWluZyBIVFRQIHJlc3BvbnNlLiBVc3VhbGx5IGluZGljYXRlcyBhIG1hbGZvcm1lZCBIVFRQIGJvZHksIHN1Y2ggYXMgYW4gZW5jb2RlZCBKU09OIHBheWxvYWQgdGhhdCBpcyBpbmNvbXBsZXRlLlxuICovXG5SZXN0RXJyb3IuUEFSU0VfRVJST1IgPSBcIlBBUlNFX0VSUk9SXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXN0RXJyb3IuanMubWFwIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG5cblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1Jcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sICovXG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xuICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdDtcbiAgfVxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgfVxuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gIHZhciBfLCBkb25lID0gZmFsc2U7XG4gIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgIH1cbiAgfVxuICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gIGRvbmUgPSB0cnVlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gIH1cbiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xuICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcbiAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xuICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gIH1cbn1cblxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIG9bazJdID0gbVtrXTtcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcbiAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgfVxuICB9O1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xuICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghbSkgcmV0dXJuIG87XG4gIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICB0cnkge1xuICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gIH1cbiAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gIGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICB9XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XG4gIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxuICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xuICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxuICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXG4gICAgICAgICAgcltrXSA9IGFbal07XG4gIHJldHVybiByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xuICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgfVxuICB9XG4gIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XG4gIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cbiAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxuICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cbiAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xuICB2YXIgaSwgcDtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xuICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cbiAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcbiAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cbiAgcmV0dXJuIGNvb2tlZDtcbn07XG5cbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gIG9bXCJkZWZhdWx0XCJdID0gdjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XG4gIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xuICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XG4gIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcbiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XG4gIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xuICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICB2YXIgZGlzcG9zZTtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICB9XG4gICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgfVxuICBlbHNlIGlmIChhc3luYykge1xuICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XG4gIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICB9XG4gIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICBmYWlsKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gIH1cbiAgcmV0dXJuIG5leHQoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBfX2V4dGVuZHMsXG4gIF9fYXNzaWduLFxuICBfX3Jlc3QsXG4gIF9fZGVjb3JhdGUsXG4gIF9fcGFyYW0sXG4gIF9fbWV0YWRhdGEsXG4gIF9fYXdhaXRlcixcbiAgX19nZW5lcmF0b3IsXG4gIF9fY3JlYXRlQmluZGluZyxcbiAgX19leHBvcnRTdGFyLFxuICBfX3ZhbHVlcyxcbiAgX19yZWFkLFxuICBfX3NwcmVhZCxcbiAgX19zcHJlYWRBcnJheXMsXG4gIF9fc3ByZWFkQXJyYXksXG4gIF9fYXdhaXQsXG4gIF9fYXN5bmNHZW5lcmF0b3IsXG4gIF9fYXN5bmNEZWxlZ2F0b3IsXG4gIF9fYXN5bmNWYWx1ZXMsXG4gIF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxuICBfX2ltcG9ydFN0YXIsXG4gIF9faW1wb3J0RGVmYXVsdCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEluLFxuICBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcbiAgX19kaXNwb3NlUmVzb3VyY2VzLFxufTtcbiIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxudmFyIF9hLCBfYiwgX2MsIF9kO1xuLyoqXG4gKiBBIGNvbnN0YW50IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVudmlyb25tZW50IHRoZSBjb2RlIGlzIHJ1bm5pbmcgaXMgYSBXZWIgQnJvd3Nlci5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhenVyZS9henVyZS1zZGsvdHMtbm8td2luZG93XG5leHBvcnQgY29uc3QgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiO1xuLyoqXG4gKiBBIGNvbnN0YW50IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVudmlyb25tZW50IHRoZSBjb2RlIGlzIHJ1bm5pbmcgaXMgYSBXZWIgV29ya2VyLlxuICovXG5leHBvcnQgY29uc3QgaXNXZWJXb3JrZXIgPSB0eXBlb2Ygc2VsZiA9PT0gXCJvYmplY3RcIiAmJlxuICAgIHR5cGVvZiAoc2VsZiA9PT0gbnVsbCB8fCBzZWxmID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxmLmltcG9ydFNjcmlwdHMpID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAoKChfYSA9IHNlbGYuY29uc3RydWN0b3IpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5uYW1lKSA9PT0gXCJEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZVwiIHx8XG4gICAgICAgICgoX2IgPSBzZWxmLmNvbnN0cnVjdG9yKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubmFtZSkgPT09IFwiU2VydmljZVdvcmtlckdsb2JhbFNjb3BlXCIgfHxcbiAgICAgICAgKChfYyA9IHNlbGYuY29uc3RydWN0b3IpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5uYW1lKSA9PT0gXCJTaGFyZWRXb3JrZXJHbG9iYWxTY29wZVwiKTtcbi8qKlxuICogQSBjb25zdGFudCB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbnZpcm9ubWVudCB0aGUgY29kZSBpcyBydW5uaW5nIGlzIERlbm8uXG4gKi9cbmV4cG9ydCBjb25zdCBpc0Rlbm8gPSB0eXBlb2YgRGVubyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIHR5cGVvZiBEZW5vLnZlcnNpb24gIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICB0eXBlb2YgRGVuby52ZXJzaW9uLmRlbm8gIT09IFwidW5kZWZpbmVkXCI7XG4vKipcbiAqIEEgY29uc3RhbnQgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW52aXJvbm1lbnQgdGhlIGNvZGUgaXMgcnVubmluZyBpcyBOb2RlLkpTLlxuICovXG5leHBvcnQgY29uc3QgaXNOb2RlID0gdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICBCb29sZWFuKHByb2Nlc3MudmVyc2lvbikgJiZcbiAgICBCb29sZWFuKChfZCA9IHByb2Nlc3MudmVyc2lvbnMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5ub2RlKSAmJlxuICAgIC8vIERlbm8gdGhvdWdodCBpdCB3YXMgYSBnb29kIGlkZWEgdG8gc3Bvb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLCBzZWUgaHR0cHM6Ly9kZW5vLmxhbmQvc3RkQDAuMTc3LjAvbm9kZS9wcm9jZXNzLnRzP3M9dmVyc2lvbnNcbiAgICAhaXNEZW5vO1xuLyoqXG4gKiBBIGNvbnN0YW50IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVudmlyb25tZW50IHRoZSBjb2RlIGlzIHJ1bm5pbmcgaXMgQnVuLnNoLlxuICovXG5leHBvcnQgY29uc3QgaXNCdW4gPSB0eXBlb2YgQnVuICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBCdW4udmVyc2lvbiAhPT0gXCJ1bmRlZmluZWRcIjtcbi8qKlxuICogQSBjb25zdGFudCB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbnZpcm9ubWVudCB0aGUgY29kZSBpcyBydW5uaW5nIGlzIGluIFJlYWN0LU5hdGl2ZS5cbiAqL1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0LW5hdGl2ZS9ibG9iL21haW4vcGFja2FnZXMvcmVhY3QtbmF0aXZlL0xpYnJhcmllcy9Db3JlL3NldFVwTmF2aWdhdG9yLmpzXG5leHBvcnQgY29uc3QgaXNSZWFjdE5hdGl2ZSA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgKG5hdmlnYXRvciA9PT0gbnVsbCB8fCBuYXZpZ2F0b3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5hdmlnYXRvci5wcm9kdWN0KSA9PT0gXCJSZWFjdE5hdGl2ZVwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2hlY2tFbnZpcm9ubWVudC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbi8qKlxuICogVGVzdHMgYW4gb2JqZWN0IHRvIGRldGVybWluZSB3aGV0aGVyIGl0IGltcGxlbWVudHMgVG9rZW5DcmVkZW50aWFsLlxuICpcbiAqIEBwYXJhbSBjcmVkZW50aWFsIC0gVGhlIGFzc3VtZWQgVG9rZW5DcmVkZW50aWFsIHRvIGJlIHRlc3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVG9rZW5DcmVkZW50aWFsKGNyZWRlbnRpYWwpIHtcbiAgICAvLyBDaGVjayBmb3IgYW4gb2JqZWN0IHdpdGggYSAnZ2V0VG9rZW4nIGZ1bmN0aW9uIGFuZCBwb3NzaWJseSB3aXRoXG4gICAgLy8gYSAnc2lnblJlcXVlc3QnIGZ1bmN0aW9uLiAgV2UgZG8gdGhpcyBjaGVjayB0byBtYWtlIHN1cmUgdGhhdFxuICAgIC8vIGEgU2VydmljZUNsaWVudENyZWRlbnRpYWxzIGltcGxlbWVudG9yIChsaWtlIFRva2VuQ2xpZW50Q3JlZGVudGlhbHNcbiAgICAvLyBpbiBtcy1yZXN0LW5vZGVhdXRoKSBkb2Vzbid0IGdldCBtaXN0YWtlbiBmb3IgYSBUb2tlbkNyZWRlbnRpYWwgaWZcbiAgICAvLyBpdCBkb2Vzbid0IGFjdHVhbGx5IGltcGxlbWVudCBUb2tlbkNyZWRlbnRpYWwgYWxzby5cbiAgICBjb25zdCBjYXN0Q3JlZGVudGlhbCA9IGNyZWRlbnRpYWw7XG4gICAgcmV0dXJuIChjYXN0Q3JlZGVudGlhbCAmJlxuICAgICAgICB0eXBlb2YgY2FzdENyZWRlbnRpYWwuZ2V0VG9rZW4gPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAoY2FzdENyZWRlbnRpYWwuc2lnblJlcXVlc3QgPT09IHVuZGVmaW5lZCB8fCBjYXN0Q3JlZGVudGlhbC5nZXRUb2tlbi5sZW5ndGggPiAwKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10b2tlbkNyZWRlbnRpYWwuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4vKipcbiAqIFRoZSBkaWZmZXJlbnQgbGV2ZWxzIG9mIGxvZ3MgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHRoZSBIdHRwUGlwZWxpbmVMb2dnZXIuXG4gKi9cbmV4cG9ydCB2YXIgSHR0cFBpcGVsaW5lTG9nTGV2ZWw7XG4oZnVuY3Rpb24gKEh0dHBQaXBlbGluZUxvZ0xldmVsKSB7XG4gICAgLyoqXG4gICAgICogQSBsb2cgbGV2ZWwgdGhhdCBpbmRpY2F0ZXMgdGhhdCBubyBsb2dzIHdpbGwgYmUgbG9nZ2VkLlxuICAgICAqL1xuICAgIEh0dHBQaXBlbGluZUxvZ0xldmVsW0h0dHBQaXBlbGluZUxvZ0xldmVsW1wiT0ZGXCJdID0gMF0gPSBcIk9GRlwiO1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIGxvZy5cbiAgICAgKi9cbiAgICBIdHRwUGlwZWxpbmVMb2dMZXZlbFtIdHRwUGlwZWxpbmVMb2dMZXZlbFtcIkVSUk9SXCJdID0gMV0gPSBcIkVSUk9SXCI7XG4gICAgLyoqXG4gICAgICogQSB3YXJuaW5nIGxvZy5cbiAgICAgKi9cbiAgICBIdHRwUGlwZWxpbmVMb2dMZXZlbFtIdHRwUGlwZWxpbmVMb2dMZXZlbFtcIldBUk5JTkdcIl0gPSAyXSA9IFwiV0FSTklOR1wiO1xuICAgIC8qKlxuICAgICAqIEFuIGluZm9ybWF0aW9uIGxvZy5cbiAgICAgKi9cbiAgICBIdHRwUGlwZWxpbmVMb2dMZXZlbFtIdHRwUGlwZWxpbmVMb2dMZXZlbFtcIklORk9cIl0gPSAzXSA9IFwiSU5GT1wiO1xufSkoSHR0cFBpcGVsaW5lTG9nTGV2ZWwgfHwgKEh0dHBQaXBlbGluZUxvZ0xldmVsID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWh0dHBQaXBlbGluZUxvZ0xldmVsLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgSHR0cFBpcGVsaW5lTG9nTGV2ZWwgfSBmcm9tIFwiLi4vaHR0cFBpcGVsaW5lTG9nTGV2ZWxcIjtcbi8qKlxuICogVGhlIGJhc2UgY2xhc3MgZnJvbSB3aGljaCBhbGwgcmVxdWVzdCBwb2xpY2llcyBkZXJpdmUuXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlUmVxdWVzdFBvbGljeSB7XG4gICAgLyoqXG4gICAgICogVGhlIG1haW4gbWV0aG9kIHRvIGltcGxlbWVudCB0aGF0IG1hbmlwdWxhdGVzIGEgcmVxdWVzdC9yZXNwb25zZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBUaGUgbmV4dCBwb2xpY3kgaW4gdGhlIHBpcGVsaW5lLiBFYWNoIHBvbGljeSBpcyByZXNwb25zaWJsZSBmb3IgZXhlY3V0aW5nIHRoZSBuZXh0IG9uZSBpZiB0aGUgcmVxdWVzdCBpcyB0byBjb250aW51ZSB0aHJvdWdoIHRoZSBwaXBlbGluZS5cbiAgICAgKi9cbiAgICBfbmV4dFBvbGljeSwgXG4gICAgLyoqXG4gICAgICogVGhlIG9wdGlvbnMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIGEgZ2l2ZW4gcmVxdWVzdCBwb2xpY3kuXG4gICAgICovXG4gICAgX29wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fbmV4dFBvbGljeSA9IF9uZXh0UG9saWN5O1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gX29wdGlvbnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB3aGV0aGVyIG9yIG5vdCBhIGxvZyB3aXRoIHRoZSBwcm92aWRlZCBsb2cgbGV2ZWwgc2hvdWxkIGJlIGxvZ2dlZC5cbiAgICAgKiBAcGFyYW0gbG9nTGV2ZWwgLSBUaGUgbG9nIGxldmVsIG9mIHRoZSBsb2cgdGhhdCB3aWxsIGJlIGxvZ2dlZC5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCBhIGxvZyB3aXRoIHRoZSBwcm92aWRlZCBsb2cgbGV2ZWwgc2hvdWxkIGJlIGxvZ2dlZC5cbiAgICAgKi9cbiAgICBzaG91bGRMb2cobG9nTGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnMuc2hvdWxkTG9nKGxvZ0xldmVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXR0ZW1wdCB0byBsb2cgdGhlIHByb3ZpZGVkIG1lc3NhZ2UgdG8gdGhlIHByb3ZpZGVkIGxvZ2dlci4gSWYgbm8gbG9nZ2VyIHdhcyBwcm92aWRlZCBvciBpZlxuICAgICAqIHRoZSBsb2cgbGV2ZWwgZG9lcyBub3QgbWVhdCB0aGUgbG9nZ2VyJ3MgdGhyZXNob2xkLCB0aGVuIG5vdGhpbmcgd2lsbCBiZSBsb2dnZWQuXG4gICAgICogQHBhcmFtIGxvZ0xldmVsIC0gVGhlIGxvZyBsZXZlbCBvZiB0aGlzIGxvZy5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIG9mIHRoaXMgbG9nLlxuICAgICAqL1xuICAgIGxvZyhsb2dMZXZlbCwgbWVzc2FnZSkge1xuICAgICAgICB0aGlzLl9vcHRpb25zLmxvZyhsb2dMZXZlbCwgbWVzc2FnZSk7XG4gICAgfVxufVxuLyoqXG4gKiBPcHRpb25hbCBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBhIFJlcXVlc3RQb2xpY3kuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0UG9saWN5T3B0aW9ucyB7XG4gICAgY29uc3RydWN0b3IoX2xvZ2dlcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIgPSBfbG9nZ2VyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgd2hldGhlciBvciBub3QgYSBsb2cgd2l0aCB0aGUgcHJvdmlkZWQgbG9nIGxldmVsIHNob3VsZCBiZSBsb2dnZWQuXG4gICAgICogQHBhcmFtIGxvZ0xldmVsIC0gVGhlIGxvZyBsZXZlbCBvZiB0aGUgbG9nIHRoYXQgd2lsbCBiZSBsb2dnZWQuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgYSBsb2cgd2l0aCB0aGUgcHJvdmlkZWQgbG9nIGxldmVsIHNob3VsZCBiZSBsb2dnZWQuXG4gICAgICovXG4gICAgc2hvdWxkTG9nKGxvZ0xldmVsKSB7XG4gICAgICAgIHJldHVybiAoISF0aGlzLl9sb2dnZXIgJiZcbiAgICAgICAgICAgIGxvZ0xldmVsICE9PSBIdHRwUGlwZWxpbmVMb2dMZXZlbC5PRkYgJiZcbiAgICAgICAgICAgIGxvZ0xldmVsIDw9IHRoaXMuX2xvZ2dlci5taW5pbXVtTG9nTGV2ZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0IHRvIGxvZyB0aGUgcHJvdmlkZWQgbWVzc2FnZSB0byB0aGUgcHJvdmlkZWQgbG9nZ2VyLiBJZiBubyBsb2dnZXIgd2FzIHByb3ZpZGVkIG9yIGlmXG4gICAgICogdGhlIGxvZyBsZXZlbCBkb2VzIG5vdCBtZWV0IHRoZSBsb2dnZXIncyB0aHJlc2hvbGQsIHRoZW4gbm90aGluZyB3aWxsIGJlIGxvZ2dlZC5cbiAgICAgKiBAcGFyYW0gbG9nTGV2ZWwgLSBUaGUgbG9nIGxldmVsIG9mIHRoaXMgbG9nLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2Ugb2YgdGhpcyBsb2cuXG4gICAgICovXG4gICAgbG9nKGxvZ0xldmVsLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0aGlzLl9sb2dnZXIgJiYgdGhpcy5zaG91bGRMb2cobG9nTGV2ZWwpKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIubG9nKGxvZ0xldmVsLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlcXVlc3RQb2xpY3kuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4vKipcbiAqIEEgc2V0IG9mIGNvbnN0YW50cyB1c2VkIGludGVybmFsbHkgd2hlbiBwcm9jZXNzaW5nIHJlcXVlc3RzLlxuICovXG5leHBvcnQgY29uc3QgQ29uc3RhbnRzID0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3JlLWh0dHAgdmVyc2lvblxuICAgICAqL1xuICAgIGNvcmVIdHRwVmVyc2lvbjogXCIzLjAuNFwiLFxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBIVFRQLlxuICAgICAqL1xuICAgIEhUVFA6IFwiaHR0cDpcIixcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgSFRUUFMuXG4gICAgICovXG4gICAgSFRUUFM6IFwiaHR0cHM6XCIsXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIEhUVFAgUHJveHkuXG4gICAgICovXG4gICAgSFRUUF9QUk9YWTogXCJIVFRQX1BST1hZXCIsXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIEhUVFBTIFByb3h5LlxuICAgICAqL1xuICAgIEhUVFBTX1BST1hZOiBcIkhUVFBTX1BST1hZXCIsXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIE5PIFByb3h5LlxuICAgICAqL1xuICAgIE5PX1BST1hZOiBcIk5PX1BST1hZXCIsXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIEFMTCBQcm94eS5cbiAgICAgKi9cbiAgICBBTExfUFJPWFk6IFwiQUxMX1BST1hZXCIsXG4gICAgSHR0cENvbnN0YW50czoge1xuICAgICAgICAvKipcbiAgICAgICAgICogSHR0cCBWZXJic1xuICAgICAgICAgKi9cbiAgICAgICAgSHR0cFZlcmJzOiB7XG4gICAgICAgICAgICBQVVQ6IFwiUFVUXCIsXG4gICAgICAgICAgICBHRVQ6IFwiR0VUXCIsXG4gICAgICAgICAgICBERUxFVEU6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBQT1NUOiBcIlBPU1RcIixcbiAgICAgICAgICAgIE1FUkdFOiBcIk1FUkdFXCIsXG4gICAgICAgICAgICBIRUFEOiBcIkhFQURcIixcbiAgICAgICAgICAgIFBBVENIOiBcIlBBVENIXCIsXG4gICAgICAgIH0sXG4gICAgICAgIFN0YXR1c0NvZGVzOiB7XG4gICAgICAgICAgICBUb29NYW55UmVxdWVzdHM6IDQyOSxcbiAgICAgICAgICAgIFNlcnZpY2VVbmF2YWlsYWJsZTogNTAzLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBjb25zdGFudHMgZm9yIHVzZSB3aXRoIEhUVFAgaGVhZGVycy5cbiAgICAgKi9cbiAgICBIZWFkZXJDb25zdGFudHM6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBBdXRob3JpemF0aW9uIGhlYWRlci5cbiAgICAgICAgICovXG4gICAgICAgIEFVVEhPUklaQVRJT046IFwiYXV0aG9yaXphdGlvblwiLFxuICAgICAgICBBVVRIT1JJWkFUSU9OX1NDSEVNRTogXCJCZWFyZXJcIixcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBSZXRyeS1BZnRlciByZXNwb25zZS1oZWFkZXIgZmllbGQgY2FuIGJlIHVzZWQgd2l0aCBhIDUwMyAoU2VydmljZVxuICAgICAgICAgKiBVbmF2YWlsYWJsZSkgb3IgMzQ5IChUb28gTWFueSBSZXF1ZXN0cykgcmVzcG9uc2VzIHRvIGluZGljYXRlIGhvdyBsb25nXG4gICAgICAgICAqIHRoZSBzZXJ2aWNlIGlzIGV4cGVjdGVkIHRvIGJlIHVuYXZhaWxhYmxlIHRvIHRoZSByZXF1ZXN0aW5nIGNsaWVudC5cbiAgICAgICAgICovXG4gICAgICAgIFJFVFJZX0FGVEVSOiBcIlJldHJ5LUFmdGVyXCIsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgVXNlckFnZW50IGhlYWRlci5cbiAgICAgICAgICovXG4gICAgICAgIFVTRVJfQUdFTlQ6IFwiVXNlci1BZ2VudFwiLFxuICAgIH0sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RhbnRzLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgQmFzZVJlcXVlc3RQb2xpY3ksIH0gZnJvbSBcIi4vcmVxdWVzdFBvbGljeVwiO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uL3V0aWwvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBVUkxCdWlsZGVyIH0gZnJvbSBcIi4uL3VybFwiO1xuaW1wb3J0IHsgZ2V0RW52aXJvbm1lbnRWYWx1ZSB9IGZyb20gXCIuLi91dGlsL3V0aWxzXCI7XG4vKipcbiAqIFN0b3JlcyB0aGUgcGF0dGVybnMgc3BlY2lmaWVkIGluIE5PX1BST1hZIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBnbG9iYWxOb1Byb3h5TGlzdCA9IFtdO1xubGV0IG5vUHJveHlMaXN0TG9hZGVkID0gZmFsc2U7XG4vKiogQSBjYWNoZSBvZiB3aGV0aGVyIGEgaG9zdCBzaG91bGQgYnlwYXNzIHRoZSBwcm94eS4gKi9cbmNvbnN0IGdsb2JhbEJ5cGFzc2VkTWFwID0gbmV3IE1hcCgpO1xuZnVuY3Rpb24gbG9hZEVudmlyb25tZW50UHJveHlWYWx1ZSgpIHtcbiAgICBpZiAoIXByb2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgaHR0cHNQcm94eSA9IGdldEVudmlyb25tZW50VmFsdWUoQ29uc3RhbnRzLkhUVFBTX1BST1hZKTtcbiAgICBjb25zdCBhbGxQcm94eSA9IGdldEVudmlyb25tZW50VmFsdWUoQ29uc3RhbnRzLkFMTF9QUk9YWSk7XG4gICAgY29uc3QgaHR0cFByb3h5ID0gZ2V0RW52aXJvbm1lbnRWYWx1ZShDb25zdGFudHMuSFRUUF9QUk9YWSk7XG4gICAgcmV0dXJuIGh0dHBzUHJveHkgfHwgYWxsUHJveHkgfHwgaHR0cFByb3h5O1xufVxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBob3N0IG9mIGEgZ2l2ZW4gYHVyaWAgbWF0Y2hlcyBhbnkgcGF0dGVybiBpbiB0aGUgbm8gcHJveHkgbGlzdC5cbiAqIElmIHRoZXJlJ3MgYSBtYXRjaCwgYW55IHJlcXVlc3Qgc2VudCB0byB0aGUgc2FtZSBob3N0IHNob3VsZG4ndCBoYXZlIHRoZSBwcm94eSBzZXR0aW5ncyBzZXQuXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGEgcG9ydCBvZiBodHRwczovL2dpdGh1Yi5jb20vQXp1cmUvYXp1cmUtc2RrLWZvci1uZXQvYmxvYi84Y2NhODExMzcxMTU5ZTUyNzE1OWM3ZWI2NTYwMjQ3Nzg5ODY4M2UyL3Nkay9jb3JlL0F6dXJlLkNvcmUvc3JjL1BpcGVsaW5lL0ludGVybmFsL0h0dHBFbnZpcm9ubWVudFByb3h5LmNzI0wyMTBcbiAqL1xuZnVuY3Rpb24gaXNCeXBhc3NlZCh1cmksIG5vUHJveHlMaXN0LCBieXBhc3NlZE1hcCkge1xuICAgIGlmIChub1Byb3h5TGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBob3N0ID0gVVJMQnVpbGRlci5wYXJzZSh1cmkpLmdldEhvc3QoKTtcbiAgICBpZiAoYnlwYXNzZWRNYXAgPT09IG51bGwgfHwgYnlwYXNzZWRNYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJ5cGFzc2VkTWFwLmhhcyhob3N0KSkge1xuICAgICAgICByZXR1cm4gYnlwYXNzZWRNYXAuZ2V0KGhvc3QpO1xuICAgIH1cbiAgICBsZXQgaXNCeXBhc3NlZEZsYWcgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2Ygbm9Qcm94eUxpc3QpIHtcbiAgICAgICAgaWYgKHBhdHRlcm5bMF0gPT09IFwiLlwiKSB7XG4gICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBtYXRjaCBlaXRoZXIgZG9tYWluIGl0IHNlbGYgb3IgYW55IHN1YmRvbWFpbiBvciBob3N0XG4gICAgICAgICAgICAvLyAuZm9vLmNvbSB3aWxsIG1hdGNoIGZvby5jb20gaXQgc2VsZiBvciAqLmZvby5jb21cbiAgICAgICAgICAgIGlmIChob3N0LmVuZHNXaXRoKHBhdHRlcm4pKSB7XG4gICAgICAgICAgICAgICAgaXNCeXBhc3NlZEZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhvc3QubGVuZ3RoID09PSBwYXR0ZXJuLmxlbmd0aCAtIDEgJiYgaG9zdCA9PT0gcGF0dGVybi5zbGljZSgxKSkge1xuICAgICAgICAgICAgICAgICAgICBpc0J5cGFzc2VkRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGhvc3QgPT09IHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICBpc0J5cGFzc2VkRmxhZyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYnlwYXNzZWRNYXAgPT09IG51bGwgfHwgYnlwYXNzZWRNYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJ5cGFzc2VkTWFwLnNldChob3N0LCBpc0J5cGFzc2VkRmxhZyk7XG4gICAgcmV0dXJuIGlzQnlwYXNzZWRGbGFnO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWROb1Byb3h5KCkge1xuICAgIGNvbnN0IG5vUHJveHkgPSBnZXRFbnZpcm9ubWVudFZhbHVlKENvbnN0YW50cy5OT19QUk9YWSk7XG4gICAgbm9Qcm94eUxpc3RMb2FkZWQgPSB0cnVlO1xuICAgIGlmIChub1Byb3h5KSB7XG4gICAgICAgIHJldHVybiBub1Byb3h5XG4gICAgICAgICAgICAuc3BsaXQoXCIsXCIpXG4gICAgICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLnRyaW0oKSlcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhIGdpdmVuIFVSTCBvZiBhIHByb3h5IHNlcnZlciBpbnRvIGBQcm94eVNldHRpbmdzYCBvciBhdHRlbXB0cyB0byByZXRyaWV2ZSBgUHJveHlTZXR0aW5nc2AgZnJvbSB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBpZiBvbmUgaXMgbm90IHBhc3NlZC5cbiAqIEBwYXJhbSBwcm94eVVybCAtIFVSTCBvZiB0aGUgcHJveHlcbiAqIEByZXR1cm5zIFRoZSBkZWZhdWx0IHByb3h5IHNldHRpbmdzLCBvciB1bmRlZmluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0UHJveHlTZXR0aW5ncyhwcm94eVVybCkge1xuICAgIGlmICghcHJveHlVcmwpIHtcbiAgICAgICAgcHJveHlVcmwgPSBsb2FkRW52aXJvbm1lbnRQcm94eVZhbHVlKCk7XG4gICAgICAgIGlmICghcHJveHlVcmwpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgeyB1c2VybmFtZSwgcGFzc3dvcmQsIHVybFdpdGhvdXRBdXRoIH0gPSBleHRyYWN0QXV0aEZyb21VcmwocHJveHlVcmwpO1xuICAgIGNvbnN0IHBhcnNlZFVybCA9IFVSTEJ1aWxkZXIucGFyc2UodXJsV2l0aG91dEF1dGgpO1xuICAgIGNvbnN0IHNjaGVtYSA9IHBhcnNlZFVybC5nZXRTY2hlbWUoKSA/IHBhcnNlZFVybC5nZXRTY2hlbWUoKSArIFwiOi8vXCIgOiBcIlwiO1xuICAgIHJldHVybiB7XG4gICAgICAgIGhvc3Q6IHNjaGVtYSArIHBhcnNlZFVybC5nZXRIb3N0KCksXG4gICAgICAgIHBvcnQ6IE51bWJlci5wYXJzZUludChwYXJzZWRVcmwuZ2V0UG9ydCgpIHx8IFwiODBcIiksXG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICBwYXNzd29yZCxcbiAgICB9O1xufVxuLyoqXG4gKiBBIHBvbGljeSB0aGF0IGFsbG93cyBvbmUgdG8gYXBwbHkgcHJveHkgc2V0dGluZ3MgdG8gYWxsIHJlcXVlc3RzLlxuICogSWYgbm90IHBhc3NlZCBzdGF0aWMgc2V0dGluZ3MsIHRoZXkgd2lsbCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgSFRUUFNfUFJPWFlcbiAqIG9yIEhUVFBfUFJPWFkgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogQHBhcmFtIHByb3h5U2V0dGluZ3MgLSBQcm94eVNldHRpbmdzIHRvIHVzZSBvbiBlYWNoIHJlcXVlc3QuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIGFkZGl0aW9uYWwgc2V0dGluZ3MsIGZvciBleGFtcGxlLCBjdXN0b20gTk9fUFJPWFkgcGF0dGVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3h5UG9saWN5KHByb3h5U2V0dGluZ3MsIG9wdGlvbnMpIHtcbiAgICBpZiAoIXByb3h5U2V0dGluZ3MpIHtcbiAgICAgICAgcHJveHlTZXR0aW5ncyA9IGdldERlZmF1bHRQcm94eVNldHRpbmdzKCk7XG4gICAgfVxuICAgIGlmICghbm9Qcm94eUxpc3RMb2FkZWQpIHtcbiAgICAgICAgZ2xvYmFsTm9Qcm94eUxpc3QucHVzaCguLi5sb2FkTm9Qcm94eSgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlOiAobmV4dFBvbGljeSwgcmVxdWVzdFBvbGljeU9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJveHlQb2xpY3kobmV4dFBvbGljeSwgcmVxdWVzdFBvbGljeU9wdGlvbnMsIHByb3h5U2V0dGluZ3MsIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jdXN0b21Ob1Byb3h5TGlzdCk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGV4dHJhY3RBdXRoRnJvbVVybCh1cmwpIHtcbiAgICBjb25zdCBhdEluZGV4ID0gdXJsLmluZGV4T2YoXCJAXCIpO1xuICAgIGlmIChhdEluZGV4ID09PSAtMSkge1xuICAgICAgICByZXR1cm4geyB1cmxXaXRob3V0QXV0aDogdXJsIH07XG4gICAgfVxuICAgIGNvbnN0IHNjaGVtZUluZGV4ID0gdXJsLmluZGV4T2YoXCI6Ly9cIik7XG4gICAgY29uc3QgYXV0aFN0YXJ0ID0gc2NoZW1lSW5kZXggIT09IC0xID8gc2NoZW1lSW5kZXggKyAzIDogMDtcbiAgICBjb25zdCBhdXRoID0gdXJsLnN1YnN0cmluZyhhdXRoU3RhcnQsIGF0SW5kZXgpO1xuICAgIGNvbnN0IGNvbG9uSW5kZXggPSBhdXRoLmluZGV4T2YoXCI6XCIpO1xuICAgIGNvbnN0IGhhc1Bhc3N3b3JkID0gY29sb25JbmRleCAhPT0gLTE7XG4gICAgY29uc3QgdXNlcm5hbWUgPSBoYXNQYXNzd29yZCA/IGF1dGguc3Vic3RyaW5nKDAsIGNvbG9uSW5kZXgpIDogYXV0aDtcbiAgICBjb25zdCBwYXNzd29yZCA9IGhhc1Bhc3N3b3JkID8gYXV0aC5zdWJzdHJpbmcoY29sb25JbmRleCArIDEpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHVybFdpdGhvdXRBdXRoID0gdXJsLnN1YnN0cmluZygwLCBhdXRoU3RhcnQpICsgdXJsLnN1YnN0cmluZyhhdEluZGV4ICsgMSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcm5hbWUsXG4gICAgICAgIHBhc3N3b3JkLFxuICAgICAgICB1cmxXaXRob3V0QXV0aCxcbiAgICB9O1xufVxuZXhwb3J0IGNsYXNzIFByb3h5UG9saWN5IGV4dGVuZHMgQmFzZVJlcXVlc3RQb2xpY3kge1xuICAgIGNvbnN0cnVjdG9yKG5leHRQb2xpY3ksIG9wdGlvbnMsIHByb3h5U2V0dGluZ3MsIGN1c3RvbU5vUHJveHlMaXN0KSB7XG4gICAgICAgIHN1cGVyKG5leHRQb2xpY3ksIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnByb3h5U2V0dGluZ3MgPSBwcm94eVNldHRpbmdzO1xuICAgICAgICB0aGlzLmN1c3RvbU5vUHJveHlMaXN0ID0gY3VzdG9tTm9Qcm94eUxpc3Q7XG4gICAgfVxuICAgIHNlbmRSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIXJlcXVlc3QucHJveHlTZXR0aW5ncyAmJlxuICAgICAgICAgICAgIWlzQnlwYXNzZWQocmVxdWVzdC51cmwsIChfYSA9IHRoaXMuY3VzdG9tTm9Qcm94eUxpc3QpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGdsb2JhbE5vUHJveHlMaXN0LCB0aGlzLmN1c3RvbU5vUHJveHlMaXN0ID8gdW5kZWZpbmVkIDogZ2xvYmFsQnlwYXNzZWRNYXApKSB7XG4gICAgICAgICAgICByZXF1ZXN0LnByb3h5U2V0dGluZ3MgPSB0aGlzLnByb3h5U2V0dGluZ3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX25leHRQb2xpY3kuc2VuZFJlcXVlc3QocmVxdWVzdCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJveHlQb2xpY3kuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBvbmx5IGdsb2JhbHMgdGhhdCBjb21tb24gdG8gbm9kZSBhbmQgYnJvd3NlcnMgYXJlIGFsbG93ZWQgKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBub2RlL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL2VzLWJ1aWx0aW5zXG5leHBvcnQgdmFyIF9nbG9iYWxUaGlzID0gdHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdsb2JhbFRoaXMuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vIHRoaXMgaXMgYXV0b2dlbmVyYXRlZCBmaWxlLCBzZWUgc2NyaXB0cy92ZXJzaW9uLXVwZGF0ZS5qc1xuZXhwb3J0IHZhciBWRVJTSU9OID0gJzEuNy4wJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZlcnNpb24uanMubWFwIiwiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IFZFUlNJT04gfSBmcm9tICcuLi92ZXJzaW9uJztcbnZhciByZSA9IC9eKFxcZCspXFwuKFxcZCspXFwuKFxcZCspKC0oLispKT8kLztcbi8qKlxuICogQ3JlYXRlIGEgZnVuY3Rpb24gdG8gdGVzdCBhbiBBUEkgdmVyc2lvbiB0byBzZWUgaWYgaXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBwcm92aWRlZCBvd25WZXJzaW9uLlxuICpcbiAqIFRoZSByZXR1cm5lZCBmdW5jdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBzZW1hbnRpY3M6XG4gKiAtIEV4YWN0IG1hdGNoIGlzIGFsd2F5cyBjb21wYXRpYmxlXG4gKiAtIE1ham9yIHZlcnNpb25zIG11c3QgbWF0Y2ggZXhhY3RseVxuICogICAgLSAxLnggcGFja2FnZSBjYW5ub3QgdXNlIGdsb2JhbCAyLnggcGFja2FnZVxuICogICAgLSAyLnggcGFja2FnZSBjYW5ub3QgdXNlIGdsb2JhbCAxLnggcGFja2FnZVxuICogLSBUaGUgbWlub3IgdmVyc2lvbiBvZiB0aGUgQVBJIG1vZHVsZSByZXF1ZXN0aW5nIGFjY2VzcyB0byB0aGUgZ2xvYmFsIEFQSSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbWlub3IgdmVyc2lvbiBvZiB0aGlzIEFQSVxuICogICAgLSAxLjMgcGFja2FnZSBtYXkgdXNlIDEuNCBnbG9iYWwgYmVjYXVzZSB0aGUgbGF0ZXIgZ2xvYmFsIGNvbnRhaW5zIGFsbCBmdW5jdGlvbnMgMS4zIGV4cGVjdHNcbiAqICAgIC0gMS40IHBhY2thZ2UgbWF5IE5PVCB1c2UgMS4zIGdsb2JhbCBiZWNhdXNlIGl0IG1heSB0cnkgdG8gY2FsbCBmdW5jdGlvbnMgd2hpY2ggZG9uJ3QgZXhpc3Qgb24gMS4zXG4gKiAtIElmIHRoZSBtYWpvciB2ZXJzaW9uIGlzIDAsIHRoZSBtaW5vciB2ZXJzaW9uIGlzIHRyZWF0ZWQgYXMgdGhlIG1ham9yIGFuZCB0aGUgcGF0Y2ggaXMgdHJlYXRlZCBhcyB0aGUgbWlub3JcbiAqIC0gUGF0Y2ggYW5kIGJ1aWxkIHRhZyBkaWZmZXJlbmNlcyBhcmUgbm90IGNvbnNpZGVyZWQgYXQgdGhpcyB0aW1lXG4gKlxuICogQHBhcmFtIG93blZlcnNpb24gdmVyc2lvbiB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBhZ2FpbnN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfbWFrZUNvbXBhdGliaWxpdHlDaGVjayhvd25WZXJzaW9uKSB7XG4gICAgdmFyIGFjY2VwdGVkVmVyc2lvbnMgPSBuZXcgU2V0KFtvd25WZXJzaW9uXSk7XG4gICAgdmFyIHJlamVjdGVkVmVyc2lvbnMgPSBuZXcgU2V0KCk7XG4gICAgdmFyIG15VmVyc2lvbk1hdGNoID0gb3duVmVyc2lvbi5tYXRjaChyZSk7XG4gICAgaWYgKCFteVZlcnNpb25NYXRjaCkge1xuICAgICAgICAvLyB3ZSBjYW5ub3QgZ3VhcmFudGVlIGNvbXBhdGliaWxpdHkgc28gd2UgYWx3YXlzIHJldHVybiBub29wXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfTtcbiAgICB9XG4gICAgdmFyIG93blZlcnNpb25QYXJzZWQgPSB7XG4gICAgICAgIG1ham9yOiArbXlWZXJzaW9uTWF0Y2hbMV0sXG4gICAgICAgIG1pbm9yOiArbXlWZXJzaW9uTWF0Y2hbMl0sXG4gICAgICAgIHBhdGNoOiArbXlWZXJzaW9uTWF0Y2hbM10sXG4gICAgICAgIHByZXJlbGVhc2U6IG15VmVyc2lvbk1hdGNoWzRdLFxuICAgIH07XG4gICAgLy8gaWYgb3duVmVyc2lvbiBoYXMgYSBwcmVyZWxlYXNlIHRhZywgdmVyc2lvbnMgbXVzdCBtYXRjaCBleGFjdGx5XG4gICAgaWYgKG93blZlcnNpb25QYXJzZWQucHJlcmVsZWFzZSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBpc0V4YWN0bWF0Y2goZ2xvYmFsVmVyc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbFZlcnNpb24gPT09IG93blZlcnNpb247XG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIF9yZWplY3Qodikge1xuICAgICAgICByZWplY3RlZFZlcnNpb25zLmFkZCh2KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBfYWNjZXB0KHYpIHtcbiAgICAgICAgYWNjZXB0ZWRWZXJzaW9ucy5hZGQodik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gaXNDb21wYXRpYmxlKGdsb2JhbFZlcnNpb24pIHtcbiAgICAgICAgaWYgKGFjY2VwdGVkVmVyc2lvbnMuaGFzKGdsb2JhbFZlcnNpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVqZWN0ZWRWZXJzaW9ucy5oYXMoZ2xvYmFsVmVyc2lvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZ2xvYmFsVmVyc2lvbk1hdGNoID0gZ2xvYmFsVmVyc2lvbi5tYXRjaChyZSk7XG4gICAgICAgIGlmICghZ2xvYmFsVmVyc2lvbk1hdGNoKSB7XG4gICAgICAgICAgICAvLyBjYW5ub3QgcGFyc2Ugb3RoZXIgdmVyc2lvblxuICAgICAgICAgICAgLy8gd2UgY2Fubm90IGd1YXJhbnRlZSBjb21wYXRpYmlsaXR5IHNvIHdlIGFsd2F5cyBub29wXG4gICAgICAgICAgICByZXR1cm4gX3JlamVjdChnbG9iYWxWZXJzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZ2xvYmFsVmVyc2lvblBhcnNlZCA9IHtcbiAgICAgICAgICAgIG1ham9yOiArZ2xvYmFsVmVyc2lvbk1hdGNoWzFdLFxuICAgICAgICAgICAgbWlub3I6ICtnbG9iYWxWZXJzaW9uTWF0Y2hbMl0sXG4gICAgICAgICAgICBwYXRjaDogK2dsb2JhbFZlcnNpb25NYXRjaFszXSxcbiAgICAgICAgICAgIHByZXJlbGVhc2U6IGdsb2JhbFZlcnNpb25NYXRjaFs0XSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gaWYgZ2xvYmFsVmVyc2lvbiBoYXMgYSBwcmVyZWxlYXNlIHRhZywgdmVyc2lvbnMgbXVzdCBtYXRjaCBleGFjdGx5XG4gICAgICAgIGlmIChnbG9iYWxWZXJzaW9uUGFyc2VkLnByZXJlbGVhc2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIF9yZWplY3QoZ2xvYmFsVmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbWFqb3IgdmVyc2lvbnMgbXVzdCBtYXRjaFxuICAgICAgICBpZiAob3duVmVyc2lvblBhcnNlZC5tYWpvciAhPT0gZ2xvYmFsVmVyc2lvblBhcnNlZC5tYWpvcikge1xuICAgICAgICAgICAgcmV0dXJuIF9yZWplY3QoZ2xvYmFsVmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG93blZlcnNpb25QYXJzZWQubWFqb3IgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChvd25WZXJzaW9uUGFyc2VkLm1pbm9yID09PSBnbG9iYWxWZXJzaW9uUGFyc2VkLm1pbm9yICYmXG4gICAgICAgICAgICAgICAgb3duVmVyc2lvblBhcnNlZC5wYXRjaCA8PSBnbG9iYWxWZXJzaW9uUGFyc2VkLnBhdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9hY2NlcHQoZ2xvYmFsVmVyc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX3JlamVjdChnbG9iYWxWZXJzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3duVmVyc2lvblBhcnNlZC5taW5vciA8PSBnbG9iYWxWZXJzaW9uUGFyc2VkLm1pbm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gX2FjY2VwdChnbG9iYWxWZXJzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3JlamVjdChnbG9iYWxWZXJzaW9uKTtcbiAgICB9O1xufVxuLyoqXG4gKiBUZXN0IGFuIEFQSSB2ZXJzaW9uIHRvIHNlZSBpZiBpdCBpcyBjb21wYXRpYmxlIHdpdGggdGhpcyBBUEkuXG4gKlxuICogLSBFeGFjdCBtYXRjaCBpcyBhbHdheXMgY29tcGF0aWJsZVxuICogLSBNYWpvciB2ZXJzaW9ucyBtdXN0IG1hdGNoIGV4YWN0bHlcbiAqICAgIC0gMS54IHBhY2thZ2UgY2Fubm90IHVzZSBnbG9iYWwgMi54IHBhY2thZ2VcbiAqICAgIC0gMi54IHBhY2thZ2UgY2Fubm90IHVzZSBnbG9iYWwgMS54IHBhY2thZ2VcbiAqIC0gVGhlIG1pbm9yIHZlcnNpb24gb2YgdGhlIEFQSSBtb2R1bGUgcmVxdWVzdGluZyBhY2Nlc3MgdG8gdGhlIGdsb2JhbCBBUEkgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG1pbm9yIHZlcnNpb24gb2YgdGhpcyBBUElcbiAqICAgIC0gMS4zIHBhY2thZ2UgbWF5IHVzZSAxLjQgZ2xvYmFsIGJlY2F1c2UgdGhlIGxhdGVyIGdsb2JhbCBjb250YWlucyBhbGwgZnVuY3Rpb25zIDEuMyBleHBlY3RzXG4gKiAgICAtIDEuNCBwYWNrYWdlIG1heSBOT1QgdXNlIDEuMyBnbG9iYWwgYmVjYXVzZSBpdCBtYXkgdHJ5IHRvIGNhbGwgZnVuY3Rpb25zIHdoaWNoIGRvbid0IGV4aXN0IG9uIDEuM1xuICogLSBJZiB0aGUgbWFqb3IgdmVyc2lvbiBpcyAwLCB0aGUgbWlub3IgdmVyc2lvbiBpcyB0cmVhdGVkIGFzIHRoZSBtYWpvciBhbmQgdGhlIHBhdGNoIGlzIHRyZWF0ZWQgYXMgdGhlIG1pbm9yXG4gKiAtIFBhdGNoIGFuZCBidWlsZCB0YWcgZGlmZmVyZW5jZXMgYXJlIG5vdCBjb25zaWRlcmVkIGF0IHRoaXMgdGltZVxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uIHZlcnNpb24gb2YgdGhlIEFQSSByZXF1ZXN0aW5nIGFuIGluc3RhbmNlIG9mIHRoZSBnbG9iYWwgQVBJXG4gKi9cbmV4cG9ydCB2YXIgaXNDb21wYXRpYmxlID0gX21ha2VDb21wYXRpYmlsaXR5Q2hlY2soVkVSU0lPTik7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZW12ZXIuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IF9nbG9iYWxUaGlzIH0gZnJvbSAnLi4vcGxhdGZvcm0nO1xuaW1wb3J0IHsgVkVSU0lPTiB9IGZyb20gJy4uL3ZlcnNpb24nO1xuaW1wb3J0IHsgaXNDb21wYXRpYmxlIH0gZnJvbSAnLi9zZW12ZXInO1xudmFyIG1ham9yID0gVkVSU0lPTi5zcGxpdCgnLicpWzBdO1xudmFyIEdMT0JBTF9PUEVOVEVMRU1FVFJZX0FQSV9LRVkgPSBTeW1ib2wuZm9yKFwib3BlbnRlbGVtZXRyeS5qcy5hcGkuXCIgKyBtYWpvcik7XG52YXIgX2dsb2JhbCA9IF9nbG9iYWxUaGlzO1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyR2xvYmFsKHR5cGUsIGluc3RhbmNlLCBkaWFnLCBhbGxvd092ZXJyaWRlKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmIChhbGxvd092ZXJyaWRlID09PSB2b2lkIDApIHsgYWxsb3dPdmVycmlkZSA9IGZhbHNlOyB9XG4gICAgdmFyIGFwaSA9IChfZ2xvYmFsW0dMT0JBTF9PUEVOVEVMRU1FVFJZX0FQSV9LRVldID0gKF9hID0gX2dsb2JhbFtHTE9CQUxfT1BFTlRFTEVNRVRSWV9BUElfS0VZXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge1xuICAgICAgICB2ZXJzaW9uOiBWRVJTSU9OLFxuICAgIH0pO1xuICAgIGlmICghYWxsb3dPdmVycmlkZSAmJiBhcGlbdHlwZV0pIHtcbiAgICAgICAgLy8gYWxyZWFkeSByZWdpc3RlcmVkIGFuIEFQSSBvZiB0aGlzIHR5cGVcbiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihcIkBvcGVudGVsZW1ldHJ5L2FwaTogQXR0ZW1wdGVkIGR1cGxpY2F0ZSByZWdpc3RyYXRpb24gb2YgQVBJOiBcIiArIHR5cGUpO1xuICAgICAgICBkaWFnLmVycm9yKGVyci5zdGFjayB8fCBlcnIubWVzc2FnZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGFwaS52ZXJzaW9uICE9PSBWRVJTSU9OKSB7XG4gICAgICAgIC8vIEFsbCByZWdpc3RlcmVkIEFQSXMgbXVzdCBiZSBvZiB0aGUgc2FtZSB2ZXJzaW9uIGV4YWN0bHlcbiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihcIkBvcGVudGVsZW1ldHJ5L2FwaTogUmVnaXN0cmF0aW9uIG9mIHZlcnNpb24gdlwiICsgYXBpLnZlcnNpb24gKyBcIiBmb3IgXCIgKyB0eXBlICsgXCIgZG9lcyBub3QgbWF0Y2ggcHJldmlvdXNseSByZWdpc3RlcmVkIEFQSSB2XCIgKyBWRVJTSU9OKTtcbiAgICAgICAgZGlhZy5lcnJvcihlcnIuc3RhY2sgfHwgZXJyLm1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGFwaVt0eXBlXSA9IGluc3RhbmNlO1xuICAgIGRpYWcuZGVidWcoXCJAb3BlbnRlbGVtZXRyeS9hcGk6IFJlZ2lzdGVyZWQgYSBnbG9iYWwgZm9yIFwiICsgdHlwZSArIFwiIHZcIiArIFZFUlNJT04gKyBcIi5cIik7XG4gICAgcmV0dXJuIHRydWU7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFsKHR5cGUpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHZhciBnbG9iYWxWZXJzaW9uID0gKF9hID0gX2dsb2JhbFtHTE9CQUxfT1BFTlRFTEVNRVRSWV9BUElfS0VZXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZlcnNpb247XG4gICAgaWYgKCFnbG9iYWxWZXJzaW9uIHx8ICFpc0NvbXBhdGlibGUoZ2xvYmFsVmVyc2lvbikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gKF9iID0gX2dsb2JhbFtHTE9CQUxfT1BFTlRFTEVNRVRSWV9BUElfS0VZXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iW3R5cGVdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJHbG9iYWwodHlwZSwgZGlhZykge1xuICAgIGRpYWcuZGVidWcoXCJAb3BlbnRlbGVtZXRyeS9hcGk6IFVucmVnaXN0ZXJpbmcgYSBnbG9iYWwgZm9yIFwiICsgdHlwZSArIFwiIHZcIiArIFZFUlNJT04gKyBcIi5cIik7XG4gICAgdmFyIGFwaSA9IF9nbG9iYWxbR0xPQkFMX09QRU5URUxFTUVUUllfQVBJX0tFWV07XG4gICAgaWYgKGFwaSkge1xuICAgICAgICBkZWxldGUgYXBpW3R5cGVdO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdsb2JhbC11dGlscy5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqIEdldCBhIGtleSB0byB1bmlxdWVseSBpZGVudGlmeSBhIGNvbnRleHQgdmFsdWUgKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb250ZXh0S2V5KGRlc2NyaXB0aW9uKSB7XG4gICAgLy8gVGhlIHNwZWNpZmljYXRpb24gc3RhdGVzIHRoYXQgZm9yIHRoZSBzYW1lIGlucHV0LCBtdWx0aXBsZSBjYWxscyBzaG91bGRcbiAgICAvLyByZXR1cm4gZGlmZmVyZW50IGtleXMuIER1ZSB0byB0aGUgbmF0dXJlIG9mIHRoZSBKUyBkZXBlbmRlbmN5IG1hbmFnZW1lbnRcbiAgICAvLyBzeXN0ZW0sIHRoaXMgY3JlYXRlcyBwcm9ibGVtcyB3aGVyZSBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBzb21lIHBhY2thZ2VcbiAgICAvLyBjb3VsZCBob2xkIGRpZmZlcmVudCBrZXlzIGZvciB0aGUgc2FtZSBwcm9wZXJ0eS5cbiAgICAvL1xuICAgIC8vIFRoZXJlZm9yZSwgd2UgdXNlIFN5bWJvbC5mb3Igd2hpY2ggcmV0dXJucyB0aGUgc2FtZSBrZXkgZm9yIHRoZSBzYW1lIGlucHV0LlxuICAgIHJldHVybiBTeW1ib2wuZm9yKGRlc2NyaXB0aW9uKTtcbn1cbnZhciBCYXNlQ29udGV4dCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgY29udGV4dCB3aGljaCBpbmhlcml0cyB2YWx1ZXMgZnJvbSBhbiBvcHRpb25hbCBwYXJlbnQgY29udGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJlbnRDb250ZXh0IGEgY29udGV4dCBmcm9tIHdoaWNoIHRvIGluaGVyaXQgdmFsdWVzXG4gICAgICovXG4gICAgZnVuY3Rpb24gQmFzZUNvbnRleHQocGFyZW50Q29udGV4dCkge1xuICAgICAgICAvLyBmb3IgbWluaWZpY2F0aW9uXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgc2VsZi5fY3VycmVudENvbnRleHQgPSBwYXJlbnRDb250ZXh0ID8gbmV3IE1hcChwYXJlbnRDb250ZXh0KSA6IG5ldyBNYXAoKTtcbiAgICAgICAgc2VsZi5nZXRWYWx1ZSA9IGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIHNlbGYuX2N1cnJlbnRDb250ZXh0LmdldChrZXkpOyB9O1xuICAgICAgICBzZWxmLnNldFZhbHVlID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gbmV3IEJhc2VDb250ZXh0KHNlbGYuX2N1cnJlbnRDb250ZXh0KTtcbiAgICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRDb250ZXh0LnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9O1xuICAgICAgICBzZWxmLmRlbGV0ZVZhbHVlID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBuZXcgQmFzZUNvbnRleHQoc2VsZi5fY3VycmVudENvbnRleHQpO1xuICAgICAgICAgICAgY29udGV4dC5fY3VycmVudENvbnRleHQuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIEJhc2VDb250ZXh0O1xufSgpKTtcbi8qKiBUaGUgcm9vdCBjb250ZXh0IGlzIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGFyZW50IGNvbnRleHQgd2hlbiB0aGVyZSBpcyBubyBhY3RpdmUgY29udGV4dCAqL1xuZXhwb3J0IHZhciBST09UX0NPTlRFWFQgPSBuZXcgQmFzZUNvbnRleHQoKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnRleHQuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBfX3JlYWQgPSAodGhpcyAmJiB0aGlzLl9fcmVhZCkgfHwgZnVuY3Rpb24gKG8sIG4pIHtcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gICAgaWYgKCFtKSByZXR1cm4gbztcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgICB0cnkge1xuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIGFyO1xufTtcbnZhciBfX3NwcmVhZEFycmF5ID0gKHRoaXMgJiYgdGhpcy5fX3NwcmVhZEFycmF5KSB8fCBmdW5jdGlvbiAodG8sIGZyb20sIHBhY2spIHtcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufTtcbmltcG9ydCB7IFJPT1RfQ09OVEVYVCB9IGZyb20gJy4vY29udGV4dCc7XG52YXIgTm9vcENvbnRleHRNYW5hZ2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5vb3BDb250ZXh0TWFuYWdlcigpIHtcbiAgICB9XG4gICAgTm9vcENvbnRleHRNYW5hZ2VyLnByb3RvdHlwZS5hY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBST09UX0NPTlRFWFQ7XG4gICAgfTtcbiAgICBOb29wQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLndpdGggPSBmdW5jdGlvbiAoX2NvbnRleHQsIGZuLCB0aGlzQXJnKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMzsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pIC0gM10gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbi5jYWxsLmFwcGx5KGZuLCBfX3NwcmVhZEFycmF5KFt0aGlzQXJnXSwgX19yZWFkKGFyZ3MpLCBmYWxzZSkpO1xuICAgIH07XG4gICAgTm9vcENvbnRleHRNYW5hZ2VyLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gKF9jb250ZXh0LCB0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9O1xuICAgIE5vb3BDb250ZXh0TWFuYWdlci5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIE5vb3BDb250ZXh0TWFuYWdlci5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICByZXR1cm4gTm9vcENvbnRleHRNYW5hZ2VyO1xufSgpKTtcbmV4cG9ydCB7IE5vb3BDb250ZXh0TWFuYWdlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9vcENvbnRleHRNYW5hZ2VyLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX19yZWFkID0gKHRoaXMgJiYgdGhpcy5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG52YXIgX19zcHJlYWRBcnJheSA9ICh0aGlzICYmIHRoaXMuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG5pbXBvcnQgeyBnZXRHbG9iYWwgfSBmcm9tICcuLi9pbnRlcm5hbC9nbG9iYWwtdXRpbHMnO1xuLyoqXG4gKiBDb21wb25lbnQgTG9nZ2VyIHdoaWNoIGlzIG1lYW50IHRvIGJlIHVzZWQgYXMgcGFydCBvZiBhbnkgY29tcG9uZW50IHdoaWNoXG4gKiB3aWxsIGFkZCBhdXRvbWF0aWNhbGx5IGFkZGl0aW9uYWwgbmFtZXNwYWNlIGluIGZyb250IG9mIHRoZSBsb2cgbWVzc2FnZS5cbiAqIEl0IHdpbGwgdGhlbiBmb3J3YXJkIGFsbCBtZXNzYWdlIHRvIGdsb2JhbCBkaWFnIGxvZ2dlclxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGNMb2dnZXIgPSBkaWFnLmNyZWF0ZUNvbXBvbmVudExvZ2dlcih7IG5hbWVzcGFjZTogJ0BvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwJyB9KTtcbiAqIGNMb2dnZXIuZGVidWcoJ3Rlc3QnKTtcbiAqIC8vIEBvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwIHRlc3RcbiAqL1xudmFyIERpYWdDb21wb25lbnRMb2dnZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGlhZ0NvbXBvbmVudExvZ2dlcihwcm9wcykge1xuICAgICAgICB0aGlzLl9uYW1lc3BhY2UgPSBwcm9wcy5uYW1lc3BhY2UgfHwgJ0RpYWdDb21wb25lbnRMb2dnZXInO1xuICAgIH1cbiAgICBEaWFnQ29tcG9uZW50TG9nZ2VyLnByb3RvdHlwZS5kZWJ1ZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9nUHJveHkoJ2RlYnVnJywgdGhpcy5fbmFtZXNwYWNlLCBhcmdzKTtcbiAgICB9O1xuICAgIERpYWdDb21wb25lbnRMb2dnZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2dQcm94eSgnZXJyb3InLCB0aGlzLl9uYW1lc3BhY2UsIGFyZ3MpO1xuICAgIH07XG4gICAgRGlhZ0NvbXBvbmVudExvZ2dlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9nUHJveHkoJ2luZm8nLCB0aGlzLl9uYW1lc3BhY2UsIGFyZ3MpO1xuICAgIH07XG4gICAgRGlhZ0NvbXBvbmVudExvZ2dlci5wcm90b3R5cGUud2FybiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9nUHJveHkoJ3dhcm4nLCB0aGlzLl9uYW1lc3BhY2UsIGFyZ3MpO1xuICAgIH07XG4gICAgRGlhZ0NvbXBvbmVudExvZ2dlci5wcm90b3R5cGUudmVyYm9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9nUHJveHkoJ3ZlcmJvc2UnLCB0aGlzLl9uYW1lc3BhY2UsIGFyZ3MpO1xuICAgIH07XG4gICAgcmV0dXJuIERpYWdDb21wb25lbnRMb2dnZXI7XG59KCkpO1xuZXhwb3J0IHsgRGlhZ0NvbXBvbmVudExvZ2dlciB9O1xuZnVuY3Rpb24gbG9nUHJveHkoZnVuY05hbWUsIG5hbWVzcGFjZSwgYXJncykge1xuICAgIHZhciBsb2dnZXIgPSBnZXRHbG9iYWwoJ2RpYWcnKTtcbiAgICAvLyBzaG9ydGN1dCBpZiBsb2dnZXIgbm90IHNldFxuICAgIGlmICghbG9nZ2VyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXJncy51bnNoaWZ0KG5hbWVzcGFjZSk7XG4gICAgcmV0dXJuIGxvZ2dlcltmdW5jTmFtZV0uYXBwbHkobG9nZ2VyLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoYXJncyksIGZhbHNlKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db21wb25lbnRMb2dnZXIuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogRGVmaW5lcyB0aGUgYXZhaWxhYmxlIGludGVybmFsIGxvZ2dpbmcgbGV2ZWxzIGZvciB0aGUgZGlhZ25vc3RpYyBsb2dnZXIsIHRoZSBudW1lcmljIHZhbHVlc1xuICogb2YgdGhlIGxldmVscyBhcmUgZGVmaW5lZCB0byBtYXRjaCB0aGUgb3JpZ2luYWwgdmFsdWVzIGZyb20gdGhlIGluaXRpYWwgTG9nTGV2ZWwgdG8gYXZvaWRcbiAqIGNvbXBhdGliaWxpdHkvbWlncmF0aW9uIGlzc3VlcyBmb3IgYW55IGltcGxlbWVudGF0aW9uIHRoYXQgYXNzdW1lIHRoZSBudW1lcmljIG9yZGVyaW5nLlxuICovXG5leHBvcnQgdmFyIERpYWdMb2dMZXZlbDtcbihmdW5jdGlvbiAoRGlhZ0xvZ0xldmVsKSB7XG4gICAgLyoqIERpYWdub3N0aWMgTG9nZ2luZyBsZXZlbCBzZXR0aW5nIHRvIGRpc2FibGUgYWxsIGxvZ2dpbmcgKGV4Y2VwdCBhbmQgZm9yY2VkIGxvZ3MpICovXG4gICAgRGlhZ0xvZ0xldmVsW0RpYWdMb2dMZXZlbFtcIk5PTkVcIl0gPSAwXSA9IFwiTk9ORVwiO1xuICAgIC8qKiBJZGVudGlmaWVzIGFuIGVycm9yIHNjZW5hcmlvICovXG4gICAgRGlhZ0xvZ0xldmVsW0RpYWdMb2dMZXZlbFtcIkVSUk9SXCJdID0gMzBdID0gXCJFUlJPUlwiO1xuICAgIC8qKiBJZGVudGlmaWVzIGEgd2FybmluZyBzY2VuYXJpbyAqL1xuICAgIERpYWdMb2dMZXZlbFtEaWFnTG9nTGV2ZWxbXCJXQVJOXCJdID0gNTBdID0gXCJXQVJOXCI7XG4gICAgLyoqIEdlbmVyYWwgaW5mb3JtYXRpb25hbCBsb2cgbWVzc2FnZSAqL1xuICAgIERpYWdMb2dMZXZlbFtEaWFnTG9nTGV2ZWxbXCJJTkZPXCJdID0gNjBdID0gXCJJTkZPXCI7XG4gICAgLyoqIEdlbmVyYWwgZGVidWcgbG9nIG1lc3NhZ2UgKi9cbiAgICBEaWFnTG9nTGV2ZWxbRGlhZ0xvZ0xldmVsW1wiREVCVUdcIl0gPSA3MF0gPSBcIkRFQlVHXCI7XG4gICAgLyoqXG4gICAgICogRGV0YWlsZWQgdHJhY2UgbGV2ZWwgbG9nZ2luZyBzaG91bGQgb25seSBiZSB1c2VkIGZvciBkZXZlbG9wbWVudCwgc2hvdWxkIG9ubHkgYmUgc2V0XG4gICAgICogaW4gYSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC5cbiAgICAgKi9cbiAgICBEaWFnTG9nTGV2ZWxbRGlhZ0xvZ0xldmVsW1wiVkVSQk9TRVwiXSA9IDgwXSA9IFwiVkVSQk9TRVwiO1xuICAgIC8qKiBVc2VkIHRvIHNldCB0aGUgbG9nZ2luZyBsZXZlbCB0byBpbmNsdWRlIGFsbCBsb2dnaW5nICovXG4gICAgRGlhZ0xvZ0xldmVsW0RpYWdMb2dMZXZlbFtcIkFMTFwiXSA9IDk5OTldID0gXCJBTExcIjtcbn0pKERpYWdMb2dMZXZlbCB8fCAoRGlhZ0xvZ0xldmVsID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVzLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBEaWFnTG9nTGV2ZWwgfSBmcm9tICcuLi90eXBlcyc7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTG9nTGV2ZWxEaWFnTG9nZ2VyKG1heExldmVsLCBsb2dnZXIpIHtcbiAgICBpZiAobWF4TGV2ZWwgPCBEaWFnTG9nTGV2ZWwuTk9ORSkge1xuICAgICAgICBtYXhMZXZlbCA9IERpYWdMb2dMZXZlbC5OT05FO1xuICAgIH1cbiAgICBlbHNlIGlmIChtYXhMZXZlbCA+IERpYWdMb2dMZXZlbC5BTEwpIHtcbiAgICAgICAgbWF4TGV2ZWwgPSBEaWFnTG9nTGV2ZWwuQUxMO1xuICAgIH1cbiAgICAvLyBJbiBjYXNlIHRoZSBsb2dnZXIgaXMgbnVsbCBvciB1bmRlZmluZWRcbiAgICBsb2dnZXIgPSBsb2dnZXIgfHwge307XG4gICAgZnVuY3Rpb24gX2ZpbHRlckZ1bmMoZnVuY05hbWUsIHRoZUxldmVsKSB7XG4gICAgICAgIHZhciB0aGVGdW5jID0gbG9nZ2VyW2Z1bmNOYW1lXTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGVGdW5jID09PSAnZnVuY3Rpb24nICYmIG1heExldmVsID49IHRoZUxldmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhlRnVuYy5iaW5kKGxvZ2dlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3I6IF9maWx0ZXJGdW5jKCdlcnJvcicsIERpYWdMb2dMZXZlbC5FUlJPUiksXG4gICAgICAgIHdhcm46IF9maWx0ZXJGdW5jKCd3YXJuJywgRGlhZ0xvZ0xldmVsLldBUk4pLFxuICAgICAgICBpbmZvOiBfZmlsdGVyRnVuYygnaW5mbycsIERpYWdMb2dMZXZlbC5JTkZPKSxcbiAgICAgICAgZGVidWc6IF9maWx0ZXJGdW5jKCdkZWJ1ZycsIERpYWdMb2dMZXZlbC5ERUJVRyksXG4gICAgICAgIHZlcmJvc2U6IF9maWx0ZXJGdW5jKCd2ZXJib3NlJywgRGlhZ0xvZ0xldmVsLlZFUkJPU0UpLFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dMZXZlbExvZ2dlci5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fcmVhZCA9ICh0aGlzICYmIHRoaXMuX19yZWFkKSB8fCBmdW5jdGlvbiAobywgbikge1xuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgICBpZiAoIW0pIHJldHVybiBvO1xuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICAgIHRyeSB7XG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICAgIH1cbiAgICByZXR1cm4gYXI7XG59O1xudmFyIF9fc3ByZWFkQXJyYXkgPSAodGhpcyAmJiB0aGlzLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xuaW1wb3J0IHsgRGlhZ0NvbXBvbmVudExvZ2dlciB9IGZyb20gJy4uL2RpYWcvQ29tcG9uZW50TG9nZ2VyJztcbmltcG9ydCB7IGNyZWF0ZUxvZ0xldmVsRGlhZ0xvZ2dlciB9IGZyb20gJy4uL2RpYWcvaW50ZXJuYWwvbG9nTGV2ZWxMb2dnZXInO1xuaW1wb3J0IHsgRGlhZ0xvZ0xldmVsLCB9IGZyb20gJy4uL2RpYWcvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsLCByZWdpc3Rlckdsb2JhbCwgdW5yZWdpc3Rlckdsb2JhbCwgfSBmcm9tICcuLi9pbnRlcm5hbC9nbG9iYWwtdXRpbHMnO1xudmFyIEFQSV9OQU1FID0gJ2RpYWcnO1xuLyoqXG4gKiBTaW5nbGV0b24gb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIGVudHJ5IHBvaW50IHRvIHRoZSBPcGVuVGVsZW1ldHJ5IGludGVybmFsXG4gKiBkaWFnbm9zdGljIEFQSVxuICovXG52YXIgRGlhZ0FQSSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBQcml2YXRlIGludGVybmFsIGNvbnN0cnVjdG9yXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBEaWFnQVBJKCkge1xuICAgICAgICBmdW5jdGlvbiBfbG9nUHJveHkoZnVuY05hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBsb2dnZXIgPSBnZXRHbG9iYWwoJ2RpYWcnKTtcbiAgICAgICAgICAgICAgICAvLyBzaG9ydGN1dCBpZiBsb2dnZXIgbm90IHNldFxuICAgICAgICAgICAgICAgIGlmICghbG9nZ2VyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlcltmdW5jTmFtZV0uYXBwbHkobG9nZ2VyLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoYXJncyksIGZhbHNlKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFVzaW5nIHNlbGYgbG9jYWwgdmFyaWFibGUgZm9yIG1pbmlmaWNhdGlvbiBwdXJwb3NlcyBhcyAndGhpcycgY2Fubm90IGJlIG1pbmlmaWVkXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgLy8gRGlhZ0FQSSBzcGVjaWZpYyBmdW5jdGlvbnNcbiAgICAgICAgdmFyIHNldExvZ2dlciA9IGZ1bmN0aW9uIChsb2dnZXIsIG9wdGlvbnNPckxvZ0xldmVsKSB7XG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgICAgIGlmIChvcHRpb25zT3JMb2dMZXZlbCA9PT0gdm9pZCAwKSB7IG9wdGlvbnNPckxvZ0xldmVsID0geyBsb2dMZXZlbDogRGlhZ0xvZ0xldmVsLklORk8gfTsgfVxuICAgICAgICAgICAgaWYgKGxvZ2dlciA9PT0gc2VsZikge1xuICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzbid0IG11Y2ggd2UgY2FuIGRvIGhlcmUuXG4gICAgICAgICAgICAgICAgLy8gTG9nZ2luZyB0byB0aGUgY29uc29sZSBtaWdodCBicmVhayB0aGUgdXNlciBhcHBsaWNhdGlvbi5cbiAgICAgICAgICAgICAgICAvLyBUcnkgdG8gbG9nIHRvIHNlbGYuIElmIGEgbG9nZ2VyIHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgaXQgd2lsbCByZWNlaXZlIHRoZSBsb2cuXG4gICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignQ2Fubm90IHVzZSBkaWFnIGFzIHRoZSBsb2dnZXIgZm9yIGl0c2VsZi4gUGxlYXNlIHVzZSBhIERpYWdMb2dnZXIgaW1wbGVtZW50YXRpb24gbGlrZSBDb25zb2xlRGlhZ0xvZ2dlciBvciBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbicpO1xuICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IoKF9hID0gZXJyLnN0YWNrKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBlcnIubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zT3JMb2dMZXZlbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zT3JMb2dMZXZlbCA9IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nTGV2ZWw6IG9wdGlvbnNPckxvZ0xldmVsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgb2xkTG9nZ2VyID0gZ2V0R2xvYmFsKCdkaWFnJyk7XG4gICAgICAgICAgICB2YXIgbmV3TG9nZ2VyID0gY3JlYXRlTG9nTGV2ZWxEaWFnTG9nZ2VyKChfYiA9IG9wdGlvbnNPckxvZ0xldmVsLmxvZ0xldmVsKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBEaWFnTG9nTGV2ZWwuSU5GTywgbG9nZ2VyKTtcbiAgICAgICAgICAgIC8vIFRoZXJlIGFscmVhZHkgaXMgYW4gbG9nZ2VyIHJlZ2lzdGVyZWQuIFdlJ2xsIGxldCBpdCBrbm93IGJlZm9yZSBvdmVyd3JpdGluZyBpdC5cbiAgICAgICAgICAgIGlmIChvbGRMb2dnZXIgJiYgIW9wdGlvbnNPckxvZ0xldmVsLnN1cHByZXNzT3ZlcnJpZGVNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0YWNrID0gKF9jID0gbmV3IEVycm9yKCkuc3RhY2spICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6ICc8ZmFpbGVkIHRvIGdlbmVyYXRlIHN0YWNrdHJhY2U+JztcbiAgICAgICAgICAgICAgICBvbGRMb2dnZXIud2FybihcIkN1cnJlbnQgbG9nZ2VyIHdpbGwgYmUgb3ZlcndyaXR0ZW4gZnJvbSBcIiArIHN0YWNrKTtcbiAgICAgICAgICAgICAgICBuZXdMb2dnZXIud2FybihcIkN1cnJlbnQgbG9nZ2VyIHdpbGwgb3ZlcndyaXRlIG9uZSBhbHJlYWR5IHJlZ2lzdGVyZWQgZnJvbSBcIiArIHN0YWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZWdpc3Rlckdsb2JhbCgnZGlhZycsIG5ld0xvZ2dlciwgc2VsZiwgdHJ1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHNlbGYuc2V0TG9nZ2VyID0gc2V0TG9nZ2VyO1xuICAgICAgICBzZWxmLmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB1bnJlZ2lzdGVyR2xvYmFsKEFQSV9OQU1FLCBzZWxmKTtcbiAgICAgICAgfTtcbiAgICAgICAgc2VsZi5jcmVhdGVDb21wb25lbnRMb2dnZXIgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEaWFnQ29tcG9uZW50TG9nZ2VyKG9wdGlvbnMpO1xuICAgICAgICB9O1xuICAgICAgICBzZWxmLnZlcmJvc2UgPSBfbG9nUHJveHkoJ3ZlcmJvc2UnKTtcbiAgICAgICAgc2VsZi5kZWJ1ZyA9IF9sb2dQcm94eSgnZGVidWcnKTtcbiAgICAgICAgc2VsZi5pbmZvID0gX2xvZ1Byb3h5KCdpbmZvJyk7XG4gICAgICAgIHNlbGYud2FybiA9IF9sb2dQcm94eSgnd2FybicpO1xuICAgICAgICBzZWxmLmVycm9yID0gX2xvZ1Byb3h5KCdlcnJvcicpO1xuICAgIH1cbiAgICAvKiogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIERpYWdBUEkgQVBJICovXG4gICAgRGlhZ0FQSS5pbnN0YW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgRGlhZ0FQSSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcbiAgICB9O1xuICAgIHJldHVybiBEaWFnQVBJO1xufSgpKTtcbmV4cG9ydCB7IERpYWdBUEkgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpYWcuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBfX3JlYWQgPSAodGhpcyAmJiB0aGlzLl9fcmVhZCkgfHwgZnVuY3Rpb24gKG8sIG4pIHtcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gICAgaWYgKCFtKSByZXR1cm4gbztcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgICB0cnkge1xuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIGFyO1xufTtcbnZhciBfX3NwcmVhZEFycmF5ID0gKHRoaXMgJiYgdGhpcy5fX3NwcmVhZEFycmF5KSB8fCBmdW5jdGlvbiAodG8sIGZyb20sIHBhY2spIHtcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufTtcbmltcG9ydCB7IE5vb3BDb250ZXh0TWFuYWdlciB9IGZyb20gJy4uL2NvbnRleHQvTm9vcENvbnRleHRNYW5hZ2VyJztcbmltcG9ydCB7IGdldEdsb2JhbCwgcmVnaXN0ZXJHbG9iYWwsIHVucmVnaXN0ZXJHbG9iYWwsIH0gZnJvbSAnLi4vaW50ZXJuYWwvZ2xvYmFsLXV0aWxzJztcbmltcG9ydCB7IERpYWdBUEkgfSBmcm9tICcuL2RpYWcnO1xudmFyIEFQSV9OQU1FID0gJ2NvbnRleHQnO1xudmFyIE5PT1BfQ09OVEVYVF9NQU5BR0VSID0gbmV3IE5vb3BDb250ZXh0TWFuYWdlcigpO1xuLyoqXG4gKiBTaW5nbGV0b24gb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIGVudHJ5IHBvaW50IHRvIHRoZSBPcGVuVGVsZW1ldHJ5IENvbnRleHQgQVBJXG4gKi9cbnZhciBDb250ZXh0QVBJID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKiBFbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHByZXZlbnRzIGVuZCB1c2VycyBmcm9tIGNvbnN0cnVjdGluZyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQVBJICovXG4gICAgZnVuY3Rpb24gQ29udGV4dEFQSSgpIHtcbiAgICB9XG4gICAgLyoqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBDb250ZXh0IEFQSSAqL1xuICAgIENvbnRleHRBUEkuZ2V0SW5zdGFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IENvbnRleHRBUEkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGN1cnJlbnQgY29udGV4dCBtYW5hZ2VyLlxuICAgICAqXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgY29udGV4dCBtYW5hZ2VyIHdhcyBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCwgZWxzZSBmYWxzZVxuICAgICAqL1xuICAgIENvbnRleHRBUEkucHJvdG90eXBlLnNldEdsb2JhbENvbnRleHRNYW5hZ2VyID0gZnVuY3Rpb24gKGNvbnRleHRNYW5hZ2VyKSB7XG4gICAgICAgIHJldHVybiByZWdpc3Rlckdsb2JhbChBUElfTkFNRSwgY29udGV4dE1hbmFnZXIsIERpYWdBUEkuaW5zdGFuY2UoKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgY29udGV4dFxuICAgICAqL1xuICAgIENvbnRleHRBUEkucHJvdG90eXBlLmFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbnRleHRNYW5hZ2VyKCkuYWN0aXZlKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIGEgZnVuY3Rpb24gd2l0aCBhbiBhY3RpdmUgY29udGV4dFxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRleHQgY29udGV4dCB0byBiZSBhY3RpdmUgZHVyaW5nIGZ1bmN0aW9uIGV4ZWN1dGlvblxuICAgICAqIEBwYXJhbSBmbiBmdW5jdGlvbiB0byBleGVjdXRlIGluIGEgY29udGV4dFxuICAgICAqIEBwYXJhbSB0aGlzQXJnIG9wdGlvbmFsIHJlY2VpdmVyIHRvIGJlIHVzZWQgZm9yIGNhbGxpbmcgZm5cbiAgICAgKiBAcGFyYW0gYXJncyBvcHRpb25hbCBhcmd1bWVudHMgZm9yd2FyZGVkIHRvIGZuXG4gICAgICovXG4gICAgQ29udGV4dEFQSS5wcm90b3R5cGUud2l0aCA9IGZ1bmN0aW9uIChjb250ZXh0LCBmbiwgdGhpc0FyZykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMzsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pIC0gM10gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLl9nZXRDb250ZXh0TWFuYWdlcigpKS53aXRoLmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5KFtjb250ZXh0LCBmbiwgdGhpc0FyZ10sIF9fcmVhZChhcmdzKSwgZmFsc2UpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJpbmQgYSBjb250ZXh0IHRvIGEgdGFyZ2V0IGZ1bmN0aW9uIG9yIGV2ZW50IGVtaXR0ZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250ZXh0IGNvbnRleHQgdG8gYmluZCB0byB0aGUgZXZlbnQgZW1pdHRlciBvciBmdW5jdGlvbi4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnRseSBhY3RpdmUgY29udGV4dFxuICAgICAqIEBwYXJhbSB0YXJnZXQgZnVuY3Rpb24gb3IgZXZlbnQgZW1pdHRlciB0byBiaW5kXG4gICAgICovXG4gICAgQ29udGV4dEFQSS5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uIChjb250ZXh0LCB0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbnRleHRNYW5hZ2VyKCkuYmluZChjb250ZXh0LCB0YXJnZXQpO1xuICAgIH07XG4gICAgQ29udGV4dEFQSS5wcm90b3R5cGUuX2dldENvbnRleHRNYW5hZ2VyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZ2V0R2xvYmFsKEFQSV9OQU1FKSB8fCBOT09QX0NPTlRFWFRfTUFOQUdFUjtcbiAgICB9O1xuICAgIC8qKiBEaXNhYmxlIGFuZCByZW1vdmUgdGhlIGdsb2JhbCBjb250ZXh0IG1hbmFnZXIgKi9cbiAgICBDb250ZXh0QVBJLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9nZXRDb250ZXh0TWFuYWdlcigpLmRpc2FibGUoKTtcbiAgICAgICAgdW5yZWdpc3Rlckdsb2JhbChBUElfTkFNRSwgRGlhZ0FQSS5pbnN0YW5jZSgpKTtcbiAgICB9O1xuICAgIHJldHVybiBDb250ZXh0QVBJO1xufSgpKTtcbmV4cG9ydCB7IENvbnRleHRBUEkgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnRleHQuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmV4cG9ydCB2YXIgVHJhY2VGbGFncztcbihmdW5jdGlvbiAoVHJhY2VGbGFncykge1xuICAgIC8qKiBSZXByZXNlbnRzIG5vIGZsYWcgc2V0LiAqL1xuICAgIFRyYWNlRmxhZ3NbVHJhY2VGbGFnc1tcIk5PTkVcIl0gPSAwXSA9IFwiTk9ORVwiO1xuICAgIC8qKiBCaXQgdG8gcmVwcmVzZW50IHdoZXRoZXIgdHJhY2UgaXMgc2FtcGxlZCBpbiB0cmFjZSBmbGFncy4gKi9cbiAgICBUcmFjZUZsYWdzW1RyYWNlRmxhZ3NbXCJTQU1QTEVEXCJdID0gMV0gPSBcIlNBTVBMRURcIjtcbn0pKFRyYWNlRmxhZ3MgfHwgKFRyYWNlRmxhZ3MgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhY2VfZmxhZ3MuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IFRyYWNlRmxhZ3MgfSBmcm9tICcuL3RyYWNlX2ZsYWdzJztcbmV4cG9ydCB2YXIgSU5WQUxJRF9TUEFOSUQgPSAnMDAwMDAwMDAwMDAwMDAwMCc7XG5leHBvcnQgdmFyIElOVkFMSURfVFJBQ0VJRCA9ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCc7XG5leHBvcnQgdmFyIElOVkFMSURfU1BBTl9DT05URVhUID0ge1xuICAgIHRyYWNlSWQ6IElOVkFMSURfVFJBQ0VJRCxcbiAgICBzcGFuSWQ6IElOVkFMSURfU1BBTklELFxuICAgIHRyYWNlRmxhZ3M6IFRyYWNlRmxhZ3MuTk9ORSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnZhbGlkLXNwYW4tY29uc3RhbnRzLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBJTlZBTElEX1NQQU5fQ09OVEVYVCB9IGZyb20gJy4vaW52YWxpZC1zcGFuLWNvbnN0YW50cyc7XG4vKipcbiAqIFRoZSBOb25SZWNvcmRpbmdTcGFuIGlzIHRoZSBkZWZhdWx0IHtAbGluayBTcGFufSB0aGF0IGlzIHVzZWQgd2hlbiBubyBTcGFuXG4gKiBpbXBsZW1lbnRhdGlvbiBpcyBhdmFpbGFibGUuIEFsbCBvcGVyYXRpb25zIGFyZSBuby1vcCBpbmNsdWRpbmcgY29udGV4dFxuICogcHJvcGFnYXRpb24uXG4gKi9cbnZhciBOb25SZWNvcmRpbmdTcGFuID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5vblJlY29yZGluZ1NwYW4oX3NwYW5Db250ZXh0KSB7XG4gICAgICAgIGlmIChfc3BhbkNvbnRleHQgPT09IHZvaWQgMCkgeyBfc3BhbkNvbnRleHQgPSBJTlZBTElEX1NQQU5fQ09OVEVYVDsgfVxuICAgICAgICB0aGlzLl9zcGFuQ29udGV4dCA9IF9zcGFuQ29udGV4dDtcbiAgICB9XG4gICAgLy8gUmV0dXJucyBhIFNwYW5Db250ZXh0LlxuICAgIE5vblJlY29yZGluZ1NwYW4ucHJvdG90eXBlLnNwYW5Db250ZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3BhbkNvbnRleHQ7XG4gICAgfTtcbiAgICAvLyBCeSBkZWZhdWx0IGRvZXMgbm90aGluZ1xuICAgIE5vblJlY29yZGluZ1NwYW4ucHJvdG90eXBlLnNldEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChfa2V5LCBfdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvLyBCeSBkZWZhdWx0IGRvZXMgbm90aGluZ1xuICAgIE5vblJlY29yZGluZ1NwYW4ucHJvdG90eXBlLnNldEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoX2F0dHJpYnV0ZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvLyBCeSBkZWZhdWx0IGRvZXMgbm90aGluZ1xuICAgIE5vblJlY29yZGluZ1NwYW4ucHJvdG90eXBlLmFkZEV2ZW50ID0gZnVuY3Rpb24gKF9uYW1lLCBfYXR0cmlidXRlcykge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8vIEJ5IGRlZmF1bHQgZG9lcyBub3RoaW5nXG4gICAgTm9uUmVjb3JkaW5nU3Bhbi5wcm90b3R5cGUuc2V0U3RhdHVzID0gZnVuY3Rpb24gKF9zdGF0dXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvLyBCeSBkZWZhdWx0IGRvZXMgbm90aGluZ1xuICAgIE5vblJlY29yZGluZ1NwYW4ucHJvdG90eXBlLnVwZGF0ZU5hbWUgPSBmdW5jdGlvbiAoX25hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvLyBCeSBkZWZhdWx0IGRvZXMgbm90aGluZ1xuICAgIE5vblJlY29yZGluZ1NwYW4ucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChfZW5kVGltZSkgeyB9O1xuICAgIC8vIGlzUmVjb3JkaW5nIGFsd2F5cyByZXR1cm5zIGZhbHNlIGZvciBOb25SZWNvcmRpbmdTcGFuLlxuICAgIE5vblJlY29yZGluZ1NwYW4ucHJvdG90eXBlLmlzUmVjb3JkaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvLyBCeSBkZWZhdWx0IGRvZXMgbm90aGluZ1xuICAgIE5vblJlY29yZGluZ1NwYW4ucHJvdG90eXBlLnJlY29yZEV4Y2VwdGlvbiA9IGZ1bmN0aW9uIChfZXhjZXB0aW9uLCBfdGltZSkgeyB9O1xuICAgIHJldHVybiBOb25SZWNvcmRpbmdTcGFuO1xufSgpKTtcbmV4cG9ydCB7IE5vblJlY29yZGluZ1NwYW4gfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vblJlY29yZGluZ1NwYW4uanMubWFwIiwiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IGNyZWF0ZUNvbnRleHRLZXkgfSBmcm9tICcuLi9jb250ZXh0L2NvbnRleHQnO1xuaW1wb3J0IHsgTm9uUmVjb3JkaW5nU3BhbiB9IGZyb20gJy4vTm9uUmVjb3JkaW5nU3Bhbic7XG5pbXBvcnQgeyBDb250ZXh0QVBJIH0gZnJvbSAnLi4vYXBpL2NvbnRleHQnO1xuLyoqXG4gKiBzcGFuIGtleVxuICovXG52YXIgU1BBTl9LRVkgPSBjcmVhdGVDb250ZXh0S2V5KCdPcGVuVGVsZW1ldHJ5IENvbnRleHQgS2V5IFNQQU4nKTtcbi8qKlxuICogUmV0dXJuIHRoZSBzcGFuIGlmIG9uZSBleGlzdHNcbiAqXG4gKiBAcGFyYW0gY29udGV4dCBjb250ZXh0IHRvIGdldCBzcGFuIGZyb21cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYW4oY29udGV4dCkge1xuICAgIHJldHVybiBjb250ZXh0LmdldFZhbHVlKFNQQU5fS0VZKSB8fCB1bmRlZmluZWQ7XG59XG4vKipcbiAqIEdldHMgdGhlIHNwYW4gZnJvbSB0aGUgY3VycmVudCBjb250ZXh0LCBpZiBvbmUgZXhpc3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aXZlU3BhbigpIHtcbiAgICByZXR1cm4gZ2V0U3BhbihDb250ZXh0QVBJLmdldEluc3RhbmNlKCkuYWN0aXZlKCkpO1xufVxuLyoqXG4gKiBTZXQgdGhlIHNwYW4gb24gYSBjb250ZXh0XG4gKlxuICogQHBhcmFtIGNvbnRleHQgY29udGV4dCB0byB1c2UgYXMgcGFyZW50XG4gKiBAcGFyYW0gc3BhbiBzcGFuIHRvIHNldCBhY3RpdmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFNwYW4oY29udGV4dCwgc3Bhbikge1xuICAgIHJldHVybiBjb250ZXh0LnNldFZhbHVlKFNQQU5fS0VZLCBzcGFuKTtcbn1cbi8qKlxuICogUmVtb3ZlIGN1cnJlbnQgc3BhbiBzdG9yZWQgaW4gdGhlIGNvbnRleHRcbiAqXG4gKiBAcGFyYW0gY29udGV4dCBjb250ZXh0IHRvIGRlbGV0ZSBzcGFuIGZyb21cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZVNwYW4oY29udGV4dCkge1xuICAgIHJldHVybiBjb250ZXh0LmRlbGV0ZVZhbHVlKFNQQU5fS0VZKTtcbn1cbi8qKlxuICogV3JhcCBzcGFuIGNvbnRleHQgaW4gYSBOb29wU3BhbiBhbmQgc2V0IGFzIHNwYW4gaW4gYSBuZXdcbiAqIGNvbnRleHRcbiAqXG4gKiBAcGFyYW0gY29udGV4dCBjb250ZXh0IHRvIHNldCBhY3RpdmUgc3BhbiBvblxuICogQHBhcmFtIHNwYW5Db250ZXh0IHNwYW4gY29udGV4dCB0byBiZSB3cmFwcGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRTcGFuQ29udGV4dChjb250ZXh0LCBzcGFuQ29udGV4dCkge1xuICAgIHJldHVybiBzZXRTcGFuKGNvbnRleHQsIG5ldyBOb25SZWNvcmRpbmdTcGFuKHNwYW5Db250ZXh0KSk7XG59XG4vKipcbiAqIEdldCB0aGUgc3BhbiBjb250ZXh0IG9mIHRoZSBzcGFuIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0gY29udGV4dCBjb250ZXh0IHRvIGdldCB2YWx1ZXMgZnJvbVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BhbkNvbnRleHQoY29udGV4dCkge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gKF9hID0gZ2V0U3Bhbihjb250ZXh0KSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNwYW5Db250ZXh0KCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb250ZXh0LXV0aWxzLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBJTlZBTElEX1NQQU5JRCwgSU5WQUxJRF9UUkFDRUlEIH0gZnJvbSAnLi9pbnZhbGlkLXNwYW4tY29uc3RhbnRzJztcbmltcG9ydCB7IE5vblJlY29yZGluZ1NwYW4gfSBmcm9tICcuL05vblJlY29yZGluZ1NwYW4nO1xudmFyIFZBTElEX1RSQUNFSURfUkVHRVggPSAvXihbMC05YS1mXXszMn0pJC9pO1xudmFyIFZBTElEX1NQQU5JRF9SRUdFWCA9IC9eWzAtOWEtZl17MTZ9JC9pO1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRUcmFjZUlkKHRyYWNlSWQpIHtcbiAgICByZXR1cm4gVkFMSURfVFJBQ0VJRF9SRUdFWC50ZXN0KHRyYWNlSWQpICYmIHRyYWNlSWQgIT09IElOVkFMSURfVFJBQ0VJRDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkU3BhbklkKHNwYW5JZCkge1xuICAgIHJldHVybiBWQUxJRF9TUEFOSURfUkVHRVgudGVzdChzcGFuSWQpICYmIHNwYW5JZCAhPT0gSU5WQUxJRF9TUEFOSUQ7XG59XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHtAbGluayBTcGFuQ29udGV4dH0gaXMgdmFsaWQuXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB7QGxpbmsgU3BhbkNvbnRleHR9IGlzIHZhbGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTcGFuQ29udGV4dFZhbGlkKHNwYW5Db250ZXh0KSB7XG4gICAgcmV0dXJuIChpc1ZhbGlkVHJhY2VJZChzcGFuQ29udGV4dC50cmFjZUlkKSAmJiBpc1ZhbGlkU3BhbklkKHNwYW5Db250ZXh0LnNwYW5JZCkpO1xufVxuLyoqXG4gKiBXcmFwIHRoZSBnaXZlbiB7QGxpbmsgU3BhbkNvbnRleHR9IGluIGEgbmV3IG5vbi1yZWNvcmRpbmcge0BsaW5rIFNwYW59XG4gKlxuICogQHBhcmFtIHNwYW5Db250ZXh0IHNwYW4gY29udGV4dCB0byBiZSB3cmFwcGVkXG4gKiBAcmV0dXJucyBhIG5ldyBub24tcmVjb3JkaW5nIHtAbGluayBTcGFufSB3aXRoIHRoZSBwcm92aWRlZCBjb250ZXh0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwU3BhbkNvbnRleHQoc3BhbkNvbnRleHQpIHtcbiAgICByZXR1cm4gbmV3IE5vblJlY29yZGluZ1NwYW4oc3BhbkNvbnRleHQpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3BhbmNvbnRleHQtdXRpbHMuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IENvbnRleHRBUEkgfSBmcm9tICcuLi9hcGkvY29udGV4dCc7XG5pbXBvcnQgeyBnZXRTcGFuQ29udGV4dCwgc2V0U3BhbiB9IGZyb20gJy4uL3RyYWNlL2NvbnRleHQtdXRpbHMnO1xuaW1wb3J0IHsgTm9uUmVjb3JkaW5nU3BhbiB9IGZyb20gJy4vTm9uUmVjb3JkaW5nU3Bhbic7XG5pbXBvcnQgeyBpc1NwYW5Db250ZXh0VmFsaWQgfSBmcm9tICcuL3NwYW5jb250ZXh0LXV0aWxzJztcbnZhciBjb250ZXh0QXBpID0gQ29udGV4dEFQSS5nZXRJbnN0YW5jZSgpO1xuLyoqXG4gKiBOby1vcCBpbXBsZW1lbnRhdGlvbnMgb2Yge0BsaW5rIFRyYWNlcn0uXG4gKi9cbnZhciBOb29wVHJhY2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5vb3BUcmFjZXIoKSB7XG4gICAgfVxuICAgIC8vIHN0YXJ0U3BhbiBzdGFydHMgYSBub29wIHNwYW4uXG4gICAgTm9vcFRyYWNlci5wcm90b3R5cGUuc3RhcnRTcGFuID0gZnVuY3Rpb24gKG5hbWUsIG9wdGlvbnMsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGNvbnRleHQgPT09IHZvaWQgMCkgeyBjb250ZXh0ID0gY29udGV4dEFwaS5hY3RpdmUoKTsgfVxuICAgICAgICB2YXIgcm9vdCA9IEJvb2xlYW4ob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnJvb3QpO1xuICAgICAgICBpZiAocm9vdCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBOb25SZWNvcmRpbmdTcGFuKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcmVudEZyb21Db250ZXh0ID0gY29udGV4dCAmJiBnZXRTcGFuQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgaWYgKGlzU3BhbkNvbnRleHQocGFyZW50RnJvbUNvbnRleHQpICYmXG4gICAgICAgICAgICBpc1NwYW5Db250ZXh0VmFsaWQocGFyZW50RnJvbUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE5vblJlY29yZGluZ1NwYW4ocGFyZW50RnJvbUNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBOb25SZWNvcmRpbmdTcGFuKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE5vb3BUcmFjZXIucHJvdG90eXBlLnN0YXJ0QWN0aXZlU3BhbiA9IGZ1bmN0aW9uIChuYW1lLCBhcmcyLCBhcmczLCBhcmc0KSB7XG4gICAgICAgIHZhciBvcHRzO1xuICAgICAgICB2YXIgY3R4O1xuICAgICAgICB2YXIgZm47XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGZuID0gYXJnMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICBvcHRzID0gYXJnMjtcbiAgICAgICAgICAgIGZuID0gYXJnMztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdHMgPSBhcmcyO1xuICAgICAgICAgICAgY3R4ID0gYXJnMztcbiAgICAgICAgICAgIGZuID0gYXJnNDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50Q29udGV4dCA9IGN0eCAhPT0gbnVsbCAmJiBjdHggIT09IHZvaWQgMCA/IGN0eCA6IGNvbnRleHRBcGkuYWN0aXZlKCk7XG4gICAgICAgIHZhciBzcGFuID0gdGhpcy5zdGFydFNwYW4obmFtZSwgb3B0cywgcGFyZW50Q29udGV4dCk7XG4gICAgICAgIHZhciBjb250ZXh0V2l0aFNwYW5TZXQgPSBzZXRTcGFuKHBhcmVudENvbnRleHQsIHNwYW4pO1xuICAgICAgICByZXR1cm4gY29udGV4dEFwaS53aXRoKGNvbnRleHRXaXRoU3BhblNldCwgZm4sIHVuZGVmaW5lZCwgc3Bhbik7XG4gICAgfTtcbiAgICByZXR1cm4gTm9vcFRyYWNlcjtcbn0oKSk7XG5leHBvcnQgeyBOb29wVHJhY2VyIH07XG5mdW5jdGlvbiBpc1NwYW5Db250ZXh0KHNwYW5Db250ZXh0KSB7XG4gICAgcmV0dXJuICh0eXBlb2Ygc3BhbkNvbnRleHQgPT09ICdvYmplY3QnICYmXG4gICAgICAgIHR5cGVvZiBzcGFuQ29udGV4dFsnc3BhbklkJ10gPT09ICdzdHJpbmcnICYmXG4gICAgICAgIHR5cGVvZiBzcGFuQ29udGV4dFsndHJhY2VJZCddID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB0eXBlb2Ygc3BhbkNvbnRleHRbJ3RyYWNlRmxhZ3MnXSA9PT0gJ251bWJlcicpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9vcFRyYWNlci5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgTm9vcFRyYWNlciB9IGZyb20gJy4vTm9vcFRyYWNlcic7XG52YXIgTk9PUF9UUkFDRVIgPSBuZXcgTm9vcFRyYWNlcigpO1xuLyoqXG4gKiBQcm94eSB0cmFjZXIgcHJvdmlkZWQgYnkgdGhlIHByb3h5IHRyYWNlciBwcm92aWRlclxuICovXG52YXIgUHJveHlUcmFjZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUHJveHlUcmFjZXIoX3Byb3ZpZGVyLCBuYW1lLCB2ZXJzaW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX3Byb3ZpZGVyID0gX3Byb3ZpZGVyO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cbiAgICBQcm94eVRyYWNlci5wcm90b3R5cGUuc3RhcnRTcGFuID0gZnVuY3Rpb24gKG5hbWUsIG9wdGlvbnMsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFRyYWNlcigpLnN0YXJ0U3BhbihuYW1lLCBvcHRpb25zLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIFByb3h5VHJhY2VyLnByb3RvdHlwZS5zdGFydEFjdGl2ZVNwYW4gPSBmdW5jdGlvbiAoX25hbWUsIF9vcHRpb25zLCBfY29udGV4dCwgX2ZuKSB7XG4gICAgICAgIHZhciB0cmFjZXIgPSB0aGlzLl9nZXRUcmFjZXIoKTtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkodHJhY2VyLnN0YXJ0QWN0aXZlU3BhbiwgdHJhY2VyLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVHJ5IHRvIGdldCBhIHRyYWNlciBmcm9tIHRoZSBwcm94eSB0cmFjZXIgcHJvdmlkZXIuXG4gICAgICogSWYgdGhlIHByb3h5IHRyYWNlciBwcm92aWRlciBoYXMgbm8gZGVsZWdhdGUsIHJldHVybiBhIG5vb3AgdHJhY2VyLlxuICAgICAqL1xuICAgIFByb3h5VHJhY2VyLnByb3RvdHlwZS5fZ2V0VHJhY2VyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fZGVsZWdhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdHJhY2VyID0gdGhpcy5fcHJvdmlkZXIuZ2V0RGVsZWdhdGVUcmFjZXIodGhpcy5uYW1lLCB0aGlzLnZlcnNpb24sIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIGlmICghdHJhY2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gTk9PUF9UUkFDRVI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGVsZWdhdGUgPSB0cmFjZXI7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZTtcbiAgICB9O1xuICAgIHJldHVybiBQcm94eVRyYWNlcjtcbn0oKSk7XG5leHBvcnQgeyBQcm94eVRyYWNlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJveHlUcmFjZXIuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IE5vb3BUcmFjZXIgfSBmcm9tICcuL05vb3BUcmFjZXInO1xuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFRyYWNlclByb3ZpZGVyfSB3aGljaCByZXR1cm5zIGFuIGltcG90ZW50XG4gKiBUcmFjZXIgZm9yIGFsbCBjYWxscyB0byBgZ2V0VHJhY2VyYC5cbiAqXG4gKiBBbGwgb3BlcmF0aW9ucyBhcmUgbm8tb3AuXG4gKi9cbnZhciBOb29wVHJhY2VyUHJvdmlkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTm9vcFRyYWNlclByb3ZpZGVyKCkge1xuICAgIH1cbiAgICBOb29wVHJhY2VyUHJvdmlkZXIucHJvdG90eXBlLmdldFRyYWNlciA9IGZ1bmN0aW9uIChfbmFtZSwgX3ZlcnNpb24sIF9vcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm9vcFRyYWNlcigpO1xuICAgIH07XG4gICAgcmV0dXJuIE5vb3BUcmFjZXJQcm92aWRlcjtcbn0oKSk7XG5leHBvcnQgeyBOb29wVHJhY2VyUHJvdmlkZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vb3BUcmFjZXJQcm92aWRlci5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgUHJveHlUcmFjZXIgfSBmcm9tICcuL1Byb3h5VHJhY2VyJztcbmltcG9ydCB7IE5vb3BUcmFjZXJQcm92aWRlciB9IGZyb20gJy4vTm9vcFRyYWNlclByb3ZpZGVyJztcbnZhciBOT09QX1RSQUNFUl9QUk9WSURFUiA9IG5ldyBOb29wVHJhY2VyUHJvdmlkZXIoKTtcbi8qKlxuICogVHJhY2VyIHByb3ZpZGVyIHdoaWNoIHByb3ZpZGVzIHtAbGluayBQcm94eVRyYWNlcn1zLlxuICpcbiAqIEJlZm9yZSBhIGRlbGVnYXRlIGlzIHNldCwgdHJhY2VycyBwcm92aWRlZCBhcmUgTm9PcC5cbiAqICAgV2hlbiBhIGRlbGVnYXRlIGlzIHNldCwgdHJhY2VzIGFyZSBwcm92aWRlZCBmcm9tIHRoZSBkZWxlZ2F0ZS5cbiAqICAgV2hlbiBhIGRlbGVnYXRlIGlzIHNldCBhZnRlciB0cmFjZXJzIGhhdmUgYWxyZWFkeSBiZWVuIHByb3ZpZGVkLFxuICogICBhbGwgdHJhY2VycyBhbHJlYWR5IHByb3ZpZGVkIHdpbGwgdXNlIHRoZSBwcm92aWRlZCBkZWxlZ2F0ZSBpbXBsZW1lbnRhdGlvbi5cbiAqL1xudmFyIFByb3h5VHJhY2VyUHJvdmlkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUHJveHlUcmFjZXJQcm92aWRlcigpIHtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGEge0BsaW5rIFByb3h5VHJhY2VyfVxuICAgICAqL1xuICAgIFByb3h5VHJhY2VyUHJvdmlkZXIucHJvdG90eXBlLmdldFRyYWNlciA9IGZ1bmN0aW9uIChuYW1lLCB2ZXJzaW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuICgoX2EgPSB0aGlzLmdldERlbGVnYXRlVHJhY2VyKG5hbWUsIHZlcnNpb24sIG9wdGlvbnMpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBuZXcgUHJveHlUcmFjZXIodGhpcywgbmFtZSwgdmVyc2lvbiwgb3B0aW9ucykpO1xuICAgIH07XG4gICAgUHJveHlUcmFjZXJQcm92aWRlci5wcm90b3R5cGUuZ2V0RGVsZWdhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMuX2RlbGVnYXRlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBOT09QX1RSQUNFUl9QUk9WSURFUjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZGVsZWdhdGUgdHJhY2VyIHByb3ZpZGVyXG4gICAgICovXG4gICAgUHJveHlUcmFjZXJQcm92aWRlci5wcm90b3R5cGUuc2V0RGVsZWdhdGUgPSBmdW5jdGlvbiAoZGVsZWdhdGUpIHtcbiAgICAgICAgdGhpcy5fZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcbiAgICB9O1xuICAgIFByb3h5VHJhY2VyUHJvdmlkZXIucHJvdG90eXBlLmdldERlbGVnYXRlVHJhY2VyID0gZnVuY3Rpb24gKG5hbWUsIHZlcnNpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5fZGVsZWdhdGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRUcmFjZXIobmFtZSwgdmVyc2lvbiwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICByZXR1cm4gUHJveHlUcmFjZXJQcm92aWRlcjtcbn0oKSk7XG5leHBvcnQgeyBQcm94eVRyYWNlclByb3ZpZGVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qcm94eVRyYWNlclByb3ZpZGVyLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBnZXRHbG9iYWwsIHJlZ2lzdGVyR2xvYmFsLCB1bnJlZ2lzdGVyR2xvYmFsLCB9IGZyb20gJy4uL2ludGVybmFsL2dsb2JhbC11dGlscyc7XG5pbXBvcnQgeyBQcm94eVRyYWNlclByb3ZpZGVyIH0gZnJvbSAnLi4vdHJhY2UvUHJveHlUcmFjZXJQcm92aWRlcic7XG5pbXBvcnQgeyBpc1NwYW5Db250ZXh0VmFsaWQsIHdyYXBTcGFuQ29udGV4dCwgfSBmcm9tICcuLi90cmFjZS9zcGFuY29udGV4dC11dGlscyc7XG5pbXBvcnQgeyBkZWxldGVTcGFuLCBnZXRBY3RpdmVTcGFuLCBnZXRTcGFuLCBnZXRTcGFuQ29udGV4dCwgc2V0U3Bhbiwgc2V0U3BhbkNvbnRleHQsIH0gZnJvbSAnLi4vdHJhY2UvY29udGV4dC11dGlscyc7XG5pbXBvcnQgeyBEaWFnQVBJIH0gZnJvbSAnLi9kaWFnJztcbnZhciBBUElfTkFNRSA9ICd0cmFjZSc7XG4vKipcbiAqIFNpbmdsZXRvbiBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgZW50cnkgcG9pbnQgdG8gdGhlIE9wZW5UZWxlbWV0cnkgVHJhY2luZyBBUElcbiAqL1xudmFyIFRyYWNlQVBJID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKiBFbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHByZXZlbnRzIGVuZCB1c2VycyBmcm9tIGNvbnN0cnVjdGluZyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQVBJICovXG4gICAgZnVuY3Rpb24gVHJhY2VBUEkoKSB7XG4gICAgICAgIHRoaXMuX3Byb3h5VHJhY2VyUHJvdmlkZXIgPSBuZXcgUHJveHlUcmFjZXJQcm92aWRlcigpO1xuICAgICAgICB0aGlzLndyYXBTcGFuQ29udGV4dCA9IHdyYXBTcGFuQ29udGV4dDtcbiAgICAgICAgdGhpcy5pc1NwYW5Db250ZXh0VmFsaWQgPSBpc1NwYW5Db250ZXh0VmFsaWQ7XG4gICAgICAgIHRoaXMuZGVsZXRlU3BhbiA9IGRlbGV0ZVNwYW47XG4gICAgICAgIHRoaXMuZ2V0U3BhbiA9IGdldFNwYW47XG4gICAgICAgIHRoaXMuZ2V0QWN0aXZlU3BhbiA9IGdldEFjdGl2ZVNwYW47XG4gICAgICAgIHRoaXMuZ2V0U3BhbkNvbnRleHQgPSBnZXRTcGFuQ29udGV4dDtcbiAgICAgICAgdGhpcy5zZXRTcGFuID0gc2V0U3BhbjtcbiAgICAgICAgdGhpcy5zZXRTcGFuQ29udGV4dCA9IHNldFNwYW5Db250ZXh0O1xuICAgIH1cbiAgICAvKiogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIFRyYWNlIEFQSSAqL1xuICAgIFRyYWNlQVBJLmdldEluc3RhbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBUcmFjZUFQSSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY3VycmVudCBnbG9iYWwgdHJhY2VyLlxuICAgICAqXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhY2VyIHByb3ZpZGVyIHdhcyBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCwgZWxzZSBmYWxzZVxuICAgICAqL1xuICAgIFRyYWNlQVBJLnByb3RvdHlwZS5zZXRHbG9iYWxUcmFjZXJQcm92aWRlciA9IGZ1bmN0aW9uIChwcm92aWRlcikge1xuICAgICAgICB2YXIgc3VjY2VzcyA9IHJlZ2lzdGVyR2xvYmFsKEFQSV9OQU1FLCB0aGlzLl9wcm94eVRyYWNlclByb3ZpZGVyLCBEaWFnQVBJLmluc3RhbmNlKCkpO1xuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgdGhpcy5fcHJveHlUcmFjZXJQcm92aWRlci5zZXREZWxlZ2F0ZShwcm92aWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBnbG9iYWwgdHJhY2VyIHByb3ZpZGVyLlxuICAgICAqL1xuICAgIFRyYWNlQVBJLnByb3RvdHlwZS5nZXRUcmFjZXJQcm92aWRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGdldEdsb2JhbChBUElfTkFNRSkgfHwgdGhpcy5fcHJveHlUcmFjZXJQcm92aWRlcjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB0cmFjZXIgZnJvbSB0aGUgZ2xvYmFsIHRyYWNlciBwcm92aWRlci5cbiAgICAgKi9cbiAgICBUcmFjZUFQSS5wcm90b3R5cGUuZ2V0VHJhY2VyID0gZnVuY3Rpb24gKG5hbWUsIHZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VHJhY2VyUHJvdmlkZXIoKS5nZXRUcmFjZXIobmFtZSwgdmVyc2lvbik7XG4gICAgfTtcbiAgICAvKiogUmVtb3ZlIHRoZSBnbG9iYWwgdHJhY2VyIHByb3ZpZGVyICovXG4gICAgVHJhY2VBUEkucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHVucmVnaXN0ZXJHbG9iYWwoQVBJX05BTUUsIERpYWdBUEkuaW5zdGFuY2UoKSk7XG4gICAgICAgIHRoaXMuX3Byb3h5VHJhY2VyUHJvdmlkZXIgPSBuZXcgUHJveHlUcmFjZXJQcm92aWRlcigpO1xuICAgIH07XG4gICAgcmV0dXJuIFRyYWNlQVBJO1xufSgpKTtcbmV4cG9ydCB7IFRyYWNlQVBJIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFjZS5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gU3BsaXQgbW9kdWxlLWxldmVsIHZhcmlhYmxlIGRlZmluaXRpb24gaW50byBzZXBhcmF0ZSBmaWxlcyB0byBhbGxvd1xuLy8gdHJlZS1zaGFraW5nIG9uIGVhY2ggYXBpIGluc3RhbmNlLlxuaW1wb3J0IHsgVHJhY2VBUEkgfSBmcm9tICcuL2FwaS90cmFjZSc7XG4vKiogRW50cnlwb2ludCBmb3IgdHJhY2UgQVBJICovXG5leHBvcnQgdmFyIHRyYWNlID0gVHJhY2VBUEkuZ2V0SW5zdGFuY2UoKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyYWNlLWFwaS5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gU3BsaXQgbW9kdWxlLWxldmVsIHZhcmlhYmxlIGRlZmluaXRpb24gaW50byBzZXBhcmF0ZSBmaWxlcyB0byBhbGxvd1xuLy8gdHJlZS1zaGFraW5nIG9uIGVhY2ggYXBpIGluc3RhbmNlLlxuaW1wb3J0IHsgQ29udGV4dEFQSSB9IGZyb20gJy4vYXBpL2NvbnRleHQnO1xuLyoqIEVudHJ5cG9pbnQgZm9yIGNvbnRleHQgQVBJICovXG5leHBvcnQgdmFyIGNvbnRleHQgPSBDb250ZXh0QVBJLmdldEluc3RhbmNlKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb250ZXh0LWFwaS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IGNvbnRleHQgYXMgb3RDb250ZXh0LCB0cmFjZSBhcyBvdFRyYWNlIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuLyoqXG4gKiBUaGUga2luZCBvZiBzcGFuLlxuICovXG5leHBvcnQgdmFyIFNwYW5LaW5kO1xuKGZ1bmN0aW9uIChTcGFuS2luZCkge1xuICAgIC8qKiBEZWZhdWx0IHZhbHVlLiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3BhbiBpcyB1c2VkIGludGVybmFsbHkuICovXG4gICAgU3BhbktpbmRbU3BhbktpbmRbXCJJTlRFUk5BTFwiXSA9IDBdID0gXCJJTlRFUk5BTFwiO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBzcGFuIGNvdmVycyBzZXJ2ZXItc2lkZSBoYW5kbGluZyBvZiBhbiBSUEMgb3Igb3RoZXJcbiAgICAgKiByZW1vdGUgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBTcGFuS2luZFtTcGFuS2luZFtcIlNFUlZFUlwiXSA9IDFdID0gXCJTRVJWRVJcIjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3BhbiBjb3ZlcnMgdGhlIGNsaWVudC1zaWRlIHdyYXBwZXIgYXJvdW5kIGFuIFJQQyBvclxuICAgICAqIG90aGVyIHJlbW90ZSByZXF1ZXN0LlxuICAgICAqL1xuICAgIFNwYW5LaW5kW1NwYW5LaW5kW1wiQ0xJRU5UXCJdID0gMl0gPSBcIkNMSUVOVFwiO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBzcGFuIGRlc2NyaWJlcyBwcm9kdWNlciBzZW5kaW5nIGEgbWVzc2FnZSB0byBhXG4gICAgICogYnJva2VyLiBVbmxpa2UgY2xpZW50IGFuZCBzZXJ2ZXIsIHRoZXJlIGlzIG5vIGRpcmVjdCBjcml0aWNhbCBwYXRoIGxhdGVuY3lcbiAgICAgKiByZWxhdGlvbnNoaXAgYmV0d2VlbiBwcm9kdWNlciBhbmQgY29uc3VtZXIgc3BhbnMuXG4gICAgICovXG4gICAgU3BhbktpbmRbU3BhbktpbmRbXCJQUk9EVUNFUlwiXSA9IDNdID0gXCJQUk9EVUNFUlwiO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBzcGFuIGRlc2NyaWJlcyBjb25zdW1lciByZWNlaXZpbmcgYSBtZXNzYWdlIGZyb20gYVxuICAgICAqIGJyb2tlci4gVW5saWtlIGNsaWVudCBhbmQgc2VydmVyLCB0aGVyZSBpcyBubyBkaXJlY3QgY3JpdGljYWwgcGF0aCBsYXRlbmN5XG4gICAgICogcmVsYXRpb25zaGlwIGJldHdlZW4gcHJvZHVjZXIgYW5kIGNvbnN1bWVyIHNwYW5zLlxuICAgICAqL1xuICAgIFNwYW5LaW5kW1NwYW5LaW5kW1wiQ09OU1VNRVJcIl0gPSA0XSA9IFwiQ09OU1VNRVJcIjtcbn0pKFNwYW5LaW5kIHx8IChTcGFuS2luZCA9IHt9KSk7XG4vKipcbiAqIFJldHVybiB0aGUgc3BhbiBpZiBvbmUgZXhpc3RzXG4gKlxuICogQHBhcmFtIGNvbnRleHQgLSBjb250ZXh0IHRvIGdldCBzcGFuIGZyb21cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYW4oY29udGV4dCkge1xuICAgIHJldHVybiBvdFRyYWNlLmdldFNwYW4oY29udGV4dCk7XG59XG4vKipcbiAqIFNldCB0aGUgc3BhbiBvbiBhIGNvbnRleHRcbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIGNvbnRleHQgdG8gdXNlIGFzIHBhcmVudFxuICogQHBhcmFtIHNwYW4gLSBzcGFuIHRvIHNldCBhY3RpdmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFNwYW4oY29udGV4dCwgc3Bhbikge1xuICAgIHJldHVybiBvdFRyYWNlLnNldFNwYW4oY29udGV4dCwgc3Bhbik7XG59XG4vKipcbiAqIFdyYXAgc3BhbiBjb250ZXh0IGluIGEgTm9vcFNwYW4gYW5kIHNldCBhcyBzcGFuIGluIGEgbmV3XG4gKiBjb250ZXh0XG4gKlxuICogQHBhcmFtIGNvbnRleHQgLSBjb250ZXh0IHRvIHNldCBhY3RpdmUgc3BhbiBvblxuICogQHBhcmFtIHNwYW5Db250ZXh0IC0gc3BhbiBjb250ZXh0IHRvIGJlIHdyYXBwZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFNwYW5Db250ZXh0KGNvbnRleHQsIHNwYW5Db250ZXh0KSB7XG4gICAgcmV0dXJuIG90VHJhY2Uuc2V0U3BhbkNvbnRleHQoY29udGV4dCwgc3BhbkNvbnRleHQpO1xufVxuLyoqXG4gKiBHZXQgdGhlIHNwYW4gY29udGV4dCBvZiB0aGUgc3BhbiBpZiBpdCBleGlzdHMuXG4gKlxuICogQHBhcmFtIGNvbnRleHQgLSBjb250ZXh0IHRvIGdldCB2YWx1ZXMgZnJvbVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BhbkNvbnRleHQoY29udGV4dCkge1xuICAgIHJldHVybiBvdFRyYWNlLmdldFNwYW5Db250ZXh0KGNvbnRleHQpO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgb2YgdGhlIGdpdmVuIHtAbGluayBTcGFuQ29udGV4dH0gaXMgdmFsaWQuXG4gKiBBIHZhbGlkIHtAbGluayBTcGFuQ29udGV4dH0gaXMgb25lIHdoaWNoIGhhcyBhIHZhbGlkIHRyYWNlIElEIGFuZCBzcGFuIElEIGFzIHBlciB0aGUgc3BlYy5cbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIHRoZSB7QGxpbmsgU3BhbkNvbnRleHR9IHRvIHZhbGlkYXRlLlxuICpcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHtAbGluayBTcGFuQ29udGV4dH0gaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3BhbkNvbnRleHRWYWxpZChjb250ZXh0KSB7XG4gICAgcmV0dXJuIG90VHJhY2UuaXNTcGFuQ29udGV4dFZhbGlkKGNvbnRleHQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFRyYWNlcihuYW1lLCB2ZXJzaW9uKSB7XG4gICAgcmV0dXJuIG90VHJhY2UuZ2V0VHJhY2VyKG5hbWUgfHwgXCJhenVyZS9jb3JlLXRyYWNpbmdcIiwgdmVyc2lvbik7XG59XG4vKiogRW50cnlwb2ludCBmb3IgY29udGV4dCBBUEkgKi9cbmV4cG9ydCBjb25zdCBjb250ZXh0ID0gb3RDb250ZXh0O1xuLyoqIFNwYW5TdGF0dXNDb2RlICovXG5leHBvcnQgdmFyIFNwYW5TdGF0dXNDb2RlO1xuKGZ1bmN0aW9uIChTcGFuU3RhdHVzQ29kZSkge1xuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IHN0YXR1cy5cbiAgICAgKi9cbiAgICBTcGFuU3RhdHVzQ29kZVtTcGFuU3RhdHVzQ29kZVtcIlVOU0VUXCJdID0gMF0gPSBcIlVOU0VUXCI7XG4gICAgLyoqXG4gICAgICogVGhlIG9wZXJhdGlvbiBoYXMgYmVlbiB2YWxpZGF0ZWQgYnkgYW4gQXBwbGljYXRpb24gZGV2ZWxvcGVyIG9yXG4gICAgICogT3BlcmF0b3IgdG8gaGF2ZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LlxuICAgICAqL1xuICAgIFNwYW5TdGF0dXNDb2RlW1NwYW5TdGF0dXNDb2RlW1wiT0tcIl0gPSAxXSA9IFwiT0tcIjtcbiAgICAvKipcbiAgICAgKiBUaGUgb3BlcmF0aW9uIGNvbnRhaW5zIGFuIGVycm9yLlxuICAgICAqL1xuICAgIFNwYW5TdGF0dXNDb2RlW1NwYW5TdGF0dXNDb2RlW1wiRVJST1JcIl0gPSAyXSA9IFwiRVJST1JcIjtcbn0pKFNwYW5TdGF0dXNDb2RlIHx8IChTcGFuU3RhdHVzQ29kZSA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnRlcmZhY2VzLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG4vKipcbiAqIENvbnZlcnRzIGFuIE9wZXJhdGlvbk9wdGlvbnMgdG8gYSBSZXF1ZXN0T3B0aW9uc0Jhc2VcbiAqXG4gKiBAcGFyYW0gb3B0cyAtIE9wZXJhdGlvbk9wdGlvbnMgb2JqZWN0IHRvIGNvbnZlcnQgdG8gUmVxdWVzdE9wdGlvbnNCYXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0cykge1xuICAgIGNvbnN0IHsgcmVxdWVzdE9wdGlvbnMsIHRyYWNpbmdPcHRpb25zIH0gPSBvcHRzLCBhZGRpdGlvbmFsT3B0aW9ucyA9IF9fcmVzdChvcHRzLCBbXCJyZXF1ZXN0T3B0aW9uc1wiLCBcInRyYWNpbmdPcHRpb25zXCJdKTtcbiAgICBsZXQgcmVzdWx0ID0gYWRkaXRpb25hbE9wdGlvbnM7XG4gICAgaWYgKHJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgIHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzdWx0KSwgcmVxdWVzdE9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAodHJhY2luZ09wdGlvbnMpIHtcbiAgICAgICAgcmVzdWx0LnRyYWNpbmdDb250ZXh0ID0gdHJhY2luZ09wdGlvbnMudHJhY2luZ0NvbnRleHQ7XG4gICAgICAgIC8vIEJ5IHBhc3Npbmcgc3Bhbk9wdGlvbnMgaWYgdGhleSBleGlzdCBhdCBydW50aW1lLCB3ZSdyZSBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIEBhenVyZS9jb3JlLXRyYWNpbmdAcHJldmlldy4xMyBhbmQgZWFybGllci5cbiAgICAgICAgcmVzdWx0LnNwYW5PcHRpb25zID0gdHJhY2luZ09wdGlvbnMgPT09IG51bGwgfHwgdHJhY2luZ09wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRyYWNpbmdPcHRpb25zLnNwYW5PcHRpb25zO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3BlcmF0aW9uT3B0aW9ucy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbi8qKlxuICogRW5jb2RlcyBhIHN0cmluZyBpbiBiYXNlNjQgZm9ybWF0LlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHN0cmluZyB0byBlbmNvZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVN0cmluZyh2YWx1ZSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSkudG9TdHJpbmcoXCJiYXNlNjRcIik7XG59XG4vKipcbiAqIEVuY29kZXMgYSBieXRlIGFycmF5IGluIGJhc2U2NCBmb3JtYXQuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgVWludDhBcmF5IHRvIGVuY29kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQnl0ZUFycmF5KHZhbHVlKSB7XG4gICAgLy8gQnVmZmVyLmZyb20gYWNjZXB0cyA8QXJyYXlCdWZmZXI+IHwgPFNoYXJlZEFycmF5QnVmZmVyPi0tIHRoZSBUeXBlU2NyaXB0IGRlZmluaXRpb24gaXMgb2ZmIGhlcmVcbiAgICAvLyBodHRwczovL25vZGVqcy5vcmcvYXBpL2J1ZmZlci5odG1sI2J1ZmZlcl9jbGFzc19tZXRob2RfYnVmZmVyX2Zyb21fYXJyYXlidWZmZXJfYnl0ZW9mZnNldF9sZW5ndGhcbiAgICBjb25zdCBidWZmZXJWYWx1ZSA9IHZhbHVlIGluc3RhbmNlb2YgQnVmZmVyID8gdmFsdWUgOiBCdWZmZXIuZnJvbSh2YWx1ZS5idWZmZXIpO1xuICAgIHJldHVybiBidWZmZXJWYWx1ZS50b1N0cmluZyhcImJhc2U2NFwiKTtcbn1cbi8qKlxuICogRGVjb2RlcyBhIGJhc2U2NCBzdHJpbmcgaW50byBhIGJ5dGUgYXJyYXkuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgYmFzZTY0IHN0cmluZyB0byBkZWNvZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVN0cmluZyh2YWx1ZSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSwgXCJiYXNlNjRcIik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYXNlNjQuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4vKiBlc2xpbnQtZGlzYWJsZSBlcWVxZXEgKi9cbmltcG9ydCAqIGFzIGJhc2U2NCBmcm9tIFwiLi91dGlsL2Jhc2U2NFwiO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSBcIi4vdXRpbC91dGlsc1wiO1xuaW1wb3J0IHsgWE1MX0FUVFJLRVksIFhNTF9DSEFSS0VZIH0gZnJvbSBcIi4vdXRpbC9zZXJpYWxpemVyLmNvbW1vblwiO1xuLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHV0aWxpdHkgY29kZSB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIG5ldHdvcmsgb3BlcmF0aW9ucyBhY2NvcmRpbmcgdG8gYE9wZXJhdGlvblNwZWNgIG9iamVjdHMgZ2VuZXJhdGVkIGJ5IEF1dG9SZXN0LlR5cGVTY3JpcHQgZnJvbSBPcGVuQVBJIHNwZWNpZmljYXRpb25zLlxuLyoqXG4gKiBVc2VkIHRvIG1hcCByYXcgcmVzcG9uc2Ugb2JqZWN0cyB0byBmaW5hbCBzaGFwZXMuXG4gKiBIZWxwcyBwYWNraW5nIGFuZCB1bnBhY2tpbmcgRGF0ZXMgYW5kIG90aGVyIGVuY29kZWQgdHlwZXMgdGhhdCBhcmUgbm90IGludHJpbnNpYyB0byBKU09OLlxuICogQWxzbyBhbGxvd3MgcHVsbGluZyB2YWx1ZXMgZnJvbSBoZWFkZXJzLCBhcyB3ZWxsIGFzIGluc2VydGluZyBkZWZhdWx0IHZhbHVlcyBhbmQgY29uc3RhbnRzLlxuICovXG5leHBvcnQgY2xhc3MgU2VyaWFsaXplciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogVGhlIHByb3ZpZGVkIG1vZGVsIG1hcHBlci5cbiAgICAgKi9cbiAgICBtb2RlbE1hcHBlcnMgPSB7fSwgXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgY29udGVudHMgYXJlIFhNTCBvciBub3QuXG4gICAgICovXG4gICAgaXNYTUwpIHtcbiAgICAgICAgdGhpcy5tb2RlbE1hcHBlcnMgPSBtb2RlbE1hcHBlcnM7XG4gICAgICAgIHRoaXMuaXNYTUwgPSBpc1hNTDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVmFsaWRhdGVzIGNvbnN0cmFpbnRzLCBpZiBhbnkuIFRoaXMgZnVuY3Rpb24gd2lsbCB0aHJvdyBpZiB0aGUgcHJvdmlkZWQgdmFsdWUgZG9lcyBub3QgcmVzcGVjdCB0aG9zZSBjb25zdHJhaW50cy5cbiAgICAgKiBAcGFyYW0gbWFwcGVyIC0gVGhlIGRlZmluaXRpb24gb2YgZGF0YSBtb2RlbHMuXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlLlxuICAgICAqIEBwYXJhbSBvYmplY3ROYW1lIC0gTmFtZSBvZiB0aGUgb2JqZWN0LiBVc2VkIGluIHRoZSBlcnJvciBtZXNzYWdlcy5cbiAgICAgKiBAZGVwcmVjYXRlZCBSZW1vdmluZyB0aGUgY29uc3RyYWludHMgdmFsaWRhdGlvbiBvbiBjbGllbnQgc2lkZS5cbiAgICAgKi9cbiAgICB2YWxpZGF0ZUNvbnN0cmFpbnRzKG1hcHBlciwgdmFsdWUsIG9iamVjdE5hbWUpIHtcbiAgICAgICAgY29uc3QgZmFpbFZhbGlkYXRpb24gPSAoY29uc3RyYWludE5hbWUsIGNvbnN0cmFpbnRWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcIiR7b2JqZWN0TmFtZX1cIiB3aXRoIHZhbHVlIFwiJHt2YWx1ZX1cIiBzaG91bGQgc2F0aXNmeSB0aGUgY29uc3RyYWludCBcIiR7Y29uc3RyYWludE5hbWV9XCI6ICR7Y29uc3RyYWludFZhbHVlfS5gKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG1hcHBlci5jb25zdHJhaW50cyAmJiB2YWx1ZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQXNOdW1iZXIgPSB2YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IHsgRXhjbHVzaXZlTWF4aW11bSwgRXhjbHVzaXZlTWluaW11bSwgSW5jbHVzaXZlTWF4aW11bSwgSW5jbHVzaXZlTWluaW11bSwgTWF4SXRlbXMsIE1heExlbmd0aCwgTWluSXRlbXMsIE1pbkxlbmd0aCwgTXVsdGlwbGVPZiwgUGF0dGVybiwgVW5pcXVlSXRlbXMsIH0gPSBtYXBwZXIuY29uc3RyYWludHM7XG4gICAgICAgICAgICBpZiAoRXhjbHVzaXZlTWF4aW11bSAhPSB1bmRlZmluZWQgJiYgdmFsdWVBc051bWJlciA+PSBFeGNsdXNpdmVNYXhpbXVtKSB7XG4gICAgICAgICAgICAgICAgZmFpbFZhbGlkYXRpb24oXCJFeGNsdXNpdmVNYXhpbXVtXCIsIEV4Y2x1c2l2ZU1heGltdW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEV4Y2x1c2l2ZU1pbmltdW0gIT0gdW5kZWZpbmVkICYmIHZhbHVlQXNOdW1iZXIgPD0gRXhjbHVzaXZlTWluaW11bSkge1xuICAgICAgICAgICAgICAgIGZhaWxWYWxpZGF0aW9uKFwiRXhjbHVzaXZlTWluaW11bVwiLCBFeGNsdXNpdmVNaW5pbXVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChJbmNsdXNpdmVNYXhpbXVtICE9IHVuZGVmaW5lZCAmJiB2YWx1ZUFzTnVtYmVyID4gSW5jbHVzaXZlTWF4aW11bSkge1xuICAgICAgICAgICAgICAgIGZhaWxWYWxpZGF0aW9uKFwiSW5jbHVzaXZlTWF4aW11bVwiLCBJbmNsdXNpdmVNYXhpbXVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChJbmNsdXNpdmVNaW5pbXVtICE9IHVuZGVmaW5lZCAmJiB2YWx1ZUFzTnVtYmVyIDwgSW5jbHVzaXZlTWluaW11bSkge1xuICAgICAgICAgICAgICAgIGZhaWxWYWxpZGF0aW9uKFwiSW5jbHVzaXZlTWluaW11bVwiLCBJbmNsdXNpdmVNaW5pbXVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQXNBcnJheSA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKE1heEl0ZW1zICE9IHVuZGVmaW5lZCAmJiB2YWx1ZUFzQXJyYXkubGVuZ3RoID4gTWF4SXRlbXMpIHtcbiAgICAgICAgICAgICAgICBmYWlsVmFsaWRhdGlvbihcIk1heEl0ZW1zXCIsIE1heEl0ZW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChNYXhMZW5ndGggIT0gdW5kZWZpbmVkICYmIHZhbHVlQXNBcnJheS5sZW5ndGggPiBNYXhMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBmYWlsVmFsaWRhdGlvbihcIk1heExlbmd0aFwiLCBNYXhMZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE1pbkl0ZW1zICE9IHVuZGVmaW5lZCAmJiB2YWx1ZUFzQXJyYXkubGVuZ3RoIDwgTWluSXRlbXMpIHtcbiAgICAgICAgICAgICAgICBmYWlsVmFsaWRhdGlvbihcIk1pbkl0ZW1zXCIsIE1pbkl0ZW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChNaW5MZW5ndGggIT0gdW5kZWZpbmVkICYmIHZhbHVlQXNBcnJheS5sZW5ndGggPCBNaW5MZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBmYWlsVmFsaWRhdGlvbihcIk1pbkxlbmd0aFwiLCBNaW5MZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE11bHRpcGxlT2YgIT0gdW5kZWZpbmVkICYmIHZhbHVlQXNOdW1iZXIgJSBNdWx0aXBsZU9mICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgZmFpbFZhbGlkYXRpb24oXCJNdWx0aXBsZU9mXCIsIE11bHRpcGxlT2YpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuID0gdHlwZW9mIFBhdHRlcm4gPT09IFwic3RyaW5nXCIgPyBuZXcgUmVnRXhwKFBhdHRlcm4pIDogUGF0dGVybjtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8IHZhbHVlLm1hdGNoKHBhdHRlcm4pID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGZhaWxWYWxpZGF0aW9uKFwiUGF0dGVyblwiLCBQYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoVW5pcXVlSXRlbXMgJiZcbiAgICAgICAgICAgICAgICB2YWx1ZUFzQXJyYXkuc29tZSgoaXRlbSwgaSwgYXIpID0+IGFyLmluZGV4T2YoaXRlbSkgIT09IGkpKSB7XG4gICAgICAgICAgICAgICAgZmFpbFZhbGlkYXRpb24oXCJVbmlxdWVJdGVtc1wiLCBVbmlxdWVJdGVtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplIHRoZSBnaXZlbiBvYmplY3QgYmFzZWQgb24gaXRzIG1ldGFkYXRhIGRlZmluZWQgaW4gdGhlIG1hcHBlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtYXBwZXIgLSBUaGUgbWFwcGVyIHdoaWNoIGRlZmluZXMgdGhlIG1ldGFkYXRhIG9mIHRoZSBzZXJpYWxpemFibGUgb2JqZWN0LlxuICAgICAqIEBwYXJhbSBvYmplY3QgLSBBIHZhbGlkIEphdmFzY3JpcHQgb2JqZWN0IHRvIGJlIHNlcmlhbGl6ZWQuXG4gICAgICogQHBhcmFtIG9iamVjdE5hbWUgLSBOYW1lIG9mIHRoZSBzZXJpYWxpemVkIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFkZGl0aW9uYWwgb3B0aW9ucyB0byBkZXNlcmlhbGl6YXRpb24uXG4gICAgICogQHJldHVybnMgQSB2YWxpZCBzZXJpYWxpemVkIEphdmFzY3JpcHQgb2JqZWN0LlxuICAgICAqL1xuICAgIHNlcmlhbGl6ZShtYXBwZXIsIG9iamVjdCwgb2JqZWN0TmFtZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCB1cGRhdGVkT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHJvb3ROYW1lOiAoX2EgPSBvcHRpb25zLnJvb3ROYW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBcIlwiLFxuICAgICAgICAgICAgaW5jbHVkZVJvb3Q6IChfYiA9IG9wdGlvbnMuaW5jbHVkZVJvb3QpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGZhbHNlLFxuICAgICAgICAgICAgeG1sQ2hhcktleTogKF9jID0gb3B0aW9ucy54bWxDaGFyS2V5KSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBYTUxfQ0hBUktFWSxcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgbWFwcGVyVHlwZSA9IG1hcHBlci50eXBlLm5hbWU7XG4gICAgICAgIGlmICghb2JqZWN0TmFtZSkge1xuICAgICAgICAgICAgb2JqZWN0TmFtZSA9IG1hcHBlci5zZXJpYWxpemVkTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXlNlcXVlbmNlJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcGF5bG9hZCA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXBwZXIuaXNDb25zdGFudCkge1xuICAgICAgICAgICAgb2JqZWN0ID0gbWFwcGVyLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGlzIHRhYmxlIG9mIGFsbG93ZWQgdmFsdWVzIHNob3VsZCBoZWxwIGV4cGxhaW5cbiAgICAgICAgLy8gdGhlIG1hcHBlci5yZXF1aXJlZCBhbmQgbWFwcGVyLm51bGxhYmxlIHByb3BlcnRpZXMuXG4gICAgICAgIC8vIFggbWVhbnMgXCJuZWl0aGVyIHVuZGVmaW5lZCBvciBudWxsIGFyZSBhbGxvd2VkXCIuXG4gICAgICAgIC8vICAgICAgICAgICB8fCByZXF1aXJlZFxuICAgICAgICAvLyAgICAgICAgICAgfHwgdHJ1ZSAgICAgIHwgZmFsc2VcbiAgICAgICAgLy8gIG51bGxhYmxlIHx8ID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vICAgICAgdHJ1ZSB8fCBudWxsICAgICAgfCB1bmRlZmluZWQvbnVsbFxuICAgICAgICAvLyAgICAgZmFsc2UgfHwgWCAgICAgICAgIHwgdW5kZWZpbmVkXG4gICAgICAgIC8vIHVuZGVmaW5lZCB8fCBYICAgICAgICAgfCB1bmRlZmluZWQvbnVsbFxuICAgICAgICBjb25zdCB7IHJlcXVpcmVkLCBudWxsYWJsZSB9ID0gbWFwcGVyO1xuICAgICAgICBpZiAocmVxdWlyZWQgJiYgbnVsbGFibGUgJiYgb2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3ROYW1lfSBjYW5ub3QgYmUgdW5kZWZpbmVkLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXF1aXJlZCAmJiAhbnVsbGFibGUgJiYgb2JqZWN0ID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdE5hbWV9IGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlcXVpcmVkICYmIG51bGxhYmxlID09PSBmYWxzZSAmJiBvYmplY3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3ROYW1lfSBjYW5ub3QgYmUgbnVsbC5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2JqZWN0ID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcGF5bG9hZCA9IG9iamVjdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChtYXBwZXJUeXBlLm1hdGNoKC9eYW55JC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBvYmplY3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXBwZXJUeXBlLm1hdGNoKC9eKE51bWJlcnxTdHJpbmd8Qm9vbGVhbnxPYmplY3R8U3RyZWFtfFV1aWQpJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBzZXJpYWxpemVCYXNpY1R5cGVzKG1hcHBlclR5cGUsIG9iamVjdE5hbWUsIG9iamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXBwZXJUeXBlLm1hdGNoKC9eRW51bSQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnVtTWFwcGVyID0gbWFwcGVyO1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBzZXJpYWxpemVFbnVtVHlwZShvYmplY3ROYW1lLCBlbnVtTWFwcGVyLnR5cGUuYWxsb3dlZFZhbHVlcywgb2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hcHBlclR5cGUubWF0Y2goL14oRGF0ZXxEYXRlVGltZXxUaW1lU3BhbnxEYXRlVGltZVJmYzExMjN8VW5peFRpbWUpJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBzZXJpYWxpemVEYXRlVHlwZXMobWFwcGVyVHlwZSwgb2JqZWN0LCBvYmplY3ROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hcHBlclR5cGUubWF0Y2goL15CeXRlQXJyYXkkL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IHNlcmlhbGl6ZUJ5dGVBcnJheVR5cGUob2JqZWN0TmFtZSwgb2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hcHBlclR5cGUubWF0Y2goL15CYXNlNjRVcmwkL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IHNlcmlhbGl6ZUJhc2U2NFVybFR5cGUob2JqZWN0TmFtZSwgb2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hcHBlclR5cGUubWF0Y2goL15TZXF1ZW5jZSQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gc2VyaWFsaXplU2VxdWVuY2VUeXBlKHRoaXMsIG1hcHBlciwgb2JqZWN0LCBvYmplY3ROYW1lLCBCb29sZWFuKHRoaXMuaXNYTUwpLCB1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXBwZXJUeXBlLm1hdGNoKC9eRGljdGlvbmFyeSQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gc2VyaWFsaXplRGljdGlvbmFyeVR5cGUodGhpcywgbWFwcGVyLCBvYmplY3QsIG9iamVjdE5hbWUsIEJvb2xlYW4odGhpcy5pc1hNTCksIHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hcHBlclR5cGUubWF0Y2goL15Db21wb3NpdGUkL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IHNlcmlhbGl6ZUNvbXBvc2l0ZVR5cGUodGhpcywgbWFwcGVyLCBvYmplY3QsIG9iamVjdE5hbWUsIEJvb2xlYW4odGhpcy5pc1hNTCksIHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVzZXJpYWxpemUgdGhlIGdpdmVuIG9iamVjdCBiYXNlZCBvbiBpdHMgbWV0YWRhdGEgZGVmaW5lZCBpbiB0aGUgbWFwcGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1hcHBlciAtIFRoZSBtYXBwZXIgd2hpY2ggZGVmaW5lcyB0aGUgbWV0YWRhdGEgb2YgdGhlIHNlcmlhbGl6YWJsZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHJlc3BvbnNlQm9keSAtIEEgdmFsaWQgSmF2YXNjcmlwdCBlbnRpdHkgdG8gYmUgZGVzZXJpYWxpemVkLlxuICAgICAqIEBwYXJhbSBvYmplY3ROYW1lIC0gTmFtZSBvZiB0aGUgZGVzZXJpYWxpemVkIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbnRyb2xzIGJlaGF2aW9yIG9mIFhNTCBwYXJzZXIgYW5kIGJ1aWxkZXIuXG4gICAgICogQHJldHVybnMgQSB2YWxpZCBkZXNlcmlhbGl6ZWQgSmF2YXNjcmlwdCBvYmplY3QuXG4gICAgICovXG4gICAgZGVzZXJpYWxpemUobWFwcGVyLCByZXNwb25zZUJvZHksIG9iamVjdE5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgY29uc3QgdXBkYXRlZE9wdGlvbnMgPSB7XG4gICAgICAgICAgICByb290TmFtZTogKF9hID0gb3B0aW9ucy5yb290TmFtZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogXCJcIixcbiAgICAgICAgICAgIGluY2x1ZGVSb290OiAoX2IgPSBvcHRpb25zLmluY2x1ZGVSb290KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZSxcbiAgICAgICAgICAgIHhtbENoYXJLZXk6IChfYyA9IG9wdGlvbnMueG1sQ2hhcktleSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogWE1MX0NIQVJLRVksXG4gICAgICAgIH07XG4gICAgICAgIGlmIChyZXNwb25zZUJvZHkgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1hNTCAmJiBtYXBwZXIudHlwZS5uYW1lID09PSBcIlNlcXVlbmNlXCIgJiYgIW1hcHBlci54bWxJc1dyYXBwZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBFZGdlIGNhc2UgZm9yIGVtcHR5IFhNTCBub24td3JhcHBlZCBsaXN0cy4geG1sMmpzIGNhbid0IGRpc3Rpbmd1aXNoXG4gICAgICAgICAgICAgICAgLy8gYmV0d2VlbiB0aGUgbGlzdCBiZWluZyBlbXB0eSB2ZXJzdXMgYmVpbmcgbWlzc2luZyxcbiAgICAgICAgICAgICAgICAvLyBzbyBsZXQncyBkbyB0aGUgbW9yZSB1c2VyLWZyaWVuZGx5IHRoaW5nIGFuZCByZXR1cm4gYW4gZW1wdHkgbGlzdC5cbiAgICAgICAgICAgICAgICByZXNwb25zZUJvZHkgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHNwZWNpZmljYWxseSBjaGVjayBmb3IgdW5kZWZpbmVkIGFzIGRlZmF1bHQgdmFsdWUgY2FuIGJlIGEgZmFsc2V5IHZhbHVlIGAwLCBcIlwiLCBmYWxzZSwgbnVsbGBcbiAgICAgICAgICAgIGlmIChtYXBwZXIuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZUJvZHkgPSBtYXBwZXIuZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlQm9keTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGF5bG9hZDtcbiAgICAgICAgY29uc3QgbWFwcGVyVHlwZSA9IG1hcHBlci50eXBlLm5hbWU7XG4gICAgICAgIGlmICghb2JqZWN0TmFtZSkge1xuICAgICAgICAgICAgb2JqZWN0TmFtZSA9IG1hcHBlci5zZXJpYWxpemVkTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXkNvbXBvc2l0ZSQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHBheWxvYWQgPSBkZXNlcmlhbGl6ZUNvbXBvc2l0ZVR5cGUodGhpcywgbWFwcGVyLCByZXNwb25zZUJvZHksIG9iamVjdE5hbWUsIHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzWE1MKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhcktleSA9IHVwZGF0ZWRPcHRpb25zLnhtbENoYXJLZXk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FzdFJlc3BvbnNlQm9keSA9IHJlc3BvbnNlQm9keTtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBJZiB0aGUgbWFwcGVyIHNwZWNpZmllcyB0aGlzIGFzIGEgbm9uLWNvbXBvc2l0ZSB0eXBlIHZhbHVlIGJ1dCB0aGUgcmVzcG9uc2VCb2R5IGNvbnRhaW5zXG4gICAgICAgICAgICAgICAgICogYm90aCBoZWFkZXIgKFwiJFwiIGkuZS4sIFhNTF9BVFRSS0VZKSBhbmQgYm9keSAoXCIjXCIgaS5lLiwgWE1MX0NIQVJLRVkpIHByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICogdGhlbiBqdXN0IHJlZHVjZSB0aGUgcmVzcG9uc2VCb2R5IHZhbHVlIHRvIHRoZSBib2R5IChcIiNcIiBpLmUuLCBYTUxfQ0hBUktFWSkgcHJvcGVydHkuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgaWYgKGNhc3RSZXNwb25zZUJvZHlbWE1MX0FUVFJLRVldICE9IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICBjYXN0UmVzcG9uc2VCb2R5W3htbENoYXJLZXldICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZUJvZHkgPSBjYXN0UmVzcG9uc2VCb2R5W3htbENoYXJLZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXBwZXJUeXBlLm1hdGNoKC9eTnVtYmVyJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBwYXJzZUZsb2F0KHJlc3BvbnNlQm9keSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKHBheWxvYWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSByZXNwb25zZUJvZHk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXkJvb2xlYW4kL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlQm9keSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3BvbnNlQm9keSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSByZXNwb25zZUJvZHk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXihTdHJpbmd8RW51bXxPYmplY3R8U3RyZWFtfFV1aWR8VGltZVNwYW58YW55KSQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gcmVzcG9uc2VCb2R5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXihEYXRlfERhdGVUaW1lfERhdGVUaW1lUmZjMTEyMykkL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IG5ldyBEYXRlKHJlc3BvbnNlQm9keSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXBwZXJUeXBlLm1hdGNoKC9eVW5peFRpbWUkL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IHVuaXhUaW1lVG9EYXRlKHJlc3BvbnNlQm9keSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXBwZXJUeXBlLm1hdGNoKC9eQnl0ZUFycmF5JC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBiYXNlNjQuZGVjb2RlU3RyaW5nKHJlc3BvbnNlQm9keSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXBwZXJUeXBlLm1hdGNoKC9eQmFzZTY0VXJsJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBiYXNlNjRVcmxUb0J5dGVBcnJheShyZXNwb25zZUJvZHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXlNlcXVlbmNlJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBkZXNlcmlhbGl6ZVNlcXVlbmNlVHlwZSh0aGlzLCBtYXBwZXIsIHJlc3BvbnNlQm9keSwgb2JqZWN0TmFtZSwgdXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXkRpY3Rpb25hcnkkL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IGRlc2VyaWFsaXplRGljdGlvbmFyeVR5cGUodGhpcywgbWFwcGVyLCByZXNwb25zZUJvZHksIG9iamVjdE5hbWUsIHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWFwcGVyLmlzQ29uc3RhbnQpIHtcbiAgICAgICAgICAgIHBheWxvYWQgPSBtYXBwZXIuZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRyaW1FbmQoc3RyLCBjaCkge1xuICAgIGxldCBsZW4gPSBzdHIubGVuZ3RoO1xuICAgIHdoaWxlIChsZW4gLSAxID49IDAgJiYgc3RyW2xlbiAtIDFdID09PSBjaCkge1xuICAgICAgICAtLWxlbjtcbiAgICB9XG4gICAgcmV0dXJuIHN0ci5zdWJzdHIoMCwgbGVuKTtcbn1cbmZ1bmN0aW9uIGJ1ZmZlclRvQmFzZTY0VXJsKGJ1ZmZlcikge1xuICAgIGlmICghYnVmZmVyKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghKGJ1ZmZlciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUGxlYXNlIHByb3ZpZGUgYW4gaW5wdXQgb2YgdHlwZSBVaW50OEFycmF5IGZvciBjb252ZXJ0aW5nIHRvIEJhc2U2NFVybC5gKTtcbiAgICB9XG4gICAgLy8gVWludDhBcnJheSB0byBCYXNlNjQuXG4gICAgY29uc3Qgc3RyID0gYmFzZTY0LmVuY29kZUJ5dGVBcnJheShidWZmZXIpO1xuICAgIC8vIEJhc2U2NCB0byBCYXNlNjRVcmwuXG4gICAgcmV0dXJuIHRyaW1FbmQoc3RyLCBcIj1cIikucmVwbGFjZSgvXFwrL2csIFwiLVwiKS5yZXBsYWNlKC9cXC8vZywgXCJfXCIpO1xufVxuZnVuY3Rpb24gYmFzZTY0VXJsVG9CeXRlQXJyYXkoc3RyKSB7XG4gICAgaWYgKCFzdHIpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHN0ciAmJiB0eXBlb2Ygc3RyLnZhbHVlT2YoKSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQbGVhc2UgcHJvdmlkZSBhbiBpbnB1dCBvZiB0eXBlIHN0cmluZyBmb3IgY29udmVydGluZyB0byBVaW50OEFycmF5XCIpO1xuICAgIH1cbiAgICAvLyBCYXNlNjRVcmwgdG8gQmFzZTY0LlxuICAgIHN0ciA9IHN0ci5yZXBsYWNlKC8tL2csIFwiK1wiKS5yZXBsYWNlKC9fL2csIFwiL1wiKTtcbiAgICAvLyBCYXNlNjQgdG8gVWludDhBcnJheS5cbiAgICByZXR1cm4gYmFzZTY0LmRlY29kZVN0cmluZyhzdHIpO1xufVxuZnVuY3Rpb24gc3BsaXRTZXJpYWxpemVOYW1lKHByb3ApIHtcbiAgICBjb25zdCBjbGFzc2VzID0gW107XG4gICAgbGV0IHBhcnRpYWxjbGFzcyA9IFwiXCI7XG4gICAgaWYgKHByb3ApIHtcbiAgICAgICAgY29uc3Qgc3Vid29yZHMgPSBwcm9wLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHN1YndvcmRzKSB7XG4gICAgICAgICAgICBpZiAoaXRlbS5jaGFyQXQoaXRlbS5sZW5ndGggLSAxKSA9PT0gXCJcXFxcXCIpIHtcbiAgICAgICAgICAgICAgICBwYXJ0aWFsY2xhc3MgKz0gaXRlbS5zdWJzdHIoMCwgaXRlbS5sZW5ndGggLSAxKSArIFwiLlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFydGlhbGNsYXNzICs9IGl0ZW07XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKHBhcnRpYWxjbGFzcyk7XG4gICAgICAgICAgICAgICAgcGFydGlhbGNsYXNzID0gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xhc3Nlcztcbn1cbmZ1bmN0aW9uIGRhdGVUb1VuaXhUaW1lKGQpIHtcbiAgICBpZiAoIWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkLnZhbHVlT2YoKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBkID0gbmV3IERhdGUoZCk7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLmZsb29yKGQuZ2V0VGltZSgpIC8gMTAwMCk7XG59XG5mdW5jdGlvbiB1bml4VGltZVRvRGF0ZShuKSB7XG4gICAgaWYgKCFuKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZShuICogMTAwMCk7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVCYXNpY1R5cGVzKHR5cGVOYW1lLCBvYmplY3ROYW1lLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlTmFtZS5tYXRjaCgvXk51bWJlciQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0TmFtZX0gd2l0aCB2YWx1ZSAke3ZhbHVlfSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVOYW1lLm1hdGNoKC9eU3RyaW5nJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS52YWx1ZU9mKCkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0TmFtZX0gd2l0aCB2YWx1ZSBcIiR7dmFsdWV9XCIgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlTmFtZS5tYXRjaCgvXlV1aWQkL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoISh0eXBlb2YgdmFsdWUudmFsdWVPZigpID09PSBcInN0cmluZ1wiICYmIHV0aWxzLmlzVmFsaWRVdWlkKHZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0TmFtZX0gd2l0aCB2YWx1ZSBcIiR7dmFsdWV9XCIgbXVzdCBiZSBvZiB0eXBlIHN0cmluZyBhbmQgYSB2YWxpZCB1dWlkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVOYW1lLm1hdGNoKC9eQm9vbGVhbiQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdE5hbWV9IHdpdGggdmFsdWUgJHt2YWx1ZX0gbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZU5hbWUubWF0Y2goL15TdHJlYW0kL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBvYmplY3RUeXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgICAgICAgaWYgKG9iamVjdFR5cGUgIT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICBvYmplY3RUeXBlICE9PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpICYmXG4gICAgICAgICAgICAgICAgIUFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZSkgJiZcbiAgICAgICAgICAgICAgICAhKCh0eXBlb2YgQmxvYiA9PT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiBCbG9iID09PSBcIm9iamVjdFwiKSAmJiB2YWx1ZSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdE5hbWV9IG11c3QgYmUgYSBzdHJpbmcsIEJsb2IsIEFycmF5QnVmZmVyLCBBcnJheUJ1ZmZlclZpZXcsIG9yIGEgZnVuY3Rpb24gcmV0dXJuaW5nIE5vZGVKUy5SZWFkYWJsZVN0cmVhbS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVFbnVtVHlwZShvYmplY3ROYW1lLCBhbGxvd2VkVmFsdWVzLCB2YWx1ZSkge1xuICAgIGlmICghYWxsb3dlZFZhbHVlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsZWFzZSBwcm92aWRlIGEgc2V0IG9mIGFsbG93ZWRWYWx1ZXMgdG8gdmFsaWRhdGUgJHtvYmplY3ROYW1lfSBhcyBhbiBFbnVtIFR5cGUuYCk7XG4gICAgfVxuICAgIGNvbnN0IGlzUHJlc2VudCA9IGFsbG93ZWRWYWx1ZXMuc29tZSgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW0udmFsdWVPZigpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbS50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtID09PSB2YWx1ZTtcbiAgICB9KTtcbiAgICBpZiAoIWlzUHJlc2VudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dmFsdWV9IGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciAke29iamVjdE5hbWV9LiBUaGUgdmFsaWQgdmFsdWVzIGFyZTogJHtKU09OLnN0cmluZ2lmeShhbGxvd2VkVmFsdWVzKX0uYCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZUJ5dGVBcnJheVR5cGUob2JqZWN0TmFtZSwgdmFsdWUpIHtcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSBcIlwiO1xuICAgIGlmICh2YWx1ZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdE5hbWV9IG11c3QgYmUgb2YgdHlwZSBVaW50OEFycmF5LmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVyblZhbHVlID0gYmFzZTY0LmVuY29kZUJ5dGVBcnJheSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZUJhc2U2NFVybFR5cGUob2JqZWN0TmFtZSwgdmFsdWUpIHtcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSBcIlwiO1xuICAgIGlmICh2YWx1ZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdE5hbWV9IG11c3QgYmUgb2YgdHlwZSBVaW50OEFycmF5LmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVyblZhbHVlID0gYnVmZmVyVG9CYXNlNjRVcmwodmFsdWUpIHx8IFwiXCI7XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZURhdGVUeXBlcyh0eXBlTmFtZSwgdmFsdWUsIG9iamVjdE5hbWUpIHtcbiAgICBpZiAodmFsdWUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlTmFtZS5tYXRjaCgvXkRhdGUkL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAgICAgICAgICAgICAodHlwZW9mIHZhbHVlLnZhbHVlT2YoKSA9PT0gXCJzdHJpbmdcIiAmJiAhaXNOYU4oRGF0ZS5wYXJzZSh2YWx1ZSkpKSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0TmFtZX0gbXVzdCBiZSBhbiBpbnN0YW5jZW9mIERhdGUgb3IgYSBzdHJpbmcgaW4gSVNPODYwMSBmb3JtYXQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZSA9XG4gICAgICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBEYXRlXG4gICAgICAgICAgICAgICAgICAgID8gdmFsdWUudG9JU09TdHJpbmcoKS5zdWJzdHJpbmcoMCwgMTApXG4gICAgICAgICAgICAgICAgICAgIDogbmV3IERhdGUodmFsdWUpLnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDEwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlTmFtZS5tYXRjaCgvXkRhdGVUaW1lJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICAgICAgICAgICAgKHR5cGVvZiB2YWx1ZS52YWx1ZU9mKCkgPT09IFwic3RyaW5nXCIgJiYgIWlzTmFOKERhdGUucGFyc2UodmFsdWUpKSkpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdE5hbWV9IG11c3QgYmUgYW4gaW5zdGFuY2VvZiBEYXRlIG9yIGEgc3RyaW5nIGluIElTTzg2MDEgZm9ybWF0LmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyB2YWx1ZS50b0lTT1N0cmluZygpIDogbmV3IERhdGUodmFsdWUpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZU5hbWUubWF0Y2goL15EYXRlVGltZVJmYzExMjMkL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAgICAgICAgICAgICAodHlwZW9mIHZhbHVlLnZhbHVlT2YoKSA9PT0gXCJzdHJpbmdcIiAmJiAhaXNOYU4oRGF0ZS5wYXJzZSh2YWx1ZSkpKSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0TmFtZX0gbXVzdCBiZSBhbiBpbnN0YW5jZW9mIERhdGUgb3IgYSBzdHJpbmcgaW4gUkZDLTExMjMgZm9ybWF0LmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyB2YWx1ZS50b1VUQ1N0cmluZygpIDogbmV3IERhdGUodmFsdWUpLnRvVVRDU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZU5hbWUubWF0Y2goL15Vbml4VGltZSQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICAgICAgICAgICAgICh0eXBlb2YgdmFsdWUudmFsdWVPZigpID09PSBcInN0cmluZ1wiICYmICFpc05hTihEYXRlLnBhcnNlKHZhbHVlKSkpKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3ROYW1lfSBtdXN0IGJlIGFuIGluc3RhbmNlb2YgRGF0ZSBvciBhIHN0cmluZyBpbiBSRkMtMTEyMy9JU084NjAxIGZvcm1hdCBgICtcbiAgICAgICAgICAgICAgICAgICAgYGZvciBpdCB0byBiZSBzZXJpYWxpemVkIGluIFVuaXhUaW1lL0Vwb2NoIGZvcm1hdC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlID0gZGF0ZVRvVW5peFRpbWUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVOYW1lLm1hdGNoKC9eVGltZVNwYW4kL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoIXV0aWxzLmlzRHVyYXRpb24odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdE5hbWV9IG11c3QgYmUgYSBzdHJpbmcgaW4gSVNPIDg2MDEgZm9ybWF0LiBJbnN0ZWFkIHdhcyBcIiR7dmFsdWV9XCIuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gc2VyaWFsaXplU2VxdWVuY2VUeXBlKHNlcmlhbGl6ZXIsIG1hcHBlciwgb2JqZWN0LCBvYmplY3ROYW1lLCBpc1htbCwgb3B0aW9ucykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3ROYW1lfSBtdXN0IGJlIG9mIHR5cGUgQXJyYXkuYCk7XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gbWFwcGVyLnR5cGUuZWxlbWVudDtcbiAgICBpZiAoIWVsZW1lbnRUeXBlIHx8IHR5cGVvZiBlbGVtZW50VHlwZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGVsZW1lbnRcIiBtZXRhZGF0YSBmb3IgYW4gQXJyYXkgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBgICtcbiAgICAgICAgICAgIGBtYXBwZXIgYW5kIGl0IG11c3Qgb2YgdHlwZSBcIm9iamVjdFwiIGluICR7b2JqZWN0TmFtZX0uYCk7XG4gICAgfVxuICAgIGNvbnN0IHRlbXBBcnJheSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqZWN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRWYWx1ZSA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKGVsZW1lbnRUeXBlLCBvYmplY3RbaV0sIG9iamVjdE5hbWUsIG9wdGlvbnMpO1xuICAgICAgICBpZiAoaXNYbWwgJiYgZWxlbWVudFR5cGUueG1sTmFtZXNwYWNlKSB7XG4gICAgICAgICAgICBjb25zdCB4bWxuc0tleSA9IGVsZW1lbnRUeXBlLnhtbE5hbWVzcGFjZVByZWZpeFxuICAgICAgICAgICAgICAgID8gYHhtbG5zOiR7ZWxlbWVudFR5cGUueG1sTmFtZXNwYWNlUHJlZml4fWBcbiAgICAgICAgICAgICAgICA6IFwieG1sbnNcIjtcbiAgICAgICAgICAgIGlmIChlbGVtZW50VHlwZS50eXBlLm5hbWUgPT09IFwiQ29tcG9zaXRlXCIpIHtcbiAgICAgICAgICAgICAgICB0ZW1wQXJyYXlbaV0gPSBPYmplY3QuYXNzaWduKHt9LCBzZXJpYWxpemVkVmFsdWUpO1xuICAgICAgICAgICAgICAgIHRlbXBBcnJheVtpXVtYTUxfQVRUUktFWV0gPSB7IFt4bWxuc0tleV06IGVsZW1lbnRUeXBlLnhtbE5hbWVzcGFjZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGVtcEFycmF5W2ldID0ge307XG4gICAgICAgICAgICAgICAgdGVtcEFycmF5W2ldW29wdGlvbnMueG1sQ2hhcktleV0gPSBzZXJpYWxpemVkVmFsdWU7XG4gICAgICAgICAgICAgICAgdGVtcEFycmF5W2ldW1hNTF9BVFRSS0VZXSA9IHsgW3htbG5zS2V5XTogZWxlbWVudFR5cGUueG1sTmFtZXNwYWNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0ZW1wQXJyYXlbaV0gPSBzZXJpYWxpemVkVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRlbXBBcnJheTtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZURpY3Rpb25hcnlUeXBlKHNlcmlhbGl6ZXIsIG1hcHBlciwgb2JqZWN0LCBvYmplY3ROYW1lLCBpc1htbCwgb3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb2JqZWN0ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3ROYW1lfSBtdXN0IGJlIG9mIHR5cGUgb2JqZWN0LmApO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZVR5cGUgPSBtYXBwZXIudHlwZS52YWx1ZTtcbiAgICBpZiAoIXZhbHVlVHlwZSB8fCB0eXBlb2YgdmFsdWVUeXBlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJ2YWx1ZVwiIG1ldGFkYXRhIGZvciBhIERpY3Rpb25hcnkgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBgICtcbiAgICAgICAgICAgIGBtYXBwZXIgYW5kIGl0IG11c3Qgb2YgdHlwZSBcIm9iamVjdFwiIGluICR7b2JqZWN0TmFtZX0uYCk7XG4gICAgfVxuICAgIGNvbnN0IHRlbXBEaWN0aW9uYXJ5ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqZWN0KSkge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkVmFsdWUgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1ZVR5cGUsIG9iamVjdFtrZXldLCBvYmplY3ROYW1lLCBvcHRpb25zKTtcbiAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgbmVlZHMgYW4gWE1MIG5hbWVzcGFjZSB3ZSBuZWVkIHRvIGFkZCBpdCB3aXRoaW4gdGhlICQgcHJvcGVydHlcbiAgICAgICAgdGVtcERpY3Rpb25hcnlba2V5XSA9IGdldFhtbE9iamVjdFZhbHVlKHZhbHVlVHlwZSwgc2VyaWFsaXplZFZhbHVlLCBpc1htbCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIEFkZCB0aGUgbmFtZXNwYWNlIHRvIHRoZSByb290IGVsZW1lbnQgaWYgbmVlZGVkXG4gICAgaWYgKGlzWG1sICYmIG1hcHBlci54bWxOYW1lc3BhY2UpIHtcbiAgICAgICAgY29uc3QgeG1sbnNLZXkgPSBtYXBwZXIueG1sTmFtZXNwYWNlUHJlZml4ID8gYHhtbG5zOiR7bWFwcGVyLnhtbE5hbWVzcGFjZVByZWZpeH1gIDogXCJ4bWxuc1wiO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0ZW1wRGljdGlvbmFyeTtcbiAgICAgICAgcmVzdWx0W1hNTF9BVFRSS0VZXSA9IHsgW3htbG5zS2V5XTogbWFwcGVyLnhtbE5hbWVzcGFjZSB9O1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gdGVtcERpY3Rpb25hcnk7XG59XG4vKipcbiAqIFJlc29sdmVzIHRoZSBhZGRpdGlvbmFsUHJvcGVydGllcyBwcm9wZXJ0eSBmcm9tIGEgcmVmZXJlbmNlZCBtYXBwZXIuXG4gKiBAcGFyYW0gc2VyaWFsaXplciAtIFRoZSBzZXJpYWxpemVyIGNvbnRhaW5pbmcgdGhlIGVudGlyZSBzZXQgb2YgbWFwcGVycy5cbiAqIEBwYXJhbSBtYXBwZXIgLSBUaGUgY29tcG9zaXRlIG1hcHBlciB0byByZXNvbHZlLlxuICogQHBhcmFtIG9iamVjdE5hbWUgLSBOYW1lIG9mIHRoZSBvYmplY3QgYmVpbmcgc2VyaWFsaXplZC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUFkZGl0aW9uYWxQcm9wZXJ0aWVzKHNlcmlhbGl6ZXIsIG1hcHBlciwgb2JqZWN0TmFtZSkge1xuICAgIGNvbnN0IGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gbWFwcGVyLnR5cGUuYWRkaXRpb25hbFByb3BlcnRpZXM7XG4gICAgaWYgKCFhZGRpdGlvbmFsUHJvcGVydGllcyAmJiBtYXBwZXIudHlwZS5jbGFzc05hbWUpIHtcbiAgICAgICAgY29uc3QgbW9kZWxNYXBwZXIgPSByZXNvbHZlUmVmZXJlbmNlZE1hcHBlcihzZXJpYWxpemVyLCBtYXBwZXIsIG9iamVjdE5hbWUpO1xuICAgICAgICByZXR1cm4gbW9kZWxNYXBwZXIgPT09IG51bGwgfHwgbW9kZWxNYXBwZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1vZGVsTWFwcGVyLnR5cGUuYWRkaXRpb25hbFByb3BlcnRpZXM7XG4gICAgfVxuICAgIHJldHVybiBhZGRpdGlvbmFsUHJvcGVydGllcztcbn1cbi8qKlxuICogRmluZHMgdGhlIG1hcHBlciByZWZlcmVuY2VkIGJ5IGBjbGFzc05hbWVgLlxuICogQHBhcmFtIHNlcmlhbGl6ZXIgLSBUaGUgc2VyaWFsaXplciBjb250YWluaW5nIHRoZSBlbnRpcmUgc2V0IG9mIG1hcHBlcnNcbiAqIEBwYXJhbSBtYXBwZXIgLSBUaGUgY29tcG9zaXRlIG1hcHBlciB0byByZXNvbHZlXG4gKiBAcGFyYW0gb2JqZWN0TmFtZSAtIE5hbWUgb2YgdGhlIG9iamVjdCBiZWluZyBzZXJpYWxpemVkXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSZWZlcmVuY2VkTWFwcGVyKHNlcmlhbGl6ZXIsIG1hcHBlciwgb2JqZWN0TmFtZSkge1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IG1hcHBlci50eXBlLmNsYXNzTmFtZTtcbiAgICBpZiAoIWNsYXNzTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENsYXNzIG5hbWUgZm9yIG1vZGVsIFwiJHtvYmplY3ROYW1lfVwiIGlzIG5vdCBwcm92aWRlZCBpbiB0aGUgbWFwcGVyIFwiJHtKU09OLnN0cmluZ2lmeShtYXBwZXIsIHVuZGVmaW5lZCwgMil9XCIuYCk7XG4gICAgfVxuICAgIHJldHVybiBzZXJpYWxpemVyLm1vZGVsTWFwcGVyc1tjbGFzc05hbWVdO1xufVxuLyoqXG4gKiBSZXNvbHZlcyBhIGNvbXBvc2l0ZSBtYXBwZXIncyBtb2RlbFByb3BlcnRpZXMuXG4gKiBAcGFyYW0gc2VyaWFsaXplciAtIFRoZSBzZXJpYWxpemVyIGNvbnRhaW5pbmcgdGhlIGVudGlyZSBzZXQgb2YgbWFwcGVyc1xuICogQHBhcmFtIG1hcHBlciAtIFRoZSBjb21wb3NpdGUgbWFwcGVyIHRvIHJlc29sdmVcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU1vZGVsUHJvcGVydGllcyhzZXJpYWxpemVyLCBtYXBwZXIsIG9iamVjdE5hbWUpIHtcbiAgICBsZXQgbW9kZWxQcm9wcyA9IG1hcHBlci50eXBlLm1vZGVsUHJvcGVydGllcztcbiAgICBpZiAoIW1vZGVsUHJvcHMpIHtcbiAgICAgICAgY29uc3QgbW9kZWxNYXBwZXIgPSByZXNvbHZlUmVmZXJlbmNlZE1hcHBlcihzZXJpYWxpemVyLCBtYXBwZXIsIG9iamVjdE5hbWUpO1xuICAgICAgICBpZiAoIW1vZGVsTWFwcGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG1hcHBlcigpIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZCBmb3IgbW9kZWwgXCIke21hcHBlci50eXBlLmNsYXNzTmFtZX1cIi5gKTtcbiAgICAgICAgfVxuICAgICAgICBtb2RlbFByb3BzID0gbW9kZWxNYXBwZXIgPT09IG51bGwgfHwgbW9kZWxNYXBwZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1vZGVsTWFwcGVyLnR5cGUubW9kZWxQcm9wZXJ0aWVzO1xuICAgICAgICBpZiAoIW1vZGVsUHJvcHMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbW9kZWxQcm9wZXJ0aWVzIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZCBpbiB0aGUgYCArXG4gICAgICAgICAgICAgICAgYG1hcHBlciBcIiR7SlNPTi5zdHJpbmdpZnkobW9kZWxNYXBwZXIpfVwiIG9mIHR5cGUgXCIke21hcHBlci50eXBlLmNsYXNzTmFtZX1cIiBmb3Igb2JqZWN0IFwiJHtvYmplY3ROYW1lfVwiLmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtb2RlbFByb3BzO1xufVxuZnVuY3Rpb24gc2VyaWFsaXplQ29tcG9zaXRlVHlwZShzZXJpYWxpemVyLCBtYXBwZXIsIG9iamVjdCwgb2JqZWN0TmFtZSwgaXNYbWwsIG9wdGlvbnMpIHtcbiAgICBpZiAoZ2V0UG9seW1vcnBoaWNEaXNjcmltaW5hdG9yUmVjdXJzaXZlbHkoc2VyaWFsaXplciwgbWFwcGVyKSkge1xuICAgICAgICBtYXBwZXIgPSBnZXRQb2x5bW9ycGhpY01hcHBlcihzZXJpYWxpemVyLCBtYXBwZXIsIG9iamVjdCwgXCJjbGllbnROYW1lXCIpO1xuICAgIH1cbiAgICBpZiAob2JqZWN0ICE9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IG1vZGVsUHJvcHMgPSByZXNvbHZlTW9kZWxQcm9wZXJ0aWVzKHNlcmlhbGl6ZXIsIG1hcHBlciwgb2JqZWN0TmFtZSk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG1vZGVsUHJvcHMpKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0eU1hcHBlciA9IG1vZGVsUHJvcHNba2V5XTtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eU1hcHBlci5yZWFkT25seSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHByb3BOYW1lO1xuICAgICAgICAgICAgbGV0IHBhcmVudE9iamVjdCA9IHBheWxvYWQ7XG4gICAgICAgICAgICBpZiAoc2VyaWFsaXplci5pc1hNTCkge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU1hcHBlci54bWxJc1dyYXBwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWUgPSBwcm9wZXJ0eU1hcHBlci54bWxOYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWUgPSBwcm9wZXJ0eU1hcHBlci54bWxFbGVtZW50TmFtZSB8fCBwcm9wZXJ0eU1hcHBlci54bWxOYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhzID0gc3BsaXRTZXJpYWxpemVOYW1lKHByb3BlcnR5TWFwcGVyLnNlcmlhbGl6ZWROYW1lKTtcbiAgICAgICAgICAgICAgICBwcm9wTmFtZSA9IHBhdGhzLnBvcCgpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGF0aE5hbWUgb2YgcGF0aHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRPYmplY3QgPSBwYXJlbnRPYmplY3RbcGF0aE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRPYmplY3QgPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAob2JqZWN0W2tleV0gIT0gdW5kZWZpbmVkIHx8IHByb3BlcnR5TWFwcGVyLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50T2JqZWN0W3BhdGhOYW1lXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudE9iamVjdCA9IHBhcmVudE9iamVjdFtwYXRoTmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcmVudE9iamVjdCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNYbWwgJiYgbWFwcGVyLnhtbE5hbWVzcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxuc0tleSA9IG1hcHBlci54bWxOYW1lc3BhY2VQcmVmaXhcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYHhtbG5zOiR7bWFwcGVyLnhtbE5hbWVzcGFjZVByZWZpeH1gXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwieG1sbnNcIjtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50T2JqZWN0W1hNTF9BVFRSS0VZXSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGFyZW50T2JqZWN0W1hNTF9BVFRSS0VZXSksIHsgW3htbG5zS2V5XTogbWFwcGVyLnhtbE5hbWVzcGFjZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlPYmplY3ROYW1lID0gcHJvcGVydHlNYXBwZXIuc2VyaWFsaXplZE5hbWUgIT09IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgPyBvYmplY3ROYW1lICsgXCIuXCIgKyBwcm9wZXJ0eU1hcHBlci5zZXJpYWxpemVkTmFtZVxuICAgICAgICAgICAgICAgICAgICA6IG9iamVjdE5hbWU7XG4gICAgICAgICAgICAgICAgbGV0IHRvU2VyaWFsaXplID0gb2JqZWN0W2tleV07XG4gICAgICAgICAgICAgICAgY29uc3QgcG9seW1vcnBoaWNEaXNjcmltaW5hdG9yID0gZ2V0UG9seW1vcnBoaWNEaXNjcmltaW5hdG9yUmVjdXJzaXZlbHkoc2VyaWFsaXplciwgbWFwcGVyKTtcbiAgICAgICAgICAgICAgICBpZiAocG9seW1vcnBoaWNEaXNjcmltaW5hdG9yICYmXG4gICAgICAgICAgICAgICAgICAgIHBvbHltb3JwaGljRGlzY3JpbWluYXRvci5jbGllbnROYW1lID09PSBrZXkgJiZcbiAgICAgICAgICAgICAgICAgICAgdG9TZXJpYWxpemUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvU2VyaWFsaXplID0gbWFwcGVyLnNlcmlhbGl6ZWROYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkVmFsdWUgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShwcm9wZXJ0eU1hcHBlciwgdG9TZXJpYWxpemUsIHByb3BlcnR5T2JqZWN0TmFtZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BOYW1lICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldFhtbE9iamVjdFZhbHVlKHByb3BlcnR5TWFwcGVyLCBzZXJpYWxpemVkVmFsdWUsIGlzWG1sLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzWG1sICYmIHByb3BlcnR5TWFwcGVyLnhtbElzQXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBYTUxfQVRUUktFWSwgaS5lLiwgJCBpcyB0aGUga2V5IGF0dHJpYnV0ZXMgYXJlIGtlcHQgdW5kZXIgaW4geG1sMmpzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBrZWVwcyB0aGluZ3Mgc2ltcGxlIHdoaWxlIHByZXZlbnRpbmcgbmFtZSBjb2xsaXNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggbmFtZXMgaW4gdXNlciBkb2N1bWVudHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRPYmplY3RbWE1MX0FUVFJLRVldID0gcGFyZW50T2JqZWN0W1hNTF9BVFRSS0VZXSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE9iamVjdFtYTUxfQVRUUktFWV1bcHJvcE5hbWVdID0gc2VyaWFsaXplZFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzWG1sICYmIHByb3BlcnR5TWFwcGVyLnhtbElzV3JhcHBlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50T2JqZWN0W3Byb3BOYW1lXSA9IHsgW3Byb3BlcnR5TWFwcGVyLnhtbEVsZW1lbnROYW1lXTogdmFsdWUgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE9iamVjdFtwcm9wTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUHJvcGVydGllc01hcHBlciA9IHJlc29sdmVBZGRpdGlvbmFsUHJvcGVydGllcyhzZXJpYWxpemVyLCBtYXBwZXIsIG9iamVjdE5hbWUpO1xuICAgICAgICBpZiAoYWRkaXRpb25hbFByb3BlcnRpZXNNYXBwZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lcyA9IE9iamVjdC5rZXlzKG1vZGVsUHJvcHMpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjbGllbnRQcm9wTmFtZSBpbiBvYmplY3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0FkZGl0aW9uYWxQcm9wZXJ0eSA9IHByb3BOYW1lcy5ldmVyeSgocG4pID0+IHBuICE9PSBjbGllbnRQcm9wTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzQWRkaXRpb25hbFByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWRbY2xpZW50UHJvcE5hbWVdID0gc2VyaWFsaXplci5zZXJpYWxpemUoYWRkaXRpb25hbFByb3BlcnRpZXNNYXBwZXIsIG9iamVjdFtjbGllbnRQcm9wTmFtZV0sIG9iamVjdE5hbWUgKyAnW1wiJyArIGNsaWVudFByb3BOYW1lICsgJ1wiXScsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbn1cbmZ1bmN0aW9uIGdldFhtbE9iamVjdFZhbHVlKHByb3BlcnR5TWFwcGVyLCBzZXJpYWxpemVkVmFsdWUsIGlzWG1sLCBvcHRpb25zKSB7XG4gICAgaWYgKCFpc1htbCB8fCAhcHJvcGVydHlNYXBwZXIueG1sTmFtZXNwYWNlKSB7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkVmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IHhtbG5zS2V5ID0gcHJvcGVydHlNYXBwZXIueG1sTmFtZXNwYWNlUHJlZml4XG4gICAgICAgID8gYHhtbG5zOiR7cHJvcGVydHlNYXBwZXIueG1sTmFtZXNwYWNlUHJlZml4fWBcbiAgICAgICAgOiBcInhtbG5zXCI7XG4gICAgY29uc3QgeG1sTmFtZXNwYWNlID0geyBbeG1sbnNLZXldOiBwcm9wZXJ0eU1hcHBlci54bWxOYW1lc3BhY2UgfTtcbiAgICBpZiAoW1wiQ29tcG9zaXRlXCJdLmluY2x1ZGVzKHByb3BlcnR5TWFwcGVyLnR5cGUubmFtZSkpIHtcbiAgICAgICAgaWYgKHNlcmlhbGl6ZWRWYWx1ZVtYTUxfQVRUUktFWV0pIHtcbiAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBzZXJpYWxpemVkVmFsdWUpO1xuICAgICAgICAgICAgcmVzdWx0W1hNTF9BVFRSS0VZXSA9IHhtbE5hbWVzcGFjZTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgcmVzdWx0W29wdGlvbnMueG1sQ2hhcktleV0gPSBzZXJpYWxpemVkVmFsdWU7XG4gICAgcmVzdWx0W1hNTF9BVFRSS0VZXSA9IHhtbE5hbWVzcGFjZTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gaXNTcGVjaWFsWG1sUHJvcGVydHkocHJvcGVydHlOYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIFtYTUxfQVRUUktFWSwgb3B0aW9ucy54bWxDaGFyS2V5XS5pbmNsdWRlcyhwcm9wZXJ0eU5hbWUpO1xufVxuZnVuY3Rpb24gZGVzZXJpYWxpemVDb21wb3NpdGVUeXBlKHNlcmlhbGl6ZXIsIG1hcHBlciwgcmVzcG9uc2VCb2R5LCBvYmplY3ROYW1lLCBvcHRpb25zKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBjb25zdCB4bWxDaGFyS2V5ID0gKF9hID0gb3B0aW9ucy54bWxDaGFyS2V5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBYTUxfQ0hBUktFWTtcbiAgICBpZiAoZ2V0UG9seW1vcnBoaWNEaXNjcmltaW5hdG9yUmVjdXJzaXZlbHkoc2VyaWFsaXplciwgbWFwcGVyKSkge1xuICAgICAgICBtYXBwZXIgPSBnZXRQb2x5bW9ycGhpY01hcHBlcihzZXJpYWxpemVyLCBtYXBwZXIsIHJlc3BvbnNlQm9keSwgXCJzZXJpYWxpemVkTmFtZVwiKTtcbiAgICB9XG4gICAgY29uc3QgbW9kZWxQcm9wcyA9IHJlc29sdmVNb2RlbFByb3BlcnRpZXMoc2VyaWFsaXplciwgbWFwcGVyLCBvYmplY3ROYW1lKTtcbiAgICBsZXQgaW5zdGFuY2UgPSB7fTtcbiAgICBjb25zdCBoYW5kbGVkUHJvcGVydHlOYW1lcyA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG1vZGVsUHJvcHMpKSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5TWFwcGVyID0gbW9kZWxQcm9wc1trZXldO1xuICAgICAgICBjb25zdCBwYXRocyA9IHNwbGl0U2VyaWFsaXplTmFtZShtb2RlbFByb3BzW2tleV0uc2VyaWFsaXplZE5hbWUpO1xuICAgICAgICBoYW5kbGVkUHJvcGVydHlOYW1lcy5wdXNoKHBhdGhzWzBdKTtcbiAgICAgICAgY29uc3QgeyBzZXJpYWxpemVkTmFtZSwgeG1sTmFtZSwgeG1sRWxlbWVudE5hbWUgfSA9IHByb3BlcnR5TWFwcGVyO1xuICAgICAgICBsZXQgcHJvcGVydHlPYmplY3ROYW1lID0gb2JqZWN0TmFtZTtcbiAgICAgICAgaWYgKHNlcmlhbGl6ZWROYW1lICE9PSBcIlwiICYmIHNlcmlhbGl6ZWROYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHByb3BlcnR5T2JqZWN0TmFtZSA9IG9iamVjdE5hbWUgKyBcIi5cIiArIHNlcmlhbGl6ZWROYW1lO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhlYWRlckNvbGxlY3Rpb25QcmVmaXggPSBwcm9wZXJ0eU1hcHBlci5oZWFkZXJDb2xsZWN0aW9uUHJlZml4O1xuICAgICAgICBpZiAoaGVhZGVyQ29sbGVjdGlvblByZWZpeCkge1xuICAgICAgICAgICAgY29uc3QgZGljdGlvbmFyeSA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBoZWFkZXJLZXkgb2YgT2JqZWN0LmtleXMocmVzcG9uc2VCb2R5KSkge1xuICAgICAgICAgICAgICAgIGlmIChoZWFkZXJLZXkuc3RhcnRzV2l0aChoZWFkZXJDb2xsZWN0aW9uUHJlZml4KSkge1xuICAgICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5W2hlYWRlcktleS5zdWJzdHJpbmcoaGVhZGVyQ29sbGVjdGlvblByZWZpeC5sZW5ndGgpXSA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocHJvcGVydHlNYXBwZXIudHlwZS52YWx1ZSwgcmVzcG9uc2VCb2R5W2hlYWRlcktleV0sIHByb3BlcnR5T2JqZWN0TmFtZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZWRQcm9wZXJ0eU5hbWVzLnB1c2goaGVhZGVyS2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluc3RhbmNlW2tleV0gPSBkaWN0aW9uYXJ5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNlcmlhbGl6ZXIuaXNYTUwpIHtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eU1hcHBlci54bWxJc0F0dHJpYnV0ZSAmJiByZXNwb25zZUJvZHlbWE1MX0FUVFJLRVldKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2Vba2V5XSA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocHJvcGVydHlNYXBwZXIsIHJlc3BvbnNlQm9keVtYTUxfQVRUUktFWV1beG1sTmFtZV0sIHByb3BlcnR5T2JqZWN0TmFtZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eU1hcHBlci54bWxJc01zVGV4dCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUJvZHlbeG1sQ2hhcktleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVtrZXldID0gcmVzcG9uc2VCb2R5W3htbENoYXJLZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgcmVzcG9uc2VCb2R5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUgeG1sIHBhcnNlciBwYXJzZXMgXCI8TmFtZT5jb250ZW50PC9OYW1lPlwiIGludG8gSlNPTiBvZlxuICAgICAgICAgICAgICAgICAgICAvLyAgIGB7IG5hbWU6IFwiY29udGVudFwifWAgaW5zdGVhZCBvZiBgeyBuYW1lOiB7IFwiX1wiOiBcImNvbnRlbnRcIiB9fWBcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Vba2V5XSA9IHJlc3BvbnNlQm9keTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSB4bWxFbGVtZW50TmFtZSB8fCB4bWxOYW1lIHx8IHNlcmlhbGl6ZWROYW1lO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU1hcHBlci54bWxJc1dyYXBwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyogYSBsaXN0IG9mIDx4bWxFbGVtZW50TmFtZT4gd3JhcHBlZCBieSA8eG1sTmFtZT5cbiAgICAgICAgICAgICAgICAgICAgICBGb3IgdGhlIHhtbCBleGFtcGxlIGJlbG93XG4gICAgICAgICAgICAgICAgICAgICAgICA8Q29ycz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPENvcnNSdWxlPi4uLjwvQ29yc1J1bGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxDb3JzUnVsZT4uLi48L0NvcnNSdWxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9Db3JzPlxuICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXNwb25zZUJvZHkgaGFzXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIENvcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JzUnVsZTogW3suLi59LCB7Li4ufV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHhtbE5hbWUgaXMgXCJDb3JzXCIgYW5kIHhtbEVsZW1lbnROYW1lIGlzXCJDb3JzUnVsZVwiLlxuICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3cmFwcGVkID0gcmVzcG9uc2VCb2R5W3htbE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50TGlzdCA9IChfYiA9IHdyYXBwZWQgPT09IG51bGwgfHwgd3JhcHBlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogd3JhcHBlZFt4bWxFbGVtZW50TmFtZV0pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFtdO1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVtrZXldID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShwcm9wZXJ0eU1hcHBlciwgZWxlbWVudExpc3QsIHByb3BlcnR5T2JqZWN0TmFtZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZWRQcm9wZXJ0eU5hbWVzLnB1c2goeG1sTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHJlc3BvbnNlQm9keVtwcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVtrZXldID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShwcm9wZXJ0eU1hcHBlciwgcHJvcGVydHksIHByb3BlcnR5T2JqZWN0TmFtZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZWRQcm9wZXJ0eU5hbWVzLnB1c2gocHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBkZXNlcmlhbGl6ZSB0aGUgcHJvcGVydHkgaWYgaXQgaXMgcHJlc2VudCBpbiB0aGUgcHJvdmlkZWQgcmVzcG9uc2VCb2R5IGluc3RhbmNlXG4gICAgICAgICAgICBsZXQgcHJvcGVydHlJbnN0YW5jZTtcbiAgICAgICAgICAgIGxldCByZXMgPSByZXNwb25zZUJvZHk7XG4gICAgICAgICAgICAvLyB0cmF2ZXJzaW5nIHRoZSBvYmplY3Qgc3RlcCBieSBzdGVwLlxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBhdGhzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXMpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIHJlcyA9IHJlc1tpdGVtXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb3BlcnR5SW5zdGFuY2UgPSByZXM7XG4gICAgICAgICAgICBjb25zdCBwb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3IgPSBtYXBwZXIudHlwZS5wb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3I7XG4gICAgICAgICAgICAvLyBjaGVja2luZyB0aGF0IHRoZSBtb2RlbCBwcm9wZXJ0eSBuYW1lIChrZXkpKGV4OiBcImZpc2h0eXBlXCIpIGFuZCB0aGVcbiAgICAgICAgICAgIC8vIGNsaWVudE5hbWUgb2YgdGhlIHBvbHltb3JwaGljRGlzY3JpbWluYXRvciB7bWV0YWRhdGF9IChleDogXCJmaXNodHlwZVwiKVxuICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiB0aGUgc2VyaWFsaXplZE5hbWUgb2YgdGhlIHBvbHltb3JwaGljRGlzY3JpbWluYXRvciAoZXg6IFwiZmlzaC50eXBlXCIpXG4gICAgICAgICAgICAvLyBpcyBhIGJldHRlciBhcHByb2FjaC4gVGhlIGdlbmVyYXRvciBpcyBub3QgY29uc2lzdGVudCB3aXRoIGVzY2FwaW5nICdcXC4nIGluIHRoZVxuICAgICAgICAgICAgLy8gc2VyaWFsaXplZE5hbWUgb2YgdGhlIHByb3BlcnR5IChleDogXCJmaXNoXFwudHlwZVwiKSB0aGF0IGlzIG1hcmtlZCBhcyBwb2x5bW9ycGhpYyBkaXNjcmltaW5hdG9yXG4gICAgICAgICAgICAvLyBhbmQgdGhlIHNlcmlhbGl6ZWROYW1lIG9mIHRoZSBtZXRhZGF0YSBwb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3IgKGV4OiBcImZpc2gudHlwZVwiKS4gSG93ZXZlcixcbiAgICAgICAgICAgIC8vIHRoZSBjbGllbnROYW1lIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBwb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3IgKGV4OiBcImZpc2h0eXBlXCIpIGFuZFxuICAgICAgICAgICAgLy8gdGhlIHRyYW5zZm9ybWF0aW9uIG9mIG1vZGVsIHByb3BlcnR5IG5hbWUgKGV4OiBcImZpc2h0eXBlXCIpIGlzIGRvbmUgY29uc2lzdGVudGx5LlxuICAgICAgICAgICAgLy8gSGVuY2UsIGl0IGlzIGEgc2FmZXIgYmV0IHRvIHJlbHkgb24gdGhlIGNsaWVudE5hbWUgb2YgdGhlIHBvbHltb3JwaGljRGlzY3JpbWluYXRvci5cbiAgICAgICAgICAgIGlmIChwb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3IgJiZcbiAgICAgICAgICAgICAgICBrZXkgPT09IHBvbHltb3JwaGljRGlzY3JpbWluYXRvci5jbGllbnROYW1lICYmXG4gICAgICAgICAgICAgICAgcHJvcGVydHlJbnN0YW5jZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUluc3RhbmNlID0gbWFwcGVyLnNlcmlhbGl6ZWROYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHNlcmlhbGl6ZWRWYWx1ZTtcbiAgICAgICAgICAgIC8vIHBhZ2luZ1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzcG9uc2VCb2R5W2tleV0pICYmIG1vZGVsUHJvcHNba2V5XS5zZXJpYWxpemVkTmFtZSA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgIHByb3BlcnR5SW5zdGFuY2UgPSByZXNwb25zZUJvZHlba2V5XTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheUluc3RhbmNlID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShwcm9wZXJ0eU1hcHBlciwgcHJvcGVydHlJbnN0YW5jZSwgcHJvcGVydHlPYmplY3ROYW1lLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAvLyBDb3B5IG92ZXIgYW55IHByb3BlcnRpZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCBpbnRvIHRoZSBpbnN0YW5jZSwgd2hlcmUgdGhleSBkb1xuICAgICAgICAgICAgICAgIC8vIG5vdCBleGlzdCBvbiB0aGUgbmV3bHkgZGUtc2VyaWFsaXplZCBhcnJheVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGluc3RhbmNlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcnJheUluc3RhbmNlLCBrKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlJbnN0YW5jZVtrXSA9IHY7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBhcnJheUluc3RhbmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHlJbnN0YW5jZSAhPT0gdW5kZWZpbmVkIHx8IHByb3BlcnR5TWFwcGVyLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZFZhbHVlID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShwcm9wZXJ0eU1hcHBlciwgcHJvcGVydHlJbnN0YW5jZSwgcHJvcGVydHlPYmplY3ROYW1lLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZVtrZXldID0gc2VyaWFsaXplZFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGFkZGl0aW9uYWxQcm9wZXJ0aWVzTWFwcGVyID0gbWFwcGVyLnR5cGUuYWRkaXRpb25hbFByb3BlcnRpZXM7XG4gICAgaWYgKGFkZGl0aW9uYWxQcm9wZXJ0aWVzTWFwcGVyKSB7XG4gICAgICAgIGNvbnN0IGlzQWRkaXRpb25hbFByb3BlcnR5ID0gKHJlc3BvbnNlUHJvcE5hbWUpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2xpZW50UHJvcE5hbWUgaW4gbW9kZWxQcm9wcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhzID0gc3BsaXRTZXJpYWxpemVOYW1lKG1vZGVsUHJvcHNbY2xpZW50UHJvcE5hbWVdLnNlcmlhbGl6ZWROYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAocGF0aHNbMF0gPT09IHJlc3BvbnNlUHJvcE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlUHJvcE5hbWUgaW4gcmVzcG9uc2VCb2R5KSB7XG4gICAgICAgICAgICBpZiAoaXNBZGRpdGlvbmFsUHJvcGVydHkocmVzcG9uc2VQcm9wTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZVtyZXNwb25zZVByb3BOYW1lXSA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoYWRkaXRpb25hbFByb3BlcnRpZXNNYXBwZXIsIHJlc3BvbnNlQm9keVtyZXNwb25zZVByb3BOYW1lXSwgb2JqZWN0TmFtZSArICdbXCInICsgcmVzcG9uc2VQcm9wTmFtZSArICdcIl0nLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChyZXNwb25zZUJvZHkpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVzcG9uc2VCb2R5KSkge1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlW2tleV0gPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICFoYW5kbGVkUHJvcGVydHlOYW1lcy5pbmNsdWRlcyhrZXkpICYmXG4gICAgICAgICAgICAgICAgIWlzU3BlY2lhbFhtbFByb3BlcnR5KGtleSwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZVtrZXldID0gcmVzcG9uc2VCb2R5W2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gZGVzZXJpYWxpemVEaWN0aW9uYXJ5VHlwZShzZXJpYWxpemVyLCBtYXBwZXIsIHJlc3BvbnNlQm9keSwgb2JqZWN0TmFtZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlID0gbWFwcGVyLnR5cGUudmFsdWU7XG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcInZhbHVlXCIgbWV0YWRhdGEgZm9yIGEgRGljdGlvbmFyeSBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIGAgK1xuICAgICAgICAgICAgYG1hcHBlciBhbmQgaXQgbXVzdCBvZiB0eXBlIFwib2JqZWN0XCIgaW4gJHtvYmplY3ROYW1lfWApO1xuICAgIH1cbiAgICBpZiAocmVzcG9uc2VCb2R5KSB7XG4gICAgICAgIGNvbnN0IHRlbXBEaWN0aW9uYXJ5ID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3BvbnNlQm9keSkpIHtcbiAgICAgICAgICAgIHRlbXBEaWN0aW9uYXJ5W2tleV0gPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKHZhbHVlLCByZXNwb25zZUJvZHlba2V5XSwgb2JqZWN0TmFtZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRlbXBEaWN0aW9uYXJ5O1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2VCb2R5O1xufVxuZnVuY3Rpb24gZGVzZXJpYWxpemVTZXF1ZW5jZVR5cGUoc2VyaWFsaXplciwgbWFwcGVyLCByZXNwb25zZUJvZHksIG9iamVjdE5hbWUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gbWFwcGVyLnR5cGUuZWxlbWVudDtcbiAgICBpZiAoIWVsZW1lbnQgfHwgdHlwZW9mIGVsZW1lbnQgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBlbGVtZW50XCIgbWV0YWRhdGEgZm9yIGFuIEFycmF5IG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgYCArXG4gICAgICAgICAgICBgbWFwcGVyIGFuZCBpdCBtdXN0IG9mIHR5cGUgXCJvYmplY3RcIiBpbiAke29iamVjdE5hbWV9YCk7XG4gICAgfVxuICAgIGlmIChyZXNwb25zZUJvZHkpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlc3BvbnNlQm9keSkpIHtcbiAgICAgICAgICAgIC8vIHhtbDJqcyB3aWxsIGludGVycHJldCBhIHNpbmdsZSBlbGVtZW50IGFycmF5IGFzIGp1c3QgdGhlIGVsZW1lbnQsIHNvIGZvcmNlIGl0IHRvIGJlIGFuIGFycmF5XG4gICAgICAgICAgICByZXNwb25zZUJvZHkgPSBbcmVzcG9uc2VCb2R5XTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZW1wQXJyYXkgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNwb25zZUJvZHkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRlbXBBcnJheVtpXSA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZWxlbWVudCwgcmVzcG9uc2VCb2R5W2ldLCBgJHtvYmplY3ROYW1lfVske2l9XWAsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZW1wQXJyYXk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZUJvZHk7XG59XG5mdW5jdGlvbiBnZXRQb2x5bW9ycGhpY01hcHBlcihzZXJpYWxpemVyLCBtYXBwZXIsIG9iamVjdCwgcG9seW1vcnBoaWNQcm9wZXJ0eU5hbWUpIHtcbiAgICBjb25zdCBwb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3IgPSBnZXRQb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3JSZWN1cnNpdmVseShzZXJpYWxpemVyLCBtYXBwZXIpO1xuICAgIGlmIChwb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3IpIHtcbiAgICAgICAgY29uc3QgZGlzY3JpbWluYXRvck5hbWUgPSBwb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3JbcG9seW1vcnBoaWNQcm9wZXJ0eU5hbWVdO1xuICAgICAgICBpZiAoZGlzY3JpbWluYXRvck5hbWUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBkaXNjcmltaW5hdG9yVmFsdWUgPSBvYmplY3RbZGlzY3JpbWluYXRvck5hbWVdO1xuICAgICAgICAgICAgaWYgKGRpc2NyaW1pbmF0b3JWYWx1ZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlTmFtZSA9IG1hcHBlci50eXBlLnViZXJQYXJlbnQgfHwgbWFwcGVyLnR5cGUuY2xhc3NOYW1lO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4RGlzY3JpbWluYXRvciA9IGRpc2NyaW1pbmF0b3JWYWx1ZSA9PT0gdHlwZU5hbWVcbiAgICAgICAgICAgICAgICAgICAgPyBkaXNjcmltaW5hdG9yVmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiB0eXBlTmFtZSArIFwiLlwiICsgZGlzY3JpbWluYXRvclZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvbHltb3JwaGljTWFwcGVyID0gc2VyaWFsaXplci5tb2RlbE1hcHBlcnMuZGlzY3JpbWluYXRvcnNbaW5kZXhEaXNjcmltaW5hdG9yXTtcbiAgICAgICAgICAgICAgICBpZiAocG9seW1vcnBoaWNNYXBwZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwcGVyID0gcG9seW1vcnBoaWNNYXBwZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXBwZXI7XG59XG5mdW5jdGlvbiBnZXRQb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3JSZWN1cnNpdmVseShzZXJpYWxpemVyLCBtYXBwZXIpIHtcbiAgICByZXR1cm4gKG1hcHBlci50eXBlLnBvbHltb3JwaGljRGlzY3JpbWluYXRvciB8fFxuICAgICAgICBnZXRQb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3JTYWZlbHkoc2VyaWFsaXplciwgbWFwcGVyLnR5cGUudWJlclBhcmVudCkgfHxcbiAgICAgICAgZ2V0UG9seW1vcnBoaWNEaXNjcmltaW5hdG9yU2FmZWx5KHNlcmlhbGl6ZXIsIG1hcHBlci50eXBlLmNsYXNzTmFtZSkpO1xufVxuZnVuY3Rpb24gZ2V0UG9seW1vcnBoaWNEaXNjcmltaW5hdG9yU2FmZWx5KHNlcmlhbGl6ZXIsIHR5cGVOYW1lKSB7XG4gICAgcmV0dXJuICh0eXBlTmFtZSAmJlxuICAgICAgICBzZXJpYWxpemVyLm1vZGVsTWFwcGVyc1t0eXBlTmFtZV0gJiZcbiAgICAgICAgc2VyaWFsaXplci5tb2RlbE1hcHBlcnNbdHlwZU5hbWVdLnR5cGUucG9seW1vcnBoaWNEaXNjcmltaW5hdG9yKTtcbn1cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiB0aGF0IHNlcmlhbGl6ZXMgYW4gb2JqZWN0IHRoYXQgbWlnaHQgY29udGFpbiBiaW5hcnkgaW5mb3JtYXRpb24gaW50byBhIHBsYWluIG9iamVjdCwgYXJyYXkgb3IgYSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVPYmplY3QodG9TZXJpYWxpemUpIHtcbiAgICBjb25zdCBjYXN0VG9TZXJpYWxpemUgPSB0b1NlcmlhbGl6ZTtcbiAgICBpZiAodG9TZXJpYWxpemUgPT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0b1NlcmlhbGl6ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgdG9TZXJpYWxpemUgPSBiYXNlNjQuZW5jb2RlQnl0ZUFycmF5KHRvU2VyaWFsaXplKTtcbiAgICAgICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICAgIH1cbiAgICBlbHNlIGlmICh0b1NlcmlhbGl6ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRvU2VyaWFsaXplLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodG9TZXJpYWxpemUpKSB7XG4gICAgICAgIGNvbnN0IGFycmF5ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9TZXJpYWxpemUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFycmF5LnB1c2goc2VyaWFsaXplT2JqZWN0KHRvU2VyaWFsaXplW2ldKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgdG9TZXJpYWxpemUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgY29uc3QgZGljdGlvbmFyeSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHRvU2VyaWFsaXplKSB7XG4gICAgICAgICAgICBkaWN0aW9uYXJ5W3Byb3BlcnR5XSA9IHNlcmlhbGl6ZU9iamVjdChjYXN0VG9TZXJpYWxpemVbcHJvcGVydHldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGljdGlvbmFyeTtcbiAgICB9XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xufVxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIEs6ViBmcm9tIGEgbGlzdCBvZiBzdHJpbmdzXG4gKi9cbmZ1bmN0aW9uIHN0ckVudW0obykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIG8pIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBrZXk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIFN0cmluZyBlbnVtIGNvbnRhaW5pbmcgdGhlIHN0cmluZyB0eXBlcyBvZiBwcm9wZXJ0eSBtYXBwZXJzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlZGVjbGFyZVxuZXhwb3J0IGNvbnN0IE1hcHBlclR5cGUgPSBzdHJFbnVtKFtcbiAgICBcIkJhc2U2NFVybFwiLFxuICAgIFwiQm9vbGVhblwiLFxuICAgIFwiQnl0ZUFycmF5XCIsXG4gICAgXCJDb21wb3NpdGVcIixcbiAgICBcIkRhdGVcIixcbiAgICBcIkRhdGVUaW1lXCIsXG4gICAgXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICBcIkRpY3Rpb25hcnlcIixcbiAgICBcIkVudW1cIixcbiAgICBcIk51bWJlclwiLFxuICAgIFwiT2JqZWN0XCIsXG4gICAgXCJTZXF1ZW5jZVwiLFxuICAgIFwiU3RyaW5nXCIsXG4gICAgXCJTdHJlYW1cIixcbiAgICBcIlRpbWVTcGFuXCIsXG4gICAgXCJVbml4VGltZVwiLFxuXSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZXJpYWxpemVyLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqXG4gKiBDb2RlIGdlbmVyYXRlZCBieSBNaWNyb3NvZnQgKFIpIEF1dG9SZXN0IENvZGUgR2VuZXJhdG9yLlxuICogQ2hhbmdlcyBtYXkgY2F1c2UgaW5jb3JyZWN0IGJlaGF2aW9yIGFuZCB3aWxsIGJlIGxvc3QgaWYgdGhlIGNvZGUgaXMgcmVnZW5lcmF0ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBCbG9iU2VydmljZVByb3BlcnRpZXMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYlNlcnZpY2VQcm9wZXJ0aWVzXCIsXG4gICAgeG1sTmFtZTogXCJTdG9yYWdlU2VydmljZVByb3BlcnRpZXNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iU2VydmljZVByb3BlcnRpZXNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBibG9iQW5hbHl0aWNzTG9nZ2luZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkxvZ2dpbmdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkxvZ2dpbmdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJMb2dnaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaG91ck1ldHJpY3M6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJIb3VyTWV0cmljc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiSG91ck1ldHJpY3NcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJNZXRyaWNzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWludXRlTWV0cmljczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk1pbnV0ZU1ldHJpY3NcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk1pbnV0ZU1ldHJpY3NcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJNZXRyaWNzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29yczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvcnNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNvcnNcIixcbiAgICAgICAgICAgICAgICB4bWxJc1dyYXBwZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sRWxlbWVudE5hbWU6IFwiQ29yc1J1bGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU2VxdWVuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkNvcnNSdWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWZhdWx0U2VydmljZVZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJEZWZhdWx0U2VydmljZVZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkRlZmF1bHRTZXJ2aWNlVmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWxldGVSZXRlbnRpb25Qb2xpY3k6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJEZWxldGVSZXRlbnRpb25Qb2xpY3lcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkRlbGV0ZVJldGVudGlvblBvbGljeVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlJldGVudGlvblBvbGljeVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YXRpY1dlYnNpdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTdGF0aWNXZWJzaXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJTdGF0aWNXZWJzaXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiU3RhdGljV2Vic2l0ZVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBMb2dnaW5nID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkxvZ2dpbmdcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJMb2dnaW5nXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlZlcnNpb25cIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVsZXRlUHJvcGVydHk6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJEZWxldGVcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkRlbGV0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVhZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlJlYWRcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlJlYWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdyaXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiV3JpdGVcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIldyaXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXRlbnRpb25Qb2xpY3k6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJSZXRlbnRpb25Qb2xpY3lcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlJldGVudGlvblBvbGljeVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlJldGVudGlvblBvbGljeVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBSZXRlbnRpb25Qb2xpY3kgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiUmV0ZW50aW9uUG9saWN5XCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUmV0ZW50aW9uUG9saWN5XCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZW5hYmxlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkVuYWJsZWRcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkVuYWJsZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRheXM6IHtcbiAgICAgICAgICAgICAgICBjb25zdHJhaW50czoge1xuICAgICAgICAgICAgICAgICAgICBJbmNsdXNpdmVNaW5pbXVtOiAxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJEYXlzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJEYXlzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBNZXRyaWNzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIk1ldHJpY3NcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJNZXRyaWNzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5hYmxlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkVuYWJsZWRcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkVuYWJsZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluY2x1ZGVBUElzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiSW5jbHVkZUFQSXNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkluY2x1ZGVBUElzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXRlbnRpb25Qb2xpY3k6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJSZXRlbnRpb25Qb2xpY3lcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlJldGVudGlvblBvbGljeVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlJldGVudGlvblBvbGljeVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBDb3JzUnVsZSA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb3JzUnVsZVwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvcnNSdWxlXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgYWxsb3dlZE9yaWdpbnM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJBbGxvd2VkT3JpZ2luc1wiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQWxsb3dlZE9yaWdpbnNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJBbGxvd2VkTWV0aG9kc1wiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQWxsb3dlZE1ldGhvZHNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWxsb3dlZEhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJBbGxvd2VkSGVhZGVyc1wiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQWxsb3dlZEhlYWRlcnNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXhwb3NlZEhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJFeHBvc2VkSGVhZGVyc1wiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRXhwb3NlZEhlYWRlcnNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWF4QWdlSW5TZWNvbmRzOiB7XG4gICAgICAgICAgICAgICAgY29uc3RyYWludHM6IHtcbiAgICAgICAgICAgICAgICAgICAgSW5jbHVzaXZlTWluaW11bTogMFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTWF4QWdlSW5TZWNvbmRzXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJNYXhBZ2VJblNlY29uZHNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFN0YXRpY1dlYnNpdGUgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU3RhdGljV2Vic2l0ZVwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlN0YXRpY1dlYnNpdGVcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlbmFibGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRW5hYmxlZFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRW5hYmxlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5kZXhEb2N1bWVudDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkluZGV4RG9jdW1lbnRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkluZGV4RG9jdW1lbnRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JEb2N1bWVudDQwNFBhdGg6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJFcnJvckRvY3VtZW50NDA0UGF0aFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRXJyb3JEb2N1bWVudDQwNFBhdGhcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVmYXVsdEluZGV4RG9jdW1lbnRQYXRoOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRGVmYXVsdEluZGV4RG9jdW1lbnRQYXRoXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJEZWZhdWx0SW5kZXhEb2N1bWVudFBhdGhcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFN0b3JhZ2VFcnJvciA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJTdG9yYWdlRXJyb3JcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJTdG9yYWdlRXJyb3JcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBtZXNzYWdlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTWVzc2FnZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTWVzc2FnZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYlNlcnZpY2VTdGF0aXN0aWNzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JTZXJ2aWNlU3RhdGlzdGljc1wiLFxuICAgIHhtbE5hbWU6IFwiU3RvcmFnZVNlcnZpY2VTdGF0c1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JTZXJ2aWNlU3RhdGlzdGljc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGdlb1JlcGxpY2F0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiR2VvUmVwbGljYXRpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkdlb1JlcGxpY2F0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiR2VvUmVwbGljYXRpb25cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgR2VvUmVwbGljYXRpb24gPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiR2VvUmVwbGljYXRpb25cIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJHZW9SZXBsaWNhdGlvblwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHN0YXR1czoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wibGl2ZVwiLCBcImJvb3RzdHJhcFwiLCBcInVuYXZhaWxhYmxlXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RTeW5jT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJMYXN0U3luY1RpbWVcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkxhc3RTeW5jVGltZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgTGlzdENvbnRhaW5lcnNTZWdtZW50UmVzcG9uc2UgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiTGlzdENvbnRhaW5lcnNTZWdtZW50UmVzcG9uc2VcIixcbiAgICB4bWxOYW1lOiBcIkVudW1lcmF0aW9uUmVzdWx0c1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkxpc3RDb250YWluZXJzU2VnbWVudFJlc3BvbnNlXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgc2VydmljZUVuZHBvaW50OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZUVuZHBvaW50XCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJTZXJ2aWNlRW5kcG9pbnRcIixcbiAgICAgICAgICAgICAgICB4bWxJc0F0dHJpYnV0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJlZml4OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiUHJlZml4XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJQcmVmaXhcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWFya2VyOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTWFya2VyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJNYXJrZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWF4UGFnZVNpemU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJNYXhSZXN1bHRzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJNYXhSZXN1bHRzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRhaW5lckl0ZW1zOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVySXRlbXNcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNvbnRhaW5lcnNcIixcbiAgICAgICAgICAgICAgICB4bWxJc1dyYXBwZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sRWxlbWVudE5hbWU6IFwiQ29udGFpbmVyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNlcXVlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250aW51YXRpb25Ub2tlbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk5leHRNYXJrZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk5leHRNYXJrZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lckl0ZW0gPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVySXRlbVwiLFxuICAgIHhtbE5hbWU6IFwiQ29udGFpbmVyXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVySXRlbVwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJOYW1lXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJOYW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlbGV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJEZWxldGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJEZWxldGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiVmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiVmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiUHJvcGVydGllc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUHJvcGVydGllc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lclByb3BlcnRpZXNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk1ldGFkYXRhXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJNZXRhZGF0YVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEaWN0aW9uYXJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7IHR5cGU6IHsgbmFtZTogXCJTdHJpbmdcIiB9IH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lclByb3BlcnRpZXMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyUHJvcGVydGllc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lclByb3BlcnRpZXNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJMYXN0LU1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJMYXN0LU1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJFdGFnXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJFdGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlU3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTGVhc2VTdGF0dXNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkxlYXNlU3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wibG9ja2VkXCIsIFwidW5sb2NrZWRcIl1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VTdGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkxlYXNlU3RhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkxlYXNlU3RhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcImF2YWlsYWJsZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsZWFzZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZXhwaXJlZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJicmVha2luZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJicm9rZW5cIlxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlRHVyYXRpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJMZWFzZUR1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJMZWFzZUR1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiaW5maW5pdGVcIiwgXCJmaXhlZFwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwdWJsaWNBY2Nlc3M6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJQdWJsaWNBY2Nlc3NcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlB1YmxpY0FjY2Vzc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcImNvbnRhaW5lclwiLCBcImJsb2JcIl1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGFzSW1tdXRhYmlsaXR5UG9saWN5OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiSGFzSW1tdXRhYmlsaXR5UG9saWN5XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJIYXNJbW11dGFiaWxpdHlQb2xpY3lcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhhc0xlZ2FsSG9sZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkhhc0xlZ2FsSG9sZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiSGFzTGVnYWxIb2xkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWZhdWx0RW5jcnlwdGlvblNjb3BlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRGVmYXVsdEVuY3J5cHRpb25TY29wZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRGVmYXVsdEVuY3J5cHRpb25TY29wZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmV2ZW50RW5jcnlwdGlvblNjb3BlT3ZlcnJpZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJEZW55RW5jcnlwdGlvblNjb3BlT3ZlcnJpZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkRlbnlFbmNyeXB0aW9uU2NvcGVPdmVycmlkZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVsZXRlZE9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRGVsZXRlZFRpbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkRlbGV0ZWRUaW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlbWFpbmluZ1JldGVudGlvbkRheXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJSZW1haW5pbmdSZXRlbnRpb25EYXlzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJSZW1haW5pbmdSZXRlbnRpb25EYXlzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzSW1tdXRhYmxlU3RvcmFnZVdpdGhWZXJzaW9uaW5nRW5hYmxlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkltbXV0YWJsZVN0b3JhZ2VXaXRoVmVyc2lvbmluZ0VuYWJsZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkltbXV0YWJsZVN0b3JhZ2VXaXRoVmVyc2lvbmluZ0VuYWJsZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBLZXlJbmZvID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIktleUluZm9cIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJLZXlJbmZvXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgc3RhcnRzT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTdGFydFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU3RhcnRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXhwaXJlc09uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRXhwaXJ5XCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJFeHBpcnlcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFVzZXJEZWxlZ2F0aW9uS2V5ID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlVzZXJEZWxlZ2F0aW9uS2V5XCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiVXNlckRlbGVnYXRpb25LZXlcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBzaWduZWRPYmplY3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNpZ25lZE9pZFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU2lnbmVkT2lkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpZ25lZFRlbmFudElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU2lnbmVkVGlkXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJTaWduZWRUaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2lnbmVkU3RhcnRzT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTaWduZWRTdGFydFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU2lnbmVkU3RhcnRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2lnbmVkRXhwaXJlc09uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU2lnbmVkRXhwaXJ5XCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJTaWduZWRFeHBpcnlcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2lnbmVkU2VydmljZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNpZ25lZFNlcnZpY2VcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlNpZ25lZFNlcnZpY2VcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2lnbmVkVmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNpZ25lZFZlcnNpb25cIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlNpZ25lZFZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJWYWx1ZVwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiVmFsdWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEZpbHRlckJsb2JTZWdtZW50ID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkZpbHRlckJsb2JTZWdtZW50XCIsXG4gICAgeG1sTmFtZTogXCJFbnVtZXJhdGlvblJlc3VsdHNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJGaWx0ZXJCbG9iU2VnbWVudFwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHNlcnZpY2VFbmRwb2ludDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlcnZpY2VFbmRwb2ludFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU2VydmljZUVuZHBvaW50XCIsXG4gICAgICAgICAgICAgICAgeG1sSXNBdHRyaWJ1dGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdoZXJlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiV2hlcmVcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIldoZXJlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYnNcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkJsb2JzXCIsXG4gICAgICAgICAgICAgICAgeG1sSXNXcmFwcGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIkJsb2JcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU2VxdWVuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkZpbHRlckJsb2JJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250aW51YXRpb25Ub2tlbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk5leHRNYXJrZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk5leHRNYXJrZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEZpbHRlckJsb2JJdGVtID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkZpbHRlckJsb2JJdGVtXCIsXG4gICAgeG1sTmFtZTogXCJCbG9iXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiRmlsdGVyQmxvYkl0ZW1cIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBuYW1lOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTmFtZVwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTmFtZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250YWluZXJOYW1lOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyTmFtZVwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ29udGFpbmVyTmFtZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0YWdzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiVGFnc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiVGFnc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JUYWdzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JUYWdzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JUYWdzXCIsXG4gICAgeG1sTmFtZTogXCJUYWdzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlRhZ3NcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBibG9iVGFnU2V0OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYlRhZ1NldFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiVGFnU2V0XCIsXG4gICAgICAgICAgICAgICAgeG1sSXNXcmFwcGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIlRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTZXF1ZW5jZVwiLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlRhZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JUYWcgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYlRhZ1wiLFxuICAgIHhtbE5hbWU6IFwiVGFnXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlRhZ1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGtleToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIktleVwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiS2V5XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiVmFsdWVcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlZhbHVlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBTaWduZWRJZGVudGlmaWVyID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNpZ25lZElkZW50aWZpZXJcIixcbiAgICB4bWxOYW1lOiBcIlNpZ25lZElkZW50aWZpZXJcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJTaWduZWRJZGVudGlmaWVyXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgaWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJJZFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiSWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWNjZXNzUG9saWN5OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQWNjZXNzUG9saWN5XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJBY2Nlc3NQb2xpY3lcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJBY2Nlc3NQb2xpY3lcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQWNjZXNzUG9saWN5ID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkFjY2Vzc1BvbGljeVwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkFjY2Vzc1BvbGljeVwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHN0YXJ0c09uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU3RhcnRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4cGlyZXNPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkV4cGlyeVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRXhwaXJ5XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiUGVybWlzc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUGVybWlzc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgTGlzdEJsb2JzRmxhdFNlZ21lbnRSZXNwb25zZSA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJMaXN0QmxvYnNGbGF0U2VnbWVudFJlc3BvbnNlXCIsXG4gICAgeG1sTmFtZTogXCJFbnVtZXJhdGlvblJlc3VsdHNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJMaXN0QmxvYnNGbGF0U2VnbWVudFJlc3BvbnNlXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgc2VydmljZUVuZHBvaW50OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZUVuZHBvaW50XCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJTZXJ2aWNlRW5kcG9pbnRcIixcbiAgICAgICAgICAgICAgICB4bWxJc0F0dHJpYnV0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGFpbmVyTmFtZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lck5hbWVcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNvbnRhaW5lck5hbWVcIixcbiAgICAgICAgICAgICAgICB4bWxJc0F0dHJpYnV0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJlZml4OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiUHJlZml4XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJQcmVmaXhcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWFya2VyOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTWFya2VyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJNYXJrZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWF4UGFnZVNpemU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJNYXhSZXN1bHRzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJNYXhSZXN1bHRzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlZ21lbnQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTZWdtZW50XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJCbG9ic1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JGbGF0TGlzdFNlZ21lbnRcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250aW51YXRpb25Ub2tlbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk5leHRNYXJrZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk5leHRNYXJrZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JGbGF0TGlzdFNlZ21lbnQgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYkZsYXRMaXN0U2VnbWVudFwiLFxuICAgIHhtbE5hbWU6IFwiQmxvYnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iRmxhdExpc3RTZWdtZW50XCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgYmxvYkl0ZW1zOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYkl0ZW1zXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJCbG9iSXRlbXNcIixcbiAgICAgICAgICAgICAgICB4bWxFbGVtZW50TmFtZTogXCJCbG9iXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNlcXVlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJCbG9iSXRlbUludGVybmFsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYkl0ZW1JbnRlcm5hbCA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iSXRlbUludGVybmFsXCIsXG4gICAgeG1sTmFtZTogXCJCbG9iXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkl0ZW1JbnRlcm5hbFwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJOYW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJOYW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQmxvYk5hbWVcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWxldGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRGVsZXRlZFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRGVsZXRlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc25hcHNob3Q6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTbmFwc2hvdFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU25hcHNob3RcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbklkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiVmVyc2lvbklkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJWZXJzaW9uSWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNDdXJyZW50VmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIklzQ3VycmVudFZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIklzQ3VycmVudFZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJQcm9wZXJ0aWVzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJQcm9wZXJ0aWVzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlByb3BlcnRpZXNJbnRlcm5hbFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTWV0YWRhdGFcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk1ldGFkYXRhXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRpY3Rpb25hcnlcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHsgdHlwZTogeyBuYW1lOiBcIlN0cmluZ1wiIH0gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iVGFnczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JUYWdzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJUYWdzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlRhZ3NcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvYmplY3RSZXBsaWNhdGlvbk1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiT2JqZWN0UmVwbGljYXRpb25NZXRhZGF0YVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiT3JNZXRhZGF0YVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEaWN0aW9uYXJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7IHR5cGU6IHsgbmFtZTogXCJTdHJpbmdcIiB9IH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGFzVmVyc2lvbnNPbmx5OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiSGFzVmVyc2lvbnNPbmx5XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJIYXNWZXJzaW9uc09ubHlcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iTmFtZSA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iTmFtZVwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JOYW1lXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZW5jb2RlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkVuY29kZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkVuY29kZWRcIixcbiAgICAgICAgICAgICAgICB4bWxJc0F0dHJpYnV0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50XCIsXG4gICAgICAgICAgICAgICAgeG1sSXNNc1RleHQ6IHRydWUsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iUHJvcGVydGllc0ludGVybmFsID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JQcm9wZXJ0aWVzSW50ZXJuYWxcIixcbiAgICB4bWxOYW1lOiBcIlByb3BlcnRpZXNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iUHJvcGVydGllc0ludGVybmFsXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY3JlYXRlZE9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ3JlYXRpb24tVGltZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ3JlYXRpb24tVGltZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJMYXN0LU1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJMYXN0LU1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJFdGFnXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJFdGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb250ZW50LUxlbmd0aFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ29udGVudC1MZW5ndGhcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudFR5cGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb250ZW50LVR5cGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNvbnRlbnQtVHlwZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50RW5jb2Rpbmc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb250ZW50LUVuY29kaW5nXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb250ZW50LUVuY29kaW5nXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRMYW5ndWFnZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRlbnQtTGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNvbnRlbnQtTGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudE1ENToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRlbnQtTUQ1XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb250ZW50LU1ENVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50RGlzcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb250ZW50LURpc3Bvc2l0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb250ZW50LURpc3Bvc2l0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhY2hlQ29udHJvbDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNhY2hlLUNvbnRyb2xcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNhY2hlLUNvbnRyb2xcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYlNlcXVlbmNlTnVtYmVyOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLXNlcXVlbmNlLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLXNlcXVlbmNlLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iVHlwZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JUeXBlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJCbG9iVHlwZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcIkJsb2NrQmxvYlwiLCBcIlBhZ2VCbG9iXCIsIFwiQXBwZW5kQmxvYlwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZVN0YXR1czoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkxlYXNlU3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJMZWFzZVN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcImxvY2tlZFwiLCBcInVubG9ja2VkXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlU3RhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJMZWFzZVN0YXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJMZWFzZVN0YXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJhdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGVhc2VkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImV4cGlyZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYnJlYWtpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYnJva2VuXCJcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZUR1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTGVhc2VEdXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTGVhc2VEdXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcImluZmluaXRlXCIsIFwiZml4ZWRcIl1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weUlkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29weUlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb3B5SWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVN0YXR1czoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvcHlTdGF0dXNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNvcHlTdGF0dXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJwZW5kaW5nXCIsIFwic3VjY2Vzc1wiLCBcImFib3J0ZWRcIiwgXCJmYWlsZWRcIl1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVNvdXJjZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvcHlTb3VyY2VcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNvcHlTb3VyY2VcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVByb2dyZXNzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29weVByb2dyZXNzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb3B5UHJvZ3Jlc3NcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weUNvbXBsZXRlZE9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29weUNvbXBsZXRpb25UaW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb3B5Q29tcGxldGlvblRpbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVN0YXR1c0Rlc2NyaXB0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29weVN0YXR1c0Rlc2NyaXB0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb3B5U3RhdHVzRGVzY3JpcHRpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VydmVyRW5jcnlwdGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmVyRW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJTZXJ2ZXJFbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluY3JlbWVudGFsQ29weToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkluY3JlbWVudGFsQ29weVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiSW5jcmVtZW50YWxDb3B5XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZXN0aW5hdGlvblNuYXBzaG90OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRGVzdGluYXRpb25TbmFwc2hvdFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRGVzdGluYXRpb25TbmFwc2hvdFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWxldGVkT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJEZWxldGVkVGltZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRGVsZXRlZFRpbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVtYWluaW5nUmV0ZW50aW9uRGF5czoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlJlbWFpbmluZ1JldGVudGlvbkRheXNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlJlbWFpbmluZ1JldGVudGlvbkRheXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWNjZXNzVGllcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkFjY2Vzc1RpZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkFjY2Vzc1RpZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlA0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlA2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlAxMFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJQMTVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUDIwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlAzMFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJQNDBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUDUwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlA2MFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJQNzBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUDgwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkhvdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJDb29sXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkFyY2hpdmVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQ29sZFwiXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWNjZXNzVGllckluZmVycmVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQWNjZXNzVGllckluZmVycmVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJBY2Nlc3NUaWVySW5mZXJyZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFyY2hpdmVTdGF0dXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJBcmNoaXZlU3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJBcmNoaXZlU3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJyZWh5ZHJhdGUtcGVuZGluZy10by1ob3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicmVoeWRyYXRlLXBlbmRpbmctdG8tY29vbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJyZWh5ZHJhdGUtcGVuZGluZy10by1jb2xkXCJcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjdXN0b21lclByb3ZpZGVkS2V5U2hhMjU2OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ3VzdG9tZXJQcm92aWRlZEtleVNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ3VzdG9tZXJQcm92aWRlZEtleVNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJFbmNyeXB0aW9uU2NvcGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkVuY3J5cHRpb25TY29wZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY2Nlc3NUaWVyQ2hhbmdlZE9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQWNjZXNzVGllckNoYW5nZVRpbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkFjY2Vzc1RpZXJDaGFuZ2VUaW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRhZ0NvdW50OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiVGFnQ291bnRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlRhZ0NvdW50XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4cGlyZXNPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkV4cGlyeS1UaW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJFeHBpcnktVGltZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1NlYWxlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlYWxlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU2VhbGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWh5ZHJhdGVQcmlvcml0eToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlJlaHlkcmF0ZVByaW9yaXR5XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJSZWh5ZHJhdGVQcmlvcml0eVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcIkhpZ2hcIiwgXCJTdGFuZGFyZFwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0QWNjZXNzZWRPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkxhc3RBY2Nlc3NUaW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJMYXN0QWNjZXNzVGltZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lFeHBpcmVzT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJJbW11dGFiaWxpdHlQb2xpY3lVbnRpbERhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkltbXV0YWJpbGl0eVBvbGljeVVudGlsRGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lNb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiSW1tdXRhYmlsaXR5UG9saWN5TW9kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiSW1tdXRhYmlsaXR5UG9saWN5TW9kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcIk11dGFibGVcIiwgXCJVbmxvY2tlZFwiLCBcIkxvY2tlZFwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWdhbEhvbGQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJMZWdhbEhvbGRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkxlZ2FsSG9sZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IExpc3RCbG9ic0hpZXJhcmNoeVNlZ21lbnRSZXNwb25zZSA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJMaXN0QmxvYnNIaWVyYXJjaHlTZWdtZW50UmVzcG9uc2VcIixcbiAgICB4bWxOYW1lOiBcIkVudW1lcmF0aW9uUmVzdWx0c1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkxpc3RCbG9ic0hpZXJhcmNoeVNlZ21lbnRSZXNwb25zZVwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHNlcnZpY2VFbmRwb2ludDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlcnZpY2VFbmRwb2ludFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU2VydmljZUVuZHBvaW50XCIsXG4gICAgICAgICAgICAgICAgeG1sSXNBdHRyaWJ1dGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRhaW5lck5hbWU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJOYW1lXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb250YWluZXJOYW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sSXNBdHRyaWJ1dGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByZWZpeDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlByZWZpeFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUHJlZml4XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1hcmtlcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk1hcmtlclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTWFya2VyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1heFBhZ2VTaXplOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTWF4UmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTWF4UmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWxpbWl0ZXI6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJEZWxpbWl0ZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkRlbGltaXRlclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZWdtZW50OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU2VnbWVudFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQmxvYnNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJCbG9iSGllcmFyY2h5TGlzdFNlZ21lbnRcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250aW51YXRpb25Ub2tlbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk5leHRNYXJrZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk5leHRNYXJrZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JIaWVyYXJjaHlMaXN0U2VnbWVudCA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iSGllcmFyY2h5TGlzdFNlZ21lbnRcIixcbiAgICB4bWxOYW1lOiBcIkJsb2JzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkhpZXJhcmNoeUxpc3RTZWdtZW50XCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgYmxvYlByZWZpeGVzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYlByZWZpeGVzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJCbG9iUHJlZml4ZXNcIixcbiAgICAgICAgICAgICAgICB4bWxFbGVtZW50TmFtZTogXCJCbG9iUHJlZml4XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNlcXVlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJCbG9iUHJlZml4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iSXRlbXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iSXRlbXNcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkJsb2JJdGVtc1wiLFxuICAgICAgICAgICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIkJsb2JcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU2VxdWVuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JJdGVtSW50ZXJuYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iUHJlZml4ID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JQcmVmaXhcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iUHJlZml4XCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgbmFtZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk5hbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk5hbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJCbG9iTmFtZVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9ja0xvb2t1cExpc3QgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvY2tMb29rdXBMaXN0XCIsXG4gICAgeG1sTmFtZTogXCJCbG9ja0xpc3RcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9ja0xvb2t1cExpc3RcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjb21taXR0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb21taXR0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNvbW1pdHRlZFwiLFxuICAgICAgICAgICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIkNvbW1pdHRlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTZXF1ZW5jZVwiLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVuY29tbWl0dGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiVW5jb21taXR0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlVuY29tbWl0dGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sRWxlbWVudE5hbWU6IFwiVW5jb21taXR0ZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU2VxdWVuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXRlc3Q6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJMYXRlc3RcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkxhdGVzdFwiLFxuICAgICAgICAgICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIkxhdGVzdFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTZXF1ZW5jZVwiLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9ja0xpc3QgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvY2tMaXN0XCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvY2tMaXN0XCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY29tbWl0dGVkQmxvY2tzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29tbWl0dGVkQmxvY2tzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb21taXR0ZWRCbG9ja3NcIixcbiAgICAgICAgICAgICAgICB4bWxJc1dyYXBwZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sRWxlbWVudE5hbWU6IFwiQmxvY2tcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU2VxdWVuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2NrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1bmNvbW1pdHRlZEJsb2Nrczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlVuY29tbWl0dGVkQmxvY2tzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJVbmNvbW1pdHRlZEJsb2Nrc1wiLFxuICAgICAgICAgICAgICAgIHhtbElzV3JhcHBlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxFbGVtZW50TmFtZTogXCJCbG9ja1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTZXF1ZW5jZVwiLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQmxvY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9jayA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9ja1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2NrXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgbmFtZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk5hbWVcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk5hbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2l6ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNpemVcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlNpemVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFBhZ2VMaXN0ID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VMaXN0XCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZUxpc3RcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBwYWdlUmFuZ2U6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlUmFuZ2VcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlBhZ2VSYW5nZVwiLFxuICAgICAgICAgICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIlBhZ2VSYW5nZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTZXF1ZW5jZVwiLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiUGFnZVJhbmdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGVhclJhbmdlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ2xlYXJSYW5nZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ2xlYXJSYW5nZVwiLFxuICAgICAgICAgICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIkNsZWFyUmFuZ2VcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU2VxdWVuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkNsZWFyUmFuZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRpbnVhdGlvblRva2VuOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTmV4dE1hcmtlclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTmV4dE1hcmtlclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgUGFnZVJhbmdlID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VSYW5nZVwiLFxuICAgIHhtbE5hbWU6IFwiUGFnZVJhbmdlXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZVJhbmdlXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTdGFydFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU3RhcnRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5kOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRW5kXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJFbmRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENsZWFyUmFuZ2UgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ2xlYXJSYW5nZVwiLFxuICAgIHhtbE5hbWU6IFwiQ2xlYXJSYW5nZVwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNsZWFyUmFuZ2VcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBzdGFydDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJTdGFydFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJFbmRcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkVuZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgUXVlcnlSZXF1ZXN0ID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlF1ZXJ5UmVxdWVzdFwiLFxuICAgIHhtbE5hbWU6IFwiUXVlcnlSZXF1ZXN0XCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUXVlcnlSZXF1ZXN0XCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgcXVlcnlUeXBlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiUXVlcnlUeXBlXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJRdWVyeVR5cGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkV4cHJlc3Npb25cIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkV4cHJlc3Npb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5wdXRTZXJpYWxpemF0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiSW5wdXRTZXJpYWxpemF0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJJbnB1dFNlcmlhbGl6YXRpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJRdWVyeVNlcmlhbGl6YXRpb25cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvdXRwdXRTZXJpYWxpemF0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiT3V0cHV0U2VyaWFsaXphdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiT3V0cHV0U2VyaWFsaXphdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlF1ZXJ5U2VyaWFsaXphdGlvblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBRdWVyeVNlcmlhbGl6YXRpb24gPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiUXVlcnlTZXJpYWxpemF0aW9uXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUXVlcnlTZXJpYWxpemF0aW9uXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZm9ybWF0OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRm9ybWF0XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJGb3JtYXRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJRdWVyeUZvcm1hdFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBRdWVyeUZvcm1hdCA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJRdWVyeUZvcm1hdFwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlF1ZXJ5Rm9ybWF0XCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlR5cGVcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlR5cGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJkZWxpbWl0ZWRcIiwgXCJqc29uXCIsIFwiYXJyb3dcIiwgXCJwYXJxdWV0XCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlbGltaXRlZFRleHRDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRGVsaW1pdGVkVGV4dENvbmZpZ3VyYXRpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkRlbGltaXRlZFRleHRDb25maWd1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiRGVsaW1pdGVkVGV4dENvbmZpZ3VyYXRpb25cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBqc29uVGV4dENvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJKc29uVGV4dENvbmZpZ3VyYXRpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkpzb25UZXh0Q29uZmlndXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkpzb25UZXh0Q29uZmlndXJhdGlvblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFycm93Q29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkFycm93Q29uZmlndXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQXJyb3dDb25maWd1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQXJyb3dDb25maWd1cmF0aW9uXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFycXVldFRleHRDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiUGFycXVldFRleHRDb25maWd1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJQYXJxdWV0VGV4dENvbmZpZ3VyYXRpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiYW55XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IERlbGltaXRlZFRleHRDb25maWd1cmF0aW9uID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkRlbGltaXRlZFRleHRDb25maWd1cmF0aW9uXCIsXG4gICAgeG1sTmFtZTogXCJEZWxpbWl0ZWRUZXh0Q29uZmlndXJhdGlvblwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkRlbGltaXRlZFRleHRDb25maWd1cmF0aW9uXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY29sdW1uU2VwYXJhdG9yOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29sdW1uU2VwYXJhdG9yXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb2x1bW5TZXBhcmF0b3JcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmllbGRRdW90ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkZpZWxkUXVvdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkZpZWxkUXVvdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVjb3JkU2VwYXJhdG9yOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiUmVjb3JkU2VwYXJhdG9yXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJSZWNvcmRTZXBhcmF0b3JcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXNjYXBlQ2hhcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkVzY2FwZUNoYXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkVzY2FwZUNoYXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGVhZGVyc1ByZXNlbnQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJIZWFkZXJzUHJlc2VudFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiSGFzSGVhZGVyc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEpzb25UZXh0Q29uZmlndXJhdGlvbiA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJKc29uVGV4dENvbmZpZ3VyYXRpb25cIixcbiAgICB4bWxOYW1lOiBcIkpzb25UZXh0Q29uZmlndXJhdGlvblwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkpzb25UZXh0Q29uZmlndXJhdGlvblwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHJlY29yZFNlcGFyYXRvcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlJlY29yZFNlcGFyYXRvclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUmVjb3JkU2VwYXJhdG9yXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBBcnJvd0NvbmZpZ3VyYXRpb24gPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQXJyb3dDb25maWd1cmF0aW9uXCIsXG4gICAgeG1sTmFtZTogXCJBcnJvd0NvbmZpZ3VyYXRpb25cIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJBcnJvd0NvbmZpZ3VyYXRpb25cIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTY2hlbWFcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlNjaGVtYVwiLFxuICAgICAgICAgICAgICAgIHhtbElzV3JhcHBlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxFbGVtZW50TmFtZTogXCJGaWVsZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTZXF1ZW5jZVwiLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQXJyb3dGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEFycm93RmllbGQgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQXJyb3dGaWVsZFwiLFxuICAgIHhtbE5hbWU6IFwiRmllbGRcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJBcnJvd0ZpZWxkXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlR5cGVcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlR5cGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk5hbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk5hbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJlY2lzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiUHJlY2lzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJQcmVjaXNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2NhbGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTY2FsZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU2NhbGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFNlcnZpY2VTZXRQcm9wZXJ0aWVzSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJTZXJ2aWNlX3NldFByb3BlcnRpZXNIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiU2VydmljZVNldFByb3BlcnRpZXNIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFNlcnZpY2VTZXRQcm9wZXJ0aWVzRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJTZXJ2aWNlX3NldFByb3BlcnRpZXNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiU2VydmljZVNldFByb3BlcnRpZXNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFNlcnZpY2VHZXRQcm9wZXJ0aWVzSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJTZXJ2aWNlX2dldFByb3BlcnRpZXNIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiU2VydmljZUdldFByb3BlcnRpZXNIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFNlcnZpY2VHZXRQcm9wZXJ0aWVzRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJTZXJ2aWNlX2dldFByb3BlcnRpZXNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiU2VydmljZUdldFByb3BlcnRpZXNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFNlcnZpY2VHZXRTdGF0aXN0aWNzSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJTZXJ2aWNlX2dldFN0YXRpc3RpY3NIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiU2VydmljZUdldFN0YXRpc3RpY3NIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFNlcnZpY2VHZXRTdGF0aXN0aWNzRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJTZXJ2aWNlX2dldFN0YXRpc3RpY3NFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiU2VydmljZUdldFN0YXRpc3RpY3NFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFNlcnZpY2VMaXN0Q29udGFpbmVyc1NlZ21lbnRIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlcnZpY2VfbGlzdENvbnRhaW5lcnNTZWdtZW50SGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlNlcnZpY2VMaXN0Q29udGFpbmVyc1NlZ21lbnRIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFNlcnZpY2VMaXN0Q29udGFpbmVyc1NlZ21lbnRFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlcnZpY2VfbGlzdENvbnRhaW5lcnNTZWdtZW50RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlNlcnZpY2VMaXN0Q29udGFpbmVyc1NlZ21lbnRFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFNlcnZpY2VHZXRVc2VyRGVsZWdhdGlvbktleUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZV9nZXRVc2VyRGVsZWdhdGlvbktleUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJTZXJ2aWNlR2V0VXNlckRlbGVnYXRpb25LZXlIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFNlcnZpY2VHZXRVc2VyRGVsZWdhdGlvbktleUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZV9nZXRVc2VyRGVsZWdhdGlvbktleUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJTZXJ2aWNlR2V0VXNlckRlbGVnYXRpb25LZXlFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFNlcnZpY2VHZXRBY2NvdW50SW5mb0hlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZV9nZXRBY2NvdW50SW5mb0hlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJTZXJ2aWNlR2V0QWNjb3VudEluZm9IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2t1TmFtZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtc2t1LW5hbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtc2t1LW5hbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlN0YW5kYXJkX0xSU1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJTdGFuZGFyZF9HUlNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU3RhbmRhcmRfUkFHUlNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU3RhbmRhcmRfWlJTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlByZW1pdW1fTFJTXCJcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY2NvdW50S2luZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYWNjb3VudC1raW5kXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWFjY291bnQta2luZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU3RvcmFnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJCbG9iU3RvcmFnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJTdG9yYWdlVjJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRmlsZVN0b3JhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQmxvY2tCbG9iU3RvcmFnZVwiXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNIaWVyYXJjaGljYWxOYW1lc3BhY2VFbmFibGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1pcy1obnMtZW5hYmxlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1pcy1obnMtZW5hYmxlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFNlcnZpY2VHZXRBY2NvdW50SW5mb0V4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZV9nZXRBY2NvdW50SW5mb0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJTZXJ2aWNlR2V0QWNjb3VudEluZm9FeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFNlcnZpY2VTdWJtaXRCYXRjaEhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZV9zdWJtaXRCYXRjaEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJTZXJ2aWNlU3VibWl0QmF0Y2hIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY29udGVudFR5cGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LXR5cGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtdHlwZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgU2VydmljZVN1Ym1pdEJhdGNoRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJTZXJ2aWNlX3N1Ym1pdEJhdGNoRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlNlcnZpY2VTdWJtaXRCYXRjaEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgU2VydmljZUZpbHRlckJsb2JzSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJTZXJ2aWNlX2ZpbHRlckJsb2JzSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlNlcnZpY2VGaWx0ZXJCbG9ic0hlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgU2VydmljZUZpbHRlckJsb2JzRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJTZXJ2aWNlX2ZpbHRlckJsb2JzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlNlcnZpY2VGaWx0ZXJCbG9ic0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyQ3JlYXRlSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfY3JlYXRlSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckNyZWF0ZUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBDb250YWluZXJDcmVhdGVFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9jcmVhdGVFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyQ3JlYXRlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBDb250YWluZXJHZXRQcm9wZXJ0aWVzSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfZ2V0UHJvcGVydGllc0hlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJHZXRQcm9wZXJ0aWVzSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1tZXRhXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLW1ldGFcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGljdGlvbmFyeVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogeyB0eXBlOiB7IG5hbWU6IFwiU3RyaW5nXCIgfSB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBoZWFkZXJDb2xsZWN0aW9uUHJlZml4OiBcIngtbXMtbWV0YS1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VEdXJhdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtZHVyYXRpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVhc2UtZHVyYXRpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJpbmZpbml0ZVwiLCBcImZpeGVkXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlU3RhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLXN0YXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLXN0YXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJhdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGVhc2VkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImV4cGlyZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYnJlYWtpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYnJva2VuXCJcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZVN0YXR1czoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2Utc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcImxvY2tlZFwiLCBcInVubG9ja2VkXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JQdWJsaWNBY2Nlc3M6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItcHVibGljLWFjY2Vzc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLXB1YmxpYy1hY2Nlc3NcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJjb250YWluZXJcIiwgXCJibG9iXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhhc0ltbXV0YWJpbGl0eVBvbGljeToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtaGFzLWltbXV0YWJpbGl0eS1wb2xpY3lcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtaGFzLWltbXV0YWJpbGl0eS1wb2xpY3lcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhhc0xlZ2FsSG9sZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtaGFzLWxlZ2FsLWhvbGRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtaGFzLWxlZ2FsLWhvbGRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlZmF1bHRFbmNyeXB0aW9uU2NvcGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWRlZmF1bHQtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1kZWZhdWx0LWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVueUVuY3J5cHRpb25TY29wZU92ZXJyaWRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1kZW55LWVuY3J5cHRpb24tc2NvcGUtb3ZlcnJpZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZGVueS1lbmNyeXB0aW9uLXNjb3BlLW92ZXJyaWRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc0ltbXV0YWJsZVN0b3JhZ2VXaXRoVmVyc2lvbmluZ0VuYWJsZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWltbXV0YWJsZS1zdG9yYWdlLXdpdGgtdmVyc2lvbmluZy1lbmFibGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWltbXV0YWJsZS1zdG9yYWdlLXdpdGgtdmVyc2lvbmluZy1lbmFibGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyR2V0UHJvcGVydGllc0V4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2dldFByb3BlcnRpZXNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyR2V0UHJvcGVydGllc0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyRGVsZXRlSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfZGVsZXRlSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckRlbGV0ZUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyRGVsZXRlRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfZGVsZXRlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckRlbGV0ZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyU2V0TWV0YWRhdGFIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9zZXRNZXRhZGF0YUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJTZXRNZXRhZGF0YUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBDb250YWluZXJTZXRNZXRhZGF0YUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX3NldE1ldGFkYXRhRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lclNldE1ldGFkYXRhRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBDb250YWluZXJHZXRBY2Nlc3NQb2xpY3lIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9nZXRBY2Nlc3NQb2xpY3lIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyR2V0QWNjZXNzUG9saWN5SGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGJsb2JQdWJsaWNBY2Nlc3M6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItcHVibGljLWFjY2Vzc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLXB1YmxpYy1hY2Nlc3NcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJjb250YWluZXJcIiwgXCJibG9iXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lckdldEFjY2Vzc1BvbGljeUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2dldEFjY2Vzc1BvbGljeUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJHZXRBY2Nlc3NQb2xpY3lFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lclNldEFjY2Vzc1BvbGljeUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX3NldEFjY2Vzc1BvbGljeUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJTZXRBY2Nlc3NQb2xpY3lIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyU2V0QWNjZXNzUG9saWN5RXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfc2V0QWNjZXNzUG9saWN5RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lclNldEFjY2Vzc1BvbGljeUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyUmVzdG9yZUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX3Jlc3RvcmVIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyUmVzdG9yZUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyUmVzdG9yZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX3Jlc3RvcmVFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyUmVzdG9yZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyUmVuYW1lSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfcmVuYW1lSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lclJlbmFtZUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyUmVuYW1lRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfcmVuYW1lRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lclJlbmFtZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyU3VibWl0QmF0Y2hIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9zdWJtaXRCYXRjaEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJTdWJtaXRCYXRjaEhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjb250ZW50VHlwZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtdHlwZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC10eXBlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyU3VibWl0QmF0Y2hFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9zdWJtaXRCYXRjaEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJTdWJtaXRCYXRjaEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyRmlsdGVyQmxvYnNIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9maWx0ZXJCbG9ic0hlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJGaWx0ZXJCbG9ic0hlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyRmlsdGVyQmxvYnNFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9maWx0ZXJCbG9ic0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJGaWx0ZXJCbG9ic0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyQWNxdWlyZUxlYXNlSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfYWNxdWlyZUxlYXNlSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckFjcXVpcmVMZWFzZUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlSWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBDb250YWluZXJBY3F1aXJlTGVhc2VFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9hY3F1aXJlTGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyQWNxdWlyZUxlYXNlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBDb250YWluZXJSZWxlYXNlTGVhc2VIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9yZWxlYXNlTGVhc2VIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyUmVsZWFzZUxlYXNlSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lclJlbGVhc2VMZWFzZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX3JlbGVhc2VMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJSZWxlYXNlTGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lclJlbmV3TGVhc2VIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9yZW5ld0xlYXNlSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lclJlbmV3TGVhc2VIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZUlkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyUmVuZXdMZWFzZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX3JlbmV3TGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyUmVuZXdMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyQnJlYWtMZWFzZUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2JyZWFrTGVhc2VIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyQnJlYWtMZWFzZUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlVGltZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtdGltZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS10aW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBDb250YWluZXJCcmVha0xlYXNlRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfYnJlYWtMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJCcmVha0xlYXNlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBDb250YWluZXJDaGFuZ2VMZWFzZUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2NoYW5nZUxlYXNlSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckNoYW5nZUxlYXNlSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVhc2UtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lckNoYW5nZUxlYXNlRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfY2hhbmdlTGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyQ2hhbmdlTGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lckxpc3RCbG9iRmxhdFNlZ21lbnRIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9saXN0QmxvYkZsYXRTZWdtZW50SGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckxpc3RCbG9iRmxhdFNlZ21lbnRIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY29udGVudFR5cGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LXR5cGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtdHlwZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyTGlzdEJsb2JGbGF0U2VnbWVudEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2xpc3RCbG9iRmxhdFNlZ21lbnRFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyTGlzdEJsb2JGbGF0U2VnbWVudEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyTGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50SGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfbGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50SGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckxpc3RCbG9iSGllcmFyY2h5U2VnbWVudEhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjb250ZW50VHlwZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtdHlwZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC10eXBlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBDb250YWluZXJMaXN0QmxvYkhpZXJhcmNoeVNlZ21lbnRFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9saXN0QmxvYkhpZXJhcmNoeVNlZ21lbnRFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyTGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBDb250YWluZXJHZXRBY2NvdW50SW5mb0hlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2dldEFjY291bnRJbmZvSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckdldEFjY291bnRJbmZvSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNrdU5hbWU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXNrdS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNrdS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJTdGFuZGFyZF9MUlNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU3RhbmRhcmRfR1JTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlN0YW5kYXJkX1JBR1JTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlN0YW5kYXJkX1pSU1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJQcmVtaXVtX0xSU1wiXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWNjb3VudEtpbmQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWFjY291bnQta2luZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1hY2NvdW50LWtpbmRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlN0b3JhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQmxvYlN0b3JhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU3RvcmFnZVYyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkZpbGVTdG9yYWdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkJsb2NrQmxvYlN0b3JhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBDb250YWluZXJHZXRBY2NvdW50SW5mb0V4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2dldEFjY291bnRJbmZvRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckdldEFjY291bnRJbmZvRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iRG93bmxvYWRIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfZG93bmxvYWRIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkRvd25sb2FkSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3JlYXRlZE9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jcmVhdGlvbi10aW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNyZWF0aW9uLXRpbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLW1ldGFcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbWV0YVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEaWN0aW9uYXJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7IHR5cGU6IHsgbmFtZTogXCJTdHJpbmdcIiB9IH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhlYWRlckNvbGxlY3Rpb25QcmVmaXg6IFwieC1tcy1tZXRhLVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb2JqZWN0UmVwbGljYXRpb25Qb2xpY3lJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtb3ItcG9saWN5LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLW9yLXBvbGljeS1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvYmplY3RSZXBsaWNhdGlvblJ1bGVzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1vclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1vclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEaWN0aW9uYXJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7IHR5cGU6IHsgbmFtZTogXCJTdHJpbmdcIiB9IH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhlYWRlckNvbGxlY3Rpb25QcmVmaXg6IFwieC1tcy1vci1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LWxlbmd0aFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1sZW5ndGhcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudFR5cGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LXR5cGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtdHlwZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50UmFuZ2U6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LXJhbmdlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LXJhbmdlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRNRDU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudEVuY29kaW5nOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1lbmNvZGluZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1lbmNvZGluZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYWNoZUNvbnRyb2w6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjYWNoZS1jb250cm9sXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjYWNoZS1jb250cm9sXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnREaXNwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtZGlzcG9zaXRpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtZGlzcG9zaXRpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudExhbmd1YWdlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1sYW5ndWFnZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1sYW5ndWFnZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iU2VxdWVuY2VOdW1iZXI6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JUeXBlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLXR5cGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi10eXBlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiQmxvY2tCbG9iXCIsIFwiUGFnZUJsb2JcIiwgXCJBcHBlbmRCbG9iXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlDb21wbGV0ZWRPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1jb21wbGV0aW9uLXRpbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1jb21wbGV0aW9uLXRpbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVN0YXR1c0Rlc2NyaXB0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXN0YXR1cy1kZXNjcmlwdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LXN0YXR1cy1kZXNjcmlwdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5UHJvZ3Jlc3M6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktcHJvZ3Jlc3NcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1wcm9ncmVzc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5U291cmNlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXNvdXJjZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LXNvdXJjZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5U3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcInBlbmRpbmdcIiwgXCJzdWNjZXNzXCIsIFwiYWJvcnRlZFwiLCBcImZhaWxlZFwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZUR1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1kdXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1kdXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcImluZmluaXRlXCIsIFwiZml4ZWRcIl1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VTdGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2Utc3RhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVhc2Utc3RhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcImF2YWlsYWJsZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsZWFzZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZXhwaXJlZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJicmVha2luZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJicm9rZW5cIlxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlU3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1zdGF0dXNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVhc2Utc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wibG9ja2VkXCIsIFwidW5sb2NrZWRcIl1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbklkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb24taWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNDdXJyZW50VmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtaXMtY3VycmVudC12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWlzLWN1cnJlbnQtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWNjZXB0UmFuZ2VzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiYWNjZXB0LXJhbmdlc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiYWNjZXB0LXJhbmdlc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iQ29tbWl0dGVkQmxvY2tDb3VudDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1jb21taXR0ZWQtYmxvY2stY291bnRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1jb21taXR0ZWQtYmxvY2stY291bnRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNTZXJ2ZXJFbmNyeXB0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleVNoYTI1Njoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iQ29udGVudE1ENToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRhZ0NvdW50OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy10YWctY291bnRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdGFnLWNvdW50XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VhbGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLXNlYWxlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLXNlYWxlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdEFjY2Vzc2VkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sYXN0LWFjY2Vzcy10aW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxhc3QtYWNjZXNzLXRpbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJlc09uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1pbW11dGFiaWxpdHktcG9saWN5LXVudGlsLWRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtaW1tdXRhYmlsaXR5LXBvbGljeS11bnRpbC1kYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGltbXV0YWJpbGl0eVBvbGljeU1vZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWltbXV0YWJpbGl0eS1wb2xpY3ktbW9kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1pbW11dGFiaWxpdHktcG9saWN5LW1vZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJNdXRhYmxlXCIsIFwiVW5sb2NrZWRcIiwgXCJMb2NrZWRcIl1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVnYWxIb2xkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWdhbC1ob2xkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlZ2FsLWhvbGRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRDcmM2NDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iRG93bmxvYWRFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfZG93bmxvYWRFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkRvd25sb2FkRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iR2V0UHJvcGVydGllc0hlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9nZXRQcm9wZXJ0aWVzSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JHZXRQcm9wZXJ0aWVzSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3JlYXRlZE9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jcmVhdGlvbi10aW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNyZWF0aW9uLXRpbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLW1ldGFcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbWV0YVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEaWN0aW9uYXJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7IHR5cGU6IHsgbmFtZTogXCJTdHJpbmdcIiB9IH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhlYWRlckNvbGxlY3Rpb25QcmVmaXg6IFwieC1tcy1tZXRhLVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb2JqZWN0UmVwbGljYXRpb25Qb2xpY3lJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtb3ItcG9saWN5LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLW9yLXBvbGljeS1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvYmplY3RSZXBsaWNhdGlvblJ1bGVzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1vclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1vclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEaWN0aW9uYXJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7IHR5cGU6IHsgbmFtZTogXCJTdHJpbmdcIiB9IH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhlYWRlckNvbGxlY3Rpb25QcmVmaXg6IFwieC1tcy1vci1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JUeXBlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLXR5cGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi10eXBlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiQmxvY2tCbG9iXCIsIFwiUGFnZUJsb2JcIiwgXCJBcHBlbmRCbG9iXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlDb21wbGV0ZWRPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1jb21wbGV0aW9uLXRpbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1jb21wbGV0aW9uLXRpbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVN0YXR1c0Rlc2NyaXB0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXN0YXR1cy1kZXNjcmlwdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LXN0YXR1cy1kZXNjcmlwdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5UHJvZ3Jlc3M6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktcHJvZ3Jlc3NcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1wcm9ncmVzc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5U291cmNlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXNvdXJjZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LXNvdXJjZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5U3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcInBlbmRpbmdcIiwgXCJzdWNjZXNzXCIsIFwiYWJvcnRlZFwiLCBcImZhaWxlZFwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc0luY3JlbWVudGFsQ29weToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtaW5jcmVtZW50YWwtY29weVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1pbmNyZW1lbnRhbC1jb3B5XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZXN0aW5hdGlvblNuYXBzaG90OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LWRlc3RpbmF0aW9uLXNuYXBzaG90XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktZGVzdGluYXRpb24tc25hcHNob3RcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VEdXJhdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtZHVyYXRpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVhc2UtZHVyYXRpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJpbmZpbml0ZVwiLCBcImZpeGVkXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlU3RhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLXN0YXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLXN0YXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJhdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGVhc2VkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImV4cGlyZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYnJlYWtpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYnJva2VuXCJcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZVN0YXR1czoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2Utc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcImxvY2tlZFwiLCBcInVubG9ja2VkXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LWxlbmd0aFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1sZW5ndGhcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudFR5cGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LXR5cGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtdHlwZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TUQ1OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRFbmNvZGluZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtZW5jb2RpbmdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtZW5jb2RpbmdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudERpc3Bvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1kaXNwb3NpdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1kaXNwb3NpdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TGFuZ3VhZ2U6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LWxhbmd1YWdlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LWxhbmd1YWdlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhY2hlQ29udHJvbDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNhY2hlLWNvbnRyb2xcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNhY2hlLWNvbnRyb2xcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYlNlcXVlbmNlTnVtYmVyOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLXNlcXVlbmNlLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLXNlcXVlbmNlLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY2NlcHRSYW5nZXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJhY2NlcHQtcmFuZ2VzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJhY2NlcHQtcmFuZ2VzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JDb21taXR0ZWRCbG9ja0NvdW50OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLWNvbW1pdHRlZC1ibG9jay1jb3VudFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNvbW1pdHRlZC1ibG9jay1jb3VudFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1NlcnZlckVuY3J5cHRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFjY2Vzc1RpZXI6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWFjY2Vzcy10aWVyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWFjY2Vzcy10aWVyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFjY2Vzc1RpZXJJbmZlcnJlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYWNjZXNzLXRpZXItaW5mZXJyZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYWNjZXNzLXRpZXItaW5mZXJyZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFyY2hpdmVTdGF0dXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWFyY2hpdmUtc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWFyY2hpdmUtc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFjY2Vzc1RpZXJDaGFuZ2VkT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWFjY2Vzcy10aWVyLWNoYW5nZS10aW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWFjY2Vzcy10aWVyLWNoYW5nZS10aW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb25JZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzQ3VycmVudFZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWlzLWN1cnJlbnQtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1pcy1jdXJyZW50LXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRhZ0NvdW50OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy10YWctY291bnRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdGFnLWNvdW50XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4cGlyZXNPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXhwaXJ5LXRpbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXhwaXJ5LXRpbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNTZWFsZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2Itc2VhbGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2Itc2VhbGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWh5ZHJhdGVQcmlvcml0eToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVoeWRyYXRlLXByaW9yaXR5XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlaHlkcmF0ZS1wcmlvcml0eVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcIkhpZ2hcIiwgXCJTdGFuZGFyZFwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0QWNjZXNzZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxhc3QtYWNjZXNzLXRpbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGFzdC1hY2Nlc3MtdGltZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lFeHBpcmVzT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWltbXV0YWJpbGl0eS1wb2xpY3ktdW50aWwtZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1pbW11dGFiaWxpdHktcG9saWN5LXVudGlsLWRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW1tdXRhYmlsaXR5UG9saWN5TW9kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtaW1tdXRhYmlsaXR5LXBvbGljeS1tb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWltbXV0YWJpbGl0eS1wb2xpY3ktbW9kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcIk11dGFibGVcIiwgXCJVbmxvY2tlZFwiLCBcIkxvY2tlZFwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWdhbEhvbGQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlZ2FsLWhvbGRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVnYWwtaG9sZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JHZXRQcm9wZXJ0aWVzRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX2dldFByb3BlcnRpZXNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkdldFByb3BlcnRpZXNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JEZWxldGVIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfZGVsZXRlSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JEZWxldGVIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JEZWxldGVFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfZGVsZXRlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JEZWxldGVFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JVbmRlbGV0ZUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl91bmRlbGV0ZUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iVW5kZWxldGVIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JVbmRlbGV0ZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl91bmRlbGV0ZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iVW5kZWxldGVFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JTZXRFeHBpcnlIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2Jfc2V0RXhwaXJ5SGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JTZXRFeHBpcnlIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYlNldEV4cGlyeUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9zZXRFeHBpcnlFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlNldEV4cGlyeUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYlNldEh0dHBIZWFkZXJzSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3NldEh0dHBIZWFkZXJzSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JTZXRIdHRwSGVhZGVyc0hlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JTZXF1ZW5jZU51bWJlcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JTZXRIdHRwSGVhZGVyc0V4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9zZXRIdHRwSGVhZGVyc0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iU2V0SHR0cEhlYWRlcnNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JTZXRJbW11dGFiaWxpdHlQb2xpY3lIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2Jfc2V0SW1tdXRhYmlsaXR5UG9saWN5SGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JTZXRJbW11dGFiaWxpdHlQb2xpY3lIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJ5OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1pbW11dGFiaWxpdHktcG9saWN5LXVudGlsLWRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtaW1tdXRhYmlsaXR5LXBvbGljeS11bnRpbC1kYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGltbXV0YWJpbGl0eVBvbGljeU1vZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWltbXV0YWJpbGl0eS1wb2xpY3ktbW9kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1pbW11dGFiaWxpdHktcG9saWN5LW1vZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJNdXRhYmxlXCIsIFwiVW5sb2NrZWRcIiwgXCJMb2NrZWRcIl1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JTZXRJbW11dGFiaWxpdHlQb2xpY3lFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2Jfc2V0SW1tdXRhYmlsaXR5UG9saWN5RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JTZXRJbW11dGFiaWxpdHlQb2xpY3lFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JEZWxldGVJbW11dGFiaWxpdHlQb2xpY3lIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfZGVsZXRlSW1tdXRhYmlsaXR5UG9saWN5SGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JEZWxldGVJbW11dGFiaWxpdHlQb2xpY3lIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JEZWxldGVJbW11dGFiaWxpdHlQb2xpY3lFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfZGVsZXRlSW1tdXRhYmlsaXR5UG9saWN5RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JEZWxldGVJbW11dGFiaWxpdHlQb2xpY3lFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JTZXRMZWdhbEhvbGRIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2Jfc2V0TGVnYWxIb2xkSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JTZXRMZWdhbEhvbGRIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVnYWxIb2xkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWdhbC1ob2xkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlZ2FsLWhvbGRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iU2V0TGVnYWxIb2xkRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3NldExlZ2FsSG9sZEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iU2V0TGVnYWxIb2xkRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iU2V0TWV0YWRhdGFIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2Jfc2V0TWV0YWRhdGFIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlNldE1ldGFkYXRhSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbklkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb24taWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNTZXJ2ZXJFbmNyeXB0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTY6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvblNjb3BlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JTZXRNZXRhZGF0YUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9zZXRNZXRhZGF0YUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iU2V0TWV0YWRhdGFFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JBY3F1aXJlTGVhc2VIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfYWNxdWlyZUxlYXNlSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JBY3F1aXJlTGVhc2VIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZUlkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYkFjcXVpcmVMZWFzZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9hY3F1aXJlTGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkFjcXVpcmVMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYlJlbGVhc2VMZWFzZUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9yZWxlYXNlTGVhc2VIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlJlbGVhc2VMZWFzZUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iUmVsZWFzZUxlYXNlRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3JlbGVhc2VMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iUmVsZWFzZUxlYXNlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iUmVuZXdMZWFzZUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9yZW5ld0xlYXNlSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JSZW5ld0xlYXNlSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVhc2UtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JSZW5ld0xlYXNlRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3JlbmV3TGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlJlbmV3TGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JDaGFuZ2VMZWFzZUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9jaGFuZ2VMZWFzZUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iQ2hhbmdlTGVhc2VIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlSWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYkNoYW5nZUxlYXNlRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX2NoYW5nZUxlYXNlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JDaGFuZ2VMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYkJyZWFrTGVhc2VIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfYnJlYWtMZWFzZUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iQnJlYWtMZWFzZUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlVGltZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtdGltZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS10aW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iQnJlYWtMZWFzZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9icmVha0xlYXNlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JCcmVha0xlYXNlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iQ3JlYXRlU25hcHNob3RIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfY3JlYXRlU25hcHNob3RIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkNyZWF0ZVNuYXBzaG90SGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHNuYXBzaG90OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zbmFwc2hvdFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1zbmFwc2hvdFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb25JZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VydmVyRW5jcnlwdGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYkNyZWF0ZVNuYXBzaG90RXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX2NyZWF0ZVNuYXBzaG90RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JDcmVhdGVTbmFwc2hvdEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYlN0YXJ0Q29weUZyb21VUkxIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2Jfc3RhcnRDb3B5RnJvbVVSTEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iU3RhcnRDb3B5RnJvbVVSTEhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb25JZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlTdGF0dXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wicGVuZGluZ1wiLCBcInN1Y2Nlc3NcIiwgXCJhYm9ydGVkXCIsIFwiZmFpbGVkXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iU3RhcnRDb3B5RnJvbVVSTEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9zdGFydENvcHlGcm9tVVJMRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JTdGFydENvcHlGcm9tVVJMRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iQ29weUZyb21VUkxIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfY29weUZyb21VUkxIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkNvcHlGcm9tVVJMSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbklkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb24taWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weUlkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVN0YXR1czoge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogXCJzdWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRNRDU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeE1zQ29udGVudENyYzY0OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvblNjb3BlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JDb3B5RnJvbVVSTEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9jb3B5RnJvbVVSTEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iQ29weUZyb21VUkxFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JBYm9ydENvcHlGcm9tVVJMSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX2Fib3J0Q29weUZyb21VUkxIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkFib3J0Q29weUZyb21VUkxIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JBYm9ydENvcHlGcm9tVVJMRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX2Fib3J0Q29weUZyb21VUkxFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkFib3J0Q29weUZyb21VUkxFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JTZXRUaWVySGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3NldFRpZXJIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlNldFRpZXJIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JTZXRUaWVyRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3NldFRpZXJFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlNldFRpZXJFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JHZXRBY2NvdW50SW5mb0hlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9nZXRBY2NvdW50SW5mb0hlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iR2V0QWNjb3VudEluZm9IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2t1TmFtZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtc2t1LW5hbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtc2t1LW5hbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlN0YW5kYXJkX0xSU1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJTdGFuZGFyZF9HUlNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU3RhbmRhcmRfUkFHUlNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU3RhbmRhcmRfWlJTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlByZW1pdW1fTFJTXCJcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY2NvdW50S2luZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYWNjb3VudC1raW5kXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWFjY291bnQta2luZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU3RvcmFnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJCbG9iU3RvcmFnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJTdG9yYWdlVjJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRmlsZVN0b3JhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQmxvY2tCbG9iU3RvcmFnZVwiXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JHZXRBY2NvdW50SW5mb0V4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9nZXRBY2NvdW50SW5mb0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iR2V0QWNjb3VudEluZm9FeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JRdWVyeUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9xdWVyeUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iUXVlcnlIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbWV0YVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1tZXRhXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRpY3Rpb25hcnlcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHsgdHlwZTogeyBuYW1lOiBcIlN0cmluZ1wiIH0gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1sZW5ndGhcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbGVuZ3RoXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC10eXBlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LXR5cGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudFJhbmdlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1yYW5nZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1yYW5nZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TUQ1OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRFbmNvZGluZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtZW5jb2RpbmdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtZW5jb2RpbmdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2FjaGVDb250cm9sOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY2FjaGUtY29udHJvbFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY2FjaGUtY29udHJvbFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50RGlzcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRMYW5ndWFnZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYlNlcXVlbmNlTnVtYmVyOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLXNlcXVlbmNlLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLXNlcXVlbmNlLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iVHlwZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi10eXBlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItdHlwZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcIkJsb2NrQmxvYlwiLCBcIlBhZ2VCbG9iXCIsIFwiQXBwZW5kQmxvYlwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5Q29tcGxldGlvblRpbWU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktY29tcGxldGlvbi10aW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktY29tcGxldGlvbi10aW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlTdGF0dXNEZXNjcmlwdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1zdGF0dXMtZGVzY3JpcHRpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1zdGF0dXMtZGVzY3JpcHRpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weUlkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVByb2dyZXNzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXByb2dyZXNzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktcHJvZ3Jlc3NcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVNvdXJjZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1zb3VyY2VcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1zb3VyY2VcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVN0YXR1czoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1zdGF0dXNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1zdGF0dXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJwZW5kaW5nXCIsIFwic3VjY2Vzc1wiLCBcImFib3J0ZWRcIiwgXCJmYWlsZWRcIl1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VEdXJhdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtZHVyYXRpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVhc2UtZHVyYXRpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJpbmZpbml0ZVwiLCBcImZpeGVkXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlU3RhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLXN0YXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLXN0YXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJhdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGVhc2VkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImV4cGlyZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYnJlYWtpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYnJva2VuXCJcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZVN0YXR1czoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2Utc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcImxvY2tlZFwiLCBcInVubG9ja2VkXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFjY2VwdFJhbmdlczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImFjY2VwdC1yYW5nZXNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImFjY2VwdC1yYW5nZXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYkNvbW1pdHRlZEJsb2NrQ291bnQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItY29tbWl0dGVkLWJsb2NrLWNvdW50XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItY29tbWl0dGVkLWJsb2NrLWNvdW50XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VydmVyRW5jcnlwdGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTY6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvblNjb3BlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYkNvbnRlbnRNRDU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50Q3JjNjQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYlF1ZXJ5RXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3F1ZXJ5RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JRdWVyeUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYkdldFRhZ3NIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfZ2V0VGFnc0hlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iR2V0VGFnc0hlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYkdldFRhZ3NFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfZ2V0VGFnc0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iR2V0VGFnc0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYlNldFRhZ3NIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2Jfc2V0VGFnc0hlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iU2V0VGFnc0hlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYlNldFRhZ3NFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2Jfc2V0VGFnc0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iU2V0VGFnc0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgUGFnZUJsb2JDcmVhdGVIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VCbG9iX2NyZWF0ZUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJQYWdlQmxvYkNyZWF0ZUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRNRDU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbklkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb24taWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNTZXJ2ZXJFbmNyeXB0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTY6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvblNjb3BlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFBhZ2VCbG9iQ3JlYXRlRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlQmxvYl9jcmVhdGVFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZUJsb2JDcmVhdGVFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFBhZ2VCbG9iVXBsb2FkUGFnZXNIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VCbG9iX3VwbG9hZFBhZ2VzSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VCbG9iVXBsb2FkUGFnZXNIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TUQ1OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHhNc0NvbnRlbnRDcmM2NDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JTZXF1ZW5jZU51bWJlcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNTZXJ2ZXJFbmNyeXB0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTY6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvblNjb3BlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFBhZ2VCbG9iVXBsb2FkUGFnZXNFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VCbG9iX3VwbG9hZFBhZ2VzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VCbG9iVXBsb2FkUGFnZXNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFBhZ2VCbG9iQ2xlYXJQYWdlc0hlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiUGFnZUJsb2JfY2xlYXJQYWdlc0hlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJQYWdlQmxvYkNsZWFyUGFnZXNIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TUQ1OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHhNc0NvbnRlbnRDcmM2NDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JTZXF1ZW5jZU51bWJlcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFBhZ2VCbG9iQ2xlYXJQYWdlc0V4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiUGFnZUJsb2JfY2xlYXJQYWdlc0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJQYWdlQmxvYkNsZWFyUGFnZXNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFBhZ2VCbG9iVXBsb2FkUGFnZXNGcm9tVVJMSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlQmxvYl91cGxvYWRQYWdlc0Zyb21VUkxIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZUJsb2JVcGxvYWRQYWdlc0Zyb21VUkxIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TUQ1OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHhNc0NvbnRlbnRDcmM2NDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JTZXF1ZW5jZU51bWJlcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VydmVyRW5jcnlwdGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBQYWdlQmxvYlVwbG9hZFBhZ2VzRnJvbVVSTEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiUGFnZUJsb2JfdXBsb2FkUGFnZXNGcm9tVVJMRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VCbG9iVXBsb2FkUGFnZXNGcm9tVVJMRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBQYWdlQmxvYkdldFBhZ2VSYW5nZXNIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VCbG9iX2dldFBhZ2VSYW5nZXNIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZUJsb2JHZXRQYWdlUmFuZ2VzSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYkNvbnRlbnRMZW5ndGg6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC1sZW5ndGhcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LWxlbmd0aFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgUGFnZUJsb2JHZXRQYWdlUmFuZ2VzRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlQmxvYl9nZXRQYWdlUmFuZ2VzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VCbG9iR2V0UGFnZVJhbmdlc0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgUGFnZUJsb2JHZXRQYWdlUmFuZ2VzRGlmZkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiUGFnZUJsb2JfZ2V0UGFnZVJhbmdlc0RpZmZIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZUJsb2JHZXRQYWdlUmFuZ2VzRGlmZkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JDb250ZW50TGVuZ3RoOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLWNvbnRlbnQtbGVuZ3RoXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC1sZW5ndGhcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFBhZ2VCbG9iR2V0UGFnZVJhbmdlc0RpZmZFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VCbG9iX2dldFBhZ2VSYW5nZXNEaWZmRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VCbG9iR2V0UGFnZVJhbmdlc0RpZmZFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFBhZ2VCbG9iUmVzaXplSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlQmxvYl9yZXNpemVIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZUJsb2JSZXNpemVIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iU2VxdWVuY2VOdW1iZXI6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBQYWdlQmxvYlJlc2l6ZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiUGFnZUJsb2JfcmVzaXplRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VCbG9iUmVzaXplRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBQYWdlQmxvYlVwZGF0ZVNlcXVlbmNlTnVtYmVySGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlQmxvYl91cGRhdGVTZXF1ZW5jZU51bWJlckhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJQYWdlQmxvYlVwZGF0ZVNlcXVlbmNlTnVtYmVySGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYlNlcXVlbmNlTnVtYmVyOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLXNlcXVlbmNlLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLXNlcXVlbmNlLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgUGFnZUJsb2JVcGRhdGVTZXF1ZW5jZU51bWJlckV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiUGFnZUJsb2JfdXBkYXRlU2VxdWVuY2VOdW1iZXJFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZUJsb2JVcGRhdGVTZXF1ZW5jZU51bWJlckV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgUGFnZUJsb2JDb3B5SW5jcmVtZW50YWxIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VCbG9iX2NvcHlJbmNyZW1lbnRhbEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJQYWdlQmxvYkNvcHlJbmNyZW1lbnRhbEhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlTdGF0dXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wicGVuZGluZ1wiLCBcInN1Y2Nlc3NcIiwgXCJhYm9ydGVkXCIsIFwiZmFpbGVkXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBQYWdlQmxvYkNvcHlJbmNyZW1lbnRhbEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiUGFnZUJsb2JfY29weUluY3JlbWVudGFsRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VCbG9iQ29weUluY3JlbWVudGFsRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBBcHBlbmRCbG9iQ3JlYXRlSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJBcHBlbmRCbG9iX2NyZWF0ZUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJBcHBlbmRCbG9iQ3JlYXRlSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudE1ENToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uSWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb24taWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1NlcnZlckVuY3J5cHRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleVNoYTI1Njoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQXBwZW5kQmxvYkNyZWF0ZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQXBwZW5kQmxvYl9jcmVhdGVFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQXBwZW5kQmxvYkNyZWF0ZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQXBwZW5kQmxvYkFwcGVuZEJsb2NrSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJBcHBlbmRCbG9iX2FwcGVuZEJsb2NrSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkFwcGVuZEJsb2JBcHBlbmRCbG9ja0hlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRNRDU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeE1zQ29udGVudENyYzY0OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYkFwcGVuZE9mZnNldDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1hcHBlbmQtb2Zmc2V0XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItYXBwZW5kLW9mZnNldFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iQ29tbWl0dGVkQmxvY2tDb3VudDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1jb21taXR0ZWQtYmxvY2stY291bnRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1jb21taXR0ZWQtYmxvY2stY291bnRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNTZXJ2ZXJFbmNyeXB0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTY6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvblNjb3BlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEFwcGVuZEJsb2JBcHBlbmRCbG9ja0V4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQXBwZW5kQmxvYl9hcHBlbmRCbG9ja0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJBcHBlbmRCbG9iQXBwZW5kQmxvY2tFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEFwcGVuZEJsb2JBcHBlbmRCbG9ja0Zyb21VcmxIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkFwcGVuZEJsb2JfYXBwZW5kQmxvY2tGcm9tVXJsSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkFwcGVuZEJsb2JBcHBlbmRCbG9ja0Zyb21VcmxIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TUQ1OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHhNc0NvbnRlbnRDcmM2NDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iQXBwZW5kT2Zmc2V0OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLWFwcGVuZC1vZmZzZXRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1hcHBlbmQtb2Zmc2V0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JDb21taXR0ZWRCbG9ja0NvdW50OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLWNvbW1pdHRlZC1ibG9jay1jb3VudFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNvbW1pdHRlZC1ibG9jay1jb3VudFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VydmVyRW5jcnlwdGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQXBwZW5kQmxvYkFwcGVuZEJsb2NrRnJvbVVybEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQXBwZW5kQmxvYl9hcHBlbmRCbG9ja0Zyb21VcmxFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQXBwZW5kQmxvYkFwcGVuZEJsb2NrRnJvbVVybEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQXBwZW5kQmxvYlNlYWxIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkFwcGVuZEJsb2Jfc2VhbEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJBcHBlbmRCbG9iU2VhbEhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VhbGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLXNlYWxlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLXNlYWxlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEFwcGVuZEJsb2JTZWFsRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJBcHBlbmRCbG9iX3NlYWxFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQXBwZW5kQmxvYlNlYWxFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2NrQmxvYlVwbG9hZEhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvY2tCbG9iX3VwbG9hZEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9ja0Jsb2JVcGxvYWRIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TUQ1OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb25JZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VydmVyRW5jcnlwdGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9ja0Jsb2JVcGxvYWRFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2NrQmxvYl91cGxvYWRFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvY2tCbG9iVXBsb2FkRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9ja0Jsb2JQdXRCbG9iRnJvbVVybEhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvY2tCbG9iX3B1dEJsb2JGcm9tVXJsSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2NrQmxvYlB1dEJsb2JGcm9tVXJsSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudE1ENToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uSWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb24taWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1NlcnZlckVuY3J5cHRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleVNoYTI1Njoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvY2tCbG9iUHV0QmxvYkZyb21VcmxFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2NrQmxvYl9wdXRCbG9iRnJvbVVybEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9ja0Jsb2JQdXRCbG9iRnJvbVVybEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvY2tCbG9iU3RhZ2VCbG9ja0hlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvY2tCbG9iX3N0YWdlQmxvY2tIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvY2tCbG9iU3RhZ2VCbG9ja0hlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjb250ZW50TUQ1OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHhNc0NvbnRlbnRDcmM2NDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VydmVyRW5jcnlwdGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9ja0Jsb2JTdGFnZUJsb2NrRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9ja0Jsb2Jfc3RhZ2VCbG9ja0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9ja0Jsb2JTdGFnZUJsb2NrRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9ja0Jsb2JTdGFnZUJsb2NrRnJvbVVSTEhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvY2tCbG9iX3N0YWdlQmxvY2tGcm9tVVJMSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2NrQmxvYlN0YWdlQmxvY2tGcm9tVVJMSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNvbnRlbnRNRDU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeE1zQ29udGVudENyYzY0OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNTZXJ2ZXJFbmNyeXB0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTY6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvblNjb3BlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2NrQmxvYlN0YWdlQmxvY2tGcm9tVVJMRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9ja0Jsb2Jfc3RhZ2VCbG9ja0Zyb21VUkxFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvY2tCbG9iU3RhZ2VCbG9ja0Zyb21VUkxFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2NrQmxvYkNvbW1pdEJsb2NrTGlzdEhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvY2tCbG9iX2NvbW1pdEJsb2NrTGlzdEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9ja0Jsb2JDb21taXRCbG9ja0xpc3RIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TUQ1OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHhNc0NvbnRlbnRDcmM2NDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb25JZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VydmVyRW5jcnlwdGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9ja0Jsb2JDb21taXRCbG9ja0xpc3RFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2NrQmxvYl9jb21taXRCbG9ja0xpc3RFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvY2tCbG9iQ29tbWl0QmxvY2tMaXN0RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9ja0Jsb2JHZXRCbG9ja0xpc3RIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2NrQmxvYl9nZXRCbG9ja0xpc3RIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvY2tCbG9iR2V0QmxvY2tMaXN0SGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudFR5cGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LXR5cGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtdHlwZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iQ29udGVudExlbmd0aDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LWxlbmd0aFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNvbnRlbnQtbGVuZ3RoXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9ja0Jsb2JHZXRCbG9ja0xpc3RFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2NrQmxvYl9nZXRCbG9ja0xpc3RFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvY2tCbG9iR2V0QmxvY2tMaXN0RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hcHBlcnMuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4vKipcbiAqIFRoZSBmb3JtYXQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gam9pbiBhbiBhcnJheSBvZiB2YWx1ZXMgdG9nZXRoZXIgZm9yIGEgcXVlcnkgcGFyYW1ldGVyIHZhbHVlLlxuICovXG5leHBvcnQgdmFyIFF1ZXJ5Q29sbGVjdGlvbkZvcm1hdDtcbihmdW5jdGlvbiAoUXVlcnlDb2xsZWN0aW9uRm9ybWF0KSB7XG4gICAgLyoqXG4gICAgICogQ1NWOiBFYWNoIHBhaXIgb2Ygc2VnbWVudHMgam9pbmVkIGJ5IGEgc2luZ2xlIGNvbW1hLlxuICAgICAqL1xuICAgIFF1ZXJ5Q29sbGVjdGlvbkZvcm1hdFtcIkNzdlwiXSA9IFwiLFwiO1xuICAgIC8qKlxuICAgICAqIFNTVjogRWFjaCBwYWlyIG9mIHNlZ21lbnRzIGpvaW5lZCBieSBhIHNpbmdsZSBzcGFjZSBjaGFyYWN0ZXIuXG4gICAgICovXG4gICAgUXVlcnlDb2xsZWN0aW9uRm9ybWF0W1wiU3N2XCJdID0gXCIgXCI7XG4gICAgLyoqXG4gICAgICogVFNWOiBFYWNoIHBhaXIgb2Ygc2VnbWVudHMgam9pbmVkIGJ5IGEgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuXG4gICAgICovXG4gICAgUXVlcnlDb2xsZWN0aW9uRm9ybWF0W1wiVHN2XCJdID0gXCJcXHRcIjtcbiAgICAvKipcbiAgICAgKiBQaXBlczogRWFjaCBwYWlyIG9mIHNlZ21lbnRzIGpvaW5lZCBieSBhIHNpbmdsZSBwaXBlIGNoYXJhY3Rlci5cbiAgICAgKi9cbiAgICBRdWVyeUNvbGxlY3Rpb25Gb3JtYXRbXCJQaXBlc1wiXSA9IFwifFwiO1xuICAgIC8qKlxuICAgICAqIERlbm90ZXMgdGhpcyBpcyBhbiBhcnJheSBvZiB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBzZXJ2ZXIgaW4gbXVsdGlwbGUga2V5L3ZhbHVlIHBhaXJzLCBlLmcuIGA/cXVlcnlQYXJhbT12YWx1ZTEmcXVlcnlQYXJhbT12YWx1ZTJgXG4gICAgICovXG4gICAgUXVlcnlDb2xsZWN0aW9uRm9ybWF0W1wiTXVsdGlcIl0gPSBcIk11bHRpXCI7XG59KShRdWVyeUNvbGxlY3Rpb25Gb3JtYXQgfHwgKFF1ZXJ5Q29sbGVjdGlvbkZvcm1hdCA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1xdWVyeUNvbGxlY3Rpb25Gb3JtYXQuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICpcbiAqIENvZGUgZ2VuZXJhdGVkIGJ5IE1pY3Jvc29mdCAoUikgQXV0b1Jlc3QgQ29kZSBHZW5lcmF0b3IuXG4gKiBDaGFuZ2VzIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IgYW5kIHdpbGwgYmUgbG9zdCBpZiB0aGUgY29kZSBpcyByZWdlbmVyYXRlZC5cbiAqL1xuaW1wb3J0IHsgUXVlcnlDb2xsZWN0aW9uRm9ybWF0IH0gZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmltcG9ydCB7IEJsb2JTZXJ2aWNlUHJvcGVydGllcyBhcyBCbG9iU2VydmljZVByb3BlcnRpZXNNYXBwZXIsIEtleUluZm8gYXMgS2V5SW5mb01hcHBlciwgUXVlcnlSZXF1ZXN0IGFzIFF1ZXJ5UmVxdWVzdE1hcHBlciwgQmxvYlRhZ3MgYXMgQmxvYlRhZ3NNYXBwZXIsIEJsb2NrTG9va3VwTGlzdCBhcyBCbG9ja0xvb2t1cExpc3RNYXBwZXIgfSBmcm9tIFwiLi4vbW9kZWxzL21hcHBlcnNcIjtcbmV4cG9ydCBjb25zdCBjb250ZW50VHlwZSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiY29udGVudFR5cGVcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJhcHBsaWNhdGlvbi94bWxcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGVudC1UeXBlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgYmxvYlNlcnZpY2VQcm9wZXJ0aWVzID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiYmxvYlNlcnZpY2VQcm9wZXJ0aWVzXCIsXG4gICAgbWFwcGVyOiBCbG9iU2VydmljZVByb3BlcnRpZXNNYXBwZXJcbn07XG5leHBvcnQgY29uc3QgYWNjZXB0ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiYWNjZXB0XCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJhcHBsaWNhdGlvbi94bWxcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQWNjZXB0XCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgdXJsID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwidXJsXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcInVybFwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgeG1sTmFtZTogXCJ1cmxcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBza2lwRW5jb2Rpbmc6IHRydWVcbn07XG5leHBvcnQgY29uc3QgcmVzdHlwZSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcInJlc3R5cGVcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcInNlcnZpY2VcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwicmVzdHlwZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvbXAgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJwcm9wZXJ0aWVzXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCB0aW1lb3V0SW5TZWNvbmRzID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJ0aW1lb3V0SW5TZWNvbmRzXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBjb25zdHJhaW50czoge1xuICAgICAgICAgICAgSW5jbHVzaXZlTWluaW11bTogMFxuICAgICAgICB9LFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ0aW1lb3V0XCIsXG4gICAgICAgIHhtbE5hbWU6IFwidGltZW91dFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHZlcnNpb24gPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJ2ZXJzaW9uXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCIyMDIzLTExLTAzXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHJlcXVlc3RJZCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwicmVxdWVzdElkXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGFjY2VwdDEgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJhY2NlcHRcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImFwcGxpY2F0aW9uL3htbFwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJBY2NlcHRcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBjb21wMSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcInN0YXRzXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBjb21wMiA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImxpc3RcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHByZWZpeCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwicHJlZml4XCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJwcmVmaXhcIixcbiAgICAgICAgeG1sTmFtZTogXCJwcmVmaXhcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBtYXJrZXIgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcIm1hcmtlclwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibWFya2VyXCIsXG4gICAgICAgIHhtbE5hbWU6IFwibWFya2VyXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgbWF4UGFnZVNpemUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcIm1heFBhZ2VTaXplXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBjb25zdHJhaW50czoge1xuICAgICAgICAgICAgSW5jbHVzaXZlTWluaW11bTogMVxuICAgICAgICB9LFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJtYXhyZXN1bHRzXCIsXG4gICAgICAgIHhtbE5hbWU6IFwibWF4cmVzdWx0c1wiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGluY2x1ZGUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImluY2x1ZGVcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImluY2x1ZGVcIixcbiAgICAgICAgeG1sTmFtZTogXCJpbmNsdWRlXCIsXG4gICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIkxpc3RDb250YWluZXJzSW5jbHVkZVR5cGVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTZXF1ZW5jZVwiLFxuICAgICAgICAgICAgZWxlbWVudDoge1xuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcIm1ldGFkYXRhXCIsIFwiZGVsZXRlZFwiLCBcInN5c3RlbVwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgY29sbGVjdGlvbkZvcm1hdDogUXVlcnlDb2xsZWN0aW9uRm9ybWF0LkNzdlxufTtcbmV4cG9ydCBjb25zdCBrZXlJbmZvID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwia2V5SW5mb1wiLFxuICAgIG1hcHBlcjogS2V5SW5mb01hcHBlclxufTtcbmV4cG9ydCBjb25zdCBjb21wMyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcInVzZXJkZWxlZ2F0aW9ua2V5XCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCByZXN0eXBlMSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcInJlc3R5cGVcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImFjY291bnRcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwicmVzdHlwZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGJvZHkgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJib2R5XCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImJvZHlcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwiYm9keVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmVhbVwiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvbXA0ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiYmF0Y2hcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvbnRlbnRMZW5ndGggPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb250ZW50TGVuZ3RoXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRlbnQtTGVuZ3RoXCIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB4bWxOYW1lOiBcIkNvbnRlbnQtTGVuZ3RoXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgbXVsdGlwYXJ0Q29udGVudFR5cGUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJtdWx0aXBhcnRDb250ZW50VHlwZVwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb250ZW50LVR5cGVcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwiQ29udGVudC1UeXBlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgY29tcDUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJibG9ic1wiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3Qgd2hlcmUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcIndoZXJlXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ3aGVyZVwiLFxuICAgICAgICB4bWxOYW1lOiBcIndoZXJlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgcmVzdHlwZTIgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJyZXN0eXBlXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJjb250YWluZXJcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwicmVzdHlwZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IG1ldGFkYXRhID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJtZXRhZGF0YVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1tZXRhXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1tZXRhXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRGljdGlvbmFyeVwiLFxuICAgICAgICAgICAgdmFsdWU6IHsgdHlwZTogeyBuYW1lOiBcIlN0cmluZ1wiIH0gfVxuICAgICAgICB9LFxuICAgICAgICBoZWFkZXJDb2xsZWN0aW9uUHJlZml4OiBcIngtbXMtbWV0YS1cIlxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgYWNjZXNzID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJhY2Nlc3NcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1wdWJsaWMtYWNjZXNzXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLXB1YmxpYy1hY2Nlc3NcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJjb250YWluZXJcIiwgXCJibG9iXCJdXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRFbmNyeXB0aW9uU2NvcGUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1xuICAgICAgICBcIm9wdGlvbnNcIixcbiAgICAgICAgXCJjb250YWluZXJFbmNyeXB0aW9uU2NvcGVcIixcbiAgICAgICAgXCJkZWZhdWx0RW5jcnlwdGlvblNjb3BlXCJcbiAgICBdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWRlZmF1bHQtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtZGVmYXVsdC1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgcHJldmVudEVuY3J5cHRpb25TY29wZU92ZXJyaWRlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcbiAgICAgICAgXCJvcHRpb25zXCIsXG4gICAgICAgIFwiY29udGFpbmVyRW5jcnlwdGlvblNjb3BlXCIsXG4gICAgICAgIFwicHJldmVudEVuY3J5cHRpb25TY29wZU92ZXJyaWRlXCJcbiAgICBdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWRlbnktZW5jcnlwdGlvbi1zY29wZS1vdmVycmlkZVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtZGVueS1lbmNyeXB0aW9uLXNjb3BlLW92ZXJyaWRlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGxlYXNlSWQgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImxlYXNlQWNjZXNzQ29uZGl0aW9uc1wiLCBcImxlYXNlSWRcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtaWRcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLWlkXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgaWZNb2RpZmllZFNpbmNlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnNcIiwgXCJpZk1vZGlmaWVkU2luY2VcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIklmLU1vZGlmaWVkLVNpbmNlXCIsXG4gICAgICAgIHhtbE5hbWU6IFwiSWYtTW9kaWZpZWQtU2luY2VcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBpZlVubW9kaWZpZWRTaW5jZSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwibW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zXCIsIFwiaWZVbm1vZGlmaWVkU2luY2VcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIklmLVVubW9kaWZpZWQtU2luY2VcIixcbiAgICAgICAgeG1sTmFtZTogXCJJZi1Vbm1vZGlmaWVkLVNpbmNlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgY29tcDYgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJtZXRhZGF0YVwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgY29tcDcgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJhY2xcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvbnRhaW5lckFjbCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiY29udGFpbmVyQWNsXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250YWluZXJBY2xcIixcbiAgICAgICAgeG1sTmFtZTogXCJTaWduZWRJZGVudGlmaWVyc1wiLFxuICAgICAgICB4bWxJc1dyYXBwZWQ6IHRydWUsXG4gICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIlNpZ25lZElkZW50aWZpZXJcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTZXF1ZW5jZVwiLFxuICAgICAgICAgICAgZWxlbWVudDoge1xuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlNpZ25lZElkZW50aWZpZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgY29tcDggPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJ1bmRlbGV0ZVwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgZGVsZXRlZENvbnRhaW5lck5hbWUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImRlbGV0ZWRDb250YWluZXJOYW1lXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWRlbGV0ZWQtY29udGFpbmVyLW5hbWVcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWRlbGV0ZWQtY29udGFpbmVyLW5hbWVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBkZWxldGVkQ29udGFpbmVyVmVyc2lvbiA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiZGVsZXRlZENvbnRhaW5lclZlcnNpb25cIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZGVsZXRlZC1jb250YWluZXItdmVyc2lvblwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtZGVsZXRlZC1jb250YWluZXItdmVyc2lvblwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvbXA5ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwicmVuYW1lXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBzb3VyY2VDb250YWluZXJOYW1lID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwic291cmNlQ29udGFpbmVyTmFtZVwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXNvdXJjZS1jb250YWluZXItbmFtZVwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNvdXJjZS1jb250YWluZXItbmFtZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHNvdXJjZUxlYXNlSWQgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInNvdXJjZUxlYXNlSWRcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtc291cmNlLWxlYXNlLWlkXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1zb3VyY2UtbGVhc2UtaWRcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBjb21wMTAgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJsZWFzZVwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgYWN0aW9uID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiYWN0aW9uXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJhY3F1aXJlXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtYWN0aW9uXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgZHVyYXRpb24gPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImR1cmF0aW9uXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLWR1cmF0aW9uXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1kdXJhdGlvblwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHByb3Bvc2VkTGVhc2VJZCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwicHJvcG9zZWRMZWFzZUlkXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXByb3Bvc2VkLWxlYXNlLWlkXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1wcm9wb3NlZC1sZWFzZS1pZFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGFjdGlvbjEgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJhY3Rpb25cIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcInJlbGVhc2VcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1hY3Rpb25cIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBsZWFzZUlkMSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImxlYXNlSWRcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1pZFwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLWlkXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgYWN0aW9uMiA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImFjdGlvblwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwicmVuZXdcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1hY3Rpb25cIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBhY3Rpb24zID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiYWN0aW9uXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJicmVha1wiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLWFjdGlvblwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGJyZWFrUGVyaW9kID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJicmVha1BlcmlvZFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1icmVhay1wZXJpb2RcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLWJyZWFrLXBlcmlvZFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGFjdGlvbjQgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJhY3Rpb25cIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImNoYW5nZVwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLWFjdGlvblwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHByb3Bvc2VkTGVhc2VJZDEgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJwcm9wb3NlZExlYXNlSWRcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1wcm9wb3NlZC1sZWFzZS1pZFwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXByb3Bvc2VkLWxlYXNlLWlkXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgaW5jbHVkZTEgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImluY2x1ZGVcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImluY2x1ZGVcIixcbiAgICAgICAgeG1sTmFtZTogXCJpbmNsdWRlXCIsXG4gICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIkxpc3RCbG9ic0luY2x1ZGVJdGVtXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU2VxdWVuY2VcIixcbiAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNvcHlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVsZXRlZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJtZXRhZGF0YVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJzbmFwc2hvdHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidW5jb21taXR0ZWRibG9ic1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ2ZXJzaW9uc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0YWdzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImltbXV0YWJpbGl0eXBvbGljeVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsZWdhbGhvbGRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVsZXRlZHdpdGh2ZXJzaW9uc1wiXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGNvbGxlY3Rpb25Gb3JtYXQ6IFF1ZXJ5Q29sbGVjdGlvbkZvcm1hdC5Dc3Zcbn07XG5leHBvcnQgY29uc3QgZGVsaW1pdGVyID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiZGVsaW1pdGVyXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRlbGltaXRlclwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgeG1sTmFtZTogXCJkZWxpbWl0ZXJcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBzbmFwc2hvdCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwic25hcHNob3RcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcInNuYXBzaG90XCIsXG4gICAgICAgIHhtbE5hbWU6IFwic25hcHNob3RcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCB2ZXJzaW9uSWQgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInZlcnNpb25JZFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwidmVyc2lvbmlkXCIsXG4gICAgICAgIHhtbE5hbWU6IFwidmVyc2lvbmlkXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgcmFuZ2UgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInJhbmdlXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJhbmdlXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1yYW5nZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHJhbmdlR2V0Q29udGVudE1ENSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwicmFuZ2VHZXRDb250ZW50TUQ1XCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJhbmdlLWdldC1jb250ZW50LW1kNVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmFuZ2UtZ2V0LWNvbnRlbnQtbWQ1XCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHJhbmdlR2V0Q29udGVudENSQzY0ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJyYW5nZUdldENvbnRlbnRDUkM2NFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yYW5nZS1nZXQtY29udGVudC1jcmM2NFwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmFuZ2UtZ2V0LWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgZW5jcnlwdGlvbktleSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiY3BrSW5mb1wiLCBcImVuY3J5cHRpb25LZXlcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXlcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5XCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgZW5jcnlwdGlvbktleVNoYTI1NiA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiY3BrSW5mb1wiLCBcImVuY3J5cHRpb25LZXlTaGEyNTZcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBlbmNyeXB0aW9uQWxnb3JpdGhtID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJjcGtJbmZvXCIsIFwiZW5jcnlwdGlvbkFsZ29yaXRobVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWFsZ29yaXRobVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1hbGdvcml0aG1cIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBpZk1hdGNoID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnNcIiwgXCJpZk1hdGNoXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJJZi1NYXRjaFwiLFxuICAgICAgICB4bWxOYW1lOiBcIklmLU1hdGNoXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgaWZOb25lTWF0Y2ggPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcIm1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uc1wiLCBcImlmTm9uZU1hdGNoXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJJZi1Ob25lLU1hdGNoXCIsXG4gICAgICAgIHhtbE5hbWU6IFwiSWYtTm9uZS1NYXRjaFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGlmVGFncyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwibW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zXCIsIFwiaWZUYWdzXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWlmLXRhZ3NcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWlmLXRhZ3NcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBkZWxldGVTbmFwc2hvdHMgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImRlbGV0ZVNuYXBzaG90c1wiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1kZWxldGUtc25hcHNob3RzXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1kZWxldGUtc25hcHNob3RzXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiaW5jbHVkZVwiLCBcIm9ubHlcIl1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgYmxvYkRlbGV0ZVR5cGUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImJsb2JEZWxldGVUeXBlXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkZWxldGV0eXBlXCIsXG4gICAgICAgIHhtbE5hbWU6IFwiZGVsZXRldHlwZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvbXAxMSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImV4cGlyeVwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgZXhwaXJ5T3B0aW9ucyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImV4cGlyeU9wdGlvbnNcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1leHBpcnktb3B0aW9uXCIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXhwaXJ5LW9wdGlvblwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGV4cGlyZXNPbiA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiZXhwaXJlc09uXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWV4cGlyeS10aW1lXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1leHBpcnktdGltZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGJsb2JDYWNoZUNvbnRyb2wgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImJsb2JIdHRwSGVhZGVyc1wiLCBcImJsb2JDYWNoZUNvbnRyb2xcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1jYWNoZS1jb250cm9sXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNhY2hlLWNvbnRyb2xcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBibG9iQ29udGVudFR5cGUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImJsb2JIdHRwSGVhZGVyc1wiLCBcImJsb2JDb250ZW50VHlwZVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLWNvbnRlbnQtdHlwZVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LXR5cGVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBibG9iQ29udGVudE1ENSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiYmxvYkh0dHBIZWFkZXJzXCIsIFwiYmxvYkNvbnRlbnRNRDVcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LW1kNVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LW1kNVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGJsb2JDb250ZW50RW5jb2RpbmcgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImJsb2JIdHRwSGVhZGVyc1wiLCBcImJsb2JDb250ZW50RW5jb2RpbmdcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LWVuY29kaW5nXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNvbnRlbnQtZW5jb2RpbmdcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBibG9iQ29udGVudExhbmd1YWdlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJibG9iSHR0cEhlYWRlcnNcIiwgXCJibG9iQ29udGVudExhbmd1YWdlXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC1sYW5ndWFnZVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LWxhbmd1YWdlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgYmxvYkNvbnRlbnREaXNwb3NpdGlvbiA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiYmxvYkh0dHBIZWFkZXJzXCIsIFwiYmxvYkNvbnRlbnREaXNwb3NpdGlvblwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLWNvbnRlbnQtZGlzcG9zaXRpb25cIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC1kaXNwb3NpdGlvblwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvbXAxMiA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImltbXV0YWJpbGl0eVBvbGljaWVzXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBpbW11dGFiaWxpdHlQb2xpY3lFeHBpcnkgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImltbXV0YWJpbGl0eVBvbGljeUV4cGlyeVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1pbW11dGFiaWxpdHktcG9saWN5LXVudGlsLWRhdGVcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWltbXV0YWJpbGl0eS1wb2xpY3ktdW50aWwtZGF0ZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGltbXV0YWJpbGl0eVBvbGljeU1vZGUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImltbXV0YWJpbGl0eVBvbGljeU1vZGVcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtaW1tdXRhYmlsaXR5LXBvbGljeS1tb2RlXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1pbW11dGFiaWxpdHktcG9saWN5LW1vZGVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJNdXRhYmxlXCIsIFwiVW5sb2NrZWRcIiwgXCJMb2NrZWRcIl1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgY29tcDEzID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwibGVnYWxob2xkXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBsZWdhbEhvbGQgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJsZWdhbEhvbGRcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWdhbC1ob2xkXCIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVnYWwtaG9sZFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBlbmNyeXB0aW9uU2NvcGUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImVuY3J5cHRpb25TY29wZVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgY29tcDE0ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwic25hcHNob3RcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHRpZXIgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInRpZXJcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYWNjZXNzLXRpZXJcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWFjY2Vzcy10aWVyXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1xuICAgICAgICAgICAgICAgIFwiUDRcIixcbiAgICAgICAgICAgICAgICBcIlA2XCIsXG4gICAgICAgICAgICAgICAgXCJQMTBcIixcbiAgICAgICAgICAgICAgICBcIlAxNVwiLFxuICAgICAgICAgICAgICAgIFwiUDIwXCIsXG4gICAgICAgICAgICAgICAgXCJQMzBcIixcbiAgICAgICAgICAgICAgICBcIlA0MFwiLFxuICAgICAgICAgICAgICAgIFwiUDUwXCIsXG4gICAgICAgICAgICAgICAgXCJQNjBcIixcbiAgICAgICAgICAgICAgICBcIlA3MFwiLFxuICAgICAgICAgICAgICAgIFwiUDgwXCIsXG4gICAgICAgICAgICAgICAgXCJIb3RcIixcbiAgICAgICAgICAgICAgICBcIkNvb2xcIixcbiAgICAgICAgICAgICAgICBcIkFyY2hpdmVcIixcbiAgICAgICAgICAgICAgICBcIkNvbGRcIlxuICAgICAgICAgICAgXVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCByZWh5ZHJhdGVQcmlvcml0eSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwicmVoeWRyYXRlUHJpb3JpdHlcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVoeWRyYXRlLXByaW9yaXR5XCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZWh5ZHJhdGUtcHJpb3JpdHlcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJIaWdoXCIsIFwiU3RhbmRhcmRcIl1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3Qgc291cmNlSWZNb2RpZmllZFNpbmNlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcbiAgICAgICAgXCJvcHRpb25zXCIsXG4gICAgICAgIFwic291cmNlTW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zXCIsXG4gICAgICAgIFwic291cmNlSWZNb2RpZmllZFNpbmNlXCJcbiAgICBdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXNvdXJjZS1pZi1tb2RpZmllZC1zaW5jZVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtc291cmNlLWlmLW1vZGlmaWVkLXNpbmNlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3Qgc291cmNlSWZVbm1vZGlmaWVkU2luY2UgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1xuICAgICAgICBcIm9wdGlvbnNcIixcbiAgICAgICAgXCJzb3VyY2VNb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnNcIixcbiAgICAgICAgXCJzb3VyY2VJZlVubW9kaWZpZWRTaW5jZVwiXG4gICAgXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zb3VyY2UtaWYtdW5tb2RpZmllZC1zaW5jZVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtc291cmNlLWlmLXVubW9kaWZpZWQtc2luY2VcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBzb3VyY2VJZk1hdGNoID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJzb3VyY2VNb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnNcIiwgXCJzb3VyY2VJZk1hdGNoXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXNvdXJjZS1pZi1tYXRjaFwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtc291cmNlLWlmLW1hdGNoXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3Qgc291cmNlSWZOb25lTWF0Y2ggPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1xuICAgICAgICBcIm9wdGlvbnNcIixcbiAgICAgICAgXCJzb3VyY2VNb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnNcIixcbiAgICAgICAgXCJzb3VyY2VJZk5vbmVNYXRjaFwiXG4gICAgXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zb3VyY2UtaWYtbm9uZS1tYXRjaFwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtc291cmNlLWlmLW5vbmUtbWF0Y2hcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBzb3VyY2VJZlRhZ3MgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInNvdXJjZU1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uc1wiLCBcInNvdXJjZUlmVGFnc1wiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zb3VyY2UtaWYtdGFnc1wiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtc291cmNlLWlmLXRhZ3NcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBjb3B5U291cmNlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29weVNvdXJjZVwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktc291cmNlXCIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1zb3VyY2VcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBibG9iVGFnc1N0cmluZyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiYmxvYlRhZ3NTdHJpbmdcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdGFnc1wiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtdGFnc1wiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHNlYWxCbG9iID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJzZWFsQmxvYlwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zZWFsLWJsb2JcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNlYWwtYmxvYlwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBsZWdhbEhvbGQxID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJsZWdhbEhvbGRcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVnYWwtaG9sZFwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVnYWwtaG9sZFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCB4TXNSZXF1aXJlc1N5bmMgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJ4TXNSZXF1aXJlc1N5bmNcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcInRydWVcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1aXJlcy1zeW5jXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3Qgc291cmNlQ29udGVudE1ENSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwic291cmNlQ29udGVudE1ENVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zb3VyY2UtY29udGVudC1tZDVcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNvdXJjZS1jb250ZW50LW1kNVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvcHlTb3VyY2VBdXRob3JpemF0aW9uID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJjb3B5U291cmNlQXV0aG9yaXphdGlvblwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXNvdXJjZS1hdXRob3JpemF0aW9uXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LXNvdXJjZS1hdXRob3JpemF0aW9uXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgY29weVNvdXJjZVRhZ3MgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImNvcHlTb3VyY2VUYWdzXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktc291cmNlLXRhZy1vcHRpb25cIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktc291cmNlLXRhZy1vcHRpb25cIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJSRVBMQUNFXCIsIFwiQ09QWVwiXVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBjb21wMTUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJjb3B5XCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBjb3B5QWN0aW9uQWJvcnRDb25zdGFudCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvcHlBY3Rpb25BYm9ydENvbnN0YW50XCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJhYm9ydFwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktYWN0aW9uXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgY29weUlkID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29weUlkXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvcHlpZFwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgeG1sTmFtZTogXCJjb3B5aWRcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBjb21wMTYgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJ0aWVyXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCB0aWVyMSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcInRpZXJcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1hY2Nlc3MtdGllclwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWFjY2Vzcy10aWVyXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1xuICAgICAgICAgICAgICAgIFwiUDRcIixcbiAgICAgICAgICAgICAgICBcIlA2XCIsXG4gICAgICAgICAgICAgICAgXCJQMTBcIixcbiAgICAgICAgICAgICAgICBcIlAxNVwiLFxuICAgICAgICAgICAgICAgIFwiUDIwXCIsXG4gICAgICAgICAgICAgICAgXCJQMzBcIixcbiAgICAgICAgICAgICAgICBcIlA0MFwiLFxuICAgICAgICAgICAgICAgIFwiUDUwXCIsXG4gICAgICAgICAgICAgICAgXCJQNjBcIixcbiAgICAgICAgICAgICAgICBcIlA3MFwiLFxuICAgICAgICAgICAgICAgIFwiUDgwXCIsXG4gICAgICAgICAgICAgICAgXCJIb3RcIixcbiAgICAgICAgICAgICAgICBcIkNvb2xcIixcbiAgICAgICAgICAgICAgICBcIkFyY2hpdmVcIixcbiAgICAgICAgICAgICAgICBcIkNvbGRcIlxuICAgICAgICAgICAgXVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBxdWVyeVJlcXVlc3QgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInF1ZXJ5UmVxdWVzdFwiXSxcbiAgICBtYXBwZXI6IFF1ZXJ5UmVxdWVzdE1hcHBlclxufTtcbmV4cG9ydCBjb25zdCBjb21wMTcgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJxdWVyeVwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgY29tcDE4ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwidGFnc1wiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgdGFncyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwidGFnc1wiXSxcbiAgICBtYXBwZXI6IEJsb2JUYWdzTWFwcGVyXG59O1xuZXhwb3J0IGNvbnN0IHRyYW5zYWN0aW9uYWxDb250ZW50TUQ1ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJ0cmFuc2FjdGlvbmFsQ29udGVudE1ENVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGVudC1NRDVcIixcbiAgICAgICAgeG1sTmFtZTogXCJDb250ZW50LU1ENVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHRyYW5zYWN0aW9uYWxDb250ZW50Q3JjNjQgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInRyYW5zYWN0aW9uYWxDb250ZW50Q3JjNjRcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGJsb2JUeXBlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiYmxvYlR5cGVcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcIlBhZ2VCbG9iXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi10eXBlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgYmxvYkNvbnRlbnRMZW5ndGggPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJibG9iQ29udGVudExlbmd0aFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC1sZW5ndGhcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNvbnRlbnQtbGVuZ3RoXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgYmxvYlNlcXVlbmNlTnVtYmVyID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJibG9iU2VxdWVuY2VOdW1iZXJcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgY29udGVudFR5cGUxID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJjb250ZW50VHlwZVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb250ZW50LVR5cGVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBib2R5MSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImJvZHlcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiYm9keVwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgeG1sTmFtZTogXCJib2R5XCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyZWFtXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgYWNjZXB0MiA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImFjY2VwdFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiYXBwbGljYXRpb24veG1sXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkFjY2VwdFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvbXAxOSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcInBhZ2VcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHBhZ2VXcml0ZSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcInBhZ2VXcml0ZVwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwidXBkYXRlXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcGFnZS13cml0ZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGlmU2VxdWVuY2VOdW1iZXJMZXNzVGhhbk9yRXF1YWxUbyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXG4gICAgICAgIFwib3B0aW9uc1wiLFxuICAgICAgICBcInNlcXVlbmNlTnVtYmVyQWNjZXNzQ29uZGl0aW9uc1wiLFxuICAgICAgICBcImlmU2VxdWVuY2VOdW1iZXJMZXNzVGhhbk9yRXF1YWxUb1wiXG4gICAgXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1pZi1zZXF1ZW5jZS1udW1iZXItbGVcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWlmLXNlcXVlbmNlLW51bWJlci1sZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGlmU2VxdWVuY2VOdW1iZXJMZXNzVGhhbiA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXG4gICAgICAgIFwib3B0aW9uc1wiLFxuICAgICAgICBcInNlcXVlbmNlTnVtYmVyQWNjZXNzQ29uZGl0aW9uc1wiLFxuICAgICAgICBcImlmU2VxdWVuY2VOdW1iZXJMZXNzVGhhblwiXG4gICAgXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1pZi1zZXF1ZW5jZS1udW1iZXItbHRcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWlmLXNlcXVlbmNlLW51bWJlci1sdFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGlmU2VxdWVuY2VOdW1iZXJFcXVhbFRvID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcbiAgICAgICAgXCJvcHRpb25zXCIsXG4gICAgICAgIFwic2VxdWVuY2VOdW1iZXJBY2Nlc3NDb25kaXRpb25zXCIsXG4gICAgICAgIFwiaWZTZXF1ZW5jZU51bWJlckVxdWFsVG9cIlxuICAgIF0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtaWYtc2VxdWVuY2UtbnVtYmVyLWVxXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1pZi1zZXF1ZW5jZS1udW1iZXItZXFcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBwYWdlV3JpdGUxID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwicGFnZVdyaXRlXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJjbGVhclwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXBhZ2Utd3JpdGVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBzb3VyY2VVcmwgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJzb3VyY2VVcmxcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXNvdXJjZVwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktc291cmNlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3Qgc291cmNlUmFuZ2UgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJzb3VyY2VSYW5nZVwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXNvdXJjZS1yYW5nZVwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNvdXJjZS1yYW5nZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHNvdXJjZUNvbnRlbnRDcmM2NCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwic291cmNlQ29udGVudENyYzY0XCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXNvdXJjZS1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1zb3VyY2UtY29udGVudC1jcmM2NFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHJhbmdlMSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcInJhbmdlXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmFuZ2VcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1yYW5nZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvbXAyMCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcInBhZ2VsaXN0XCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBwcmV2c25hcHNob3QgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInByZXZzbmFwc2hvdFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwicHJldnNuYXBzaG90XCIsXG4gICAgICAgIHhtbE5hbWU6IFwicHJldnNuYXBzaG90XCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgcHJldlNuYXBzaG90VXJsID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJwcmV2U25hcHNob3RVcmxcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcHJldmlvdXMtc25hcHNob3QtdXJsXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1wcmV2aW91cy1zbmFwc2hvdC11cmxcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBzZXF1ZW5jZU51bWJlckFjdGlvbiA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcInNlcXVlbmNlTnVtYmVyQWN0aW9uXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtc2VxdWVuY2UtbnVtYmVyLWFjdGlvblwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNlcXVlbmNlLW51bWJlci1hY3Rpb25cIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJtYXhcIiwgXCJ1cGRhdGVcIiwgXCJpbmNyZW1lbnRcIl1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgY29tcDIxID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiaW5jcmVtZW50YWxjb3B5XCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBibG9iVHlwZTEgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJibG9iVHlwZVwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiQXBwZW5kQmxvYlwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItdHlwZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvbXAyMiA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImFwcGVuZGJsb2NrXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBtYXhTaXplID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJhcHBlbmRQb3NpdGlvbkFjY2Vzc0NvbmRpdGlvbnNcIiwgXCJtYXhTaXplXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItY29uZGl0aW9uLW1heHNpemVcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItY29uZGl0aW9uLW1heHNpemVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBhcHBlbmRQb3NpdGlvbiA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXG4gICAgICAgIFwib3B0aW9uc1wiLFxuICAgICAgICBcImFwcGVuZFBvc2l0aW9uQWNjZXNzQ29uZGl0aW9uc1wiLFxuICAgICAgICBcImFwcGVuZFBvc2l0aW9uXCJcbiAgICBdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItY29uZGl0aW9uLWFwcGVuZHBvc1wiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1jb25kaXRpb24tYXBwZW5kcG9zXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3Qgc291cmNlUmFuZ2UxID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJzb3VyY2VSYW5nZVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zb3VyY2UtcmFuZ2VcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNvdXJjZS1yYW5nZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvbXAyMyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcInNlYWxcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGJsb2JUeXBlMiA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImJsb2JUeXBlXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJCbG9ja0Jsb2JcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLXR5cGVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBjb3B5U291cmNlQmxvYlByb3BlcnRpZXMgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImNvcHlTb3VyY2VCbG9iUHJvcGVydGllc1wiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXNvdXJjZS1ibG9iLXByb3BlcnRpZXNcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktc291cmNlLWJsb2ItcHJvcGVydGllc1wiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBjb21wMjQgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJibG9ja1wiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgYmxvY2tJZCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImJsb2NrSWRcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiYmxvY2tpZFwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgeG1sTmFtZTogXCJibG9ja2lkXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgYmxvY2tzID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiYmxvY2tzXCIsXG4gICAgbWFwcGVyOiBCbG9ja0xvb2t1cExpc3RNYXBwZXJcbn07XG5leHBvcnQgY29uc3QgY29tcDI1ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiYmxvY2tsaXN0XCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBsaXN0VHlwZSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImxpc3RUeXBlXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJjb21taXR0ZWRcIixcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiYmxvY2tsaXN0dHlwZVwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgeG1sTmFtZTogXCJibG9ja2xpc3R0eXBlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiY29tbWl0dGVkXCIsIFwidW5jb21taXR0ZWRcIiwgXCJhbGxcIl1cbiAgICAgICAgfVxuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJhbWV0ZXJzLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqXG4gKiBDb2RlIGdlbmVyYXRlZCBieSBNaWNyb3NvZnQgKFIpIEF1dG9SZXN0IENvZGUgR2VuZXJhdG9yLlxuICogQ2hhbmdlcyBtYXkgY2F1c2UgaW5jb3JyZWN0IGJlaGF2aW9yIGFuZCB3aWxsIGJlIGxvc3QgaWYgdGhlIGNvZGUgaXMgcmVnZW5lcmF0ZWQuXG4gKi9cbmltcG9ydCAqIGFzIGNvcmVIdHRwIGZyb20gXCJAYXp1cmUvY29yZS1odHRwXCI7XG5pbXBvcnQgKiBhcyBNYXBwZXJzIGZyb20gXCIuLi9tb2RlbHMvbWFwcGVyc1wiO1xuaW1wb3J0ICogYXMgUGFyYW1ldGVycyBmcm9tIFwiLi4vbW9kZWxzL3BhcmFtZXRlcnNcIjtcbi8qKiBDbGFzcyByZXByZXNlbnRpbmcgYSBTZXJ2aWNlLiAqL1xuZXhwb3J0IGNsYXNzIFNlcnZpY2Uge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIFNlcnZpY2UgY2xhc3MuXG4gICAgICogQHBhcmFtIGNsaWVudCBSZWZlcmVuY2UgdG8gdGhlIHNlcnZpY2UgY2xpZW50XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHByb3BlcnRpZXMgZm9yIGEgc3RvcmFnZSBhY2NvdW50J3MgQmxvYiBzZXJ2aWNlIGVuZHBvaW50LCBpbmNsdWRpbmcgcHJvcGVydGllcyBmb3IgU3RvcmFnZVxuICAgICAqIEFuYWx5dGljcyBhbmQgQ09SUyAoQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcpIHJ1bGVzXG4gICAgICogQHBhcmFtIGJsb2JTZXJ2aWNlUHJvcGVydGllcyBUaGUgU3RvcmFnZVNlcnZpY2UgcHJvcGVydGllcy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHNldFByb3BlcnRpZXMoYmxvYlNlcnZpY2VQcm9wZXJ0aWVzLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGJsb2JTZXJ2aWNlUHJvcGVydGllcyxcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBzZXRQcm9wZXJ0aWVzT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGdldHMgdGhlIHByb3BlcnRpZXMgb2YgYSBzdG9yYWdlIGFjY291bnQncyBCbG9iIHNlcnZpY2UsIGluY2x1ZGluZyBwcm9wZXJ0aWVzIGZvciBTdG9yYWdlIEFuYWx5dGljc1xuICAgICAqIGFuZCBDT1JTIChDcm9zcy1PcmlnaW4gUmVzb3VyY2UgU2hhcmluZykgcnVsZXMuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBnZXRQcm9wZXJ0aWVzKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGdldFByb3BlcnRpZXNPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHN0YXRpc3RpY3MgcmVsYXRlZCB0byByZXBsaWNhdGlvbiBmb3IgdGhlIEJsb2Igc2VydmljZS4gSXQgaXMgb25seSBhdmFpbGFibGUgb24gdGhlXG4gICAgICogc2Vjb25kYXJ5IGxvY2F0aW9uIGVuZHBvaW50IHdoZW4gcmVhZC1hY2Nlc3MgZ2VvLXJlZHVuZGFudCByZXBsaWNhdGlvbiBpcyBlbmFibGVkIGZvciB0aGUgc3RvcmFnZVxuICAgICAqIGFjY291bnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBnZXRTdGF0aXN0aWNzKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGdldFN0YXRpc3RpY3NPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIExpc3QgQ29udGFpbmVycyBTZWdtZW50IG9wZXJhdGlvbiByZXR1cm5zIGEgbGlzdCBvZiB0aGUgY29udGFpbmVycyB1bmRlciB0aGUgc3BlY2lmaWVkIGFjY291bnRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGxpc3RDb250YWluZXJzU2VnbWVudChvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBsaXN0Q29udGFpbmVyc1NlZ21lbnRPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIGEgdXNlciBkZWxlZ2F0aW9uIGtleSBmb3IgdGhlIEJsb2Igc2VydmljZS4gVGhpcyBpcyBvbmx5IGEgdmFsaWQgb3BlcmF0aW9uIHdoZW4gdXNpbmdcbiAgICAgKiBiZWFyZXIgdG9rZW4gYXV0aGVudGljYXRpb24uXG4gICAgICogQHBhcmFtIGtleUluZm8gS2V5IGluZm9ybWF0aW9uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBnZXRVc2VyRGVsZWdhdGlvbktleShrZXlJbmZvLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGtleUluZm8sXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgZ2V0VXNlckRlbGVnYXRpb25LZXlPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2t1IG5hbWUgYW5kIGFjY291bnQga2luZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgZ2V0QWNjb3VudEluZm8ob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgZ2V0QWNjb3VudEluZm9PcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIEJhdGNoIG9wZXJhdGlvbiBhbGxvd3MgbXVsdGlwbGUgQVBJIGNhbGxzIHRvIGJlIGVtYmVkZGVkIGludG8gYSBzaW5nbGUgSFRUUCByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIG11bHRpcGFydENvbnRlbnRUeXBlIFJlcXVpcmVkLiBUaGUgdmFsdWUgb2YgdGhpcyBoZWFkZXIgbXVzdCBiZSBtdWx0aXBhcnQvbWl4ZWQgd2l0aCBhIGJhdGNoXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5LiBFeGFtcGxlIGhlYWRlciB2YWx1ZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT1iYXRjaF88R1VJRD5cbiAgICAgKiBAcGFyYW0gYm9keSBJbml0aWFsIGRhdGFcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHN1Ym1pdEJhdGNoKGNvbnRlbnRMZW5ndGgsIG11bHRpcGFydENvbnRlbnRUeXBlLCBib2R5LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgICBtdWx0aXBhcnRDb250ZW50VHlwZSxcbiAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgc3VibWl0QmF0Y2hPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIEZpbHRlciBCbG9icyBvcGVyYXRpb24gZW5hYmxlcyBjYWxsZXJzIHRvIGxpc3QgYmxvYnMgYWNyb3NzIGFsbCBjb250YWluZXJzIHdob3NlIHRhZ3MgbWF0Y2ggYVxuICAgICAqIGdpdmVuIHNlYXJjaCBleHByZXNzaW9uLiAgRmlsdGVyIGJsb2JzIHNlYXJjaGVzIGFjcm9zcyBhbGwgY29udGFpbmVycyB3aXRoaW4gYSBzdG9yYWdlIGFjY291bnQgYnV0XG4gICAgICogY2FuIGJlIHNjb3BlZCB3aXRoaW4gdGhlIGV4cHJlc3Npb24gdG8gYSBzaW5nbGUgY29udGFpbmVyLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgZmlsdGVyQmxvYnMob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgZmlsdGVyQmxvYnNPcGVyYXRpb25TcGVjKTtcbiAgICB9XG59XG4vLyBPcGVyYXRpb24gU3BlY2lmaWNhdGlvbnNcbmNvbnN0IHhtbFNlcmlhbGl6ZXIgPSBuZXcgY29yZUh0dHAuU2VyaWFsaXplcihNYXBwZXJzLCAvKiBpc1htbCAqLyB0cnVlKTtcbmNvbnN0IHNldFByb3BlcnRpZXNPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL1wiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMjoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5TZXJ2aWNlU2V0UHJvcGVydGllc0hlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLlNlcnZpY2VTZXRQcm9wZXJ0aWVzRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICByZXF1ZXN0Qm9keTogUGFyYW1ldGVycy5ibG9iU2VydmljZVByb3BlcnRpZXMsXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMucmVzdHlwZSxcbiAgICAgICAgUGFyYW1ldGVycy5jb21wLFxuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHNcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLmNvbnRlbnRUeXBlLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdCxcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veG1sOyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgbWVkaWFUeXBlOiBcInhtbFwiLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBnZXRQcm9wZXJ0aWVzT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi9cIixcbiAgICBodHRwTWV0aG9kOiBcIkdFVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuQmxvYlNlcnZpY2VQcm9wZXJ0aWVzLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5TZXJ2aWNlR2V0UHJvcGVydGllc0hlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLlNlcnZpY2VHZXRQcm9wZXJ0aWVzRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy5yZXN0eXBlLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbXAsXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kc1xuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGdldFN0YXRpc3RpY3NPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL1wiLFxuICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5CbG9iU2VydmljZVN0YXRpc3RpY3MsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLlNlcnZpY2VHZXRTdGF0aXN0aWNzSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuU2VydmljZUdldFN0YXRpc3RpY3NFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnJlc3R5cGUsXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgUGFyYW1ldGVycy5jb21wMVxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGxpc3RDb250YWluZXJzU2VnbWVudE9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIvXCIsXG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLkxpc3RDb250YWluZXJzU2VnbWVudFJlc3BvbnNlLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5TZXJ2aWNlTGlzdENvbnRhaW5lcnNTZWdtZW50SGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuU2VydmljZUxpc3RDb250YWluZXJzU2VnbWVudEV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgUGFyYW1ldGVycy5jb21wMixcbiAgICAgICAgUGFyYW1ldGVycy5wcmVmaXgsXG4gICAgICAgIFBhcmFtZXRlcnMubWFya2VyLFxuICAgICAgICBQYXJhbWV0ZXJzLm1heFBhZ2VTaXplLFxuICAgICAgICBQYXJhbWV0ZXJzLmluY2x1ZGVcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDFcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBnZXRVc2VyRGVsZWdhdGlvbktleU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIvXCIsXG4gICAgaHR0cE1ldGhvZDogXCJQT1NUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5Vc2VyRGVsZWdhdGlvbktleSxcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuU2VydmljZUdldFVzZXJEZWxlZ2F0aW9uS2V5SGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuU2VydmljZUdldFVzZXJEZWxlZ2F0aW9uS2V5RXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICByZXF1ZXN0Qm9keTogUGFyYW1ldGVycy5rZXlJbmZvLFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnJlc3R5cGUsXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgUGFyYW1ldGVycy5jb21wM1xuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMuY29udGVudFR5cGUsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0LFxuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi94bWw7IGNoYXJzZXQ9dXRmLThcIixcbiAgICBtZWRpYVR5cGU6IFwieG1sXCIsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGdldEFjY291bnRJbmZvT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi9cIixcbiAgICBodHRwTWV0aG9kOiBcIkdFVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuU2VydmljZUdldEFjY291bnRJbmZvSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuU2VydmljZUdldEFjY291bnRJbmZvRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLmNvbXAsIFBhcmFtZXRlcnMucmVzdHlwZTFdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudmVyc2lvbiwgUGFyYW1ldGVycy5hY2NlcHQxXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3Qgc3VibWl0QmF0Y2hPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL1wiLFxuICAgIGh0dHBNZXRob2Q6IFwiUE9TVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDI6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiB7IG5hbWU6IFwiU3RyZWFtXCIgfSxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJwYXJzZWRSZXNwb25zZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5TZXJ2aWNlU3VibWl0QmF0Y2hIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5TZXJ2aWNlU3VibWl0QmF0Y2hFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJlcXVlc3RCb2R5OiBQYXJhbWV0ZXJzLmJvZHksXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLCBQYXJhbWV0ZXJzLmNvbXA0XSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy5jb250ZW50VHlwZSxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQsXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuY29udGVudExlbmd0aCxcbiAgICAgICAgUGFyYW1ldGVycy5tdWx0aXBhcnRDb250ZW50VHlwZVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veG1sOyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgbWVkaWFUeXBlOiBcInhtbFwiLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBmaWx0ZXJCbG9ic09wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIvXCIsXG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLkZpbHRlckJsb2JTZWdtZW50LFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5TZXJ2aWNlRmlsdGVyQmxvYnNIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5TZXJ2aWNlRmlsdGVyQmxvYnNFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMubWFya2VyLFxuICAgICAgICBQYXJhbWV0ZXJzLm1heFBhZ2VTaXplLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbXA1LFxuICAgICAgICBQYXJhbWV0ZXJzLndoZXJlXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VydmljZS5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKlxuICogQ29kZSBnZW5lcmF0ZWQgYnkgTWljcm9zb2Z0IChSKSBBdXRvUmVzdCBDb2RlIEdlbmVyYXRvci5cbiAqIENoYW5nZXMgbWF5IGNhdXNlIGluY29ycmVjdCBiZWhhdmlvciBhbmQgd2lsbCBiZSBsb3N0IGlmIHRoZSBjb2RlIGlzIHJlZ2VuZXJhdGVkLlxuICovXG5pbXBvcnQgKiBhcyBjb3JlSHR0cCBmcm9tIFwiQGF6dXJlL2NvcmUtaHR0cFwiO1xuaW1wb3J0ICogYXMgTWFwcGVycyBmcm9tIFwiLi4vbW9kZWxzL21hcHBlcnNcIjtcbmltcG9ydCAqIGFzIFBhcmFtZXRlcnMgZnJvbSBcIi4uL21vZGVscy9wYXJhbWV0ZXJzXCI7XG4vKiogQ2xhc3MgcmVwcmVzZW50aW5nIGEgQ29udGFpbmVyLiAqL1xuZXhwb3J0IGNsYXNzIENvbnRhaW5lciB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgQ29udGFpbmVyIGNsYXNzLlxuICAgICAqIEBwYXJhbSBjbGllbnQgUmVmZXJlbmNlIHRvIHRoZSBzZXJ2aWNlIGNsaWVudFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNsaWVudCkge1xuICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogY3JlYXRlcyBhIG5ldyBjb250YWluZXIgdW5kZXIgdGhlIHNwZWNpZmllZCBhY2NvdW50LiBJZiB0aGUgY29udGFpbmVyIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5XG4gICAgICogZXhpc3RzLCB0aGUgb3BlcmF0aW9uIGZhaWxzXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBjcmVhdGUob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgY3JlYXRlT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHJldHVybnMgYWxsIHVzZXItZGVmaW5lZCBtZXRhZGF0YSBhbmQgc3lzdGVtIHByb3BlcnRpZXMgZm9yIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyLiBUaGUgZGF0YVxuICAgICAqIHJldHVybmVkIGRvZXMgbm90IGluY2x1ZGUgdGhlIGNvbnRhaW5lcidzIGxpc3Qgb2YgYmxvYnNcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGdldFByb3BlcnRpZXMob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgZ2V0UHJvcGVydGllc09wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBvcGVyYXRpb24gbWFya3MgdGhlIHNwZWNpZmllZCBjb250YWluZXIgZm9yIGRlbGV0aW9uLiBUaGUgY29udGFpbmVyIGFuZCBhbnkgYmxvYnMgY29udGFpbmVkIHdpdGhpblxuICAgICAqIGl0IGFyZSBsYXRlciBkZWxldGVkIGR1cmluZyBnYXJiYWdlIGNvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGRlbGV0ZShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBkZWxldGVPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogb3BlcmF0aW9uIHNldHMgb25lIG9yIG1vcmUgdXNlci1kZWZpbmVkIG5hbWUtdmFsdWUgcGFpcnMgZm9yIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgc2V0TWV0YWRhdGEob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgc2V0TWV0YWRhdGFPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogZ2V0cyB0aGUgcGVybWlzc2lvbnMgZm9yIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyLiBUaGUgcGVybWlzc2lvbnMgaW5kaWNhdGUgd2hldGhlciBjb250YWluZXIgZGF0YVxuICAgICAqIG1heSBiZSBhY2Nlc3NlZCBwdWJsaWNseS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGdldEFjY2Vzc1BvbGljeShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBnZXRBY2Nlc3NQb2xpY3lPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogc2V0cyB0aGUgcGVybWlzc2lvbnMgZm9yIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyLiBUaGUgcGVybWlzc2lvbnMgaW5kaWNhdGUgd2hldGhlciBibG9icyBpbiBhXG4gICAgICogY29udGFpbmVyIG1heSBiZSBhY2Nlc3NlZCBwdWJsaWNseS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHNldEFjY2Vzc1BvbGljeShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBzZXRBY2Nlc3NQb2xpY3lPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzdG9yZXMgYSBwcmV2aW91c2x5LWRlbGV0ZWQgY29udGFpbmVyLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgcmVzdG9yZShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCByZXN0b3JlT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbmFtZXMgYW4gZXhpc3RpbmcgY29udGFpbmVyLlxuICAgICAqIEBwYXJhbSBzb3VyY2VDb250YWluZXJOYW1lIFJlcXVpcmVkLiAgU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgdG8gcmVuYW1lLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgcmVuYW1lKHNvdXJjZUNvbnRhaW5lck5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgc291cmNlQ29udGFpbmVyTmFtZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCByZW5hbWVPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIEJhdGNoIG9wZXJhdGlvbiBhbGxvd3MgbXVsdGlwbGUgQVBJIGNhbGxzIHRvIGJlIGVtYmVkZGVkIGludG8gYSBzaW5nbGUgSFRUUCByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIG11bHRpcGFydENvbnRlbnRUeXBlIFJlcXVpcmVkLiBUaGUgdmFsdWUgb2YgdGhpcyBoZWFkZXIgbXVzdCBiZSBtdWx0aXBhcnQvbWl4ZWQgd2l0aCBhIGJhdGNoXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5LiBFeGFtcGxlIGhlYWRlciB2YWx1ZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT1iYXRjaF88R1VJRD5cbiAgICAgKiBAcGFyYW0gYm9keSBJbml0aWFsIGRhdGFcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHN1Ym1pdEJhdGNoKGNvbnRlbnRMZW5ndGgsIG11bHRpcGFydENvbnRlbnRUeXBlLCBib2R5LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgICBtdWx0aXBhcnRDb250ZW50VHlwZSxcbiAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgc3VibWl0QmF0Y2hPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIEZpbHRlciBCbG9icyBvcGVyYXRpb24gZW5hYmxlcyBjYWxsZXJzIHRvIGxpc3QgYmxvYnMgaW4gYSBjb250YWluZXIgd2hvc2UgdGFncyBtYXRjaCBhIGdpdmVuXG4gICAgICogc2VhcmNoIGV4cHJlc3Npb24uICBGaWx0ZXIgYmxvYnMgc2VhcmNoZXMgd2l0aGluIHRoZSBnaXZlbiBjb250YWluZXIuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBmaWx0ZXJCbG9icyhvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBmaWx0ZXJCbG9ic09wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBbVXBkYXRlXSBlc3RhYmxpc2hlcyBhbmQgbWFuYWdlcyBhIGxvY2sgb24gYSBjb250YWluZXIgZm9yIGRlbGV0ZSBvcGVyYXRpb25zLiBUaGUgbG9jayBkdXJhdGlvbiBjYW5cbiAgICAgKiBiZSAxNSB0byA2MCBzZWNvbmRzLCBvciBjYW4gYmUgaW5maW5pdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGFjcXVpcmVMZWFzZShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBhY3F1aXJlTGVhc2VPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogW1VwZGF0ZV0gZXN0YWJsaXNoZXMgYW5kIG1hbmFnZXMgYSBsb2NrIG9uIGEgY29udGFpbmVyIGZvciBkZWxldGUgb3BlcmF0aW9ucy4gVGhlIGxvY2sgZHVyYXRpb24gY2FuXG4gICAgICogYmUgMTUgdG8gNjAgc2Vjb25kcywgb3IgY2FuIGJlIGluZmluaXRlXG4gICAgICogQHBhcmFtIGxlYXNlSWQgU3BlY2lmaWVzIHRoZSBjdXJyZW50IGxlYXNlIElEIG9uIHRoZSByZXNvdXJjZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHJlbGVhc2VMZWFzZShsZWFzZUlkLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGxlYXNlSWQsXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgcmVsZWFzZUxlYXNlT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtVcGRhdGVdIGVzdGFibGlzaGVzIGFuZCBtYW5hZ2VzIGEgbG9jayBvbiBhIGNvbnRhaW5lciBmb3IgZGVsZXRlIG9wZXJhdGlvbnMuIFRoZSBsb2NrIGR1cmF0aW9uIGNhblxuICAgICAqIGJlIDE1IHRvIDYwIHNlY29uZHMsIG9yIGNhbiBiZSBpbmZpbml0ZVxuICAgICAqIEBwYXJhbSBsZWFzZUlkIFNwZWNpZmllcyB0aGUgY3VycmVudCBsZWFzZSBJRCBvbiB0aGUgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICByZW5ld0xlYXNlKGxlYXNlSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgbGVhc2VJZCxcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCByZW5ld0xlYXNlT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtVcGRhdGVdIGVzdGFibGlzaGVzIGFuZCBtYW5hZ2VzIGEgbG9jayBvbiBhIGNvbnRhaW5lciBmb3IgZGVsZXRlIG9wZXJhdGlvbnMuIFRoZSBsb2NrIGR1cmF0aW9uIGNhblxuICAgICAqIGJlIDE1IHRvIDYwIHNlY29uZHMsIG9yIGNhbiBiZSBpbmZpbml0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgYnJlYWtMZWFzZShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBicmVha0xlYXNlT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtVcGRhdGVdIGVzdGFibGlzaGVzIGFuZCBtYW5hZ2VzIGEgbG9jayBvbiBhIGNvbnRhaW5lciBmb3IgZGVsZXRlIG9wZXJhdGlvbnMuIFRoZSBsb2NrIGR1cmF0aW9uIGNhblxuICAgICAqIGJlIDE1IHRvIDYwIHNlY29uZHMsIG9yIGNhbiBiZSBpbmZpbml0ZVxuICAgICAqIEBwYXJhbSBsZWFzZUlkIFNwZWNpZmllcyB0aGUgY3VycmVudCBsZWFzZSBJRCBvbiB0aGUgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIHByb3Bvc2VkTGVhc2VJZCBQcm9wb3NlZCBsZWFzZSBJRCwgaW4gYSBHVUlEIHN0cmluZyBmb3JtYXQuIFRoZSBCbG9iIHNlcnZpY2UgcmV0dXJucyA0MDBcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIChJbnZhbGlkIHJlcXVlc3QpIGlmIHRoZSBwcm9wb3NlZCBsZWFzZSBJRCBpcyBub3QgaW4gdGhlIGNvcnJlY3QgZm9ybWF0LiBTZWUgR3VpZCBDb25zdHJ1Y3RvclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgZm9yIGEgbGlzdCBvZiB2YWxpZCBHVUlEIHN0cmluZyBmb3JtYXRzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgY2hhbmdlTGVhc2UobGVhc2VJZCwgcHJvcG9zZWRMZWFzZUlkLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGxlYXNlSWQsXG4gICAgICAgICAgICBwcm9wb3NlZExlYXNlSWQsXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgY2hhbmdlTGVhc2VPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogW1VwZGF0ZV0gVGhlIExpc3QgQmxvYnMgb3BlcmF0aW9uIHJldHVybnMgYSBsaXN0IG9mIHRoZSBibG9icyB1bmRlciB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lclxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgbGlzdEJsb2JGbGF0U2VnbWVudChvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBsaXN0QmxvYkZsYXRTZWdtZW50T3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtVcGRhdGVdIFRoZSBMaXN0IEJsb2JzIG9wZXJhdGlvbiByZXR1cm5zIGEgbGlzdCBvZiB0aGUgYmxvYnMgdW5kZXIgdGhlIHNwZWNpZmllZCBjb250YWluZXJcbiAgICAgKiBAcGFyYW0gZGVsaW1pdGVyIFdoZW4gdGhlIHJlcXVlc3QgaW5jbHVkZXMgdGhpcyBwYXJhbWV0ZXIsIHRoZSBvcGVyYXRpb24gcmV0dXJucyBhIEJsb2JQcmVmaXhcbiAgICAgKiAgICAgICAgICAgICAgICAgIGVsZW1lbnQgaW4gdGhlIHJlc3BvbnNlIGJvZHkgdGhhdCBhY3RzIGFzIGEgcGxhY2Vob2xkZXIgZm9yIGFsbCBibG9icyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgc2FtZSBzdWJzdHJpbmcgdXAgdG8gdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGRlbGltaXRlciBjaGFyYWN0ZXIuIFRoZSBkZWxpbWl0ZXIgbWF5IGJlIGEgc2luZ2xlXG4gICAgICogICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgb3IgYSBzdHJpbmcuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBsaXN0QmxvYkhpZXJhcmNoeVNlZ21lbnQoZGVsaW1pdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGRlbGltaXRlcixcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBsaXN0QmxvYkhpZXJhcmNoeVNlZ21lbnRPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2t1IG5hbWUgYW5kIGFjY291bnQga2luZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgZ2V0QWNjb3VudEluZm8ob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgZ2V0QWNjb3VudEluZm9PcGVyYXRpb25TcGVjKTtcbiAgICB9XG59XG4vLyBPcGVyYXRpb24gU3BlY2lmaWNhdGlvbnNcbmNvbnN0IHhtbFNlcmlhbGl6ZXIgPSBuZXcgY29yZUh0dHAuU2VyaWFsaXplcihNYXBwZXJzLCAvKiBpc1htbCAqLyB0cnVlKTtcbmNvbnN0IGNyZWF0ZU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAxOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lckNyZWF0ZUhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lckNyZWF0ZUV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLCBQYXJhbWV0ZXJzLnJlc3R5cGUyXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLm1ldGFkYXRhLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VzcyxcbiAgICAgICAgUGFyYW1ldGVycy5kZWZhdWx0RW5jcnlwdGlvblNjb3BlLFxuICAgICAgICBQYXJhbWV0ZXJzLnByZXZlbnRFbmNyeXB0aW9uU2NvcGVPdmVycmlkZVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGdldFByb3BlcnRpZXNPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJHZXRQcm9wZXJ0aWVzSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyR2V0UHJvcGVydGllc0V4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLCBQYXJhbWV0ZXJzLnJlc3R5cGUyXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWRcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBkZWxldGVPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMjoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJEZWxldGVIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJEZWxldGVFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcywgUGFyYW1ldGVycy5yZXN0eXBlMl0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IHNldE1ldGFkYXRhT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyU2V0TWV0YWRhdGFIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJTZXRNZXRhZGF0YUV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgUGFyYW1ldGVycy5yZXN0eXBlMixcbiAgICAgICAgUGFyYW1ldGVycy5jb21wNlxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5tZXRhZGF0YSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGdldEFjY2Vzc1BvbGljeU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiB7XG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNlcXVlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHsgbmFtZTogXCJDb21wb3NpdGVcIiwgY2xhc3NOYW1lOiBcIlNpZ25lZElkZW50aWZpZXJcIiB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNpZ25lZElkZW50aWZpZXJzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJTaWduZWRJZGVudGlmaWVyc1wiLFxuICAgICAgICAgICAgICAgIHhtbElzV3JhcHBlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxFbGVtZW50TmFtZTogXCJTaWduZWRJZGVudGlmaWVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lckdldEFjY2Vzc1BvbGljeUhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lckdldEFjY2Vzc1BvbGljeUV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgUGFyYW1ldGVycy5yZXN0eXBlMixcbiAgICAgICAgUGFyYW1ldGVycy5jb21wN1xuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3Qgc2V0QWNjZXNzUG9saWN5T3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyU2V0QWNjZXNzUG9saWN5SGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyU2V0QWNjZXNzUG9saWN5RXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICByZXF1ZXN0Qm9keTogUGFyYW1ldGVycy5jb250YWluZXJBY2wsXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgUGFyYW1ldGVycy5yZXN0eXBlMixcbiAgICAgICAgUGFyYW1ldGVycy5jb21wN1xuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMuY29udGVudFR5cGUsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0LFxuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VzcyxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veG1sOyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgbWVkaWFUeXBlOiBcInhtbFwiLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCByZXN0b3JlT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDE6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyUmVzdG9yZUhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lclJlc3RvcmVFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMucmVzdHlwZTIsXG4gICAgICAgIFBhcmFtZXRlcnMuY29tcDhcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMuZGVsZXRlZENvbnRhaW5lck5hbWUsXG4gICAgICAgIFBhcmFtZXRlcnMuZGVsZXRlZENvbnRhaW5lclZlcnNpb25cbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCByZW5hbWVPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJSZW5hbWVIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJSZW5hbWVFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMucmVzdHlwZTIsXG4gICAgICAgIFBhcmFtZXRlcnMuY29tcDlcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlQ29udGFpbmVyTmFtZSxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VMZWFzZUlkXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3Qgc3VibWl0QmF0Y2hPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUE9TVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDI6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiB7IG5hbWU6IFwiU3RyZWFtXCIgfSxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJwYXJzZWRSZXNwb25zZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJTdWJtaXRCYXRjaEhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lclN1Ym1pdEJhdGNoRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICByZXF1ZXN0Qm9keTogUGFyYW1ldGVycy5ib2R5LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMuY29tcDQsXG4gICAgICAgIFBhcmFtZXRlcnMucmVzdHlwZTJcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLmNvbnRlbnRUeXBlLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdCxcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5jb250ZW50TGVuZ3RoLFxuICAgICAgICBQYXJhbWV0ZXJzLm11bHRpcGFydENvbnRlbnRUeXBlXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi94bWw7IGNoYXJzZXQ9dXRmLThcIixcbiAgICBtZWRpYVR5cGU6IFwieG1sXCIsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGZpbHRlckJsb2JzT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX1cIixcbiAgICBodHRwTWV0aG9kOiBcIkdFVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuRmlsdGVyQmxvYlNlZ21lbnQsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lckZpbHRlckJsb2JzSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyRmlsdGVyQmxvYnNFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMubWFya2VyLFxuICAgICAgICBQYXJhbWV0ZXJzLm1heFBhZ2VTaXplLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbXA1LFxuICAgICAgICBQYXJhbWV0ZXJzLndoZXJlLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlc3R5cGUyXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgYWNxdWlyZUxlYXNlT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDE6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyQWNxdWlyZUxlYXNlSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyQWNxdWlyZUxlYXNlRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlc3R5cGUyLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbXAxMFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuYWN0aW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLmR1cmF0aW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnByb3Bvc2VkTGVhc2VJZFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IHJlbGVhc2VMZWFzZU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lclJlbGVhc2VMZWFzZUhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lclJlbGVhc2VMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgUGFyYW1ldGVycy5yZXN0eXBlMixcbiAgICAgICAgUGFyYW1ldGVycy5jb21wMTBcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjdGlvbjEsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZDFcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCByZW5ld0xlYXNlT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyUmVuZXdMZWFzZUhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lclJlbmV3TGVhc2VFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMucmVzdHlwZTIsXG4gICAgICAgIFBhcmFtZXRlcnMuY29tcDEwXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkMSxcbiAgICAgICAgUGFyYW1ldGVycy5hY3Rpb24yXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgYnJlYWtMZWFzZU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAyOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lckJyZWFrTGVhc2VIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJCcmVha0xlYXNlRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlc3R5cGUyLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbXAxMFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuYWN0aW9uMyxcbiAgICAgICAgUGFyYW1ldGVycy5icmVha1BlcmlvZFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGNoYW5nZUxlYXNlT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyQ2hhbmdlTGVhc2VIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJDaGFuZ2VMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgUGFyYW1ldGVycy5yZXN0eXBlMixcbiAgICAgICAgUGFyYW1ldGVycy5jb21wMTBcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjdGlvbjQsXG4gICAgICAgIFBhcmFtZXRlcnMucHJvcG9zZWRMZWFzZUlkMVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGxpc3RCbG9iRmxhdFNlZ21lbnRPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5MaXN0QmxvYnNGbGF0U2VnbWVudFJlc3BvbnNlLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJMaXN0QmxvYkZsYXRTZWdtZW50SGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyTGlzdEJsb2JGbGF0U2VnbWVudEV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgUGFyYW1ldGVycy5jb21wMixcbiAgICAgICAgUGFyYW1ldGVycy5wcmVmaXgsXG4gICAgICAgIFBhcmFtZXRlcnMubWFya2VyLFxuICAgICAgICBQYXJhbWV0ZXJzLm1heFBhZ2VTaXplLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlc3R5cGUyLFxuICAgICAgICBQYXJhbWV0ZXJzLmluY2x1ZGUxXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgbGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50T3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX1cIixcbiAgICBodHRwTWV0aG9kOiBcIkdFVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuTGlzdEJsb2JzSGllcmFyY2h5U2VnbWVudFJlc3BvbnNlLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJMaXN0QmxvYkhpZXJhcmNoeVNlZ21lbnRIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJMaXN0QmxvYkhpZXJhcmNoeVNlZ21lbnRFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMuY29tcDIsXG4gICAgICAgIFBhcmFtZXRlcnMucHJlZml4LFxuICAgICAgICBQYXJhbWV0ZXJzLm1hcmtlcixcbiAgICAgICAgUGFyYW1ldGVycy5tYXhQYWdlU2l6ZSxcbiAgICAgICAgUGFyYW1ldGVycy5yZXN0eXBlMixcbiAgICAgICAgUGFyYW1ldGVycy5pbmNsdWRlMSxcbiAgICAgICAgUGFyYW1ldGVycy5kZWxpbWl0ZXJcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDFcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBnZXRBY2NvdW50SW5mb09wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lckdldEFjY291bnRJbmZvSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyR2V0QWNjb3VudEluZm9FeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMuY29tcCwgUGFyYW1ldGVycy5yZXN0eXBlMV0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy52ZXJzaW9uLCBQYXJhbWV0ZXJzLmFjY2VwdDFdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb250YWluZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBTcGFuS2luZCwgc2V0U3BhbiwgY29udGV4dCBhcyBvdENvbnRleHQsIGdldFRyYWNlciB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IHRyYWNlLCBJTlZBTElEX1NQQU5fQ09OVEVYVCB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9hcGlcIjtcbmV4cG9ydCBmdW5jdGlvbiBpc1RyYWNpbmdEaXNhYmxlZCgpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIC8vIG5vdCBzdXBwb3J0ZWQgaW4gYnJvd3NlciBmb3Igbm93IHdpdGhvdXQgcG9seWZpbGxzXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgYXp1cmVUcmFjaW5nRGlzYWJsZWRWYWx1ZSA9IChfYSA9IHByb2Nlc3MuZW52LkFaVVJFX1RSQUNJTkdfRElTQUJMRUQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChhenVyZVRyYWNpbmdEaXNhYmxlZFZhbHVlID09PSBcImZhbHNlXCIgfHwgYXp1cmVUcmFjaW5nRGlzYWJsZWRWYWx1ZSA9PT0gXCIwXCIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gQm9vbGVhbihhenVyZVRyYWNpbmdEaXNhYmxlZFZhbHVlKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHNwYW5zIHVzaW5nIHRoZSBnbG9iYWwgdHJhY2VyLlxuICpcbiAqIFVzYWdlOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIG9uY2VcbiAqIGNvbnN0IGNyZWF0ZVNwYW4gPSBjcmVhdGVTcGFuRnVuY3Rpb24oeyBwYWNrYWdlUHJlZml4OiBcIkF6dXJlLkRhdGEuQXBwQ29uZmlndXJhdGlvblwiLCBuYW1lc3BhY2U6IFwiTWljcm9zb2Z0LkFwcENvbmZpZ3VyYXRpb25cIiB9KTtcbiAqXG4gKiAvLyBpbiBlYWNoIG9wZXJhdGlvblxuICogY29uc3Qgc3BhbiA9IGNyZWF0ZVNwYW4oXCJkZWxldGVDb25maWd1cmF0aW9uU2V0dGluZ1wiLCBvcGVyYXRpb25PcHRpb25zKTtcbiAqICAgIC8vIGNvZGUuLi5cbiAqIHNwYW4uZW5kKCk7XG4gKiBgYGBcbiAqXG4gKiBAaGlkZGVuXG4gKiBAcGFyYW0gYXJncyAtIGFsbG93cyBjb25maWd1cmF0aW9uIG9mIHRoZSBwcmVmaXggZm9yIGVhY2ggc3BhbiBhcyB3ZWxsIGFzIHRoZSBhei5uYW1lc3BhY2UgZmllbGQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTcGFuRnVuY3Rpb24oYXJncykge1xuICAgIHJldHVybiBmdW5jdGlvbiAob3BlcmF0aW9uTmFtZSwgb3BlcmF0aW9uT3B0aW9ucykge1xuICAgICAgICBjb25zdCB0cmFjZXIgPSBnZXRUcmFjZXIoKTtcbiAgICAgICAgY29uc3QgdHJhY2luZ09wdGlvbnMgPSAob3BlcmF0aW9uT3B0aW9ucyA9PT0gbnVsbCB8fCBvcGVyYXRpb25PcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcGVyYXRpb25PcHRpb25zLnRyYWNpbmdPcHRpb25zKSB8fCB7fTtcbiAgICAgICAgY29uc3Qgc3Bhbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHsga2luZDogU3BhbktpbmQuSU5URVJOQUwgfSwgdHJhY2luZ09wdGlvbnMuc3Bhbk9wdGlvbnMpO1xuICAgICAgICBjb25zdCBzcGFuTmFtZSA9IGFyZ3MucGFja2FnZVByZWZpeCA/IGAke2FyZ3MucGFja2FnZVByZWZpeH0uJHtvcGVyYXRpb25OYW1lfWAgOiBvcGVyYXRpb25OYW1lO1xuICAgICAgICBsZXQgc3BhbjtcbiAgICAgICAgaWYgKGlzVHJhY2luZ0Rpc2FibGVkKCkpIHtcbiAgICAgICAgICAgIHNwYW4gPSB0cmFjZS53cmFwU3BhbkNvbnRleHQoSU5WQUxJRF9TUEFOX0NPTlRFWFQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3BhbiA9IHRyYWNlci5zdGFydFNwYW4oc3Bhbk5hbWUsIHNwYW5PcHRpb25zLCB0cmFjaW5nT3B0aW9ucy50cmFjaW5nQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFyZ3MubmFtZXNwYWNlKSB7XG4gICAgICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZShcImF6Lm5hbWVzcGFjZVwiLCBhcmdzLm5hbWVzcGFjZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5ld1NwYW5PcHRpb25zID0gdHJhY2luZ09wdGlvbnMuc3Bhbk9wdGlvbnMgfHwge307XG4gICAgICAgIGlmIChzcGFuLmlzUmVjb3JkaW5nKCkgJiYgYXJncy5uYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIG5ld1NwYW5PcHRpb25zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0cmFjaW5nT3B0aW9ucy5zcGFuT3B0aW9ucyksIHsgYXR0cmlidXRlczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzcGFuT3B0aW9ucy5hdHRyaWJ1dGVzKSwgeyBcImF6Lm5hbWVzcGFjZVwiOiBhcmdzLm5hbWVzcGFjZSB9KSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdUcmFjaW5nT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdHJhY2luZ09wdGlvbnMpLCB7IHNwYW5PcHRpb25zOiBuZXdTcGFuT3B0aW9ucywgdHJhY2luZ0NvbnRleHQ6IHNldFNwYW4odHJhY2luZ09wdGlvbnMudHJhY2luZ0NvbnRleHQgfHwgb3RDb250ZXh0LmFjdGl2ZSgpLCBzcGFuKSB9KTtcbiAgICAgICAgY29uc3QgbmV3T3BlcmF0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3BlcmF0aW9uT3B0aW9ucyksIHsgdHJhY2luZ09wdGlvbnM6IG5ld1RyYWNpbmdPcHRpb25zIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3BhbixcbiAgICAgICAgICAgIHVwZGF0ZWRPcHRpb25zOiBuZXdPcGVyYXRpb25PcHRpb25zXG4gICAgICAgIH07XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNyZWF0ZVNwYW4uanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5jb25zdCBWRVJTSU9OID0gXCIwMFwiO1xuLyoqXG4gKiBHZW5lcmF0ZXMgYSBgU3BhbkNvbnRleHRgIGdpdmVuIGEgYHRyYWNlcGFyZW50YCBoZWFkZXIgdmFsdWUuXG4gKiBAcGFyYW0gdHJhY2VQYXJlbnQgLSBTZXJpYWxpemVkIHNwYW4gY29udGV4dCBkYXRhIGFzIGEgYHRyYWNlcGFyZW50YCBoZWFkZXIgdmFsdWUuXG4gKiBAcmV0dXJucyBUaGUgYFNwYW5Db250ZXh0YCBnZW5lcmF0ZWQgZnJvbSB0aGUgYHRyYWNlcGFyZW50YCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RTcGFuQ29udGV4dEZyb21UcmFjZVBhcmVudEhlYWRlcih0cmFjZVBhcmVudEhlYWRlcikge1xuICAgIGNvbnN0IHBhcnRzID0gdHJhY2VQYXJlbnRIZWFkZXIuc3BsaXQoXCItXCIpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbdmVyc2lvbiwgdHJhY2VJZCwgc3BhbklkLCB0cmFjZU9wdGlvbnNdID0gcGFydHM7XG4gICAgaWYgKHZlcnNpb24gIT09IFZFUlNJT04pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0cmFjZUZsYWdzID0gcGFyc2VJbnQodHJhY2VPcHRpb25zLCAxNik7XG4gICAgY29uc3Qgc3BhbkNvbnRleHQgPSB7XG4gICAgICAgIHNwYW5JZCxcbiAgICAgICAgdHJhY2VJZCxcbiAgICAgICAgdHJhY2VGbGFnc1xuICAgIH07XG4gICAgcmV0dXJuIHNwYW5Db250ZXh0O1xufVxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBgdHJhY2VwYXJlbnRgIHZhbHVlIGdpdmVuIGEgc3BhbiBjb250ZXh0LlxuICogQHBhcmFtIHNwYW5Db250ZXh0IC0gQ29udGFpbnMgY29udGV4dCBmb3IgYSBzcGVjaWZpYyBzcGFuLlxuICogQHJldHVybnMgVGhlIGBzcGFuQ29udGV4dGAgcmVwcmVzZW50ZWQgYXMgYSBgdHJhY2VwYXJlbnRgIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhY2VQYXJlbnRIZWFkZXIoc3BhbkNvbnRleHQpIHtcbiAgICBjb25zdCBtaXNzaW5nRmllbGRzID0gW107XG4gICAgaWYgKCFzcGFuQ29udGV4dC50cmFjZUlkKSB7XG4gICAgICAgIG1pc3NpbmdGaWVsZHMucHVzaChcInRyYWNlSWRcIik7XG4gICAgfVxuICAgIGlmICghc3BhbkNvbnRleHQuc3BhbklkKSB7XG4gICAgICAgIG1pc3NpbmdGaWVsZHMucHVzaChcInNwYW5JZFwiKTtcbiAgICB9XG4gICAgaWYgKG1pc3NpbmdGaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZmxhZ3MgPSBzcGFuQ29udGV4dC50cmFjZUZsYWdzIHx8IDAgLyogTk9ORSAqLztcbiAgICBjb25zdCBoZXhGbGFncyA9IGZsYWdzLnRvU3RyaW5nKDE2KTtcbiAgICBjb25zdCB0cmFjZUZsYWdzID0gaGV4RmxhZ3MubGVuZ3RoID09PSAxID8gYDAke2hleEZsYWdzfWAgOiBoZXhGbGFncztcbiAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvdHJhY2UtY29udGV4dC8jdHJhY2VwYXJlbnQtaGVhZGVyLWZpZWxkLXZhbHVlc1xuICAgIHJldHVybiBgJHtWRVJTSU9OfS0ke3NwYW5Db250ZXh0LnRyYWNlSWR9LSR7c3BhbkNvbnRleHQuc3BhbklkfS0ke3RyYWNlRmxhZ3N9YDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyYWNlUGFyZW50SGVhZGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgRU9MIH0gZnJvbSBcIm9zXCI7XG5pbXBvcnQgdXRpbCBmcm9tIFwidXRpbFwiO1xuZXhwb3J0IGZ1bmN0aW9uIGxvZyhtZXNzYWdlLCAuLi5hcmdzKSB7XG4gICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYCR7dXRpbC5mb3JtYXQobWVzc2FnZSwgLi4uYXJncyl9JHtFT0x9YCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2cuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiLi9sb2dcIjtcbmNvbnN0IGRlYnVnRW52VmFyaWFibGUgPSAodHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnYgJiYgcHJvY2Vzcy5lbnYuREVCVUcpIHx8IHVuZGVmaW5lZDtcbmxldCBlbmFibGVkU3RyaW5nO1xubGV0IGVuYWJsZWROYW1lc3BhY2VzID0gW107XG5sZXQgc2tpcHBlZE5hbWVzcGFjZXMgPSBbXTtcbmNvbnN0IGRlYnVnZ2VycyA9IFtdO1xuaWYgKGRlYnVnRW52VmFyaWFibGUpIHtcbiAgICBlbmFibGUoZGVidWdFbnZWYXJpYWJsZSk7XG59XG5jb25zdCBkZWJ1Z09iaiA9IE9iamVjdC5hc3NpZ24oKG5hbWVzcGFjZSkgPT4ge1xuICAgIHJldHVybiBjcmVhdGVEZWJ1Z2dlcihuYW1lc3BhY2UpO1xufSwge1xuICAgIGVuYWJsZSxcbiAgICBlbmFibGVkLFxuICAgIGRpc2FibGUsXG4gICAgbG9nLFxufSk7XG5mdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuICAgIGVuYWJsZWRTdHJpbmcgPSBuYW1lc3BhY2VzO1xuICAgIGVuYWJsZWROYW1lc3BhY2VzID0gW107XG4gICAgc2tpcHBlZE5hbWVzcGFjZXMgPSBbXTtcbiAgICBjb25zdCB3aWxkY2FyZCA9IC9cXCovZztcbiAgICBjb25zdCBuYW1lc3BhY2VMaXN0ID0gbmFtZXNwYWNlcy5zcGxpdChcIixcIikubWFwKChucykgPT4gbnMudHJpbSgpLnJlcGxhY2Uod2lsZGNhcmQsIFwiLio/XCIpKTtcbiAgICBmb3IgKGNvbnN0IG5zIG9mIG5hbWVzcGFjZUxpc3QpIHtcbiAgICAgICAgaWYgKG5zLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgICBza2lwcGVkTmFtZXNwYWNlcy5wdXNoKG5ldyBSZWdFeHAoYF4ke25zLnN1YnN0cigxKX0kYCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZW5hYmxlZE5hbWVzcGFjZXMucHVzaChuZXcgUmVnRXhwKGBeJHtuc30kYCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgaW5zdGFuY2Ugb2YgZGVidWdnZXJzKSB7XG4gICAgICAgIGluc3RhbmNlLmVuYWJsZWQgPSBlbmFibGVkKGluc3RhbmNlLm5hbWVzcGFjZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gZW5hYmxlZChuYW1lc3BhY2UpIHtcbiAgICBpZiAobmFtZXNwYWNlLmVuZHNXaXRoKFwiKlwiKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBza2lwcGVkIG9mIHNraXBwZWROYW1lc3BhY2VzKSB7XG4gICAgICAgIGlmIChza2lwcGVkLnRlc3QobmFtZXNwYWNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgZW5hYmxlZE5hbWVzcGFjZSBvZiBlbmFibGVkTmFtZXNwYWNlcykge1xuICAgICAgICBpZiAoZW5hYmxlZE5hbWVzcGFjZS50ZXN0KG5hbWVzcGFjZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gZW5hYmxlZFN0cmluZyB8fCBcIlwiO1xuICAgIGVuYWJsZShcIlwiKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY3JlYXRlRGVidWdnZXIobmFtZXNwYWNlKSB7XG4gICAgY29uc3QgbmV3RGVidWdnZXIgPSBPYmplY3QuYXNzaWduKGRlYnVnLCB7XG4gICAgICAgIGVuYWJsZWQ6IGVuYWJsZWQobmFtZXNwYWNlKSxcbiAgICAgICAgZGVzdHJveSxcbiAgICAgICAgbG9nOiBkZWJ1Z09iai5sb2csXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgZXh0ZW5kLFxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGRlYnVnKC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKCFuZXdEZWJ1Z2dlci5lbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYXJnc1swXSA9IGAke25hbWVzcGFjZX0gJHthcmdzWzBdfWA7XG4gICAgICAgIH1cbiAgICAgICAgbmV3RGVidWdnZXIubG9nKC4uLmFyZ3MpO1xuICAgIH1cbiAgICBkZWJ1Z2dlcnMucHVzaChuZXdEZWJ1Z2dlcik7XG4gICAgcmV0dXJuIG5ld0RlYnVnZ2VyO1xufVxuZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICBjb25zdCBpbmRleCA9IGRlYnVnZ2Vycy5pbmRleE9mKHRoaXMpO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIGRlYnVnZ2Vycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZXh0ZW5kKG5hbWVzcGFjZSkge1xuICAgIGNvbnN0IG5ld0RlYnVnZ2VyID0gY3JlYXRlRGVidWdnZXIoYCR7dGhpcy5uYW1lc3BhY2V9OiR7bmFtZXNwYWNlfWApO1xuICAgIG5ld0RlYnVnZ2VyLmxvZyA9IHRoaXMubG9nO1xuICAgIHJldHVybiBuZXdEZWJ1Z2dlcjtcbn1cbmV4cG9ydCBkZWZhdWx0IGRlYnVnT2JqO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVidWcuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgZGVidWcgZnJvbSBcIi4vZGVidWdcIjtcbmNvbnN0IHJlZ2lzdGVyZWRMb2dnZXJzID0gbmV3IFNldCgpO1xuY29uc3QgbG9nTGV2ZWxGcm9tRW52ID0gKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52LkFaVVJFX0xPR19MRVZFTCkgfHwgdW5kZWZpbmVkO1xubGV0IGF6dXJlTG9nTGV2ZWw7XG4vKipcbiAqIFRoZSBBenVyZUxvZ2dlciBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3Igb3ZlcnJpZGluZyB3aGVyZSBsb2dzIGFyZSBvdXRwdXQgdG8uXG4gKiBCeSBkZWZhdWx0LCBsb2dzIGFyZSBzZW50IHRvIHN0ZGVyci5cbiAqIE92ZXJyaWRlIHRoZSBgbG9nYCBtZXRob2QgdG8gcmVkaXJlY3QgbG9ncyB0byBhbm90aGVyIGxvY2F0aW9uLlxuICovXG5leHBvcnQgY29uc3QgQXp1cmVMb2dnZXIgPSBkZWJ1ZyhcImF6dXJlXCIpO1xuQXp1cmVMb2dnZXIubG9nID0gKC4uLmFyZ3MpID0+IHtcbiAgICBkZWJ1Zy5sb2coLi4uYXJncyk7XG59O1xuY29uc3QgQVpVUkVfTE9HX0xFVkVMUyA9IFtcInZlcmJvc2VcIiwgXCJpbmZvXCIsIFwid2FybmluZ1wiLCBcImVycm9yXCJdO1xuaWYgKGxvZ0xldmVsRnJvbUVudikge1xuICAgIC8vIGF2b2lkIGNhbGxpbmcgc2V0TG9nTGV2ZWwgYmVjYXVzZSB3ZSBkb24ndCB3YW50IGEgbWlzLXNldCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBjcmFzaFxuICAgIGlmIChpc0F6dXJlTG9nTGV2ZWwobG9nTGV2ZWxGcm9tRW52KSkge1xuICAgICAgICBzZXRMb2dMZXZlbChsb2dMZXZlbEZyb21FbnYpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQVpVUkVfTE9HX0xFVkVMIHNldCB0byB1bmtub3duIGxvZyBsZXZlbCAnJHtsb2dMZXZlbEZyb21FbnZ9JzsgbG9nZ2luZyBpcyBub3QgZW5hYmxlZC4gQWNjZXB0YWJsZSB2YWx1ZXM6ICR7QVpVUkVfTE9HX0xFVkVMUy5qb2luKFwiLCBcIil9LmApO1xuICAgIH1cbn1cbi8qKlxuICogSW1tZWRpYXRlbHkgZW5hYmxlcyBsb2dnaW5nIGF0IHRoZSBzcGVjaWZpZWQgbG9nIGxldmVsLiBJZiBubyBsZXZlbCBpcyBzcGVjaWZpZWQsIGxvZ2dpbmcgaXMgZGlzYWJsZWQuXG4gKiBAcGFyYW0gbGV2ZWwgLSBUaGUgbG9nIGxldmVsIHRvIGVuYWJsZSBmb3IgbG9nZ2luZy5cbiAqIE9wdGlvbnMgZnJvbSBtb3N0IHZlcmJvc2UgdG8gbGVhc3QgdmVyYm9zZSBhcmU6XG4gKiAtIHZlcmJvc2VcbiAqIC0gaW5mb1xuICogLSB3YXJuaW5nXG4gKiAtIGVycm9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRMb2dMZXZlbChsZXZlbCkge1xuICAgIGlmIChsZXZlbCAmJiAhaXNBenVyZUxvZ0xldmVsKGxldmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbG9nIGxldmVsICcke2xldmVsfScuIEFjY2VwdGFibGUgdmFsdWVzOiAke0FaVVJFX0xPR19MRVZFTFMuam9pbihcIixcIil9YCk7XG4gICAgfVxuICAgIGF6dXJlTG9nTGV2ZWwgPSBsZXZlbDtcbiAgICBjb25zdCBlbmFibGVkTmFtZXNwYWNlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgbG9nZ2VyIG9mIHJlZ2lzdGVyZWRMb2dnZXJzKSB7XG4gICAgICAgIGlmIChzaG91bGRFbmFibGUobG9nZ2VyKSkge1xuICAgICAgICAgICAgZW5hYmxlZE5hbWVzcGFjZXMucHVzaChsb2dnZXIubmFtZXNwYWNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWJ1Zy5lbmFibGUoZW5hYmxlZE5hbWVzcGFjZXMuam9pbihcIixcIikpO1xufVxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnRseSBzcGVjaWZpZWQgbG9nIGxldmVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9nTGV2ZWwoKSB7XG4gICAgcmV0dXJuIGF6dXJlTG9nTGV2ZWw7XG59XG5jb25zdCBsZXZlbE1hcCA9IHtcbiAgICB2ZXJib3NlOiA0MDAsXG4gICAgaW5mbzogMzAwLFxuICAgIHdhcm5pbmc6IDIwMCxcbiAgICBlcnJvcjogMTAwLFxufTtcbi8qKlxuICogQ3JlYXRlcyBhIGxvZ2dlciBmb3IgdXNlIGJ5IHRoZSBBenVyZSBTREtzIHRoYXQgaW5oZXJpdHMgZnJvbSBgQXp1cmVMb2dnZXJgLlxuICogQHBhcmFtIG5hbWVzcGFjZSAtIFRoZSBuYW1lIG9mIHRoZSBTREsgcGFja2FnZS5cbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNsaWVudExvZ2dlcihuYW1lc3BhY2UpIHtcbiAgICBjb25zdCBjbGllbnRSb290TG9nZ2VyID0gQXp1cmVMb2dnZXIuZXh0ZW5kKG5hbWVzcGFjZSk7XG4gICAgcGF0Y2hMb2dNZXRob2QoQXp1cmVMb2dnZXIsIGNsaWVudFJvb3RMb2dnZXIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yOiBjcmVhdGVMb2dnZXIoY2xpZW50Um9vdExvZ2dlciwgXCJlcnJvclwiKSxcbiAgICAgICAgd2FybmluZzogY3JlYXRlTG9nZ2VyKGNsaWVudFJvb3RMb2dnZXIsIFwid2FybmluZ1wiKSxcbiAgICAgICAgaW5mbzogY3JlYXRlTG9nZ2VyKGNsaWVudFJvb3RMb2dnZXIsIFwiaW5mb1wiKSxcbiAgICAgICAgdmVyYm9zZTogY3JlYXRlTG9nZ2VyKGNsaWVudFJvb3RMb2dnZXIsIFwidmVyYm9zZVwiKSxcbiAgICB9O1xufVxuZnVuY3Rpb24gcGF0Y2hMb2dNZXRob2QocGFyZW50LCBjaGlsZCkge1xuICAgIGNoaWxkLmxvZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIHBhcmVudC5sb2coLi4uYXJncyk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUxvZ2dlcihwYXJlbnQsIGxldmVsKSB7XG4gICAgY29uc3QgbG9nZ2VyID0gT2JqZWN0LmFzc2lnbihwYXJlbnQuZXh0ZW5kKGxldmVsKSwge1xuICAgICAgICBsZXZlbCxcbiAgICB9KTtcbiAgICBwYXRjaExvZ01ldGhvZChwYXJlbnQsIGxvZ2dlcik7XG4gICAgaWYgKHNob3VsZEVuYWJsZShsb2dnZXIpKSB7XG4gICAgICAgIGNvbnN0IGVuYWJsZWROYW1lc3BhY2VzID0gZGVidWcuZGlzYWJsZSgpO1xuICAgICAgICBkZWJ1Zy5lbmFibGUoZW5hYmxlZE5hbWVzcGFjZXMgKyBcIixcIiArIGxvZ2dlci5uYW1lc3BhY2UpO1xuICAgIH1cbiAgICByZWdpc3RlcmVkTG9nZ2Vycy5hZGQobG9nZ2VyKTtcbiAgICByZXR1cm4gbG9nZ2VyO1xufVxuZnVuY3Rpb24gc2hvdWxkRW5hYmxlKGxvZ2dlcikge1xuICAgIHJldHVybiBCb29sZWFuKGF6dXJlTG9nTGV2ZWwgJiYgbGV2ZWxNYXBbbG9nZ2VyLmxldmVsXSA8PSBsZXZlbE1hcFthenVyZUxvZ0xldmVsXSk7XG59XG5mdW5jdGlvbiBpc0F6dXJlTG9nTGV2ZWwobG9nTGV2ZWwpIHtcbiAgICByZXR1cm4gQVpVUkVfTE9HX0xFVkVMUy5pbmNsdWRlcyhsb2dMZXZlbCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IGNyZWF0ZUNsaWVudExvZ2dlciB9IGZyb20gXCJAYXp1cmUvbG9nZ2VyXCI7XG5leHBvcnQgY29uc3QgbG9nZ2VyID0gY3JlYXRlQ2xpZW50TG9nZ2VyKFwiY29yZS1odHRwXCIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9nLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgQmFzZVJlcXVlc3RQb2xpY3ksIH0gZnJvbSBcIi4vcmVxdWVzdFBvbGljeVwiO1xuaW1wb3J0IHsgU3BhbktpbmQsIFNwYW5TdGF0dXNDb2RlLCBjcmVhdGVTcGFuRnVuY3Rpb24sIGdldFRyYWNlUGFyZW50SGVhZGVyLCBpc1NwYW5Db250ZXh0VmFsaWQsIH0gZnJvbSBcIkBhenVyZS9jb3JlLXRyYWNpbmdcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuLi9sb2dcIjtcbmNvbnN0IGNyZWF0ZVNwYW4gPSBjcmVhdGVTcGFuRnVuY3Rpb24oe1xuICAgIHBhY2thZ2VQcmVmaXg6IFwiXCIsXG4gICAgbmFtZXNwYWNlOiBcIlwiLFxufSk7XG4vKipcbiAqIENyZWF0ZXMgYSBwb2xpY3kgdGhhdCB3cmFwcyBvdXRnb2luZyByZXF1ZXN0cyB3aXRoIGEgdHJhY2luZyBzcGFuLlxuICogQHBhcmFtIHRyYWNpbmdPcHRpb25zIC0gVHJhY2luZyBvcHRpb25zLlxuICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIHtAbGluayBUcmFjaW5nUG9saWN5fSBjbGFzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYWNpbmdQb2xpY3kodHJhY2luZ09wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNyZWF0ZShuZXh0UG9saWN5LCBvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRyYWNpbmdQb2xpY3kobmV4dFBvbGljeSwgb3B0aW9ucywgdHJhY2luZ09wdGlvbnMpO1xuICAgICAgICB9LFxuICAgIH07XG59XG4vKipcbiAqIEEgcG9saWN5IHRoYXQgd3JhcHMgb3V0Z29pbmcgcmVxdWVzdHMgd2l0aCBhIHRyYWNpbmcgc3Bhbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFRyYWNpbmdQb2xpY3kgZXh0ZW5kcyBCYXNlUmVxdWVzdFBvbGljeSB7XG4gICAgY29uc3RydWN0b3IobmV4dFBvbGljeSwgb3B0aW9ucywgdHJhY2luZ09wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIobmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMudXNlckFnZW50ID0gdHJhY2luZ09wdGlvbnMudXNlckFnZW50O1xuICAgIH1cbiAgICBhc3luYyBzZW5kUmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgICAgIGlmICghcmVxdWVzdC50cmFjaW5nQ29udGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25leHRQb2xpY3kuc2VuZFJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3BhbiA9IHRoaXMudHJ5Q3JlYXRlU3BhbihyZXF1ZXN0KTtcbiAgICAgICAgaWYgKCFzcGFuKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbmV4dFBvbGljeS5zZW5kUmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9uZXh0UG9saWN5LnNlbmRSZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICAgICAgdGhpcy50cnlQcm9jZXNzUmVzcG9uc2Uoc3BhbiwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMudHJ5UHJvY2Vzc0Vycm9yKHNwYW4sIGVycik7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdHJ5Q3JlYXRlU3BhbihyZXF1ZXN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFBhc3Npbmcgc3Bhbk9wdGlvbnMgYXMgcGFydCBvZiB0cmFjaW5nT3B0aW9ucyB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IEBhenVyZS9jb3JlLXRyYWNpbmdAcHJldmlldy4xMyBhbmQgZWFybGllci5cbiAgICAgICAgICAgIC8vIFdlIGNhbiBwYXNzIHRoaXMgYXMgYSBzZXBhcmF0ZSBwYXJhbWV0ZXIgb25jZSB3ZSB1cGdyYWRlIHRvIHRoZSBsYXRlc3QgY29yZS10cmFjaW5nLlxuICAgICAgICAgICAgY29uc3QgeyBzcGFuIH0gPSBjcmVhdGVTcGFuKGBIVFRQICR7cmVxdWVzdC5tZXRob2R9YCwge1xuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIHNwYW5PcHRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlcXVlc3Quc3Bhbk9wdGlvbnMpLCB7IGtpbmQ6IFNwYW5LaW5kLkNMSUVOVCB9KSxcbiAgICAgICAgICAgICAgICAgICAgdHJhY2luZ0NvbnRleHQ6IHJlcXVlc3QudHJhY2luZ0NvbnRleHQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gSWYgdGhlIHNwYW4gaXMgbm90IHJlY29yZGluZywgZG9uJ3QgZG8gYW55IG1vcmUgd29yay5cbiAgICAgICAgICAgIGlmICghc3Bhbi5pc1JlY29yZGluZygpKSB7XG4gICAgICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmFtZXNwYWNlRnJvbUNvbnRleHQgPSAoX2EgPSByZXF1ZXN0LnRyYWNpbmdDb250ZXh0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0VmFsdWUoU3ltYm9sLmZvcihcImF6Lm5hbWVzcGFjZVwiKSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5hbWVzcGFjZUZyb21Db250ZXh0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoXCJhei5uYW1lc3BhY2VcIiwgbmFtZXNwYWNlRnJvbUNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICBcImh0dHAubWV0aG9kXCI6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgICAgICAgIFwiaHR0cC51cmxcIjogcmVxdWVzdC51cmwsXG4gICAgICAgICAgICAgICAgcmVxdWVzdElkOiByZXF1ZXN0LnJlcXVlc3RJZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRoaXMudXNlckFnZW50KSB7XG4gICAgICAgICAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoXCJodHRwLnVzZXJfYWdlbnRcIiwgdGhpcy51c2VyQWdlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gc2V0IGhlYWRlcnNcbiAgICAgICAgICAgIGNvbnN0IHNwYW5Db250ZXh0ID0gc3Bhbi5zcGFuQ29udGV4dCgpO1xuICAgICAgICAgICAgY29uc3QgdHJhY2VQYXJlbnRIZWFkZXIgPSBnZXRUcmFjZVBhcmVudEhlYWRlcihzcGFuQ29udGV4dCk7XG4gICAgICAgICAgICBpZiAodHJhY2VQYXJlbnRIZWFkZXIgJiYgaXNTcGFuQ29udGV4dFZhbGlkKHNwYW5Db250ZXh0KSkge1xuICAgICAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVycy5zZXQoXCJ0cmFjZXBhcmVudFwiLCB0cmFjZVBhcmVudEhlYWRlcik7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhY2VTdGF0ZSA9IHNwYW5Db250ZXh0LnRyYWNlU3RhdGUgJiYgc3BhbkNvbnRleHQudHJhY2VTdGF0ZS5zZXJpYWxpemUoKTtcbiAgICAgICAgICAgICAgICAvLyBpZiB0cmFjZXN0YXRlIGlzIHNldCwgdHJhY2VwYXJlbnQgTVVTVCBiZSBzZXQsIHNvIG9ubHkgc2V0IHRyYWNlc3RhdGUgYWZ0ZXIgdHJhY2VwYXJlbnRcbiAgICAgICAgICAgICAgICBpZiAodHJhY2VTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KFwidHJhY2VzdGF0ZVwiLCB0cmFjZVN0YXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3BhbjtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKGBTa2lwcGluZyBjcmVhdGluZyBhIHRyYWNpbmcgc3BhbiBkdWUgdG8gYW4gZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdHJ5UHJvY2Vzc0Vycm9yKHNwYW4sIGVycikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZXJyLnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZShcImh0dHAuc3RhdHVzX2NvZGVcIiwgZXJyLnN0YXR1c0NvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKGBTa2lwcGluZyB0cmFjaW5nIHNwYW4gcHJvY2Vzc2luZyBkdWUgdG8gYW4gZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0cnlQcm9jZXNzUmVzcG9uc2Uoc3BhbiwgcmVzcG9uc2UpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKFwiaHR0cC5zdGF0dXNfY29kZVwiLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgY29uc3Qgc2VydmljZVJlcXVlc3RJZCA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwieC1tcy1yZXF1ZXN0LWlkXCIpO1xuICAgICAgICAgICAgaWYgKHNlcnZpY2VSZXF1ZXN0SWQpIHtcbiAgICAgICAgICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZShcInNlcnZpY2VSZXF1ZXN0SWRcIiwgc2VydmljZVJlcXVlc3RJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuT0ssXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybmluZyhgU2tpcHBpbmcgdHJhY2luZyBzcGFuIHByb2Nlc3NpbmcgZHVlIHRvIGFuIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFjaW5nUG9saWN5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgQmFzZVJlcXVlc3RQb2xpY3ksIH0gZnJvbSBcIi4vcmVxdWVzdFBvbGljeVwiO1xuLyoqXG4gKiBCeSBkZWZhdWx0LCBIVFRQIGNvbm5lY3Rpb25zIGFyZSBtYWludGFpbmVkIGZvciBmdXR1cmUgcmVxdWVzdHMuXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0S2VlcEFsaXZlT3B0aW9ucyA9IHtcbiAgICBlbmFibGU6IHRydWUsXG59O1xuLyoqXG4gKiBDcmVhdGVzIGEgcG9saWN5IHRoYXQgY29udHJvbHMgd2hldGhlciBIVFRQIGNvbm5lY3Rpb25zIGFyZSBtYWludGFpbmVkIG9uIGZ1dHVyZSByZXF1ZXN0cy5cbiAqIEBwYXJhbSBrZWVwQWxpdmVPcHRpb25zIC0gS2VlcCBhbGl2ZSBvcHRpb25zLiBCeSBkZWZhdWx0LCBIVFRQIGNvbm5lY3Rpb25zIGFyZSBtYWludGFpbmVkIGZvciBmdXR1cmUgcmVxdWVzdHMuXG4gKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUge0BsaW5rIEtlZXBBbGl2ZVBvbGljeX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGtlZXBBbGl2ZVBvbGljeShrZWVwQWxpdmVPcHRpb25zKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlOiAobmV4dFBvbGljeSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBLZWVwQWxpdmVQb2xpY3kobmV4dFBvbGljeSwgb3B0aW9ucywga2VlcEFsaXZlT3B0aW9ucyB8fCBEZWZhdWx0S2VlcEFsaXZlT3B0aW9ucyk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8qKlxuICogS2VlcEFsaXZlUG9saWN5IGlzIGEgcG9saWN5IHVzZWQgdG8gY29udHJvbCBrZWVwIGFsaXZlIHNldHRpbmdzIGZvciBldmVyeSByZXF1ZXN0LlxuICovXG5leHBvcnQgY2xhc3MgS2VlcEFsaXZlUG9saWN5IGV4dGVuZHMgQmFzZVJlcXVlc3RQb2xpY3kge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgS2VlcEFsaXZlUG9saWN5LlxuICAgICAqXG4gICAgICogQHBhcmFtIG5leHRQb2xpY3kgLVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKiBAcGFyYW0ga2VlcEFsaXZlT3B0aW9ucyAtXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobmV4dFBvbGljeSwgb3B0aW9ucywga2VlcEFsaXZlT3B0aW9ucykge1xuICAgICAgICBzdXBlcihuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5rZWVwQWxpdmVPcHRpb25zID0ga2VlcEFsaXZlT3B0aW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgb3V0IHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCAtXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBhc3luYyBzZW5kUmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgICAgIHJlcXVlc3Qua2VlcEFsaXZlID0gdGhpcy5rZWVwQWxpdmVPcHRpb25zLmVuYWJsZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25leHRQb2xpY3kuc2VuZFJlcXVlc3QocmVxdWVzdCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9a2VlcEFsaXZlUG9saWN5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgQmFzZVJlcXVlc3RQb2xpY3ksIH0gZnJvbSBcIi4vcmVxdWVzdFBvbGljeVwiO1xuLyoqXG4gKiBDcmVhdGVzIGEgcG9saWN5IHRoYXQgYXNzaWducyBhIHVuaXF1ZSByZXF1ZXN0IGlkIHRvIG91dGdvaW5nIHJlcXVlc3RzLlxuICogQHBhcmFtIHJlcXVlc3RJZEhlYWRlck5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgaGVhZGVyIHRvIHVzZSB3aGVuIGFzc2lnbmluZyB0aGUgdW5pcXVlIGlkIHRvIHRoZSByZXF1ZXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVDbGllbnRSZXF1ZXN0SWRQb2xpY3kocmVxdWVzdElkSGVhZGVyTmFtZSA9IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlOiAobmV4dFBvbGljeSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmF0ZUNsaWVudFJlcXVlc3RJZFBvbGljeShuZXh0UG9saWN5LCBvcHRpb25zLCByZXF1ZXN0SWRIZWFkZXJOYW1lKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuZXhwb3J0IGNsYXNzIEdlbmVyYXRlQ2xpZW50UmVxdWVzdElkUG9saWN5IGV4dGVuZHMgQmFzZVJlcXVlc3RQb2xpY3kge1xuICAgIGNvbnN0cnVjdG9yKG5leHRQb2xpY3ksIG9wdGlvbnMsIF9yZXF1ZXN0SWRIZWFkZXJOYW1lKSB7XG4gICAgICAgIHN1cGVyKG5leHRQb2xpY3ksIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLl9yZXF1ZXN0SWRIZWFkZXJOYW1lID0gX3JlcXVlc3RJZEhlYWRlck5hbWU7XG4gICAgfVxuICAgIHNlbmRSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0LmhlYWRlcnMuY29udGFpbnModGhpcy5fcmVxdWVzdElkSGVhZGVyTmFtZSkpIHtcbiAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVycy5zZXQodGhpcy5fcmVxdWVzdElkSGVhZGVyTmFtZSwgcmVxdWVzdC5yZXF1ZXN0SWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9uZXh0UG9saWN5LnNlbmRSZXF1ZXN0KHJlcXVlc3QpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdlbmVyYXRlQ2xpZW50UmVxdWVzdElkUG9saWN5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0ICogYXMgeG1sMmpzIGZyb20gXCJ4bWwyanNcIjtcbmltcG9ydCB7IFhNTF9BVFRSS0VZLCBYTUxfQ0hBUktFWSB9IGZyb20gXCIuL3NlcmlhbGl6ZXIuY29tbW9uXCI7XG4vLyBOb3RlOiBUaGUgcmVhc29uIHdlIHJlLWRlZmluZSBhbGwgb2YgdGhlIHhtbDJqcyBkZWZhdWx0IHNldHRpbmdzICh2ZXJzaW9uIDIuMCkgaGVyZSBpcyBiZWNhdXNlIHRoZSBkZWZhdWx0IHNldHRpbmdzIG9iamVjdCBleHBvc2VkXG4vLyBieSB0aGUgeG0yanMgbGlicmFyeSBpcyBtdXRhYmxlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0xlb25pZGFzLWZyb20tWElWL25vZGUteG1sMmpzL2lzc3Vlcy81MzZcbi8vIEJ5IGNyZWF0aW5nIGEgbmV3IGNvcHkgb2YgdGhlIHNldHRpbmdzIGVhY2ggdGltZSB3ZSBpbnN0YW50aWF0ZSB0aGUgcGFyc2VyLFxuLy8gd2UgYXJlIHNhZmVndWFyZGluZyBhZ2FpbnN0IHRoZSBwb3NzaWJpbGl0eSBvZiB0aGUgZGVmYXVsdCBzZXR0aW5ncyBiZWluZyBtdXRhdGVkIGVsc2V3aGVyZSB1bmludGVudGlvbmFsbHkuXG5jb25zdCB4bWwyanNEZWZhdWx0T3B0aW9uc1YyID0ge1xuICAgIGV4cGxpY2l0Q2hhcmtleTogZmFsc2UsXG4gICAgdHJpbTogZmFsc2UsXG4gICAgbm9ybWFsaXplOiBmYWxzZSxcbiAgICBub3JtYWxpemVUYWdzOiBmYWxzZSxcbiAgICBhdHRya2V5OiBYTUxfQVRUUktFWSxcbiAgICBleHBsaWNpdEFycmF5OiB0cnVlLFxuICAgIGlnbm9yZUF0dHJzOiBmYWxzZSxcbiAgICBtZXJnZUF0dHJzOiBmYWxzZSxcbiAgICBleHBsaWNpdFJvb3Q6IHRydWUsXG4gICAgdmFsaWRhdG9yOiB1bmRlZmluZWQsXG4gICAgeG1sbnM6IGZhbHNlLFxuICAgIGV4cGxpY2l0Q2hpbGRyZW46IGZhbHNlLFxuICAgIHByZXNlcnZlQ2hpbGRyZW5PcmRlcjogZmFsc2UsXG4gICAgY2hpbGRrZXk6IFwiJCRcIixcbiAgICBjaGFyc0FzQ2hpbGRyZW46IGZhbHNlLFxuICAgIGluY2x1ZGVXaGl0ZUNoYXJzOiBmYWxzZSxcbiAgICBhc3luYzogZmFsc2UsXG4gICAgc3RyaWN0OiB0cnVlLFxuICAgIGF0dHJOYW1lUHJvY2Vzc29yczogdW5kZWZpbmVkLFxuICAgIGF0dHJWYWx1ZVByb2Nlc3NvcnM6IHVuZGVmaW5lZCxcbiAgICB0YWdOYW1lUHJvY2Vzc29yczogdW5kZWZpbmVkLFxuICAgIHZhbHVlUHJvY2Vzc29yczogdW5kZWZpbmVkLFxuICAgIHJvb3ROYW1lOiBcInJvb3RcIixcbiAgICB4bWxkZWM6IHtcbiAgICAgICAgdmVyc2lvbjogXCIxLjBcIixcbiAgICAgICAgZW5jb2Rpbmc6IFwiVVRGLThcIixcbiAgICAgICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICB9LFxuICAgIGRvY3R5cGU6IHVuZGVmaW5lZCxcbiAgICByZW5kZXJPcHRzOiB7XG4gICAgICAgIHByZXR0eTogdHJ1ZSxcbiAgICAgICAgaW5kZW50OiBcIiAgXCIsXG4gICAgICAgIG5ld2xpbmU6IFwiXFxuXCIsXG4gICAgfSxcbiAgICBoZWFkbGVzczogZmFsc2UsXG4gICAgY2h1bmtTaXplOiAxMDAwMCxcbiAgICBlbXB0eVRhZzogXCJcIixcbiAgICBjZGF0YTogZmFsc2UsXG59O1xuLy8gVGhlIHhtbDJqcyBzZXR0aW5ncyBmb3IgZ2VuZXJhbCBYTUwgcGFyc2luZyBvcGVyYXRpb25zLlxuY29uc3QgeG1sMmpzUGFyc2VyU2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB4bWwyanNEZWZhdWx0T3B0aW9uc1YyKTtcbnhtbDJqc1BhcnNlclNldHRpbmdzLmV4cGxpY2l0QXJyYXkgPSBmYWxzZTtcbi8vIFRoZSB4bWwyanMgc2V0dGluZ3MgZm9yIGdlbmVyYWwgWE1MIGJ1aWxkaW5nIG9wZXJhdGlvbnMuXG5jb25zdCB4bWwyanNCdWlsZGVyU2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB4bWwyanNEZWZhdWx0T3B0aW9uc1YyKTtcbnhtbDJqc0J1aWxkZXJTZXR0aW5ncy5leHBsaWNpdEFycmF5ID0gZmFsc2U7XG54bWwyanNCdWlsZGVyU2V0dGluZ3MucmVuZGVyT3B0cyA9IHtcbiAgICBwcmV0dHk6IGZhbHNlLFxufTtcbi8qKlxuICogQ29udmVydHMgZ2l2ZW4gSlNPTiBvYmplY3QgdG8gWE1MIHN0cmluZ1xuICogQHBhcmFtIG9iaiAtIEpTT04gb2JqZWN0IHRvIGJlIGNvbnZlcnRlZCBpbnRvIFhNTCBzdHJpbmdcbiAqIEBwYXJhbSBvcHRzIC0gT3B0aW9ucyB0aGF0IGdvdmVybiB0aGUgcGFyc2luZyBvZiBnaXZlbiBKU09OIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5WE1MKG9iaiwgb3B0cyA9IHt9KSB7XG4gICAgdmFyIF9hO1xuICAgIHhtbDJqc0J1aWxkZXJTZXR0aW5ncy5yb290TmFtZSA9IG9wdHMucm9vdE5hbWU7XG4gICAgeG1sMmpzQnVpbGRlclNldHRpbmdzLmNoYXJrZXkgPSAoX2EgPSBvcHRzLnhtbENoYXJLZXkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFhNTF9DSEFSS0VZO1xuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoeG1sMmpzQnVpbGRlclNldHRpbmdzKTtcbiAgICByZXR1cm4gYnVpbGRlci5idWlsZE9iamVjdChvYmopO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBnaXZlbiBYTUwgc3RyaW5nIGludG8gSlNPTlxuICogQHBhcmFtIHN0ciAtIFN0cmluZyBjb250YWluaW5nIHRoZSBYTUwgY29udGVudCB0byBiZSBwYXJzZWQgaW50byBKU09OXG4gKiBAcGFyYW0gb3B0cyAtIE9wdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHBhcnNpbmcgb2YgZ2l2ZW4geG1sIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VYTUwoc3RyLCBvcHRzID0ge30pIHtcbiAgICB2YXIgX2E7XG4gICAgeG1sMmpzUGFyc2VyU2V0dGluZ3MuZXhwbGljaXRSb290ID0gISFvcHRzLmluY2x1ZGVSb290O1xuICAgIHhtbDJqc1BhcnNlclNldHRpbmdzLmNoYXJrZXkgPSAoX2EgPSBvcHRzLnhtbENoYXJLZXkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFhNTF9DSEFSS0VZO1xuICAgIGNvbnN0IHhtbFBhcnNlciA9IG5ldyB4bWwyanMuUGFyc2VyKHhtbDJqc1BhcnNlclNldHRpbmdzKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBpZiAoIXN0cikge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIkRvY3VtZW50IGlzIGVtcHR5XCIpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHhtbFBhcnNlci5wYXJzZVN0cmluZyhzdHIsIChlcnIsIHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXhtbC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEJhc2VSZXF1ZXN0UG9saWN5LCB9IGZyb20gXCIuL3JlcXVlc3RQb2xpY3lcIjtcbmltcG9ydCB7IFhNTF9DSEFSS0VZIH0gZnJvbSBcIi4uL3V0aWwvc2VyaWFsaXplci5jb21tb25cIjtcbmltcG9ydCB7IE1hcHBlclR5cGUgfSBmcm9tIFwiLi4vc2VyaWFsaXplclwiO1xuaW1wb3J0IHsgUmVzdEVycm9yIH0gZnJvbSBcIi4uL3Jlc3RFcnJvclwiO1xuaW1wb3J0IHsgcGFyc2VYTUwgfSBmcm9tIFwiLi4vdXRpbC94bWxcIjtcbi8qKlxuICogQ3JlYXRlIGEgbmV3IHNlcmlhbGl6YXRpb24gUmVxdWVzdFBvbGljeUNyZWF0b3IgdGhhdCB3aWxsIHNlcmlhbGl6ZWQgSFRUUCByZXF1ZXN0IGJvZGllcyBhcyB0aGV5XG4gKiBwYXNzIHRocm91Z2ggdGhlIEhUVFAgcGlwZWxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6YXRpb25Qb2xpY3koZGVzZXJpYWxpemF0aW9uQ29udGVudFR5cGVzLCBwYXJzaW5nT3B0aW9ucykge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNyZWF0ZTogKG5leHRQb2xpY3ksIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGVzZXJpYWxpemF0aW9uUG9saWN5KG5leHRQb2xpY3ksIG9wdGlvbnMsIGRlc2VyaWFsaXphdGlvbkNvbnRlbnRUeXBlcywgcGFyc2luZ09wdGlvbnMpO1xuICAgICAgICB9LFxuICAgIH07XG59XG5leHBvcnQgY29uc3QgZGVmYXVsdEpzb25Db250ZW50VHlwZXMgPSBbXCJhcHBsaWNhdGlvbi9qc29uXCIsIFwidGV4dC9qc29uXCJdO1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRYbWxDb250ZW50VHlwZXMgPSBbXCJhcHBsaWNhdGlvbi94bWxcIiwgXCJhcHBsaWNhdGlvbi9hdG9tK3htbFwiXTtcbmV4cG9ydCBjb25zdCBEZWZhdWx0RGVzZXJpYWxpemF0aW9uT3B0aW9ucyA9IHtcbiAgICBleHBlY3RlZENvbnRlbnRUeXBlczoge1xuICAgICAgICBqc29uOiBkZWZhdWx0SnNvbkNvbnRlbnRUeXBlcyxcbiAgICAgICAgeG1sOiBkZWZhdWx0WG1sQ29udGVudFR5cGVzLFxuICAgIH0sXG59O1xuLyoqXG4gKiBBIFJlcXVlc3RQb2xpY3kgdGhhdCB3aWxsIGRlc2VyaWFsaXplIEhUVFAgcmVzcG9uc2UgYm9kaWVzIGFuZCBoZWFkZXJzIGFzIHRoZXkgcGFzcyB0aHJvdWdoIHRoZVxuICogSFRUUCBwaXBlbGluZS5cbiAqL1xuZXhwb3J0IGNsYXNzIERlc2VyaWFsaXphdGlvblBvbGljeSBleHRlbmRzIEJhc2VSZXF1ZXN0UG9saWN5IHtcbiAgICBjb25zdHJ1Y3RvcihuZXh0UG9saWN5LCByZXF1ZXN0UG9saWN5T3B0aW9ucywgZGVzZXJpYWxpemF0aW9uQ29udGVudFR5cGVzLCBwYXJzaW5nT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgc3VwZXIobmV4dFBvbGljeSwgcmVxdWVzdFBvbGljeU9wdGlvbnMpO1xuICAgICAgICB0aGlzLmpzb25Db250ZW50VHlwZXMgPVxuICAgICAgICAgICAgKGRlc2VyaWFsaXphdGlvbkNvbnRlbnRUeXBlcyAmJiBkZXNlcmlhbGl6YXRpb25Db250ZW50VHlwZXMuanNvbikgfHwgZGVmYXVsdEpzb25Db250ZW50VHlwZXM7XG4gICAgICAgIHRoaXMueG1sQ29udGVudFR5cGVzID1cbiAgICAgICAgICAgIChkZXNlcmlhbGl6YXRpb25Db250ZW50VHlwZXMgJiYgZGVzZXJpYWxpemF0aW9uQ29udGVudFR5cGVzLnhtbCkgfHwgZGVmYXVsdFhtbENvbnRlbnRUeXBlcztcbiAgICAgICAgdGhpcy54bWxDaGFyS2V5ID0gKF9hID0gcGFyc2luZ09wdGlvbnMueG1sQ2hhcktleSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogWE1MX0NIQVJLRVk7XG4gICAgfVxuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25leHRQb2xpY3kuc2VuZFJlcXVlc3QocmVxdWVzdCkudGhlbigocmVzcG9uc2UpID0+IGRlc2VyaWFsaXplUmVzcG9uc2VCb2R5KHRoaXMuanNvbkNvbnRlbnRUeXBlcywgdGhpcy54bWxDb250ZW50VHlwZXMsIHJlc3BvbnNlLCB7XG4gICAgICAgICAgICB4bWxDaGFyS2V5OiB0aGlzLnhtbENoYXJLZXksXG4gICAgICAgIH0pKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRPcGVyYXRpb25SZXNwb25zZShwYXJzZWRSZXNwb25zZSkge1xuICAgIGxldCByZXN1bHQ7XG4gICAgY29uc3QgcmVxdWVzdCA9IHBhcnNlZFJlc3BvbnNlLnJlcXVlc3Q7XG4gICAgY29uc3Qgb3BlcmF0aW9uU3BlYyA9IHJlcXVlc3Qub3BlcmF0aW9uU3BlYztcbiAgICBpZiAob3BlcmF0aW9uU3BlYykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25SZXNwb25zZUdldHRlciA9IHJlcXVlc3Qub3BlcmF0aW9uUmVzcG9uc2VHZXR0ZXI7XG4gICAgICAgIGlmICghb3BlcmF0aW9uUmVzcG9uc2VHZXR0ZXIpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG9wZXJhdGlvblNwZWMucmVzcG9uc2VzW3BhcnNlZFJlc3BvbnNlLnN0YXR1c107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBvcGVyYXRpb25SZXNwb25zZUdldHRlcihvcGVyYXRpb25TcGVjLCBwYXJzZWRSZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHNob3VsZERlc2VyaWFsaXplUmVzcG9uc2UocGFyc2VkUmVzcG9uc2UpIHtcbiAgICBjb25zdCBzaG91bGREZXNlcmlhbGl6ZSA9IHBhcnNlZFJlc3BvbnNlLnJlcXVlc3Quc2hvdWxkRGVzZXJpYWxpemU7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAoc2hvdWxkRGVzZXJpYWxpemUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2Ygc2hvdWxkRGVzZXJpYWxpemUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIHJlc3VsdCA9IHNob3VsZERlc2VyaWFsaXplO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gc2hvdWxkRGVzZXJpYWxpemUocGFyc2VkUmVzcG9uc2UpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBHaXZlbiBhIHBhcnRpY3VsYXIgc2V0IG9mIGNvbnRlbnQgdHlwZXMgdG8gcGFyc2UgYXMgZWl0aGVyIEpTT04gb3IgWE1MLCBjb25zdW1lcyB0aGUgSFRUUCByZXNwb25zZSB0byBwcm9kdWNlIHRoZSByZXN1bHQgb2JqZWN0IGRlZmluZWQgYnkgdGhlIHJlcXVlc3QncyB7QGxpbmsgT3BlcmF0aW9uU3BlY30uXG4gKiBAcGFyYW0ganNvbkNvbnRlbnRUeXBlcyAtIFJlc3BvbnNlIGNvbnRlbnQgdHlwZXMgdG8gcGFyc2UgdGhlIGJvZHkgYXMgSlNPTi5cbiAqIEBwYXJhbSB4bWxDb250ZW50VHlwZXMgIC0gUmVzcG9uc2UgY29udGVudCB0eXBlcyB0byBwYXJzZSB0aGUgYm9keSBhcyBYTUwuXG4gKiBAcGFyYW0gcmVzcG9uc2UgLSBIVFRQIFJlc3BvbnNlIGZyb20gdGhlIHBpcGVsaW5lLlxuICogQHBhcmFtIG9wdGlvbnMgIC0gT3B0aW9ucyB0byB0aGUgc2VyaWFsaXplciwgbW9zdGx5IGZvciBjb25maWd1cmluZyB0aGUgWE1MIHBhcnNlciBpZiBuZWVkZWQuXG4gKiBAcmV0dXJucyBBIHBhcnNlZCB7QGxpbmsgSHR0cE9wZXJhdGlvblJlc3BvbnNlfSBvYmplY3QgdGhhdCBjYW4gYmUgcmV0dXJuZWQgYnkgdGhlIHtAbGluayBTZXJ2aWNlQ2xpZW50fS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplUmVzcG9uc2VCb2R5KGpzb25Db250ZW50VHlwZXMsIHhtbENvbnRlbnRUeXBlcywgcmVzcG9uc2UsIG9wdGlvbnMgPSB7fSkge1xuICAgIHZhciBfYSwgX2IsIF9jO1xuICAgIGNvbnN0IHVwZGF0ZWRPcHRpb25zID0ge1xuICAgICAgICByb290TmFtZTogKF9hID0gb3B0aW9ucy5yb290TmFtZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogXCJcIixcbiAgICAgICAgaW5jbHVkZVJvb3Q6IChfYiA9IG9wdGlvbnMuaW5jbHVkZVJvb3QpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGZhbHNlLFxuICAgICAgICB4bWxDaGFyS2V5OiAoX2MgPSBvcHRpb25zLnhtbENoYXJLZXkpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IFhNTF9DSEFSS0VZLFxuICAgIH07XG4gICAgcmV0dXJuIHBhcnNlKGpzb25Db250ZW50VHlwZXMsIHhtbENvbnRlbnRUeXBlcywgcmVzcG9uc2UsIHVwZGF0ZWRPcHRpb25zKS50aGVuKChwYXJzZWRSZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoIXNob3VsZERlc2VyaWFsaXplUmVzcG9uc2UocGFyc2VkUmVzcG9uc2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VkUmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uU3BlYyA9IHBhcnNlZFJlc3BvbnNlLnJlcXVlc3Qub3BlcmF0aW9uU3BlYztcbiAgICAgICAgaWYgKCFvcGVyYXRpb25TcGVjIHx8ICFvcGVyYXRpb25TcGVjLnJlc3BvbnNlcykge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlZFJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlU3BlYyA9IGdldE9wZXJhdGlvblJlc3BvbnNlKHBhcnNlZFJlc3BvbnNlKTtcbiAgICAgICAgY29uc3QgeyBlcnJvciwgc2hvdWxkUmV0dXJuUmVzcG9uc2UgfSA9IGhhbmRsZUVycm9yUmVzcG9uc2UocGFyc2VkUmVzcG9uc2UsIG9wZXJhdGlvblNwZWMsIHJlc3BvbnNlU3BlYyk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2hvdWxkUmV0dXJuUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZWRSZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbiBvcGVyYXRpb24gcmVzcG9uc2Ugc3BlYyBkb2VzIGV4aXN0IGZvciBjdXJyZW50IHN0YXR1cyBjb2RlLCBzb1xuICAgICAgICAvLyB1c2UgaXQgdG8gZGVzZXJpYWxpemUgdGhlIHJlc3BvbnNlLlxuICAgICAgICBpZiAocmVzcG9uc2VTcGVjKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VTcGVjLmJvZHlNYXBwZXIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWVUb0Rlc2VyaWFsaXplID0gcGFyc2VkUmVzcG9uc2UucGFyc2VkQm9keTtcbiAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uU3BlYy5pc1hNTCAmJiByZXNwb25zZVNwZWMuYm9keU1hcHBlci50eXBlLm5hbWUgPT09IE1hcHBlclR5cGUuU2VxdWVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVUb0Rlc2VyaWFsaXplID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZVRvRGVzZXJpYWxpemUgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHZhbHVlVG9EZXNlcmlhbGl6ZVtyZXNwb25zZVNwZWMuYm9keU1hcHBlci54bWxFbGVtZW50TmFtZV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZWRSZXNwb25zZS5wYXJzZWRCb2R5ID0gb3BlcmF0aW9uU3BlYy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHJlc3BvbnNlU3BlYy5ib2R5TWFwcGVyLCB2YWx1ZVRvRGVzZXJpYWxpemUsIFwib3BlcmF0aW9uUmVzLnBhcnNlZEJvZHlcIiwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChpbm5lckVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3RFcnJvciA9IG5ldyBSZXN0RXJyb3IoYEVycm9yICR7aW5uZXJFcnJvcn0gb2NjdXJyZWQgaW4gZGVzZXJpYWxpemluZyB0aGUgcmVzcG9uc2VCb2R5IC0gJHtwYXJzZWRSZXNwb25zZS5ib2R5QXNUZXh0fWAsIHVuZGVmaW5lZCwgcGFyc2VkUmVzcG9uc2Uuc3RhdHVzLCBwYXJzZWRSZXNwb25zZS5yZXF1ZXN0LCBwYXJzZWRSZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHJlc3RFcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvcGVyYXRpb25TcGVjLmh0dHBNZXRob2QgPT09IFwiSEVBRFwiKSB7XG4gICAgICAgICAgICAgICAgLy8gaGVhZCBtZXRob2RzIG5ldmVyIGhhdmUgYSBib2R5LCBidXQgd2UgcmV0dXJuIGEgYm9vbGVhbiB0byBpbmRpY2F0ZSBwcmVzZW5jZS9hYnNlbmNlIG9mIHRoZSByZXNvdXJjZVxuICAgICAgICAgICAgICAgIHBhcnNlZFJlc3BvbnNlLnBhcnNlZEJvZHkgPSByZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1cyA8IDMwMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVNwZWMuaGVhZGVyc01hcHBlcikge1xuICAgICAgICAgICAgICAgIHBhcnNlZFJlc3BvbnNlLnBhcnNlZEhlYWRlcnMgPSBvcGVyYXRpb25TcGVjLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocmVzcG9uc2VTcGVjLmhlYWRlcnNNYXBwZXIsIHBhcnNlZFJlc3BvbnNlLmhlYWRlcnMudG9Kc29uKCksIFwib3BlcmF0aW9uUmVzLnBhcnNlZEhlYWRlcnNcIiwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlZFJlc3BvbnNlO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gaXNPcGVyYXRpb25TcGVjRW1wdHkob3BlcmF0aW9uU3BlYykge1xuICAgIGNvbnN0IGV4cGVjdGVkU3RhdHVzQ29kZXMgPSBPYmplY3Qua2V5cyhvcGVyYXRpb25TcGVjLnJlc3BvbnNlcyk7XG4gICAgcmV0dXJuIChleHBlY3RlZFN0YXR1c0NvZGVzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAoZXhwZWN0ZWRTdGF0dXNDb2Rlcy5sZW5ndGggPT09IDEgJiYgZXhwZWN0ZWRTdGF0dXNDb2Rlc1swXSA9PT0gXCJkZWZhdWx0XCIpKTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUVycm9yUmVzcG9uc2UocGFyc2VkUmVzcG9uc2UsIG9wZXJhdGlvblNwZWMsIHJlc3BvbnNlU3BlYykge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBpc1N1Y2Nlc3NCeVN0YXR1cyA9IDIwMCA8PSBwYXJzZWRSZXNwb25zZS5zdGF0dXMgJiYgcGFyc2VkUmVzcG9uc2Uuc3RhdHVzIDwgMzAwO1xuICAgIGNvbnN0IGlzRXhwZWN0ZWRTdGF0dXNDb2RlID0gaXNPcGVyYXRpb25TcGVjRW1wdHkob3BlcmF0aW9uU3BlYylcbiAgICAgICAgPyBpc1N1Y2Nlc3NCeVN0YXR1c1xuICAgICAgICA6ICEhcmVzcG9uc2VTcGVjO1xuICAgIGlmIChpc0V4cGVjdGVkU3RhdHVzQ29kZSkge1xuICAgICAgICBpZiAocmVzcG9uc2VTcGVjKSB7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlU3BlYy5pc0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IG51bGwsIHNob3VsZFJldHVyblJlc3BvbnNlOiBmYWxzZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IG51bGwsIHNob3VsZFJldHVyblJlc3BvbnNlOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGVycm9yUmVzcG9uc2VTcGVjID0gcmVzcG9uc2VTcGVjICE9PSBudWxsICYmIHJlc3BvbnNlU3BlYyAhPT0gdm9pZCAwID8gcmVzcG9uc2VTcGVjIDogb3BlcmF0aW9uU3BlYy5yZXNwb25zZXMuZGVmYXVsdDtcbiAgICBjb25zdCBzdHJlYW1pbmcgPSAoKF9hID0gcGFyc2VkUmVzcG9uc2UucmVxdWVzdC5zdHJlYW1SZXNwb25zZVN0YXR1c0NvZGVzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaGFzKHBhcnNlZFJlc3BvbnNlLnN0YXR1cykpIHx8XG4gICAgICAgIHBhcnNlZFJlc3BvbnNlLnJlcXVlc3Quc3RyZWFtUmVzcG9uc2VCb2R5O1xuICAgIGNvbnN0IGluaXRpYWxFcnJvck1lc3NhZ2UgPSBzdHJlYW1pbmdcbiAgICAgICAgPyBgVW5leHBlY3RlZCBzdGF0dXMgY29kZTogJHtwYXJzZWRSZXNwb25zZS5zdGF0dXN9YFxuICAgICAgICA6IHBhcnNlZFJlc3BvbnNlLmJvZHlBc1RleHQ7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgUmVzdEVycm9yKGluaXRpYWxFcnJvck1lc3NhZ2UsIHVuZGVmaW5lZCwgcGFyc2VkUmVzcG9uc2Uuc3RhdHVzLCBwYXJzZWRSZXNwb25zZS5yZXF1ZXN0LCBwYXJzZWRSZXNwb25zZSk7XG4gICAgLy8gSWYgdGhlIGl0ZW0gZmFpbGVkIGJ1dCB0aGVyZSdzIG5vIGVycm9yIHNwZWMgb3IgZGVmYXVsdCBzcGVjIHRvIGRlc2VyaWFsaXplIHRoZSBlcnJvcixcbiAgICAvLyB3ZSBzaG91bGQgZmFpbCBzbyB3ZSBqdXN0IHRocm93IHRoZSBwYXJzZWQgcmVzcG9uc2VcbiAgICBpZiAoIWVycm9yUmVzcG9uc2VTcGVjKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBjb25zdCBkZWZhdWx0Qm9keU1hcHBlciA9IGVycm9yUmVzcG9uc2VTcGVjLmJvZHlNYXBwZXI7XG4gICAgY29uc3QgZGVmYXVsdEhlYWRlcnNNYXBwZXIgPSBlcnJvclJlc3BvbnNlU3BlYy5oZWFkZXJzTWFwcGVyO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIElmIGVycm9yIHJlc3BvbnNlIGhhcyBhIGJvZHksIHRyeSB0byBkZXNlcmlhbGl6ZSBpdCB1c2luZyBkZWZhdWx0IGJvZHkgbWFwcGVyLlxuICAgICAgICAvLyBUaGVuIHRyeSB0byBleHRyYWN0IGVycm9yIGNvZGUgJiBtZXNzYWdlIGZyb20gaXRcbiAgICAgICAgaWYgKHBhcnNlZFJlc3BvbnNlLnBhcnNlZEJvZHkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZEJvZHkgPSBwYXJzZWRSZXNwb25zZS5wYXJzZWRCb2R5O1xuICAgICAgICAgICAgbGV0IHBhcnNlZEVycm9yO1xuICAgICAgICAgICAgaWYgKGRlZmF1bHRCb2R5TWFwcGVyKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlVG9EZXNlcmlhbGl6ZSA9IHBhcnNlZEJvZHk7XG4gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvblNwZWMuaXNYTUwgJiYgZGVmYXVsdEJvZHlNYXBwZXIudHlwZS5uYW1lID09PSBNYXBwZXJUeXBlLlNlcXVlbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlVG9EZXNlcmlhbGl6ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcGFyc2VkQm9keSA9PT0gXCJvYmplY3RcIiA/IHBhcnNlZEJvZHlbZGVmYXVsdEJvZHlNYXBwZXIueG1sRWxlbWVudE5hbWVdIDogW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhcnNlZEVycm9yID0gb3BlcmF0aW9uU3BlYy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGRlZmF1bHRCb2R5TWFwcGVyLCB2YWx1ZVRvRGVzZXJpYWxpemUsIFwiZXJyb3IucmVzcG9uc2UucGFyc2VkQm9keVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGludGVybmFsRXJyb3IgPSBwYXJzZWRCb2R5LmVycm9yIHx8IHBhcnNlZEVycm9yIHx8IHBhcnNlZEJvZHk7XG4gICAgICAgICAgICBlcnJvci5jb2RlID0gaW50ZXJuYWxFcnJvci5jb2RlO1xuICAgICAgICAgICAgaWYgKGludGVybmFsRXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UgPSBpbnRlcm5hbEVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVmYXVsdEJvZHlNYXBwZXIpIHtcbiAgICAgICAgICAgICAgICBlcnJvci5yZXNwb25zZS5wYXJzZWRCb2R5ID0gcGFyc2VkRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgZXJyb3IgcmVzcG9uc2UgaGFzIGhlYWRlcnMsIHRyeSB0byBkZXNlcmlhbGl6ZSBpdCB1c2luZyBkZWZhdWx0IGhlYWRlciBtYXBwZXJcbiAgICAgICAgaWYgKHBhcnNlZFJlc3BvbnNlLmhlYWRlcnMgJiYgZGVmYXVsdEhlYWRlcnNNYXBwZXIpIHtcbiAgICAgICAgICAgIGVycm9yLnJlc3BvbnNlLnBhcnNlZEhlYWRlcnMgPSBvcGVyYXRpb25TcGVjLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGVmYXVsdEhlYWRlcnNNYXBwZXIsIHBhcnNlZFJlc3BvbnNlLmhlYWRlcnMudG9Kc29uKCksIFwib3BlcmF0aW9uUmVzLnBhcnNlZEhlYWRlcnNcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGRlZmF1bHRFcnJvcikge1xuICAgICAgICBlcnJvci5tZXNzYWdlID0gYEVycm9yIFwiJHtkZWZhdWx0RXJyb3IubWVzc2FnZX1cIiBvY2N1cnJlZCBpbiBkZXNlcmlhbGl6aW5nIHRoZSByZXNwb25zZUJvZHkgLSBcIiR7cGFyc2VkUmVzcG9uc2UuYm9keUFzVGV4dH1cIiBmb3IgdGhlIGRlZmF1bHQgcmVzcG9uc2UuYDtcbiAgICB9XG4gICAgcmV0dXJuIHsgZXJyb3IsIHNob3VsZFJldHVyblJlc3BvbnNlOiBmYWxzZSB9O1xufVxuZnVuY3Rpb24gcGFyc2UoanNvbkNvbnRlbnRUeXBlcywgeG1sQ29udGVudFR5cGVzLCBvcGVyYXRpb25SZXNwb25zZSwgb3B0cykge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBlcnJvckhhbmRsZXIgPSAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IG1zZyA9IGBFcnJvciBcIiR7ZXJyfVwiIG9jY3VycmVkIHdoaWxlIHBhcnNpbmcgdGhlIHJlc3BvbnNlIGJvZHkgLSAke29wZXJhdGlvblJlc3BvbnNlLmJvZHlBc1RleHR9LmA7XG4gICAgICAgIGNvbnN0IGVyckNvZGUgPSBlcnIuY29kZSB8fCBSZXN0RXJyb3IuUEFSU0VfRVJST1I7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgUmVzdEVycm9yKG1zZywgZXJyQ29kZSwgb3BlcmF0aW9uUmVzcG9uc2Uuc3RhdHVzLCBvcGVyYXRpb25SZXNwb25zZS5yZXF1ZXN0LCBvcGVyYXRpb25SZXNwb25zZSk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcbiAgICB9O1xuICAgIGNvbnN0IHN0cmVhbWluZyA9ICgoX2EgPSBvcGVyYXRpb25SZXNwb25zZS5yZXF1ZXN0LnN0cmVhbVJlc3BvbnNlU3RhdHVzQ29kZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oYXMob3BlcmF0aW9uUmVzcG9uc2Uuc3RhdHVzKSkgfHxcbiAgICAgICAgb3BlcmF0aW9uUmVzcG9uc2UucmVxdWVzdC5zdHJlYW1SZXNwb25zZUJvZHk7XG4gICAgaWYgKCFzdHJlYW1pbmcgJiYgb3BlcmF0aW9uUmVzcG9uc2UuYm9keUFzVGV4dCkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gb3BlcmF0aW9uUmVzcG9uc2UuYm9keUFzVGV4dDtcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBvcGVyYXRpb25SZXNwb25zZS5oZWFkZXJzLmdldChcIkNvbnRlbnQtVHlwZVwiKSB8fCBcIlwiO1xuICAgICAgICBjb25zdCBjb250ZW50Q29tcG9uZW50cyA9ICFjb250ZW50VHlwZVxuICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgOiBjb250ZW50VHlwZS5zcGxpdChcIjtcIikubWFwKChjb21wb25lbnQpID0+IGNvbXBvbmVudC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKGNvbnRlbnRDb21wb25lbnRzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICAgY29udGVudENvbXBvbmVudHMuc29tZSgoY29tcG9uZW50KSA9PiBqc29uQ29udGVudFR5cGVzLmluZGV4T2YoY29tcG9uZW50KSAhPT0gLTEpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25SZXNwb25zZS5wYXJzZWRCb2R5ID0gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKG9wZXJhdGlvblJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGVycm9ySGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29udGVudENvbXBvbmVudHMuc29tZSgoY29tcG9uZW50KSA9PiB4bWxDb250ZW50VHlwZXMuaW5kZXhPZihjb21wb25lbnQpICE9PSAtMSkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVhNTCh0ZXh0LCBvcHRzKVxuICAgICAgICAgICAgICAgIC50aGVuKChib2R5KSA9PiB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uUmVzcG9uc2UucGFyc2VkQm9keSA9IGJvZHk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvblJlc3BvbnNlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3JIYW5kbGVyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG9wZXJhdGlvblJlc3BvbnNlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlc2VyaWFsaXphdGlvblBvbGljeS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEJhc2VSZXF1ZXN0UG9saWN5LCB9IGZyb20gXCIuL3JlcXVlc3RQb2xpY3lcIjtcbmltcG9ydCB7IFNhbml0aXplciB9IGZyb20gXCIuLi91dGlsL3Nhbml0aXplclwiO1xuaW1wb3J0IHsgbG9nZ2VyIGFzIGNvcmVMb2dnZXIgfSBmcm9tIFwiLi4vbG9nXCI7XG4vKipcbiAqIENyZWF0ZXMgYSBwb2xpY3kgdGhhdCBsb2dzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvdXRnb2luZyByZXF1ZXN0IGFuZCB0aGUgaW5jb21pbmcgcmVzcG9uc2VzLlxuICogQHBhcmFtIGxvZ2dpbmdPcHRpb25zIC0gTG9nZ2luZyBvcHRpb25zLlxuICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIHtAbGluayBMb2dQb2xpY3l9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2dQb2xpY3kobG9nZ2luZ09wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNyZWF0ZTogKG5leHRQb2xpY3ksIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTG9nUG9saWN5KG5leHRQb2xpY3ksIG9wdGlvbnMsIGxvZ2dpbmdPcHRpb25zKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuLyoqXG4gKiBBIHBvbGljeSB0aGF0IGxvZ3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG91dGdvaW5nIHJlcXVlc3QgYW5kIHRoZSBpbmNvbWluZyByZXNwb25zZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dQb2xpY3kgZXh0ZW5kcyBCYXNlUmVxdWVzdFBvbGljeSB7XG4gICAgY29uc3RydWN0b3IobmV4dFBvbGljeSwgb3B0aW9ucywgeyBsb2dnZXIgPSBjb3JlTG9nZ2VyLmluZm8sIGFsbG93ZWRIZWFkZXJOYW1lcyA9IFtdLCBhbGxvd2VkUXVlcnlQYXJhbWV0ZXJzID0gW10sIH0gPSB7fSkge1xuICAgICAgICBzdXBlcihuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XG4gICAgICAgIHRoaXMuc2FuaXRpemVyID0gbmV3IFNhbml0aXplcih7IGFsbG93ZWRIZWFkZXJOYW1lcywgYWxsb3dlZFF1ZXJ5UGFyYW1ldGVycyB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGVhZGVyIG5hbWVzIHdob3NlIHZhbHVlcyB3aWxsIGJlIGxvZ2dlZCB3aGVuIGxvZ2dpbmcgaXMgZW5hYmxlZC4gRGVmYXVsdHMgdG9cbiAgICAgKiBEYXRlLCB0cmFjZXBhcmVudCwgeC1tcy1jbGllbnQtcmVxdWVzdC1pZCwgYW5kIHgtbXMtcmVxdWVzdCBpZC4gIEFueSBoZWFkZXJzXG4gICAgICogc3BlY2lmaWVkIGluIHRoaXMgZmllbGQgd2lsbCBiZSBhZGRlZCB0byB0aGF0IGxpc3QuICBBbnkgb3RoZXIgdmFsdWVzIHdpbGxcbiAgICAgKiBiZSB3cml0dGVuIHRvIGxvZ3MgYXMgXCJSRURBQ1RFRFwiLlxuICAgICAqIEBkZXByZWNhdGVkIFBhc3MgdGhlc2UgaW50byB0aGUgY29uc3RydWN0b3IgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBnZXQgYWxsb3dlZEhlYWRlck5hbWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYWxsb3dlZEhlYWRlck5hbWVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIZWFkZXIgbmFtZXMgd2hvc2UgdmFsdWVzIHdpbGwgYmUgbG9nZ2VkIHdoZW4gbG9nZ2luZyBpcyBlbmFibGVkLiBEZWZhdWx0cyB0b1xuICAgICAqIERhdGUsIHRyYWNlcGFyZW50LCB4LW1zLWNsaWVudC1yZXF1ZXN0LWlkLCBhbmQgeC1tcy1yZXF1ZXN0IGlkLiAgQW55IGhlYWRlcnNcbiAgICAgKiBzcGVjaWZpZWQgaW4gdGhpcyBmaWVsZCB3aWxsIGJlIGFkZGVkIHRvIHRoYXQgbGlzdC4gIEFueSBvdGhlciB2YWx1ZXMgd2lsbFxuICAgICAqIGJlIHdyaXR0ZW4gdG8gbG9ncyBhcyBcIlJFREFDVEVEXCIuXG4gICAgICogQGRlcHJlY2F0ZWQgUGFzcyB0aGVzZSBpbnRvIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkLlxuICAgICAqL1xuICAgIHNldCBhbGxvd2VkSGVhZGVyTmFtZXMoYWxsb3dlZEhlYWRlck5hbWVzKSB7XG4gICAgICAgIHRoaXMuc2FuaXRpemVyLmFsbG93ZWRIZWFkZXJOYW1lcyA9IGFsbG93ZWRIZWFkZXJOYW1lcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUXVlcnkgc3RyaW5nIG5hbWVzIHdob3NlIHZhbHVlcyB3aWxsIGJlIGxvZ2dlZCB3aGVuIGxvZ2dpbmcgaXMgZW5hYmxlZC4gQnkgZGVmYXVsdCBub1xuICAgICAqIHF1ZXJ5IHN0cmluZyB2YWx1ZXMgYXJlIGxvZ2dlZC5cbiAgICAgKiBAZGVwcmVjYXRlZCBQYXNzIHRoZXNlIGludG8gdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQuXG4gICAgICovXG4gICAgZ2V0IGFsbG93ZWRRdWVyeVBhcmFtZXRlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhbml0aXplci5hbGxvd2VkUXVlcnlQYXJhbWV0ZXJzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBRdWVyeSBzdHJpbmcgbmFtZXMgd2hvc2UgdmFsdWVzIHdpbGwgYmUgbG9nZ2VkIHdoZW4gbG9nZ2luZyBpcyBlbmFibGVkLiBCeSBkZWZhdWx0IG5vXG4gICAgICogcXVlcnkgc3RyaW5nIHZhbHVlcyBhcmUgbG9nZ2VkLlxuICAgICAqIEBkZXByZWNhdGVkIFBhc3MgdGhlc2UgaW50byB0aGUgY29uc3RydWN0b3IgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBzZXQgYWxsb3dlZFF1ZXJ5UGFyYW1ldGVycyhhbGxvd2VkUXVlcnlQYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuc2FuaXRpemVyLmFsbG93ZWRRdWVyeVBhcmFtZXRlcnMgPSBhbGxvd2VkUXVlcnlQYXJhbWV0ZXJzO1xuICAgIH1cbiAgICBzZW5kUmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgICAgIGlmICghdGhpcy5sb2dnZXIuZW5hYmxlZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9uZXh0UG9saWN5LnNlbmRSZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICB0aGlzLmxvZ1JlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9uZXh0UG9saWN5LnNlbmRSZXF1ZXN0KHJlcXVlc3QpLnRoZW4oKHJlc3BvbnNlKSA9PiB0aGlzLmxvZ1Jlc3BvbnNlKHJlc3BvbnNlKSk7XG4gICAgfVxuICAgIGxvZ1JlcXVlc3QocmVxdWVzdCkge1xuICAgICAgICB0aGlzLmxvZ2dlcihgUmVxdWVzdDogJHt0aGlzLnNhbml0aXplci5zYW5pdGl6ZShyZXF1ZXN0KX1gKTtcbiAgICB9XG4gICAgbG9nUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIoYFJlc3BvbnNlIHN0YXR1cyBjb2RlOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgdGhpcy5sb2dnZXIoYEhlYWRlcnM6ICR7dGhpcy5zYW5pdGl6ZXIuc2FuaXRpemUocmVzcG9uc2UuaGVhZGVycyl9YCk7XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dQb2xpY3kuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBCYXNlUmVxdWVzdFBvbGljeSwgfSBmcm9tIFwiLi9yZXF1ZXN0UG9saWN5XCI7XG4vKipcbiAqIFJldHVybnMgYSByZXF1ZXN0IHBvbGljeSBmYWN0b3J5IHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mXG4gKiB7QGxpbmsgRGlzYWJsZVJlc3BvbnNlRGVjb21wcmVzc2lvblBvbGljeX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXNhYmxlUmVzcG9uc2VEZWNvbXByZXNzaW9uUG9saWN5KCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNyZWF0ZTogKG5leHRQb2xpY3ksIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGlzYWJsZVJlc3BvbnNlRGVjb21wcmVzc2lvblBvbGljeShuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuLyoqXG4gKiBBIHBvbGljeSB0byBkaXNhYmxlIHJlc3BvbnNlIGRlY29tcHJlc3Npb24gYWNjb3JkaW5nIHRvIEFjY2VwdC1FbmNvZGluZyBoZWFkZXJcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvSGVhZGVycy9BY2NlcHQtRW5jb2RpbmdcbiAqL1xuZXhwb3J0IGNsYXNzIERpc2FibGVSZXNwb25zZURlY29tcHJlc3Npb25Qb2xpY3kgZXh0ZW5kcyBCYXNlUmVxdWVzdFBvbGljeSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBEaXNhYmxlUmVzcG9uc2VEZWNvbXByZXNzaW9uUG9saWN5LlxuICAgICAqXG4gICAgICogQHBhcmFtIG5leHRQb2xpY3kgLVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICAvLyBUaGUgcGFyZW50IGNvbnN0cnVjdG9yIGlzIHByb3RlY3RlZC5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZWxlc3MtY29uc3RydWN0b3IgKi9cbiAgICBjb25zdHJ1Y3RvcihuZXh0UG9saWN5LCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG5leHRQb2xpY3ksIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBvdXQgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IC1cbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgcmVxdWVzdC5kZWNvbXByZXNzUmVzcG9uc2UgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25leHRQb2xpY3kuc2VuZFJlcXVlc3QocmVxdWVzdCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGlzYWJsZVJlc3BvbnNlRGVjb21wcmVzc2lvblBvbGljeS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIEh0dHBIZWFkZXJzIHRoYXQgY2FuIGJlIHNlbnQgd2l0aCBhIEhUVFAgcmVxdWVzdC5cbiAqL1xuZnVuY3Rpb24gZ2V0SGVhZGVyS2V5KGhlYWRlck5hbWUpIHtcbiAgICByZXR1cm4gaGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSHR0cEhlYWRlcnNMaWtlKG9iamVjdCkge1xuICAgIGlmIChvYmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBjb25zdCBjYXN0T2JqZWN0ID0gb2JqZWN0O1xuICAgICAgICBpZiAodHlwZW9mIGNhc3RPYmplY3QucmF3SGVhZGVycyA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICB0eXBlb2YgY2FzdE9iamVjdC5jbG9uZSA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICB0eXBlb2YgY2FzdE9iamVjdC5nZXQgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgdHlwZW9mIGNhc3RPYmplY3Quc2V0ID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjYXN0T2JqZWN0LmNvbnRhaW5zID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjYXN0T2JqZWN0LnJlbW92ZSA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICB0eXBlb2YgY2FzdE9iamVjdC5oZWFkZXJzQXJyYXkgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgdHlwZW9mIGNhc3RPYmplY3QuaGVhZGVyVmFsdWVzID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjYXN0T2JqZWN0LmhlYWRlck5hbWVzID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjYXN0T2JqZWN0LnRvSnNvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBIVFRQIGhlYWRlciBrZXkvdmFsdWUgcGFpcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBIdHRwSGVhZGVycyB7XG4gICAgY29uc3RydWN0b3IocmF3SGVhZGVycykge1xuICAgICAgICB0aGlzLl9oZWFkZXJzTWFwID0ge307XG4gICAgICAgIGlmIChyYXdIZWFkZXJzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGhlYWRlck5hbWUgaW4gcmF3SGVhZGVycykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGhlYWRlck5hbWUsIHJhd0hlYWRlcnNbaGVhZGVyTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBhIGhlYWRlciBpbiB0aGlzIGNvbGxlY3Rpb24gd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSBhbmQgdmFsdWUuIFRoZSBuYW1lIGlzXG4gICAgICogY2FzZS1pbnNlbnNpdGl2ZS5cbiAgICAgKiBAcGFyYW0gaGVhZGVyTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgdG8gc2V0LiBUaGlzIHZhbHVlIGlzIGNhc2UtaW5zZW5zaXRpdmUuXG4gICAgICogQHBhcmFtIGhlYWRlclZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBoZWFkZXIgdG8gc2V0LlxuICAgICAqL1xuICAgIHNldChoZWFkZXJOYW1lLCBoZWFkZXJWYWx1ZSkge1xuICAgICAgICB0aGlzLl9oZWFkZXJzTWFwW2dldEhlYWRlcktleShoZWFkZXJOYW1lKV0gPSB7XG4gICAgICAgICAgICBuYW1lOiBoZWFkZXJOYW1lLFxuICAgICAgICAgICAgdmFsdWU6IGhlYWRlclZhbHVlLnRvU3RyaW5nKCkudHJpbSgpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGhlYWRlciB2YWx1ZSBmb3IgdGhlIHByb3ZpZGVkIGhlYWRlciBuYW1lLCBvciB1bmRlZmluZWQgaWYgbm8gaGVhZGVyIGV4aXN0cyBpbiB0aGlzXG4gICAgICogY29sbGVjdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLlxuICAgICAqIEBwYXJhbSBoZWFkZXJOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGhlYWRlci5cbiAgICAgKi9cbiAgICBnZXQoaGVhZGVyTmFtZSkge1xuICAgICAgICBjb25zdCBoZWFkZXIgPSB0aGlzLl9oZWFkZXJzTWFwW2dldEhlYWRlcktleShoZWFkZXJOYW1lKV07XG4gICAgICAgIHJldHVybiAhaGVhZGVyID8gdW5kZWZpbmVkIDogaGVhZGVyLnZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgd2hldGhlciBvciBub3QgdGhpcyBoZWFkZXIgY29sbGVjdGlvbiBjb250YWlucyBhIGhlYWRlciBlbnRyeSBmb3IgdGhlIHByb3ZpZGVkIGhlYWRlciBuYW1lLlxuICAgICAqL1xuICAgIGNvbnRhaW5zKGhlYWRlck5hbWUpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5faGVhZGVyc01hcFtnZXRIZWFkZXJLZXkoaGVhZGVyTmFtZSldO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIGhlYWRlciB3aXRoIHRoZSBwcm92aWRlZCBoZWFkZXJOYW1lLiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIGhlYWRlciBleGlzdGVkIGFuZFxuICAgICAqIHdhcyByZW1vdmVkLlxuICAgICAqIEBwYXJhbSBoZWFkZXJOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGhlYWRlciB0byByZW1vdmUuXG4gICAgICovXG4gICAgcmVtb3ZlKGhlYWRlck5hbWUpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb250YWlucyhoZWFkZXJOYW1lKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2hlYWRlcnNNYXBbZ2V0SGVhZGVyS2V5KGhlYWRlck5hbWUpXTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBoZWFkZXJzIHRoYXQgYXJlIGNvbnRhaW5lZCB0aGlzIGNvbGxlY3Rpb24gYXMgYW4gb2JqZWN0LlxuICAgICAqL1xuICAgIHJhd0hlYWRlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvSnNvbih7IHByZXNlcnZlQ2FzZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBoZWFkZXJzIHRoYXQgYXJlIGNvbnRhaW5lZCBpbiB0aGlzIGNvbGxlY3Rpb24gYXMgYW4gYXJyYXkuXG4gICAgICovXG4gICAgaGVhZGVyc0FycmF5KCkge1xuICAgICAgICBjb25zdCBoZWFkZXJzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaGVhZGVyS2V5IGluIHRoaXMuX2hlYWRlcnNNYXApIHtcbiAgICAgICAgICAgIGhlYWRlcnMucHVzaCh0aGlzLl9oZWFkZXJzTWFwW2hlYWRlcktleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoZWFkZXJzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGhlYWRlciBuYW1lcyB0aGF0IGFyZSBjb250YWluZWQgaW4gdGhpcyBjb2xsZWN0aW9uLlxuICAgICAqL1xuICAgIGhlYWRlck5hbWVzKCkge1xuICAgICAgICBjb25zdCBoZWFkZXJOYW1lcyA9IFtdO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5oZWFkZXJzQXJyYXkoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBoZWFkZXJOYW1lcy5wdXNoKGhlYWRlcnNbaV0ubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlYWRlck5hbWVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGhlYWRlciB2YWx1ZXMgdGhhdCBhcmUgY29udGFpbmVkIGluIHRoaXMgY29sbGVjdGlvbi5cbiAgICAgKi9cbiAgICBoZWFkZXJWYWx1ZXMoKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlclZhbHVlcyA9IFtdO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5oZWFkZXJzQXJyYXkoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBoZWFkZXJWYWx1ZXMucHVzaChoZWFkZXJzW2ldLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVhZGVyVmFsdWVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEpTT04gb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgSFRUUCBoZWFkZXIgY29sbGVjdGlvbi5cbiAgICAgKi9cbiAgICB0b0pzb24ob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgICBpZiAob3B0aW9ucy5wcmVzZXJ2ZUNhc2UpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGVhZGVyS2V5IGluIHRoaXMuX2hlYWRlcnNNYXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXIgPSB0aGlzLl9oZWFkZXJzTWFwW2hlYWRlcktleV07XG4gICAgICAgICAgICAgICAgcmVzdWx0W2hlYWRlci5uYW1lXSA9IGhlYWRlci52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGVhZGVyS2V5IGluIHRoaXMuX2hlYWRlcnNNYXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXIgPSB0aGlzLl9oZWFkZXJzTWFwW2hlYWRlcktleV07XG4gICAgICAgICAgICAgICAgcmVzdWx0W2dldEhlYWRlcktleShoZWFkZXIubmFtZSldID0gaGVhZGVyLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgSFRUUCBoZWFkZXIgY29sbGVjdGlvbi5cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMudG9Kc29uKHsgcHJlc2VydmVDYXNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgZGVlcCBjbG9uZS9jb3B5IG9mIHRoaXMgSHR0cEhlYWRlcnMgY29sbGVjdGlvbi5cbiAgICAgKi9cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0UHJlc2VydmluZ0Nhc2luZyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGhlYWRlcktleSBpbiB0aGlzLl9oZWFkZXJzTWFwKSB7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXIgPSB0aGlzLl9oZWFkZXJzTWFwW2hlYWRlcktleV07XG4gICAgICAgICAgICByZXN1bHRQcmVzZXJ2aW5nQ2FzaW5nW2hlYWRlci5uYW1lXSA9IGhlYWRlci52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEh0dHBIZWFkZXJzKHJlc3VsdFByZXNlcnZpbmdDYXNpbmcpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWh0dHBIZWFkZXJzLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgSHR0cEhlYWRlcnMsIGlzSHR0cEhlYWRlcnNMaWtlIH0gZnJvbSBcIi4vaHR0cEhlYWRlcnNcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9zZXJpYWxpemVyXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZVV1aWQgfSBmcm9tIFwiLi91dGlsL3V0aWxzXCI7XG5leHBvcnQgZnVuY3Rpb24gaXNXZWJSZXNvdXJjZUxpa2Uob2JqZWN0KSB7XG4gICAgaWYgKG9iamVjdCAmJiB0eXBlb2Ygb2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGNvbnN0IGNhc3RPYmplY3QgPSBvYmplY3Q7XG4gICAgICAgIGlmICh0eXBlb2YgY2FzdE9iamVjdC51cmwgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjYXN0T2JqZWN0Lm1ldGhvZCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgdHlwZW9mIGNhc3RPYmplY3QuaGVhZGVycyA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaXNIdHRwSGVhZGVyc0xpa2UoY2FzdE9iamVjdC5oZWFkZXJzKSAmJlxuICAgICAgICAgICAgdHlwZW9mIGNhc3RPYmplY3QudmFsaWRhdGVSZXF1ZXN0UHJvcGVydGllcyA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICB0eXBlb2YgY2FzdE9iamVjdC5wcmVwYXJlID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjYXN0T2JqZWN0LmNsb25lID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBXZWJSZXNvdXJjZSBvYmplY3QuXG4gKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBhbiBhYnN0cmFjdGlvbiBvdmVyIGEgUkVTVCBjYWxsIGJ5IGJlaW5nIGxpYnJhcnkgLyBpbXBsZW1lbnRhdGlvbiBhZ25vc3RpYyBhbmQgd3JhcHBpbmcgdGhlIG5lY2Vzc2FyeVxuICogcHJvcGVydGllcyB0byBpbml0aWF0ZSBhIHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJSZXNvdXJjZSB7XG4gICAgY29uc3RydWN0b3IodXJsLCBtZXRob2QsIGJvZHksIHF1ZXJ5LCBoZWFkZXJzLCBzdHJlYW1SZXNwb25zZUJvZHksIHdpdGhDcmVkZW50aWFscywgYWJvcnRTaWduYWwsIHRpbWVvdXQsIG9uVXBsb2FkUHJvZ3Jlc3MsIG9uRG93bmxvYWRQcm9ncmVzcywgcHJveHlTZXR0aW5ncywga2VlcEFsaXZlLCBkZWNvbXByZXNzUmVzcG9uc2UsIHN0cmVhbVJlc3BvbnNlU3RhdHVzQ29kZXMpIHtcbiAgICAgICAgdGhpcy5zdHJlYW1SZXNwb25zZUJvZHkgPSBzdHJlYW1SZXNwb25zZUJvZHk7XG4gICAgICAgIHRoaXMuc3RyZWFtUmVzcG9uc2VTdGF0dXNDb2RlcyA9IHN0cmVhbVJlc3BvbnNlU3RhdHVzQ29kZXM7XG4gICAgICAgIHRoaXMudXJsID0gdXJsIHx8IFwiXCI7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kIHx8IFwiR0VUXCI7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IGlzSHR0cEhlYWRlcnNMaWtlKGhlYWRlcnMpID8gaGVhZGVycyA6IG5ldyBIdHRwSGVhZGVycyhoZWFkZXJzKTtcbiAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcbiAgICAgICAgdGhpcy5xdWVyeSA9IHF1ZXJ5O1xuICAgICAgICB0aGlzLmZvcm1EYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLndpdGhDcmVkZW50aWFscyA9IHdpdGhDcmVkZW50aWFscyB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbCA9IGFib3J0U2lnbmFsO1xuICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0IHx8IDA7XG4gICAgICAgIHRoaXMub25VcGxvYWRQcm9ncmVzcyA9IG9uVXBsb2FkUHJvZ3Jlc3M7XG4gICAgICAgIHRoaXMub25Eb3dubG9hZFByb2dyZXNzID0gb25Eb3dubG9hZFByb2dyZXNzO1xuICAgICAgICB0aGlzLnByb3h5U2V0dGluZ3MgPSBwcm94eVNldHRpbmdzO1xuICAgICAgICB0aGlzLmtlZXBBbGl2ZSA9IGtlZXBBbGl2ZTtcbiAgICAgICAgdGhpcy5kZWNvbXByZXNzUmVzcG9uc2UgPSBkZWNvbXByZXNzUmVzcG9uc2U7XG4gICAgICAgIHRoaXMucmVxdWVzdElkID0gdGhpcy5oZWFkZXJzLmdldChcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIikgfHwgZ2VuZXJhdGVVdWlkKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyB0aGF0IHRoZSByZXF1aXJlZCBwcm9wZXJ0aWVzIHN1Y2ggYXMgbWV0aG9kLCB1cmwsIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0sXG4gICAgICogaGVhZGVyc1tcImFjY2VwdC1sYW5ndWFnZVwiXSBhcmUgZGVmaW5lZC4gSXQgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiBvbmUgb2YgdGhlIGFib3ZlXG4gICAgICogbWVudGlvbmVkIHByb3BlcnRpZXMgYXJlIG5vdCBkZWZpbmVkLlxuICAgICAqL1xuICAgIHZhbGlkYXRlUmVxdWVzdFByb3BlcnRpZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5tZXRob2QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIldlYlJlc291cmNlLm1ldGhvZCBpcyByZXF1aXJlZC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnVybCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV2ViUmVzb3VyY2UudXJsIGlzIHJlcXVpcmVkLlwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlcyB0aGUgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gcHJvdmlkZSBmb3IgcHJlcGFyaW5nIHRoZSByZXF1ZXN0LlxuICAgICAqIEByZXR1cm5zIFJldHVybnMgdGhlIHByZXBhcmVkIFdlYlJlc291cmNlIChIVFRQIFJlcXVlc3QpIG9iamVjdCB0aGF0IG5lZWRzIHRvIGJlIGdpdmVuIHRvIHRoZSByZXF1ZXN0IHBpcGVsaW5lLlxuICAgICAqL1xuICAgIHByZXBhcmUob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm9wdGlvbnMgb2JqZWN0IGlzIHJlcXVpcmVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLm1ldGhvZCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBvcHRpb25zLm1ldGhvZCA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgdHlwZW9mIG9wdGlvbnMubWV0aG9kLnZhbHVlT2YoKSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwib3B0aW9ucy5tZXRob2QgbXVzdCBiZSBhIHN0cmluZy5cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMudXJsICYmIG9wdGlvbnMucGF0aFRlbXBsYXRlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zLnVybCBhbmQgb3B0aW9ucy5wYXRoVGVtcGxhdGUgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gUGxlYXNlIHByb3ZpZGUgZXhhY3RseSBvbmUgb2YgdGhlbS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChvcHRpb25zLnBhdGhUZW1wbGF0ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBvcHRpb25zLnBhdGhUZW1wbGF0ZSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgdHlwZW9mIG9wdGlvbnMucGF0aFRlbXBsYXRlLnZhbHVlT2YoKSAhPT0gXCJzdHJpbmdcIikgJiZcbiAgICAgICAgICAgIChvcHRpb25zLnVybCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2Ygb3B0aW9ucy51cmwudmFsdWVPZigpICE9PSBcInN0cmluZ1wiKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGxlYXNlIHByb3ZpZGUgZXhhY3RseSBvbmUgb2Ygb3B0aW9ucy5wYXRoVGVtcGxhdGUgb3Igb3B0aW9ucy51cmwuXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldCB0aGUgdXJsIGlmIGl0IGlzIHByb3ZpZGVkLlxuICAgICAgICBpZiAob3B0aW9ucy51cmwpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy51cmwgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wdGlvbnMudXJsIG11c3QgYmUgb2YgdHlwZSBcInN0cmluZ1wiLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy51cmwgPSBvcHRpb25zLnVybDtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgdGhlIG1ldGhvZFxuICAgICAgICBpZiAob3B0aW9ucy5tZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkTWV0aG9kcyA9IFtcIkdFVFwiLCBcIlBVVFwiLCBcIkhFQURcIiwgXCJERUxFVEVcIiwgXCJPUFRJT05TXCIsIFwiUE9TVFwiLCBcIlBBVENIXCIsIFwiVFJBQ0VcIl07XG4gICAgICAgICAgICBpZiAodmFsaWRNZXRob2RzLmluZGV4T2Yob3B0aW9ucy5tZXRob2QudG9VcHBlckNhc2UoKSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcHJvdmlkZWQgbWV0aG9kIFwiJyArXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMubWV0aG9kICtcbiAgICAgICAgICAgICAgICAgICAgJ1wiIGlzIGludmFsaWQuIFN1cHBvcnRlZCBIVFRQIG1ldGhvZHMgYXJlOiAnICtcbiAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodmFsaWRNZXRob2RzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXRob2QgPSBvcHRpb25zLm1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAvLyBjb25zdHJ1Y3QgdGhlIHVybCBpZiBwYXRoIHRlbXBsYXRlIGlzIHByb3ZpZGVkXG4gICAgICAgIGlmIChvcHRpb25zLnBhdGhUZW1wbGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgeyBwYXRoVGVtcGxhdGUsIHBhdGhQYXJhbWV0ZXJzIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXRoVGVtcGxhdGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wdGlvbnMucGF0aFRlbXBsYXRlIG11c3QgYmUgb2YgdHlwZSBcInN0cmluZ1wiLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmJhc2VVcmwpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmJhc2VVcmwgPSBcImh0dHBzOi8vbWFuYWdlbWVudC5henVyZS5jb21cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJhc2VVcmwgPSBvcHRpb25zLmJhc2VVcmw7XG4gICAgICAgICAgICBsZXQgdXJsID0gYmFzZVVybCArXG4gICAgICAgICAgICAgICAgKGJhc2VVcmwuZW5kc1dpdGgoXCIvXCIpID8gXCJcIiA6IFwiL1wiKSArXG4gICAgICAgICAgICAgICAgKHBhdGhUZW1wbGF0ZS5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGhUZW1wbGF0ZS5zbGljZSgxKSA6IHBhdGhUZW1wbGF0ZSk7XG4gICAgICAgICAgICBjb25zdCBzZWdtZW50cyA9IHVybC5tYXRjaCgvKHtbXFx3LV0qXFxzKltcXHctXSp9KS9naSk7XG4gICAgICAgICAgICBpZiAoc2VnbWVudHMgJiYgc2VnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXRoUGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHBhdGhUZW1wbGF0ZTogJHtwYXRoVGVtcGxhdGV9IGhhcyBiZWVuIHByb3ZpZGVkLiBIZW5jZSwgb3B0aW9ucy5wYXRoUGFyYW1ldGVycyBtdXN0IGFsc28gYmUgcHJvdmlkZWQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNlZ21lbnRzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aFBhcmFtTmFtZSA9IGl0ZW0uc2xpY2UoMSwgLTEpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoUGFyYW0gPSBwYXRoUGFyYW1ldGVyc1twYXRoUGFyYW1OYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGhQYXJhbSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFBhcmFtID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICEodHlwZW9mIHBhdGhQYXJhbSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgcGF0aFBhcmFtID09PSBcIm9iamVjdFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5naWZpZWRQYXRoUGFyYW1ldGVycyA9IEpTT04uc3RyaW5naWZ5KHBhdGhQYXJhbWV0ZXJzLCB1bmRlZmluZWQsIDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBwYXRoVGVtcGxhdGU6ICR7cGF0aFRlbXBsYXRlfSBjb250YWlucyB0aGUgcGF0aCBwYXJhbWV0ZXIgJHtwYXRoUGFyYW1OYW1lfWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAgaG93ZXZlciwgaXQgaXMgbm90IHByZXNlbnQgaW4gcGFyYW1ldGVyczogJHtzdHJpbmdpZmllZFBhdGhQYXJhbWV0ZXJzfS5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhlIHZhbHVlIG9mIHRoZSBwYXRoIHBhcmFtZXRlciBjYW4gZWl0aGVyIGJlIGEgXCJzdHJpbmdcIiBvZiB0aGUgZm9ybSB7ICR7cGF0aFBhcmFtTmFtZX06IFwic29tZSBzYW1wbGUgdmFsdWVcIiB9IG9yIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBpdCBjYW4gYmUgYW4gXCJvYmplY3RcIiBvZiB0aGUgZm9ybSB7IFwiJHtwYXRoUGFyYW1OYW1lfVwiOiB7IHZhbHVlOiBcInNvbWUgc2FtcGxlIHZhbHVlXCIsIHNraXBVcmxFbmNvZGluZzogdHJ1ZSB9IH0uYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXRoUGFyYW0udmFsdWVPZigpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZShpdGVtLCBlbmNvZGVVUklDb21wb25lbnQocGF0aFBhcmFtKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXRoUGFyYW0udmFsdWVPZigpID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhdGhQYXJhbS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgb3B0aW9ucy5wYXRoUGFyYW1ldGVyc1ske3BhdGhQYXJhbU5hbWV9XSBpcyBvZiB0eXBlIFwib2JqZWN0XCIgYnV0IGl0IGRvZXMgbm90IGNvbnRhaW4gYSBcInZhbHVlXCIgcHJvcGVydHkuYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aFBhcmFtLnNraXBVcmxFbmNvZGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKGl0ZW0sIHBhdGhQYXJhbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZShpdGVtLCBlbmNvZGVVUklDb21wb25lbnQocGF0aFBhcmFtLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudXJsID0gdXJsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFwcGVuZCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHRoZSB1cmwgaWYgdGhleSBhcmUgcHJvdmlkZWQuIFRoZXkgY2FuIGJlIHByb3ZpZGVkIHdpdGggcGF0aFRlbXBsYXRlIG9yIHVybCBvcHRpb24uXG4gICAgICAgIGlmIChvcHRpb25zLnF1ZXJ5UGFyYW1ldGVycykge1xuICAgICAgICAgICAgY29uc3QgcXVlcnlQYXJhbWV0ZXJzID0gb3B0aW9ucy5xdWVyeVBhcmFtZXRlcnM7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHF1ZXJ5UGFyYW1ldGVycyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgb3B0aW9ucy5xdWVyeVBhcmFtZXRlcnMgbXVzdCBiZSBvZiB0eXBlIG9iamVjdC4gSXQgc2hvdWxkIGJlIGEgSlNPTiBvYmplY3QgYCArXG4gICAgICAgICAgICAgICAgICAgIGBvZiBcInF1ZXJ5LXBhcmFtZXRlci1uYW1lXCIgYXMgdGhlIGtleSBhbmQgdGhlIFwicXVlcnktcGFyYW1ldGVyLXZhbHVlXCIgYXMgdGhlIHZhbHVlLiBgICtcbiAgICAgICAgICAgICAgICAgICAgYFRoZSBcInF1ZXJ5LXBhcmFtZXRlci12YWx1ZVwiIG1heSBiZSBmbyB0eXBlIFwic3RyaW5nXCIgb3IgYW4gXCJvYmplY3RcIiBvZiB0aGUgZm9ybSB7IHZhbHVlOiBcInF1ZXJ5LXBhcmFtZXRlci12YWx1ZVwiLCBza2lwVXJsRW5jb2Rpbmc6IHRydWUgfS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFwcGVuZCBxdWVzdGlvbiBtYXJrIGlmIGl0IGlzIG5vdCBwcmVzZW50IGluIHRoZSB1cmxcbiAgICAgICAgICAgIGlmICh0aGlzLnVybCAmJiB0aGlzLnVybC5pbmRleE9mKFwiP1wiKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVybCArPSBcIj9cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnN0cnVjdCBxdWVyeVN0cmluZ1xuICAgICAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBbXTtcbiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gcG9wdWxhdGUgdGhpcy5xdWVyeSBhcyBhIGRpY3Rpb25hcnkgaWYgdGhlIHJlcXVlc3QgaXMgYmVpbmcgdXNlZCBmb3IgU3dheSdzIHZhbGlkYXRlUmVxdWVzdCgpLlxuICAgICAgICAgICAgdGhpcy5xdWVyeSA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBxdWVyeVBhcmFtTmFtZSBpbiBxdWVyeVBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBxdWVyeVBhcmFtID0gcXVlcnlQYXJhbWV0ZXJzW3F1ZXJ5UGFyYW1OYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAocXVlcnlQYXJhbSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHF1ZXJ5UGFyYW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLnB1c2gocXVlcnlQYXJhbU5hbWUgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChxdWVyeVBhcmFtKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5W3F1ZXJ5UGFyYW1OYW1lXSA9IGVuY29kZVVSSUNvbXBvbmVudChxdWVyeVBhcmFtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgcXVlcnlQYXJhbSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFxdWVyeVBhcmFtLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBvcHRpb25zLnF1ZXJ5UGFyYW1ldGVyc1ske3F1ZXJ5UGFyYW1OYW1lfV0gaXMgb2YgdHlwZSBcIm9iamVjdFwiIGJ1dCBpdCBkb2VzIG5vdCBjb250YWluIGEgXCJ2YWx1ZVwiIHByb3BlcnR5LmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5UGFyYW0uc2tpcFVybEVuY29kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXMucHVzaChxdWVyeVBhcmFtTmFtZSArIFwiPVwiICsgcXVlcnlQYXJhbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVyeVtxdWVyeVBhcmFtTmFtZV0gPSBxdWVyeVBhcmFtLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXMucHVzaChxdWVyeVBhcmFtTmFtZSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5UGFyYW0udmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5W3F1ZXJ5UGFyYW1OYW1lXSA9IGVuY29kZVVSSUNvbXBvbmVudChxdWVyeVBhcmFtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gLy8gZW5kLW9mLWZvclxuICAgICAgICAgICAgLy8gYXBwZW5kIHRoZSBxdWVyeVN0cmluZ1xuICAgICAgICAgICAgdGhpcy51cmwgKz0gcXVlcnlQYXJhbXMuam9pbihcIiZcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYWRkIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3QgaWYgdGhleSBhcmUgcHJvdmlkZWRcbiAgICAgICAgaWYgKG9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycztcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGVhZGVyTmFtZSBvZiBPYmplY3Qua2V5cyhvcHRpb25zLmhlYWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJzLnNldChoZWFkZXJOYW1lLCBoZWFkZXJzW2hlYWRlck5hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBlbnN1cmUgYWNjZXB0LWxhbmd1YWdlIGlzIHNldCBjb3JyZWN0bHlcbiAgICAgICAgaWYgKCF0aGlzLmhlYWRlcnMuZ2V0KFwiYWNjZXB0LWxhbmd1YWdlXCIpKSB7XG4gICAgICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KFwiYWNjZXB0LWxhbmd1YWdlXCIsIFwiZW4tVVNcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZW5zdXJlIHRoZSByZXF1ZXN0LWlkIGlzIHNldCBjb3JyZWN0bHlcbiAgICAgICAgaWYgKCF0aGlzLmhlYWRlcnMuZ2V0KFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiKSAmJiAhb3B0aW9ucy5kaXNhYmxlQ2xpZW50UmVxdWVzdElkKSB7XG4gICAgICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLCB0aGlzLnJlcXVlc3RJZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGVmYXVsdFxuICAgICAgICBpZiAoIXRoaXMuaGVhZGVycy5nZXQoXCJDb250ZW50LVR5cGVcIikpIHtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVycy5zZXQoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldCB0aGUgcmVxdWVzdCBib2R5LiByZXF1ZXN0LmpzIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgQ29udGVudC1MZW5ndGggcmVxdWVzdCBoZWFkZXIsIHNvIHdlIG5lZWQgbm90IHNldCBpdCBleHBsaWNpdGx5XG4gICAgICAgIHRoaXMuYm9keSA9IG9wdGlvbnMuYm9keTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYm9keSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuYm9keSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gYm9keSBhcyBhIHN0cmVhbSBzcGVjaWFsIGNhc2UuIHNldCB0aGUgYm9keSBhcy1pcyBhbmQgY2hlY2sgZm9yIHNvbWUgc3BlY2lhbCByZXF1ZXN0IGhlYWRlcnMgc3BlY2lmaWMgdG8gc2VuZGluZyBhIHN0cmVhbS5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmJvZHlJc1N0cmVhbSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5oZWFkZXJzLmdldChcIlRyYW5zZmVyLUVuY29kaW5nXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVycy5zZXQoXCJUcmFuc2Zlci1FbmNvZGluZ1wiLCBcImNodW5rZWRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpICE9PSBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVycy5zZXQoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2VyaWFsaXphdGlvbk1hcHBlcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJvZHkgPSBuZXcgU2VyaWFsaXplcihvcHRpb25zLm1hcHBlcnMpLnNlcmlhbGl6ZShvcHRpb25zLnNlcmlhbGl6YXRpb25NYXBwZXIsIG9wdGlvbnMuYm9keSwgXCJyZXF1ZXN0Qm9keVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmRpc2FibGVKc29uU3RyaW5naWZ5T25Cb2R5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuYm9keSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnNwYW5PcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLnNwYW5PcHRpb25zID0gb3B0aW9ucy5zcGFuT3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy50cmFjaW5nQ29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy50cmFjaW5nQ29udGV4dCA9IG9wdGlvbnMudHJhY2luZ0NvbnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbCA9IG9wdGlvbnMuYWJvcnRTaWduYWw7XG4gICAgICAgIHRoaXMub25Eb3dubG9hZFByb2dyZXNzID0gb3B0aW9ucy5vbkRvd25sb2FkUHJvZ3Jlc3M7XG4gICAgICAgIHRoaXMub25VcGxvYWRQcm9ncmVzcyA9IG9wdGlvbnMub25VcGxvYWRQcm9ncmVzcztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb25lIHRoaXMgV2ViUmVzb3VyY2UgSFRUUCByZXF1ZXN0IG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyBUaGUgY2xvbmUgb2YgdGhpcyBXZWJSZXNvdXJjZSBIVFRQIHJlcXVlc3Qgb2JqZWN0LlxuICAgICAqL1xuICAgIGNsb25lKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgV2ViUmVzb3VyY2UodGhpcy51cmwsIHRoaXMubWV0aG9kLCB0aGlzLmJvZHksIHRoaXMucXVlcnksIHRoaXMuaGVhZGVycyAmJiB0aGlzLmhlYWRlcnMuY2xvbmUoKSwgdGhpcy5zdHJlYW1SZXNwb25zZUJvZHksIHRoaXMud2l0aENyZWRlbnRpYWxzLCB0aGlzLmFib3J0U2lnbmFsLCB0aGlzLnRpbWVvdXQsIHRoaXMub25VcGxvYWRQcm9ncmVzcywgdGhpcy5vbkRvd25sb2FkUHJvZ3Jlc3MsIHRoaXMucHJveHlTZXR0aW5ncywgdGhpcy5rZWVwQWxpdmUsIHRoaXMuZGVjb21wcmVzc1Jlc3BvbnNlLCB0aGlzLnN0cmVhbVJlc3BvbnNlU3RhdHVzQ29kZXMpO1xuICAgICAgICBpZiAodGhpcy5mb3JtRGF0YSkge1xuICAgICAgICAgICAgcmVzdWx0LmZvcm1EYXRhID0gdGhpcy5mb3JtRGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25TcGVjKSB7XG4gICAgICAgICAgICByZXN1bHQub3BlcmF0aW9uU3BlYyA9IHRoaXMub3BlcmF0aW9uU3BlYztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zaG91bGREZXNlcmlhbGl6ZSkge1xuICAgICAgICAgICAgcmVzdWx0LnNob3VsZERlc2VyaWFsaXplID0gdGhpcy5zaG91bGREZXNlcmlhbGl6ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25SZXNwb25zZUdldHRlcikge1xuICAgICAgICAgICAgcmVzdWx0Lm9wZXJhdGlvblJlc3BvbnNlR2V0dGVyID0gdGhpcy5vcGVyYXRpb25SZXNwb25zZUdldHRlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdlYlJlc291cmNlLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgY3JlYXRlQ2xpZW50TG9nZ2VyIH0gZnJvbSBcIkBhenVyZS9sb2dnZXJcIjtcbi8qKlxuICogVGhlIGBAYXp1cmUvbG9nZ2VyYCBjb25maWd1cmF0aW9uIGZvciB0aGlzIHBhY2thZ2UuXG4gKi9cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBjcmVhdGVDbGllbnRMb2dnZXIoXCJzdG9yYWdlLWJsb2JcIik7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2cuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5leHBvcnQgY29uc3QgU0RLX1ZFUlNJT04gPSBcIjEyLjE3LjBcIjtcbmV4cG9ydCBjb25zdCBTRVJWSUNFX1ZFUlNJT04gPSBcIjIwMjMtMTEtMDNcIjtcbmV4cG9ydCBjb25zdCBCTE9DS19CTE9CX01BWF9VUExPQURfQkxPQl9CWVRFUyA9IDI1NiAqIDEwMjQgKiAxMDI0OyAvLyAyNTZNQlxuZXhwb3J0IGNvbnN0IEJMT0NLX0JMT0JfTUFYX1NUQUdFX0JMT0NLX0JZVEVTID0gNDAwMCAqIDEwMjQgKiAxMDI0OyAvLyA0MDAwTUJcbmV4cG9ydCBjb25zdCBCTE9DS19CTE9CX01BWF9CTE9DS1MgPSA1MDAwMDtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0JMT0NLX0JVRkZFUl9TSVpFX0JZVEVTID0gOCAqIDEwMjQgKiAxMDI0OyAvLyA4TUJcbmV4cG9ydCBjb25zdCBERUZBVUxUX0JMT0JfRE9XTkxPQURfQkxPQ0tfQllURVMgPSA0ICogMTAyNCAqIDEwMjQ7IC8vIDRNQlxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUFYX0RPV05MT0FEX1JFVFJZX1JFUVVFU1RTID0gNTtcbmV4cG9ydCBjb25zdCBSRVFVRVNUX1RJTUVPVVQgPSAxMDAgKiAxMDAwOyAvLyBJbiBtc1xuLyoqXG4gKiBUaGUgT0F1dGggc2NvcGUgdG8gdXNlIHdpdGggQXp1cmUgU3RvcmFnZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFN0b3JhZ2VPQXV0aFNjb3BlcyA9IFwiaHR0cHM6Ly9zdG9yYWdlLmF6dXJlLmNvbS8uZGVmYXVsdFwiO1xuZXhwb3J0IGNvbnN0IFVSTENvbnN0YW50cyA9IHtcbiAgICBQYXJhbWV0ZXJzOiB7XG4gICAgICAgIEZPUkNFX0JST1dTRVJfTk9fQ0FDSEU6IFwiX1wiLFxuICAgICAgICBTSUdOQVRVUkU6IFwic2lnXCIsXG4gICAgICAgIFNOQVBTSE9UOiBcInNuYXBzaG90XCIsXG4gICAgICAgIFZFUlNJT05JRDogXCJ2ZXJzaW9uaWRcIixcbiAgICAgICAgVElNRU9VVDogXCJ0aW1lb3V0XCIsXG4gICAgfSxcbn07XG5leHBvcnQgY29uc3QgSFRUUFVSTENvbm5lY3Rpb24gPSB7XG4gICAgSFRUUF9BQ0NFUFRFRDogMjAyLFxuICAgIEhUVFBfQ09ORkxJQ1Q6IDQwOSxcbiAgICBIVFRQX05PVF9GT1VORDogNDA0LFxuICAgIEhUVFBfUFJFQ09OX0ZBSUxFRDogNDEyLFxuICAgIEhUVFBfUkFOR0VfTk9UX1NBVElTRklBQkxFOiA0MTYsXG59O1xuZXhwb3J0IGNvbnN0IEhlYWRlckNvbnN0YW50cyA9IHtcbiAgICBBVVRIT1JJWkFUSU9OOiBcIkF1dGhvcml6YXRpb25cIixcbiAgICBBVVRIT1JJWkFUSU9OX1NDSEVNRTogXCJCZWFyZXJcIixcbiAgICBDT05URU5UX0VOQ09ESU5HOiBcIkNvbnRlbnQtRW5jb2RpbmdcIixcbiAgICBDT05URU5UX0lEOiBcIkNvbnRlbnQtSURcIixcbiAgICBDT05URU5UX0xBTkdVQUdFOiBcIkNvbnRlbnQtTGFuZ3VhZ2VcIixcbiAgICBDT05URU5UX0xFTkdUSDogXCJDb250ZW50LUxlbmd0aFwiLFxuICAgIENPTlRFTlRfTUQ1OiBcIkNvbnRlbnQtTWQ1XCIsXG4gICAgQ09OVEVOVF9UUkFOU0ZFUl9FTkNPRElORzogXCJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nXCIsXG4gICAgQ09OVEVOVF9UWVBFOiBcIkNvbnRlbnQtVHlwZVwiLFxuICAgIENPT0tJRTogXCJDb29raWVcIixcbiAgICBEQVRFOiBcImRhdGVcIixcbiAgICBJRl9NQVRDSDogXCJpZi1tYXRjaFwiLFxuICAgIElGX01PRElGSUVEX1NJTkNFOiBcImlmLW1vZGlmaWVkLXNpbmNlXCIsXG4gICAgSUZfTk9ORV9NQVRDSDogXCJpZi1ub25lLW1hdGNoXCIsXG4gICAgSUZfVU5NT0RJRklFRF9TSU5DRTogXCJpZi11bm1vZGlmaWVkLXNpbmNlXCIsXG4gICAgUFJFRklYX0ZPUl9TVE9SQUdFOiBcIngtbXMtXCIsXG4gICAgUkFOR0U6IFwiUmFuZ2VcIixcbiAgICBVU0VSX0FHRU5UOiBcIlVzZXItQWdlbnRcIixcbiAgICBYX01TX0NMSUVOVF9SRVFVRVNUX0lEOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICBYX01TX0NPUFlfU09VUkNFOiBcIngtbXMtY29weS1zb3VyY2VcIixcbiAgICBYX01TX0RBVEU6IFwieC1tcy1kYXRlXCIsXG4gICAgWF9NU19FUlJPUl9DT0RFOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgIFhfTVNfVkVSU0lPTjogXCJ4LW1zLXZlcnNpb25cIixcbn07XG5leHBvcnQgY29uc3QgRVRhZ05vbmUgPSBcIlwiO1xuZXhwb3J0IGNvbnN0IEVUYWdBbnkgPSBcIipcIjtcbmV4cG9ydCBjb25zdCBTSVpFXzFfTUIgPSAxICogMTAyNCAqIDEwMjQ7XG5leHBvcnQgY29uc3QgQkFUQ0hfTUFYX1JFUVVFU1QgPSAyNTY7XG5leHBvcnQgY29uc3QgQkFUQ0hfTUFYX1BBWUxPQURfSU5fQllURVMgPSA0ICogU0laRV8xX01CO1xuZXhwb3J0IGNvbnN0IEhUVFBfTElORV9FTkRJTkcgPSBcIlxcclxcblwiO1xuZXhwb3J0IGNvbnN0IEhUVFBfVkVSU0lPTl8xXzEgPSBcIkhUVFAvMS4xXCI7XG5leHBvcnQgY29uc3QgRW5jcnlwdGlvbkFsZ29yaXRobUFFUzI1ID0gXCJBRVMyNTZcIjtcbmV4cG9ydCBjb25zdCBEZXZlbG9wbWVudENvbm5lY3Rpb25TdHJpbmcgPSBgRGVmYXVsdEVuZHBvaW50c1Byb3RvY29sPWh0dHA7QWNjb3VudE5hbWU9ZGV2c3RvcmVhY2NvdW50MTtBY2NvdW50S2V5PUVieTh2ZE0wMnhOT2NxRmxxVXdKUExsbUV0bENEWEoxT1V6RlQ1MHVTUlo2SUZzdUZxMlVWRXJDejRJNnRxL0sxU1pGUFRPdHIvS0JIQmVrc29HTUd3PT07QmxvYkVuZHBvaW50PWh0dHA6Ly8xMjcuMC4wLjE6MTAwMDAvZGV2c3RvcmVhY2NvdW50MTtgO1xuZXhwb3J0IGNvbnN0IFN0b3JhZ2VCbG9iTG9nZ2luZ0FsbG93ZWRIZWFkZXJOYW1lcyA9IFtcbiAgICBcIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpblwiLFxuICAgIFwiQ2FjaGUtQ29udHJvbFwiLFxuICAgIFwiQ29udGVudC1MZW5ndGhcIixcbiAgICBcIkNvbnRlbnQtVHlwZVwiLFxuICAgIFwiRGF0ZVwiLFxuICAgIFwiUmVxdWVzdC1JZFwiLFxuICAgIFwidHJhY2VwYXJlbnRcIixcbiAgICBcIlRyYW5zZmVyLUVuY29kaW5nXCIsXG4gICAgXCJVc2VyLUFnZW50XCIsXG4gICAgXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgXCJ4LW1zLWRhdGVcIixcbiAgICBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgIFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgXCJ4LW1zLXJldHVybi1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgIFwieC1tcy12ZXJzaW9uXCIsXG4gICAgXCJBY2NlcHQtUmFuZ2VzXCIsXG4gICAgXCJDb250ZW50LURpc3Bvc2l0aW9uXCIsXG4gICAgXCJDb250ZW50LUVuY29kaW5nXCIsXG4gICAgXCJDb250ZW50LUxhbmd1YWdlXCIsXG4gICAgXCJDb250ZW50LU1ENVwiLFxuICAgIFwiQ29udGVudC1SYW5nZVwiLFxuICAgIFwiRVRhZ1wiLFxuICAgIFwiTGFzdC1Nb2RpZmllZFwiLFxuICAgIFwiU2VydmVyXCIsXG4gICAgXCJWYXJ5XCIsXG4gICAgXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICBcIngtbXMtY29weS1hY3Rpb25cIixcbiAgICBcIngtbXMtY29weS1jb21wbGV0aW9uLXRpbWVcIixcbiAgICBcIngtbXMtY29weS1pZFwiLFxuICAgIFwieC1tcy1jb3B5LXByb2dyZXNzXCIsXG4gICAgXCJ4LW1zLWNvcHktc3RhdHVzXCIsXG4gICAgXCJ4LW1zLWhhcy1pbW11dGFiaWxpdHktcG9saWN5XCIsXG4gICAgXCJ4LW1zLWhhcy1sZWdhbC1ob2xkXCIsXG4gICAgXCJ4LW1zLWxlYXNlLXN0YXRlXCIsXG4gICAgXCJ4LW1zLWxlYXNlLXN0YXR1c1wiLFxuICAgIFwieC1tcy1yYW5nZVwiLFxuICAgIFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICBcIngtbXMtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgIFwieC1tcy1zbmFwc2hvdFwiLFxuICAgIFwieC1tcy1zb3VyY2UtcmFuZ2VcIixcbiAgICBcIklmLU1hdGNoXCIsXG4gICAgXCJJZi1Nb2RpZmllZC1TaW5jZVwiLFxuICAgIFwiSWYtTm9uZS1NYXRjaFwiLFxuICAgIFwiSWYtVW5tb2RpZmllZC1TaW5jZVwiLFxuICAgIFwieC1tcy1hY2Nlc3MtdGllclwiLFxuICAgIFwieC1tcy1hY2Nlc3MtdGllci1jaGFuZ2UtdGltZVwiLFxuICAgIFwieC1tcy1hY2Nlc3MtdGllci1pbmZlcnJlZFwiLFxuICAgIFwieC1tcy1hY2NvdW50LWtpbmRcIixcbiAgICBcIngtbXMtYXJjaGl2ZS1zdGF0dXNcIixcbiAgICBcIngtbXMtYmxvYi1hcHBlbmQtb2Zmc2V0XCIsXG4gICAgXCJ4LW1zLWJsb2ItY2FjaGUtY29udHJvbFwiLFxuICAgIFwieC1tcy1ibG9iLWNvbW1pdHRlZC1ibG9jay1jb3VudFwiLFxuICAgIFwieC1tcy1ibG9iLWNvbmRpdGlvbi1hcHBlbmRwb3NcIixcbiAgICBcIngtbXMtYmxvYi1jb25kaXRpb24tbWF4c2l6ZVwiLFxuICAgIFwieC1tcy1ibG9iLWNvbnRlbnQtZGlzcG9zaXRpb25cIixcbiAgICBcIngtbXMtYmxvYi1jb250ZW50LWVuY29kaW5nXCIsXG4gICAgXCJ4LW1zLWJsb2ItY29udGVudC1sYW5ndWFnZVwiLFxuICAgIFwieC1tcy1ibG9iLWNvbnRlbnQtbGVuZ3RoXCIsXG4gICAgXCJ4LW1zLWJsb2ItY29udGVudC1tZDVcIixcbiAgICBcIngtbXMtYmxvYi1jb250ZW50LXR5cGVcIixcbiAgICBcIngtbXMtYmxvYi1wdWJsaWMtYWNjZXNzXCIsXG4gICAgXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgXCJ4LW1zLWJsb2ItdHlwZVwiLFxuICAgIFwieC1tcy1jb3B5LWRlc3RpbmF0aW9uLXNuYXBzaG90XCIsXG4gICAgXCJ4LW1zLWNyZWF0aW9uLXRpbWVcIixcbiAgICBcIngtbXMtZGVmYXVsdC1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgXCJ4LW1zLWRlbGV0ZS1zbmFwc2hvdHNcIixcbiAgICBcIngtbXMtZGVsZXRlLXR5cGUtcGVybWFuZW50XCIsXG4gICAgXCJ4LW1zLWRlbnktZW5jcnlwdGlvbi1zY29wZS1vdmVycmlkZVwiLFxuICAgIFwieC1tcy1lbmNyeXB0aW9uLWFsZ29yaXRobVwiLFxuICAgIFwieC1tcy1pZi1zZXF1ZW5jZS1udW1iZXItZXFcIixcbiAgICBcIngtbXMtaWYtc2VxdWVuY2UtbnVtYmVyLWxlXCIsXG4gICAgXCJ4LW1zLWlmLXNlcXVlbmNlLW51bWJlci1sdFwiLFxuICAgIFwieC1tcy1pbmNyZW1lbnRhbC1jb3B5XCIsXG4gICAgXCJ4LW1zLWxlYXNlLWFjdGlvblwiLFxuICAgIFwieC1tcy1sZWFzZS1icmVhay1wZXJpb2RcIixcbiAgICBcIngtbXMtbGVhc2UtZHVyYXRpb25cIixcbiAgICBcIngtbXMtbGVhc2UtaWRcIixcbiAgICBcIngtbXMtbGVhc2UtdGltZVwiLFxuICAgIFwieC1tcy1wYWdlLXdyaXRlXCIsXG4gICAgXCJ4LW1zLXByb3Bvc2VkLWxlYXNlLWlkXCIsXG4gICAgXCJ4LW1zLXJhbmdlLWdldC1jb250ZW50LW1kNVwiLFxuICAgIFwieC1tcy1yZWh5ZHJhdGUtcHJpb3JpdHlcIixcbiAgICBcIngtbXMtc2VxdWVuY2UtbnVtYmVyLWFjdGlvblwiLFxuICAgIFwieC1tcy1za3UtbmFtZVwiLFxuICAgIFwieC1tcy1zb3VyY2UtY29udGVudC1tZDVcIixcbiAgICBcIngtbXMtc291cmNlLWlmLW1hdGNoXCIsXG4gICAgXCJ4LW1zLXNvdXJjZS1pZi1tb2RpZmllZC1zaW5jZVwiLFxuICAgIFwieC1tcy1zb3VyY2UtaWYtbm9uZS1tYXRjaFwiLFxuICAgIFwieC1tcy1zb3VyY2UtaWYtdW5tb2RpZmllZC1zaW5jZVwiLFxuICAgIFwieC1tcy10YWctY291bnRcIixcbiAgICBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgXCJ4LW1zLWlmLXRhZ3NcIixcbiAgICBcIngtbXMtc291cmNlLWlmLXRhZ3NcIixcbl07XG5leHBvcnQgY29uc3QgU3RvcmFnZUJsb2JMb2dnaW5nQWxsb3dlZFF1ZXJ5UGFyYW1ldGVycyA9IFtcbiAgICBcImNvbXBcIixcbiAgICBcIm1heHJlc3VsdHNcIixcbiAgICBcInJzY2NcIixcbiAgICBcInJzY2RcIixcbiAgICBcInJzY2VcIixcbiAgICBcInJzY2xcIixcbiAgICBcInJzY3RcIixcbiAgICBcInNlXCIsXG4gICAgXCJzaVwiLFxuICAgIFwic2lwXCIsXG4gICAgXCJzcFwiLFxuICAgIFwic3ByXCIsXG4gICAgXCJzclwiLFxuICAgIFwic3J0XCIsXG4gICAgXCJzc1wiLFxuICAgIFwic3RcIixcbiAgICBcInN2XCIsXG4gICAgXCJpbmNsdWRlXCIsXG4gICAgXCJtYXJrZXJcIixcbiAgICBcInByZWZpeFwiLFxuICAgIFwiY29weWlkXCIsXG4gICAgXCJyZXN0eXBlXCIsXG4gICAgXCJibG9ja2lkXCIsXG4gICAgXCJibG9ja2xpc3R0eXBlXCIsXG4gICAgXCJkZWxpbWl0ZXJcIixcbiAgICBcInByZXZzbmFwc2hvdFwiLFxuICAgIFwic2tlXCIsXG4gICAgXCJza29pZFwiLFxuICAgIFwic2tzXCIsXG4gICAgXCJza3RcIixcbiAgICBcInNrdGlkXCIsXG4gICAgXCJza3ZcIixcbiAgICBcInNuYXBzaG90XCIsXG5dO1xuZXhwb3J0IGNvbnN0IEJsb2JVc2VzQ3VzdG9tZXJTcGVjaWZpZWRFbmNyeXB0aW9uTXNnID0gXCJCbG9iVXNlc0N1c3RvbWVyU3BlY2lmaWVkRW5jcnlwdGlvblwiO1xuZXhwb3J0IGNvbnN0IEJsb2JEb2VzTm90VXNlQ3VzdG9tZXJTcGVjaWZpZWRFbmNyeXB0aW9uID0gXCJCbG9iRG9lc05vdFVzZUN1c3RvbWVyU3BlY2lmaWVkRW5jcnlwdGlvblwiO1xuLy8vIExpc3Qgb2YgcG9ydHMgdXNlZCBmb3IgcGF0aCBzdHlsZSBhZGRyZXNzaW5nLlxuLy8vIFBhdGggc3R5bGUgYWRkcmVzc2luZyBtZWFucyB0aGF0IHN0b3JhZ2UgYWNjb3VudCBpcyBwdXQgaW4gVVJJJ3MgUGF0aCBzZWdtZW50IGluIGluc3RlYWQgb2YgaW4gaG9zdC5cbmV4cG9ydCBjb25zdCBQYXRoU3R5bGVQb3J0cyA9IFtcbiAgICBcIjEwMDAwXCIsXG4gICAgXCIxMDAwMVwiLFxuICAgIFwiMTAwMDJcIixcbiAgICBcIjEwMDAzXCIsXG4gICAgXCIxMDAwNFwiLFxuICAgIFwiMTAxMDBcIixcbiAgICBcIjEwMTAxXCIsXG4gICAgXCIxMDEwMlwiLFxuICAgIFwiMTAxMDNcIixcbiAgICBcIjEwMTA0XCIsXG4gICAgXCIxMTAwMFwiLFxuICAgIFwiMTEwMDFcIixcbiAgICBcIjExMDAyXCIsXG4gICAgXCIxMTAwM1wiLFxuICAgIFwiMTEwMDRcIixcbiAgICBcIjExMTAwXCIsXG4gICAgXCIxMTEwMVwiLFxuICAgIFwiMTExMDJcIixcbiAgICBcIjExMTAzXCIsXG4gICAgXCIxMTEwNFwiLFxuXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0YW50cy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEh0dHBIZWFkZXJzLCBpc05vZGUsIFVSTEJ1aWxkZXIgfSBmcm9tIFwiQGF6dXJlL2NvcmUtaHR0cFwiO1xuaW1wb3J0IHsgRGV2ZWxvcG1lbnRDb25uZWN0aW9uU3RyaW5nLCBIZWFkZXJDb25zdGFudHMsIFBhdGhTdHlsZVBvcnRzLCBVUkxDb25zdGFudHMsIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG4vKipcbiAqIFJlc2VydmVkIFVSTCBjaGFyYWN0ZXJzIG11c3QgYmUgcHJvcGVybHkgZXNjYXBlZCBmb3IgU3RvcmFnZSBzZXJ2aWNlcyBsaWtlIEJsb2Igb3IgRmlsZS5cbiAqXG4gKiAjIyBVUkwgZW5jb2RlIGFuZCBlc2NhcGUgc3RyYXRlZ3kgZm9yIEpTIFNES3NcbiAqXG4gKiBXaGVuIGN1c3RvbWVycyBwYXNzIGEgVVJMIHN0cmluZyBpbnRvIFh4eENsaWVudCBjbGFzc2VzIGNvbnN0cnVjdG9yLCB0aGUgVVJMIHN0cmluZyBtYXkgYWxyZWFkeSBiZSBVUkwgZW5jb2RlZCBvciBub3QuXG4gKiBCdXQgYmVmb3JlIHNlbmRpbmcgdG8gQXp1cmUgU3RvcmFnZSBzZXJ2ZXIsIHRoZSBVUkwgbXVzdCBiZSBlbmNvZGVkLiBIb3dldmVyLCBpdCdzIGhhcmQgZm9yIGEgU0RLIHRvIGd1ZXNzIHdoZXRoZXIgdGhlIFVSTFxuICogc3RyaW5nIGhhcyBiZWVuIGVuY29kZWQgb3Igbm90LiBXZSBoYXZlIDIgcG90ZW50aWFsIHN0cmF0ZWdpZXMsIGFuZCBjaG9zZSBzdHJhdGVneSB0d28gZm9yIHRoZSBYeHhDbGllbnQgY29uc3RydWN0b3JzLlxuICpcbiAqICMjIyBTdHJhdGVneSBPbmU6IEFzc3VtZSB0aGUgY3VzdG9tZXIgVVJMIHN0cmluZyBpcyBub3QgZW5jb2RlZCwgYW5kIGFsd2F5cyBlbmNvZGUgVVJMIHN0cmluZyBpbiBTREsuXG4gKlxuICogVGhpcyBpcyB3aGF0IGxlZ2FjeSBWMiBTREsgZG9lcywgc2ltcGxlIGFuZCB3b3JrcyBmb3IgbW9zdCBvZiB0aGUgY2FzZXMuXG4gKiAtIFdoZW4gY3VzdG9tZXIgVVJMIHN0cmluZyBpcyBcImh0dHA6Ly9hY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9jb24vYjpcIixcbiAqICAgU0RLIHdpbGwgZW5jb2RlIGl0IHRvIFwiaHR0cDovL2FjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L2Nvbi9iJTNBXCIgYW5kIHNlbmQgdG8gc2VydmVyLiBBIGJsb2IgbmFtZWQgXCJiOlwiIHdpbGwgYmUgY3JlYXRlZC5cbiAqIC0gV2hlbiBjdXN0b21lciBVUkwgc3RyaW5nIGlzIFwiaHR0cDovL2FjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L2Nvbi9iJTNBXCIsXG4gKiAgIFNESyB3aWxsIGVuY29kZSBpdCB0byBcImh0dHA6Ly9hY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9jb24vYiUyNTNBXCIgYW5kIHNlbmQgdG8gc2VydmVyLiBBIGJsb2IgbmFtZWQgXCJiJTNBXCIgd2lsbCBiZSBjcmVhdGVkLlxuICpcbiAqIEJ1dCB0aGlzIHN0cmF0ZWd5IHdpbGwgbWFrZSBpdCBub3QgcG9zc2libGUgdG8gY3JlYXRlIGEgYmxvYiB3aXRoIFwiP1wiIGluIGl0J3MgbmFtZS4gQmVjYXVzZSB3aGVuIGN1c3RvbWVyIFVSTCBzdHJpbmcgaXNcbiAqIFwiaHR0cDovL2FjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L2Nvbi9ibG9iP25hbWVcIiwgdGhlIFwiP25hbWVcIiB3aWxsIGJlIHRyZWF0ZWQgYXMgVVJMIHBhcmFtdGVyIGluc3RlYWQgb2YgYmxvYiBuYW1lLlxuICogSWYgY3VzdG9tZXIgVVJMIHN0cmluZyBpcyBcImh0dHA6Ly9hY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9jb24vYmxvYiUzRm5hbWVcIiwgYSBibG9iIG5hbWVkIFwiYmxvYiUzRm5hbWVcIiB3aWxsIGJlIGNyZWF0ZWQuXG4gKiBWMiBTREsgZG9lc24ndCBoYXZlIHRoaXMgaXNzdWUgYmVjYXVzZSBpdCBkb2Vzbid0IGFsbG93IGN1c3RvbWVyIHBhc3MgaW4gYSBmdWxsIFVSTCwgaXQgYWNjZXB0cyBhIHNlcGFyYXRlIGJsb2IgbmFtZSBhbmQgZW5jb2RlVVJJQ29tcG9uZW50IGZvciBpdC5cbiAqIFdlIGNhbm5vdCBhY2NlcHQgYSBTREsgY2Fubm90IGNyZWF0ZSBhIGJsb2IgbmFtZSB3aXRoIFwiP1wiLiBTbyB3ZSBpbXBsZW1lbnQgc3RyYXRlZ3kgdHdvOlxuICpcbiAqICMjIyBTdHJhdGVneSBUd286IFNESyBkb2Vzbid0IGFzc3VtZSB0aGUgVVJMIGhhcyBiZWVuIGVuY29kZWQgb3Igbm90LiBJdCB3aWxsIGp1c3QgZXNjYXBlIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMuXG4gKlxuICogVGhpcyBpcyB3aGF0IFYxMCBCbG9iIEdvIFNESyBkb2VzLiBJdCBhY2NlcHRzIGEgVVJMIHR5cGUgaW4gR28sIGFuZCBjYWxsIHVybC5Fc2NhcGVkUGF0aCgpIHRvIGVzY2FwZSB0aGUgc3BlY2lhbCBjaGFycyB1bmVzY2FwZWQuXG4gKiAtIFdoZW4gY3VzdG9tZXIgVVJMIHN0cmluZyBpcyBcImh0dHA6Ly9hY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9jb24vYjpcIixcbiAqICAgU0RLIHdpbGwgZXNjYXBlIFwiOlwiIGxpa2UgXCJodHRwOi8vYWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvY29uL2IlM0FcIiBhbmQgc2VuZCB0byBzZXJ2ZXIuIEEgYmxvYiBuYW1lZCBcImI6XCIgd2lsbCBiZSBjcmVhdGVkLlxuICogLSBXaGVuIGN1c3RvbWVyIFVSTCBzdHJpbmcgaXMgXCJodHRwOi8vYWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvY29uL2IlM0FcIixcbiAqICAgVGhlcmUgaXMgbm8gc3BlY2lhbCBjaGFyYWN0ZXJzLCBzbyBzZW5kIFwiaHR0cDovL2FjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L2Nvbi9iJTNBXCIgdG8gc2VydmVyLiBBIGJsb2IgbmFtZWQgXCJiOlwiIHdpbGwgYmUgY3JlYXRlZC5cbiAqIC0gV2hlbiBjdXN0b21lciBVUkwgc3RyaW5nIGlzIFwiaHR0cDovL2FjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L2Nvbi9iJTI1M0FcIixcbiAqICAgVGhlcmUgaXMgbm8gc3BlY2lhbCBjaGFyYWN0ZXJzLCBzbyBzZW5kIFwiaHR0cDovL2FjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L2Nvbi9iJTI1M0FcIiB0byBzZXJ2ZXIuIEEgYmxvYiBuYW1lZCBcImIlM0FcIiB3aWxsIGJlIGNyZWF0ZWQuXG4gKlxuICogVGhpcyBzdHJhdGVneSBnaXZlcyB1cyBmbGV4aWJpbGl0eSB0byBjcmVhdGUgd2l0aCBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJzLiBCdXQgXCIlXCIgd2lsbCBiZSB0cmVhdGVkIGFzIGEgc3BlY2lhbCBjaGFyYWN0ZXJzLCBpZiB0aGUgVVJMIHN0cmluZ1xuICogaXMgbm90IGVuY29kZWQsIHRoZXJlIHNob3VsZG4ndCBhIFwiJVwiIGluIHRoZSBVUkwgc3RyaW5nLCBvdGhlcndpc2UgdGhlIFVSTCBpcyBub3QgYSB2YWxpZCBVUkwuXG4gKiBJZiBjdXN0b21lciBuZWVkcyB0byBjcmVhdGUgYSBibG9iIHdpdGggXCIlXCIgaW4gaXQncyBibG9iIG5hbWUsIHVzZSBcIiUyNVwiIGluc3RlYWQgb2YgXCIlXCIuIEp1c3QgbGlrZSBhYm92ZSAzcmQgc2FtcGxlLlxuICogQW5kIGZvbGxvd2luZyBVUkwgc3RyaW5ncyBhcmUgaW52YWxpZDpcbiAqIC0gXCJodHRwOi8vYWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvY29uL2IlXCJcbiAqIC0gXCJodHRwOi8vYWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvY29uL2IlMlwiXG4gKiAtIFwiaHR0cDovL2FjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L2Nvbi9iJUdcIlxuICpcbiAqIEFub3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXIgaXMgXCI/XCIsIHVzZSBcIiUyRlwiIHRvIHJlcHJlc2VudCBhIGJsb2IgbmFtZSB3aXRoIFwiP1wiIGluIGEgVVJMIHN0cmluZy5cbiAqXG4gKiAjIyMgU3RyYXRlZ3kgZm9yIGNvbnRhaW5lck5hbWUsIGJsb2JOYW1lIG9yIG90aGVyIHNwZWNpZmljIFhYWE5hbWUgcGFyYW1ldGVycyBpbiBtZXRob2RzIHN1Y2ggYXMgYGNvbnRhaW5lckNsaWVudC5nZXRCbG9iQ2xpZW50KGJsb2JOYW1lKWBcbiAqXG4gKiBXZSB3aWxsIGFwcGx5IHN0cmF0ZWd5IG9uZSwgYW5kIGNhbGwgZW5jb2RlVVJJQ29tcG9uZW50IGZvciB0aGVzZSBwYXJhbWV0ZXJzIGxpa2UgYmxvYk5hbWUuIEJlY2F1c2Ugd2hhdCBjdXN0b21lcnMgcGFzc2VzIGluIGlzIGEgcGxhaW4gbmFtZSBpbnN0ZWFkIG9mIGEgVVJMLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL25hbWluZy1hbmQtcmVmZXJlbmNpbmctY29udGFpbmVycy0tYmxvYnMtLWFuZC1tZXRhZGF0YVxuICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvbmFtaW5nLWFuZC1yZWZlcmVuY2luZy1zaGFyZXMtLWRpcmVjdG9yaWVzLS1maWxlcy0tYW5kLW1ldGFkYXRhXG4gKlxuICogQHBhcmFtIHVybCAtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVVUkxQYXRoKHVybCkge1xuICAgIGNvbnN0IHVybFBhcnNlZCA9IFVSTEJ1aWxkZXIucGFyc2UodXJsKTtcbiAgICBsZXQgcGF0aCA9IHVybFBhcnNlZC5nZXRQYXRoKCk7XG4gICAgcGF0aCA9IHBhdGggfHwgXCIvXCI7XG4gICAgcGF0aCA9IGVzY2FwZShwYXRoKTtcbiAgICB1cmxQYXJzZWQuc2V0UGF0aChwYXRoKTtcbiAgICByZXR1cm4gdXJsUGFyc2VkLnRvU3RyaW5nKCk7XG59XG5mdW5jdGlvbiBnZXRQcm94eVVyaUZyb21EZXZDb25uU3RyaW5nKGNvbm5lY3Rpb25TdHJpbmcpIHtcbiAgICAvLyBEZXZlbG9wbWVudCBDb25uZWN0aW9uIFN0cmluZ1xuICAgIC8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2F6dXJlL3N0b3JhZ2UvY29tbW9uL3N0b3JhZ2UtY29uZmlndXJlLWNvbm5lY3Rpb24tc3RyaW5nI2Nvbm5lY3QtdG8tdGhlLWVtdWxhdG9yLWFjY291bnQtdXNpbmctdGhlLXdlbGwta25vd24tYWNjb3VudC1uYW1lLWFuZC1rZXlcbiAgICBsZXQgcHJveHlVcmkgPSBcIlwiO1xuICAgIGlmIChjb25uZWN0aW9uU3RyaW5nLnNlYXJjaChcIkRldmVsb3BtZW50U3RvcmFnZVByb3h5VXJpPVwiKSAhPT0gLTEpIHtcbiAgICAgICAgLy8gQ09OTkVDVElPTl9TVFJJTkc9VXNlRGV2ZWxvcG1lbnRTdG9yYWdlPXRydWU7RGV2ZWxvcG1lbnRTdG9yYWdlUHJveHlVcmk9aHR0cDovL215UHJveHlVcmlcbiAgICAgICAgY29uc3QgbWF0Y2hDcmVkZW50aWFscyA9IGNvbm5lY3Rpb25TdHJpbmcuc3BsaXQoXCI7XCIpO1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgbWF0Y2hDcmVkZW50aWFscykge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQudHJpbSgpLnN0YXJ0c1dpdGgoXCJEZXZlbG9wbWVudFN0b3JhZ2VQcm94eVVyaT1cIikpIHtcbiAgICAgICAgICAgICAgICBwcm94eVVyaSA9IGVsZW1lbnQudHJpbSgpLm1hdGNoKFwiRGV2ZWxvcG1lbnRTdG9yYWdlUHJveHlVcmk9KC4qKVwiKVsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJveHlVcmk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVJbkNvbm5TdHJpbmcoY29ubmVjdGlvblN0cmluZywgYXJndW1lbnQpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGNvbm5lY3Rpb25TdHJpbmcuc3BsaXQoXCI7XCIpO1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBpZiAoZWxlbWVudC50cmltKCkuc3RhcnRzV2l0aChhcmd1bWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRyaW0oKS5tYXRjaChhcmd1bWVudCArIFwiPSguKilcIilbMV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG59XG4vKipcbiAqIEV4dHJhY3RzIHRoZSBwYXJ0cyBvZiBhbiBBenVyZSBTdG9yYWdlIGFjY291bnQgY29ubmVjdGlvbiBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGNvbm5lY3Rpb25TdHJpbmcgLSBDb25uZWN0aW9uIHN0cmluZy5cbiAqIEByZXR1cm5zIFN0cmluZyBrZXkgdmFsdWUgcGFpcnMgb2YgdGhlIHN0b3JhZ2UgYWNjb3VudCdzIHVybCBhbmQgY3JlZGVudGlhbHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Q29ubmVjdGlvblN0cmluZ1BhcnRzKGNvbm5lY3Rpb25TdHJpbmcpIHtcbiAgICBsZXQgcHJveHlVcmkgPSBcIlwiO1xuICAgIGlmIChjb25uZWN0aW9uU3RyaW5nLnN0YXJ0c1dpdGgoXCJVc2VEZXZlbG9wbWVudFN0b3JhZ2U9dHJ1ZVwiKSkge1xuICAgICAgICAvLyBEZXZlbG9wbWVudCBjb25uZWN0aW9uIHN0cmluZ1xuICAgICAgICBwcm94eVVyaSA9IGdldFByb3h5VXJpRnJvbURldkNvbm5TdHJpbmcoY29ubmVjdGlvblN0cmluZyk7XG4gICAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBEZXZlbG9wbWVudENvbm5lY3Rpb25TdHJpbmc7XG4gICAgfVxuICAgIC8vIE1hdGNoaW5nIEJsb2JFbmRwb2ludCBpbiB0aGUgQWNjb3VudCBjb25uZWN0aW9uIHN0cmluZ1xuICAgIGxldCBibG9iRW5kcG9pbnQgPSBnZXRWYWx1ZUluQ29ublN0cmluZyhjb25uZWN0aW9uU3RyaW5nLCBcIkJsb2JFbmRwb2ludFwiKTtcbiAgICAvLyBTbGljaW5nIG9mZiAnLycgYXQgdGhlIGVuZCBpZiBleGlzdHNcbiAgICAvLyAoVGhlIG1ldGhvZHMgdGhhdCB1c2UgYGV4dHJhY3RDb25uZWN0aW9uU3RyaW5nUGFydHNgIGV4cGVjdCB0aGUgdXJsIHRvIG5vdCBoYXZlIGAvYCBhdCB0aGUgZW5kKVxuICAgIGJsb2JFbmRwb2ludCA9IGJsb2JFbmRwb2ludC5lbmRzV2l0aChcIi9cIikgPyBibG9iRW5kcG9pbnQuc2xpY2UoMCwgLTEpIDogYmxvYkVuZHBvaW50O1xuICAgIGlmIChjb25uZWN0aW9uU3RyaW5nLnNlYXJjaChcIkRlZmF1bHRFbmRwb2ludHNQcm90b2NvbD1cIikgIT09IC0xICYmXG4gICAgICAgIGNvbm5lY3Rpb25TdHJpbmcuc2VhcmNoKFwiQWNjb3VudEtleT1cIikgIT09IC0xKSB7XG4gICAgICAgIC8vIEFjY291bnQgY29ubmVjdGlvbiBzdHJpbmdcbiAgICAgICAgbGV0IGRlZmF1bHRFbmRwb2ludHNQcm90b2NvbCA9IFwiXCI7XG4gICAgICAgIGxldCBhY2NvdW50TmFtZSA9IFwiXCI7XG4gICAgICAgIGxldCBhY2NvdW50S2V5ID0gQnVmZmVyLmZyb20oXCJhY2NvdW50S2V5XCIsIFwiYmFzZTY0XCIpO1xuICAgICAgICBsZXQgZW5kcG9pbnRTdWZmaXggPSBcIlwiO1xuICAgICAgICAvLyBHZXQgYWNjb3VudCBuYW1lIGFuZCBrZXlcbiAgICAgICAgYWNjb3VudE5hbWUgPSBnZXRWYWx1ZUluQ29ublN0cmluZyhjb25uZWN0aW9uU3RyaW5nLCBcIkFjY291bnROYW1lXCIpO1xuICAgICAgICBhY2NvdW50S2V5ID0gQnVmZmVyLmZyb20oZ2V0VmFsdWVJbkNvbm5TdHJpbmcoY29ubmVjdGlvblN0cmluZywgXCJBY2NvdW50S2V5XCIpLCBcImJhc2U2NFwiKTtcbiAgICAgICAgaWYgKCFibG9iRW5kcG9pbnQpIHtcbiAgICAgICAgICAgIC8vIEJsb2JFbmRwb2ludCBpcyBub3QgcHJlc2VudCBpbiB0aGUgQWNjb3VudCBjb25uZWN0aW9uIHN0cmluZ1xuICAgICAgICAgICAgLy8gQ2FuIGJlIG9idGFpbmVkIGZyb20gYCR7ZGVmYXVsdEVuZHBvaW50c1Byb3RvY29sfTovLyR7YWNjb3VudE5hbWV9LmJsb2IuJHtlbmRwb2ludFN1ZmZpeH1gXG4gICAgICAgICAgICBkZWZhdWx0RW5kcG9pbnRzUHJvdG9jb2wgPSBnZXRWYWx1ZUluQ29ublN0cmluZyhjb25uZWN0aW9uU3RyaW5nLCBcIkRlZmF1bHRFbmRwb2ludHNQcm90b2NvbFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHByb3RvY29sID0gZGVmYXVsdEVuZHBvaW50c1Byb3RvY29sLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAocHJvdG9jb2wgIT09IFwiaHR0cHNcIiAmJiBwcm90b2NvbCAhPT0gXCJodHRwXCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIERlZmF1bHRFbmRwb2ludHNQcm90b2NvbCBpbiB0aGUgcHJvdmlkZWQgQ29ubmVjdGlvbiBTdHJpbmcuIEV4cGVjdGluZyAnaHR0cHMnIG9yICdodHRwJ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVuZHBvaW50U3VmZml4ID0gZ2V0VmFsdWVJbkNvbm5TdHJpbmcoY29ubmVjdGlvblN0cmluZywgXCJFbmRwb2ludFN1ZmZpeFwiKTtcbiAgICAgICAgICAgIGlmICghZW5kcG9pbnRTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIEVuZHBvaW50U3VmZml4IGluIHRoZSBwcm92aWRlZCBDb25uZWN0aW9uIFN0cmluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJsb2JFbmRwb2ludCA9IGAke2RlZmF1bHRFbmRwb2ludHNQcm90b2NvbH06Ly8ke2FjY291bnROYW1lfS5ibG9iLiR7ZW5kcG9pbnRTdWZmaXh9YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFjY291bnROYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIEFjY291bnROYW1lIGluIHRoZSBwcm92aWRlZCBDb25uZWN0aW9uIFN0cmluZ1wiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhY2NvdW50S2V5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBBY2NvdW50S2V5IGluIHRoZSBwcm92aWRlZCBDb25uZWN0aW9uIFN0cmluZ1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogXCJBY2NvdW50Q29ublN0cmluZ1wiLFxuICAgICAgICAgICAgdXJsOiBibG9iRW5kcG9pbnQsXG4gICAgICAgICAgICBhY2NvdW50TmFtZSxcbiAgICAgICAgICAgIGFjY291bnRLZXksXG4gICAgICAgICAgICBwcm94eVVyaSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIFNBUyBjb25uZWN0aW9uIHN0cmluZ1xuICAgICAgICBjb25zdCBhY2NvdW50U2FzID0gZ2V0VmFsdWVJbkNvbm5TdHJpbmcoY29ubmVjdGlvblN0cmluZywgXCJTaGFyZWRBY2Nlc3NTaWduYXR1cmVcIik7XG4gICAgICAgIGxldCBhY2NvdW50TmFtZSA9IGdldFZhbHVlSW5Db25uU3RyaW5nKGNvbm5lY3Rpb25TdHJpbmcsIFwiQWNjb3VudE5hbWVcIik7XG4gICAgICAgIC8vIGlmIGFjY291bnROYW1lIGlzIGVtcHR5LCB0cnkgdG8gcmVhZCBpdCBmcm9tIEJsb2JFbmRwb2ludFxuICAgICAgICBpZiAoIWFjY291bnROYW1lKSB7XG4gICAgICAgICAgICBhY2NvdW50TmFtZSA9IGdldEFjY291bnROYW1lRnJvbVVybChibG9iRW5kcG9pbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYmxvYkVuZHBvaW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIEJsb2JFbmRwb2ludCBpbiB0aGUgcHJvdmlkZWQgU0FTIENvbm5lY3Rpb24gU3RyaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFhY2NvdW50U2FzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFNoYXJlZEFjY2Vzc1NpZ25hdHVyZSBpbiB0aGUgcHJvdmlkZWQgU0FTIENvbm5lY3Rpb24gU3RyaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGtpbmQ6IFwiU0FTQ29ublN0cmluZ1wiLCB1cmw6IGJsb2JFbmRwb2ludCwgYWNjb3VudE5hbWUsIGFjY291bnRTYXMgfTtcbiAgICB9XG59XG4vKipcbiAqIEludGVybmFsIGVzY2FwZSBtZXRob2QgaW1wbGVtZW50ZWQgU3RyYXRlZ3kgVHdvIG1lbnRpb25lZCBpbiBlc2NhcGVVUkwoKSBkZXNjcmlwdGlvbi5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZSh0ZXh0KSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KVxuICAgICAgICAucmVwbGFjZSgvJTJGL2csIFwiL1wiKSAvLyBEb24ndCBlc2NhcGUgZm9yIFwiL1wiXG4gICAgICAgIC5yZXBsYWNlKC8nL2csIFwiJTI3XCIpIC8vIEVzY2FwZSBmb3IgXCInXCJcbiAgICAgICAgLnJlcGxhY2UoL1xcKy9nLCBcIiUyMFwiKVxuICAgICAgICAucmVwbGFjZSgvJTI1L2csIFwiJVwiKTsgLy8gUmV2ZXJ0IGVuY29kZWQgXCIlXCJcbn1cbi8qKlxuICogQXBwZW5kIGEgc3RyaW5nIHRvIFVSTCBwYXRoLiBXaWxsIHJlbW92ZSBkdXBsaWNhdGVkIFwiL1wiIGluIGZyb250IG9mIHRoZSBzdHJpbmdcbiAqIHdoZW4gVVJMIHBhdGggZW5kcyB3aXRoIGEgXCIvXCIuXG4gKlxuICogQHBhcmFtIHVybCAtIFNvdXJjZSBVUkwgc3RyaW5nXG4gKiBAcGFyYW0gbmFtZSAtIFN0cmluZyB0byBiZSBhcHBlbmRlZCB0byBVUkxcbiAqIEByZXR1cm5zIEFuIHVwZGF0ZWQgVVJMIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kVG9VUkxQYXRoKHVybCwgbmFtZSkge1xuICAgIGNvbnN0IHVybFBhcnNlZCA9IFVSTEJ1aWxkZXIucGFyc2UodXJsKTtcbiAgICBsZXQgcGF0aCA9IHVybFBhcnNlZC5nZXRQYXRoKCk7XG4gICAgcGF0aCA9IHBhdGggPyAocGF0aC5lbmRzV2l0aChcIi9cIikgPyBgJHtwYXRofSR7bmFtZX1gIDogYCR7cGF0aH0vJHtuYW1lfWApIDogbmFtZTtcbiAgICB1cmxQYXJzZWQuc2V0UGF0aChwYXRoKTtcbiAgICBjb25zdCBub3JtYWxpemVkVXJsID0gbmV3IFVSTCh1cmxQYXJzZWQudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRVcmwudG9TdHJpbmcoKTtcbn1cbi8qKlxuICogU2V0IFVSTCBwYXJhbWV0ZXIgbmFtZSBhbmQgdmFsdWUuIElmIG5hbWUgZXhpc3RzIGluIFVSTCBwYXJhbWV0ZXJzLCBvbGQgdmFsdWVcbiAqIHdpbGwgYmUgcmVwbGFjZWQgYnkgbmFtZSBrZXkuIElmIG5vdCBwcm92aWRlIHZhbHVlLCB0aGUgcGFyYW1ldGVyIHdpbGwgYmUgZGVsZXRlZC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gU291cmNlIFVSTCBzdHJpbmdcbiAqIEBwYXJhbSBuYW1lIC0gUGFyYW1ldGVyIG5hbWVcbiAqIEBwYXJhbSB2YWx1ZSAtIFBhcmFtZXRlciB2YWx1ZVxuICogQHJldHVybnMgQW4gdXBkYXRlZCBVUkwgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRVUkxQYXJhbWV0ZXIodXJsLCBuYW1lLCB2YWx1ZSkge1xuICAgIGNvbnN0IHVybFBhcnNlZCA9IFVSTEJ1aWxkZXIucGFyc2UodXJsKTtcbiAgICB1cmxQYXJzZWQuc2V0UXVlcnlQYXJhbWV0ZXIobmFtZSwgdmFsdWUpO1xuICAgIHJldHVybiB1cmxQYXJzZWQudG9TdHJpbmcoKTtcbn1cbi8qKlxuICogR2V0IFVSTCBwYXJhbWV0ZXIgYnkgbmFtZS5cbiAqXG4gKiBAcGFyYW0gdXJsIC1cbiAqIEBwYXJhbSBuYW1lIC1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVSTFBhcmFtZXRlcih1cmwsIG5hbWUpIHtcbiAgICBjb25zdCB1cmxQYXJzZWQgPSBVUkxCdWlsZGVyLnBhcnNlKHVybCk7XG4gICAgcmV0dXJuIHVybFBhcnNlZC5nZXRRdWVyeVBhcmFtZXRlclZhbHVlKG5hbWUpO1xufVxuLyoqXG4gKiBTZXQgVVJMIGhvc3QuXG4gKlxuICogQHBhcmFtIHVybCAtIFNvdXJjZSBVUkwgc3RyaW5nXG4gKiBAcGFyYW0gaG9zdCAtIE5ldyBob3N0IHN0cmluZ1xuICogQHJldHVybnMgQW4gdXBkYXRlZCBVUkwgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRVUkxIb3N0KHVybCwgaG9zdCkge1xuICAgIGNvbnN0IHVybFBhcnNlZCA9IFVSTEJ1aWxkZXIucGFyc2UodXJsKTtcbiAgICB1cmxQYXJzZWQuc2V0SG9zdChob3N0KTtcbiAgICByZXR1cm4gdXJsUGFyc2VkLnRvU3RyaW5nKCk7XG59XG4vKipcbiAqIEdldCBVUkwgcGF0aCBmcm9tIGFuIFVSTCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHVybCAtIFNvdXJjZSBVUkwgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRVUkxQYXRoKHVybCkge1xuICAgIGNvbnN0IHVybFBhcnNlZCA9IFVSTEJ1aWxkZXIucGFyc2UodXJsKTtcbiAgICByZXR1cm4gdXJsUGFyc2VkLmdldFBhdGgoKTtcbn1cbi8qKlxuICogR2V0IFVSTCBzY2hlbWUgZnJvbSBhbiBVUkwgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBTb3VyY2UgVVJMIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VVJMU2NoZW1lKHVybCkge1xuICAgIGNvbnN0IHVybFBhcnNlZCA9IFVSTEJ1aWxkZXIucGFyc2UodXJsKTtcbiAgICByZXR1cm4gdXJsUGFyc2VkLmdldFNjaGVtZSgpO1xufVxuLyoqXG4gKiBHZXQgVVJMIHBhdGggYW5kIHF1ZXJ5IGZyb20gYW4gVVJMIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gU291cmNlIFVSTCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVSTFBhdGhBbmRRdWVyeSh1cmwpIHtcbiAgICBjb25zdCB1cmxQYXJzZWQgPSBVUkxCdWlsZGVyLnBhcnNlKHVybCk7XG4gICAgY29uc3QgcGF0aFN0cmluZyA9IHVybFBhcnNlZC5nZXRQYXRoKCk7XG4gICAgaWYgKCFwYXRoU3RyaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCB1cmwgd2l0aG91dCB2YWxpZCBwYXRoLlwiKTtcbiAgICB9XG4gICAgbGV0IHF1ZXJ5U3RyaW5nID0gdXJsUGFyc2VkLmdldFF1ZXJ5KCkgfHwgXCJcIjtcbiAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5U3RyaW5nLnRyaW0oKTtcbiAgICBpZiAocXVlcnlTdHJpbmcgIT09IFwiXCIpIHtcbiAgICAgICAgcXVlcnlTdHJpbmcgPSBxdWVyeVN0cmluZy5zdGFydHNXaXRoKFwiP1wiKSA/IHF1ZXJ5U3RyaW5nIDogYD8ke3F1ZXJ5U3RyaW5nfWA7IC8vIEVuc3VyZSBxdWVyeSBzdHJpbmcgc3RhcnQgd2l0aCAnPydcbiAgICB9XG4gICAgcmV0dXJuIGAke3BhdGhTdHJpbmd9JHtxdWVyeVN0cmluZ31gO1xufVxuLyoqXG4gKiBHZXQgVVJMIHF1ZXJ5IGtleSB2YWx1ZSBwYWlycyBmcm9tIGFuIFVSTCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHVybCAtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRVUkxRdWVyaWVzKHVybCkge1xuICAgIGxldCBxdWVyeVN0cmluZyA9IFVSTEJ1aWxkZXIucGFyc2UodXJsKS5nZXRRdWVyeSgpO1xuICAgIGlmICghcXVlcnlTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5U3RyaW5nLnRyaW0oKTtcbiAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5U3RyaW5nLnN0YXJ0c1dpdGgoXCI/XCIpID8gcXVlcnlTdHJpbmcuc3Vic3RyKDEpIDogcXVlcnlTdHJpbmc7XG4gICAgbGV0IHF1ZXJ5U3ViU3RyaW5ncyA9IHF1ZXJ5U3RyaW5nLnNwbGl0KFwiJlwiKTtcbiAgICBxdWVyeVN1YlN0cmluZ3MgPSBxdWVyeVN1YlN0cmluZ3MuZmlsdGVyKCh2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleE9mRXF1YWwgPSB2YWx1ZS5pbmRleE9mKFwiPVwiKTtcbiAgICAgICAgY29uc3QgbGFzdEluZGV4T2ZFcXVhbCA9IHZhbHVlLmxhc3RJbmRleE9mKFwiPVwiKTtcbiAgICAgICAgcmV0dXJuIChpbmRleE9mRXF1YWwgPiAwICYmIGluZGV4T2ZFcXVhbCA9PT0gbGFzdEluZGV4T2ZFcXVhbCAmJiBsYXN0SW5kZXhPZkVxdWFsIDwgdmFsdWUubGVuZ3RoIC0gMSk7XG4gICAgfSk7XG4gICAgY29uc3QgcXVlcmllcyA9IHt9O1xuICAgIGZvciAoY29uc3QgcXVlcnlTdWJTdHJpbmcgb2YgcXVlcnlTdWJTdHJpbmdzKSB7XG4gICAgICAgIGNvbnN0IHNwbGl0UmVzdWx0cyA9IHF1ZXJ5U3ViU3RyaW5nLnNwbGl0KFwiPVwiKTtcbiAgICAgICAgY29uc3Qga2V5ID0gc3BsaXRSZXN1bHRzWzBdO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHNwbGl0UmVzdWx0c1sxXTtcbiAgICAgICAgcXVlcmllc1trZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBxdWVyaWVzO1xufVxuLyoqXG4gKiBBcHBlbmQgYSBzdHJpbmcgdG8gVVJMIHF1ZXJ5LlxuICpcbiAqIEBwYXJhbSB1cmwgLSBTb3VyY2UgVVJMIHN0cmluZy5cbiAqIEBwYXJhbSBxdWVyeVBhcnRzIC0gU3RyaW5nIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBVUkwgcXVlcnkuXG4gKiBAcmV0dXJucyBBbiB1cGRhdGVkIFVSTCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRUb1VSTFF1ZXJ5KHVybCwgcXVlcnlQYXJ0cykge1xuICAgIGNvbnN0IHVybFBhcnNlZCA9IFVSTEJ1aWxkZXIucGFyc2UodXJsKTtcbiAgICBsZXQgcXVlcnkgPSB1cmxQYXJzZWQuZ2V0UXVlcnkoKTtcbiAgICBpZiAocXVlcnkpIHtcbiAgICAgICAgcXVlcnkgKz0gXCImXCIgKyBxdWVyeVBhcnRzO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeVBhcnRzO1xuICAgIH1cbiAgICB1cmxQYXJzZWQuc2V0UXVlcnkocXVlcnkpO1xuICAgIHJldHVybiB1cmxQYXJzZWQudG9TdHJpbmcoKTtcbn1cbi8qKlxuICogUm91bmRzIGEgZGF0ZSBvZmYgdG8gc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtXG4gKiBAcGFyYW0gd2l0aE1pbGxpc2Vjb25kcyAtIElmIHRydWUsIFlZWVktTU0tRERUaGg6bW06c3MuZmZmZmZmZlogd2lsbCBiZSByZXR1cm5lZDtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZmFsc2UsIFlZWVktTU0tRERUaGg6bW06c3NaIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBAcmV0dXJucyBEYXRlIHN0cmluZyBpbiBJU084MDYxIGZvcm1hdCwgd2l0aCBvciB3aXRob3V0IDcgbWlsbGlzZWNvbmRzIGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ1bmNhdGVkSVNPODA2MURhdGUoZGF0ZSwgd2l0aE1pbGxpc2Vjb25kcyA9IHRydWUpIHtcbiAgICAvLyBEYXRlLnRvSVNPU3RyaW5nKCkgd2lsbCByZXR1cm4gbGlrZSBcIjIwMTgtMTAtMjlUMDY6MzQ6MzYuMTM5WlwiXG4gICAgY29uc3QgZGF0ZVN0cmluZyA9IGRhdGUudG9JU09TdHJpbmcoKTtcbiAgICByZXR1cm4gd2l0aE1pbGxpc2Vjb25kc1xuICAgICAgICA/IGRhdGVTdHJpbmcuc3Vic3RyaW5nKDAsIGRhdGVTdHJpbmcubGVuZ3RoIC0gMSkgKyBcIjAwMDBcIiArIFwiWlwiXG4gICAgICAgIDogZGF0ZVN0cmluZy5zdWJzdHJpbmcoMCwgZGF0ZVN0cmluZy5sZW5ndGggLSA1KSArIFwiWlwiO1xufVxuLyoqXG4gKiBCYXNlNjQgZW5jb2RlLlxuICpcbiAqIEBwYXJhbSBjb250ZW50IC1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NGVuY29kZShjb250ZW50KSB7XG4gICAgcmV0dXJuICFpc05vZGUgPyBidG9hKGNvbnRlbnQpIDogQnVmZmVyLmZyb20oY29udGVudCkudG9TdHJpbmcoXCJiYXNlNjRcIik7XG59XG4vKipcbiAqIEJhc2U2NCBkZWNvZGUuXG4gKlxuICogQHBhcmFtIGVuY29kZWRTdHJpbmcgLVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0ZGVjb2RlKGVuY29kZWRTdHJpbmcpIHtcbiAgICByZXR1cm4gIWlzTm9kZSA/IGF0b2IoZW5jb2RlZFN0cmluZykgOiBCdWZmZXIuZnJvbShlbmNvZGVkU3RyaW5nLCBcImJhc2U2NFwiKS50b1N0cmluZygpO1xufVxuLyoqXG4gKiBHZW5lcmF0ZSBhIDY0IGJ5dGVzIGJhc2U2NCBibG9jayBJRCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGJsb2NrSW5kZXggLVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVCbG9ja0lEKGJsb2NrSURQcmVmaXgsIGJsb2NrSW5kZXgpIHtcbiAgICAvLyBUbyBnZW5lcmF0ZSBhIDY0IGJ5dGVzIGJhc2U2NCBzdHJpbmcsIHNvdXJjZSBzdHJpbmcgc2hvdWxkIGJlIDQ4XG4gICAgY29uc3QgbWF4U291cmNlU3RyaW5nTGVuZ3RoID0gNDg7XG4gICAgLy8gQSBibG9iIGNhbiBoYXZlIGEgbWF4aW11bSBvZiAxMDAsMDAwIHVuY29tbWl0dGVkIGJsb2NrcyBhdCBhbnkgZ2l2ZW4gdGltZVxuICAgIGNvbnN0IG1heEJsb2NrSW5kZXhMZW5ndGggPSA2O1xuICAgIGNvbnN0IG1heEFsbG93ZWRCbG9ja0lEUHJlZml4TGVuZ3RoID0gbWF4U291cmNlU3RyaW5nTGVuZ3RoIC0gbWF4QmxvY2tJbmRleExlbmd0aDtcbiAgICBpZiAoYmxvY2tJRFByZWZpeC5sZW5ndGggPiBtYXhBbGxvd2VkQmxvY2tJRFByZWZpeExlbmd0aCkge1xuICAgICAgICBibG9ja0lEUHJlZml4ID0gYmxvY2tJRFByZWZpeC5zbGljZSgwLCBtYXhBbGxvd2VkQmxvY2tJRFByZWZpeExlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IHJlcyA9IGJsb2NrSURQcmVmaXggK1xuICAgICAgICBwYWRTdGFydChibG9ja0luZGV4LnRvU3RyaW5nKCksIG1heFNvdXJjZVN0cmluZ0xlbmd0aCAtIGJsb2NrSURQcmVmaXgubGVuZ3RoLCBcIjBcIik7XG4gICAgcmV0dXJuIGJhc2U2NGVuY29kZShyZXMpO1xufVxuLyoqXG4gKiBEZWxheSBzcGVjaWZpZWQgdGltZSBpbnRlcnZhbC5cbiAqXG4gKiBAcGFyYW0gdGltZUluTXMgLVxuICogQHBhcmFtIGFib3J0ZXIgLVxuICogQHBhcmFtIGFib3J0RXJyb3IgLVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsYXkodGltZUluTXMsIGFib3J0ZXIsIGFib3J0RXJyb3IpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0ICovXG4gICAgICAgIGxldCB0aW1lb3V0O1xuICAgICAgICBjb25zdCBhYm9ydEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVqZWN0KGFib3J0RXJyb3IpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXNvbHZlSGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChhYm9ydGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBhYm9ydGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydEhhbmRsZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9O1xuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChyZXNvbHZlSGFuZGxlciwgdGltZUluTXMpO1xuICAgICAgICBpZiAoYWJvcnRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhYm9ydGVyLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydEhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vKipcbiAqIFN0cmluZy5wcm90b3R5cGUucGFkU3RhcnQoKVxuICpcbiAqIEBwYXJhbSBjdXJyZW50U3RyaW5nIC1cbiAqIEBwYXJhbSB0YXJnZXRMZW5ndGggLVxuICogQHBhcmFtIHBhZFN0cmluZyAtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYWRTdGFydChjdXJyZW50U3RyaW5nLCB0YXJnZXRMZW5ndGgsIHBhZFN0cmluZyA9IFwiIFwiKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogVFMgZG9lc24ndCBrbm93IHRoaXMgY29kZSBuZWVkcyB0byBydW4gZG93bmxldmVsIHNvbWV0aW1lc1xuICAgIGlmIChTdHJpbmcucHJvdG90eXBlLnBhZFN0YXJ0KSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50U3RyaW5nLnBhZFN0YXJ0KHRhcmdldExlbmd0aCwgcGFkU3RyaW5nKTtcbiAgICB9XG4gICAgcGFkU3RyaW5nID0gcGFkU3RyaW5nIHx8IFwiIFwiO1xuICAgIGlmIChjdXJyZW50U3RyaW5nLmxlbmd0aCA+IHRhcmdldExlbmd0aCkge1xuICAgICAgICByZXR1cm4gY3VycmVudFN0cmluZztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRhcmdldExlbmd0aCA9IHRhcmdldExlbmd0aCAtIGN1cnJlbnRTdHJpbmcubGVuZ3RoO1xuICAgICAgICBpZiAodGFyZ2V0TGVuZ3RoID4gcGFkU3RyaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgcGFkU3RyaW5nICs9IHBhZFN0cmluZy5yZXBlYXQodGFyZ2V0TGVuZ3RoIC8gcGFkU3RyaW5nLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZFN0cmluZy5zbGljZSgwLCB0YXJnZXRMZW5ndGgpICsgY3VycmVudFN0cmluZztcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVVUkwodXJsKSB7XG4gICAgbGV0IHNhZmVVUkwgPSB1cmw7XG4gICAgaWYgKGdldFVSTFBhcmFtZXRlcihzYWZlVVJMLCBVUkxDb25zdGFudHMuUGFyYW1ldGVycy5TSUdOQVRVUkUpKSB7XG4gICAgICAgIHNhZmVVUkwgPSBzZXRVUkxQYXJhbWV0ZXIoc2FmZVVSTCwgVVJMQ29uc3RhbnRzLlBhcmFtZXRlcnMuU0lHTkFUVVJFLCBcIioqKioqXCIpO1xuICAgIH1cbiAgICByZXR1cm4gc2FmZVVSTDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUhlYWRlcnMob3JpZ2luYWxIZWFkZXIpIHtcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XG4gICAgZm9yIChjb25zdCBoZWFkZXIgb2Ygb3JpZ2luYWxIZWFkZXIuaGVhZGVyc0FycmF5KCkpIHtcbiAgICAgICAgaWYgKGhlYWRlci5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IEhlYWRlckNvbnN0YW50cy5BVVRIT1JJWkFUSU9OLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGhlYWRlcnMuc2V0KGhlYWRlci5uYW1lLCBcIioqKioqXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGhlYWRlci5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IEhlYWRlckNvbnN0YW50cy5YX01TX0NPUFlfU09VUkNFKSB7XG4gICAgICAgICAgICBoZWFkZXJzLnNldChoZWFkZXIubmFtZSwgc2FuaXRpemVVUkwoaGVhZGVyLnZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoZWFkZXJzLnNldChoZWFkZXIubmFtZSwgaGVhZGVyLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGVhZGVycztcbn1cbi8qKlxuICogSWYgdHdvIHN0cmluZ3MgYXJlIGVxdWFsIHdoZW4gY29tcGFyZWQgY2FzZSBpbnNlbnNpdGl2ZS5cbiAqXG4gKiBAcGFyYW0gc3RyMSAtXG4gKiBAcGFyYW0gc3RyMiAtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpRXF1YWwoc3RyMSwgc3RyMikge1xuICAgIHJldHVybiBzdHIxLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IHN0cjIudG9Mb2NhbGVMb3dlckNhc2UoKTtcbn1cbi8qKlxuICogRXh0cmFjdHMgYWNjb3VudCBuYW1lIGZyb20gdGhlIHVybFxuICogQHBhcmFtIHVybCAtIHVybCB0byBleHRyYWN0IHRoZSBhY2NvdW50IG5hbWUgZnJvbVxuICogQHJldHVybnMgd2l0aCB0aGUgYWNjb3VudCBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY2NvdW50TmFtZUZyb21VcmwodXJsKSB7XG4gICAgY29uc3QgcGFyc2VkVXJsID0gVVJMQnVpbGRlci5wYXJzZSh1cmwpO1xuICAgIGxldCBhY2NvdW50TmFtZTtcbiAgICB0cnkge1xuICAgICAgICBpZiAocGFyc2VkVXJsLmdldEhvc3QoKS5zcGxpdChcIi5cIilbMV0gPT09IFwiYmxvYlwiKSB7XG4gICAgICAgICAgICAvLyBgJHtkZWZhdWx0RW5kcG9pbnRzUHJvdG9jb2x9Oi8vJHthY2NvdW50TmFtZX0uYmxvYi4ke2VuZHBvaW50U3VmZml4fWA7XG4gICAgICAgICAgICBhY2NvdW50TmFtZSA9IHBhcnNlZFVybC5nZXRIb3N0KCkuc3BsaXQoXCIuXCIpWzBdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzSXBFbmRwb2ludFN0eWxlKHBhcnNlZFVybCkpIHtcbiAgICAgICAgICAgIC8vIElQdjQvSVB2NiBhZGRyZXNzIGhvc3RzLi4uIEV4YW1wbGUgLSBodHRwOi8vMTkyLjAuMC4xMDoxMDAwMS9kZXZzdG9yZWFjY291bnQxL1xuICAgICAgICAgICAgLy8gU2luZ2xlIHdvcmQgZG9tYWluIHdpdGhvdXQgYSBbZG90XSBpbiB0aGUgZW5kcG9pbnQuLi4gRXhhbXBsZSAtIGh0dHA6Ly9sb2NhbGhvc3Q6MTAwMDEvZGV2c3RvcmVhY2NvdW50MS9cbiAgICAgICAgICAgIC8vIC5nZXRQYXRoKCkgLT4gL2RldnN0b3JlYWNjb3VudDEvXG4gICAgICAgICAgICBhY2NvdW50TmFtZSA9IHBhcnNlZFVybC5nZXRQYXRoKCkuc3BsaXQoXCIvXCIpWzFdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQ3VzdG9tIGRvbWFpbiBjYXNlOiBcImh0dHBzOi8vY3VzdG9tZG9tYWluLmNvbS9jb250YWluZXJuYW1lL2Jsb2JcIi5cbiAgICAgICAgICAgIGFjY291bnROYW1lID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjb3VudE5hbWU7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gZXh0cmFjdCBhY2NvdW50TmFtZSB3aXRoIHByb3ZpZGVkIGluZm9ybWF0aW9uLlwiKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJcEVuZHBvaW50U3R5bGUocGFyc2VkVXJsKSB7XG4gICAgaWYgKHBhcnNlZFVybC5nZXRIb3N0KCkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGhvc3QgPSBwYXJzZWRVcmwuZ2V0SG9zdCgpICsgKHBhcnNlZFVybC5nZXRQb3J0KCkgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBcIjpcIiArIHBhcnNlZFVybC5nZXRQb3J0KCkpO1xuICAgIC8vIENhc2UgMTogSXB2NiwgdXNlIGEgYnJvYWQgcmVnZXggdG8gZmluZCBvdXQgY2FuZGlkYXRlcyB3aG9zZSBob3N0IGNvbnRhaW5zIHR3byAnOicuXG4gICAgLy8gQ2FzZSAyOiBsb2NhbGhvc3QoOnBvcnQpIG9yIGhvc3QuZG9ja2VyLmludGVybmFsLCB1c2UgYnJvYWQgcmVnZXggdG8gbWF0Y2ggcG9ydCBwYXJ0LlxuICAgIC8vIENhc2UgMzogSXB2NCwgdXNlIGJyb2FkIHJlZ2V4IHdoaWNoIGp1c3QgY2hlY2sgaWYgaG9zdCBjb250YWlucyBJcHY0LlxuICAgIC8vIEZvciB2YWxpZCBob3N0IHBsZWFzZSByZWZlciB0byBodHRwczovL21hbjcub3JnL2xpbnV4L21hbi1wYWdlcy9tYW43L2hvc3RuYW1lLjcuaHRtbC5cbiAgICByZXR1cm4gKC9eLio6Lio6LiokfF4obG9jYWxob3N0fGhvc3QuZG9ja2VyLmludGVybmFsKSg6WzAtOV0rKT8kfF4oXFxkfFsxLTldXFxkfDFcXGRcXGR8MlswLTRdXFxkfDI1WzAtNV0pKFxcLihcXGR8WzEtOV1cXGR8MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC01XSkpezN9KDpbMC05XSspPyQvLnRlc3QoaG9zdCkgfHxcbiAgICAgICAgKHBhcnNlZFVybC5nZXRQb3J0KCkgIT09IHVuZGVmaW5lZCAmJiBQYXRoU3R5bGVQb3J0cy5pbmNsdWRlcyhwYXJzZWRVcmwuZ2V0UG9ydCgpKSkpO1xufVxuLyoqXG4gKiBDb252ZXJ0IFRhZ3MgdG8gZW5jb2RlZCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHRhZ3MgLVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9CbG9iVGFnc1N0cmluZyh0YWdzKSB7XG4gICAgaWYgKHRhZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCB0YWdQYWlycyA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IGluIHRhZ3MpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YWdzLCBrZXkpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRhZ3Nba2V5XTtcbiAgICAgICAgICAgIHRhZ1BhaXJzLnB1c2goYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGtleSl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFnUGFpcnMuam9pbihcIiZcIik7XG59XG4vKipcbiAqIENvbnZlcnQgVGFncyB0eXBlIHRvIEJsb2JUYWdzLlxuICpcbiAqIEBwYXJhbSB0YWdzIC1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQmxvYlRhZ3ModGFncykge1xuICAgIGlmICh0YWdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcmVzID0ge1xuICAgICAgICBibG9iVGFnU2V0OiBbXSxcbiAgICB9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIHRhZ3MpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YWdzLCBrZXkpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRhZ3Nba2V5XTtcbiAgICAgICAgICAgIHJlcy5ibG9iVGFnU2V0LnB1c2goe1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG4vKipcbiAqIENvdmVydCBCbG9iVGFncyB0byBUYWdzIHR5cGUuXG4gKlxuICogQHBhcmFtIHRhZ3MgLVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9UYWdzKHRhZ3MpIHtcbiAgICBpZiAodGFncyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHJlcyA9IHt9O1xuICAgIGZvciAoY29uc3QgYmxvYlRhZyBvZiB0YWdzLmJsb2JUYWdTZXQpIHtcbiAgICAgICAgcmVzW2Jsb2JUYWcua2V5XSA9IGJsb2JUYWcudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG4vKipcbiAqIENvbnZlcnQgQmxvYlF1ZXJ5VGV4dENvbmZpZ3VyYXRpb24gdG8gUXVlcnlTZXJpYWxpemF0aW9uIHR5cGUuXG4gKlxuICogQHBhcmFtIHRleHRDb25maWd1cmF0aW9uIC1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUXVlcnlTZXJpYWxpemF0aW9uKHRleHRDb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKHRleHRDb25maWd1cmF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgc3dpdGNoICh0ZXh0Q29uZmlndXJhdGlvbi5raW5kKSB7XG4gICAgICAgIGNhc2UgXCJjc3ZcIjpcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZm9ybWF0OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZGVsaW1pdGVkXCIsXG4gICAgICAgICAgICAgICAgICAgIGRlbGltaXRlZFRleHRDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5TZXBhcmF0b3I6IHRleHRDb25maWd1cmF0aW9uLmNvbHVtblNlcGFyYXRvciB8fCBcIixcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkUXVvdGU6IHRleHRDb25maWd1cmF0aW9uLmZpZWxkUXVvdGUgfHwgXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFNlcGFyYXRvcjogdGV4dENvbmZpZ3VyYXRpb24ucmVjb3JkU2VwYXJhdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlQ2hhcjogdGV4dENvbmZpZ3VyYXRpb24uZXNjYXBlQ2hhcmFjdGVyIHx8IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzUHJlc2VudDogdGV4dENvbmZpZ3VyYXRpb24uaGFzSGVhZGVycyB8fCBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZm9ybWF0OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwianNvblwiLFxuICAgICAgICAgICAgICAgICAgICBqc29uVGV4dENvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFNlcGFyYXRvcjogdGV4dENvbmZpZ3VyYXRpb24ucmVjb3JkU2VwYXJhdG9yLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICBjYXNlIFwiYXJyb3dcIjpcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZm9ybWF0OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyb3dcIixcbiAgICAgICAgICAgICAgICAgICAgYXJyb3dDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHRleHRDb25maWd1cmF0aW9uLnNjaGVtYSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgY2FzZSBcInBhcnF1ZXRcIjpcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZm9ybWF0OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwicGFycXVldFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJJbnZhbGlkIEJsb2JRdWVyeVRleHRDb25maWd1cmF0aW9uLlwiKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VPYmplY3RSZXBsaWNhdGlvblJlY29yZChvYmplY3RSZXBsaWNhdGlvblJlY29yZCkge1xuICAgIGlmICghb2JqZWN0UmVwbGljYXRpb25SZWNvcmQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKFwicG9saWN5LWlkXCIgaW4gb2JqZWN0UmVwbGljYXRpb25SZWNvcmQpIHtcbiAgICAgICAgLy8gSWYgdGhlIGRpY3Rpb25hcnkgY29udGFpbnMgYSBrZXkgd2l0aCBwb2xpY3kgaWQsIHdlIGFyZSBub3QgcmVxdWlyZWQgdG8gZG8gYW55IHBhcnNpbmcgc2luY2VcbiAgICAgICAgLy8gdGhlIHBvbGljeSBpZCBzaG91bGQgYWxyZWFkeSBiZSBzdG9yZWQgaW4gdGhlIE9iamVjdFJlcGxpY2F0aW9uRGVzdGluYXRpb25Qb2xpY3lJZC5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgb3JQcm9wZXJ0aWVzID0gW107XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0UmVwbGljYXRpb25SZWNvcmQpIHtcbiAgICAgICAgY29uc3QgaWRzID0ga2V5LnNwbGl0KFwiX1wiKTtcbiAgICAgICAgY29uc3QgcG9saWN5UHJlZml4ID0gXCJvci1cIjtcbiAgICAgICAgaWYgKGlkc1swXS5zdGFydHNXaXRoKHBvbGljeVByZWZpeCkpIHtcbiAgICAgICAgICAgIGlkc1swXSA9IGlkc1swXS5zdWJzdHJpbmcocG9saWN5UHJlZml4Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZSA9IHtcbiAgICAgICAgICAgIHJ1bGVJZDogaWRzWzFdLFxuICAgICAgICAgICAgcmVwbGljYXRpb25TdGF0dXM6IG9iamVjdFJlcGxpY2F0aW9uUmVjb3JkW2tleV0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBvbGljeUluZGV4ID0gb3JQcm9wZXJ0aWVzLmZpbmRJbmRleCgocG9saWN5KSA9PiBwb2xpY3kucG9saWN5SWQgPT09IGlkc1swXSk7XG4gICAgICAgIGlmIChwb2xpY3lJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBvclByb3BlcnRpZXNbcG9saWN5SW5kZXhdLnJ1bGVzLnB1c2gocnVsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvclByb3BlcnRpZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgcG9saWN5SWQ6IGlkc1swXSxcbiAgICAgICAgICAgICAgICBydWxlczogW3J1bGVdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9yUHJvcGVydGllcztcbn1cbi8qKlxuICogQXR0YWNoIGEgVG9rZW5DcmVkZW50aWFsIHRvIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gdGhpbmcgLVxuICogQHBhcmFtIGNyZWRlbnRpYWwgLVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0YWNoQ3JlZGVudGlhbCh0aGluZywgY3JlZGVudGlhbCkge1xuICAgIHRoaW5nLmNyZWRlbnRpYWwgPSBjcmVkZW50aWFsO1xuICAgIHJldHVybiB0aGluZztcbn1cbmV4cG9ydCBmdW5jdGlvbiBodHRwQXV0aG9yaXphdGlvblRvU3RyaW5nKGh0dHBBdXRob3JpemF0aW9uKSB7XG4gICAgcmV0dXJuIGh0dHBBdXRob3JpemF0aW9uID8gaHR0cEF1dGhvcml6YXRpb24uc2NoZW1lICsgXCIgXCIgKyBodHRwQXV0aG9yaXphdGlvbi52YWx1ZSA6IHVuZGVmaW5lZDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBCbG9iTmFtZVRvU3RyaW5nKG5hbWUpIHtcbiAgICBpZiAobmFtZS5lbmNvZGVkKSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQobmFtZS5jb250ZW50KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBuYW1lLmNvbnRlbnQ7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIENvbnZlcnRJbnRlcm5hbFJlc3BvbnNlT2ZMaXN0QmxvYkZsYXQoaW50ZXJuYWxSZXNwb25zZSkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGludGVybmFsUmVzcG9uc2UpLCB7IHNlZ21lbnQ6IHtcbiAgICAgICAgICAgIGJsb2JJdGVtczogaW50ZXJuYWxSZXNwb25zZS5zZWdtZW50LmJsb2JJdGVtcy5tYXAoKGJsb2JJdGVtSW50ZXJhbCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJsb2JJdGVtID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBibG9iSXRlbUludGVyYWwpLCB7IG5hbWU6IEJsb2JOYW1lVG9TdHJpbmcoYmxvYkl0ZW1JbnRlcmFsLm5hbWUpIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBibG9iSXRlbTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9IH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIENvbnZlcnRJbnRlcm5hbFJlc3BvbnNlT2ZMaXN0QmxvYkhpZXJhcmNoeShpbnRlcm5hbFJlc3BvbnNlKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGludGVybmFsUmVzcG9uc2UpLCB7IHNlZ21lbnQ6IHtcbiAgICAgICAgICAgIGJsb2JQcmVmaXhlczogKF9hID0gaW50ZXJuYWxSZXNwb25zZS5zZWdtZW50LmJsb2JQcmVmaXhlcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1hcCgoYmxvYlByZWZpeEludGVybmFsKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmxvYlByZWZpeCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmxvYlByZWZpeEludGVybmFsKSwgeyBuYW1lOiBCbG9iTmFtZVRvU3RyaW5nKGJsb2JQcmVmaXhJbnRlcm5hbC5uYW1lKSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYmxvYlByZWZpeDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgYmxvYkl0ZW1zOiBpbnRlcm5hbFJlc3BvbnNlLnNlZ21lbnQuYmxvYkl0ZW1zLm1hcCgoYmxvYkl0ZW1JbnRlcmFsKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmxvYkl0ZW0gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJsb2JJdGVtSW50ZXJhbCksIHsgbmFtZTogQmxvYk5hbWVUb1N0cmluZyhibG9iSXRlbUludGVyYWwubmFtZSkgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJsb2JJdGVtO1xuICAgICAgICAgICAgfSksXG4gICAgICAgIH0gfSk7XG59XG5leHBvcnQgZnVuY3Rpb24qIEV4dHJhY3RQYWdlUmFuZ2VJbmZvSXRlbXMoZ2V0UGFnZVJhbmdlc1NlZ21lbnQpIHtcbiAgICBsZXQgcGFnZVJhbmdlID0gW107XG4gICAgbGV0IGNsZWFyUmFuZ2UgPSBbXTtcbiAgICBpZiAoZ2V0UGFnZVJhbmdlc1NlZ21lbnQucGFnZVJhbmdlKVxuICAgICAgICBwYWdlUmFuZ2UgPSBnZXRQYWdlUmFuZ2VzU2VnbWVudC5wYWdlUmFuZ2U7XG4gICAgaWYgKGdldFBhZ2VSYW5nZXNTZWdtZW50LmNsZWFyUmFuZ2UpXG4gICAgICAgIGNsZWFyUmFuZ2UgPSBnZXRQYWdlUmFuZ2VzU2VnbWVudC5jbGVhclJhbmdlO1xuICAgIGxldCBwYWdlUmFuZ2VJbmRleCA9IDA7XG4gICAgbGV0IGNsZWFyUmFuZ2VJbmRleCA9IDA7XG4gICAgd2hpbGUgKHBhZ2VSYW5nZUluZGV4IDwgcGFnZVJhbmdlLmxlbmd0aCAmJiBjbGVhclJhbmdlSW5kZXggPCBjbGVhclJhbmdlLmxlbmd0aCkge1xuICAgICAgICBpZiAocGFnZVJhbmdlW3BhZ2VSYW5nZUluZGV4XS5zdGFydCA8IGNsZWFyUmFuZ2VbY2xlYXJSYW5nZUluZGV4XS5zdGFydCkge1xuICAgICAgICAgICAgeWllbGQge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiBwYWdlUmFuZ2VbcGFnZVJhbmdlSW5kZXhdLnN0YXJ0LFxuICAgICAgICAgICAgICAgIGVuZDogcGFnZVJhbmdlW3BhZ2VSYW5nZUluZGV4XS5lbmQsXG4gICAgICAgICAgICAgICAgaXNDbGVhcjogZmFsc2UsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgKytwYWdlUmFuZ2VJbmRleDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHlpZWxkIHtcbiAgICAgICAgICAgICAgICBzdGFydDogY2xlYXJSYW5nZVtjbGVhclJhbmdlSW5kZXhdLnN0YXJ0LFxuICAgICAgICAgICAgICAgIGVuZDogY2xlYXJSYW5nZVtjbGVhclJhbmdlSW5kZXhdLmVuZCxcbiAgICAgICAgICAgICAgICBpc0NsZWFyOiB0cnVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICsrY2xlYXJSYW5nZUluZGV4O1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoOyBwYWdlUmFuZ2VJbmRleCA8IHBhZ2VSYW5nZS5sZW5ndGg7ICsrcGFnZVJhbmdlSW5kZXgpIHtcbiAgICAgICAgeWllbGQge1xuICAgICAgICAgICAgc3RhcnQ6IHBhZ2VSYW5nZVtwYWdlUmFuZ2VJbmRleF0uc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IHBhZ2VSYW5nZVtwYWdlUmFuZ2VJbmRleF0uZW5kLFxuICAgICAgICAgICAgaXNDbGVhcjogZmFsc2UsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGZvciAoOyBjbGVhclJhbmdlSW5kZXggPCBjbGVhclJhbmdlLmxlbmd0aDsgKytjbGVhclJhbmdlSW5kZXgpIHtcbiAgICAgICAgeWllbGQge1xuICAgICAgICAgICAgc3RhcnQ6IGNsZWFyUmFuZ2VbY2xlYXJSYW5nZUluZGV4XS5zdGFydCxcbiAgICAgICAgICAgIGVuZDogY2xlYXJSYW5nZVtjbGVhclJhbmdlSW5kZXhdLmVuZCxcbiAgICAgICAgICAgIGlzQ2xlYXI6IHRydWUsXG4gICAgICAgIH07XG4gICAgfVxufVxuLyoqXG4gKiBFc2NhcGUgdGhlIGJsb2JOYW1lIGJ1dCBrZWVwIHBhdGggc2VwYXJhdG9yICgnLycpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRXNjYXBlUGF0aChibG9iTmFtZSkge1xuICAgIGNvbnN0IHNwbGl0ID0gYmxvYk5hbWUuc3BsaXQoXCIvXCIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc3BsaXRbaV0gPSBlbmNvZGVVUklDb21wb25lbnQoc3BsaXRbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gc3BsaXQuam9pbihcIi9cIik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5jb21tb24uanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBCYXNlUmVxdWVzdFBvbGljeSwgaXNOb2RlLCB9IGZyb20gXCJAYXp1cmUvY29yZS1odHRwXCI7XG5pbXBvcnQgeyBIZWFkZXJDb25zdGFudHMsIFVSTENvbnN0YW50cyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IHNldFVSTFBhcmFtZXRlciB9IGZyb20gXCIuLi91dGlscy91dGlscy5jb21tb25cIjtcbi8qKlxuICogU3RvcmFnZUJyb3dzZXJQb2xpY3kgd2lsbCBoYW5kbGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBOb2RlLmpzIGFuZCBicm93c2VyIHJ1bnRpbWUsIGluY2x1ZGluZzpcbiAqXG4gKiAxLiBCcm93c2VycyBjYWNoZSBHRVQvSEVBRCByZXF1ZXN0cyBieSBhZGRpbmcgY29uZGl0aW9uYWwgaGVhZGVycyBzdWNoIGFzICdJRl9NT0RJRklFRF9TSU5DRScuXG4gKiBTdG9yYWdlQnJvd3NlclBvbGljeSBpcyBhIHBvbGljeSB1c2VkIHRvIGFkZCBhIHRpbWVzdGFtcCBxdWVyeSB0byBHRVQvSEVBRCByZXF1ZXN0IFVSTFxuICogdGh1cyBhdm9pZCB0aGUgYnJvd3NlciBjYWNoZS5cbiAqXG4gKiAyLiBSZW1vdmUgY29va2llIGhlYWRlciBmb3Igc2VjdXJpdHlcbiAqXG4gKiAzLiBSZW1vdmUgY29udGVudC1sZW5ndGggaGVhZGVyIHRvIGF2b2lkIGJyb3dzZXJzIHdhcm5pbmdcbiAqL1xuZXhwb3J0IGNsYXNzIFN0b3JhZ2VCcm93c2VyUG9saWN5IGV4dGVuZHMgQmFzZVJlcXVlc3RQb2xpY3kge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgU3RvcmFnZUJyb3dzZXJQb2xpY3kuXG4gICAgICogQHBhcmFtIG5leHRQb2xpY3kgLVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICAvLyBUaGUgYmFzZSBjbGFzcyBoYXMgYSBwcm90ZWN0ZWQgY29uc3RydWN0b3IuIEFkZGluZyBhIHB1YmxpYyBvbmUgdG8gZW5hYmxlIGNvbnN0cnVjdGluZyBvZiB0aGlzIGNsYXNzLlxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdXNlbGVzcy1jb25zdHJ1Y3RvciovXG4gICAgY29uc3RydWN0b3IobmV4dFBvbGljeSwgb3B0aW9ucykge1xuICAgICAgICBzdXBlcihuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgb3V0IHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCAtXG4gICAgICovXG4gICAgYXN5bmMgc2VuZFJlcXVlc3QocmVxdWVzdCkge1xuICAgICAgICBpZiAoaXNOb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbmV4dFBvbGljeS5zZW5kUmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVxdWVzdC5tZXRob2QudG9VcHBlckNhc2UoKSA9PT0gXCJHRVRcIiB8fCByZXF1ZXN0Lm1ldGhvZC50b1VwcGVyQ2FzZSgpID09PSBcIkhFQURcIikge1xuICAgICAgICAgICAgcmVxdWVzdC51cmwgPSBzZXRVUkxQYXJhbWV0ZXIocmVxdWVzdC51cmwsIFVSTENvbnN0YW50cy5QYXJhbWV0ZXJzLkZPUkNFX0JST1dTRVJfTk9fQ0FDSEUsIG5ldyBEYXRlKCkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJlcXVlc3QuaGVhZGVycy5yZW1vdmUoSGVhZGVyQ29uc3RhbnRzLkNPT0tJRSk7XG4gICAgICAgIC8vIEFjY29yZGluZyB0byBYSFIgc3RhbmRhcmRzLCBjb250ZW50LWxlbmd0aCBzaG91bGQgYmUgZnVsbHkgY29udHJvbGxlZCBieSBicm93c2Vyc1xuICAgICAgICByZXF1ZXN0LmhlYWRlcnMucmVtb3ZlKEhlYWRlckNvbnN0YW50cy5DT05URU5UX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9uZXh0UG9saWN5LnNlbmRSZXF1ZXN0KHJlcXVlc3QpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0b3JhZ2VCcm93c2VyUG9saWN5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgU3RvcmFnZUJyb3dzZXJQb2xpY3kgfSBmcm9tIFwiLi9wb2xpY2llcy9TdG9yYWdlQnJvd3NlclBvbGljeVwiO1xuZXhwb3J0IHsgU3RvcmFnZUJyb3dzZXJQb2xpY3kgfTtcbi8qKlxuICogU3RvcmFnZUJyb3dzZXJQb2xpY3lGYWN0b3J5IGlzIGEgZmFjdG9yeSBjbGFzcyBoZWxwaW5nIGdlbmVyYXRpbmcgU3RvcmFnZUJyb3dzZXJQb2xpY3kgb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0b3JhZ2VCcm93c2VyUG9saWN5RmFjdG9yeSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFN0b3JhZ2VCcm93c2VyUG9saWN5RmFjdG9yeSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmV4dFBvbGljeSAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGNyZWF0ZShuZXh0UG9saWN5LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUJyb3dzZXJQb2xpY3kobmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RvcmFnZUJyb3dzZXJQb2xpY3lGYWN0b3J5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL3NoaW1zLXB1YmxpYy5kLnRzXCIgLz5cbmNvbnN0IGxpc3RlbmVyc01hcCA9IG5ldyBXZWFrTWFwKCk7XG5jb25zdCBhYm9ydGVkTWFwID0gbmV3IFdlYWtNYXAoKTtcbi8qKlxuICogQW4gYWJvcnRlciBpbnN0YW5jZSBpbXBsZW1lbnRzIEFib3J0U2lnbmFsIGludGVyZmFjZSwgY2FuIGFib3J0IEhUVFAgcmVxdWVzdHMuXG4gKlxuICogLSBDYWxsIEFib3J0U2lnbmFsLm5vbmUgdG8gY3JlYXRlIGEgbmV3IEFib3J0U2lnbmFsIGluc3RhbmNlIHRoYXQgY2Fubm90IGJlIGNhbmNlbGxlZC5cbiAqIFVzZSBgQWJvcnRTaWduYWwubm9uZWAgd2hlbiB5b3UgYXJlIHJlcXVpcmVkIHRvIHBhc3MgYSBjYW5jZWxsYXRpb24gdG9rZW4gYnV0IHRoZSBvcGVyYXRpb25cbiAqIGNhbm5vdCBvciB3aWxsIG5vdCBldmVyIGJlIGNhbmNlbGxlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogQWJvcnQgd2l0aG91dCB0aW1lb3V0XG4gKiBgYGB0c1xuICogYXdhaXQgZG9Bc3luY1dvcmsoQWJvcnRTaWduYWwubm9uZSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEFib3J0U2lnbmFsIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIG9uYWJvcnQgZXZlbnQgbGlzdGVuZXIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9uYWJvcnQgPSBudWxsO1xuICAgICAgICBsaXN0ZW5lcnNNYXAuc2V0KHRoaXMsIFtdKTtcbiAgICAgICAgYWJvcnRlZE1hcC5zZXQodGhpcywgZmFsc2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGF0dXMgb2Ygd2hldGhlciBhYm9ydGVkIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBhYm9ydGVkKCkge1xuICAgICAgICBpZiAoIWFib3J0ZWRNYXAuaGFzKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXhwZWN0ZWQgYHRoaXNgIHRvIGJlIGFuIGluc3RhbmNlIG9mIEFib3J0U2lnbmFsLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWJvcnRlZE1hcC5nZXQodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQWJvcnRTaWduYWwgaW5zdGFuY2UgdGhhdCB3aWxsIG5ldmVyIGJlIGFib3J0ZWQuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IG5vbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWJvcnRTaWduYWwoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkZWQgbmV3IFwiYWJvcnRcIiBldmVudCBsaXN0ZW5lciwgb25seSBzdXBwb3J0IFwiYWJvcnRcIiBldmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBfdHlwZSAtIE9ubHkgc3VwcG9ydCBcImFib3J0XCIgZXZlbnRcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgLSBUaGUgbGlzdGVuZXIgdG8gYmUgYWRkZWRcbiAgICAgKi9cbiAgICBhZGRFdmVudExpc3RlbmVyKFxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gICAgX3R5cGUsIGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICghbGlzdGVuZXJzTWFwLmhhcyh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIGB0aGlzYCB0byBiZSBhbiBpbnN0YW5jZSBvZiBBYm9ydFNpZ25hbC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gbGlzdGVuZXJzTWFwLmdldCh0aGlzKTtcbiAgICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgXCJhYm9ydFwiIGV2ZW50IGxpc3RlbmVyLCBvbmx5IHN1cHBvcnQgXCJhYm9ydFwiIGV2ZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIF90eXBlIC0gT25seSBzdXBwb3J0IFwiYWJvcnRcIiBldmVudFxuICAgICAqIEBwYXJhbSBsaXN0ZW5lciAtIFRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkXG4gICAgICovXG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICAgIF90eXBlLCBsaXN0ZW5lcikge1xuICAgICAgICBpZiAoIWxpc3RlbmVyc01hcC5oYXModGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBgdGhpc2AgdG8gYmUgYW4gaW5zdGFuY2Ugb2YgQWJvcnRTaWduYWwuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGxpc3RlbmVyc01hcC5nZXQodGhpcyk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2hlcyBhIHN5bnRoZXRpYyBldmVudCB0byB0aGUgQWJvcnRTaWduYWwuXG4gICAgICovXG4gICAgZGlzcGF0Y2hFdmVudChfZXZlbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBpcyBhIHN0dWIgZGlzcGF0Y2hFdmVudCBpbXBsZW1lbnRhdGlvbiB0aGF0IHNob3VsZCBub3QgYmUgdXNlZC4gIEl0IG9ubHkgZXhpc3RzIGZvciB0eXBlLWNoZWNraW5nIHB1cnBvc2VzLlwiKTtcbiAgICB9XG59XG4vKipcbiAqIEhlbHBlciB0byB0cmlnZ2VyIGFuIGFib3J0IGV2ZW50IGltbWVkaWF0ZWx5LCB0aGUgb25hYm9ydCBhbmQgYWxsIGFib3J0IGV2ZW50IGxpc3RlbmVycyB3aWxsIGJlIHRyaWdnZXJlZC5cbiAqIFdpbGwgdHJ5IHRvIHRyaWdnZXIgYWJvcnQgZXZlbnQgZm9yIGFsbCBsaW5rZWQgQWJvcnRTaWduYWwgbm9kZXMuXG4gKlxuICogLSBJZiB0aGVyZSBpcyBhIHRpbWVvdXQsIHRoZSB0aW1lciB3aWxsIGJlIGNhbmNlbGxlZC5cbiAqIC0gSWYgYWJvcnRlZCBpcyB0cnVlLCBub3RoaW5nIHdpbGwgaGFwcGVuLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGF6dXJlL2F6dXJlLXNkay90cy11c2UtaW50ZXJmYWNlLXBhcmFtZXRlcnNcbmV4cG9ydCBmdW5jdGlvbiBhYm9ydFNpZ25hbChzaWduYWwpIHtcbiAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2lnbmFsLm9uYWJvcnQpIHtcbiAgICAgICAgc2lnbmFsLm9uYWJvcnQuY2FsbChzaWduYWwpO1xuICAgIH1cbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnNNYXAuZ2V0KHNpZ25hbCk7XG4gICAgaWYgKGxpc3RlbmVycykge1xuICAgICAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIGxpc3RlbmVycyBzbyBtdXRhdGlvbnMgdG8gdGhlIGFycmF5XG4gICAgICAgIC8vIChlLmcuIHZpYSByZW1vdmVMaXN0ZW5lciBjYWxscykgZG9uJ3QgYWZmZWN0IHRoZSBsaXN0ZW5lcnNcbiAgICAgICAgLy8gd2UgaW52b2tlLlxuICAgICAgICBsaXN0ZW5lcnMuc2xpY2UoKS5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgICAgbGlzdGVuZXIuY2FsbChzaWduYWwsIHsgdHlwZTogXCJhYm9ydFwiIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYWJvcnRlZE1hcC5zZXQoc2lnbmFsLCB0cnVlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFib3J0U2lnbmFsLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgQWJvcnRTaWduYWwsIGFib3J0U2lnbmFsIH0gZnJvbSBcIi4vQWJvcnRTaWduYWxcIjtcbi8qKlxuICogVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGhhcyBiZWVuIGFib3J0ZWQuXG4gKiBDaGVjayBmb3IgdGhpcyBlcnJvciBieSB0ZXN0aW5nIHRoZSBgbmFtZWAgdGhhdCB0aGUgbmFtZSBwcm9wZXJ0eSBvZiB0aGVcbiAqIGVycm9yIG1hdGNoZXMgYFwiQWJvcnRFcnJvclwiYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gKiBjb250cm9sbGVyLmFib3J0KCk7XG4gKiB0cnkge1xuICogICBkb0FzeW5jV29yayhjb250cm9sbGVyLnNpZ25hbClcbiAqIH0gY2F0Y2ggKGUpIHtcbiAqICAgaWYgKGUubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gKiAgICAgLy8gaGFuZGxlIGFib3J0IGVycm9yIGhlcmUuXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQWJvcnRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkFib3J0RXJyb3JcIjtcbiAgICB9XG59XG4vKipcbiAqIEFuIEFib3J0Q29udHJvbGxlciBwcm92aWRlcyBhbiBBYm9ydFNpZ25hbCBhbmQgdGhlIGFzc29jaWF0ZWQgY29udHJvbHMgdG8gc2lnbmFsXG4gKiB0aGF0IGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gc2hvdWxkIGJlIGFib3J0ZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIEFib3J0IGFuIG9wZXJhdGlvbiB3aGVuIGFub3RoZXIgZXZlbnQgZmlyZXNcbiAqIGBgYHRzXG4gKiBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICogY29uc3Qgc2lnbmFsID0gY29udHJvbGxlci5zaWduYWw7XG4gKiBkb0FzeW5jV29yayhzaWduYWwpO1xuICogYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gY29udHJvbGxlci5hYm9ydCgpKTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBTaGFyZSBhYm9ydGVyIGNyb3NzIG11bHRpcGxlIG9wZXJhdGlvbnMgaW4gMzBzXG4gKiBgYGB0c1xuICogLy8gVXBsb2FkIHRoZSBzYW1lIGRhdGEgdG8gMiBkaWZmZXJlbnQgZGF0YSBjZW50ZXJzIGF0IHRoZSBzYW1lIHRpbWUsXG4gKiAvLyBhYm9ydCBhbm90aGVyIHdoZW4gYW55IG9mIHRoZW0gaXMgZmluaXNoZWRcbiAqIGNvbnN0IGNvbnRyb2xsZXIgPSBBYm9ydENvbnRyb2xsZXIud2l0aFRpbWVvdXQoMzAgKiAxMDAwKTtcbiAqIGRvQXN5bmNXb3JrKGNvbnRyb2xsZXIuc2lnbmFsKS50aGVuKGNvbnRyb2xsZXIuYWJvcnQpO1xuICogZG9Bc3luY1dvcmsoY29udHJvbGxlci5zaWduYWwpLnRoZW4oY29udHJvbGxlci5hYm9ydCk7XG4gKmBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDYXNjYWRlZCBhYm9ydGluZ1xuICogYGBgdHNcbiAqIC8vIEFsbCBvcGVyYXRpb25zIGNhbid0IHRha2UgbW9yZSB0aGFuIDMwIHNlY29uZHNcbiAqIGNvbnN0IGFib3J0ZXIgPSBBYm9ydGVyLnRpbWVvdXQoMzAgKiAxMDAwKTtcbiAqXG4gKiAvLyBGb2xsb3dpbmcgMiBvcGVyYXRpb25zIGNhbid0IHRha2UgbW9yZSB0aGFuIDI1IHNlY29uZHNcbiAqIGF3YWl0IGRvQXN5bmNXb3JrKGFib3J0ZXIud2l0aFRpbWVvdXQoMjUgKiAxMDAwKSk7XG4gKiBhd2FpdCBkb0FzeW5jV29yayhhYm9ydGVyLndpdGhUaW1lb3V0KDI1ICogMTAwMCkpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBYm9ydENvbnRyb2xsZXIge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXG4gICAgY29uc3RydWN0b3IocGFyZW50U2lnbmFscykge1xuICAgICAgICB0aGlzLl9zaWduYWwgPSBuZXcgQWJvcnRTaWduYWwoKTtcbiAgICAgICAgaWYgKCFwYXJlbnRTaWduYWxzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29lcmNlIHBhcmVudFNpZ25hbHMgaW50byBhbiBhcnJheVxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyZW50U2lnbmFscykpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcbiAgICAgICAgICAgIHBhcmVudFNpZ25hbHMgPSBhcmd1bWVudHM7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBwYXJlbnRTaWduYWwgb2YgcGFyZW50U2lnbmFscykge1xuICAgICAgICAgICAgLy8gaWYgdGhlIHBhcmVudCBzaWduYWwgaGFzIGFscmVhZHkgaGFkIGFib3J0KCkgY2FsbGVkLFxuICAgICAgICAgICAgLy8gdGhlbiBjYWxsIGFib3J0IG9uIHRoaXMgc2lnbmFsIGFzIHdlbGwuXG4gICAgICAgICAgICBpZiAocGFyZW50U2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFib3J0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBwYXJlbnQgc2lnbmFsIGFib3J0cywgdGhpcyBzaWduYWwgc2hvdWxkIGFzIHdlbGwuXG4gICAgICAgICAgICAgICAgcGFyZW50U2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWJvcnQoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgQWJvcnRTaWduYWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udHJvbGxlciB0aGF0IHdpbGwgc2lnbmFsIGFib3J0ZWRcbiAgICAgKiB3aGVuIHRoZSBhYm9ydCBtZXRob2QgaXMgY2FsbGVkIG9uIHRoaXMgY29udHJvbGxlci5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBzaWduYWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduYWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpZ25hbCB0aGF0IGFueSBvcGVyYXRpb25zIHBhc3NlZCB0aGlzIGNvbnRyb2xsZXIncyBhc3NvY2lhdGVkIGFib3J0IHNpZ25hbFxuICAgICAqIHRvIGNhbmNlbCBhbnkgcmVtYWluaW5nIHdvcmsgYW5kIHRocm93IGFuIGBBYm9ydEVycm9yYC5cbiAgICAgKi9cbiAgICBhYm9ydCgpIHtcbiAgICAgICAgYWJvcnRTaWduYWwodGhpcy5fc2lnbmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBBYm9ydFNpZ25hbCBpbnN0YW5jZSB0aGF0IHdpbGwgYWJvcnQgYWZ0ZXIgdGhlIHByb3ZpZGVkIG1zLlxuICAgICAqIEBwYXJhbSBtcyAtIEVsYXBzZWQgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gdHJpZ2dlciBhbiBhYm9ydC5cbiAgICAgKi9cbiAgICBzdGF0aWMgdGltZW91dChtcykge1xuICAgICAgICBjb25zdCBzaWduYWwgPSBuZXcgQWJvcnRTaWduYWwoKTtcbiAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KGFib3J0U2lnbmFsLCBtcywgc2lnbmFsKTtcbiAgICAgICAgLy8gUHJldmVudCB0aGUgYWN0aXZlIFRpbWVyIGZyb20ga2VlcGluZyB0aGUgTm9kZS5qcyBldmVudCBsb29wIGFjdGl2ZS5cbiAgICAgICAgaWYgKHR5cGVvZiB0aW1lci51bnJlZiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aW1lci51bnJlZigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaWduYWw7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWJvcnRDb250cm9sbGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgQWJvcnRFcnJvciB9IGZyb20gXCJAYXp1cmUvYWJvcnQtY29udHJvbGxlclwiO1xuaW1wb3J0IHsgQmFzZVJlcXVlc3RQb2xpY3ksIH0gZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmltcG9ydCB7IFVSTENvbnN0YW50cyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IGRlbGF5LCBzZXRVUkxIb3N0LCBzZXRVUkxQYXJhbWV0ZXIgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHMuY29tbW9uXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi4vbG9nXCI7XG4vKipcbiAqIEEgZmFjdG9yeSBtZXRob2QgdXNlZCB0byBnZW5lcmF0ZWQgYSBSZXRyeVBvbGljeSBmYWN0b3J5LlxuICpcbiAqIEBwYXJhbSByZXRyeU9wdGlvbnMgLVxuICovXG5leHBvcnQgZnVuY3Rpb24gTmV3UmV0cnlQb2xpY3lGYWN0b3J5KHJldHJ5T3B0aW9ucykge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNyZWF0ZTogKG5leHRQb2xpY3ksIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZVJldHJ5UG9saWN5KG5leHRQb2xpY3ksIG9wdGlvbnMsIHJldHJ5T3B0aW9ucyk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8qKlxuICogUmV0cnlQb2xpY3kgdHlwZXMuXG4gKi9cbmV4cG9ydCB2YXIgU3RvcmFnZVJldHJ5UG9saWN5VHlwZTtcbihmdW5jdGlvbiAoU3RvcmFnZVJldHJ5UG9saWN5VHlwZSkge1xuICAgIC8qKlxuICAgICAqIEV4cG9uZW50aWFsIHJldHJ5LiBSZXRyeSB0aW1lIGRlbGF5IGdyb3dzIGV4cG9uZW50aWFsbHkuXG4gICAgICovXG4gICAgU3RvcmFnZVJldHJ5UG9saWN5VHlwZVtTdG9yYWdlUmV0cnlQb2xpY3lUeXBlW1wiRVhQT05FTlRJQUxcIl0gPSAwXSA9IFwiRVhQT05FTlRJQUxcIjtcbiAgICAvKipcbiAgICAgKiBMaW5lYXIgcmV0cnkuIFJldHJ5IHRpbWUgZGVsYXkgZ3Jvd3MgbGluZWFybHkuXG4gICAgICovXG4gICAgU3RvcmFnZVJldHJ5UG9saWN5VHlwZVtTdG9yYWdlUmV0cnlQb2xpY3lUeXBlW1wiRklYRURcIl0gPSAxXSA9IFwiRklYRURcIjtcbn0pKFN0b3JhZ2VSZXRyeVBvbGljeVR5cGUgfHwgKFN0b3JhZ2VSZXRyeVBvbGljeVR5cGUgPSB7fSkpO1xuLy8gRGVmYXVsdCB2YWx1ZXMgb2YgU3RvcmFnZVJldHJ5T3B0aW9uc1xuY29uc3QgREVGQVVMVF9SRVRSWV9PUFRJT05TID0ge1xuICAgIG1heFJldHJ5RGVsYXlJbk1zOiAxMjAgKiAxMDAwLFxuICAgIG1heFRyaWVzOiA0LFxuICAgIHJldHJ5RGVsYXlJbk1zOiA0ICogMTAwMCxcbiAgICByZXRyeVBvbGljeVR5cGU6IFN0b3JhZ2VSZXRyeVBvbGljeVR5cGUuRVhQT05FTlRJQUwsXG4gICAgc2Vjb25kYXJ5SG9zdDogXCJcIixcbiAgICB0cnlUaW1lb3V0SW5NczogdW5kZWZpbmVkLCAvLyBVc2Ugc2VydmVyIHNpZGUgZGVmYXVsdCB0aW1lb3V0IHN0cmF0ZWd5XG59O1xuY29uc3QgUkVUUllfQUJPUlRfRVJST1IgPSBuZXcgQWJvcnRFcnJvcihcIlRoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuXCIpO1xuLyoqXG4gKiBSZXRyeSBwb2xpY3kgd2l0aCBleHBvbmVudGlhbCByZXRyeSBhbmQgbGluZWFyIHJldHJ5IGltcGxlbWVudGVkLlxuICovXG5leHBvcnQgY2xhc3MgU3RvcmFnZVJldHJ5UG9saWN5IGV4dGVuZHMgQmFzZVJlcXVlc3RQb2xpY3kge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUmV0cnlQb2xpY3kuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmV4dFBvbGljeSAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqIEBwYXJhbSByZXRyeU9wdGlvbnMgLVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5leHRQb2xpY3ksIG9wdGlvbnMsIHJldHJ5T3B0aW9ucyA9IERFRkFVTFRfUkVUUllfT1BUSU9OUykge1xuICAgICAgICBzdXBlcihuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSByZXRyeSBvcHRpb25zXG4gICAgICAgIHRoaXMucmV0cnlPcHRpb25zID0ge1xuICAgICAgICAgICAgcmV0cnlQb2xpY3lUeXBlOiByZXRyeU9wdGlvbnMucmV0cnlQb2xpY3lUeXBlXG4gICAgICAgICAgICAgICAgPyByZXRyeU9wdGlvbnMucmV0cnlQb2xpY3lUeXBlXG4gICAgICAgICAgICAgICAgOiBERUZBVUxUX1JFVFJZX09QVElPTlMucmV0cnlQb2xpY3lUeXBlLFxuICAgICAgICAgICAgbWF4VHJpZXM6IHJldHJ5T3B0aW9ucy5tYXhUcmllcyAmJiByZXRyeU9wdGlvbnMubWF4VHJpZXMgPj0gMVxuICAgICAgICAgICAgICAgID8gTWF0aC5mbG9vcihyZXRyeU9wdGlvbnMubWF4VHJpZXMpXG4gICAgICAgICAgICAgICAgOiBERUZBVUxUX1JFVFJZX09QVElPTlMubWF4VHJpZXMsXG4gICAgICAgICAgICB0cnlUaW1lb3V0SW5NczogcmV0cnlPcHRpb25zLnRyeVRpbWVvdXRJbk1zICYmIHJldHJ5T3B0aW9ucy50cnlUaW1lb3V0SW5NcyA+PSAwXG4gICAgICAgICAgICAgICAgPyByZXRyeU9wdGlvbnMudHJ5VGltZW91dEluTXNcbiAgICAgICAgICAgICAgICA6IERFRkFVTFRfUkVUUllfT1BUSU9OUy50cnlUaW1lb3V0SW5NcyxcbiAgICAgICAgICAgIHJldHJ5RGVsYXlJbk1zOiByZXRyeU9wdGlvbnMucmV0cnlEZWxheUluTXMgJiYgcmV0cnlPcHRpb25zLnJldHJ5RGVsYXlJbk1zID49IDBcbiAgICAgICAgICAgICAgICA/IE1hdGgubWluKHJldHJ5T3B0aW9ucy5yZXRyeURlbGF5SW5NcywgcmV0cnlPcHRpb25zLm1heFJldHJ5RGVsYXlJbk1zXG4gICAgICAgICAgICAgICAgICAgID8gcmV0cnlPcHRpb25zLm1heFJldHJ5RGVsYXlJbk1zXG4gICAgICAgICAgICAgICAgICAgIDogREVGQVVMVF9SRVRSWV9PUFRJT05TLm1heFJldHJ5RGVsYXlJbk1zKVxuICAgICAgICAgICAgICAgIDogREVGQVVMVF9SRVRSWV9PUFRJT05TLnJldHJ5RGVsYXlJbk1zLFxuICAgICAgICAgICAgbWF4UmV0cnlEZWxheUluTXM6IHJldHJ5T3B0aW9ucy5tYXhSZXRyeURlbGF5SW5NcyAmJiByZXRyeU9wdGlvbnMubWF4UmV0cnlEZWxheUluTXMgPj0gMFxuICAgICAgICAgICAgICAgID8gcmV0cnlPcHRpb25zLm1heFJldHJ5RGVsYXlJbk1zXG4gICAgICAgICAgICAgICAgOiBERUZBVUxUX1JFVFJZX09QVElPTlMubWF4UmV0cnlEZWxheUluTXMsXG4gICAgICAgICAgICBzZWNvbmRhcnlIb3N0OiByZXRyeU9wdGlvbnMuc2Vjb25kYXJ5SG9zdFxuICAgICAgICAgICAgICAgID8gcmV0cnlPcHRpb25zLnNlY29uZGFyeUhvc3RcbiAgICAgICAgICAgICAgICA6IERFRkFVTFRfUkVUUllfT1BUSU9OUy5zZWNvbmRhcnlIb3N0LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgLVxuICAgICAqL1xuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXR0ZW1wdFNlbmRSZXF1ZXN0KHJlcXVlc3QsIGZhbHNlLCAxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVjaWRlIGFuZCBwZXJmb3JtIG5leHQgcmV0cnkuIFdvbid0IG11dGF0ZSByZXF1ZXN0IHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IC1cbiAgICAgKiBAcGFyYW0gc2Vjb25kYXJ5SGFzNDA0IC0gIElmIGF0dGVtcHQgd2FzIGFnYWluc3QgdGhlIHNlY29uZGFyeSAmIGl0IHJldHVybmVkIGEgU3RhdHVzTm90Rm91bmQgKDQwNCksIHRoZW5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc291cmNlIHdhcyBub3QgZm91bmQuIFRoaXMgbWF5IGJlIGR1ZSB0byByZXBsaWNhdGlvbiBkZWxheS4gU28sIGluIHRoaXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSwgd2UnbGwgbmV2ZXIgdHJ5IHRoZSBzZWNvbmRhcnkgYWdhaW4gZm9yIHRoaXMgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSBhdHRlbXB0IC0gICAgICAgICAgIEhvdyBtYW55IHJldHJpZXMgaGFzIGJlZW4gYXR0ZW1wdGVkIHRvIHBlcmZvcm1lZCwgc3RhcnRpbmcgZnJvbSAxLCB3aGljaCBpbmNsdWRlc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXR0ZW1wdCB3aWxsIGJlIHBlcmZvcm1lZCBieSB0aGlzIG1ldGhvZCBjYWxsLlxuICAgICAqL1xuICAgIGFzeW5jIGF0dGVtcHRTZW5kUmVxdWVzdChyZXF1ZXN0LCBzZWNvbmRhcnlIYXM0MDQsIGF0dGVtcHQpIHtcbiAgICAgICAgY29uc3QgbmV3UmVxdWVzdCA9IHJlcXVlc3QuY2xvbmUoKTtcbiAgICAgICAgY29uc3QgaXNQcmltYXJ5UmV0cnkgPSBzZWNvbmRhcnlIYXM0MDQgfHxcbiAgICAgICAgICAgICF0aGlzLnJldHJ5T3B0aW9ucy5zZWNvbmRhcnlIb3N0IHx8XG4gICAgICAgICAgICAhKHJlcXVlc3QubWV0aG9kID09PSBcIkdFVFwiIHx8IHJlcXVlc3QubWV0aG9kID09PSBcIkhFQURcIiB8fCByZXF1ZXN0Lm1ldGhvZCA9PT0gXCJPUFRJT05TXCIpIHx8XG4gICAgICAgICAgICBhdHRlbXB0ICUgMiA9PT0gMTtcbiAgICAgICAgaWYgKCFpc1ByaW1hcnlSZXRyeSkge1xuICAgICAgICAgICAgbmV3UmVxdWVzdC51cmwgPSBzZXRVUkxIb3N0KG5ld1JlcXVlc3QudXJsLCB0aGlzLnJldHJ5T3B0aW9ucy5zZWNvbmRhcnlIb3N0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgdGhlIHNlcnZlci1zaWRlIHRpbWVvdXQgcXVlcnkgcGFyYW1ldGVyIFwidGltZW91dD1bc2Vjb25kc11cIlxuICAgICAgICBpZiAodGhpcy5yZXRyeU9wdGlvbnMudHJ5VGltZW91dEluTXMpIHtcbiAgICAgICAgICAgIG5ld1JlcXVlc3QudXJsID0gc2V0VVJMUGFyYW1ldGVyKG5ld1JlcXVlc3QudXJsLCBVUkxDb25zdGFudHMuUGFyYW1ldGVycy5USU1FT1VULCBNYXRoLmZsb29yKHRoaXMucmV0cnlPcHRpb25zLnRyeVRpbWVvdXRJbk1zIC8gMTAwMCkudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFJldHJ5UG9saWN5OiA9PT09PT4gVHJ5PSR7YXR0ZW1wdH0gJHtpc1ByaW1hcnlSZXRyeSA/IFwiUHJpbWFyeVwiIDogXCJTZWNvbmRhcnlcIn1gKTtcbiAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fbmV4dFBvbGljeS5zZW5kUmVxdWVzdChuZXdSZXF1ZXN0KTtcbiAgICAgICAgICAgIGlmICghdGhpcy5zaG91bGRSZXRyeShpc1ByaW1hcnlSZXRyeSwgYXR0ZW1wdCwgcmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2Vjb25kYXJ5SGFzNDA0ID0gc2Vjb25kYXJ5SGFzNDA0IHx8ICghaXNQcmltYXJ5UmV0cnkgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmV0cnlQb2xpY3k6IENhdWdodCBlcnJvciwgbWVzc2FnZTogJHtlcnIubWVzc2FnZX0sIGNvZGU6ICR7ZXJyLmNvZGV9YCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkUmV0cnkoaXNQcmltYXJ5UmV0cnksIGF0dGVtcHQsIHJlc3BvbnNlLCBlcnIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuZGVsYXkoaXNQcmltYXJ5UmV0cnksIGF0dGVtcHQsIHJlcXVlc3QuYWJvcnRTaWduYWwpO1xuICAgICAgICByZXR1cm4gdGhpcy5hdHRlbXB0U2VuZFJlcXVlc3QocmVxdWVzdCwgc2Vjb25kYXJ5SGFzNDA0LCArK2F0dGVtcHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNpZGUgd2hldGhlciB0byByZXRyeSBhY2NvcmRpbmcgdG8gbGFzdCBIVFRQIHJlc3BvbnNlIGFuZCByZXRyeSBjb3VudGVycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpc1ByaW1hcnlSZXRyeSAtXG4gICAgICogQHBhcmFtIGF0dGVtcHQgLVxuICAgICAqIEBwYXJhbSByZXNwb25zZSAtXG4gICAgICogQHBhcmFtIGVyciAtXG4gICAgICovXG4gICAgc2hvdWxkUmV0cnkoaXNQcmltYXJ5UmV0cnksIGF0dGVtcHQsIHJlc3BvbnNlLCBlcnIpIHtcbiAgICAgICAgaWYgKGF0dGVtcHQgPj0gdGhpcy5yZXRyeU9wdGlvbnMubWF4VHJpZXMpIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBSZXRyeVBvbGljeTogQXR0ZW1wdChzKSAke2F0dGVtcHR9ID49IG1heFRyaWVzICR7dGhpcy5yZXRyeU9wdGlvbnNcbiAgICAgICAgICAgICAgICAubWF4VHJpZXN9LCBubyBmdXJ0aGVyIHRyeS5gKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBIYW5kbGUgbmV0d29yayBmYWlsdXJlcywgeW91IG1heSBuZWVkIHRvIGN1c3RvbWl6ZSB0aGUgbGlzdCB3aGVuIHlvdSBpbXBsZW1lbnRcbiAgICAgICAgLy8geW91ciBvd24gaHR0cCBjbGllbnRcbiAgICAgICAgY29uc3QgcmV0cmlhYmxlRXJyb3JzID0gW1xuICAgICAgICAgICAgXCJFVElNRURPVVRcIixcbiAgICAgICAgICAgIFwiRVNPQ0tFVFRJTUVET1VUXCIsXG4gICAgICAgICAgICBcIkVDT05OUkVGVVNFRFwiLFxuICAgICAgICAgICAgXCJFQ09OTlJFU0VUXCIsXG4gICAgICAgICAgICBcIkVOT0VOVFwiLFxuICAgICAgICAgICAgXCJFTk9URk9VTkRcIixcbiAgICAgICAgICAgIFwiVElNRU9VVFwiLFxuICAgICAgICAgICAgXCJFUElQRVwiLFxuICAgICAgICAgICAgXCJSRVFVRVNUX1NFTkRfRVJST1JcIiwgLy8gRm9yIGRlZmF1bHQgeGhyIGJhc2VkIGh0dHAgY2xpZW50IHByb3ZpZGVkIGluIG1zLXJlc3QtanNcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgZm9yIChjb25zdCByZXRyaWFibGVFcnJvciBvZiByZXRyaWFibGVFcnJvcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyLm5hbWUudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhyZXRyaWFibGVFcnJvcikgfHxcbiAgICAgICAgICAgICAgICAgICAgZXJyLm1lc3NhZ2UudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhyZXRyaWFibGVFcnJvcikgfHxcbiAgICAgICAgICAgICAgICAgICAgKGVyci5jb2RlICYmIGVyci5jb2RlLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKSA9PT0gcmV0cmlhYmxlRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBSZXRyeVBvbGljeTogTmV0d29yayBlcnJvciAke3JldHJpYWJsZUVycm9yfSBmb3VuZCwgd2lsbCByZXRyeS5gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIElmIGF0dGVtcHQgd2FzIGFnYWluc3QgdGhlIHNlY29uZGFyeSAmIGl0IHJldHVybmVkIGEgU3RhdHVzTm90Rm91bmQgKDQwNCksIHRoZW5cbiAgICAgICAgLy8gdGhlIHJlc291cmNlIHdhcyBub3QgZm91bmQuIFRoaXMgbWF5IGJlIGR1ZSB0byByZXBsaWNhdGlvbiBkZWxheS4gU28sIGluIHRoaXNcbiAgICAgICAgLy8gY2FzZSwgd2UnbGwgbmV2ZXIgdHJ5IHRoZSBzZWNvbmRhcnkgYWdhaW4gZm9yIHRoaXMgb3BlcmF0aW9uLlxuICAgICAgICBpZiAocmVzcG9uc2UgfHwgZXJyKSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0dXNDb2RlID0gcmVzcG9uc2UgPyByZXNwb25zZS5zdGF0dXMgOiBlcnIgPyBlcnIuc3RhdHVzQ29kZSA6IDA7XG4gICAgICAgICAgICBpZiAoIWlzUHJpbWFyeVJldHJ5ICYmIHN0YXR1c0NvZGUgPT09IDQwNCkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBSZXRyeVBvbGljeTogU2Vjb25kYXJ5IGFjY2VzcyB3aXRoIDQwNCwgd2lsbCByZXRyeS5gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNlcnZlciBpbnRlcm5hbCBlcnJvciBvciBzZXJ2ZXIgdGltZW91dFxuICAgICAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IDUwMyB8fCBzdGF0dXNDb2RlID09PSA1MDApIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgUmV0cnlQb2xpY3k6IFdpbGwgcmV0cnkgZm9yIHN0YXR1cyBjb2RlICR7c3RhdHVzQ29kZX0uYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChlcnIgPT09IG51bGwgfHwgZXJyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnIuY29kZSkgPT09IFwiUEFSU0VfRVJST1JcIiAmJiAoZXJyID09PSBudWxsIHx8IGVyciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyLm1lc3NhZ2Uuc3RhcnRzV2l0aChgRXJyb3IgXCJFcnJvcjogVW5jbG9zZWQgcm9vdCB0YWdgKSkpIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKFwiUmV0cnlQb2xpY3k6IEluY29tcGxldGUgWE1MIHJlc3BvbnNlIGxpa2VseSBkdWUgdG8gc2VydmljZSB0aW1lb3V0LCB3aWxsIHJldHJ5LlwiKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsYXkgYSBjYWxjdWxhdGVkIHRpbWUgYmV0d2VlbiByZXRyaWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlzUHJpbWFyeVJldHJ5IC1cbiAgICAgKiBAcGFyYW0gYXR0ZW1wdCAtXG4gICAgICogQHBhcmFtIGFib3J0U2lnbmFsIC1cbiAgICAgKi9cbiAgICBhc3luYyBkZWxheShpc1ByaW1hcnlSZXRyeSwgYXR0ZW1wdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgbGV0IGRlbGF5VGltZUluTXMgPSAwO1xuICAgICAgICBpZiAoaXNQcmltYXJ5UmV0cnkpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5yZXRyeU9wdGlvbnMucmV0cnlQb2xpY3lUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBTdG9yYWdlUmV0cnlQb2xpY3lUeXBlLkVYUE9ORU5USUFMOlxuICAgICAgICAgICAgICAgICAgICBkZWxheVRpbWVJbk1zID0gTWF0aC5taW4oKE1hdGgucG93KDIsIGF0dGVtcHQgLSAxKSAtIDEpICogdGhpcy5yZXRyeU9wdGlvbnMucmV0cnlEZWxheUluTXMsIHRoaXMucmV0cnlPcHRpb25zLm1heFJldHJ5RGVsYXlJbk1zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBTdG9yYWdlUmV0cnlQb2xpY3lUeXBlLkZJWEVEOlxuICAgICAgICAgICAgICAgICAgICBkZWxheVRpbWVJbk1zID0gdGhpcy5yZXRyeU9wdGlvbnMucmV0cnlEZWxheUluTXM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVsYXlUaW1lSW5NcyA9IE1hdGgucmFuZG9tKCkgKiAxMDAwO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci5pbmZvKGBSZXRyeVBvbGljeTogRGVsYXkgZm9yICR7ZGVsYXlUaW1lSW5Nc31tc2ApO1xuICAgICAgICByZXR1cm4gZGVsYXkoZGVsYXlUaW1lSW5NcywgYWJvcnRTaWduYWwsIFJFVFJZX0FCT1JUX0VSUk9SKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdG9yYWdlUmV0cnlQb2xpY3kuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBTdG9yYWdlUmV0cnlQb2xpY3ksIFN0b3JhZ2VSZXRyeVBvbGljeVR5cGUgfSBmcm9tIFwiLi9wb2xpY2llcy9TdG9yYWdlUmV0cnlQb2xpY3lcIjtcbmV4cG9ydCB7IFN0b3JhZ2VSZXRyeVBvbGljeVR5cGUsIFN0b3JhZ2VSZXRyeVBvbGljeSB9O1xuLyoqXG4gKiBTdG9yYWdlUmV0cnlQb2xpY3lGYWN0b3J5IGlzIGEgZmFjdG9yeSBjbGFzcyBoZWxwaW5nIGdlbmVyYXRpbmcge0BsaW5rIFN0b3JhZ2VSZXRyeVBvbGljeX0gb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0b3JhZ2VSZXRyeVBvbGljeUZhY3Rvcnkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgU3RvcmFnZVJldHJ5UG9saWN5RmFjdG9yeS5cbiAgICAgKiBAcGFyYW0gcmV0cnlPcHRpb25zIC1cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihyZXRyeU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5yZXRyeU9wdGlvbnMgPSByZXRyeU9wdGlvbnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBTdG9yYWdlUmV0cnlQb2xpY3kgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG5leHRQb2xpY3kgLVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBjcmVhdGUobmV4dFBvbGljeSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VSZXRyeVBvbGljeShuZXh0UG9saWN5LCBvcHRpb25zLCB0aGlzLnJldHJ5T3B0aW9ucyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RvcmFnZVJldHJ5UG9saWN5RmFjdG9yeS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEJhc2VSZXF1ZXN0UG9saWN5IH0gZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbi8qKlxuICogQ3JlZGVudGlhbCBwb2xpY3kgdXNlZCB0byBzaWduIEhUVFAoUykgcmVxdWVzdHMgYmVmb3JlIHNlbmRpbmcuIFRoaXMgaXMgYW5cbiAqIGFic3RyYWN0IGNsYXNzLlxuICovXG5leHBvcnQgY2xhc3MgQ3JlZGVudGlhbFBvbGljeSBleHRlbmRzIEJhc2VSZXF1ZXN0UG9saWN5IHtcbiAgICAvKipcbiAgICAgKiBTZW5kcyBvdXQgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IC1cbiAgICAgKi9cbiAgICBzZW5kUmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uZXh0UG9saWN5LnNlbmRSZXF1ZXN0KHRoaXMuc2lnblJlcXVlc3QocmVxdWVzdCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGlsZCBjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHdpdGggcmVxdWVzdCBzaWduaW5nLiBUaGlzIG1ldGhvZFxuICAgICAqIHdpbGwgYmUgZXhlY3V0ZWQgaW4ge0BsaW5rIHNlbmRSZXF1ZXN0fS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IC1cbiAgICAgKi9cbiAgICBzaWduUmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgICAgIC8vIENoaWxkIGNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCB3aXRoIHJlcXVlc3Qgc2lnbmluZy4gVGhpcyBtZXRob2RcbiAgICAgICAgLy8gd2lsbCBiZSBleGVjdXRlZCBpbiBzZW5kUmVxdWVzdCgpLlxuICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DcmVkZW50aWFsUG9saWN5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgQ3JlZGVudGlhbFBvbGljeSB9IGZyb20gXCIuL0NyZWRlbnRpYWxQb2xpY3lcIjtcbi8qKlxuICogQW5vbnltb3VzQ3JlZGVudGlhbFBvbGljeSBpcyB1c2VkIHdpdGggSFRUUChTKSByZXF1ZXN0cyB0aGF0IHJlYWQgcHVibGljIHJlc291cmNlc1xuICogb3IgZm9yIHVzZSB3aXRoIFNoYXJlZCBBY2Nlc3MgU2lnbmF0dXJlcyAoU0FTKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFub255bW91c0NyZWRlbnRpYWxQb2xpY3kgZXh0ZW5kcyBDcmVkZW50aWFsUG9saWN5IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEFub255bW91c0NyZWRlbnRpYWxQb2xpY3kuXG4gICAgICogQHBhcmFtIG5leHRQb2xpY3kgLVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICAvLyBUaGUgYmFzZSBjbGFzcyBoYXMgYSBwcm90ZWN0ZWQgY29uc3RydWN0b3IuIEFkZGluZyBhIHB1YmxpYyBvbmUgdG8gZW5hYmxlIGNvbnN0cnVjdGluZyBvZiB0aGlzIGNsYXNzLlxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdXNlbGVzcy1jb25zdHJ1Y3RvciovXG4gICAgY29uc3RydWN0b3IobmV4dFBvbGljeSwgb3B0aW9ucykge1xuICAgICAgICBzdXBlcihuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Bbm9ueW1vdXNDcmVkZW50aWFsUG9saWN5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLyoqXG4gKiBDcmVkZW50aWFsIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBBenVyZSBTdG9yYWdlIEhUVFAgcmVxdWVzdHMgc2lnbmluZy4gVGhpc1xuICogY2xhc3Mgd2lsbCBob3N0IGFuIGNyZWRlbnRpYWxQb2xpY3lDcmVhdG9yIGZhY3Rvcnkgd2hpY2ggZ2VuZXJhdGVzIENyZWRlbnRpYWxQb2xpY3kuXG4gKi9cbmV4cG9ydCBjbGFzcyBDcmVkZW50aWFsIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgUmVxdWVzdFBvbGljeSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gX25leHRQb2xpY3kgLVxuICAgICAqIEBwYXJhbSBfb3B0aW9ucyAtXG4gICAgICovXG4gICAgY3JlYXRlKF9uZXh0UG9saWN5LCBfb3B0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIGNoaWxkcmVuIGNsYXNzZXMuXCIpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNyZWRlbnRpYWwuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBBbm9ueW1vdXNDcmVkZW50aWFsUG9saWN5IH0gZnJvbSBcIi4uL3BvbGljaWVzL0Fub255bW91c0NyZWRlbnRpYWxQb2xpY3lcIjtcbmltcG9ydCB7IENyZWRlbnRpYWwgfSBmcm9tIFwiLi9DcmVkZW50aWFsXCI7XG4vKipcbiAqIEFub255bW91c0NyZWRlbnRpYWwgcHJvdmlkZXMgYSBjcmVkZW50aWFsUG9saWN5Q3JlYXRvciBtZW1iZXIgdXNlZCB0byBjcmVhdGVcbiAqIEFub255bW91c0NyZWRlbnRpYWxQb2xpY3kgb2JqZWN0cy4gQW5vbnltb3VzQ3JlZGVudGlhbFBvbGljeSBpcyB1c2VkIHdpdGhcbiAqIEhUVFAoUykgcmVxdWVzdHMgdGhhdCByZWFkIHB1YmxpYyByZXNvdXJjZXMgb3IgZm9yIHVzZSB3aXRoIFNoYXJlZCBBY2Nlc3NcbiAqIFNpZ25hdHVyZXMgKFNBUykuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbm9ueW1vdXNDcmVkZW50aWFsIGV4dGVuZHMgQ3JlZGVudGlhbCB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiB7QGxpbmsgQW5vbnltb3VzQ3JlZGVudGlhbFBvbGljeX0gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG5leHRQb2xpY3kgLVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBjcmVhdGUobmV4dFBvbGljeSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IEFub255bW91c0NyZWRlbnRpYWxQb2xpY3kobmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QW5vbnltb3VzQ3JlZGVudGlhbC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEJhc2VSZXF1ZXN0UG9saWN5LCBIdHRwSGVhZGVycywgaXNOb2RlLCB9IGZyb20gXCJAYXp1cmUvY29yZS1odHRwXCI7XG5pbXBvcnQgeyBIZWFkZXJDb25zdGFudHMgfSBmcm9tIFwiLi4vdXRpbHMvY29uc3RhbnRzXCI7XG4vKipcbiAqIFRlbGVtZXRyeVBvbGljeSBpcyBhIHBvbGljeSB1c2VkIHRvIHRhZyB1c2VyLWFnZW50IGhlYWRlciBmb3IgZXZlcnkgcmVxdWVzdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBUZWxlbWV0cnlQb2xpY3kgZXh0ZW5kcyBCYXNlUmVxdWVzdFBvbGljeSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBUZWxlbWV0cnlQb2xpY3kuXG4gICAgICogQHBhcmFtIG5leHRQb2xpY3kgLVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKiBAcGFyYW0gdGVsZW1ldHJ5IC1cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihuZXh0UG9saWN5LCBvcHRpb25zLCB0ZWxlbWV0cnkpIHtcbiAgICAgICAgc3VwZXIobmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMudGVsZW1ldHJ5ID0gdGVsZW1ldHJ5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBvdXQgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IC1cbiAgICAgKi9cbiAgICBhc3luYyBzZW5kUmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgICAgIGlmICghcmVxdWVzdC5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXJlcXVlc3QuaGVhZGVycy5nZXQoSGVhZGVyQ29uc3RhbnRzLlVTRVJfQUdFTlQpKSB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnNldChIZWFkZXJDb25zdGFudHMuVVNFUl9BR0VOVCwgdGhpcy50ZWxlbWV0cnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9uZXh0UG9saWN5LnNlbmRSZXF1ZXN0KHJlcXVlc3QpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRlbGVtZXRyeVBvbGljeS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IGlzTm9kZSwgfSBmcm9tIFwiQGF6dXJlL2NvcmUtaHR0cFwiO1xuaW1wb3J0ICogYXMgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgeyBUZWxlbWV0cnlQb2xpY3kgfSBmcm9tIFwiLi9wb2xpY2llcy9UZWxlbWV0cnlQb2xpY3lcIjtcbmltcG9ydCB7IFNES19WRVJTSU9OIH0gZnJvbSBcIi4vdXRpbHMvY29uc3RhbnRzXCI7XG4vKipcbiAqIFRlbGVtZXRyeVBvbGljeUZhY3RvcnkgaXMgYSBmYWN0b3J5IGNsYXNzIGhlbHBpbmcgZ2VuZXJhdGluZyB7QGxpbmsgVGVsZW1ldHJ5UG9saWN5fSBvYmplY3RzLlxuICovXG5leHBvcnQgY2xhc3MgVGVsZW1ldHJ5UG9saWN5RmFjdG9yeSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBUZWxlbWV0cnlQb2xpY3lGYWN0b3J5LlxuICAgICAqIEBwYXJhbSB0ZWxlbWV0cnkgLVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHRlbGVtZXRyeSkge1xuICAgICAgICBjb25zdCB1c2VyQWdlbnRJbmZvID0gW107XG4gICAgICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgICAgIGlmICh0ZWxlbWV0cnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZWxlbWV0cnlTdHJpbmcgPSB0ZWxlbWV0cnkudXNlckFnZW50UHJlZml4IHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKHRlbGVtZXRyeVN0cmluZy5sZW5ndGggPiAwICYmIHVzZXJBZ2VudEluZm8uaW5kZXhPZih0ZWxlbWV0cnlTdHJpbmcpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB1c2VyQWdlbnRJbmZvLnB1c2godGVsZW1ldHJ5U3RyaW5nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlLmcuIGF6c2RrLWpzLXN0b3JhZ2VibG9iLzEwLjAuMFxuICAgICAgICAgICAgY29uc3QgbGliSW5mbyA9IGBhenNkay1qcy1zdG9yYWdlYmxvYi8ke1NES19WRVJTSU9OfWA7XG4gICAgICAgICAgICBpZiAodXNlckFnZW50SW5mby5pbmRleE9mKGxpYkluZm8pID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHVzZXJBZ2VudEluZm8ucHVzaChsaWJJbmZvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGUuZy4gKE5PREUtVkVSU0lPTiA0LjkuMTsgV2luZG93c19OVCAxMC4wLjE2Mjk5KVxuICAgICAgICAgICAgbGV0IHJ1bnRpbWVJbmZvID0gYChOT0RFLVZFUlNJT04gJHtwcm9jZXNzLnZlcnNpb259KWA7XG4gICAgICAgICAgICBpZiAob3MpIHtcbiAgICAgICAgICAgICAgICBydW50aW1lSW5mbyA9IGAoTk9ERS1WRVJTSU9OICR7cHJvY2Vzcy52ZXJzaW9ufTsgJHtvcy50eXBlKCl9ICR7b3MucmVsZWFzZSgpfSlgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVzZXJBZ2VudEluZm8uaW5kZXhPZihydW50aW1lSW5mbykgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdXNlckFnZW50SW5mby5wdXNoKHJ1bnRpbWVJbmZvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRlbGVtZXRyeVN0cmluZyA9IHVzZXJBZ2VudEluZm8uam9pbihcIiBcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBUZWxlbWV0cnlQb2xpY3kgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG5leHRQb2xpY3kgLVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBjcmVhdGUobmV4dFBvbGljeSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IFRlbGVtZXRyeVBvbGljeShuZXh0UG9saWN5LCBvcHRpb25zLCB0aGlzLnRlbGVtZXRyeVN0cmluZyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGVsZW1ldHJ5UG9saWN5RmFjdG9yeS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCAqIGFzIHR1bm5lbCBmcm9tIFwidHVubmVsXCI7XG5pbXBvcnQgeyBVUkxCdWlsZGVyIH0gZnJvbSBcIi4vdXJsXCI7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJveHlBZ2VudChyZXF1ZXN0VXJsLCBwcm94eVNldHRpbmdzLCBoZWFkZXJzKSB7XG4gICAgY29uc3QgaG9zdCA9IFVSTEJ1aWxkZXIucGFyc2UocHJveHlTZXR0aW5ncy5ob3N0KS5nZXRIb3N0KCk7XG4gICAgaWYgKCFob3N0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGluZyBhIG5vbi1lbXB0eSBob3N0IGluIHByb3h5IHNldHRpbmdzLlwiKTtcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkUG9ydChwcm94eVNldHRpbmdzLnBvcnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGluZyBhIHZhbGlkIHBvcnQgbnVtYmVyIGluIHRoZSByYW5nZSBvZiBbMCwgNjU1MzVdIGluIHByb3h5IHNldHRpbmdzLlwiKTtcbiAgICB9XG4gICAgY29uc3QgdHVubmVsT3B0aW9ucyA9IHtcbiAgICAgICAgcHJveHk6IHtcbiAgICAgICAgICAgIGhvc3Q6IGhvc3QsXG4gICAgICAgICAgICBwb3J0OiBwcm94eVNldHRpbmdzLnBvcnQsXG4gICAgICAgICAgICBoZWFkZXJzOiAoaGVhZGVycyAmJiBoZWFkZXJzLnJhd0hlYWRlcnMoKSkgfHwge30sXG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBpZiAocHJveHlTZXR0aW5ncy51c2VybmFtZSAmJiBwcm94eVNldHRpbmdzLnBhc3N3b3JkKSB7XG4gICAgICAgIHR1bm5lbE9wdGlvbnMucHJveHkucHJveHlBdXRoID0gYCR7cHJveHlTZXR0aW5ncy51c2VybmFtZX06JHtwcm94eVNldHRpbmdzLnBhc3N3b3JkfWA7XG4gICAgfVxuICAgIGVsc2UgaWYgKHByb3h5U2V0dGluZ3MudXNlcm5hbWUpIHtcbiAgICAgICAgdHVubmVsT3B0aW9ucy5wcm94eS5wcm94eUF1dGggPSBgJHtwcm94eVNldHRpbmdzLnVzZXJuYW1lfWA7XG4gICAgfVxuICAgIGNvbnN0IGlzUmVxdWVzdEh0dHBzID0gaXNVcmxIdHRwcyhyZXF1ZXN0VXJsKTtcbiAgICBjb25zdCBpc1Byb3h5SHR0cHMgPSBpc1VybEh0dHBzKHByb3h5U2V0dGluZ3MuaG9zdCk7XG4gICAgY29uc3QgcHJveHlBZ2VudCA9IHtcbiAgICAgICAgaXNIdHRwczogaXNSZXF1ZXN0SHR0cHMsXG4gICAgICAgIGFnZW50OiBjcmVhdGVUdW5uZWwoaXNSZXF1ZXN0SHR0cHMsIGlzUHJveHlIdHRwcywgdHVubmVsT3B0aW9ucyksXG4gICAgfTtcbiAgICByZXR1cm4gcHJveHlBZ2VudDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1VybEh0dHBzKHVybCkge1xuICAgIGNvbnN0IHVybFNjaGVtZSA9IFVSTEJ1aWxkZXIucGFyc2UodXJsKS5nZXRTY2hlbWUoKSB8fCBcIlwiO1xuICAgIHJldHVybiB1cmxTY2hlbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJodHRwc1wiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVR1bm5lbChpc1JlcXVlc3RIdHRwcywgaXNQcm94eUh0dHBzLCB0dW5uZWxPcHRpb25zKSB7XG4gICAgaWYgKGlzUmVxdWVzdEh0dHBzICYmIGlzUHJveHlIdHRwcykge1xuICAgICAgICByZXR1cm4gdHVubmVsLmh0dHBzT3Zlckh0dHBzKHR1bm5lbE9wdGlvbnMpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1JlcXVlc3RIdHRwcyAmJiAhaXNQcm94eUh0dHBzKSB7XG4gICAgICAgIHJldHVybiB0dW5uZWwuaHR0cHNPdmVySHR0cCh0dW5uZWxPcHRpb25zKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIWlzUmVxdWVzdEh0dHBzICYmIGlzUHJveHlIdHRwcykge1xuICAgICAgICByZXR1cm4gdHVubmVsLmh0dHBPdmVySHR0cHModHVubmVsT3B0aW9ucyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gdHVubmVsLmh0dHBPdmVySHR0cCh0dW5uZWxPcHRpb25zKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc1ZhbGlkUG9ydChwb3J0KSB7XG4gICAgLy8gYW55IHBvcnQgaW4gMC02NTUzNSByYW5nZSBpcyB2YWxpZCAoUkZDIDc5MykgZXZlbiB0aG91Z2ggYWxtb3N0IGFsbCBpbXBsZW1lbnRhdGlvbnNcbiAgICAvLyB3aWxsIHJlc2VydmUgMCBmb3IgYSBzcGVjaWZpYyBwdXJwb3NlLCBhbmQgYSByYW5nZSBvZiBudW1iZXJzIGZvciBlcGhlbWVyYWwgcG9ydHNcbiAgICByZXR1cm4gMCA8PSBwb3J0ICYmIHBvcnQgPD0gNjU1MzU7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcm94eUFnZW50LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0ICogYXMgaHR0cCBmcm9tIFwiaHR0cFwiO1xuaW1wb3J0ICogYXMgaHR0cHMgZnJvbSBcImh0dHBzXCI7XG5pbXBvcnQgeyBBYm9ydENvbnRyb2xsZXIsIEFib3J0RXJyb3IgfSBmcm9tIFwiQGF6dXJlL2Fib3J0LWNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IEh0dHBIZWFkZXJzIH0gZnJvbSBcIi4vaHR0cEhlYWRlcnNcIjtcbmltcG9ydCB7IGNyZWF0ZVByb3h5QWdlbnQsIGlzVXJsSHR0cHMgfSBmcm9tIFwiLi9wcm94eUFnZW50XCI7XG5pbXBvcnQgeyBUcmFuc2Zvcm0gfSBmcm9tIFwic3RyZWFtXCI7XG5pbXBvcnQgRm9ybURhdGEgZnJvbSBcImZvcm0tZGF0YVwiO1xuaW1wb3J0IHsgUmVzdEVycm9yIH0gZnJvbSBcIi4vcmVzdEVycm9yXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi9sb2dcIjtcbmltcG9ydCBub2RlX2ZldGNoIGZyb20gXCJub2RlLWZldGNoXCI7XG5mdW5jdGlvbiBnZXRDYWNoZWRBZ2VudChpc0h0dHBzLCBhZ2VudENhY2hlKSB7XG4gICAgcmV0dXJuIGlzSHR0cHMgPyBhZ2VudENhY2hlLmh0dHBzQWdlbnQgOiBhZ2VudENhY2hlLmh0dHBBZ2VudDtcbn1cbmV4cG9ydCBjbGFzcyBSZXBvcnRUcmFuc2Zvcm0gZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuICAgIGNvbnN0cnVjdG9yKHByb2dyZXNzQ2FsbGJhY2spIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0NhbGxiYWNrID0gcHJvZ3Jlc3NDYWxsYmFjaztcbiAgICAgICAgdGhpcy5sb2FkZWRCeXRlcyA9IDA7XG4gICAgfVxuICAgIF90cmFuc2Zvcm0oY2h1bmssIF9lbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5wdXNoKGNodW5rKTtcbiAgICAgICAgdGhpcy5sb2FkZWRCeXRlcyArPSBjaHVuay5sZW5ndGg7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NDYWxsYmFjayh7IGxvYWRlZEJ5dGVzOiB0aGlzLmxvYWRlZEJ5dGVzIH0pO1xuICAgICAgICBjYWxsYmFjayh1bmRlZmluZWQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzUmVhZGFibGVTdHJlYW0oYm9keSkge1xuICAgIHJldHVybiBib2R5ICYmIHR5cGVvZiBib2R5LnBpcGUgPT09IFwiZnVuY3Rpb25cIjtcbn1cbmZ1bmN0aW9uIGlzU3RyZWFtQ29tcGxldGUoc3RyZWFtLCBhYm9ydGVyKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHN0cmVhbS5vbmNlKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgICAgICAgICAgYWJvcnRlciA9PT0gbnVsbCB8fCBhYm9ydGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhYm9ydGVyLmFib3J0KCk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzdHJlYW0ub25jZShcImVuZFwiLCByZXNvbHZlKTtcbiAgICAgICAgc3RyZWFtLm9uY2UoXCJlcnJvclwiLCByZXNvbHZlKTtcbiAgICB9KTtcbn1cbi8qKlxuICogVHJhbnNmb3JtcyBhIHNldCBvZiBoZWFkZXJzIGludG8gdGhlIGtleS92YWx1ZSBwYWlyIGRlZmluZWQgYnkge0BsaW5rIEh0dHBIZWFkZXJzTGlrZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSGVhZGVycyhoZWFkZXJzKSB7XG4gICAgY29uc3QgaHR0cEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcbiAgICBoZWFkZXJzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgaHR0cEhlYWRlcnMuc2V0KGtleSwgdmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBodHRwSGVhZGVycztcbn1cbi8qKlxuICogQW4gSFRUUCBjbGllbnQgdGhhdCB1c2VzIGBub2RlLWZldGNoYC5cbiAqL1xuZXhwb3J0IGNsYXNzIE5vZGVGZXRjaEh0dHBDbGllbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBhIG1hcHBpbmcgb2YgcHJveHkgc2V0dGluZ3Mgc3RyaW5nIGAke2hvc3R9OiR7cG9ydH06JHt1c2VybmFtZX06JHtwYXNzd29yZH1gIHRvIGFnZW50XG4gICAgICAgIHRoaXMucHJveHlBZ2VudE1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5rZWVwQWxpdmVBZ2VudHMgPSB7fTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgbWluaW11bSB2aWFibGUgZXJyb3IgaGFuZGxpbmcgYW5kIHRoZSBsb2dpYyB0aGF0IGV4ZWN1dGVzIHRoZSBhYnN0cmFjdCBtZXRob2RzLlxuICAgICAqIEBwYXJhbSBodHRwUmVxdWVzdCAtIE9iamVjdCByZXByZXNlbnRpbmcgdGhlIG91dGdvaW5nIEhUVFAgcmVxdWVzdC5cbiAgICAgKiBAcmV0dXJucyBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBpbmNvbWluZyBIVFRQIHJlc3BvbnNlLlxuICAgICAqL1xuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KGh0dHBSZXF1ZXN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCFodHRwUmVxdWVzdCAmJiB0eXBlb2YgaHR0cFJlcXVlc3QgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIidodHRwUmVxdWVzdCcgKFdlYlJlc291cmNlTGlrZSkgY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkIGFuZCBtdXN0IGJlIG9mIHR5cGUgb2JqZWN0LlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIGxldCBhYm9ydExpc3RlbmVyO1xuICAgICAgICBpZiAoaHR0cFJlcXVlc3QuYWJvcnRTaWduYWwpIHtcbiAgICAgICAgICAgIGlmIChodHRwUmVxdWVzdC5hYm9ydFNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoXCJUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFib3J0TGlzdGVuZXIgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJhYm9ydFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBodHRwUmVxdWVzdC5hYm9ydFNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgYWJvcnRMaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGh0dHBSZXF1ZXN0LnRpbWVvdXQpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgfSwgaHR0cFJlcXVlc3QudGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGh0dHBSZXF1ZXN0LmZvcm1EYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtRGF0YSA9IGh0dHBSZXF1ZXN0LmZvcm1EYXRhO1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEZvcm0gPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICAgIGNvbnN0IGFwcGVuZEZvcm1WYWx1ZSA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gdmFsdWUgZnVuY3Rpb24gcHJvYmFibHkgcmV0dXJucyBhIHN0cmVhbSBzbyB3ZSBjYW4gcHJvdmlkZSBhIGZyZXNoIHN0cmVhbSBvbiBlYWNoIHJldHJ5XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgXCJ2YWx1ZVwiKSAmJlxuICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIFwib3B0aW9uc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Rm9ybS5hcHBlbmQoa2V5LCB2YWx1ZS52YWx1ZSwgdmFsdWUub3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Rm9ybS5hcHBlbmQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZm9ybUtleSBvZiBPYmplY3Qua2V5cyhmb3JtRGF0YSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSBmb3JtRGF0YVtmb3JtS2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmb3JtVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZm9ybVZhbHVlLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRGb3JtVmFsdWUoZm9ybUtleSwgZm9ybVZhbHVlW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kRm9ybVZhbHVlKGZvcm1LZXksIGZvcm1WYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaHR0cFJlcXVlc3QuYm9keSA9IHJlcXVlc3RGb3JtO1xuICAgICAgICAgICAgaHR0cFJlcXVlc3QuZm9ybURhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IGh0dHBSZXF1ZXN0LmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpO1xuICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlICYmIGNvbnRlbnRUeXBlLmluZGV4T2YoXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVxdWVzdEZvcm0uZ2V0Qm91bmRhcnkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdC5oZWFkZXJzLnNldChcIkNvbnRlbnQtVHlwZVwiLCBgbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JHtyZXF1ZXN0Rm9ybS5nZXRCb3VuZGFyeSgpfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYnJvd3NlciB3aWxsIGF1dG9tYXRpY2FsbHkgYXBwbHkgYSBzdWl0YWJsZSBjb250ZW50LXR5cGUgaGVhZGVyXG4gICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnMucmVtb3ZlKFwiQ29udGVudC1UeXBlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgYm9keSA9IGh0dHBSZXF1ZXN0LmJvZHlcbiAgICAgICAgICAgID8gdHlwZW9mIGh0dHBSZXF1ZXN0LmJvZHkgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgID8gaHR0cFJlcXVlc3QuYm9keSgpXG4gICAgICAgICAgICAgICAgOiBodHRwUmVxdWVzdC5ib2R5XG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGh0dHBSZXF1ZXN0Lm9uVXBsb2FkUHJvZ3Jlc3MgJiYgaHR0cFJlcXVlc3QuYm9keSkge1xuICAgICAgICAgICAgY29uc3Qgb25VcGxvYWRQcm9ncmVzcyA9IGh0dHBSZXF1ZXN0Lm9uVXBsb2FkUHJvZ3Jlc3M7XG4gICAgICAgICAgICBjb25zdCB1cGxvYWRSZXBvcnRTdHJlYW0gPSBuZXcgUmVwb3J0VHJhbnNmb3JtKG9uVXBsb2FkUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgaWYgKGlzUmVhZGFibGVTdHJlYW0oYm9keSkpIHtcbiAgICAgICAgICAgICAgICBib2R5LnBpcGUodXBsb2FkUmVwb3J0U3RyZWFtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHVwbG9hZFJlcG9ydFN0cmVhbS5lbmQoYm9keSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBib2R5ID0gdXBsb2FkUmVwb3J0U3RyZWFtO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBsYXRmb3JtU3BlY2lmaWNSZXF1ZXN0SW5pdCA9IGF3YWl0IHRoaXMucHJlcGFyZVJlcXVlc3QoaHR0cFJlcXVlc3QpO1xuICAgICAgICBjb25zdCByZXF1ZXN0SW5pdCA9IE9iamVjdC5hc3NpZ24oeyBib2R5OiBib2R5LCBoZWFkZXJzOiBodHRwUmVxdWVzdC5oZWFkZXJzLnJhd0hlYWRlcnMoKSwgbWV0aG9kOiBodHRwUmVxdWVzdC5tZXRob2QsIFxuICAgICAgICAgICAgLy8gdGhlIHR5cGVzIGZvciBSZXF1ZXN0SW5pdCBhcmUgZnJvbSB0aGUgYnJvd3Nlciwgd2hpY2ggZXhwZWN0cyBBYm9ydFNpZ25hbCB0b1xuICAgICAgICAgICAgLy8gaGF2ZSBgcmVhc29uYCBhbmQgYHRocm93SWZBYm9ydGVkYCwgYnV0IHRoZXNlIGRvbid0IGV4aXN0IG9uIG91ciBwb2x5ZmlsbFxuICAgICAgICAgICAgLy8gZm9yIE5vZGUuXG4gICAgICAgICAgICBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwsIHJlZGlyZWN0OiBcIm1hbnVhbFwiIH0sIHBsYXRmb3JtU3BlY2lmaWNSZXF1ZXN0SW5pdCk7XG4gICAgICAgIGxldCBvcGVyYXRpb25SZXNwb25zZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaChodHRwUmVxdWVzdC51cmwsIHJlcXVlc3RJbml0KTtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSBwYXJzZUhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyk7XG4gICAgICAgICAgICBjb25zdCBzdHJlYW1pbmcgPSAoKF9hID0gaHR0cFJlcXVlc3Quc3RyZWFtUmVzcG9uc2VTdGF0dXNDb2RlcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhhcyhyZXNwb25zZS5zdGF0dXMpKSB8fFxuICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0LnN0cmVhbVJlc3BvbnNlQm9keTtcbiAgICAgICAgICAgIG9wZXJhdGlvblJlc3BvbnNlID0ge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgcmVxdWVzdDogaHR0cFJlcXVlc3QsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgICAgICAgcmVhZGFibGVTdHJlYW1Cb2R5OiBzdHJlYW1pbmdcbiAgICAgICAgICAgICAgICAgICAgPyByZXNwb25zZS5ib2R5XG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGJvZHlBc1RleHQ6ICFzdHJlYW1pbmcgPyBhd2FpdCByZXNwb25zZS50ZXh0KCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3Qgb25Eb3dubG9hZFByb2dyZXNzID0gaHR0cFJlcXVlc3Qub25Eb3dubG9hZFByb2dyZXNzO1xuICAgICAgICAgICAgaWYgKG9uRG93bmxvYWRQcm9ncmVzcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IHJlc3BvbnNlLmJvZHkgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmIChpc1JlYWRhYmxlU3RyZWFtKHJlc3BvbnNlQm9keSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZG93bmxvYWRSZXBvcnRTdHJlYW0gPSBuZXcgUmVwb3J0VHJhbnNmb3JtKG9uRG93bmxvYWRQcm9ncmVzcyk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQm9keS5waXBlKGRvd25sb2FkUmVwb3J0U3RyZWFtKTtcbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uUmVzcG9uc2UucmVhZGFibGVTdHJlYW1Cb2R5ID0gZG93bmxvYWRSZXBvcnRTdHJlYW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChoZWFkZXJzLmdldChcIkNvbnRlbnQtTGVuZ3RoXCIpKSB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGxpbmcgY2FsbGJhY2sgZm9yIG5vbi1zdHJlYW0gcmVzcG9uc2UgZm9yIGNvbnNpc3RlbmN5IHdpdGggYnJvd3NlclxuICAgICAgICAgICAgICAgICAgICAgICAgb25Eb3dubG9hZFByb2dyZXNzKHsgbG9hZGVkQnl0ZXM6IGxlbmd0aCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc1JlcXVlc3Qob3BlcmF0aW9uUmVzcG9uc2UpO1xuICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvblJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc3QgZmV0Y2hFcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgaWYgKGZldGNoRXJyb3IuY29kZSA9PT0gXCJFTk9URk9VTkRcIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXN0RXJyb3IoZmV0Y2hFcnJvci5tZXNzYWdlLCBSZXN0RXJyb3IuUkVRVUVTVF9TRU5EX0VSUk9SLCB1bmRlZmluZWQsIGh0dHBSZXF1ZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGZldGNoRXJyb3IudHlwZSA9PT0gXCJhYm9ydGVkXCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWJvcnRFcnJvcihcIlRoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZmV0Y2hFcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIC8vIGNsZWFuIHVwIGV2ZW50IGxpc3RlbmVyXG4gICAgICAgICAgICBpZiAoaHR0cFJlcXVlc3QuYWJvcnRTaWduYWwgJiYgYWJvcnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIGxldCB1cGxvYWRTdHJlYW1Eb25lID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzUmVhZGFibGVTdHJlYW0oYm9keSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBsb2FkU3RyZWFtRG9uZSA9IGlzU3RyZWFtQ29tcGxldGUoYm9keSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBkb3dubG9hZFN0cmVhbURvbmUgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNSZWFkYWJsZVN0cmVhbShvcGVyYXRpb25SZXNwb25zZSA9PT0gbnVsbCB8fCBvcGVyYXRpb25SZXNwb25zZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3BlcmF0aW9uUmVzcG9uc2UucmVhZGFibGVTdHJlYW1Cb2R5KSkge1xuICAgICAgICAgICAgICAgICAgICBkb3dubG9hZFN0cmVhbURvbmUgPSBpc1N0cmVhbUNvbXBsZXRlKG9wZXJhdGlvblJlc3BvbnNlLnJlYWRhYmxlU3RyZWFtQm9keSwgYWJvcnRDb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwoW3VwbG9hZFN0cmVhbURvbmUsIGRvd25sb2FkU3RyZWFtRG9uZV0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgICAgICAoX2EgPSBodHRwUmVxdWVzdC5hYm9ydFNpZ25hbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydExpc3RlbmVyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZyhcIkVycm9yIHdoZW4gY2xlYW5pbmcgdXAgYWJvcnRMaXN0ZW5lciBvbiBodHRwUmVxdWVzdFwiLCBlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRPckNyZWF0ZUFnZW50KGh0dHBSZXF1ZXN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgaXNIdHRwcyA9IGlzVXJsSHR0cHMoaHR0cFJlcXVlc3QudXJsKTtcbiAgICAgICAgLy8gQXQgdGhlIG1vbWVudCwgcHJveHkgc2V0dGluZ3MgYW5kIGtlZXBBbGl2ZSBhcmUgbXV0dWFsbHlcbiAgICAgICAgLy8gZXhjbHVzaXZlIGJlY2F1c2UgdGhlICd0dW5uZWwnIGxpYnJhcnkgY3VycmVudGx5IGxhY2tzIHRoZVxuICAgICAgICAvLyBhYmlsaXR5IHRvIGNyZWF0ZSBhIHByb3h5IHdpdGgga2VlcEFsaXZlIHR1cm5lZCBvbi5cbiAgICAgICAgaWYgKGh0dHBSZXF1ZXN0LnByb3h5U2V0dGluZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgaG9zdCwgcG9ydCwgdXNlcm5hbWUsIHBhc3N3b3JkIH0gPSBodHRwUmVxdWVzdC5wcm94eVNldHRpbmdzO1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gYCR7aG9zdH06JHtwb3J0fToke3VzZXJuYW1lfToke3Bhc3N3b3JkfWA7XG4gICAgICAgICAgICBjb25zdCBwcm94eUFnZW50cyA9IChfYSA9IHRoaXMucHJveHlBZ2VudE1hcC5nZXQoa2V5KSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge307XG4gICAgICAgICAgICBsZXQgYWdlbnQgPSBnZXRDYWNoZWRBZ2VudChpc0h0dHBzLCBwcm94eUFnZW50cyk7XG4gICAgICAgICAgICBpZiAoYWdlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWdlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0dW5uZWwgPSBjcmVhdGVQcm94eUFnZW50KGh0dHBSZXF1ZXN0LnVybCwgaHR0cFJlcXVlc3QucHJveHlTZXR0aW5ncywgaHR0cFJlcXVlc3QuaGVhZGVycyk7XG4gICAgICAgICAgICBhZ2VudCA9IHR1bm5lbC5hZ2VudDtcbiAgICAgICAgICAgIGlmICh0dW5uZWwuaXNIdHRwcykge1xuICAgICAgICAgICAgICAgIHByb3h5QWdlbnRzLmh0dHBzQWdlbnQgPSB0dW5uZWwuYWdlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcm94eUFnZW50cy5odHRwQWdlbnQgPSB0dW5uZWwuYWdlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb3h5QWdlbnRNYXAuc2V0KGtleSwgcHJveHlBZ2VudHMpO1xuICAgICAgICAgICAgcmV0dXJuIGFnZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGh0dHBSZXF1ZXN0LmtlZXBBbGl2ZSkge1xuICAgICAgICAgICAgbGV0IGFnZW50ID0gZ2V0Q2FjaGVkQWdlbnQoaXNIdHRwcywgdGhpcy5rZWVwQWxpdmVBZ2VudHMpO1xuICAgICAgICAgICAgaWYgKGFnZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFnZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWdlbnRPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIGtlZXBBbGl2ZTogaHR0cFJlcXVlc3Qua2VlcEFsaXZlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChpc0h0dHBzKSB7XG4gICAgICAgICAgICAgICAgYWdlbnQgPSB0aGlzLmtlZXBBbGl2ZUFnZW50cy5odHRwc0FnZW50ID0gbmV3IGh0dHBzLkFnZW50KGFnZW50T3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhZ2VudCA9IHRoaXMua2VlcEFsaXZlQWdlbnRzLmh0dHBBZ2VudCA9IG5ldyBodHRwLkFnZW50KGFnZW50T3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWdlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaXNIdHRwcyA/IGh0dHBzLmdsb2JhbEFnZW50IDogaHR0cC5nbG9iYWxBZ2VudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBVc2VzIGBub2RlLWZldGNoYCB0byBwZXJmb3JtIHRoZSByZXF1ZXN0LlxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYXp1cmUvYXp1cmUtc2RrL3RzLWFwaXN1cmZhY2Utc3RhbmRhcmRpemVkLXZlcmJzXG4gICAgYXN5bmMgZmV0Y2goaW5wdXQsIGluaXQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVfZmV0Y2goaW5wdXQsIGluaXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlcyBhIHJlcXVlc3QgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHdlYiByZXNvdXJjZS5cbiAgICAgKi9cbiAgICBhc3luYyBwcmVwYXJlUmVxdWVzdChodHRwUmVxdWVzdCkge1xuICAgICAgICBjb25zdCByZXF1ZXN0SW5pdCA9IHt9O1xuICAgICAgICAvLyBTZXQgdGhlIGh0dHAocykgYWdlbnRcbiAgICAgICAgcmVxdWVzdEluaXQuYWdlbnQgPSB0aGlzLmdldE9yQ3JlYXRlQWdlbnQoaHR0cFJlcXVlc3QpO1xuICAgICAgICByZXF1ZXN0SW5pdC5jb21wcmVzcyA9IGh0dHBSZXF1ZXN0LmRlY29tcHJlc3NSZXNwb25zZTtcbiAgICAgICAgcmV0dXJuIHJlcXVlc3RJbml0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIGFuIEhUVFAgcmVzcG9uc2UuXG4gICAgICovXG4gICAgYXN5bmMgcHJvY2Vzc1JlcXVlc3QoX29wZXJhdGlvblJlc3BvbnNlKSB7XG4gICAgICAgIC8qIG5vX29wICovXG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9kZUZldGNoSHR0cENsaWVudC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IERlZmF1bHRIdHRwQ2xpZW50IH0gZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmNvbnN0IF9kZWZhdWx0SHR0cENsaWVudCA9IG5ldyBEZWZhdWx0SHR0cENsaWVudCgpO1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhY2hlZERlZmF1bHRIdHRwQ2xpZW50KCkge1xuICAgIHJldHVybiBfZGVmYXVsdEh0dHBDbGllbnQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jYWNoZS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEFib3J0RXJyb3IgfSBmcm9tIFwiQGF6dXJlL2Fib3J0LWNvbnRyb2xsZXJcIjtcbi8qKlxuICogQ3JlYXRlcyBhbiBhYm9ydGFibGUgcHJvbWlzZS5cbiAqIEBwYXJhbSBidWlsZFByb21pc2UgLSBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIHJlc29sdmUgYW5kIHJlamVjdCBmdW5jdGlvbnMgYXMgcGFyYW1ldGVycy5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBhYm9ydGFibGUgcHJvbWlzZS5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IGNhbiBiZSBhYm9ydGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQWJvcnRhYmxlUHJvbWlzZShidWlsZFByb21pc2UsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IGNsZWFudXBCZWZvcmVBYm9ydCwgYWJvcnRTaWduYWwsIGFib3J0RXJyb3JNc2cgfSA9IG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwID8gb3B0aW9ucyA6IHt9O1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdE9uQWJvcnQoKSB7XG4gICAgICAgICAgICByZWplY3QobmV3IEFib3J0RXJyb3IoYWJvcnRFcnJvck1zZyAhPT0gbnVsbCAmJiBhYm9ydEVycm9yTXNnICE9PSB2b2lkIDAgPyBhYm9ydEVycm9yTXNnIDogXCJUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkLlwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXJzKCkge1xuICAgICAgICAgICAgYWJvcnRTaWduYWwgPT09IG51bGwgfHwgYWJvcnRTaWduYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFib3J0U2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBvbkFib3J0KCkge1xuICAgICAgICAgICAgY2xlYW51cEJlZm9yZUFib3J0ID09PSBudWxsIHx8IGNsZWFudXBCZWZvcmVBYm9ydCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xlYW51cEJlZm9yZUFib3J0KCk7XG4gICAgICAgICAgICByZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIHJlamVjdE9uQWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWJvcnRTaWduYWwgPT09IG51bGwgfHwgYWJvcnRTaWduYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFib3J0U2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZWplY3RPbkFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGJ1aWxkUHJvbWlzZSgoeCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVycygpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoeCk7XG4gICAgICAgICAgICB9LCAoeCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVycygpO1xuICAgICAgICAgICAgICAgIHJlamVjdCh4KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGFib3J0U2lnbmFsID09PSBudWxsIHx8IGFib3J0U2lnbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhYm9ydFNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCk7XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jcmVhdGVBYm9ydGFibGVQcm9taXNlLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgY3JlYXRlQWJvcnRhYmxlUHJvbWlzZSB9IGZyb20gXCIuL2NyZWF0ZUFib3J0YWJsZVByb21pc2VcIjtcbmNvbnN0IFN0YW5kYXJkQWJvcnRNZXNzYWdlID0gXCJUaGUgZGVsYXkgd2FzIGFib3J0ZWQuXCI7XG4vKipcbiAqIEEgd3JhcHBlciBmb3Igc2V0VGltZW91dCB0aGF0IHJlc29sdmVzIGEgcHJvbWlzZSBhZnRlciB0aW1lSW5NcyBtaWxsaXNlY29uZHMuXG4gKiBAcGFyYW0gdGltZUluTXMgLSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBiZSBkZWxheWVkLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZGVsYXkgLSBjdXJyZW50bHkgYWJvcnQgb3B0aW9uc1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIGFmdGVyIHRpbWVJbk1zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxheSh0aW1lSW5Ncywgb3B0aW9ucykge1xuICAgIGxldCB0b2tlbjtcbiAgICBjb25zdCB7IGFib3J0U2lnbmFsLCBhYm9ydEVycm9yTXNnIH0gPSBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiB7fTtcbiAgICByZXR1cm4gY3JlYXRlQWJvcnRhYmxlUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0b2tlbiA9IHNldFRpbWVvdXQocmVzb2x2ZSwgdGltZUluTXMpO1xuICAgIH0sIHtcbiAgICAgICAgY2xlYW51cEJlZm9yZUFib3J0OiAoKSA9PiBjbGVhclRpbWVvdXQodG9rZW4pLFxuICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgYWJvcnRFcnJvck1zZzogYWJvcnRFcnJvck1zZyAhPT0gbnVsbCAmJiBhYm9ydEVycm9yTXNnICE9PSB2b2lkIDAgPyBhYm9ydEVycm9yTXNnIDogU3RhbmRhcmRBYm9ydE1lc3NhZ2UsXG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWxheS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IFVSTEJ1aWxkZXIgfSBmcm9tIFwiQGF6dXJlL2NvcmUtaHR0cFwiO1xuaW1wb3J0IHsgQmFzZVJlcXVlc3RQb2xpY3ksIH0gZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbi8qKlxuICogQSBzZXQgb2YgY29uc3RhbnRzIHVzZWQgaW50ZXJuYWxseSB3aGVuIHByb2Nlc3NpbmcgcmVxdWVzdHMuXG4gKi9cbmNvbnN0IENvbnN0YW50cyA9IHtcbiAgICBEZWZhdWx0U2NvcGU6IFwiLy5kZWZhdWx0XCIsXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBjb25zdGFudHMgZm9yIHVzZSB3aXRoIEhUVFAgaGVhZGVycy5cbiAgICAgKi9cbiAgICBIZWFkZXJDb25zdGFudHM6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBBdXRob3JpemF0aW9uIGhlYWRlci5cbiAgICAgICAgICovXG4gICAgICAgIEFVVEhPUklaQVRJT046IFwiYXV0aG9yaXphdGlvblwiLFxuICAgIH0sXG59O1xuLy8gRGVmYXVsdCBvcHRpb25zIGZvciB0aGUgY3ljbGVyIGlmIG5vbmUgYXJlIHByb3ZpZGVkXG5jb25zdCBERUZBVUxUX0NZQ0xFUl9PUFRJT05TID0ge1xuICAgIGZvcmNlZFJlZnJlc2hXaW5kb3dJbk1zOiAxMDAwLFxuICAgIHJldHJ5SW50ZXJ2YWxJbk1zOiAzMDAwLFxuICAgIHJlZnJlc2hXaW5kb3dJbk1zOiAxMDAwICogNjAgKiAyLCAvLyBTdGFydCByZWZyZXNoaW5nIDJtIGJlZm9yZSBleHBpcnlcbn07XG4vKipcbiAqIENvbnZlcnRzIGFuIGFuIHVucmVsaWFibGUgYWNjZXNzIHRva2VuIGdldHRlciAod2hpY2ggbWF5IHJlc29sdmUgd2l0aCBudWxsKVxuICogaW50byBhbiBBY2Nlc3NUb2tlbkdldHRlciBieSByZXRyeWluZyB0aGUgdW5yZWxpYWJsZSBnZXR0ZXIgaW4gYSByZWd1bGFyXG4gKiBpbnRlcnZhbC5cbiAqXG4gKiBAcGFyYW0gZ2V0QWNjZXNzVG9rZW4gLSBhIGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgYSBwcm9taXNlIG9mIGFuIGFjY2Vzc1xuICogdG9rZW4gdGhhdCBtYXkgZmFpbCBieSByZXR1cm5pbmcgbnVsbFxuICogQHBhcmFtIHJldHJ5SW50ZXJ2YWxJbk1zIC0gdGhlIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdG8gd2FpdCBiZXR3ZWVuIHJldHJ5XG4gKiBhdHRlbXB0c1xuICogQHBhcmFtIHRpbWVvdXRJbk1zIC0gdGhlIHRpbWVzdGFtcCBhZnRlciB3aGljaCB0aGUgcmVmcmVzaCBhdHRlbXB0IHdpbGwgZmFpbCxcbiAqIHRocm93aW5nIGFuIGV4Y2VwdGlvblxuICogQHJldHVybnMgLSBhIHByb21pc2UgdGhhdCwgaWYgaXQgcmVzb2x2ZXMsIHdpbGwgcmVzb2x2ZSB3aXRoIGFuIGFjY2VzcyB0b2tlblxuICovXG5hc3luYyBmdW5jdGlvbiBiZWdpblJlZnJlc2goZ2V0QWNjZXNzVG9rZW4sIHJldHJ5SW50ZXJ2YWxJbk1zLCB0aW1lb3V0SW5Ncykge1xuICAgIC8vIFRoaXMgd3JhcHBlciBoYW5kbGVzIGV4Y2VwdGlvbnMgZ3JhY2VmdWxseSBhcyBsb25nIGFzIHdlIGhhdmVuJ3QgZXhjZWVkZWRcbiAgICAvLyB0aGUgdGltZW91dC5cbiAgICBhc3luYyBmdW5jdGlvbiB0cnlHZXRBY2Nlc3NUb2tlbigpIHtcbiAgICAgICAgaWYgKERhdGUubm93KCkgPCB0aW1lb3V0SW5Ncykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmluYWxUb2tlbiA9IGF3YWl0IGdldEFjY2Vzc1Rva2VuKCk7XG4gICAgICAgICAgICAvLyBUaW1lb3V0IGlzIHVwLCBzbyB0aHJvdyBpZiBpdCdzIHN0aWxsIG51bGxcbiAgICAgICAgICAgIGlmIChmaW5hbFRva2VuID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIHJlZnJlc2ggYWNjZXNzIHRva2VuLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmaW5hbFRva2VuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCB0b2tlbiA9IGF3YWl0IHRyeUdldEFjY2Vzc1Rva2VuKCk7XG4gICAgd2hpbGUgKHRva2VuID09PSBudWxsKSB7XG4gICAgICAgIGF3YWl0IGRlbGF5KHJldHJ5SW50ZXJ2YWxJbk1zKTtcbiAgICAgICAgdG9rZW4gPSBhd2FpdCB0cnlHZXRBY2Nlc3NUb2tlbigpO1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW47XG59XG4vKipcbiAqIENyZWF0ZXMgYSB0b2tlbiBjeWNsZXIgZnJvbSBhIGNyZWRlbnRpYWwsIHNjb3BlcywgYW5kIG9wdGlvbmFsIHNldHRpbmdzLlxuICpcbiAqIEEgdG9rZW4gY3ljbGVyIHJlcHJlc2VudHMgYSB3YXkgdG8gcmVsaWFibHkgcmV0cmlldmUgYSB2YWxpZCBhY2Nlc3MgdG9rZW5cbiAqIGZyb20gYSBUb2tlbkNyZWRlbnRpYWwuIEl0IHdpbGwgaGFuZGxlIGluaXRpYWxpemluZyB0aGUgdG9rZW4sIHJlZnJlc2hpbmcgaXRcbiAqIHdoZW4gaXQgbmVhcnMgZXhwaXJhdGlvbiwgYW5kIHN5bmNocm9uaXplcyByZWZyZXNoIGF0dGVtcHRzIHRvIGF2b2lkXG4gKiBjb25jdXJyZW5jeSBoYXphcmRzLlxuICpcbiAqIEBwYXJhbSBjcmVkZW50aWFsIC0gdGhlIHVuZGVybHlpbmcgVG9rZW5DcmVkZW50aWFsIHRoYXQgcHJvdmlkZXMgdGhlIGFjY2Vzc1xuICogdG9rZW5cbiAqIEBwYXJhbSBzY29wZXMgLSB0aGUgc2NvcGVzIHRvIHJlcXVlc3QgYXV0aG9yaXphdGlvbiBmb3JcbiAqIEBwYXJhbSB0b2tlbkN5Y2xlck9wdGlvbnMgLSBvcHRpb25hbGx5IG92ZXJyaWRlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZSBjeWNsZXJcbiAqXG4gKiBAcmV0dXJucyAtIGEgZnVuY3Rpb24gdGhhdCByZWxpYWJseSBwcm9kdWNlcyBhIHZhbGlkIGFjY2VzcyB0b2tlblxuICovXG5mdW5jdGlvbiBjcmVhdGVUb2tlbkN5Y2xlcihjcmVkZW50aWFsLCBzY29wZXMsIHRva2VuQ3ljbGVyT3B0aW9ucykge1xuICAgIGxldCByZWZyZXNoV29ya2VyID0gbnVsbDtcbiAgICBsZXQgdG9rZW4gPSBudWxsO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ1lDTEVSX09QVElPTlMpLCB0b2tlbkN5Y2xlck9wdGlvbnMpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgbGl0dGxlIGhvbGRlciBkZWZpbmVzIHNldmVyYWwgcHJlZGljYXRlcyB0aGF0IHdlIHVzZSB0byBjb25zdHJ1Y3RcbiAgICAgKiB0aGUgcnVsZXMgb2YgcmVmcmVzaGluZyB0aGUgdG9rZW4uXG4gICAgICovXG4gICAgY29uc3QgY3ljbGVyID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogUHJvZHVjZXMgdHJ1ZSBpZiBhIHJlZnJlc2ggam9iIGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcy5cbiAgICAgICAgICovXG4gICAgICAgIGdldCBpc1JlZnJlc2hpbmcoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVmcmVzaFdvcmtlciAhPT0gbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFByb2R1Y2VzIHRydWUgaWYgdGhlIGN5Y2xlciBTSE9VTEQgcmVmcmVzaCAod2UgYXJlIHdpdGhpbiB0aGUgcmVmcmVzaFxuICAgICAgICAgKiB3aW5kb3cgYW5kIG5vdCBhbHJlYWR5IHJlZnJlc2hpbmcpXG4gICAgICAgICAqL1xuICAgICAgICBnZXQgc2hvdWxkUmVmcmVzaCgpIHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHJldHVybiAoIWN5Y2xlci5pc1JlZnJlc2hpbmcgJiZcbiAgICAgICAgICAgICAgICAoKF9hID0gdG9rZW4gPT09IG51bGwgfHwgdG9rZW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRva2VuLmV4cGlyZXNPblRpbWVzdGFtcCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMCkgLSBvcHRpb25zLnJlZnJlc2hXaW5kb3dJbk1zIDwgRGF0ZS5ub3coKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQcm9kdWNlcyB0cnVlIGlmIHRoZSBjeWNsZXIgTVVTVCByZWZyZXNoIChudWxsIG9yIG5lYXJseS1leHBpcmVkXG4gICAgICAgICAqIHRva2VuKS5cbiAgICAgICAgICovXG4gICAgICAgIGdldCBtdXN0UmVmcmVzaCgpIHtcbiAgICAgICAgICAgIHJldHVybiAodG9rZW4gPT09IG51bGwgfHwgdG9rZW4uZXhwaXJlc09uVGltZXN0YW1wIC0gb3B0aW9ucy5mb3JjZWRSZWZyZXNoV2luZG93SW5NcyA8IERhdGUubm93KCkpO1xuICAgICAgICB9LFxuICAgIH07XG4gICAgLyoqXG4gICAgICogU3RhcnRzIGEgcmVmcmVzaCBqb2Igb3IgcmV0dXJucyB0aGUgZXhpc3Rpbmcgam9iIGlmIG9uZSBpcyBhbHJlYWR5XG4gICAgICogcnVubmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWZyZXNoKGdldFRva2VuT3B0aW9ucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICghY3ljbGVyLmlzUmVmcmVzaGluZykge1xuICAgICAgICAgICAgLy8gV2UgYmluZCBgc2NvcGVzYCBoZXJlIHRvIGF2b2lkIHBhc3NpbmcgaXQgYXJvdW5kIGEgbG90XG4gICAgICAgICAgICBjb25zdCB0cnlHZXRBY2Nlc3NUb2tlbiA9ICgpID0+IGNyZWRlbnRpYWwuZ2V0VG9rZW4oc2NvcGVzLCBnZXRUb2tlbk9wdGlvbnMpO1xuICAgICAgICAgICAgLy8gVGFrZSBhZHZhbnRhZ2Ugb2YgcHJvbWlzZSBjaGFpbmluZyB0byBpbnNlcnQgYW4gYXNzaWdubWVudCB0byBgdG9rZW5gXG4gICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHJlZnJlc2ggY2FuIGJlIGNvbnNpZGVyZWQgZG9uZS5cbiAgICAgICAgICAgIHJlZnJlc2hXb3JrZXIgPSBiZWdpblJlZnJlc2godHJ5R2V0QWNjZXNzVG9rZW4sIG9wdGlvbnMucmV0cnlJbnRlcnZhbEluTXMsIFxuICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHRva2VuLCB0aGVuIHdlIHNob3VsZCB0aW1lb3V0IGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAoX2EgPSB0b2tlbiA9PT0gbnVsbCB8fCB0b2tlbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9rZW4uZXhwaXJlc09uVGltZXN0YW1wKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBEYXRlLm5vdygpKVxuICAgICAgICAgICAgICAgIC50aGVuKChfdG9rZW4pID0+IHtcbiAgICAgICAgICAgICAgICByZWZyZXNoV29ya2VyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0b2tlbiA9IF90b2tlbjtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gV2UgYWxzbyBzaG91bGQgcmVzZXQgdGhlIHJlZnJlc2hlciBpZiB3ZSBlbnRlciBhIGZhaWxlZCBzdGF0ZS4gIEFsbFxuICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIGF3YWl0ZXJzIHdpbGwgdGhyb3csIGJ1dCBzdWJzZXF1ZW50IHJlcXVlc3RzIHdpbGwgc3RhcnQgYVxuICAgICAgICAgICAgICAgIC8vIG5ldyByZXRyeSBjaGFpbi5cbiAgICAgICAgICAgICAgICByZWZyZXNoV29ya2VyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0b2tlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZnJlc2hXb3JrZXI7XG4gICAgfVxuICAgIHJldHVybiBhc3luYyAodG9rZW5PcHRpb25zKSA9PiB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNpbXBsZSBydWxlczpcbiAgICAgICAgLy8gLSBJZiB3ZSBNVVNUIHJlZnJlc2gsIHRoZW4gcmV0dXJuIHRoZSByZWZyZXNoIHRhc2ssIGJsb2NraW5nXG4gICAgICAgIC8vICAgdGhlIHBpcGVsaW5lIHVudGlsIGEgdG9rZW4gaXMgYXZhaWxhYmxlLlxuICAgICAgICAvLyAtIElmIHdlIFNIT1VMRCByZWZyZXNoLCB0aGVuIHJ1biByZWZyZXNoIGJ1dCBkb24ndCByZXR1cm4gaXRcbiAgICAgICAgLy8gICAod2UgY2FuIHN0aWxsIHVzZSB0aGUgY2FjaGVkIHRva2VuKS5cbiAgICAgICAgLy8gLSBSZXR1cm4gdGhlIHRva2VuLCBzaW5jZSBpdCdzIGZpbmUgaWYgd2UgZGlkbid0IHJldHVybiBpblxuICAgICAgICAvLyAgIHN0ZXAgMS5cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKGN5Y2xlci5tdXN0UmVmcmVzaClcbiAgICAgICAgICAgIHJldHVybiByZWZyZXNoKHRva2VuT3B0aW9ucyk7XG4gICAgICAgIGlmIChjeWNsZXIuc2hvdWxkUmVmcmVzaCkge1xuICAgICAgICAgICAgcmVmcmVzaCh0b2tlbk9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9O1xufVxuLyoqXG4gKiBXZSB3aWxsIHJldHJpZXZlIHRoZSBjaGFsbGVuZ2Ugb25seSBpZiB0aGUgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgd2FzIDQwMSxcbiAqIGFuZCBpZiB0aGUgcmVzcG9uc2UgY29udGFpbmVkIHRoZSBoZWFkZXIgXCJXV1ctQXV0aGVudGljYXRlXCIgd2l0aCBhIG5vbi1lbXB0eSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0Q2hhbGxlbmdlKHJlc3BvbnNlKSB7XG4gICAgY29uc3QgY2hhbGxlbmdlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJXV1ctQXV0aGVudGljYXRlXCIpO1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSAmJiBjaGFsbGVuZ2UpIHtcbiAgICAgICAgcmV0dXJuIGNoYWxsZW5nZTtcbiAgICB9XG4gICAgcmV0dXJuO1xufVxuLyoqXG4gKiBDb252ZXJ0czogYEJlYXJlciBhPVwiYlwiIGM9XCJkXCJgLlxuICogSW50bzogYFsgeyBhOiAnYicsIGM6ICdkJyB9XWAuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ2hhbGxlbmdlKGNoYWxsZW5nZSkge1xuICAgIGNvbnN0IGJlYXJlckNoYWxsZW5nZSA9IGNoYWxsZW5nZS5zbGljZShcIkJlYXJlciBcIi5sZW5ndGgpO1xuICAgIGNvbnN0IGNoYWxsZW5nZVBhcnRzID0gYCR7YmVhcmVyQ2hhbGxlbmdlLnRyaW0oKX0gYC5zcGxpdChcIiBcIikuZmlsdGVyKCh4KSA9PiB4KTtcbiAgICBjb25zdCBrZXlWYWx1ZVBhaXJzID0gY2hhbGxlbmdlUGFydHMubWFwKChrZXlWYWx1ZSkgPT4gKChba2V5LCB2YWx1ZV0pID0+ICh7IFtrZXldOiB2YWx1ZSB9KSkoa2V5VmFsdWUudHJpbSgpLnNwbGl0KFwiPVwiKSkpO1xuICAgIC8vIEtleS12YWx1ZSBwYWlycyB0byBwbGFpbiBvYmplY3Q6XG4gICAgcmV0dXJuIGtleVZhbHVlUGFpcnMucmVkdWNlKChhLCBiKSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhKSwgYikpLCB7fSk7XG59XG4vLyAjZW5kcmVnaW9uXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmFjdG9yeSBmb3IgYSBSZXF1ZXN0UG9saWN5IHRoYXQgYXBwbGllcyBhIGJlYXJlciB0b2tlbiB0b1xuICogdGhlIHJlcXVlc3RzJyBgQXV0aG9yaXphdGlvbmAgaGVhZGVycy5cbiAqXG4gKiBAcGFyYW0gY3JlZGVudGlhbCAtIFRoZSBUb2tlbkNyZWRlbnRpYWwgaW1wbGVtZW50YXRpb24gdGhhdCBjYW4gc3VwcGx5IHRoZSBiZWFyZXIgdG9rZW4uXG4gKiBAcGFyYW0gc2NvcGVzIC0gVGhlIHNjb3BlcyBmb3Igd2hpY2ggdGhlIGJlYXJlciB0b2tlbiBhcHBsaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RvcmFnZUJlYXJlclRva2VuQ2hhbGxlbmdlQXV0aGVudGljYXRpb25Qb2xpY3koY3JlZGVudGlhbCwgc2NvcGVzKSB7XG4gICAgLy8gVGhpcyBzaW1wbGUgZnVuY3Rpb24gZW5jYXBzdWxhdGVzIHRoZSBlbnRpcmUgcHJvY2VzcyBvZiByZWxpYWJseSByZXRyaWV2aW5nIHRoZSB0b2tlblxuICAgIGxldCBnZXRUb2tlbiA9IGNyZWF0ZVRva2VuQ3ljbGVyKGNyZWRlbnRpYWwsIHNjb3Blcyk7XG4gICAgY2xhc3MgU3RvcmFnZUJlYXJlclRva2VuQ2hhbGxlbmdlQXV0aGVudGljYXRpb25Qb2xpY3kgZXh0ZW5kcyBCYXNlUmVxdWVzdFBvbGljeSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKG5leHRQb2xpY3ksIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHN1cGVyKG5leHRQb2xpY3ksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHdlYlJlc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoIXdlYlJlc291cmNlLnVybC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJlYXJlciB0b2tlbiBhdXRoZW50aWNhdGlvbiBpcyBub3QgcGVybWl0dGVkIGZvciBub24tVExTIHByb3RlY3RlZCAobm9uLWh0dHBzKSBVUkxzLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGdldFRva2VuSW50ZXJuYWwgPSBnZXRUb2tlbjtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gKGF3YWl0IGdldFRva2VuSW50ZXJuYWwoe1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiB3ZWJSZXNvdXJjZS5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICB0cmFjaW5nQ29udGV4dDogd2ViUmVzb3VyY2UudHJhY2luZ0NvbnRleHQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pKS50b2tlbjtcbiAgICAgICAgICAgIHdlYlJlc291cmNlLmhlYWRlcnMuc2V0KENvbnN0YW50cy5IZWFkZXJDb25zdGFudHMuQVVUSE9SSVpBVElPTiwgYEJlYXJlciAke3Rva2VufWApO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9uZXh0UG9saWN5LnNlbmRSZXF1ZXN0KHdlYlJlc291cmNlKTtcbiAgICAgICAgICAgIGlmICgocmVzcG9uc2UgPT09IG51bGwgfHwgcmVzcG9uc2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3BvbnNlLnN0YXR1cykgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYWxsZW5nZSA9IGdldENoYWxsZW5nZShyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoYWxsZW5nZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFsbGVuZ2VJbmZvID0gcGFyc2VDaGFsbGVuZ2UoY2hhbGxlbmdlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhbGxlbmdlU2NvcGVzID0gY2hhbGxlbmdlSW5mby5yZXNvdXJjZV9pZCArIENvbnN0YW50cy5EZWZhdWx0U2NvcGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEF1dGhVcmkgPSBVUkxCdWlsZGVyLnBhcnNlKGNoYWxsZW5nZUluZm8uYXV0aG9yaXphdGlvbl91cmkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoU2VnbWVudHMgPSBwYXJzZWRBdXRoVXJpLmdldFBhdGgoKS5zcGxpdChcIi9cIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbmFudElkID0gcGF0aFNlZ21lbnRzWzFdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBnZXRUb2tlbkZvckNoYWxsZW5nZSA9IGNyZWF0ZVRva2VuQ3ljbGVyKGNyZWRlbnRpYWwsIGNoYWxsZW5nZVNjb3Blcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuRm9yQ2hhbGxlbmdlID0gKGF3YWl0IGdldFRva2VuRm9yQ2hhbGxlbmdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiB3ZWJSZXNvdXJjZS5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2luZ0NvbnRleHQ6IHdlYlJlc291cmNlLnRyYWNpbmdDb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbmFudElkOiB0ZW5hbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgfSkpLnRva2VuO1xuICAgICAgICAgICAgICAgICAgICBnZXRUb2tlbiA9IGdldFRva2VuRm9yQ2hhbGxlbmdlO1xuICAgICAgICAgICAgICAgICAgICB3ZWJSZXNvdXJjZS5oZWFkZXJzLnNldChDb25zdGFudHMuSGVhZGVyQ29uc3RhbnRzLkFVVEhPUklaQVRJT04sIGBCZWFyZXIgJHt0b2tlbkZvckNoYWxsZW5nZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25leHRQb2xpY3kuc2VuZFJlcXVlc3Qod2ViUmVzb3VyY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBjcmVhdGU6IChuZXh0UG9saWN5LCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VCZWFyZXJUb2tlbkNoYWxsZW5nZUF1dGhlbnRpY2F0aW9uUG9saWN5KG5leHRQb2xpY3ksIG9wdGlvbnMpO1xuICAgICAgICB9LFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdG9yYWdlQmVhcmVyVG9rZW5DaGFsbGVuZ2VBdXRoZW50aWNhdGlvblBvbGljeS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEJhc2VSZXF1ZXN0UG9saWN5LCBkZXNlcmlhbGl6YXRpb25Qb2xpY3ksIGRpc2FibGVSZXNwb25zZURlY29tcHJlc3Npb25Qb2xpY3ksIEh0dHBIZWFkZXJzLCBSZXF1ZXN0UG9saWN5T3B0aW9ucywgV2ViUmVzb3VyY2UsIHByb3h5UG9saWN5LCBpc05vZGUsIGlzVG9rZW5DcmVkZW50aWFsLCB0cmFjaW5nUG9saWN5LCBsb2dQb2xpY3ksIGtlZXBBbGl2ZVBvbGljeSwgZ2VuZXJhdGVDbGllbnRSZXF1ZXN0SWRQb2xpY3ksIH0gZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuL2xvZ1wiO1xuaW1wb3J0IHsgU3RvcmFnZUJyb3dzZXJQb2xpY3lGYWN0b3J5IH0gZnJvbSBcIi4vU3RvcmFnZUJyb3dzZXJQb2xpY3lGYWN0b3J5XCI7XG5pbXBvcnQgeyBTdG9yYWdlUmV0cnlQb2xpY3lGYWN0b3J5IH0gZnJvbSBcIi4vU3RvcmFnZVJldHJ5UG9saWN5RmFjdG9yeVwiO1xuaW1wb3J0IHsgQW5vbnltb3VzQ3JlZGVudGlhbCB9IGZyb20gXCIuL2NyZWRlbnRpYWxzL0Fub255bW91c0NyZWRlbnRpYWxcIjtcbmltcG9ydCB7IFN0b3JhZ2VPQXV0aFNjb3BlcywgU3RvcmFnZUJsb2JMb2dnaW5nQWxsb3dlZEhlYWRlck5hbWVzLCBTdG9yYWdlQmxvYkxvZ2dpbmdBbGxvd2VkUXVlcnlQYXJhbWV0ZXJzLCB9IGZyb20gXCIuL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgVGVsZW1ldHJ5UG9saWN5RmFjdG9yeSB9IGZyb20gXCIuL1RlbGVtZXRyeVBvbGljeUZhY3RvcnlcIjtcbmltcG9ydCB7IGdldENhY2hlZERlZmF1bHRIdHRwQ2xpZW50IH0gZnJvbSBcIi4vdXRpbHMvY2FjaGVcIjtcbmltcG9ydCB7IGF0dGFjaENyZWRlbnRpYWwgfSBmcm9tIFwiLi91dGlscy91dGlscy5jb21tb25cIjtcbmltcG9ydCB7IHN0b3JhZ2VCZWFyZXJUb2tlbkNoYWxsZW5nZUF1dGhlbnRpY2F0aW9uUG9saWN5IH0gZnJvbSBcIi4vcG9saWNpZXMvU3RvcmFnZUJlYXJlclRva2VuQ2hhbGxlbmdlQXV0aGVudGljYXRpb25Qb2xpY3lcIjtcbi8vIEV4cG9ydCBmb2xsb3dpbmcgaW50ZXJmYWNlcyBhbmQgdHlwZXMgZm9yIGN1c3RvbWVycyB3aG8gd2FudCB0byBpbXBsZW1lbnQgdGhlaXJcbi8vIG93biBSZXF1ZXN0UG9saWN5IG9yIEhUVFBDbGllbnRcbmV4cG9ydCB7IEJhc2VSZXF1ZXN0UG9saWN5LCBTdG9yYWdlT0F1dGhTY29wZXMsIGRlc2VyaWFsaXphdGlvblBvbGljeSwgSHR0cEhlYWRlcnMsIFdlYlJlc291cmNlLCBSZXF1ZXN0UG9saWN5T3B0aW9ucywgfTtcbi8qKlxuICogQSBoZWxwZXIgdG8gZGVjaWRlIGlmIGEgZ2l2ZW4gYXJndW1lbnQgc2F0aXNmaWVzIHRoZSBQaXBlbGluZSBjb250cmFjdFxuICogQHBhcmFtIHBpcGVsaW5lIC0gQW4gYXJndW1lbnQgdGhhdCBtYXkgYmUgYSBQaXBlbGluZVxuICogQHJldHVybnMgdHJ1ZSB3aGVuIHRoZSBhcmd1bWVudCBzYXRpc2ZpZXMgdGhlIFBpcGVsaW5lIGNvbnRyYWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BpcGVsaW5lTGlrZShwaXBlbGluZSkge1xuICAgIGlmICghcGlwZWxpbmUgfHwgdHlwZW9mIHBpcGVsaW5lICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY2FzdFBpcGVsaW5lID0gcGlwZWxpbmU7XG4gICAgcmV0dXJuIChBcnJheS5pc0FycmF5KGNhc3RQaXBlbGluZS5mYWN0b3JpZXMpICYmXG4gICAgICAgIHR5cGVvZiBjYXN0UGlwZWxpbmUub3B0aW9ucyA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICB0eXBlb2YgY2FzdFBpcGVsaW5lLnRvU2VydmljZUNsaWVudE9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIik7XG59XG4vKipcbiAqIEEgUGlwZWxpbmUgY2xhc3MgY29udGFpbmluZyBIVFRQIHJlcXVlc3QgcG9saWNpZXMuXG4gKiBZb3UgY2FuIGNyZWF0ZSBhIGRlZmF1bHQgUGlwZWxpbmUgYnkgY2FsbGluZyB7QGxpbmsgbmV3UGlwZWxpbmV9LlxuICogT3IgeW91IGNhbiBjcmVhdGUgYSBQaXBlbGluZSB3aXRoIHlvdXIgb3duIHBvbGljaWVzIGJ5IHRoZSBjb25zdHJ1Y3RvciBvZiBQaXBlbGluZS5cbiAqXG4gKiBSZWZlciB0byB7QGxpbmsgbmV3UGlwZWxpbmV9IGFuZCBwcm92aWRlZCBwb2xpY2llcyBiZWZvcmUgaW1wbGVtZW50aW5nIHlvdXJcbiAqIGN1c3RvbWl6ZWQgUGlwZWxpbmUuXG4gKi9cbmV4cG9ydCBjbGFzcyBQaXBlbGluZSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBQaXBlbGluZS4gQ3VzdG9taXplIEhUVFBDbGllbnQgYnkgaW1wbGVtZW50aW5nIElIdHRwQ2xpZW50IGludGVyZmFjZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmYWN0b3JpZXMgLVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihmYWN0b3JpZXMsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmZhY3RvcmllcyA9IGZhY3RvcmllcztcbiAgICAgICAgLy8gd2hlbiBvcHRpb25zLmh0dHBDbGllbnQgaXMgbm90IHNwZWNpZmllZCwgcGFzc2luZyBpbiBhIERlZmF1bHRIdHRwQ2xpZW50IGluc3RhbmNlIHRvXG4gICAgICAgIC8vIGF2b2lkIGVhY2ggY2xpZW50IGNyZWF0aW5nIGl0cyBvd24gaHR0cCBjbGllbnQuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHsgaHR0cENsaWVudDogb3B0aW9ucy5odHRwQ2xpZW50IHx8IGdldENhY2hlZERlZmF1bHRIdHRwQ2xpZW50KCkgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRyYW5zZmVyIFBpcGVsaW5lIG9iamVjdCB0byBTZXJ2aWNlQ2xpZW50T3B0aW9ucyBvYmplY3Qgd2hpY2ggaXMgcmVxdWlyZWQgYnlcbiAgICAgKiBTZXJ2aWNlQ2xpZW50IGNvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIFNlcnZpY2VDbGllbnRPcHRpb25zIG9iamVjdCBmcm9tIHRoaXMgUGlwZWxpbmUuXG4gICAgICovXG4gICAgdG9TZXJ2aWNlQ2xpZW50T3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGh0dHBDbGllbnQ6IHRoaXMub3B0aW9ucy5odHRwQ2xpZW50LFxuICAgICAgICAgICAgcmVxdWVzdFBvbGljeUZhY3RvcmllczogdGhpcy5mYWN0b3JpZXMsXG4gICAgICAgIH07XG4gICAgfVxufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFBpcGVsaW5lIG9iamVjdCB3aXRoIENyZWRlbnRpYWwgcHJvdmlkZWQuXG4gKlxuICogQHBhcmFtIGNyZWRlbnRpYWwgLSAgU3VjaCBhcyBBbm9ueW1vdXNDcmVkZW50aWFsLCBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCBvciBhbnkgY3JlZGVudGlhbCBmcm9tIHRoZSBgQGF6dXJlL2lkZW50aXR5YCBwYWNrYWdlIHRvIGF1dGhlbnRpY2F0ZSByZXF1ZXN0cyB0byB0aGUgc2VydmljZS4gWW91IGNhbiBhbHNvIHByb3ZpZGUgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgVG9rZW5DcmVkZW50aWFsIGludGVyZmFjZS4gSWYgbm90IHNwZWNpZmllZCwgQW5vbnltb3VzQ3JlZGVudGlhbCBpcyB1c2VkLlxuICogQHBhcmFtIHBpcGVsaW5lT3B0aW9ucyAtIE9wdGlvbmFsLiBPcHRpb25zLlxuICogQHJldHVybnMgQSBuZXcgUGlwZWxpbmUgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV3UGlwZWxpbmUoY3JlZGVudGlhbCwgcGlwZWxpbmVPcHRpb25zID0ge30pIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKGNyZWRlbnRpYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjcmVkZW50aWFsID0gbmV3IEFub255bW91c0NyZWRlbnRpYWwoKTtcbiAgICB9XG4gICAgLy8gT3JkZXIgaXMgaW1wb3J0YW50LiBDbG9zZXIgdG8gdGhlIEFQSSBhdCB0aGUgdG9wICYgY2xvc2VyIHRvIHRoZSBuZXR3b3JrIGF0IHRoZSBib3R0b20uXG4gICAgLy8gVGhlIGNyZWRlbnRpYWwncyBwb2xpY3kgZmFjdG9yeSBtdXN0IGFwcGVhciBjbG9zZSB0byB0aGUgd2lyZSBzbyBpdCBjYW4gc2lnbiBhbnlcbiAgICAvLyBjaGFuZ2VzIG1hZGUgYnkgb3RoZXIgZmFjdG9yaWVzIChsaWtlIFVuaXF1ZVJlcXVlc3RJRFBvbGljeUZhY3RvcnkpXG4gICAgY29uc3QgdGVsZW1ldHJ5UG9saWN5ID0gbmV3IFRlbGVtZXRyeVBvbGljeUZhY3RvcnkocGlwZWxpbmVPcHRpb25zLnVzZXJBZ2VudE9wdGlvbnMpO1xuICAgIGNvbnN0IGZhY3RvcmllcyA9IFtcbiAgICAgICAgdHJhY2luZ1BvbGljeSh7IHVzZXJBZ2VudDogdGVsZW1ldHJ5UG9saWN5LnRlbGVtZXRyeVN0cmluZyB9KSxcbiAgICAgICAga2VlcEFsaXZlUG9saWN5KHBpcGVsaW5lT3B0aW9ucy5rZWVwQWxpdmVPcHRpb25zKSxcbiAgICAgICAgdGVsZW1ldHJ5UG9saWN5LFxuICAgICAgICBnZW5lcmF0ZUNsaWVudFJlcXVlc3RJZFBvbGljeSgpLFxuICAgICAgICBuZXcgU3RvcmFnZUJyb3dzZXJQb2xpY3lGYWN0b3J5KCksXG4gICAgICAgIG5ldyBTdG9yYWdlUmV0cnlQb2xpY3lGYWN0b3J5KHBpcGVsaW5lT3B0aW9ucy5yZXRyeU9wdGlvbnMpLFxuICAgICAgICAvLyBEZWZhdWx0IGRlc2VyaWFsaXphdGlvblBvbGljeSBpcyBwcm92aWRlZCBieSBwcm90b2NvbCBsYXllclxuICAgICAgICAvLyBVc2UgY3VzdG9taXplZCBYTUwgY2hhciBrZXkgb2YgXCIjXCIgc28gd2UgY291bGQgZGVzZXJpYWxpemUgbWV0YWRhdGFcbiAgICAgICAgLy8gd2l0aCBcIl9cIiBrZXlcbiAgICAgICAgZGVzZXJpYWxpemF0aW9uUG9saWN5KHVuZGVmaW5lZCwgeyB4bWxDaGFyS2V5OiBcIiNcIiB9KSxcbiAgICAgICAgbG9nUG9saWN5KHtcbiAgICAgICAgICAgIGxvZ2dlcjogbG9nZ2VyLmluZm8sXG4gICAgICAgICAgICBhbGxvd2VkSGVhZGVyTmFtZXM6IFN0b3JhZ2VCbG9iTG9nZ2luZ0FsbG93ZWRIZWFkZXJOYW1lcyxcbiAgICAgICAgICAgIGFsbG93ZWRRdWVyeVBhcmFtZXRlcnM6IFN0b3JhZ2VCbG9iTG9nZ2luZ0FsbG93ZWRRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgIH0pLFxuICAgIF07XG4gICAgaWYgKGlzTm9kZSkge1xuICAgICAgICAvLyBwb2xpY2llcyBvbmx5IGF2YWlsYWJsZSBpbiBOb2RlLmpzIHJ1bnRpbWUsIG5vdCBpbiBicm93c2Vyc1xuICAgICAgICBmYWN0b3JpZXMucHVzaChwcm94eVBvbGljeShwaXBlbGluZU9wdGlvbnMucHJveHlPcHRpb25zKSk7XG4gICAgICAgIGZhY3Rvcmllcy5wdXNoKGRpc2FibGVSZXNwb25zZURlY29tcHJlc3Npb25Qb2xpY3koKSk7XG4gICAgfVxuICAgIGZhY3Rvcmllcy5wdXNoKGlzVG9rZW5DcmVkZW50aWFsKGNyZWRlbnRpYWwpXG4gICAgICAgID8gYXR0YWNoQ3JlZGVudGlhbChzdG9yYWdlQmVhcmVyVG9rZW5DaGFsbGVuZ2VBdXRoZW50aWNhdGlvblBvbGljeShjcmVkZW50aWFsLCAoX2EgPSBwaXBlbGluZU9wdGlvbnMuYXVkaWVuY2UpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFN0b3JhZ2VPQXV0aFNjb3BlcyksIGNyZWRlbnRpYWwpXG4gICAgICAgIDogY3JlZGVudGlhbCk7XG4gICAgcmV0dXJuIG5ldyBQaXBlbGluZShmYWN0b3JpZXMsIHBpcGVsaW5lT3B0aW9ucyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QaXBlbGluZS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEhlYWRlckNvbnN0YW50cyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldFVSTFBhdGgsIGdldFVSTFF1ZXJpZXMgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHMuY29tbW9uXCI7XG5pbXBvcnQgeyBDcmVkZW50aWFsUG9saWN5IH0gZnJvbSBcIi4vQ3JlZGVudGlhbFBvbGljeVwiO1xuLyoqXG4gKiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbFBvbGljeSBpcyBhIHBvbGljeSB1c2VkIHRvIHNpZ24gSFRUUCByZXF1ZXN0IHdpdGggYSBzaGFyZWQga2V5LlxuICovXG5leHBvcnQgY2xhc3MgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxQb2xpY3kgZXh0ZW5kcyBDcmVkZW50aWFsUG9saWN5IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsUG9saWN5LlxuICAgICAqIEBwYXJhbSBuZXh0UG9saWN5IC1cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICogQHBhcmFtIGZhY3RvcnkgLVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5leHRQb2xpY3ksIG9wdGlvbnMsIGZhY3RvcnkpIHtcbiAgICAgICAgc3VwZXIobmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpZ25zIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCAtXG4gICAgICovXG4gICAgc2lnblJlcXVlc3QocmVxdWVzdCkge1xuICAgICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KEhlYWRlckNvbnN0YW50cy5YX01TX0RBVEUsIG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSk7XG4gICAgICAgIGlmIChyZXF1ZXN0LmJvZHkgJiZcbiAgICAgICAgICAgICh0eXBlb2YgcmVxdWVzdC5ib2R5ID09PSBcInN0cmluZ1wiIHx8IHJlcXVlc3QuYm9keSAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgcmVxdWVzdC5ib2R5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVycy5zZXQoSGVhZGVyQ29uc3RhbnRzLkNPTlRFTlRfTEVOR1RILCBCdWZmZXIuYnl0ZUxlbmd0aChyZXF1ZXN0LmJvZHkpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHJpbmdUb1NpZ24gPSBbXG4gICAgICAgICAgICByZXF1ZXN0Lm1ldGhvZC50b1VwcGVyQ2FzZSgpLFxuICAgICAgICAgICAgdGhpcy5nZXRIZWFkZXJWYWx1ZVRvU2lnbihyZXF1ZXN0LCBIZWFkZXJDb25zdGFudHMuQ09OVEVOVF9MQU5HVUFHRSksXG4gICAgICAgICAgICB0aGlzLmdldEhlYWRlclZhbHVlVG9TaWduKHJlcXVlc3QsIEhlYWRlckNvbnN0YW50cy5DT05URU5UX0VOQ09ESU5HKSxcbiAgICAgICAgICAgIHRoaXMuZ2V0SGVhZGVyVmFsdWVUb1NpZ24ocmVxdWVzdCwgSGVhZGVyQ29uc3RhbnRzLkNPTlRFTlRfTEVOR1RIKSxcbiAgICAgICAgICAgIHRoaXMuZ2V0SGVhZGVyVmFsdWVUb1NpZ24ocmVxdWVzdCwgSGVhZGVyQ29uc3RhbnRzLkNPTlRFTlRfTUQ1KSxcbiAgICAgICAgICAgIHRoaXMuZ2V0SGVhZGVyVmFsdWVUb1NpZ24ocmVxdWVzdCwgSGVhZGVyQ29uc3RhbnRzLkNPTlRFTlRfVFlQRSksXG4gICAgICAgICAgICB0aGlzLmdldEhlYWRlclZhbHVlVG9TaWduKHJlcXVlc3QsIEhlYWRlckNvbnN0YW50cy5EQVRFKSxcbiAgICAgICAgICAgIHRoaXMuZ2V0SGVhZGVyVmFsdWVUb1NpZ24ocmVxdWVzdCwgSGVhZGVyQ29uc3RhbnRzLklGX01PRElGSUVEX1NJTkNFKSxcbiAgICAgICAgICAgIHRoaXMuZ2V0SGVhZGVyVmFsdWVUb1NpZ24ocmVxdWVzdCwgSGVhZGVyQ29uc3RhbnRzLklGX01BVENIKSxcbiAgICAgICAgICAgIHRoaXMuZ2V0SGVhZGVyVmFsdWVUb1NpZ24ocmVxdWVzdCwgSGVhZGVyQ29uc3RhbnRzLklGX05PTkVfTUFUQ0gpLFxuICAgICAgICAgICAgdGhpcy5nZXRIZWFkZXJWYWx1ZVRvU2lnbihyZXF1ZXN0LCBIZWFkZXJDb25zdGFudHMuSUZfVU5NT0RJRklFRF9TSU5DRSksXG4gICAgICAgICAgICB0aGlzLmdldEhlYWRlclZhbHVlVG9TaWduKHJlcXVlc3QsIEhlYWRlckNvbnN0YW50cy5SQU5HRSksXG4gICAgICAgIF0uam9pbihcIlxcblwiKSArXG4gICAgICAgICAgICBcIlxcblwiICtcbiAgICAgICAgICAgIHRoaXMuZ2V0Q2Fub25pY2FsaXplZEhlYWRlcnNTdHJpbmcocmVxdWVzdCkgK1xuICAgICAgICAgICAgdGhpcy5nZXRDYW5vbmljYWxpemVkUmVzb3VyY2VTdHJpbmcocmVxdWVzdCk7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRoaXMuZmFjdG9yeS5jb21wdXRlSE1BQ1NIQTI1NihzdHJpbmdUb1NpZ24pO1xuICAgICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KEhlYWRlckNvbnN0YW50cy5BVVRIT1JJWkFUSU9OLCBgU2hhcmVkS2V5ICR7dGhpcy5mYWN0b3J5LmFjY291bnROYW1lfToke3NpZ25hdHVyZX1gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtVUkxdOiR7cmVxdWVzdC51cmx9YCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbSEVBREVSU106JHtyZXF1ZXN0LmhlYWRlcnMudG9TdHJpbmcoKX1gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtTVFJJTkcgVE8gU0lHTl06JHtKU09OLnN0cmluZ2lmeShzdHJpbmdUb1NpZ24pfWApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW0tFWV06ICR7cmVxdWVzdC5oZWFkZXJzLmdldChIZWFkZXJDb25zdGFudHMuQVVUSE9SSVpBVElPTil9YCk7XG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZSBoZWFkZXIgdmFsdWUgYWNjb3JkaW5nIHRvIHNoYXJlZCBrZXkgc2lnbiBydWxlcy5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9hdXRoZW50aWNhdGUtd2l0aC1zaGFyZWQta2V5XG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCAtXG4gICAgICogQHBhcmFtIGhlYWRlck5hbWUgLVxuICAgICAqL1xuICAgIGdldEhlYWRlclZhbHVlVG9TaWduKHJlcXVlc3QsIGhlYWRlck5hbWUpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KGhlYWRlck5hbWUpO1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHVzaW5nIHZlcnNpb24gMjAxNS0wMi0yMSBvciBsYXRlciwgaWYgQ29udGVudC1MZW5ndGggaXMgemVybywgdGhlblxuICAgICAgICAvLyBzZXQgdGhlIENvbnRlbnQtTGVuZ3RoIHBhcnQgb2YgdGhlIFN0cmluZ1RvU2lnbiB0byBhbiBlbXB0eSBzdHJpbmcuXG4gICAgICAgIC8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9hdXRoZW50aWNhdGUtd2l0aC1zaGFyZWQta2V5XG4gICAgICAgIGlmIChoZWFkZXJOYW1lID09PSBIZWFkZXJDb25zdGFudHMuQ09OVEVOVF9MRU5HVEggJiYgdmFsdWUgPT09IFwiMFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRvIGNvbnN0cnVjdCB0aGUgQ2Fub25pY2FsaXplZEhlYWRlcnMgcG9ydGlvbiBvZiB0aGUgc2lnbmF0dXJlIHN0cmluZywgZm9sbG93IHRoZXNlIHN0ZXBzOlxuICAgICAqIDEuIFJldHJpZXZlIGFsbCBoZWFkZXJzIGZvciB0aGUgcmVzb3VyY2UgdGhhdCBiZWdpbiB3aXRoIHgtbXMtLCBpbmNsdWRpbmcgdGhlIHgtbXMtZGF0ZSBoZWFkZXIuXG4gICAgICogMi4gQ29udmVydCBlYWNoIEhUVFAgaGVhZGVyIG5hbWUgdG8gbG93ZXJjYXNlLlxuICAgICAqIDMuIFNvcnQgdGhlIGhlYWRlcnMgbGV4aWNvZ3JhcGhpY2FsbHkgYnkgaGVhZGVyIG5hbWUsIGluIGFzY2VuZGluZyBvcmRlci5cbiAgICAgKiAgICBFYWNoIGhlYWRlciBtYXkgYXBwZWFyIG9ubHkgb25jZSBpbiB0aGUgc3RyaW5nLlxuICAgICAqIDQuIFJlcGxhY2UgYW55IGxpbmVhciB3aGl0ZXNwYWNlIGluIHRoZSBoZWFkZXIgdmFsdWUgd2l0aCBhIHNpbmdsZSBzcGFjZS5cbiAgICAgKiA1LiBUcmltIGFueSB3aGl0ZXNwYWNlIGFyb3VuZCB0aGUgY29sb24gaW4gdGhlIGhlYWRlci5cbiAgICAgKiA2LiBGaW5hbGx5LCBhcHBlbmQgYSBuZXctbGluZSBjaGFyYWN0ZXIgdG8gZWFjaCBjYW5vbmljYWxpemVkIGhlYWRlciBpbiB0aGUgcmVzdWx0aW5nIGxpc3QuXG4gICAgICogICAgQ29uc3RydWN0IHRoZSBDYW5vbmljYWxpemVkSGVhZGVycyBzdHJpbmcgYnkgY29uY2F0ZW5hdGluZyBhbGwgaGVhZGVycyBpbiB0aGlzIGxpc3QgaW50byBhIHNpbmdsZSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCAtXG4gICAgICovXG4gICAgZ2V0Q2Fub25pY2FsaXplZEhlYWRlcnNTdHJpbmcocmVxdWVzdCkge1xuICAgICAgICBsZXQgaGVhZGVyc0FycmF5ID0gcmVxdWVzdC5oZWFkZXJzLmhlYWRlcnNBcnJheSgpLmZpbHRlcigodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5uYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChIZWFkZXJDb25zdGFudHMuUFJFRklYX0ZPUl9TVE9SQUdFKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGhlYWRlcnNBcnJheS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYS5uYW1lLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLm5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBSZW1vdmUgZHVwbGljYXRlIGhlYWRlcnNcbiAgICAgICAgaGVhZGVyc0FycmF5ID0gaGVhZGVyc0FycmF5LmZpbHRlcigodmFsdWUsIGluZGV4LCBhcnJheSkgPT4ge1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gMCAmJiB2YWx1ZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGFycmF5W2luZGV4IC0gMV0ubmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgY2Fub25pY2FsaXplZEhlYWRlcnNTdHJpbmdUb1NpZ24gPSBcIlwiO1xuICAgICAgICBoZWFkZXJzQXJyYXkuZm9yRWFjaCgoaGVhZGVyKSA9PiB7XG4gICAgICAgICAgICBjYW5vbmljYWxpemVkSGVhZGVyc1N0cmluZ1RvU2lnbiArPSBgJHtoZWFkZXIubmFtZVxuICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgLnRyaW1SaWdodCgpfToke2hlYWRlci52YWx1ZS50cmltTGVmdCgpfVxcbmA7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplZEhlYWRlcnNTdHJpbmdUb1NpZ247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgd2ViUmVzb3VyY2UgY2Fub25pY2FsaXplZCByZXNvdXJjZSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCAtXG4gICAgICovXG4gICAgZ2V0Q2Fub25pY2FsaXplZFJlc291cmNlU3RyaW5nKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGdldFVSTFBhdGgocmVxdWVzdC51cmwpIHx8IFwiL1wiO1xuICAgICAgICBsZXQgY2Fub25pY2FsaXplZFJlc291cmNlU3RyaW5nID0gXCJcIjtcbiAgICAgICAgY2Fub25pY2FsaXplZFJlc291cmNlU3RyaW5nICs9IGAvJHt0aGlzLmZhY3RvcnkuYWNjb3VudE5hbWV9JHtwYXRofWA7XG4gICAgICAgIGNvbnN0IHF1ZXJpZXMgPSBnZXRVUkxRdWVyaWVzKHJlcXVlc3QudXJsKTtcbiAgICAgICAgY29uc3QgbG93ZXJjYXNlUXVlcmllcyA9IHt9O1xuICAgICAgICBpZiAocXVlcmllcykge1xuICAgICAgICAgICAgY29uc3QgcXVlcnlLZXlzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBxdWVyaWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChxdWVyaWVzLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvd2VyY2FzZUtleSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBsb3dlcmNhc2VRdWVyaWVzW2xvd2VyY2FzZUtleV0gPSBxdWVyaWVzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5S2V5cy5wdXNoKGxvd2VyY2FzZUtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVlcnlLZXlzLnNvcnQoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHF1ZXJ5S2V5cykge1xuICAgICAgICAgICAgICAgIGNhbm9uaWNhbGl6ZWRSZXNvdXJjZVN0cmluZyArPSBgXFxuJHtrZXl9OiR7ZGVjb2RlVVJJQ29tcG9uZW50KGxvd2VyY2FzZVF1ZXJpZXNba2V5XSl9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplZFJlc291cmNlU3RyaW5nO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsUG9saWN5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgY3JlYXRlSG1hYyB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsUG9saWN5IH0gZnJvbSBcIi4uL3BvbGljaWVzL1N0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsUG9saWN5XCI7XG5pbXBvcnQgeyBDcmVkZW50aWFsIH0gZnJvbSBcIi4vQ3JlZGVudGlhbFwiO1xuLyoqXG4gKiBPTkxZIEFWQUlMQUJMRSBJTiBOT0RFLkpTIFJVTlRJTUUuXG4gKlxuICogU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwgZm9yIGFjY291bnQga2V5IGF1dGhvcml6YXRpb24gb2YgQXp1cmUgU3RvcmFnZSBzZXJ2aWNlLlxuICovXG5leHBvcnQgY2xhc3MgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwgZXh0ZW5kcyBDcmVkZW50aWFsIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsLlxuICAgICAqIEBwYXJhbSBhY2NvdW50TmFtZSAtXG4gICAgICogQHBhcmFtIGFjY291bnRLZXkgLVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGFjY291bnROYW1lLCBhY2NvdW50S2V5KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYWNjb3VudE5hbWUgPSBhY2NvdW50TmFtZTtcbiAgICAgICAgdGhpcy5hY2NvdW50S2V5ID0gQnVmZmVyLmZyb20oYWNjb3VudEtleSwgXCJiYXNlNjRcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbFBvbGljeSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmV4dFBvbGljeSAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGNyZWF0ZShuZXh0UG9saWN5LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxQb2xpY3kobmV4dFBvbGljeSwgb3B0aW9ucywgdGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIGhhc2ggc2lnbmF0dXJlIGZvciBhbiBIVFRQIHJlcXVlc3Qgb3IgZm9yIGEgU0FTLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0cmluZ1RvU2lnbiAtXG4gICAgICovXG4gICAgY29tcHV0ZUhNQUNTSEEyNTYoc3RyaW5nVG9TaWduKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVIbWFjKFwic2hhMjU2XCIsIHRoaXMuYWNjb3VudEtleSkudXBkYXRlKHN0cmluZ1RvU2lnbiwgXCJ1dGY4XCIpLmRpZ2VzdChcImJhc2U2NFwiKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEJhc2VSZXF1ZXN0UG9saWN5LCB9IGZyb20gXCIuL3JlcXVlc3RQb2xpY3lcIjtcbmltcG9ydCB7IFVSTEJ1aWxkZXIgfSBmcm9tIFwiLi4vdXJsXCI7XG4vKipcbiAqIE1ldGhvZHMgdGhhdCBhcmUgYWxsb3dlZCB0byBmb2xsb3cgcmVkaXJlY3RzIDMwMSBhbmQgMzAyXG4gKi9cbmNvbnN0IGFsbG93ZWRSZWRpcmVjdCA9IFtcIkdFVFwiLCBcIkhFQURcIl07XG5leHBvcnQgY29uc3QgRGVmYXVsdFJlZGlyZWN0T3B0aW9ucyA9IHtcbiAgICBoYW5kbGVSZWRpcmVjdHM6IHRydWUsXG4gICAgbWF4UmV0cmllczogMjAsXG59O1xuLyoqXG4gKiBDcmVhdGVzIGEgcmVkaXJlY3QgcG9saWN5LCB3aGljaCBzZW5kcyBhIHJlcGVhdHMgdGhlIHJlcXVlc3QgdG8gYSBuZXcgZGVzdGluYXRpb24gaWYgYSByZXNwb25zZSBhcnJpdmVzIHdpdGggYSBcImxvY2F0aW9uXCIgaGVhZGVyLCBhbmQgYSBzdGF0dXMgY29kZSBiZXR3ZWVuIDMwMCBhbmQgMzA3LlxuICogQHBhcmFtIG1heGltdW1SZXRyaWVzIC0gTWF4aW11bSBudW1iZXIgb2YgcmVkaXJlY3RzIHRvIGZvbGxvdy5cbiAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSB7QGxpbmsgUmVkaXJlY3RQb2xpY3l9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWRpcmVjdFBvbGljeShtYXhpbXVtUmV0cmllcyA9IDIwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlOiAobmV4dFBvbGljeSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWRpcmVjdFBvbGljeShuZXh0UG9saWN5LCBvcHRpb25zLCBtYXhpbXVtUmV0cmllcyk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8qKlxuICogUmVzZW5kcyB0aGUgcmVxdWVzdCB0byBhIG5ldyBkZXN0aW5hdGlvbiBpZiBhIHJlc3BvbnNlIGFycml2ZXMgd2l0aCBhIFwibG9jYXRpb25cIiBoZWFkZXIsIGFuZCBhIHN0YXR1cyBjb2RlIGJldHdlZW4gMzAwIGFuZCAzMDcuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWRpcmVjdFBvbGljeSBleHRlbmRzIEJhc2VSZXF1ZXN0UG9saWN5IHtcbiAgICBjb25zdHJ1Y3RvcihuZXh0UG9saWN5LCBvcHRpb25zLCBtYXhSZXRyaWVzID0gMjApIHtcbiAgICAgICAgc3VwZXIobmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMubWF4UmV0cmllcyA9IG1heFJldHJpZXM7XG4gICAgfVxuICAgIHNlbmRSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25leHRQb2xpY3lcbiAgICAgICAgICAgIC5zZW5kUmVxdWVzdChyZXF1ZXN0KVxuICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiBoYW5kbGVSZWRpcmVjdCh0aGlzLCByZXNwb25zZSwgMCkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZVJlZGlyZWN0KHBvbGljeSwgcmVzcG9uc2UsIGN1cnJlbnRSZXRyaWVzKSB7XG4gICAgY29uc3QgeyByZXF1ZXN0LCBzdGF0dXMgfSA9IHJlc3BvbnNlO1xuICAgIGNvbnN0IGxvY2F0aW9uSGVhZGVyID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJsb2NhdGlvblwiKTtcbiAgICBpZiAobG9jYXRpb25IZWFkZXIgJiZcbiAgICAgICAgKHN0YXR1cyA9PT0gMzAwIHx8XG4gICAgICAgICAgICAoc3RhdHVzID09PSAzMDEgJiYgYWxsb3dlZFJlZGlyZWN0LmluY2x1ZGVzKHJlcXVlc3QubWV0aG9kKSkgfHxcbiAgICAgICAgICAgIChzdGF0dXMgPT09IDMwMiAmJiBhbGxvd2VkUmVkaXJlY3QuaW5jbHVkZXMocmVxdWVzdC5tZXRob2QpKSB8fFxuICAgICAgICAgICAgKHN0YXR1cyA9PT0gMzAzICYmIHJlcXVlc3QubWV0aG9kID09PSBcIlBPU1RcIikgfHxcbiAgICAgICAgICAgIHN0YXR1cyA9PT0gMzA3KSAmJlxuICAgICAgICAoIXBvbGljeS5tYXhSZXRyaWVzIHx8IGN1cnJlbnRSZXRyaWVzIDwgcG9saWN5Lm1heFJldHJpZXMpKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBVUkxCdWlsZGVyLnBhcnNlKHJlcXVlc3QudXJsKTtcbiAgICAgICAgYnVpbGRlci5zZXRQYXRoKGxvY2F0aW9uSGVhZGVyKTtcbiAgICAgICAgcmVxdWVzdC51cmwgPSBidWlsZGVyLnRvU3RyaW5nKCk7XG4gICAgICAgIC8vIFBPU1QgcmVxdWVzdCB3aXRoIFN0YXR1cyBjb2RlIDMwMyBzaG91bGQgYmUgY29udmVydGVkIGludG8gYVxuICAgICAgICAvLyByZWRpcmVjdGVkIEdFVCByZXF1ZXN0IGlmIHRoZSByZWRpcmVjdCB1cmwgaXMgcHJlc2VudCBpbiB0aGUgbG9jYXRpb24gaGVhZGVyXG4gICAgICAgIGlmIChzdGF0dXMgPT09IDMwMykge1xuICAgICAgICAgICAgcmVxdWVzdC5tZXRob2QgPSBcIkdFVFwiO1xuICAgICAgICAgICAgZGVsZXRlIHJlcXVlc3QuYm9keTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9saWN5Ll9uZXh0UG9saWN5XG4gICAgICAgICAgICAuc2VuZFJlcXVlc3QocmVxdWVzdClcbiAgICAgICAgICAgIC50aGVuKChyZXMpID0+IGhhbmRsZVJlZGlyZWN0KHBvbGljeSwgcmVzLCBjdXJyZW50UmV0cmllcyArIDEpKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWRpcmVjdFBvbGljeS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NMSUVOVF9SRVRSWV9DT1VOVCA9IDM7XG4vLyBpbnRlcnZhbHMgYXJlIGluIG1zXG5leHBvcnQgY29uc3QgREVGQVVMVF9DTElFTlRfUkVUUllfSU5URVJWQUwgPSAxMDAwICogMzA7XG5leHBvcnQgY29uc3QgREVGQVVMVF9DTElFTlRfTUFYX1JFVFJZX0lOVEVSVkFMID0gMTAwMCAqIDkwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ0xJRU5UX01JTl9SRVRSWV9JTlRFUlZBTCA9IDEwMDAgKiAzO1xuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyKG4pIHtcbiAgICByZXR1cm4gdHlwZW9mIG4gPT09IFwibnVtYmVyXCI7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICogRGV0ZXJtaW5lcyBpZiB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSByZXRyaWVkLlxuICpcbiAqIEBwYXJhbSByZXRyeUxpbWl0IC0gU3BlY2lmaWVzIHRoZSBtYXggbnVtYmVyIG9mIHJldHJpZXMuXG4gKiBAcGFyYW0gcHJlZGljYXRlIC0gSW5pdGlhbCBjaGVrY2sgb24gd2hldGhlciB0byByZXRyeSBiYXNlZCBvbiBnaXZlbiByZXNwb25zZXMgb3IgZXJyb3JzXG4gKiBAcGFyYW0gcmV0cnlEYXRhIC0gIFRoZSByZXRyeSBkYXRhLlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIHF1YWxpZmllcyBmb3IgYSByZXRyeTsgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkUmV0cnkocmV0cnlMaW1pdCwgcHJlZGljYXRlLCByZXRyeURhdGEsIHJlc3BvbnNlLCBlcnJvcikge1xuICAgIGlmICghcHJlZGljYXRlKHJlc3BvbnNlLCBlcnJvcikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gcmV0cnlEYXRhLnJldHJ5Q291bnQgPCByZXRyeUxpbWl0O1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIFVwZGF0ZXMgdGhlIHJldHJ5IGRhdGEgZm9yIHRoZSBuZXh0IGF0dGVtcHQuXG4gKlxuICogQHBhcmFtIHJldHJ5T3B0aW9ucyAtIHNwZWNpZmllcyByZXRyeSBpbnRlcnZhbCwgYW5kIGl0cyBsb3dlciBib3VuZCBhbmQgdXBwZXIgYm91bmQuXG4gKiBAcGFyYW0gcmV0cnlEYXRhIC0gIFRoZSByZXRyeSBkYXRhLlxuICogQHBhcmFtIGVyciAtIFRoZSBvcGVyYXRpb25cInMgZXJyb3IsIGlmIGFueS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVJldHJ5RGF0YShyZXRyeU9wdGlvbnMsIHJldHJ5RGF0YSA9IHsgcmV0cnlDb3VudDogMCwgcmV0cnlJbnRlcnZhbDogMCB9LCBlcnIpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICAgIGlmIChyZXRyeURhdGEuZXJyb3IpIHtcbiAgICAgICAgICAgIGVyci5pbm5lckVycm9yID0gcmV0cnlEYXRhLmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHJ5RGF0YS5lcnJvciA9IGVycjtcbiAgICB9XG4gICAgLy8gQWRqdXN0IHJldHJ5IGNvdW50XG4gICAgcmV0cnlEYXRhLnJldHJ5Q291bnQrKztcbiAgICAvLyBBZGp1c3QgcmV0cnkgaW50ZXJ2YWxcbiAgICBsZXQgaW5jcmVtZW50RGVsdGEgPSBNYXRoLnBvdygyLCByZXRyeURhdGEucmV0cnlDb3VudCAtIDEpIC0gMTtcbiAgICBjb25zdCBib3VuZGVkUmFuZERlbHRhID0gcmV0cnlPcHRpb25zLnJldHJ5SW50ZXJ2YWwgKiAwLjggK1xuICAgICAgICBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAocmV0cnlPcHRpb25zLnJldHJ5SW50ZXJ2YWwgKiAwLjQpKTtcbiAgICBpbmNyZW1lbnREZWx0YSAqPSBib3VuZGVkUmFuZERlbHRhO1xuICAgIHJldHJ5RGF0YS5yZXRyeUludGVydmFsID0gTWF0aC5taW4ocmV0cnlPcHRpb25zLm1pblJldHJ5SW50ZXJ2YWwgKyBpbmNyZW1lbnREZWx0YSwgcmV0cnlPcHRpb25zLm1heFJldHJ5SW50ZXJ2YWwpO1xuICAgIHJldHVybiByZXRyeURhdGE7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leHBvbmVudGlhbEJhY2tvZmZTdHJhdGVneS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEJhc2VSZXF1ZXN0UG9saWN5LCB9IGZyb20gXCIuL3JlcXVlc3RQb2xpY3lcIjtcbmltcG9ydCB7IERFRkFVTFRfQ0xJRU5UX01BWF9SRVRSWV9JTlRFUlZBTCwgREVGQVVMVF9DTElFTlRfUkVUUllfQ09VTlQsIERFRkFVTFRfQ0xJRU5UX1JFVFJZX0lOVEVSVkFMLCBpc051bWJlciwgc2hvdWxkUmV0cnksIHVwZGF0ZVJldHJ5RGF0YSwgfSBmcm9tIFwiLi4vdXRpbC9leHBvbmVudGlhbEJhY2tvZmZTdHJhdGVneVwiO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uL3V0aWwvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBSZXN0RXJyb3IgfSBmcm9tIFwiLi4vcmVzdEVycm9yXCI7XG5pbXBvcnQgeyBkZWxheSB9IGZyb20gXCJAYXp1cmUvY29yZS11dGlsXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi4vbG9nXCI7XG4vKipcbiAqIFBvbGljeSB0aGF0IHJldHJpZXMgdGhlIHJlcXVlc3QgYXMgbWFueSB0aW1lcyBhcyBjb25maWd1cmVkIGZvciBhcyBsb25nIGFzIHRoZSBtYXggcmV0cnkgdGltZSBpbnRlcnZhbCBzcGVjaWZpZWQsIGVhY2ggcmV0cnkgd2FpdGluZyBsb25nZXIgdG8gYmVnaW4gdGhhbiB0aGUgbGFzdCB0aW1lLlxuICogQHBhcmFtIHJldHJ5Q291bnQgLSBNYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLlxuICogQHBhcmFtIHJldHJ5SW50ZXJ2YWwgLSBCYXNlIHRpbWUgYmV0d2VlbiByZXRyaWVzLlxuICogQHBhcmFtIG1heFJldHJ5SW50ZXJ2YWwgLSBNYXhpbXVtIHRpbWUgdG8gd2FpdCBiZXR3ZWVuIHJldHJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBvbmVudGlhbFJldHJ5UG9saWN5KHJldHJ5Q291bnQsIHJldHJ5SW50ZXJ2YWwsIG1heFJldHJ5SW50ZXJ2YWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjcmVhdGU6IChuZXh0UG9saWN5LCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV4cG9uZW50aWFsUmV0cnlQb2xpY3kobmV4dFBvbGljeSwgb3B0aW9ucywgcmV0cnlDb3VudCwgcmV0cnlJbnRlcnZhbCwgbWF4UmV0cnlJbnRlcnZhbCk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBSZXRyeSBNb2RlIHR5cGUuIEN1cnJlbnRseSBzdXBwb3J0aW5nIG9ubHkgRXhwb25lbnRpYWwuXG4gKi9cbmV4cG9ydCB2YXIgUmV0cnlNb2RlO1xuKGZ1bmN0aW9uIChSZXRyeU1vZGUpIHtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50bHkgc3VwcG9ydGVkIHJldHJ5IG1vZGUuXG4gICAgICogRWFjaCB0aW1lIGEgcmV0cnkgaGFwcGVucywgaXQgd2lsbCB0YWtlIGV4cG9uZW50aWFsbHkgbW9yZSB0aW1lIHRoYW4gdGhlIGxhc3QgdGltZS5cbiAgICAgKi9cbiAgICBSZXRyeU1vZGVbUmV0cnlNb2RlW1wiRXhwb25lbnRpYWxcIl0gPSAwXSA9IFwiRXhwb25lbnRpYWxcIjtcbn0pKFJldHJ5TW9kZSB8fCAoUmV0cnlNb2RlID0ge30pKTtcbmV4cG9ydCBjb25zdCBEZWZhdWx0UmV0cnlPcHRpb25zID0ge1xuICAgIG1heFJldHJpZXM6IERFRkFVTFRfQ0xJRU5UX1JFVFJZX0NPVU5ULFxuICAgIHJldHJ5RGVsYXlJbk1zOiBERUZBVUxUX0NMSUVOVF9SRVRSWV9JTlRFUlZBTCxcbiAgICBtYXhSZXRyeURlbGF5SW5NczogREVGQVVMVF9DTElFTlRfTUFYX1JFVFJZX0lOVEVSVkFMLFxufTtcbi8qKlxuICogSW5zdGFudGlhdGVzIGEgbmV3IFwiRXhwb25lbnRpYWxSZXRyeVBvbGljeUZpbHRlclwiIGluc3RhbmNlLlxuICovXG5leHBvcnQgY2xhc3MgRXhwb25lbnRpYWxSZXRyeVBvbGljeSBleHRlbmRzIEJhc2VSZXF1ZXN0UG9saWN5IHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gbmV4dFBvbGljeSAtIFRoZSBuZXh0IFJlcXVlc3RQb2xpY3kgaW4gdGhlIHBpcGVsaW5lIGNoYWluLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoaXMgUmVxdWVzdFBvbGljeS5cbiAgICAgKiBAcGFyYW0gcmV0cnlDb3VudCAtIFRoZSBjbGllbnQgcmV0cnkgY291bnQuXG4gICAgICogQHBhcmFtIHJldHJ5SW50ZXJ2YWwgLSBUaGUgY2xpZW50IHJldHJ5IGludGVydmFsLCBpbiBtaWxsaXNlY29uZHMuXG4gICAgICogQHBhcmFtIG1pblJldHJ5SW50ZXJ2YWwgLSBUaGUgbWluaW11bSByZXRyeSBpbnRlcnZhbCwgaW4gbWlsbGlzZWNvbmRzLlxuICAgICAqIEBwYXJhbSBtYXhSZXRyeUludGVydmFsIC0gVGhlIG1heGltdW0gcmV0cnkgaW50ZXJ2YWwsIGluIG1pbGxpc2Vjb25kcy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihuZXh0UG9saWN5LCBvcHRpb25zLCByZXRyeUNvdW50LCByZXRyeUludGVydmFsLCBtYXhSZXRyeUludGVydmFsKSB7XG4gICAgICAgIHN1cGVyKG5leHRQb2xpY3ksIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnJldHJ5Q291bnQgPSBpc051bWJlcihyZXRyeUNvdW50KSA/IHJldHJ5Q291bnQgOiBERUZBVUxUX0NMSUVOVF9SRVRSWV9DT1VOVDtcbiAgICAgICAgdGhpcy5yZXRyeUludGVydmFsID0gaXNOdW1iZXIocmV0cnlJbnRlcnZhbCkgPyByZXRyeUludGVydmFsIDogREVGQVVMVF9DTElFTlRfUkVUUllfSU5URVJWQUw7XG4gICAgICAgIHRoaXMubWF4UmV0cnlJbnRlcnZhbCA9IGlzTnVtYmVyKG1heFJldHJ5SW50ZXJ2YWwpXG4gICAgICAgICAgICA/IG1heFJldHJ5SW50ZXJ2YWxcbiAgICAgICAgICAgIDogREVGQVVMVF9DTElFTlRfTUFYX1JFVFJZX0lOVEVSVkFMO1xuICAgIH1cbiAgICBzZW5kUmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uZXh0UG9saWN5XG4gICAgICAgICAgICAuc2VuZFJlcXVlc3QocmVxdWVzdC5jbG9uZSgpKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXRyeSh0aGlzLCByZXF1ZXN0LCByZXNwb25zZSkpXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiByZXRyeSh0aGlzLCByZXF1ZXN0LCBlcnJvci5yZXNwb25zZSwgdW5kZWZpbmVkLCBlcnJvcikpO1xuICAgIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIHJldHJ5KHBvbGljeSwgcmVxdWVzdCwgcmVzcG9uc2UsIHJldHJ5RGF0YSwgcmVxdWVzdEVycm9yKSB7XG4gICAgZnVuY3Rpb24gc2hvdWxkUG9saWN5UmV0cnkocmVzcG9uc2VQYXJhbSkge1xuICAgICAgICBjb25zdCBzdGF0dXNDb2RlID0gcmVzcG9uc2VQYXJhbSA9PT0gbnVsbCB8fCByZXNwb25zZVBhcmFtID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXNwb25zZVBhcmFtLnN0YXR1cztcbiAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IDUwMyAmJiAocmVzcG9uc2UgPT09IG51bGwgfHwgcmVzcG9uc2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KENvbnN0YW50cy5IZWFkZXJDb25zdGFudHMuUkVUUllfQUZURVIpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0dXNDb2RlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIChzdGF0dXNDb2RlIDwgNTAwICYmIHN0YXR1c0NvZGUgIT09IDQwOCkgfHxcbiAgICAgICAgICAgIHN0YXR1c0NvZGUgPT09IDUwMSB8fFxuICAgICAgICAgICAgc3RhdHVzQ29kZSA9PT0gNTA1KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHJ5RGF0YSA9IHVwZGF0ZVJldHJ5RGF0YSh7XG4gICAgICAgIHJldHJ5SW50ZXJ2YWw6IHBvbGljeS5yZXRyeUludGVydmFsLFxuICAgICAgICBtaW5SZXRyeUludGVydmFsOiAwLFxuICAgICAgICBtYXhSZXRyeUludGVydmFsOiBwb2xpY3kubWF4UmV0cnlJbnRlcnZhbCxcbiAgICB9LCByZXRyeURhdGEsIHJlcXVlc3RFcnJvcik7XG4gICAgY29uc3QgaXNBYm9ydGVkID0gcmVxdWVzdC5hYm9ydFNpZ25hbCAmJiByZXF1ZXN0LmFib3J0U2lnbmFsLmFib3J0ZWQ7XG4gICAgaWYgKCFpc0Fib3J0ZWQgJiYgc2hvdWxkUmV0cnkocG9saWN5LnJldHJ5Q291bnQsIHNob3VsZFBvbGljeVJldHJ5LCByZXRyeURhdGEsIHJlc3BvbnNlKSkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgUmV0cnlpbmcgcmVxdWVzdCBpbiAke3JldHJ5RGF0YS5yZXRyeUludGVydmFsfWApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZGVsYXkocmV0cnlEYXRhLnJldHJ5SW50ZXJ2YWwpO1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgcG9saWN5Ll9uZXh0UG9saWN5LnNlbmRSZXF1ZXN0KHJlcXVlc3QuY2xvbmUoKSk7XG4gICAgICAgICAgICByZXR1cm4gcmV0cnkocG9saWN5LCByZXF1ZXN0LCByZXMsIHJldHJ5RGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIHJldHJ5KHBvbGljeSwgcmVxdWVzdCwgcmVzcG9uc2UsIHJldHJ5RGF0YSwgZXJyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChpc0Fib3J0ZWQgfHwgcmVxdWVzdEVycm9yIHx8ICFyZXNwb25zZSkge1xuICAgICAgICAvLyBJZiB0aGUgb3BlcmF0aW9uIGZhaWxlZCBpbiB0aGUgZW5kLCByZXR1cm4gYWxsIGVycm9ycyBpbnN0ZWFkIG9mIGp1c3QgdGhlIGxhc3Qgb25lXG4gICAgICAgIGNvbnN0IGVyciA9IHJldHJ5RGF0YS5lcnJvciB8fFxuICAgICAgICAgICAgbmV3IFJlc3RFcnJvcihcIkZhaWxlZCB0byBzZW5kIHRoZSByZXF1ZXN0LlwiLCBSZXN0RXJyb3IuUkVRVUVTVF9TRU5EX0VSUk9SLCByZXNwb25zZSAmJiByZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlICYmIHJlc3BvbnNlLnJlcXVlc3QsIHJlc3BvbnNlKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV4cG9uZW50aWFsUmV0cnlQb2xpY3kuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4vKipcbiAqIEdldCB0aGUgcGF0aCB0byB0aGlzIHBhcmFtZXRlcidzIHZhbHVlIGFzIGEgZG90dGVkIHN0cmluZyAoYS5iLmMpLlxuICogQHBhcmFtIHBhcmFtZXRlciAtIFRoZSBwYXJhbWV0ZXIgdG8gZ2V0IHRoZSBwYXRoIHN0cmluZyBmb3IuXG4gKiBAcmV0dXJucyBUaGUgcGF0aCB0byB0aGlzIHBhcmFtZXRlcidzIHZhbHVlIGFzIGEgZG90dGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhdGhTdHJpbmdGcm9tUGFyYW1ldGVyKHBhcmFtZXRlcikge1xuICAgIHJldHVybiBnZXRQYXRoU3RyaW5nRnJvbVBhcmFtZXRlclBhdGgocGFyYW1ldGVyLnBhcmFtZXRlclBhdGgsIHBhcmFtZXRlci5tYXBwZXIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhdGhTdHJpbmdGcm9tUGFyYW1ldGVyUGF0aChwYXJhbWV0ZXJQYXRoLCBtYXBwZXIpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1ldGVyUGF0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXN1bHQgPSBwYXJhbWV0ZXJQYXRoO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHBhcmFtZXRlclBhdGgpKSB7XG4gICAgICAgIHJlc3VsdCA9IHBhcmFtZXRlclBhdGguam9pbihcIi5cIik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBtYXBwZXIuc2VyaWFsaXplZE5hbWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vcGVyYXRpb25QYXJhbWV0ZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBNYXBwZXJUeXBlIH0gZnJvbSBcIi4vc2VyaWFsaXplclwiO1xuLyoqXG4gKiBHZXRzIHRoZSBsaXN0IG9mIHN0YXR1cyBjb2RlcyBmb3Igc3RyZWFtaW5nIHJlc3BvbnNlcy5cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RyZWFtUmVzcG9uc2VTdGF0dXNDb2RlcyhvcGVyYXRpb25TcGVjKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IFNldCgpO1xuICAgIGZvciAoY29uc3Qgc3RhdHVzQ29kZSBpbiBvcGVyYXRpb25TcGVjLnJlc3BvbnNlcykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25SZXNwb25zZSA9IG9wZXJhdGlvblNwZWMucmVzcG9uc2VzW3N0YXR1c0NvZGVdO1xuICAgICAgICBpZiAob3BlcmF0aW9uUmVzcG9uc2UuYm9keU1hcHBlciAmJlxuICAgICAgICAgICAgb3BlcmF0aW9uUmVzcG9uc2UuYm9keU1hcHBlci50eXBlLm5hbWUgPT09IE1hcHBlclR5cGUuU3RyZWFtKSB7XG4gICAgICAgICAgICByZXN1bHQuYWRkKE51bWJlcihzdGF0dXNDb2RlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9wZXJhdGlvblNwZWMuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgKiBhcyBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCIuLi91dGlsL2NvbnN0YW50c1wiO1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRVc2VyQWdlbnRLZXkoKSB7XG4gICAgcmV0dXJuIENvbnN0YW50cy5IZWFkZXJDb25zdGFudHMuVVNFUl9BR0VOVDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRQbGF0Zm9ybVNwZWNpZmljRGF0YSgpIHtcbiAgICBjb25zdCBydW50aW1lSW5mbyA9IHtcbiAgICAgICAga2V5OiBcIk5vZGVcIixcbiAgICAgICAgdmFsdWU6IHByb2Nlc3MudmVyc2lvbixcbiAgICB9O1xuICAgIGNvbnN0IG9zSW5mbyA9IHtcbiAgICAgICAga2V5OiBcIk9TXCIsXG4gICAgICAgIHZhbHVlOiBgKCR7b3MuYXJjaCgpfS0ke29zLnR5cGUoKX0tJHtvcy5yZWxlYXNlKCl9KWAsXG4gICAgfTtcbiAgICByZXR1cm4gW3J1bnRpbWVJbmZvLCBvc0luZm9dO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bXNSZXN0VXNlckFnZW50UG9saWN5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgQmFzZVJlcXVlc3RQb2xpY3ksIH0gZnJvbSBcIi4vcmVxdWVzdFBvbGljeVwiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdFVzZXJBZ2VudEtleSwgZ2V0UGxhdGZvcm1TcGVjaWZpY0RhdGEgfSBmcm9tIFwiLi9tc1Jlc3RVc2VyQWdlbnRQb2xpY3lcIjtcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCIuLi91dGlsL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSHR0cEhlYWRlcnMgfSBmcm9tIFwiLi4vaHR0cEhlYWRlcnNcIjtcbmZ1bmN0aW9uIGdldFJ1bnRpbWVJbmZvKCkge1xuICAgIGNvbnN0IG1zUmVzdFJ1bnRpbWUgPSB7XG4gICAgICAgIGtleTogXCJjb3JlLWh0dHBcIixcbiAgICAgICAgdmFsdWU6IENvbnN0YW50cy5jb3JlSHR0cFZlcnNpb24sXG4gICAgfTtcbiAgICByZXR1cm4gW21zUmVzdFJ1bnRpbWVdO1xufVxuZnVuY3Rpb24gZ2V0VXNlckFnZW50U3RyaW5nKHRlbGVtZXRyeUluZm8sIGtleVNlcGFyYXRvciA9IFwiIFwiLCB2YWx1ZVNlcGFyYXRvciA9IFwiL1wiKSB7XG4gICAgcmV0dXJuIHRlbGVtZXRyeUluZm9cbiAgICAgICAgLm1hcCgoaW5mbykgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGluZm8udmFsdWUgPyBgJHt2YWx1ZVNlcGFyYXRvcn0ke2luZm8udmFsdWV9YCA6IFwiXCI7XG4gICAgICAgIHJldHVybiBgJHtpbmZvLmtleX0ke3ZhbHVlfWA7XG4gICAgfSlcbiAgICAgICAgLmpvaW4oa2V5U2VwYXJhdG9yKTtcbn1cbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0VXNlckFnZW50SGVhZGVyTmFtZSA9IGdldERlZmF1bHRVc2VyQWdlbnRLZXk7XG4vKipcbiAqIFRoZSBkZWZhdWx0IGFwcHJvYWNoIHRvIGdlbmVyYXRlIHVzZXIgYWdlbnRzLlxuICogVXNlcyBzdGF0aWMgaW5mb3JtYXRpb24gZnJvbSB0aGlzIHBhY2thZ2UsIHBsdXMgc3lzdGVtIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBmcm9tIHRoZSBydW50aW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFVzZXJBZ2VudFZhbHVlKCkge1xuICAgIGNvbnN0IHJ1bnRpbWVJbmZvID0gZ2V0UnVudGltZUluZm8oKTtcbiAgICBjb25zdCBwbGF0Zm9ybVNwZWNpZmljRGF0YSA9IGdldFBsYXRmb3JtU3BlY2lmaWNEYXRhKCk7XG4gICAgY29uc3QgdXNlckFnZW50ID0gZ2V0VXNlckFnZW50U3RyaW5nKHJ1bnRpbWVJbmZvLmNvbmNhdChwbGF0Zm9ybVNwZWNpZmljRGF0YSkpO1xuICAgIHJldHVybiB1c2VyQWdlbnQ7XG59XG4vKipcbiAqIFJldHVybnMgYSBwb2xpY3kgdGhhdCBhZGRzIHRoZSB1c2VyIGFnZW50IGhlYWRlciB0byBvdXRnb2luZyByZXF1ZXN0cyBiYXNlZCBvbiB0aGUgZ2l2ZW4ge0BsaW5rIFRlbGVtZXRyeUluZm99LlxuICogQHBhcmFtIHVzZXJBZ2VudERhdGEgLSBUZWxlbWV0cnkgaW5mb3JtYXRpb24uXG4gKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgVXNlckFnZW50UG9saWN5fS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXJBZ2VudFBvbGljeSh1c2VyQWdlbnREYXRhKSB7XG4gICAgY29uc3Qga2V5ID0gIXVzZXJBZ2VudERhdGEgfHwgdXNlckFnZW50RGF0YS5rZXkgPT09IHVuZGVmaW5lZCB8fCB1c2VyQWdlbnREYXRhLmtleSA9PT0gbnVsbFxuICAgICAgICA/IGdldERlZmF1bHRVc2VyQWdlbnRLZXkoKVxuICAgICAgICA6IHVzZXJBZ2VudERhdGEua2V5O1xuICAgIGNvbnN0IHZhbHVlID0gIXVzZXJBZ2VudERhdGEgfHwgdXNlckFnZW50RGF0YS52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHVzZXJBZ2VudERhdGEudmFsdWUgPT09IG51bGxcbiAgICAgICAgPyBnZXREZWZhdWx0VXNlckFnZW50VmFsdWUoKVxuICAgICAgICA6IHVzZXJBZ2VudERhdGEudmFsdWU7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlOiAobmV4dFBvbGljeSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBVc2VyQWdlbnRQb2xpY3kobmV4dFBvbGljeSwgb3B0aW9ucywga2V5LCB2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8qKlxuICogQSBwb2xpY3kgdGhhdCBhZGRzIHRoZSB1c2VyIGFnZW50IGhlYWRlciB0byBvdXRnb2luZyByZXF1ZXN0cyBiYXNlZCBvbiB0aGUgZ2l2ZW4ge0BsaW5rIFRlbGVtZXRyeUluZm99LlxuICovXG5leHBvcnQgY2xhc3MgVXNlckFnZW50UG9saWN5IGV4dGVuZHMgQmFzZVJlcXVlc3RQb2xpY3kge1xuICAgIGNvbnN0cnVjdG9yKF9uZXh0UG9saWN5LCBfb3B0aW9ucywgaGVhZGVyS2V5LCBoZWFkZXJWYWx1ZSkge1xuICAgICAgICBzdXBlcihfbmV4dFBvbGljeSwgX29wdGlvbnMpO1xuICAgICAgICB0aGlzLl9uZXh0UG9saWN5ID0gX25leHRQb2xpY3k7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcbiAgICAgICAgdGhpcy5oZWFkZXJLZXkgPSBoZWFkZXJLZXk7XG4gICAgICAgIHRoaXMuaGVhZGVyVmFsdWUgPSBoZWFkZXJWYWx1ZTtcbiAgICB9XG4gICAgc2VuZFJlcXVlc3QocmVxdWVzdCkge1xuICAgICAgICB0aGlzLmFkZFVzZXJBZ2VudEhlYWRlcihyZXF1ZXN0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25leHRQb2xpY3kuc2VuZFJlcXVlc3QocmVxdWVzdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIHVzZXIgYWdlbnQgaGVhZGVyIHRvIHRoZSBvdXRnb2luZyByZXF1ZXN0LlxuICAgICAqL1xuICAgIGFkZFVzZXJBZ2VudEhlYWRlcihyZXF1ZXN0KSB7XG4gICAgICAgIGlmICghcmVxdWVzdC5oZWFkZXJzKSB7XG4gICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlcXVlc3QuaGVhZGVycy5nZXQodGhpcy5oZWFkZXJLZXkpICYmIHRoaXMuaGVhZGVyVmFsdWUpIHtcbiAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVycy5zZXQodGhpcy5oZWFkZXJLZXksIHRoaXMuaGVhZGVyVmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXNlckFnZW50UG9saWN5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgQmFzZVJlcXVlc3RQb2xpY3ksIH0gZnJvbSBcIi4uL3BvbGljaWVzL3JlcXVlc3RQb2xpY3lcIjtcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCIuLi91dGlsL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwiQGF6dXJlL2NvcmUtdXRpbFwiO1xuLy8gRGVmYXVsdCBvcHRpb25zIGZvciB0aGUgY3ljbGVyIGlmIG5vbmUgYXJlIHByb3ZpZGVkXG5leHBvcnQgY29uc3QgREVGQVVMVF9DWUNMRVJfT1BUSU9OUyA9IHtcbiAgICBmb3JjZWRSZWZyZXNoV2luZG93SW5NczogMTAwMCxcbiAgICByZXRyeUludGVydmFsSW5NczogMzAwMCxcbiAgICByZWZyZXNoV2luZG93SW5NczogMTAwMCAqIDYwICogMiwgLy8gU3RhcnQgcmVmcmVzaGluZyAybSBiZWZvcmUgZXhwaXJ5XG59O1xuLyoqXG4gKiBDb252ZXJ0cyBhbiBhbiB1bnJlbGlhYmxlIGFjY2VzcyB0b2tlbiBnZXR0ZXIgKHdoaWNoIG1heSByZXNvbHZlIHdpdGggbnVsbClcbiAqIGludG8gYW4gQWNjZXNzVG9rZW5HZXR0ZXIgYnkgcmV0cnlpbmcgdGhlIHVucmVsaWFibGUgZ2V0dGVyIGluIGEgcmVndWxhclxuICogaW50ZXJ2YWwuXG4gKlxuICogQHBhcmFtIGdldEFjY2Vzc1Rva2VuIC0gYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGEgcHJvbWlzZSBvZiBhbiBhY2Nlc3NcbiAqIHRva2VuIHRoYXQgbWF5IGZhaWwgYnkgcmV0dXJuaW5nIG51bGxcbiAqIEBwYXJhbSByZXRyeUludGVydmFsSW5NcyAtIHRoZSB0aW1lIChpbiBtaWxsaXNlY29uZHMpIHRvIHdhaXQgYmV0d2VlbiByZXRyeVxuICogYXR0ZW1wdHNcbiAqIEBwYXJhbSB0aW1lb3V0SW5NcyAtIHRoZSB0aW1lc3RhbXAgYWZ0ZXIgd2hpY2ggdGhlIHJlZnJlc2ggYXR0ZW1wdCB3aWxsIGZhaWwsXG4gKiB0aHJvd2luZyBhbiBleGNlcHRpb25cbiAqIEByZXR1cm5zIC0gYSBwcm9taXNlIHRoYXQsIGlmIGl0IHJlc29sdmVzLCB3aWxsIHJlc29sdmUgd2l0aCBhbiBhY2Nlc3MgdG9rZW5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYmVnaW5SZWZyZXNoKGdldEFjY2Vzc1Rva2VuLCByZXRyeUludGVydmFsSW5NcywgdGltZW91dEluTXMpIHtcbiAgICAvLyBUaGlzIHdyYXBwZXIgaGFuZGxlcyBleGNlcHRpb25zIGdyYWNlZnVsbHkgYXMgbG9uZyBhcyB3ZSBoYXZlbid0IGV4Y2VlZGVkXG4gICAgLy8gdGhlIHRpbWVvdXQuXG4gICAgYXN5bmMgZnVuY3Rpb24gdHJ5R2V0QWNjZXNzVG9rZW4oKSB7XG4gICAgICAgIGlmIChEYXRlLm5vdygpIDwgdGltZW91dEluTXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGdldEFjY2Vzc1Rva2VuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgICAgICAgICAgLy8gVGltZW91dCBpcyB1cCwgc28gdGhyb3cgaWYgaXQncyBzdGlsbCBudWxsXG4gICAgICAgICAgICBpZiAoZmluYWxUb2tlbiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byByZWZyZXNoIGFjY2VzcyB0b2tlbi5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmluYWxUb2tlbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgdG9rZW4gPSBhd2FpdCB0cnlHZXRBY2Nlc3NUb2tlbigpO1xuICAgIHdoaWxlICh0b2tlbiA9PT0gbnVsbCkge1xuICAgICAgICBhd2FpdCBkZWxheShyZXRyeUludGVydmFsSW5Ncyk7XG4gICAgICAgIHRva2VuID0gYXdhaXQgdHJ5R2V0QWNjZXNzVG9rZW4oKTtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgdG9rZW4gY3ljbGVyIGZyb20gYSBjcmVkZW50aWFsLCBzY29wZXMsIGFuZCBvcHRpb25hbCBzZXR0aW5ncy5cbiAqXG4gKiBBIHRva2VuIGN5Y2xlciByZXByZXNlbnRzIGEgd2F5IHRvIHJlbGlhYmx5IHJldHJpZXZlIGEgdmFsaWQgYWNjZXNzIHRva2VuXG4gKiBmcm9tIGEgVG9rZW5DcmVkZW50aWFsLiBJdCB3aWxsIGhhbmRsZSBpbml0aWFsaXppbmcgdGhlIHRva2VuLCByZWZyZXNoaW5nIGl0XG4gKiB3aGVuIGl0IG5lYXJzIGV4cGlyYXRpb24sIGFuZCBzeW5jaHJvbml6ZXMgcmVmcmVzaCBhdHRlbXB0cyB0byBhdm9pZFxuICogY29uY3VycmVuY3kgaGF6YXJkcy5cbiAqXG4gKiBAcGFyYW0gY3JlZGVudGlhbCAtIHRoZSB1bmRlcmx5aW5nIFRva2VuQ3JlZGVudGlhbCB0aGF0IHByb3ZpZGVzIHRoZSBhY2Nlc3NcbiAqIHRva2VuXG4gKiBAcGFyYW0gc2NvcGVzIC0gdGhlIHNjb3BlcyB0byByZXF1ZXN0IGF1dGhvcml6YXRpb24gZm9yXG4gKiBAcGFyYW0gdG9rZW5DeWNsZXJPcHRpb25zIC0gb3B0aW9uYWxseSBvdmVycmlkZSBkZWZhdWx0IHNldHRpbmdzIGZvciB0aGUgY3ljbGVyXG4gKlxuICogQHJldHVybnMgLSBhIGZ1bmN0aW9uIHRoYXQgcmVsaWFibHkgcHJvZHVjZXMgYSB2YWxpZCBhY2Nlc3MgdG9rZW5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlVG9rZW5DeWNsZXIoY3JlZGVudGlhbCwgc2NvcGVzLCB0b2tlbkN5Y2xlck9wdGlvbnMpIHtcbiAgICBsZXQgcmVmcmVzaFdvcmtlciA9IG51bGw7XG4gICAgbGV0IHRva2VuID0gbnVsbDtcbiAgICBjb25zdCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0NZQ0xFUl9PUFRJT05TKSwgdG9rZW5DeWNsZXJPcHRpb25zKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGxpdHRsZSBob2xkZXIgZGVmaW5lcyBzZXZlcmFsIHByZWRpY2F0ZXMgdGhhdCB3ZSB1c2UgdG8gY29uc3RydWN0XG4gICAgICogdGhlIHJ1bGVzIG9mIHJlZnJlc2hpbmcgdGhlIHRva2VuLlxuICAgICAqL1xuICAgIGNvbnN0IGN5Y2xlciA9IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFByb2R1Y2VzIHRydWUgaWYgYSByZWZyZXNoIGpvYiBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQgaXNSZWZyZXNoaW5nKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlZnJlc2hXb3JrZXIgIT09IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQcm9kdWNlcyB0cnVlIGlmIHRoZSBjeWNsZXIgU0hPVUxEIHJlZnJlc2ggKHdlIGFyZSB3aXRoaW4gdGhlIHJlZnJlc2hcbiAgICAgICAgICogd2luZG93IGFuZCBub3QgYWxyZWFkeSByZWZyZXNoaW5nKVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0IHNob3VsZFJlZnJlc2goKSB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICByZXR1cm4gKCFjeWNsZXIuaXNSZWZyZXNoaW5nICYmXG4gICAgICAgICAgICAgICAgKChfYSA9IHRva2VuID09PSBudWxsIHx8IHRva2VuID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b2tlbi5leHBpcmVzT25UaW1lc3RhbXApICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDApIC0gb3B0aW9ucy5yZWZyZXNoV2luZG93SW5NcyA8IERhdGUubm93KCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUHJvZHVjZXMgdHJ1ZSBpZiB0aGUgY3ljbGVyIE1VU1QgcmVmcmVzaCAobnVsbCBvciBuZWFybHktZXhwaXJlZFxuICAgICAgICAgKiB0b2tlbikuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQgbXVzdFJlZnJlc2goKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRva2VuID09PSBudWxsIHx8IHRva2VuLmV4cGlyZXNPblRpbWVzdGFtcCAtIG9wdGlvbnMuZm9yY2VkUmVmcmVzaFdpbmRvd0luTXMgPCBEYXRlLm5vdygpKTtcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFN0YXJ0cyBhIHJlZnJlc2ggam9iIG9yIHJldHVybnMgdGhlIGV4aXN0aW5nIGpvYiBpZiBvbmUgaXMgYWxyZWFkeVxuICAgICAqIHJ1bm5pbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVmcmVzaChnZXRUb2tlbk9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIWN5Y2xlci5pc1JlZnJlc2hpbmcpIHtcbiAgICAgICAgICAgIC8vIFdlIGJpbmQgYHNjb3Blc2AgaGVyZSB0byBhdm9pZCBwYXNzaW5nIGl0IGFyb3VuZCBhIGxvdFxuICAgICAgICAgICAgY29uc3QgdHJ5R2V0QWNjZXNzVG9rZW4gPSAoKSA9PiBjcmVkZW50aWFsLmdldFRva2VuKHNjb3BlcywgZ2V0VG9rZW5PcHRpb25zKTtcbiAgICAgICAgICAgIC8vIFRha2UgYWR2YW50YWdlIG9mIHByb21pc2UgY2hhaW5pbmcgdG8gaW5zZXJ0IGFuIGFzc2lnbm1lbnQgdG8gYHRva2VuYFxuICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSByZWZyZXNoIGNhbiBiZSBjb25zaWRlcmVkIGRvbmUuXG4gICAgICAgICAgICByZWZyZXNoV29ya2VyID0gYmVnaW5SZWZyZXNoKHRyeUdldEFjY2Vzc1Rva2VuLCBvcHRpb25zLnJldHJ5SW50ZXJ2YWxJbk1zLCBcbiAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSB0b2tlbiwgdGhlbiB3ZSBzaG91bGQgdGltZW91dCBpbW1lZGlhdGVseVxuICAgICAgICAgICAgKF9hID0gdG9rZW4gPT09IG51bGwgfHwgdG9rZW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRva2VuLmV4cGlyZXNPblRpbWVzdGFtcCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogRGF0ZS5ub3coKSlcbiAgICAgICAgICAgICAgICAudGhlbigoX3Rva2VuKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVmcmVzaFdvcmtlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgdG9rZW4gPSBfdG9rZW47XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goKHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFdlIGFsc28gc2hvdWxkIHJlc2V0IHRoZSByZWZyZXNoZXIgaWYgd2UgZW50ZXIgYSBmYWlsZWQgc3RhdGUuICBBbGxcbiAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBhd2FpdGVycyB3aWxsIHRocm93LCBidXQgc3Vic2VxdWVudCByZXF1ZXN0cyB3aWxsIHN0YXJ0IGFcbiAgICAgICAgICAgICAgICAvLyBuZXcgcmV0cnkgY2hhaW4uXG4gICAgICAgICAgICAgICAgcmVmcmVzaFdvcmtlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgdG9rZW4gPSBudWxsO1xuICAgICAgICAgICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWZyZXNoV29ya2VyO1xuICAgIH1cbiAgICByZXR1cm4gYXN5bmMgKHRva2VuT3B0aW9ucykgPT4ge1xuICAgICAgICAvL1xuICAgICAgICAvLyBTaW1wbGUgcnVsZXM6XG4gICAgICAgIC8vIC0gSWYgd2UgTVVTVCByZWZyZXNoLCB0aGVuIHJldHVybiB0aGUgcmVmcmVzaCB0YXNrLCBibG9ja2luZ1xuICAgICAgICAvLyAgIHRoZSBwaXBlbGluZSB1bnRpbCBhIHRva2VuIGlzIGF2YWlsYWJsZS5cbiAgICAgICAgLy8gLSBJZiB3ZSBTSE9VTEQgcmVmcmVzaCwgdGhlbiBydW4gcmVmcmVzaCBidXQgZG9uJ3QgcmV0dXJuIGl0XG4gICAgICAgIC8vICAgKHdlIGNhbiBzdGlsbCB1c2UgdGhlIGNhY2hlZCB0b2tlbikuXG4gICAgICAgIC8vIC0gUmV0dXJuIHRoZSB0b2tlbiwgc2luY2UgaXQncyBmaW5lIGlmIHdlIGRpZG4ndCByZXR1cm4gaW5cbiAgICAgICAgLy8gICBzdGVwIDEuXG4gICAgICAgIC8vXG4gICAgICAgIGlmIChjeWNsZXIubXVzdFJlZnJlc2gpXG4gICAgICAgICAgICByZXR1cm4gcmVmcmVzaCh0b2tlbk9wdGlvbnMpO1xuICAgICAgICBpZiAoY3ljbGVyLnNob3VsZFJlZnJlc2gpIHtcbiAgICAgICAgICAgIHJlZnJlc2godG9rZW5PcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgfTtcbn1cbi8vICNlbmRyZWdpb25cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmYWN0b3J5IGZvciBhIFJlcXVlc3RQb2xpY3kgdGhhdCBhcHBsaWVzIGEgYmVhcmVyIHRva2VuIHRvXG4gKiB0aGUgcmVxdWVzdHMnIGBBdXRob3JpemF0aW9uYCBoZWFkZXJzLlxuICpcbiAqIEBwYXJhbSBjcmVkZW50aWFsIC0gVGhlIFRva2VuQ3JlZGVudGlhbCBpbXBsZW1lbnRhdGlvbiB0aGF0IGNhbiBzdXBwbHkgdGhlIGJlYXJlciB0b2tlbi5cbiAqIEBwYXJhbSBzY29wZXMgLSBUaGUgc2NvcGVzIGZvciB3aGljaCB0aGUgYmVhcmVyIHRva2VuIGFwcGxpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiZWFyZXJUb2tlbkF1dGhlbnRpY2F0aW9uUG9saWN5KGNyZWRlbnRpYWwsIHNjb3Blcykge1xuICAgIC8vIFRoaXMgc2ltcGxlIGZ1bmN0aW9uIGVuY2Fwc3VsYXRlcyB0aGUgZW50aXJlIHByb2Nlc3Mgb2YgcmVsaWFibHkgcmV0cmlldmluZyB0aGUgdG9rZW5cbiAgICBjb25zdCBnZXRUb2tlbiA9IGNyZWF0ZVRva2VuQ3ljbGVyKGNyZWRlbnRpYWwsIHNjb3BlcyAvKiAsIG9wdGlvbnMgKi8pO1xuICAgIGNsYXNzIEJlYXJlclRva2VuQXV0aGVudGljYXRpb25Qb2xpY3kgZXh0ZW5kcyBCYXNlUmVxdWVzdFBvbGljeSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKG5leHRQb2xpY3ksIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHN1cGVyKG5leHRQb2xpY3ksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHdlYlJlc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoIXdlYlJlc291cmNlLnVybC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJlYXJlciB0b2tlbiBhdXRoZW50aWNhdGlvbiBpcyBub3QgcGVybWl0dGVkIGZvciBub24tVExTIHByb3RlY3RlZCAobm9uLWh0dHBzKSBVUkxzLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgdG9rZW4gfSA9IGF3YWl0IGdldFRva2VuKHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogd2ViUmVzb3VyY2UuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgdHJhY2luZ0NvbnRleHQ6IHdlYlJlc291cmNlLnRyYWNpbmdDb250ZXh0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHdlYlJlc291cmNlLmhlYWRlcnMuc2V0KENvbnN0YW50cy5IZWFkZXJDb25zdGFudHMuQVVUSE9SSVpBVElPTiwgYEJlYXJlciAke3Rva2VufWApO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25leHRQb2xpY3kuc2VuZFJlcXVlc3Qod2ViUmVzb3VyY2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNyZWF0ZTogKG5leHRQb2xpY3ksIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQmVhcmVyVG9rZW5BdXRoZW50aWNhdGlvblBvbGljeShuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmVhcmVyVG9rZW5BdXRoZW50aWNhdGlvblBvbGljeS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IERlZmF1bHRIdHRwQ2xpZW50IH0gZnJvbSBcIi4vZGVmYXVsdEh0dHBDbGllbnRcIjtcbmxldCBjYWNoZWRIdHRwQ2xpZW50O1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhY2hlZERlZmF1bHRIdHRwQ2xpZW50KCkge1xuICAgIGlmICghY2FjaGVkSHR0cENsaWVudCkge1xuICAgICAgICBjYWNoZWRIdHRwQ2xpZW50ID0gbmV3IERlZmF1bHRIdHRwQ2xpZW50KCk7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZWRIdHRwQ2xpZW50O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aHR0cENsaWVudENhY2hlLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSBcIi4uL3V0aWwvdXRpbHNcIjtcbmltcG9ydCB7IEJhc2VSZXF1ZXN0UG9saWN5LCB9IGZyb20gXCIuL3JlcXVlc3RQb2xpY3lcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcIkBhenVyZS9jb3JlLXV0aWxcIjtcbmV4cG9ydCBmdW5jdGlvbiBycFJlZ2lzdHJhdGlvblBvbGljeShyZXRyeVRpbWVvdXQgPSAzMCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNyZWF0ZTogKG5leHRQb2xpY3ksIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUlBSZWdpc3RyYXRpb25Qb2xpY3kobmV4dFBvbGljeSwgb3B0aW9ucywgcmV0cnlUaW1lb3V0KTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuZXhwb3J0IGNsYXNzIFJQUmVnaXN0cmF0aW9uUG9saWN5IGV4dGVuZHMgQmFzZVJlcXVlc3RQb2xpY3kge1xuICAgIGNvbnN0cnVjdG9yKG5leHRQb2xpY3ksIG9wdGlvbnMsIF9yZXRyeVRpbWVvdXQgPSAzMCkge1xuICAgICAgICBzdXBlcihuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fcmV0cnlUaW1lb3V0ID0gX3JldHJ5VGltZW91dDtcbiAgICB9XG4gICAgc2VuZFJlcXVlc3QocmVxdWVzdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmV4dFBvbGljeVxuICAgICAgICAgICAgLnNlbmRSZXF1ZXN0KHJlcXVlc3QuY2xvbmUoKSlcbiAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVnaXN0ZXJJZk5lZWRlZCh0aGlzLCByZXF1ZXN0LCByZXNwb25zZSkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlZ2lzdGVySWZOZWVkZWQocG9saWN5LCByZXF1ZXN0LCByZXNwb25zZSkge1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwOSkge1xuICAgICAgICBjb25zdCBycE5hbWUgPSBjaGVja1JQTm90UmVnaXN0ZXJlZEVycm9yKHJlc3BvbnNlLmJvZHlBc1RleHQpO1xuICAgICAgICBpZiAocnBOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCB1cmxQcmVmaXggPSBleHRyYWN0U3Vic2NyaXB0aW9uVXJsKHJlcXVlc3QudXJsKTtcbiAgICAgICAgICAgIHJldHVybiAocmVnaXN0ZXJSUChwb2xpY3ksIHVybFByZWZpeCwgcnBOYW1lLCByZXF1ZXN0KVxuICAgICAgICAgICAgICAgIC8vIEF1dG9yZWdpc3RyYXRpb24gb2YgJHtwcm92aWRlcn0gZmFpbGVkIGZvciBzb21lIHJlYXNvbi4gV2Ugd2lsbCBub3QgcmV0dXJuIHRoaXMgZXJyb3JcbiAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIHdpbGwgcmV0dXJuIHRoZSBpbml0aWFsIHJlc3BvbnNlIHdpdGggNDA5IHN0YXR1cyBjb2RlIGJhY2sgdG8gdGhlIHVzZXIuXG4gICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZyBoZXJlIGFzIHdlIGFyZSByZXR1cm5pbmcgdGhlIG9yaWdpbmFsIHJlc3BvbnNlIGF0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QuXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IGZhbHNlKVxuICAgICAgICAgICAgICAgIC50aGVuKChyZWdpc3RyYXRpb25TdGF0dXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVnaXN0cmF0aW9uU3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJldHJ5IHRoZSBvcmlnaW5hbCByZXF1ZXN0LiBXZSBoYXZlIHRvIGNoYW5nZSB0aGUgeC1tcy1jbGllbnQtcmVxdWVzdC1pZFxuICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgQXp1cmUgZW5kcG9pbnQgd2lsbCByZXR1cm4gdGhlIGluaXRpYWwgNDA5IChjYWNoZWQpIHJlc3BvbnNlLlxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLCB1dGlscy5nZW5lcmF0ZVV1aWQoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwb2xpY3kuX25leHRQb2xpY3kuc2VuZFJlcXVlc3QocmVxdWVzdC5jbG9uZSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UpO1xufVxuLyoqXG4gKiBSZXVzZXMgdGhlIGhlYWRlcnMgb2YgdGhlIG9yaWdpbmFsIHJlcXVlc3QgYW5kIHVybCAoaWYgc3BlY2lmaWVkKS5cbiAqIEBwYXJhbSBvcmlnaW5hbFJlcXVlc3QgLSBUaGUgb3JpZ2luYWwgcmVxdWVzdFxuICogQHBhcmFtIHJldXNlVXJsVG9vIC0gU2hvdWxkIHRoZSB1cmwgZnJvbSB0aGUgb3JpZ2luYWwgcmVxdWVzdCBiZSByZXVzZWQgYXMgd2VsbC4gRGVmYXVsdCBmYWxzZS5cbiAqIEByZXR1cm5zIEEgbmV3IHJlcXVlc3Qgb2JqZWN0IHdpdGggZGVzaXJlZCBoZWFkZXJzLlxuICovXG5mdW5jdGlvbiBnZXRSZXF1ZXN0RXNzZW50aWFscyhvcmlnaW5hbFJlcXVlc3QsIHJldXNlVXJsVG9vID0gZmFsc2UpIHtcbiAgICBjb25zdCByZXFPcHRpb25zID0gb3JpZ2luYWxSZXF1ZXN0LmNsb25lKCk7XG4gICAgaWYgKHJldXNlVXJsVG9vKSB7XG4gICAgICAgIHJlcU9wdGlvbnMudXJsID0gb3JpZ2luYWxSZXF1ZXN0LnVybDtcbiAgICB9XG4gICAgLy8gV2UgaGF2ZSB0byBjaGFuZ2UgdGhlIHgtbXMtY2xpZW50LXJlcXVlc3QtaWQgb3RoZXJ3aXNlIEF6dXJlIGVuZHBvaW50XG4gICAgLy8gd2lsbCByZXR1cm4gdGhlIGluaXRpYWwgNDA5IChjYWNoZWQpIHJlc3BvbnNlLlxuICAgIHJlcU9wdGlvbnMuaGVhZGVycy5zZXQoXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsIHV0aWxzLmdlbmVyYXRlVXVpZCgpKTtcbiAgICAvLyBTZXQgY29udGVudC10eXBlIHRvIGFwcGxpY2F0aW9uL2pzb25cbiAgICByZXFPcHRpb25zLmhlYWRlcnMuc2V0KFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiKTtcbiAgICByZXR1cm4gcmVxT3B0aW9ucztcbn1cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBlcnJvciBjb2RlIGFuZCBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCA0MDkgcmVzcG9uc2Ugc3RhdHVzIGNvZGUuIElmIGl0IG1hdGNoZXMgdG8gdGhhdCBvZlxuICogUlAgbm90IHJlZ2lzdGVyZWQgdGhlbiBpdCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBSUCBlbHNlIHJldHVybnMgdW5kZWZpbmVkLlxuICogQHBhcmFtIGJvZHkgLSBUaGUgcmVzcG9uc2UgYm9keSByZWNlaXZlZCBhZnRlciBtYWtpbmcgdGhlIG9yaWdpbmFsIHJlcXVlc3QuXG4gKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgUlAgaWYgY29uZGl0aW9uIGlzIHNhdGlzZmllZCBlbHNlIHVuZGVmaW5lZC5cbiAqL1xuZnVuY3Rpb24gY2hlY2tSUE5vdFJlZ2lzdGVyZWRFcnJvcihib2R5KSB7XG4gICAgbGV0IHJlc3VsdCwgcmVzcG9uc2VCb2R5O1xuICAgIGlmIChib2R5KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNwb25zZUJvZHkgPSBKU09OLnBhcnNlKGJvZHkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlQm9keSAmJlxuICAgICAgICAgICAgcmVzcG9uc2VCb2R5LmVycm9yICYmXG4gICAgICAgICAgICByZXNwb25zZUJvZHkuZXJyb3IubWVzc2FnZSAmJlxuICAgICAgICAgICAgcmVzcG9uc2VCb2R5LmVycm9yLmNvZGUgJiZcbiAgICAgICAgICAgIHJlc3BvbnNlQm9keS5lcnJvci5jb2RlID09PSBcIk1pc3NpbmdTdWJzY3JpcHRpb25SZWdpc3RyYXRpb25cIikge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hSZXMgPSByZXNwb25zZUJvZHkuZXJyb3IubWVzc2FnZS5tYXRjaCgvLionKC4qKScvaSk7XG4gICAgICAgICAgICBpZiAobWF0Y2hSZXMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBtYXRjaFJlcy5wb3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgVVJMLCBqdXN0IGFmdGVyIHN1YnNjcmlwdGlvbjpcbiAqIGh0dHBzOi8vbWFuYWdlbWVudC5henVyZS5jb20vc3Vic2NyaXB0aW9ucy8wMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAvXG4gKiBAcGFyYW0gdXJsIC0gVGhlIG9yaWdpbmFsIHJlcXVlc3QgdXJsXG4gKiBAcmV0dXJucyBUaGUgdXJsIHByZWZpeCBhcyBleHBsYWluZWQgYWJvdmUuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RTdWJzY3JpcHRpb25VcmwodXJsKSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBjb25zdCBtYXRjaFJlcyA9IHVybC5tYXRjaCgvLipcXC9zdWJzY3JpcHRpb25zXFwvW2EtZjAtOS1dK1xcLy9naSk7XG4gICAgaWYgKG1hdGNoUmVzICYmIG1hdGNoUmVzWzBdKSB7XG4gICAgICAgIHJlc3VsdCA9IG1hdGNoUmVzWzBdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZXh0cmFjdCBzdWJzY3JpcHRpb25JZCBmcm9tIHRoZSBnaXZlbiB1cmwgLSAke3VybH0uYCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgZ2l2ZW4gcHJvdmlkZXIuXG4gKiBAcGFyYW0gcG9saWN5IC0gVGhlIFJQUmVnaXN0cmF0aW9uUG9saWN5IHRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVkIGFnYWluc3QuXG4gKiBAcGFyYW0gdXJsUHJlZml4IC0gaHR0cHM6Ly9tYW5hZ2VtZW50LmF6dXJlLmNvbS9zdWJzY3JpcHRpb25zLzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMC9cbiAqIEBwYXJhbSBwcm92aWRlciAtIFRoZSBwcm92aWRlciBuYW1lIHRvIGJlIHJlZ2lzdGVyZWQuXG4gKiBAcGFyYW0gb3JpZ2luYWxSZXF1ZXN0IC0gVGhlIG9yaWdpbmFsIHJlcXVlc3Qgc2VudCBieSB0aGUgdXNlciB0aGF0IHJldHVybmVkIGEgNDA5IHJlc3BvbnNlXG4gKiB3aXRoIGEgbWVzc2FnZSB0aGF0IHRoZSBwcm92aWRlciBpcyBub3QgcmVnaXN0ZXJlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJSUChwb2xpY3ksIHVybFByZWZpeCwgcHJvdmlkZXIsIG9yaWdpbmFsUmVxdWVzdCkge1xuICAgIGNvbnN0IHBvc3RVcmwgPSBgJHt1cmxQcmVmaXh9cHJvdmlkZXJzLyR7cHJvdmlkZXJ9L3JlZ2lzdGVyP2FwaS12ZXJzaW9uPTIwMTYtMDItMDFgO1xuICAgIGNvbnN0IGdldFVybCA9IGAke3VybFByZWZpeH1wcm92aWRlcnMvJHtwcm92aWRlcn0/YXBpLXZlcnNpb249MjAxNi0wMi0wMWA7XG4gICAgY29uc3QgcmVxT3B0aW9ucyA9IGdldFJlcXVlc3RFc3NlbnRpYWxzKG9yaWdpbmFsUmVxdWVzdCk7XG4gICAgcmVxT3B0aW9ucy5tZXRob2QgPSBcIlBPU1RcIjtcbiAgICByZXFPcHRpb25zLnVybCA9IHBvc3RVcmw7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwb2xpY3kuX25leHRQb2xpY3kuc2VuZFJlcXVlc3QocmVxT3B0aW9ucyk7XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXV0b3JlZ2lzdHJhdGlvbiBvZiAke3Byb3ZpZGVyfSBmYWlsZWQuIFBsZWFzZSB0cnkgcmVnaXN0ZXJpbmcgbWFudWFsbHkuYCk7XG4gICAgfVxuICAgIHJldHVybiBnZXRSZWdpc3RyYXRpb25TdGF0dXMocG9saWN5LCBnZXRVcmwsIG9yaWdpbmFsUmVxdWVzdCk7XG59XG4vKipcbiAqIFBvbGxzIHRoZSByZWdpc3RyYXRpb24gc3RhdHVzIG9mIHRoZSBwcm92aWRlciB0aGF0IHdhcyByZWdpc3RlcmVkLiBQb2xsaW5nIGhhcHBlbnMgYXQgYW4gaW50ZXJ2YWwgb2YgMzAgc2Vjb25kcy5cbiAqIFBvbGxpbmcgd2lsbCBoYXBwZW4gdGlsbCB0aGUgcmVnaXN0cmF0aW9uU3RhdGUgcHJvcGVydHkgb2YgdGhlIHJlc3BvbnNlIGJvZHkgaXMgXCJSZWdpc3RlcmVkXCIuXG4gKiBAcGFyYW0gcG9saWN5IC0gVGhlIFJQUmVnaXN0cmF0aW9uUG9saWN5IHRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVkIGFnYWluc3QuXG4gKiBAcGFyYW0gdXJsIC0gVGhlIHJlcXVlc3QgdXJsIGZvciBwb2xsaW5nXG4gKiBAcGFyYW0gb3JpZ2luYWxSZXF1ZXN0IC0gVGhlIG9yaWdpbmFsIHJlcXVlc3Qgc2VudCBieSB0aGUgdXNlciB0aGF0IHJldHVybmVkIGEgNDA5IHJlc3BvbnNlXG4gKiB3aXRoIGEgbWVzc2FnZSB0aGF0IHRoZSBwcm92aWRlciBpcyBub3QgcmVnaXN0ZXJlZC5cbiAqIEByZXR1cm5zIFRydWUgaWYgUlAgUmVnaXN0cmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFJlZ2lzdHJhdGlvblN0YXR1cyhwb2xpY3ksIHVybCwgb3JpZ2luYWxSZXF1ZXN0KSB7XG4gICAgY29uc3QgcmVxT3B0aW9ucyA9IGdldFJlcXVlc3RFc3NlbnRpYWxzKG9yaWdpbmFsUmVxdWVzdCk7XG4gICAgcmVxT3B0aW9ucy51cmwgPSB1cmw7XG4gICAgcmVxT3B0aW9ucy5tZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHBvbGljeS5fbmV4dFBvbGljeS5zZW5kUmVxdWVzdChyZXFPcHRpb25zKTtcbiAgICBjb25zdCBvYmogPSByZXMucGFyc2VkQm9keTtcbiAgICBpZiAocmVzLnBhcnNlZEJvZHkgJiYgb2JqLnJlZ2lzdHJhdGlvblN0YXRlICYmIG9iai5yZWdpc3RyYXRpb25TdGF0ZSA9PT0gXCJSZWdpc3RlcmVkXCIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhd2FpdCBkZWxheShwb2xpY3kuX3JldHJ5VGltZW91dCAqIDEwMDApO1xuICAgICAgICByZXR1cm4gZ2V0UmVnaXN0cmF0aW9uU3RhdHVzKHBvbGljeSwgdXJsLCBvcmlnaW5hbFJlcXVlc3QpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJwUmVnaXN0cmF0aW9uUG9saWN5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgQmFzZVJlcXVlc3RQb2xpY3ksIH0gZnJvbSBcIi4vcmVxdWVzdFBvbGljeVwiO1xuLyoqXG4gKiBDcmVhdGVzIGEgcG9saWN5IHRoYXQgc2lnbnMgb3V0Z29pbmcgcmVxdWVzdHMgYnkgY2FsbGluZyB0byB0aGUgcHJvdmlkZWQgYGF1dGhlbnRpY2F0aW9uUHJvdmlkZXJgJ3MgYHNpZ25SZXF1ZXN0YCBtZXRob2QuXG4gKiBAcGFyYW0gYXV0aGVudGljYXRpb25Qcm92aWRlciAtIFRoZSBhdXRoZW50aWNhdGlvbiBwcm92aWRlci5cbiAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSB7QGxpbmsgU2lnbmluZ1BvbGljeX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduaW5nUG9saWN5KGF1dGhlbnRpY2F0aW9uUHJvdmlkZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjcmVhdGU6IChuZXh0UG9saWN5LCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNpZ25pbmdQb2xpY3kobmV4dFBvbGljeSwgb3B0aW9ucywgYXV0aGVudGljYXRpb25Qcm92aWRlcik7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8qKlxuICogQSBwb2xpY3kgdGhhdCBzaWducyBvdXRnb2luZyByZXF1ZXN0cyBieSBjYWxsaW5nIHRvIHRoZSBwcm92aWRlZCBgYXV0aGVudGljYXRpb25Qcm92aWRlcmAncyBgc2lnblJlcXVlc3RgIG1ldGhvZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNpZ25pbmdQb2xpY3kgZXh0ZW5kcyBCYXNlUmVxdWVzdFBvbGljeSB7XG4gICAgY29uc3RydWN0b3IobmV4dFBvbGljeSwgb3B0aW9ucywgYXV0aGVudGljYXRpb25Qcm92aWRlcikge1xuICAgICAgICBzdXBlcihuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5hdXRoZW50aWNhdGlvblByb3ZpZGVyID0gYXV0aGVudGljYXRpb25Qcm92aWRlcjtcbiAgICB9XG4gICAgc2lnblJlcXVlc3QocmVxdWVzdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdXRoZW50aWNhdGlvblByb3ZpZGVyLnNpZ25SZXF1ZXN0KHJlcXVlc3QpO1xuICAgIH1cbiAgICBzZW5kUmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpZ25SZXF1ZXN0KHJlcXVlc3QpLnRoZW4oKG5leHRSZXF1ZXN0KSA9PiB0aGlzLl9uZXh0UG9saWN5LnNlbmRSZXF1ZXN0KG5leHRSZXF1ZXN0KSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2lnbmluZ1BvbGljeS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEJhc2VSZXF1ZXN0UG9saWN5LCB9IGZyb20gXCIuL3JlcXVlc3RQb2xpY3lcIjtcbmltcG9ydCB7IERFRkFVTFRfQ0xJRU5UX01BWF9SRVRSWV9JTlRFUlZBTCwgREVGQVVMVF9DTElFTlRfTUlOX1JFVFJZX0lOVEVSVkFMLCBERUZBVUxUX0NMSUVOVF9SRVRSWV9DT1VOVCwgREVGQVVMVF9DTElFTlRfUkVUUllfSU5URVJWQUwsIGlzTnVtYmVyLCBzaG91bGRSZXRyeSwgdXBkYXRlUmV0cnlEYXRhLCB9IGZyb20gXCIuLi91dGlsL2V4cG9uZW50aWFsQmFja29mZlN0cmF0ZWd5XCI7XG5pbXBvcnQgeyBkZWxheSB9IGZyb20gXCJAYXp1cmUvY29yZS11dGlsXCI7XG4vKipcbiAqIEEgcG9saWN5IHRoYXQgcmV0cmllcyB3aGVuIHRoZXJlJ3MgYSBzeXN0ZW0gZXJyb3IsIGlkZW50aWZpZWQgYnkgdGhlIGNvZGVzIFwiRVRJTUVET1VUXCIsIFwiRVNPQ0tFVFRJTUVET1VUXCIsIFwiRUNPTk5SRUZVU0VEXCIsIFwiRUNPTk5SRVNFVFwiIG9yIFwiRU5PRU5UXCIuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCAtIE1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMuXG4gKiBAcGFyYW0gcmV0cnlJbnRlcnZhbCAtIFRoZSBjbGllbnQgcmV0cnkgaW50ZXJ2YWwsIGluIG1pbGxpc2Vjb25kcy5cbiAqIEBwYXJhbSBtaW5SZXRyeUludGVydmFsIC0gVGhlIG1pbmltdW0gcmV0cnkgaW50ZXJ2YWwsIGluIG1pbGxpc2Vjb25kcy5cbiAqIEBwYXJhbSBtYXhSZXRyeUludGVydmFsIC0gVGhlIG1heGltdW0gcmV0cnkgaW50ZXJ2YWwsIGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSB7QGxpbmsgU3lzdGVtRXJyb3JSZXRyeVBvbGljeX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN5c3RlbUVycm9yUmV0cnlQb2xpY3kocmV0cnlDb3VudCwgcmV0cnlJbnRlcnZhbCwgbWluUmV0cnlJbnRlcnZhbCwgbWF4UmV0cnlJbnRlcnZhbCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNyZWF0ZTogKG5leHRQb2xpY3ksIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU3lzdGVtRXJyb3JSZXRyeVBvbGljeShuZXh0UG9saWN5LCBvcHRpb25zLCByZXRyeUNvdW50LCByZXRyeUludGVydmFsLCBtaW5SZXRyeUludGVydmFsLCBtYXhSZXRyeUludGVydmFsKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuLyoqXG4gKiBBIHBvbGljeSB0aGF0IHJldHJpZXMgd2hlbiB0aGVyZSdzIGEgc3lzdGVtIGVycm9yLCBpZGVudGlmaWVkIGJ5IHRoZSBjb2RlcyBcIkVUSU1FRE9VVFwiLCBcIkVTT0NLRVRUSU1FRE9VVFwiLCBcIkVDT05OUkVGVVNFRFwiLCBcIkVDT05OUkVTRVRcIiBvciBcIkVOT0VOVFwiLlxuICogQHBhcmFtIHJldHJ5Q291bnQgLSBUaGUgY2xpZW50IHJldHJ5IGNvdW50LlxuICogQHBhcmFtIHJldHJ5SW50ZXJ2YWwgLSBUaGUgY2xpZW50IHJldHJ5IGludGVydmFsLCBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcGFyYW0gbWluUmV0cnlJbnRlcnZhbCAtIFRoZSBtaW5pbXVtIHJldHJ5IGludGVydmFsLCBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcGFyYW0gbWF4UmV0cnlJbnRlcnZhbCAtIFRoZSBtYXhpbXVtIHJldHJ5IGludGVydmFsLCBpbiBtaWxsaXNlY29uZHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTeXN0ZW1FcnJvclJldHJ5UG9saWN5IGV4dGVuZHMgQmFzZVJlcXVlc3RQb2xpY3kge1xuICAgIGNvbnN0cnVjdG9yKG5leHRQb2xpY3ksIG9wdGlvbnMsIHJldHJ5Q291bnQsIHJldHJ5SW50ZXJ2YWwsIG1pblJldHJ5SW50ZXJ2YWwsIG1heFJldHJ5SW50ZXJ2YWwpIHtcbiAgICAgICAgc3VwZXIobmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMucmV0cnlDb3VudCA9IGlzTnVtYmVyKHJldHJ5Q291bnQpID8gcmV0cnlDb3VudCA6IERFRkFVTFRfQ0xJRU5UX1JFVFJZX0NPVU5UO1xuICAgICAgICB0aGlzLnJldHJ5SW50ZXJ2YWwgPSBpc051bWJlcihyZXRyeUludGVydmFsKSA/IHJldHJ5SW50ZXJ2YWwgOiBERUZBVUxUX0NMSUVOVF9SRVRSWV9JTlRFUlZBTDtcbiAgICAgICAgdGhpcy5taW5SZXRyeUludGVydmFsID0gaXNOdW1iZXIobWluUmV0cnlJbnRlcnZhbClcbiAgICAgICAgICAgID8gbWluUmV0cnlJbnRlcnZhbFxuICAgICAgICAgICAgOiBERUZBVUxUX0NMSUVOVF9NSU5fUkVUUllfSU5URVJWQUw7XG4gICAgICAgIHRoaXMubWF4UmV0cnlJbnRlcnZhbCA9IGlzTnVtYmVyKG1heFJldHJ5SW50ZXJ2YWwpXG4gICAgICAgICAgICA/IG1heFJldHJ5SW50ZXJ2YWxcbiAgICAgICAgICAgIDogREVGQVVMVF9DTElFTlRfTUFYX1JFVFJZX0lOVEVSVkFMO1xuICAgIH1cbiAgICBzZW5kUmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uZXh0UG9saWN5XG4gICAgICAgICAgICAuc2VuZFJlcXVlc3QocmVxdWVzdC5jbG9uZSgpKVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gcmV0cnkodGhpcywgcmVxdWVzdCwgZXJyb3IucmVzcG9uc2UsIGVycm9yKSk7XG4gICAgfVxufVxuYXN5bmMgZnVuY3Rpb24gcmV0cnkocG9saWN5LCByZXF1ZXN0LCBvcGVyYXRpb25SZXNwb25zZSwgZXJyLCByZXRyeURhdGEpIHtcbiAgICByZXRyeURhdGEgPSB1cGRhdGVSZXRyeURhdGEocG9saWN5LCByZXRyeURhdGEsIGVycik7XG4gICAgZnVuY3Rpb24gc2hvdWxkUG9saWN5UmV0cnkoX3Jlc3BvbnNlLCBlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgJiZcbiAgICAgICAgICAgIGVycm9yLmNvZGUgJiZcbiAgICAgICAgICAgIChlcnJvci5jb2RlID09PSBcIkVUSU1FRE9VVFwiIHx8XG4gICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9PT0gXCJFU09DS0VUVElNRURPVVRcIiB8fFxuICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPT09IFwiRUNPTk5SRUZVU0VEXCIgfHxcbiAgICAgICAgICAgICAgICBlcnJvci5jb2RlID09PSBcIkVDT05OUkVTRVRcIiB8fFxuICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPT09IFwiRU5PRU5UXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChzaG91bGRSZXRyeShwb2xpY3kucmV0cnlDb3VudCwgc2hvdWxkUG9saWN5UmV0cnksIHJldHJ5RGF0YSwgb3BlcmF0aW9uUmVzcG9uc2UsIGVycikpIHtcbiAgICAgICAgLy8gSWYgcHJldmlvdXMgb3BlcmF0aW9uIGVuZGVkIHdpdGggYW4gZXJyb3IgYW5kIHRoZSBwb2xpY3kgYWxsb3dzIGEgcmV0cnksIGRvIHRoYXRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KHJldHJ5RGF0YS5yZXRyeUludGVydmFsKTtcbiAgICAgICAgICAgIHJldHVybiBwb2xpY3kuX25leHRQb2xpY3kuc2VuZFJlcXVlc3QocmVxdWVzdC5jbG9uZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAobmVzdGVkRXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0cnkocG9saWN5LCByZXF1ZXN0LCBvcGVyYXRpb25SZXNwb25zZSwgbmVzdGVkRXJyLCByZXRyeURhdGEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgb3BlcmF0aW9uIGZhaWxlZCBpbiB0aGUgZW5kLCByZXR1cm4gYWxsIGVycm9ycyBpbnN0ZWFkIG9mIGp1c3QgdGhlIGxhc3Qgb25lXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmV0cnlEYXRhLmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3BlcmF0aW9uUmVzcG9uc2U7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3lzdGVtRXJyb3JSZXRyeVBvbGljeS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbi8qKlxuICogTWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBmb3IgdGhlIHRocm90dGxpbmcgcmV0cnkgcG9saWN5XG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NMSUVOVF9NQVhfUkVUUllfQ09VTlQgPSAzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGhyb3R0bGluZ1JldHJ5U3RyYXRlZ3kuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBCYXNlUmVxdWVzdFBvbGljeSwgfSBmcm9tIFwiLi9yZXF1ZXN0UG9saWN5XCI7XG5pbXBvcnQgeyBBYm9ydEVycm9yIH0gZnJvbSBcIkBhenVyZS9hYm9ydC1jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tIFwiLi4vdXRpbC9jb25zdGFudHNcIjtcbmltcG9ydCB7IERFRkFVTFRfQ0xJRU5UX01BWF9SRVRSWV9DT1VOVCB9IGZyb20gXCIuLi91dGlsL3Rocm90dGxpbmdSZXRyeVN0cmF0ZWd5XCI7XG5pbXBvcnQgeyBkZWxheSB9IGZyb20gXCJAYXp1cmUvY29yZS11dGlsXCI7XG5jb25zdCBTdGF0dXNDb2RlcyA9IENvbnN0YW50cy5IdHRwQ29uc3RhbnRzLlN0YXR1c0NvZGVzO1xuLyoqXG4gKiBDcmVhdGVzIGEgcG9saWN5IHRoYXQgcmUtc2VuZHMgdGhlIHJlcXVlc3QgaWYgdGhlIHJlc3BvbnNlIGluZGljYXRlcyB0aGUgcmVxdWVzdCBmYWlsZWQgYmVjYXVzZSBvZiB0aHJvdHRsaW5nIHJlYXNvbnMuXG4gKiBGb3IgZXhhbXBsZSwgaWYgdGhlIHJlc3BvbnNlIGNvbnRhaW5zIGEgYFJldHJ5LUFmdGVyYCBoZWFkZXIsIGl0IHdpbGwgcmV0cnkgc2VuZGluZyB0aGUgcmVxdWVzdCBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhhdCBoZWFkZXIuXG4gKlxuICogVG8gbGVhcm4gbW9yZSwgcGxlYXNlIHJlZmVyIHRvXG4gKiBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS9henVyZS1yZXNvdXJjZS1tYW5hZ2VyL3Jlc291cmNlLW1hbmFnZXItcmVxdWVzdC1saW1pdHMsXG4gKiBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS9henVyZS1zdWJzY3JpcHRpb24tc2VydmljZS1saW1pdHMgYW5kXG4gKiBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS92aXJ0dWFsLW1hY2hpbmVzL3Ryb3VibGVzaG9vdGluZy90cm91Ymxlc2hvb3RpbmctdGhyb3R0bGluZy1lcnJvcnNcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aHJvdHRsaW5nUmV0cnlQb2xpY3koKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlOiAobmV4dFBvbGljeSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUaHJvdHRsaW5nUmV0cnlQb2xpY3kobmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmNvbnN0IFN0YW5kYXJkQWJvcnRNZXNzYWdlID0gXCJUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkLlwiO1xuLyoqXG4gKiBDcmVhdGVzIGEgcG9saWN5IHRoYXQgcmUtc2VuZHMgdGhlIHJlcXVlc3QgaWYgdGhlIHJlc3BvbnNlIGluZGljYXRlcyB0aGUgcmVxdWVzdCBmYWlsZWQgYmVjYXVzZSBvZiB0aHJvdHRsaW5nIHJlYXNvbnMuXG4gKiBGb3IgZXhhbXBsZSwgaWYgdGhlIHJlc3BvbnNlIGNvbnRhaW5zIGEgYFJldHJ5LUFmdGVyYCBoZWFkZXIsIGl0IHdpbGwgcmV0cnkgc2VuZGluZyB0aGUgcmVxdWVzdCBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhhdCBoZWFkZXIuXG4gKlxuICogVG8gbGVhcm4gbW9yZSwgcGxlYXNlIHJlZmVyIHRvXG4gKiBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS9henVyZS1yZXNvdXJjZS1tYW5hZ2VyL3Jlc291cmNlLW1hbmFnZXItcmVxdWVzdC1saW1pdHMsXG4gKiBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS9henVyZS1zdWJzY3JpcHRpb24tc2VydmljZS1saW1pdHMgYW5kXG4gKiBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS92aXJ0dWFsLW1hY2hpbmVzL3Ryb3VibGVzaG9vdGluZy90cm91Ymxlc2hvb3RpbmctdGhyb3R0bGluZy1lcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFRocm90dGxpbmdSZXRyeVBvbGljeSBleHRlbmRzIEJhc2VSZXF1ZXN0UG9saWN5IHtcbiAgICBjb25zdHJ1Y3RvcihuZXh0UG9saWN5LCBvcHRpb25zLCBfaGFuZGxlUmVzcG9uc2UpIHtcbiAgICAgICAgc3VwZXIobmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMubnVtYmVyT2ZSZXRyaWVzID0gMDtcbiAgICAgICAgdGhpcy5faGFuZGxlUmVzcG9uc2UgPSBfaGFuZGxlUmVzcG9uc2UgfHwgdGhpcy5fZGVmYXVsdFJlc3BvbnNlSGFuZGxlcjtcbiAgICB9XG4gICAgYXN5bmMgc2VuZFJlcXVlc3QoaHR0cFJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9uZXh0UG9saWN5LnNlbmRSZXF1ZXN0KGh0dHBSZXF1ZXN0LmNsb25lKCkpO1xuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSBTdGF0dXNDb2Rlcy5Ub29NYW55UmVxdWVzdHMgJiZcbiAgICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyAhPT0gU3RhdHVzQ29kZXMuU2VydmljZVVuYXZhaWxhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlUmVzcG9uc2UoaHR0cFJlcXVlc3QsIHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBfZGVmYXVsdFJlc3BvbnNlSGFuZGxlcihodHRwUmVxdWVzdCwgaHR0cFJlc3BvbnNlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgcmV0cnlBZnRlckhlYWRlciA9IGh0dHBSZXNwb25zZS5oZWFkZXJzLmdldChDb25zdGFudHMuSGVhZGVyQ29uc3RhbnRzLlJFVFJZX0FGVEVSKTtcbiAgICAgICAgaWYgKHJldHJ5QWZ0ZXJIZWFkZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbGF5SW5NcyA9IFRocm90dGxpbmdSZXRyeVBvbGljeS5wYXJzZVJldHJ5QWZ0ZXJIZWFkZXIocmV0cnlBZnRlckhlYWRlcik7XG4gICAgICAgICAgICBpZiAoZGVsYXlJbk1zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5udW1iZXJPZlJldHJpZXMgKz0gMTtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShkZWxheUluTXMsIHtcbiAgICAgICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IGh0dHBSZXF1ZXN0LmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICBhYm9ydEVycm9yTXNnOiBTdGFuZGFyZEFib3J0TWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoKF9hID0gaHR0cFJlcXVlc3QuYWJvcnRTaWduYWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBYm9ydEVycm9yKFN0YW5kYXJkQWJvcnRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubnVtYmVyT2ZSZXRyaWVzIDwgREVGQVVMVF9DTElFTlRfTUFYX1JFVFJZX0NPVU5UKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRSZXF1ZXN0KGh0dHBSZXF1ZXN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9uZXh0UG9saWN5LnNlbmRSZXF1ZXN0KGh0dHBSZXF1ZXN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGh0dHBSZXNwb25zZTtcbiAgICB9XG4gICAgc3RhdGljIHBhcnNlUmV0cnlBZnRlckhlYWRlcihoZWFkZXJWYWx1ZSkge1xuICAgICAgICBjb25zdCByZXRyeUFmdGVySW5TZWNvbmRzID0gTnVtYmVyKGhlYWRlclZhbHVlKTtcbiAgICAgICAgaWYgKE51bWJlci5pc05hTihyZXRyeUFmdGVySW5TZWNvbmRzKSkge1xuICAgICAgICAgICAgcmV0dXJuIFRocm90dGxpbmdSZXRyeVBvbGljeS5wYXJzZURhdGVSZXRyeUFmdGVySGVhZGVyKGhlYWRlclZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXRyeUFmdGVySW5TZWNvbmRzICogMTAwMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgcGFyc2VEYXRlUmV0cnlBZnRlckhlYWRlcihoZWFkZXJWYWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBEYXRlLnBhcnNlKGhlYWRlclZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IGRpZmYgPSBkYXRlIC0gbm93O1xuICAgICAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihkaWZmKSA/IHVuZGVmaW5lZCA6IGRpZmY7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGhyb3R0bGluZ1JldHJ5UG9saWN5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSBcIi4vdXRpbC91dGlsc1wiO1xuaW1wb3J0IHsgTWFwcGVyVHlwZSB9IGZyb20gXCIuL3NlcmlhbGl6ZXJcIjtcbmltcG9ydCB7IERlZmF1bHREZXNlcmlhbGl6YXRpb25PcHRpb25zLCBkZXNlcmlhbGl6YXRpb25Qb2xpY3ksIH0gZnJvbSBcIi4vcG9saWNpZXMvZGVzZXJpYWxpemF0aW9uUG9saWN5XCI7XG5pbXBvcnQgeyBEZWZhdWx0S2VlcEFsaXZlT3B0aW9ucywga2VlcEFsaXZlUG9saWN5IH0gZnJvbSBcIi4vcG9saWNpZXMva2VlcEFsaXZlUG9saWN5XCI7XG5pbXBvcnQgeyBEZWZhdWx0UmVkaXJlY3RPcHRpb25zLCByZWRpcmVjdFBvbGljeSB9IGZyb20gXCIuL3BvbGljaWVzL3JlZGlyZWN0UG9saWN5XCI7XG5pbXBvcnQgeyBEZWZhdWx0UmV0cnlPcHRpb25zLCBleHBvbmVudGlhbFJldHJ5UG9saWN5IH0gZnJvbSBcIi4vcG9saWNpZXMvZXhwb25lbnRpYWxSZXRyeVBvbGljeVwiO1xuaW1wb3J0IHsgbG9nUG9saWN5IH0gZnJvbSBcIi4vcG9saWNpZXMvbG9nUG9saWN5XCI7XG5pbXBvcnQgeyBnZXRQYXRoU3RyaW5nRnJvbVBhcmFtZXRlciwgZ2V0UGF0aFN0cmluZ0Zyb21QYXJhbWV0ZXJQYXRoLCB9IGZyb20gXCIuL29wZXJhdGlvblBhcmFtZXRlclwiO1xuaW1wb3J0IHsgZ2V0U3RyZWFtUmVzcG9uc2VTdGF0dXNDb2RlcyB9IGZyb20gXCIuL29wZXJhdGlvblNwZWNcIjtcbmltcG9ydCB7IFdlYlJlc291cmNlLCBpc1dlYlJlc291cmNlTGlrZSwgfSBmcm9tIFwiLi93ZWJSZXNvdXJjZVwiO1xuaW1wb3J0IHsgUmVxdWVzdFBvbGljeU9wdGlvbnMsIH0gZnJvbSBcIi4vcG9saWNpZXMvcmVxdWVzdFBvbGljeVwiO1xuaW1wb3J0IHsgWE1MX0FUVFJLRVksIFhNTF9DSEFSS0VZIH0gZnJvbSBcIi4vdXRpbC9zZXJpYWxpemVyLmNvbW1vblwiO1xuaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSBcIkBhenVyZS9jb3JlLXV0aWxcIjtcbmltcG9ydCB7IGlzVG9rZW5DcmVkZW50aWFsIH0gZnJvbSBcIkBhenVyZS9jb3JlLWF1dGhcIjtcbmltcG9ydCB7IGdldERlZmF1bHRVc2VyQWdlbnRIZWFkZXJOYW1lLCBnZXREZWZhdWx0VXNlckFnZW50VmFsdWUsIHVzZXJBZ2VudFBvbGljeSwgfSBmcm9tIFwiLi9wb2xpY2llcy91c2VyQWdlbnRQb2xpY3lcIjtcbmltcG9ydCB7IFF1ZXJ5Q29sbGVjdGlvbkZvcm1hdCB9IGZyb20gXCIuL3F1ZXJ5Q29sbGVjdGlvbkZvcm1hdFwiO1xuaW1wb3J0IHsgVVJMQnVpbGRlciB9IGZyb20gXCIuL3VybFwiO1xuaW1wb3J0IHsgYmVhcmVyVG9rZW5BdXRoZW50aWNhdGlvblBvbGljeSB9IGZyb20gXCIuL3BvbGljaWVzL2JlYXJlclRva2VuQXV0aGVudGljYXRpb25Qb2xpY3lcIjtcbmltcG9ydCB7IGRpc2FibGVSZXNwb25zZURlY29tcHJlc3Npb25Qb2xpY3kgfSBmcm9tIFwiLi9wb2xpY2llcy9kaXNhYmxlUmVzcG9uc2VEZWNvbXByZXNzaW9uUG9saWN5XCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUNsaWVudFJlcXVlc3RJZFBvbGljeSB9IGZyb20gXCIuL3BvbGljaWVzL2dlbmVyYXRlQ2xpZW50UmVxdWVzdElkUG9saWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZWREZWZhdWx0SHR0cENsaWVudCB9IGZyb20gXCIuL2h0dHBDbGllbnRDYWNoZVwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4vbG9nXCI7XG5pbXBvcnQgeyBuZEpzb25Qb2xpY3kgfSBmcm9tIFwiLi9wb2xpY2llcy9uZEpzb25Qb2xpY3lcIjtcbmltcG9ydCB7IHByb3h5UG9saWN5IH0gZnJvbSBcIi4vcG9saWNpZXMvcHJveHlQb2xpY3lcIjtcbmltcG9ydCB7IHJwUmVnaXN0cmF0aW9uUG9saWN5IH0gZnJvbSBcIi4vcG9saWNpZXMvcnBSZWdpc3RyYXRpb25Qb2xpY3lcIjtcbmltcG9ydCB7IHNpZ25pbmdQb2xpY3kgfSBmcm9tIFwiLi9wb2xpY2llcy9zaWduaW5nUG9saWN5XCI7XG5pbXBvcnQgeyBzdHJpbmdpZnlYTUwgfSBmcm9tIFwiLi91dGlsL3htbFwiO1xuaW1wb3J0IHsgc3lzdGVtRXJyb3JSZXRyeVBvbGljeSB9IGZyb20gXCIuL3BvbGljaWVzL3N5c3RlbUVycm9yUmV0cnlQb2xpY3lcIjtcbmltcG9ydCB7IHRocm90dGxpbmdSZXRyeVBvbGljeSB9IGZyb20gXCIuL3BvbGljaWVzL3Rocm90dGxpbmdSZXRyeVBvbGljeVwiO1xuaW1wb3J0IHsgdHJhY2luZ1BvbGljeSB9IGZyb20gXCIuL3BvbGljaWVzL3RyYWNpbmdQb2xpY3lcIjtcbi8qKlxuICogU2VydmljZUNsaWVudCBzZW5kcyBzZXJ2aWNlIHJlcXVlc3RzIGFuZCByZWNlaXZlcyByZXNwb25zZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgU2VydmljZUNsaWVudCBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSBjcmVkZW50aWFscyAtIFRoZSBjcmVkZW50aWFscyB1c2VkIGZvciBhdXRoZW50aWNhdGlvbiB3aXRoIHRoZSBzZXJ2aWNlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHNlcnZpY2UgY2xpZW50IG9wdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIGJlaGF2aW9yIG9mIHRoZSBjbGllbnQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY3JlZGVudGlhbHMsIFxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYXp1cmUvYXp1cmUtc2RrL3RzLW5hbWluZy1vcHRpb25zICovXG4gICAgb3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93aXRoQ3JlZGVudGlhbHMgPSBvcHRpb25zLndpdGhDcmVkZW50aWFscyB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5faHR0cENsaWVudCA9IG9wdGlvbnMuaHR0cENsaWVudCB8fCBnZXRDYWNoZWREZWZhdWx0SHR0cENsaWVudCgpO1xuICAgICAgICB0aGlzLl9yZXF1ZXN0UG9saWN5T3B0aW9ucyA9IG5ldyBSZXF1ZXN0UG9saWN5T3B0aW9ucyhvcHRpb25zLmh0dHBQaXBlbGluZUxvZ2dlcik7XG4gICAgICAgIGxldCByZXF1ZXN0UG9saWN5RmFjdG9yaWVzO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLnJlcXVlc3RQb2xpY3lGYWN0b3JpZXMpKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhcIlNlcnZpY2VDbGllbnQ6IHVzaW5nIGN1c3RvbSByZXF1ZXN0IHBvbGljaWVzXCIpO1xuICAgICAgICAgICAgcmVxdWVzdFBvbGljeUZhY3RvcmllcyA9IG9wdGlvbnMucmVxdWVzdFBvbGljeUZhY3RvcmllcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhdXRoUG9saWN5RmFjdG9yeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChpc1Rva2VuQ3JlZGVudGlhbChjcmVkZW50aWFscykpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcIlNlcnZpY2VDbGllbnQ6IGNyZWF0aW5nIGJlYXJlciB0b2tlbiBhdXRoZW50aWNhdGlvbiBwb2xpY3kgZnJvbSBwcm92aWRlZCBjcmVkZW50aWFsc1wiKTtcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSB3cmFwcGVkIFJlcXVlc3RQb2xpY3lGYWN0b3J5IGhlcmUgc28gdGhhdCB3ZSBjYW4gcHJvdmlkZSB0aGVcbiAgICAgICAgICAgICAgICAvLyBjb3JyZWN0IHNjb3BlIHRvIHRoZSBCZWFyZXJUb2tlbkF1dGhlbnRpY2F0aW9uUG9saWN5IGF0IHRoZSBmaXJzdCB0aW1lXG4gICAgICAgICAgICAgICAgLy8gb25lIGlzIHJlcXVlc3RlZC4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgZ2VuZXJhdGVkIFNlcnZpY2VDbGllbnRcbiAgICAgICAgICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbnMgZG8gbm90IHNldCBiYXNlVXJpIHVudGlsIGFmdGVyIFNlcnZpY2VDbGllbnQncyBjb25zdHJ1Y3RvclxuICAgICAgICAgICAgICAgIC8vIGlzIGZpbmlzaGVkLCBsZWF2aW5nIGJhc2VVcmkgZW1wdHkgYXQgdGhlIHRpbWUgd2hlbiBpdCBpcyBuZWVkZWQgdG9cbiAgICAgICAgICAgICAgICAvLyBidWlsZCB0aGUgY29ycmVjdCBzY29wZSBuYW1lLlxuICAgICAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRQb2xpY3lGYWN0b3J5ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYmVhcmVyVG9rZW5Qb2xpY3lGYWN0b3J5ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmljZUNsaWVudCA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VDbGllbnRPcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZShuZXh0UG9saWN5LCBjcmVhdGVPcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3JlZGVudGlhbFNjb3BlcyA9IGdldENyZWRlbnRpYWxTY29wZXMoc2VydmljZUNsaWVudE9wdGlvbnMsIHNlcnZpY2VDbGllbnQuYmFzZVVyaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjcmVkZW50aWFsU2NvcGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV2hlbiB1c2luZyBjcmVkZW50aWFsLCB0aGUgU2VydmljZUNsaWVudCBtdXN0IGNvbnRhaW4gYSBiYXNlVXJpIG9yIGEgY3JlZGVudGlhbFNjb3BlcyBpbiBTZXJ2aWNlQ2xpZW50T3B0aW9ucy4gVW5hYmxlIHRvIGNyZWF0ZSBhIGJlYXJlclRva2VuQXV0aGVudGljYXRpb25Qb2xpY3lgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJlYXJlclRva2VuUG9saWN5RmFjdG9yeSA9PT0gdW5kZWZpbmVkIHx8IGJlYXJlclRva2VuUG9saWN5RmFjdG9yeSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFyZXJUb2tlblBvbGljeUZhY3RvcnkgPSBiZWFyZXJUb2tlbkF1dGhlbnRpY2F0aW9uUG9saWN5KGNyZWRlbnRpYWxzLCBjcmVkZW50aWFsU2NvcGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJlYXJlclRva2VuUG9saWN5RmFjdG9yeS5jcmVhdGUobmV4dFBvbGljeSwgY3JlYXRlT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYXV0aFBvbGljeUZhY3RvcnkgPSB3cmFwcGVkUG9saWN5RmFjdG9yeSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY3JlZGVudGlhbHMgJiYgdHlwZW9mIGNyZWRlbnRpYWxzLnNpZ25SZXF1ZXN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcIlNlcnZpY2VDbGllbnQ6IGNyZWF0aW5nIHNpZ25pbmcgcG9saWN5IGZyb20gcHJvdmlkZWQgY3JlZGVudGlhbHNcIik7XG4gICAgICAgICAgICAgICAgYXV0aFBvbGljeUZhY3RvcnkgPSBzaWduaW5nUG9saWN5KGNyZWRlbnRpYWxzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQgJiYgY3JlZGVudGlhbHMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgY3JlZGVudGlhbHMgYXJndW1lbnQgbXVzdCBpbXBsZW1lbnQgdGhlIFRva2VuQ3JlZGVudGlhbCBpbnRlcmZhY2VcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhcIlNlcnZpY2VDbGllbnQ6IHVzaW5nIGRlZmF1bHQgcmVxdWVzdCBwb2xpY2llc1wiKTtcbiAgICAgICAgICAgIHJlcXVlc3RQb2xpY3lGYWN0b3JpZXMgPSBjcmVhdGVEZWZhdWx0UmVxdWVzdFBvbGljeUZhY3RvcmllcyhhdXRoUG9saWN5RmFjdG9yeSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZXF1ZXN0UG9saWN5RmFjdG9yaWVzKSB7XG4gICAgICAgICAgICAgICAgLy8gb3B0aW9ucy5yZXF1ZXN0UG9saWN5RmFjdG9yaWVzIGNhbiBhbHNvIGJlIGEgZnVuY3Rpb24gdGhhdCBtYW5pcHVsYXRlc1xuICAgICAgICAgICAgICAgIC8vIHRoZSBkZWZhdWx0IHJlcXVlc3RQb2xpY3lGYWN0b3JpZXMgYXJyYXlcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdSZXF1ZXN0UG9saWN5RmFjdG9yaWVzID0gb3B0aW9ucy5yZXF1ZXN0UG9saWN5RmFjdG9yaWVzKHJlcXVlc3RQb2xpY3lGYWN0b3JpZXMpO1xuICAgICAgICAgICAgICAgIGlmIChuZXdSZXF1ZXN0UG9saWN5RmFjdG9yaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQb2xpY3lGYWN0b3JpZXMgPSBuZXdSZXF1ZXN0UG9saWN5RmFjdG9yaWVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZXF1ZXN0UG9saWN5RmFjdG9yaWVzID0gcmVxdWVzdFBvbGljeUZhY3RvcmllcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCB0aGUgcHJvdmlkZWQgaHR0cFJlcXVlc3QuXG4gICAgICovXG4gICAgc2VuZFJlcXVlc3Qob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG9wdGlvbnMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm9wdGlvbnMgY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkIGFuZCBpdCBtdXN0IGJlIG9mIHR5cGUgb2JqZWN0LlwiKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaHR0cFJlcXVlc3Q7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoaXNXZWJSZXNvdXJjZUxpa2Uob3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnZhbGlkYXRlUmVxdWVzdFByb3BlcnRpZXMoKTtcbiAgICAgICAgICAgICAgICBodHRwUmVxdWVzdCA9IG9wdGlvbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBodHRwUmVxdWVzdCA9IG5ldyBXZWJSZXNvdXJjZSgpO1xuICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0ID0gaHR0cFJlcXVlc3QucHJlcGFyZShvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGh0dHBQaXBlbGluZSA9IHRoaXMuX2h0dHBDbGllbnQ7XG4gICAgICAgIGlmICh0aGlzLl9yZXF1ZXN0UG9saWN5RmFjdG9yaWVzICYmIHRoaXMuX3JlcXVlc3RQb2xpY3lGYWN0b3JpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX3JlcXVlc3RQb2xpY3lGYWN0b3JpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgICBodHRwUGlwZWxpbmUgPSB0aGlzLl9yZXF1ZXN0UG9saWN5RmFjdG9yaWVzW2ldLmNyZWF0ZShodHRwUGlwZWxpbmUsIHRoaXMuX3JlcXVlc3RQb2xpY3lPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHR0cFBpcGVsaW5lLnNlbmRSZXF1ZXN0KGh0dHBSZXF1ZXN0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhbiBIVFRQIHJlcXVlc3QgdGhhdCBpcyBwb3B1bGF0ZWQgdXNpbmcgdGhlIHByb3ZpZGVkIE9wZXJhdGlvblNwZWMuXG4gICAgICogQHBhcmFtIG9wZXJhdGlvbkFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudHMgdGhhdCB0aGUgSFRUUCByZXF1ZXN0J3MgdGVtcGxhdGVkIHZhbHVlcyB3aWxsIGJlIHBvcHVsYXRlZCBmcm9tLlxuICAgICAqIEBwYXJhbSBvcGVyYXRpb25TcGVjIC0gVGhlIE9wZXJhdGlvblNwZWMgdG8gdXNlIHRvIHBvcHVsYXRlIHRoZSBodHRwUmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSByZXNwb25zZSBpcyByZWNlaXZlZC5cbiAgICAgKi9cbiAgICBhc3luYyBzZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIG9wZXJhdGlvblNwZWMsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcGVyYXRpb25Bcmd1bWVudHMub3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IG9wZXJhdGlvbkFyZ3VtZW50cy5vcHRpb25zO1xuICAgICAgICAgICAgb3BlcmF0aW9uQXJndW1lbnRzLm9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VyaWFsaXplck9wdGlvbnMgPSAoX2EgPSBvcGVyYXRpb25Bcmd1bWVudHMub3B0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNlcmlhbGl6ZXJPcHRpb25zO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdCA9IG5ldyBXZWJSZXNvdXJjZSgpO1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYmFzZVVyaSA9IG9wZXJhdGlvblNwZWMuYmFzZVVybCB8fCB0aGlzLmJhc2VVcmk7XG4gICAgICAgICAgICBpZiAoIWJhc2VVcmkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJZiBvcGVyYXRpb25TcGVjLmJhc2VVcmwgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgU2VydmljZUNsaWVudCBtdXN0IGhhdmUgYSBiYXNlVXJpIHN0cmluZyBwcm9wZXJ0eSB0aGF0IGNvbnRhaW5zIHRoZSBiYXNlIFVSTCB0byB1c2UuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaHR0cFJlcXVlc3QubWV0aG9kID0gb3BlcmF0aW9uU3BlYy5odHRwTWV0aG9kO1xuICAgICAgICAgICAgaHR0cFJlcXVlc3Qub3BlcmF0aW9uU3BlYyA9IG9wZXJhdGlvblNwZWM7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0VXJsID0gVVJMQnVpbGRlci5wYXJzZShiYXNlVXJpKTtcbiAgICAgICAgICAgIGlmIChvcGVyYXRpb25TcGVjLnBhdGgpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VXJsLmFwcGVuZFBhdGgob3BlcmF0aW9uU3BlYy5wYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcGVyYXRpb25TcGVjLnVybFBhcmFtZXRlcnMgJiYgb3BlcmF0aW9uU3BlYy51cmxQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHVybFBhcmFtZXRlciBvZiBvcGVyYXRpb25TcGVjLnVybFBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybFBhcmFtZXRlclZhbHVlID0gZ2V0T3BlcmF0aW9uQXJndW1lbnRWYWx1ZUZyb21QYXJhbWV0ZXIodGhpcywgb3BlcmF0aW9uQXJndW1lbnRzLCB1cmxQYXJhbWV0ZXIsIG9wZXJhdGlvblNwZWMuc2VyaWFsaXplcik7XG4gICAgICAgICAgICAgICAgICAgIHVybFBhcmFtZXRlclZhbHVlID0gb3BlcmF0aW9uU3BlYy5zZXJpYWxpemVyLnNlcmlhbGl6ZSh1cmxQYXJhbWV0ZXIubWFwcGVyLCB1cmxQYXJhbWV0ZXJWYWx1ZSwgZ2V0UGF0aFN0cmluZ0Zyb21QYXJhbWV0ZXIodXJsUGFyYW1ldGVyKSwgc2VyaWFsaXplck9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXVybFBhcmFtZXRlci5za2lwRW5jb2RpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybFBhcmFtZXRlclZhbHVlID0gZW5jb2RlVVJJQ29tcG9uZW50KHVybFBhcmFtZXRlclZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VXJsLnJlcGxhY2VBbGwoYHske3VybFBhcmFtZXRlci5tYXBwZXIuc2VyaWFsaXplZE5hbWUgfHwgZ2V0UGF0aFN0cmluZ0Zyb21QYXJhbWV0ZXIodXJsUGFyYW1ldGVyKX19YCwgdXJsUGFyYW1ldGVyVmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcGVyYXRpb25TcGVjLnF1ZXJ5UGFyYW1ldGVycyAmJiBvcGVyYXRpb25TcGVjLnF1ZXJ5UGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBxdWVyeVBhcmFtZXRlciBvZiBvcGVyYXRpb25TcGVjLnF1ZXJ5UGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcXVlcnlQYXJhbWV0ZXJWYWx1ZSA9IGdldE9wZXJhdGlvbkFyZ3VtZW50VmFsdWVGcm9tUGFyYW1ldGVyKHRoaXMsIG9wZXJhdGlvbkFyZ3VtZW50cywgcXVlcnlQYXJhbWV0ZXIsIG9wZXJhdGlvblNwZWMuc2VyaWFsaXplcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeVBhcmFtZXRlclZhbHVlICE9PSB1bmRlZmluZWQgJiYgcXVlcnlQYXJhbWV0ZXJWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJWYWx1ZSA9IG9wZXJhdGlvblNwZWMuc2VyaWFsaXplci5zZXJpYWxpemUocXVlcnlQYXJhbWV0ZXIubWFwcGVyLCBxdWVyeVBhcmFtZXRlclZhbHVlLCBnZXRQYXRoU3RyaW5nRnJvbVBhcmFtZXRlcihxdWVyeVBhcmFtZXRlciksIHNlcmlhbGl6ZXJPcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeVBhcmFtZXRlci5jb2xsZWN0aW9uRm9ybWF0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtZXRlci5jb2xsZWN0aW9uRm9ybWF0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5UGFyYW1ldGVyLmNvbGxlY3Rpb25Gb3JtYXQgPT09IFF1ZXJ5Q29sbGVjdGlvbkZvcm1hdC5NdWx0aSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnlQYXJhbWV0ZXJWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb2xsZWN0aW9uIGlzIGVtcHR5LCBubyBuZWVkIHRvIHRyeSBzZXJpYWxpemluZyB0aGUgY3VycmVudCBxdWVyeVBhcmFtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaW5kZXggaW4gcXVlcnlQYXJhbWV0ZXJWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBxdWVyeVBhcmFtZXRlclZhbHVlW2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtZXRlclZhbHVlW2luZGV4XSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPT09IHVuZGVmaW5lZCB8fCBpdGVtID09PSBudWxsID8gXCJcIiA6IGl0ZW0udG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChxdWVyeVBhcmFtZXRlci5jb2xsZWN0aW9uRm9ybWF0ID09PSBRdWVyeUNvbGxlY3Rpb25Gb3JtYXQuU3N2IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVyLmNvbGxlY3Rpb25Gb3JtYXQgPT09IFF1ZXJ5Q29sbGVjdGlvbkZvcm1hdC5Uc3YpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJWYWx1ZSA9IHF1ZXJ5UGFyYW1ldGVyVmFsdWUuam9pbihxdWVyeVBhcmFtZXRlci5jb2xsZWN0aW9uRm9ybWF0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXF1ZXJ5UGFyYW1ldGVyLnNraXBFbmNvZGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHF1ZXJ5UGFyYW1ldGVyVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaW5kZXggaW4gcXVlcnlQYXJhbWV0ZXJWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5UGFyYW1ldGVyVmFsdWVbaW5kZXhdICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtZXRlclZhbHVlW2luZGV4XSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVyVmFsdWVbaW5kZXhdID0gZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5UGFyYW1ldGVyVmFsdWVbaW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJWYWx1ZSA9IGVuY29kZVVSSUNvbXBvbmVudChxdWVyeVBhcmFtZXRlclZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnlQYXJhbWV0ZXIuY29sbGVjdGlvbkZvcm1hdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXIuY29sbGVjdGlvbkZvcm1hdCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVyLmNvbGxlY3Rpb25Gb3JtYXQgIT09IFF1ZXJ5Q29sbGVjdGlvbkZvcm1hdC5NdWx0aSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVyLmNvbGxlY3Rpb25Gb3JtYXQgIT09IFF1ZXJ5Q29sbGVjdGlvbkZvcm1hdC5Tc3YgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtZXRlci5jb2xsZWN0aW9uRm9ybWF0ICE9PSBRdWVyeUNvbGxlY3Rpb25Gb3JtYXQuVHN2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJWYWx1ZSA9IHF1ZXJ5UGFyYW1ldGVyVmFsdWUuam9pbihxdWVyeVBhcmFtZXRlci5jb2xsZWN0aW9uRm9ybWF0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RVcmwuc2V0UXVlcnlQYXJhbWV0ZXIocXVlcnlQYXJhbWV0ZXIubWFwcGVyLnNlcmlhbGl6ZWROYW1lIHx8IGdldFBhdGhTdHJpbmdGcm9tUGFyYW1ldGVyKHF1ZXJ5UGFyYW1ldGVyKSwgcXVlcnlQYXJhbWV0ZXJWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBodHRwUmVxdWVzdC51cmwgPSByZXF1ZXN0VXJsLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IG9wZXJhdGlvblNwZWMuY29udGVudFR5cGUgfHwgdGhpcy5yZXF1ZXN0Q29udGVudFR5cGU7XG4gICAgICAgICAgICBpZiAoY29udGVudFR5cGUgJiYgb3BlcmF0aW9uU3BlYy5yZXF1ZXN0Qm9keSkge1xuICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnMuc2V0KFwiQ29udGVudC1UeXBlXCIsIGNvbnRlbnRUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcGVyYXRpb25TcGVjLmhlYWRlclBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhlYWRlclBhcmFtZXRlciBvZiBvcGVyYXRpb25TcGVjLmhlYWRlclBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhlYWRlclZhbHVlID0gZ2V0T3BlcmF0aW9uQXJndW1lbnRWYWx1ZUZyb21QYXJhbWV0ZXIodGhpcywgb3BlcmF0aW9uQXJndW1lbnRzLCBoZWFkZXJQYXJhbWV0ZXIsIG9wZXJhdGlvblNwZWMuc2VyaWFsaXplcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXJWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGhlYWRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJWYWx1ZSA9IG9wZXJhdGlvblNwZWMuc2VyaWFsaXplci5zZXJpYWxpemUoaGVhZGVyUGFyYW1ldGVyLm1hcHBlciwgaGVhZGVyVmFsdWUsIGdldFBhdGhTdHJpbmdGcm9tUGFyYW1ldGVyKGhlYWRlclBhcmFtZXRlciksIHNlcmlhbGl6ZXJPcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlckNvbGxlY3Rpb25QcmVmaXggPSBoZWFkZXJQYXJhbWV0ZXIubWFwcGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhlYWRlckNvbGxlY3Rpb25QcmVmaXg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVyQ29sbGVjdGlvblByZWZpeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGhlYWRlclZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdC5oZWFkZXJzLnNldChoZWFkZXJDb2xsZWN0aW9uUHJlZml4ICsga2V5LCBoZWFkZXJWYWx1ZVtrZXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdC5oZWFkZXJzLnNldChoZWFkZXJQYXJhbWV0ZXIubWFwcGVyLnNlcmlhbGl6ZWROYW1lIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhdGhTdHJpbmdGcm9tUGFyYW1ldGVyKGhlYWRlclBhcmFtZXRlciksIGhlYWRlclZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBvcGVyYXRpb25Bcmd1bWVudHMub3B0aW9ucztcbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY3VzdG9tSGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGN1c3RvbUhlYWRlck5hbWUgaW4gb3B0aW9ucy5jdXN0b21IZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdC5oZWFkZXJzLnNldChjdXN0b21IZWFkZXJOYW1lLCBvcHRpb25zLmN1c3RvbUhlYWRlcnNbY3VzdG9tSGVhZGVyTmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmFib3J0U2lnbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0LmFib3J0U2lnbmFsID0gb3B0aW9ucy5hYm9ydFNpZ25hbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdC50aW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5vblVwbG9hZFByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0Lm9uVXBsb2FkUHJvZ3Jlc3MgPSBvcHRpb25zLm9uVXBsb2FkUHJvZ3Jlc3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm9uRG93bmxvYWRQcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdC5vbkRvd25sb2FkUHJvZ3Jlc3MgPSBvcHRpb25zLm9uRG93bmxvYWRQcm9ncmVzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3Bhbk9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQnkgcGFzc2luZyBzcGFuT3B0aW9ucyBpZiB0aGV5IGV4aXN0IGF0IHJ1bnRpbWUsIHdlJ3JlIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggQGF6dXJlL2NvcmUtdHJhY2luZ0BwcmV2aWV3LjEzIGFuZCBlYXJsaWVyLlxuICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdC5zcGFuT3B0aW9ucyA9IG9wdGlvbnMuc3Bhbk9wdGlvbnM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnRyYWNpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0LnRyYWNpbmdDb250ZXh0ID0gb3B0aW9ucy50cmFjaW5nQ29udGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2hvdWxkRGVzZXJpYWxpemUgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnNob3VsZERlc2VyaWFsaXplICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0LnNob3VsZERlc2VyaWFsaXplID0gb3B0aW9ucy5zaG91bGREZXNlcmlhbGl6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBodHRwUmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSB0aGlzLl93aXRoQ3JlZGVudGlhbHM7XG4gICAgICAgICAgICBzZXJpYWxpemVSZXF1ZXN0Qm9keSh0aGlzLCBodHRwUmVxdWVzdCwgb3BlcmF0aW9uQXJndW1lbnRzLCBvcGVyYXRpb25TcGVjKTtcbiAgICAgICAgICAgIGlmIChodHRwUmVxdWVzdC5zdHJlYW1SZXNwb25zZVN0YXR1c0NvZGVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBodHRwUmVxdWVzdC5zdHJlYW1SZXNwb25zZVN0YXR1c0NvZGVzID0gZ2V0U3RyZWFtUmVzcG9uc2VTdGF0dXNDb2RlcyhvcGVyYXRpb25TcGVjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByYXdSZXNwb25zZTtcbiAgICAgICAgICAgIGxldCBzZW5kUmVxdWVzdEVycm9yO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByYXdSZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZFJlcXVlc3QoaHR0cFJlcXVlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgc2VuZFJlcXVlc3RFcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlbmRSZXF1ZXN0RXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VuZFJlcXVlc3RFcnJvci5yZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBzZW5kUmVxdWVzdEVycm9yLmRldGFpbHMgPSBmbGF0dGVuUmVzcG9uc2Uoc2VuZFJlcXVlc3RFcnJvci5yZXNwb25zZSwgb3BlcmF0aW9uU3BlYy5yZXNwb25zZXNbc2VuZFJlcXVlc3RFcnJvci5zdGF0dXNDb2RlXSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uU3BlYy5yZXNwb25zZXNbXCJkZWZhdWx0XCJdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gUHJvbWlzZS5yZWplY3Qoc2VuZFJlcXVlc3RFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBQcm9taXNlLnJlc29sdmUoZmxhdHRlblJlc3BvbnNlKHJhd1Jlc3BvbnNlLCBvcGVyYXRpb25TcGVjLnJlc3BvbnNlc1tyYXdSZXNwb25zZS5zdGF0dXNdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2IgPSBjYWxsYmFjaztcbiAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgICByZXN1bHRcbiAgICAgICAgICAgICAgICAudGhlbigocmVzKSA9PiBjYihudWxsLCByZXMuX3Jlc3BvbnNlLnBhcnNlZEJvZHksIHJlcy5fcmVzcG9uc2UucmVxdWVzdCwgcmVzLl9yZXNwb25zZSkpXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IGNiKGVycikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVJlcXVlc3RCb2R5KHNlcnZpY2VDbGllbnQsIGh0dHBSZXF1ZXN0LCBvcGVyYXRpb25Bcmd1bWVudHMsIG9wZXJhdGlvblNwZWMpIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZjtcbiAgICBjb25zdCBzZXJpYWxpemVyT3B0aW9ucyA9IChfYiA9IChfYSA9IG9wZXJhdGlvbkFyZ3VtZW50cy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc2VyaWFsaXplck9wdGlvbnMpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHt9O1xuICAgIGNvbnN0IHVwZGF0ZWRPcHRpb25zID0ge1xuICAgICAgICByb290TmFtZTogKF9jID0gc2VyaWFsaXplck9wdGlvbnMucm9vdE5hbWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IFwiXCIsXG4gICAgICAgIGluY2x1ZGVSb290OiAoX2QgPSBzZXJpYWxpemVyT3B0aW9ucy5pbmNsdWRlUm9vdCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogZmFsc2UsXG4gICAgICAgIHhtbENoYXJLZXk6IChfZSA9IHNlcmlhbGl6ZXJPcHRpb25zLnhtbENoYXJLZXkpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IFhNTF9DSEFSS0VZLFxuICAgIH07XG4gICAgY29uc3QgeG1sQ2hhcktleSA9IHNlcmlhbGl6ZXJPcHRpb25zLnhtbENoYXJLZXk7XG4gICAgaWYgKG9wZXJhdGlvblNwZWMucmVxdWVzdEJvZHkgJiYgb3BlcmF0aW9uU3BlYy5yZXF1ZXN0Qm9keS5tYXBwZXIpIHtcbiAgICAgICAgaHR0cFJlcXVlc3QuYm9keSA9IGdldE9wZXJhdGlvbkFyZ3VtZW50VmFsdWVGcm9tUGFyYW1ldGVyKHNlcnZpY2VDbGllbnQsIG9wZXJhdGlvbkFyZ3VtZW50cywgb3BlcmF0aW9uU3BlYy5yZXF1ZXN0Qm9keSwgb3BlcmF0aW9uU3BlYy5zZXJpYWxpemVyKTtcbiAgICAgICAgY29uc3QgYm9keU1hcHBlciA9IG9wZXJhdGlvblNwZWMucmVxdWVzdEJvZHkubWFwcGVyO1xuICAgICAgICBjb25zdCB7IHJlcXVpcmVkLCB4bWxOYW1lLCB4bWxFbGVtZW50TmFtZSwgc2VyaWFsaXplZE5hbWUsIHhtbE5hbWVzcGFjZSwgeG1sTmFtZXNwYWNlUHJlZml4IH0gPSBib2R5TWFwcGVyO1xuICAgICAgICBjb25zdCB0eXBlTmFtZSA9IGJvZHlNYXBwZXIudHlwZS5uYW1lO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKChodHRwUmVxdWVzdC5ib2R5ICE9PSB1bmRlZmluZWQgJiYgaHR0cFJlcXVlc3QuYm9keSAhPT0gbnVsbCkgfHwgcmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0Qm9keVBhcmFtZXRlclBhdGhTdHJpbmcgPSBnZXRQYXRoU3RyaW5nRnJvbVBhcmFtZXRlcihvcGVyYXRpb25TcGVjLnJlcXVlc3RCb2R5KTtcbiAgICAgICAgICAgICAgICBodHRwUmVxdWVzdC5ib2R5ID0gb3BlcmF0aW9uU3BlYy5zZXJpYWxpemVyLnNlcmlhbGl6ZShib2R5TWFwcGVyLCBodHRwUmVxdWVzdC5ib2R5LCByZXF1ZXN0Qm9keVBhcmFtZXRlclBhdGhTdHJpbmcsIHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1N0cmVhbSA9IHR5cGVOYW1lID09PSBNYXBwZXJUeXBlLlN0cmVhbTtcbiAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uU3BlYy5pc1hNTCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxuc0tleSA9IHhtbE5hbWVzcGFjZVByZWZpeCA/IGB4bWxuczoke3htbE5hbWVzcGFjZVByZWZpeH1gIDogXCJ4bWxuc1wiO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldFhtbFZhbHVlV2l0aE5hbWVzcGFjZSh4bWxOYW1lc3BhY2UsIHhtbG5zS2V5LCB0eXBlTmFtZSwgaHR0cFJlcXVlc3QuYm9keSwgdXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZU5hbWUgPT09IE1hcHBlclR5cGUuU2VxdWVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0LmJvZHkgPSBzdHJpbmdpZnlYTUwodXRpbHMucHJlcGFyZVhNTFJvb3RMaXN0KHZhbHVlLCB4bWxFbGVtZW50TmFtZSB8fCB4bWxOYW1lIHx8IHNlcmlhbGl6ZWROYW1lLCB4bWxuc0tleSwgeG1sTmFtZXNwYWNlKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3ROYW1lOiB4bWxOYW1lIHx8IHNlcmlhbGl6ZWROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbENoYXJLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghaXNTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0LmJvZHkgPSBzdHJpbmdpZnlYTUwodmFsdWUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290TmFtZTogeG1sTmFtZSB8fCBzZXJpYWxpemVkTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxDaGFyS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZU5hbWUgPT09IE1hcHBlclR5cGUuU3RyaW5nICYmXG4gICAgICAgICAgICAgICAgICAgICgoKF9mID0gb3BlcmF0aW9uU3BlYy5jb250ZW50VHlwZSkgPT09IG51bGwgfHwgX2YgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9mLm1hdGNoKFwidGV4dC9wbGFpblwiKSkgfHwgb3BlcmF0aW9uU3BlYy5tZWRpYVR5cGUgPT09IFwidGV4dFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgU3RyaW5nIHNlcmlhbGl6ZXIgaGFzIHZhbGlkYXRlZCB0aGF0IHJlcXVlc3QgYm9keSBpcyBhIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBzbyBqdXN0IHNlbmQgdGhlIHN0cmluZy5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghaXNTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3QuYm9keSA9IEpTT04uc3RyaW5naWZ5KGh0dHBSZXF1ZXN0LmJvZHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgXCIke2Vycm9yLm1lc3NhZ2V9XCIgb2NjdXJyZWQgaW4gc2VyaWFsaXppbmcgdGhlIHBheWxvYWQgLSAke0pTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWROYW1lLCB1bmRlZmluZWQsIFwiICBcIil9LmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wZXJhdGlvblNwZWMuZm9ybURhdGFQYXJhbWV0ZXJzICYmIG9wZXJhdGlvblNwZWMuZm9ybURhdGFQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaHR0cFJlcXVlc3QuZm9ybURhdGEgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBmb3JtRGF0YVBhcmFtZXRlciBvZiBvcGVyYXRpb25TcGVjLmZvcm1EYXRhUGFyYW1ldGVycykge1xuICAgICAgICAgICAgY29uc3QgZm9ybURhdGFQYXJhbWV0ZXJWYWx1ZSA9IGdldE9wZXJhdGlvbkFyZ3VtZW50VmFsdWVGcm9tUGFyYW1ldGVyKHNlcnZpY2VDbGllbnQsIG9wZXJhdGlvbkFyZ3VtZW50cywgZm9ybURhdGFQYXJhbWV0ZXIsIG9wZXJhdGlvblNwZWMuc2VyaWFsaXplcik7XG4gICAgICAgICAgICBpZiAoZm9ybURhdGFQYXJhbWV0ZXJWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGZvcm1EYXRhUGFyYW1ldGVyVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtRGF0YVBhcmFtZXRlclByb3BlcnR5TmFtZSA9IGZvcm1EYXRhUGFyYW1ldGVyLm1hcHBlci5zZXJpYWxpemVkTmFtZSB8fCBnZXRQYXRoU3RyaW5nRnJvbVBhcmFtZXRlcihmb3JtRGF0YVBhcmFtZXRlcik7XG4gICAgICAgICAgICAgICAgaHR0cFJlcXVlc3QuZm9ybURhdGFbZm9ybURhdGFQYXJhbWV0ZXJQcm9wZXJ0eU5hbWVdID0gb3BlcmF0aW9uU3BlYy5zZXJpYWxpemVyLnNlcmlhbGl6ZShmb3JtRGF0YVBhcmFtZXRlci5tYXBwZXIsIGZvcm1EYXRhUGFyYW1ldGVyVmFsdWUsIGdldFBhdGhTdHJpbmdGcm9tUGFyYW1ldGVyKGZvcm1EYXRhUGFyYW1ldGVyKSwgdXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBBZGRzIGFuIHhtbCBuYW1lc3BhY2UgdG8gdGhlIHhtbCBzZXJpYWxpemVkIG9iamVjdCBpZiBuZWVkZWQsIG90aGVyd2lzZSBpdCBqdXN0IHJldHVybnMgdGhlIHZhbHVlIGl0c2VsZlxuICovXG5mdW5jdGlvbiBnZXRYbWxWYWx1ZVdpdGhOYW1lc3BhY2UoeG1sTmFtZXNwYWNlLCB4bWxuc0tleSwgdHlwZU5hbWUsIHNlcmlhbGl6ZWRWYWx1ZSwgb3B0aW9ucykge1xuICAgIC8vIENvbXBvc2l0ZSBhbmQgU2VxdWVuY2Ugc2NoZW1hcyBhbHJlYWR5IGdvdCB0aGVpciByb290IG5hbWVzcGFjZSBzZXQgZHVyaW5nIHNlcmlhbGl6YXRpb25cbiAgICAvLyBXZSBqdXN0IG5lZWQgdG8gYWRkIHhtbG5zIHRvIHRoZSBvdGhlciBzY2hlbWEgdHlwZXNcbiAgICBpZiAoeG1sTmFtZXNwYWNlICYmICFbXCJDb21wb3NpdGVcIiwgXCJTZXF1ZW5jZVwiLCBcIkRpY3Rpb25hcnlcIl0uaW5jbHVkZXModHlwZU5hbWUpKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgICByZXN1bHRbb3B0aW9ucy54bWxDaGFyS2V5XSA9IHNlcmlhbGl6ZWRWYWx1ZTtcbiAgICAgICAgcmVzdWx0W1hNTF9BVFRSS0VZXSA9IHsgW3htbG5zS2V5XTogeG1sTmFtZXNwYWNlIH07XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBzZXJpYWxpemVkVmFsdWU7XG59XG5mdW5jdGlvbiBnZXRWYWx1ZU9yRnVuY3Rpb25SZXN1bHQodmFsdWUsIGRlZmF1bHRWYWx1ZUNyZWF0b3IpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBkZWZhdWx0VmFsdWVDcmVhdG9yKCk7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUocmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY3JlYXRlRGVmYXVsdFJlcXVlc3RQb2xpY3lGYWN0b3JpZXMoYXV0aFBvbGljeUZhY3RvcnksIG9wdGlvbnMpIHtcbiAgICBjb25zdCBmYWN0b3JpZXMgPSBbXTtcbiAgICBpZiAob3B0aW9ucy5nZW5lcmF0ZUNsaWVudFJlcXVlc3RJZEhlYWRlcikge1xuICAgICAgICBmYWN0b3JpZXMucHVzaChnZW5lcmF0ZUNsaWVudFJlcXVlc3RJZFBvbGljeShvcHRpb25zLmNsaWVudFJlcXVlc3RJZEhlYWRlck5hbWUpKTtcbiAgICB9XG4gICAgaWYgKGF1dGhQb2xpY3lGYWN0b3J5KSB7XG4gICAgICAgIGZhY3Rvcmllcy5wdXNoKGF1dGhQb2xpY3lGYWN0b3J5KTtcbiAgICB9XG4gICAgY29uc3QgdXNlckFnZW50SGVhZGVyTmFtZSA9IGdldFZhbHVlT3JGdW5jdGlvblJlc3VsdChvcHRpb25zLnVzZXJBZ2VudEhlYWRlck5hbWUsIGdldERlZmF1bHRVc2VyQWdlbnRIZWFkZXJOYW1lKTtcbiAgICBjb25zdCB1c2VyQWdlbnRIZWFkZXJWYWx1ZSA9IGdldFZhbHVlT3JGdW5jdGlvblJlc3VsdChvcHRpb25zLnVzZXJBZ2VudCwgZ2V0RGVmYXVsdFVzZXJBZ2VudFZhbHVlKTtcbiAgICBpZiAodXNlckFnZW50SGVhZGVyTmFtZSAmJiB1c2VyQWdlbnRIZWFkZXJWYWx1ZSkge1xuICAgICAgICBmYWN0b3JpZXMucHVzaCh1c2VyQWdlbnRQb2xpY3koeyBrZXk6IHVzZXJBZ2VudEhlYWRlck5hbWUsIHZhbHVlOiB1c2VyQWdlbnRIZWFkZXJWYWx1ZSB9KSk7XG4gICAgfVxuICAgIGZhY3Rvcmllcy5wdXNoKHJlZGlyZWN0UG9saWN5KCkpO1xuICAgIGZhY3Rvcmllcy5wdXNoKHJwUmVnaXN0cmF0aW9uUG9saWN5KG9wdGlvbnMucnBSZWdpc3RyYXRpb25SZXRyeVRpbWVvdXQpKTtcbiAgICBpZiAoIW9wdGlvbnMubm9SZXRyeVBvbGljeSkge1xuICAgICAgICBmYWN0b3JpZXMucHVzaChleHBvbmVudGlhbFJldHJ5UG9saWN5KCkpO1xuICAgICAgICBmYWN0b3JpZXMucHVzaChzeXN0ZW1FcnJvclJldHJ5UG9saWN5KCkpO1xuICAgICAgICBmYWN0b3JpZXMucHVzaCh0aHJvdHRsaW5nUmV0cnlQb2xpY3koKSk7XG4gICAgfVxuICAgIGZhY3Rvcmllcy5wdXNoKGRlc2VyaWFsaXphdGlvblBvbGljeShvcHRpb25zLmRlc2VyaWFsaXphdGlvbkNvbnRlbnRUeXBlcykpO1xuICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgZmFjdG9yaWVzLnB1c2gocHJveHlQb2xpY3kob3B0aW9ucy5wcm94eVNldHRpbmdzKSk7XG4gICAgfVxuICAgIGZhY3Rvcmllcy5wdXNoKGxvZ1BvbGljeSh7IGxvZ2dlcjogbG9nZ2VyLmluZm8gfSkpO1xuICAgIHJldHVybiBmYWN0b3JpZXM7XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gSFRUUCBwaXBlbGluZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gb3B0aW9ucy5cbiAqIEBwYXJhbSBwaXBlbGluZU9wdGlvbnMgLSBEZWZpbmVzIG9wdGlvbnMgdGhhdCBhcmUgdXNlZCB0byBjb25maWd1cmUgcG9saWNpZXMgaW4gdGhlIEhUVFAgcGlwZWxpbmUgZm9yIGFuIFNESyBjbGllbnQuXG4gKiBAcGFyYW0gYXV0aFBvbGljeUZhY3RvcnkgLSBBbiBvcHRpb25hbCBhdXRoZW50aWNhdGlvbiBwb2xpY3kgZmFjdG9yeSB0byB1c2UgZm9yIHNpZ25pbmcgcmVxdWVzdHMuXG4gKiBAcmV0dXJucyBBIHNldCBvZiBvcHRpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBjcmVhdGUgYSBuZXcge0BsaW5rIFNlcnZpY2VDbGllbnR9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGlwZWxpbmVGcm9tT3B0aW9ucyhwaXBlbGluZU9wdGlvbnMsIGF1dGhQb2xpY3lGYWN0b3J5KSB7XG4gICAgY29uc3QgcmVxdWVzdFBvbGljeUZhY3RvcmllcyA9IFtdO1xuICAgIGlmIChwaXBlbGluZU9wdGlvbnMuc2VuZFN0cmVhbWluZ0pzb24pIHtcbiAgICAgICAgcmVxdWVzdFBvbGljeUZhY3Rvcmllcy5wdXNoKG5kSnNvblBvbGljeSgpKTtcbiAgICB9XG4gICAgbGV0IHVzZXJBZ2VudFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIGlmIChwaXBlbGluZU9wdGlvbnMudXNlckFnZW50T3B0aW9ucyAmJiBwaXBlbGluZU9wdGlvbnMudXNlckFnZW50T3B0aW9ucy51c2VyQWdlbnRQcmVmaXgpIHtcbiAgICAgICAgY29uc3QgdXNlckFnZW50SW5mbyA9IFtdO1xuICAgICAgICB1c2VyQWdlbnRJbmZvLnB1c2gocGlwZWxpbmVPcHRpb25zLnVzZXJBZ2VudE9wdGlvbnMudXNlckFnZW50UHJlZml4KTtcbiAgICAgICAgLy8gQWRkIHRoZSBkZWZhdWx0IHVzZXIgYWdlbnQgdmFsdWUgaWYgaXQgaXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWRcbiAgICAgICAgLy8gYnkgdGhlIHVzZXJBZ2VudFByZWZpeCBvcHRpb24uXG4gICAgICAgIGNvbnN0IGRlZmF1bHRVc2VyQWdlbnRJbmZvID0gZ2V0RGVmYXVsdFVzZXJBZ2VudFZhbHVlKCk7XG4gICAgICAgIGlmICh1c2VyQWdlbnRJbmZvLmluZGV4T2YoZGVmYXVsdFVzZXJBZ2VudEluZm8pID09PSAtMSkge1xuICAgICAgICAgICAgdXNlckFnZW50SW5mby5wdXNoKGRlZmF1bHRVc2VyQWdlbnRJbmZvKTtcbiAgICAgICAgfVxuICAgICAgICB1c2VyQWdlbnRWYWx1ZSA9IHVzZXJBZ2VudEluZm8uam9pbihcIiBcIik7XG4gICAgfVxuICAgIGNvbnN0IGtlZXBBbGl2ZU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRLZWVwQWxpdmVPcHRpb25zKSwgcGlwZWxpbmVPcHRpb25zLmtlZXBBbGl2ZU9wdGlvbnMpO1xuICAgIGNvbnN0IHJldHJ5T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdFJldHJ5T3B0aW9ucyksIHBpcGVsaW5lT3B0aW9ucy5yZXRyeU9wdGlvbnMpO1xuICAgIGNvbnN0IHJlZGlyZWN0T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdFJlZGlyZWN0T3B0aW9ucyksIHBpcGVsaW5lT3B0aW9ucy5yZWRpcmVjdE9wdGlvbnMpO1xuICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgcmVxdWVzdFBvbGljeUZhY3Rvcmllcy5wdXNoKHByb3h5UG9saWN5KHBpcGVsaW5lT3B0aW9ucy5wcm94eU9wdGlvbnMpKTtcbiAgICB9XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdERlc2VyaWFsaXphdGlvbk9wdGlvbnMpLCBwaXBlbGluZU9wdGlvbnMuZGVzZXJpYWxpemF0aW9uT3B0aW9ucyk7XG4gICAgY29uc3QgbG9nZ2luZ09wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwaXBlbGluZU9wdGlvbnMubG9nZ2luZ09wdGlvbnMpO1xuICAgIHJlcXVlc3RQb2xpY3lGYWN0b3JpZXMucHVzaCh0cmFjaW5nUG9saWN5KHsgdXNlckFnZW50OiB1c2VyQWdlbnRWYWx1ZSB9KSwga2VlcEFsaXZlUG9saWN5KGtlZXBBbGl2ZU9wdGlvbnMpLCB1c2VyQWdlbnRQb2xpY3koeyB2YWx1ZTogdXNlckFnZW50VmFsdWUgfSksIGdlbmVyYXRlQ2xpZW50UmVxdWVzdElkUG9saWN5KCksIGRlc2VyaWFsaXphdGlvblBvbGljeShkZXNlcmlhbGl6YXRpb25PcHRpb25zLmV4cGVjdGVkQ29udGVudFR5cGVzKSwgdGhyb3R0bGluZ1JldHJ5UG9saWN5KCksIHN5c3RlbUVycm9yUmV0cnlQb2xpY3koKSwgZXhwb25lbnRpYWxSZXRyeVBvbGljeShyZXRyeU9wdGlvbnMubWF4UmV0cmllcywgcmV0cnlPcHRpb25zLnJldHJ5RGVsYXlJbk1zLCByZXRyeU9wdGlvbnMubWF4UmV0cnlEZWxheUluTXMpKTtcbiAgICBpZiAocmVkaXJlY3RPcHRpb25zLmhhbmRsZVJlZGlyZWN0cykge1xuICAgICAgICByZXF1ZXN0UG9saWN5RmFjdG9yaWVzLnB1c2gocmVkaXJlY3RQb2xpY3kocmVkaXJlY3RPcHRpb25zLm1heFJldHJpZXMpKTtcbiAgICB9XG4gICAgaWYgKGF1dGhQb2xpY3lGYWN0b3J5KSB7XG4gICAgICAgIHJlcXVlc3RQb2xpY3lGYWN0b3JpZXMucHVzaChhdXRoUG9saWN5RmFjdG9yeSk7XG4gICAgfVxuICAgIHJlcXVlc3RQb2xpY3lGYWN0b3JpZXMucHVzaChsb2dQb2xpY3kobG9nZ2luZ09wdGlvbnMpKTtcbiAgICBpZiAoaXNOb2RlICYmIHBpcGVsaW5lT3B0aW9ucy5kZWNvbXByZXNzUmVzcG9uc2UgPT09IGZhbHNlKSB7XG4gICAgICAgIHJlcXVlc3RQb2xpY3lGYWN0b3JpZXMucHVzaChkaXNhYmxlUmVzcG9uc2VEZWNvbXByZXNzaW9uUG9saWN5KCkpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBodHRwQ2xpZW50OiBwaXBlbGluZU9wdGlvbnMuaHR0cENsaWVudCxcbiAgICAgICAgcmVxdWVzdFBvbGljeUZhY3RvcmllcyxcbiAgICB9O1xufVxuLyoqXG4gKiBHZXQgdGhlIHByb3BlcnR5IHBhcmVudCBmb3IgdGhlIHByb3BlcnR5IGF0IHRoZSBwcm92aWRlZCBwYXRoIHdoZW4gc3RhcnRpbmcgd2l0aCB0aGUgcHJvdmlkZWRcbiAqIHBhcmVudCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9wZXJ0eVBhcmVudChwYXJlbnQsIHByb3BlcnR5UGF0aCkge1xuICAgIGlmIChwYXJlbnQgJiYgcHJvcGVydHlQYXRoKSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5UGF0aExlbmd0aCA9IHByb3BlcnR5UGF0aC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcGVydHlQYXRoTGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eVBhdGhbaV07XG4gICAgICAgICAgICBpZiAoIXBhcmVudFtwcm9wZXJ0eU5hbWVdKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50W3Byb3BlcnR5TmFtZV0gPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudFtwcm9wZXJ0eU5hbWVdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJlbnQ7XG59XG5mdW5jdGlvbiBnZXRPcGVyYXRpb25Bcmd1bWVudFZhbHVlRnJvbVBhcmFtZXRlcihzZXJ2aWNlQ2xpZW50LCBvcGVyYXRpb25Bcmd1bWVudHMsIHBhcmFtZXRlciwgc2VyaWFsaXplcikge1xuICAgIHJldHVybiBnZXRPcGVyYXRpb25Bcmd1bWVudFZhbHVlRnJvbVBhcmFtZXRlclBhdGgoc2VydmljZUNsaWVudCwgb3BlcmF0aW9uQXJndW1lbnRzLCBwYXJhbWV0ZXIucGFyYW1ldGVyUGF0aCwgcGFyYW1ldGVyLm1hcHBlciwgc2VyaWFsaXplcik7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0T3BlcmF0aW9uQXJndW1lbnRWYWx1ZUZyb21QYXJhbWV0ZXJQYXRoKHNlcnZpY2VDbGllbnQsIG9wZXJhdGlvbkFyZ3VtZW50cywgcGFyYW1ldGVyUGF0aCwgcGFyYW1ldGVyTWFwcGVyLCBzZXJpYWxpemVyKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAodHlwZW9mIHBhcmFtZXRlclBhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcGFyYW1ldGVyUGF0aCA9IFtwYXJhbWV0ZXJQYXRoXTtcbiAgICB9XG4gICAgY29uc3Qgc2VyaWFsaXplck9wdGlvbnMgPSAoX2EgPSBvcGVyYXRpb25Bcmd1bWVudHMub3B0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNlcmlhbGl6ZXJPcHRpb25zO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtZXRlclBhdGgpKSB7XG4gICAgICAgIGlmIChwYXJhbWV0ZXJQYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJNYXBwZXIuaXNDb25zdGFudCkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyYW1ldGVyTWFwcGVyLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwcm9wZXJ0eVNlYXJjaFJlc3VsdCA9IGdldFByb3BlcnR5RnJvbVBhcmFtZXRlclBhdGgob3BlcmF0aW9uQXJndW1lbnRzLCBwYXJhbWV0ZXJQYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXByb3BlcnR5U2VhcmNoUmVzdWx0LnByb3BlcnR5Rm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlTZWFyY2hSZXN1bHQgPSBnZXRQcm9wZXJ0eUZyb21QYXJhbWV0ZXJQYXRoKHNlcnZpY2VDbGllbnQsIHBhcmFtZXRlclBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgdXNlRGVmYXVsdFZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eVNlYXJjaFJlc3VsdC5wcm9wZXJ0eUZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzZURlZmF1bHRWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJNYXBwZXIucmVxdWlyZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyYW1ldGVyUGF0aFswXSA9PT0gXCJvcHRpb25zXCIgJiYgcGFyYW1ldGVyUGF0aC5sZW5ndGggPT09IDIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHVzZURlZmF1bHRWYWx1ZSA/IHBhcmFtZXRlck1hcHBlci5kZWZhdWx0VmFsdWUgOiBwcm9wZXJ0eVNlYXJjaFJlc3VsdC5wcm9wZXJ0eVZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2VyaWFsaXplIGp1c3QgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMuXG4gICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJQYXRoU3RyaW5nID0gZ2V0UGF0aFN0cmluZ0Zyb21QYXJhbWV0ZXJQYXRoKHBhcmFtZXRlclBhdGgsIHBhcmFtZXRlck1hcHBlcik7XG4gICAgICAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShwYXJhbWV0ZXJNYXBwZXIsIHZhbHVlLCBwYXJhbWV0ZXJQYXRoU3RyaW5nLCBzZXJpYWxpemVyT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChwYXJhbWV0ZXJNYXBwZXIucmVxdWlyZWQpIHtcbiAgICAgICAgICAgIHZhbHVlID0ge307XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgaW4gcGFyYW1ldGVyUGF0aCkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlNYXBwZXIgPSBwYXJhbWV0ZXJNYXBwZXIudHlwZS5tb2RlbFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5UGF0aCA9IHBhcmFtZXRlclBhdGhbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5VmFsdWUgPSBnZXRPcGVyYXRpb25Bcmd1bWVudFZhbHVlRnJvbVBhcmFtZXRlclBhdGgoc2VydmljZUNsaWVudCwgb3BlcmF0aW9uQXJndW1lbnRzLCBwcm9wZXJ0eVBhdGgsIHByb3BlcnR5TWFwcGVyLCBzZXJpYWxpemVyKTtcbiAgICAgICAgICAgIC8vIFNlcmlhbGl6ZSBqdXN0IGZvciB2YWxpZGF0aW9uIHB1cnBvc2VzLlxuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlQYXRoU3RyaW5nID0gZ2V0UGF0aFN0cmluZ0Zyb21QYXJhbWV0ZXJQYXRoKHByb3BlcnR5UGF0aCwgcHJvcGVydHlNYXBwZXIpO1xuICAgICAgICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUocHJvcGVydHlNYXBwZXIsIHByb3BlcnR5VmFsdWUsIHByb3BlcnR5UGF0aFN0cmluZywgc2VyaWFsaXplck9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5VmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wZXJ0eVZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZVtwcm9wZXJ0eU5hbWVdID0gcHJvcGVydHlWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBnZXRQcm9wZXJ0eUZyb21QYXJhbWV0ZXJQYXRoKHBhcmVudCwgcGFyYW1ldGVyUGF0aCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHsgcHJvcGVydHlGb3VuZDogZmFsc2UgfTtcbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yICg7IGkgPCBwYXJhbWV0ZXJQYXRoLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHBhcmFtZXRlclBhdGhQYXJ0ID0gcGFyYW1ldGVyUGF0aFtpXTtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRvIGNoZWNrIGluaGVyaXRlZCBwcm9wZXJ0aWVzIHRvbywgc28gZG9uJ3QgdXNlIGhhc093blByb3BlcnR5KCkuXG4gICAgICAgIGlmIChwYXJlbnQgIT09IHVuZGVmaW5lZCAmJiBwYXJlbnQgIT09IG51bGwgJiYgcGFyYW1ldGVyUGF0aFBhcnQgaW4gcGFyZW50KSB7XG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnRbcGFyYW1ldGVyUGF0aFBhcnRdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGkgPT09IHBhcmFtZXRlclBhdGgubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdC5wcm9wZXJ0eVZhbHVlID0gcGFyZW50O1xuICAgICAgICByZXN1bHQucHJvcGVydHlGb3VuZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIFBhcnNlcyBhbiB7QGxpbmsgSHR0cE9wZXJhdGlvblJlc3BvbnNlfSBpbnRvIGEgbm9ybWFsaXplZCBIVFRQIHJlc3BvbnNlIG9iamVjdCAoe0BsaW5rIFJlc3RSZXNwb25zZX0pLlxuICogQHBhcmFtIF9yZXNwb25zZSAtIFdyYXBwZXIgb2JqZWN0IGZvciBodHRwIHJlc3BvbnNlLlxuICogQHBhcmFtIHJlc3BvbnNlU3BlYyAtIE1hcHBlcnMgZm9yIGhvdyB0byBwYXJzZSB0aGUgcmVzcG9uc2UgcHJvcGVydGllcy5cbiAqIEByZXR1cm5zIC0gQSBub3JtYWxpemVkIHJlc3BvbnNlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW5SZXNwb25zZShfcmVzcG9uc2UsIHJlc3BvbnNlU3BlYykge1xuICAgIGNvbnN0IHBhcnNlZEhlYWRlcnMgPSBfcmVzcG9uc2UucGFyc2VkSGVhZGVycztcbiAgICBjb25zdCBib2R5TWFwcGVyID0gcmVzcG9uc2VTcGVjICYmIHJlc3BvbnNlU3BlYy5ib2R5TWFwcGVyO1xuICAgIGNvbnN0IGFkZE9wZXJhdGlvblJlc3BvbnNlID0gKG9iaikgPT4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgXCJfcmVzcG9uc2VcIiwge1xuICAgICAgICAgICAgdmFsdWU6IF9yZXNwb25zZSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBpZiAoYm9keU1hcHBlcikge1xuICAgICAgICBjb25zdCB0eXBlTmFtZSA9IGJvZHlNYXBwZXIudHlwZS5uYW1lO1xuICAgICAgICBpZiAodHlwZU5hbWUgPT09IFwiU3RyZWFtXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBhZGRPcGVyYXRpb25SZXNwb25zZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBhcnNlZEhlYWRlcnMpLCB7IGJsb2JCb2R5OiBfcmVzcG9uc2UuYmxvYkJvZHksIHJlYWRhYmxlU3RyZWFtQm9keTogX3Jlc3BvbnNlLnJlYWRhYmxlU3RyZWFtQm9keSB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW9kZWxQcm9wZXJ0aWVzID0gKHR5cGVOYW1lID09PSBcIkNvbXBvc2l0ZVwiICYmIGJvZHlNYXBwZXIudHlwZS5tb2RlbFByb3BlcnRpZXMpIHx8IHt9O1xuICAgICAgICBjb25zdCBpc1BhZ2VhYmxlUmVzcG9uc2UgPSBPYmplY3Qua2V5cyhtb2RlbFByb3BlcnRpZXMpLnNvbWUoKGspID0+IG1vZGVsUHJvcGVydGllc1trXS5zZXJpYWxpemVkTmFtZSA9PT0gXCJcIik7XG4gICAgICAgIGlmICh0eXBlTmFtZSA9PT0gXCJTZXF1ZW5jZVwiIHx8IGlzUGFnZWFibGVSZXNwb25zZSkge1xuICAgICAgICAgICAgY29uc3QgYXJyYXlSZXNwb25zZSA9IFsuLi4oX3Jlc3BvbnNlLnBhcnNlZEJvZHkgfHwgW10pXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG1vZGVsUHJvcGVydGllcykpIHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZWxQcm9wZXJ0aWVzW2tleV0uc2VyaWFsaXplZE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJyYXlSZXNwb25zZVtrZXldID0gX3Jlc3BvbnNlLnBhcnNlZEJvZHlba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFyc2VkSGVhZGVycykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHBhcnNlZEhlYWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFycmF5UmVzcG9uc2Vba2V5XSA9IHBhcnNlZEhlYWRlcnNba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRPcGVyYXRpb25SZXNwb25zZShhcnJheVJlc3BvbnNlKTtcbiAgICAgICAgICAgIHJldHVybiBhcnJheVJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlTmFtZSA9PT0gXCJDb21wb3NpdGVcIiB8fCB0eXBlTmFtZSA9PT0gXCJEaWN0aW9uYXJ5XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBhZGRPcGVyYXRpb25SZXNwb25zZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBhcnNlZEhlYWRlcnMpLCBfcmVzcG9uc2UucGFyc2VkQm9keSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChib2R5TWFwcGVyIHx8XG4gICAgICAgIF9yZXNwb25zZS5yZXF1ZXN0Lm1ldGhvZCA9PT0gXCJIRUFEXCIgfHxcbiAgICAgICAgdXRpbHMuaXNQcmltaXRpdmVUeXBlKF9yZXNwb25zZS5wYXJzZWRCb2R5KSkge1xuICAgICAgICAvLyBwcmltaXRpdmUgYm9keSB0eXBlcyBhbmQgSEVBRCBib29sZWFuc1xuICAgICAgICByZXR1cm4gYWRkT3BlcmF0aW9uUmVzcG9uc2UoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwYXJzZWRIZWFkZXJzKSwgeyBib2R5OiBfcmVzcG9uc2UucGFyc2VkQm9keSB9KSk7XG4gICAgfVxuICAgIHJldHVybiBhZGRPcGVyYXRpb25SZXNwb25zZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBhcnNlZEhlYWRlcnMpLCBfcmVzcG9uc2UucGFyc2VkQm9keSkpO1xufVxuZnVuY3Rpb24gZ2V0Q3JlZGVudGlhbFNjb3BlcyhvcHRpb25zLCBiYXNlVXJpKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jcmVkZW50aWFsU2NvcGVzKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmNyZWRlbnRpYWxTY29wZXM7XG4gICAgfVxuICAgIGlmIChiYXNlVXJpKSB7XG4gICAgICAgIHJldHVybiBgJHtiYXNlVXJpfS8uZGVmYXVsdGA7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZXJ2aWNlQ2xpZW50LmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqXG4gKiBDb2RlIGdlbmVyYXRlZCBieSBNaWNyb3NvZnQgKFIpIEF1dG9SZXN0IENvZGUgR2VuZXJhdG9yLlxuICogQ2hhbmdlcyBtYXkgY2F1c2UgaW5jb3JyZWN0IGJlaGF2aW9yIGFuZCB3aWxsIGJlIGxvc3QgaWYgdGhlIGNvZGUgaXMgcmVnZW5lcmF0ZWQuXG4gKi9cbmltcG9ydCAqIGFzIGNvcmVIdHRwIGZyb20gXCJAYXp1cmUvY29yZS1odHRwXCI7XG5jb25zdCBwYWNrYWdlTmFtZSA9IFwiYXp1cmUtc3RvcmFnZS1ibG9iXCI7XG5jb25zdCBwYWNrYWdlVmVyc2lvbiA9IFwiMTIuMTcuMFwiO1xuZXhwb3J0IGNsYXNzIFN0b3JhZ2VDbGllbnRDb250ZXh0IGV4dGVuZHMgY29yZUh0dHAuU2VydmljZUNsaWVudCB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFN0b3JhZ2VDbGllbnRDb250ZXh0IGNsYXNzLlxuICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgc2VydmljZSBhY2NvdW50LCBjb250YWluZXIsIG9yIGJsb2IgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZSBkZXNpcmVkXG4gICAgICogICAgICAgICAgICBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIHBhcmFtZXRlciBvcHRpb25zXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodXJsLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh1cmwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ3VybCcgY2Fubm90IGJlIG51bGxcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW5pdGlhbGl6aW5nIGRlZmF1bHQgdmFsdWVzIGZvciBvcHRpb25zXG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucy51c2VyQWdlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRVc2VyQWdlbnQgPSBjb3JlSHR0cC5nZXREZWZhdWx0VXNlckFnZW50VmFsdWUoKTtcbiAgICAgICAgICAgIG9wdGlvbnMudXNlckFnZW50ID0gYCR7cGFja2FnZU5hbWV9LyR7cGFja2FnZVZlcnNpb259ICR7ZGVmYXVsdFVzZXJBZ2VudH1gO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKHVuZGVmaW5lZCwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMucmVxdWVzdENvbnRlbnRUeXBlID0gXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCI7XG4gICAgICAgIHRoaXMuYmFzZVVyaSA9IG9wdGlvbnMuZW5kcG9pbnQgfHwgXCJ7dXJsfVwiO1xuICAgICAgICAvLyBQYXJhbWV0ZXIgYXNzaWdubWVudHNcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgICAgIC8vIEFzc2lnbmluZyB2YWx1ZXMgdG8gQ29uc3RhbnQgcGFyYW1ldGVyc1xuICAgICAgICB0aGlzLnZlcnNpb24gPSBvcHRpb25zLnZlcnNpb24gfHwgXCIyMDIzLTExLTAzXCI7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RvcmFnZUNsaWVudENvbnRleHQuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBTdG9yYWdlQ2xpZW50Q29udGV4dCB9IGZyb20gXCIuL2dlbmVyYXRlZC9zcmMvc3RvcmFnZUNsaWVudENvbnRleHRcIjtcbmltcG9ydCB7IGVzY2FwZVVSTFBhdGgsIGdldFVSTFNjaGVtZSwgaUVxdWFsLCBnZXRBY2NvdW50TmFtZUZyb21VcmwgfSBmcm9tIFwiLi91dGlscy91dGlscy5jb21tb25cIjtcbmltcG9ydCB7IEFub255bW91c0NyZWRlbnRpYWwgfSBmcm9tIFwiLi9jcmVkZW50aWFscy9Bbm9ueW1vdXNDcmVkZW50aWFsXCI7XG5pbXBvcnQgeyBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCB9IGZyb20gXCIuL2NyZWRlbnRpYWxzL1N0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsXCI7XG5pbXBvcnQgeyBpc1Rva2VuQ3JlZGVudGlhbCwgaXNOb2RlIH0gZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbi8qKlxuICogQSBTdG9yYWdlQ2xpZW50IHJlcHJlc2VudHMgYSBiYXNlZCBVUkwgY2xhc3MgZm9yIHtAbGluayBCbG9iU2VydmljZUNsaWVudH0sIHtAbGluayBDb250YWluZXJDbGllbnR9XG4gKiBhbmQgZXRjLlxuICovXG5leHBvcnQgY2xhc3MgU3RvcmFnZUNsaWVudCB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBTdG9yYWdlQ2xpZW50LlxuICAgICAqIEBwYXJhbSB1cmwgLSB1cmwgdG8gcmVzb3VyY2VcbiAgICAgKiBAcGFyYW0gcGlwZWxpbmUgLSByZXF1ZXN0IHBvbGljeSBwaXBlbGluZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih1cmwsIHBpcGVsaW5lKSB7XG4gICAgICAgIC8vIFVSTCBzaG91bGQgYmUgZW5jb2RlZCBhbmQgb25seSBvbmNlLCBwcm90b2NvbCBsYXllciBzaG91bGRuJ3QgZW5jb2RlIFVSTCBhZ2FpblxuICAgICAgICB0aGlzLnVybCA9IGVzY2FwZVVSTFBhdGgodXJsKTtcbiAgICAgICAgdGhpcy5hY2NvdW50TmFtZSA9IGdldEFjY291bnROYW1lRnJvbVVybCh1cmwpO1xuICAgICAgICB0aGlzLnBpcGVsaW5lID0gcGlwZWxpbmU7XG4gICAgICAgIHRoaXMuc3RvcmFnZUNsaWVudENvbnRleHQgPSBuZXcgU3RvcmFnZUNsaWVudENvbnRleHQodGhpcy51cmwsIHBpcGVsaW5lLnRvU2VydmljZUNsaWVudE9wdGlvbnMoKSk7XG4gICAgICAgIHRoaXMuaXNIdHRwcyA9IGlFcXVhbChnZXRVUkxTY2hlbWUodGhpcy51cmwpIHx8IFwiXCIsIFwiaHR0cHNcIik7XG4gICAgICAgIHRoaXMuY3JlZGVudGlhbCA9IG5ldyBBbm9ueW1vdXNDcmVkZW50aWFsKCk7XG4gICAgICAgIGZvciAoY29uc3QgZmFjdG9yeSBvZiB0aGlzLnBpcGVsaW5lLmZhY3Rvcmllcykge1xuICAgICAgICAgICAgaWYgKChpc05vZGUgJiYgZmFjdG9yeSBpbnN0YW5jZW9mIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsKSB8fFxuICAgICAgICAgICAgICAgIGZhY3RvcnkgaW5zdGFuY2VvZiBBbm9ueW1vdXNDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVkZW50aWFsID0gZmFjdG9yeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzVG9rZW5DcmVkZW50aWFsKGZhY3RvcnkuY3JlZGVudGlhbCkpIHtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IHdvcmtzIGlmIHRoZSBmYWN0b3J5IGhhcyBiZWVuIGF0dGFjaGVkIGEgXCJjcmVkZW50aWFsXCIgcHJvcGVydHkuXG4gICAgICAgICAgICAgICAgLy8gV2UgZG8gdGhhdCBpbiBuZXdQaXBlbGluZSgpIHdoZW4gdXNpbmcgVG9rZW5DcmVkZW50aWFsLlxuICAgICAgICAgICAgICAgIHRoaXMuY3JlZGVudGlhbCA9IGZhY3RvcnkuY3JlZGVudGlhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBPdmVycmlkZSBwcm90b2NvbCBsYXllcidzIGRlZmF1bHQgY29udGVudC10eXBlXG4gICAgICAgIGNvbnN0IHN0b3JhZ2VDbGllbnRDb250ZXh0ID0gdGhpcy5zdG9yYWdlQ2xpZW50Q29udGV4dDtcbiAgICAgICAgc3RvcmFnZUNsaWVudENvbnRleHQucmVxdWVzdENvbnRlbnRUeXBlID0gdW5kZWZpbmVkO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0b3JhZ2VDbGllbnQuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBjcmVhdGVTcGFuRnVuY3Rpb24gfSBmcm9tIFwiQGF6dXJlL2NvcmUtdHJhY2luZ1wiO1xuLyoqXG4gKiBDcmVhdGVzIGEgc3BhbiB1c2luZyB0aGUgZ2xvYmFsIHRyYWNlci5cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlU3BhbiA9IGNyZWF0ZVNwYW5GdW5jdGlvbih7XG4gICAgcGFja2FnZVByZWZpeDogXCJBenVyZS5TdG9yYWdlLkJsb2JcIixcbiAgICBuYW1lc3BhY2U6IFwiTWljcm9zb2Z0LlN0b3JhZ2VcIixcbn0pO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBBZGFwdCB0aGUgdHJhY2luZyBvcHRpb25zIGZyb20gT3BlcmF0aW9uT3B0aW9ucyB0byB3aGF0IHRoZXkgbmVlZCB0byBiZSBmb3JcbiAqIFJlcXVlc3RPcHRpb25zQmFzZSAod2hlbiB3ZSB1cGRhdGUgdG8gbGF0ZXIgT3BlblRlbGVtZXRyeSB2ZXJzaW9ucyB0aGlzIGlzIG5vd1xuICogdHdvIHNlcGFyYXRlIGZpZWxkcywgbm90IGp1c3Qgb25lKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucykge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLy8gQnkgcGFzc2luZyBzcGFuT3B0aW9ucyBpZiB0aGV5IGV4aXN0IGF0IHJ1bnRpbWUsIHdlJ3JlIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggQGF6dXJlL2NvcmUtdHJhY2luZ0BwcmV2aWV3LjEzIGFuZCBlYXJsaWVyLlxuICAgICAgICBzcGFuT3B0aW9uczogKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnRyYWNpbmdPcHRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc3Bhbk9wdGlvbnMsXG4gICAgICAgIHRyYWNpbmdDb250ZXh0OiAoX2IgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudHJhY2luZ09wdGlvbnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi50cmFjaW5nQ29udGV4dCxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhY2luZy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbi8qKlxuICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICpcbiAqIFRoaXMgaXMgYSBoZWxwZXIgY2xhc3MgdG8gY29uc3RydWN0IGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSBhIFNlcnZpY2VTQVMgdG8gYSBibG9iLiBTZXR0aW5nXG4gKiBhIHZhbHVlIHRvIHRydWUgbWVhbnMgdGhhdCBhbnkgU0FTIHdoaWNoIHVzZXMgdGhlc2UgcGVybWlzc2lvbnMgd2lsbCBncmFudCBwZXJtaXNzaW9ucyBmb3IgdGhhdCBvcGVyYXRpb24uIE9uY2UgYWxsXG4gKiB0aGUgdmFsdWVzIGFyZSBzZXQsIHRoaXMgc2hvdWxkIGJlIHNlcmlhbGl6ZWQgd2l0aCB0b1N0cmluZyBhbmQgc2V0IGFzIHRoZSBwZXJtaXNzaW9ucyBmaWVsZCBvbiBhXG4gKiB7QGxpbmsgQmxvYlNBU1NpZ25hdHVyZVZhbHVlc30gb2JqZWN0LiBJdCBpcyBwb3NzaWJsZSB0byBjb25zdHJ1Y3QgdGhlIHBlcm1pc3Npb25zIHN0cmluZyB3aXRob3V0IHRoaXMgY2xhc3MsIGJ1dFxuICogdGhlIG9yZGVyIG9mIHRoZSBwZXJtaXNzaW9ucyBpcyBwYXJ0aWN1bGFyIGFuZCB0aGlzIGNsYXNzIGd1YXJhbnRlZXMgY29ycmVjdG5lc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBCbG9iU0FTUGVybWlzc2lvbnMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIFJlYWQgYWNjZXNzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlYWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBBZGQgYWNjZXNzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFkZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIENyZWF0ZSBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY3JlYXRlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgV3JpdGUgYWNjZXNzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLndyaXRlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgRGVsZXRlIGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZWxldGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBEZWxldGUgdmVyc2lvbiBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGVsZXRlVmVyc2lvbiA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2ZpZXMgVGFnIGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50YWcgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBNb3ZlIGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tb3ZlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgRXhlY3V0ZSBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZXhlY3V0ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIFNldEltbXV0YWJpbGl0eVBvbGljeSBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2V0SW1tdXRhYmlsaXR5UG9saWN5ID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhhdCBQZXJtYW5lbnQgRGVsZXRlIGlzIHBlcm1pdHRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGVybWFuZW50RGVsZXRlID0gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgQmxvYlNBU1Blcm1pc3Npb25zfSBmcm9tIHRoZSBzcGVjaWZpZWQgcGVybWlzc2lvbnMgc3RyaW5nLiBUaGlzIG1ldGhvZCB3aWxsIHRocm93IGFuXG4gICAgICogRXJyb3IgaWYgaXQgZW5jb3VudGVycyBhIGNoYXJhY3RlciB0aGF0IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSB2YWxpZCBwZXJtaXNzaW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBlcm1pc3Npb25zIC1cbiAgICAgKi9cbiAgICBzdGF0aWMgcGFyc2UocGVybWlzc2lvbnMpIHtcbiAgICAgICAgY29uc3QgYmxvYlNBU1Blcm1pc3Npb25zID0gbmV3IEJsb2JTQVNQZXJtaXNzaW9ucygpO1xuICAgICAgICBmb3IgKGNvbnN0IGNoYXIgb2YgcGVybWlzc2lvbnMpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoY2hhcikge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJyXCI6XG4gICAgICAgICAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy5yZWFkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICAgICAgICAgICAgYmxvYlNBU1Blcm1pc3Npb25zLmFkZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgICAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy5jcmVhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwid1wiOlxuICAgICAgICAgICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMud3JpdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZFwiOlxuICAgICAgICAgICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMuZGVsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInhcIjpcbiAgICAgICAgICAgICAgICAgICAgYmxvYlNBU1Blcm1pc3Npb25zLmRlbGV0ZVZlcnNpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwidFwiOlxuICAgICAgICAgICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMudGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1cIjpcbiAgICAgICAgICAgICAgICAgICAgYmxvYlNBU1Blcm1pc3Npb25zLm1vdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZVwiOlxuICAgICAgICAgICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMuZXhlY3V0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJpXCI6XG4gICAgICAgICAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy5zZXRJbW11dGFiaWxpdHlQb2xpY3kgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwieVwiOlxuICAgICAgICAgICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMucGVybWFuZW50RGVsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgcGVybWlzc2lvbjogJHtjaGFyfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBibG9iU0FTUGVybWlzc2lvbnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgQmxvYlNBU1Blcm1pc3Npb25zfSBmcm9tIGEgcmF3IG9iamVjdCB3aGljaCBjb250YWlucyBzYW1lIGtleXMgYXMgaXRcbiAgICAgKiBhbmQgYm9vbGVhbiB2YWx1ZXMgZm9yIHRoZW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGVybWlzc2lvbkxpa2UgLVxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tKHBlcm1pc3Npb25MaWtlKSB7XG4gICAgICAgIGNvbnN0IGJsb2JTQVNQZXJtaXNzaW9ucyA9IG5ldyBCbG9iU0FTUGVybWlzc2lvbnMoKTtcbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLnJlYWQpIHtcbiAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy5yZWFkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UuYWRkKSB7XG4gICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMuYWRkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UuY3JlYXRlKSB7XG4gICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMuY3JlYXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2Uud3JpdGUpIHtcbiAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy53cml0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLmRlbGV0ZSkge1xuICAgICAgICAgICAgYmxvYlNBU1Blcm1pc3Npb25zLmRlbGV0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLmRlbGV0ZVZlcnNpb24pIHtcbiAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy5kZWxldGVWZXJzaW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UudGFnKSB7XG4gICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMudGFnID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UubW92ZSkge1xuICAgICAgICAgICAgYmxvYlNBU1Blcm1pc3Npb25zLm1vdmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5leGVjdXRlKSB7XG4gICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMuZXhlY3V0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLnNldEltbXV0YWJpbGl0eVBvbGljeSkge1xuICAgICAgICAgICAgYmxvYlNBU1Blcm1pc3Npb25zLnNldEltbXV0YWJpbGl0eVBvbGljeSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLnBlcm1hbmVudERlbGV0ZSkge1xuICAgICAgICAgICAgYmxvYlNBU1Blcm1pc3Npb25zLnBlcm1hbmVudERlbGV0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJsb2JTQVNQZXJtaXNzaW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGdpdmVuIHBlcm1pc3Npb25zIHRvIGEgc3RyaW5nLiBVc2luZyB0aGlzIG1ldGhvZCB3aWxsIGd1YXJhbnRlZSB0aGUgcGVybWlzc2lvbnMgYXJlIGluIGFuXG4gICAgICogb3JkZXIgYWNjZXB0ZWQgYnkgdGhlIHNlcnZpY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyB3aGljaCByZXByZXNlbnRzIHRoZSBCbG9iU0FTUGVybWlzc2lvbnNcbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbnMgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMucmVhZCkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcInJcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWRkKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwiYVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jcmVhdGUpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJjXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLndyaXRlKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwid1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZWxldGUpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRlbGV0ZVZlcnNpb24pIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJ4XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnRhZykge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcInRcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubW92ZSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcIm1cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZXhlY3V0ZSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcImVcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2V0SW1tdXRhYmlsaXR5UG9saWN5KSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwiaVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wZXJtYW5lbnREZWxldGUpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJ5XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwZXJtaXNzaW9ucy5qb2luKFwiXCIpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJsb2JTQVNQZXJtaXNzaW9ucy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbi8qKlxuICogVGhpcyBpcyBhIGhlbHBlciBjbGFzcyB0byBjb25zdHJ1Y3QgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IGEgU2VydmljZVNBUyB0byBhIGNvbnRhaW5lci5cbiAqIFNldHRpbmcgYSB2YWx1ZSB0byB0cnVlIG1lYW5zIHRoYXQgYW55IFNBUyB3aGljaCB1c2VzIHRoZXNlIHBlcm1pc3Npb25zIHdpbGwgZ3JhbnQgcGVybWlzc2lvbnMgZm9yIHRoYXQgb3BlcmF0aW9uLlxuICogT25jZSBhbGwgdGhlIHZhbHVlcyBhcmUgc2V0LCB0aGlzIHNob3VsZCBiZSBzZXJpYWxpemVkIHdpdGggdG9TdHJpbmcgYW5kIHNldCBhcyB0aGUgcGVybWlzc2lvbnMgZmllbGQgb24gYVxuICoge0BsaW5rIEJsb2JTQVNTaWduYXR1cmVWYWx1ZXN9IG9iamVjdC4gSXQgaXMgcG9zc2libGUgdG8gY29uc3RydWN0IHRoZSBwZXJtaXNzaW9ucyBzdHJpbmcgd2l0aG91dCB0aGlzIGNsYXNzLCBidXRcbiAqIHRoZSBvcmRlciBvZiB0aGUgcGVybWlzc2lvbnMgaXMgcGFydGljdWxhciBhbmQgdGhpcyBjbGFzcyBndWFyYW50ZWVzIGNvcnJlY3RuZXNzLlxuICovXG5leHBvcnQgY2xhc3MgQ29udGFpbmVyU0FTUGVybWlzc2lvbnMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIFJlYWQgYWNjZXNzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlYWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBBZGQgYWNjZXNzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFkZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIENyZWF0ZSBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY3JlYXRlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgV3JpdGUgYWNjZXNzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLndyaXRlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgRGVsZXRlIGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZWxldGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBEZWxldGUgdmVyc2lvbiBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGVsZXRlVmVyc2lvbiA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIExpc3QgYWNjZXNzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxpc3QgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNmaWVzIFRhZyBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGFnID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgTW92ZSBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubW92ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIEV4ZWN1dGUgYWNjZXNzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmV4ZWN1dGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBTZXRJbW11dGFiaWxpdHlQb2xpY3kgYWNjZXNzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNldEltbXV0YWJpbGl0eVBvbGljeSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIHRoYXQgUGVybWFuZW50IERlbGV0ZSBpcyBwZXJtaXR0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnBlcm1hbmVudERlbGV0ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIHRoYXQgRmlsdGVyIEJsb2JzIGJ5IFRhZ3MgaXMgcGVybWl0dGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maWx0ZXJCeVRhZ3MgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiB7QGxpbmsgQ29udGFpbmVyU0FTUGVybWlzc2lvbnN9IGZyb20gdGhlIHNwZWNpZmllZCBwZXJtaXNzaW9ucyBzdHJpbmcuIFRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW5cbiAgICAgKiBFcnJvciBpZiBpdCBlbmNvdW50ZXJzIGEgY2hhcmFjdGVyIHRoYXQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHZhbGlkIHBlcm1pc3Npb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGVybWlzc2lvbnMgLVxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZShwZXJtaXNzaW9ucykge1xuICAgICAgICBjb25zdCBjb250YWluZXJTQVNQZXJtaXNzaW9ucyA9IG5ldyBDb250YWluZXJTQVNQZXJtaXNzaW9ucygpO1xuICAgICAgICBmb3IgKGNvbnN0IGNoYXIgb2YgcGVybWlzc2lvbnMpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoY2hhcikge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJyXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLnJlYWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiYVwiOlxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy5hZGQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiY1wiOlxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy5jcmVhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwid1wiOlxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy53cml0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLmRlbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJsXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLmxpc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwidFwiOlxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy50YWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwieFwiOlxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy5kZWxldGVWZXJzaW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1cIjpcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMubW92ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJlXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLmV4ZWN1dGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiaVwiOlxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy5zZXRJbW11dGFiaWxpdHlQb2xpY3kgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwieVwiOlxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy5wZXJtYW5lbnREZWxldGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZlwiOlxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy5maWx0ZXJCeVRhZ3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBwZXJtaXNzaW9uICR7Y2hhcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGFpbmVyU0FTUGVybWlzc2lvbnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgQ29udGFpbmVyU0FTUGVybWlzc2lvbnN9IGZyb20gYSByYXcgb2JqZWN0IHdoaWNoIGNvbnRhaW5zIHNhbWUga2V5cyBhcyBpdFxuICAgICAqIGFuZCBib29sZWFuIHZhbHVlcyBmb3IgdGhlbS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwZXJtaXNzaW9uTGlrZSAtXG4gICAgICovXG4gICAgc3RhdGljIGZyb20ocGVybWlzc2lvbkxpa2UpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyU0FTUGVybWlzc2lvbnMgPSBuZXcgQ29udGFpbmVyU0FTUGVybWlzc2lvbnMoKTtcbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLnJlYWQpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLnJlYWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5hZGQpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLmFkZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLmNyZWF0ZSkge1xuICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMuY3JlYXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2Uud3JpdGUpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLndyaXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UuZGVsZXRlKSB7XG4gICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy5kZWxldGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5saXN0KSB7XG4gICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy5saXN0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UuZGVsZXRlVmVyc2lvbikge1xuICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMuZGVsZXRlVmVyc2lvbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLnRhZykge1xuICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMudGFnID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UubW92ZSkge1xuICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMubW92ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLmV4ZWN1dGUpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLmV4ZWN1dGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5zZXRJbW11dGFiaWxpdHlQb2xpY3kpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLnNldEltbXV0YWJpbGl0eVBvbGljeSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLnBlcm1hbmVudERlbGV0ZSkge1xuICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMucGVybWFuZW50RGVsZXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UuZmlsdGVyQnlUYWdzKSB7XG4gICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy5maWx0ZXJCeVRhZ3MgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250YWluZXJTQVNQZXJtaXNzaW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGdpdmVuIHBlcm1pc3Npb25zIHRvIGEgc3RyaW5nLiBVc2luZyB0aGlzIG1ldGhvZCB3aWxsIGd1YXJhbnRlZSB0aGUgcGVybWlzc2lvbnMgYXJlIGluIGFuXG4gICAgICogb3JkZXIgYWNjZXB0ZWQgYnkgdGhlIHNlcnZpY2UuXG4gICAgICpcbiAgICAgKiBUaGUgb3JkZXIgb2YgdGhlIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGFzIHNwZWNpZmllZCBoZXJlIHRvIGVuc3VyZSBjb3JyZWN0bmVzcy5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9jb25zdHJ1Y3RpbmctYS1zZXJ2aWNlLXNhc1xuICAgICAqXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gW107XG4gICAgICAgIGlmICh0aGlzLnJlYWQpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJyXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFkZCkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcImFcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY3JlYXRlKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwiY1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy53cml0ZSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcIndcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVsZXRlKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwiZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZWxldGVWZXJzaW9uKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwieFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5saXN0KSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwibFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50YWcpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJ0XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1vdmUpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJtXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmV4ZWN1dGUpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNldEltbXV0YWJpbGl0eVBvbGljeSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcImlcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGVybWFuZW50RGVsZXRlKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwieVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5maWx0ZXJCeVRhZ3MpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJmXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwZXJtaXNzaW9ucy5qb2luKFwiXCIpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnRhaW5lclNBU1Blcm1pc3Npb25zLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgY3JlYXRlSG1hYyB9IGZyb20gXCJjcnlwdG9cIjtcbi8qKlxuICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICpcbiAqIFVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbCBpcyBvbmx5IHVzZWQgZm9yIGdlbmVyYXRpb24gb2YgdXNlciBkZWxlZ2F0aW9uIFNBUy5cbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2NyZWF0ZS11c2VyLWRlbGVnYXRpb24tc2FzXG4gKi9cbmV4cG9ydCBjbGFzcyBVc2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgVXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLlxuICAgICAqIEBwYXJhbSBhY2NvdW50TmFtZSAtXG4gICAgICogQHBhcmFtIHVzZXJEZWxlZ2F0aW9uS2V5IC1cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihhY2NvdW50TmFtZSwgdXNlckRlbGVnYXRpb25LZXkpIHtcbiAgICAgICAgdGhpcy5hY2NvdW50TmFtZSA9IGFjY291bnROYW1lO1xuICAgICAgICB0aGlzLnVzZXJEZWxlZ2F0aW9uS2V5ID0gdXNlckRlbGVnYXRpb25LZXk7XG4gICAgICAgIHRoaXMua2V5ID0gQnVmZmVyLmZyb20odXNlckRlbGVnYXRpb25LZXkudmFsdWUsIFwiYmFzZTY0XCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSBoYXNoIHNpZ25hdHVyZSBmb3IgYW4gSFRUUCByZXF1ZXN0IG9yIGZvciBhIFNBUy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdHJpbmdUb1NpZ24gLVxuICAgICAqL1xuICAgIGNvbXB1dGVITUFDU0hBMjU2KHN0cmluZ1RvU2lnbikge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgc3RyaW5nVG9TaWduOiAke0pTT04uc3RyaW5naWZ5KHN0cmluZ1RvU2lnbil9YCk7XG4gICAgICAgIHJldHVybiBjcmVhdGVIbWFjKFwic2hhMjU2XCIsIHRoaXMua2V5KS51cGRhdGUoc3RyaW5nVG9TaWduLCBcInV0ZjhcIikuZGlnZXN0KFwiYmFzZTY0XCIpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbi8qKlxuICogR2VuZXJhdGUgU2FzSVBSYW5nZSBmb3JtYXQgc3RyaW5nLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBcIjguOC44LjhcIiBvciBcIjEuMS4xLjEtMjU1LjI1NS4yNTUuMjU1XCJcbiAqXG4gKiBAcGFyYW0gaXBSYW5nZSAtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpcFJhbmdlVG9TdHJpbmcoaXBSYW5nZSkge1xuICAgIHJldHVybiBpcFJhbmdlLmVuZCA/IGAke2lwUmFuZ2Uuc3RhcnR9LSR7aXBSYW5nZS5lbmR9YCA6IGlwUmFuZ2Uuc3RhcnQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TYXNJUFJhbmdlLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgaXBSYW5nZVRvU3RyaW5nIH0gZnJvbSBcIi4vU2FzSVBSYW5nZVwiO1xuaW1wb3J0IHsgdHJ1bmNhdGVkSVNPODA2MURhdGUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHMuY29tbW9uXCI7XG4vKipcbiAqIFByb3RvY29scyBmb3IgZ2VuZXJhdGVkIFNBUy5cbiAqL1xuZXhwb3J0IHZhciBTQVNQcm90b2NvbDtcbihmdW5jdGlvbiAoU0FTUHJvdG9jb2wpIHtcbiAgICAvKipcbiAgICAgKiBQcm90b2NvbCB0aGF0IGFsbG93cyBIVFRQUyBvbmx5XG4gICAgICovXG4gICAgU0FTUHJvdG9jb2xbXCJIdHRwc1wiXSA9IFwiaHR0cHNcIjtcbiAgICAvKipcbiAgICAgKiBQcm90b2NvbCB0aGF0IGFsbG93cyBib3RoIEhUVFBTIGFuZCBIVFRQXG4gICAgICovXG4gICAgU0FTUHJvdG9jb2xbXCJIdHRwc0FuZEh0dHBcIl0gPSBcImh0dHBzLGh0dHBcIjtcbn0pKFNBU1Byb3RvY29sIHx8IChTQVNQcm90b2NvbCA9IHt9KSk7XG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGNvbXBvbmVudHMgdGhhdCBtYWtlIHVwIGFuIEF6dXJlIFN0b3JhZ2UgU0FTJyBxdWVyeSBwYXJhbWV0ZXJzLiBUaGlzIHR5cGUgaXMgbm90IGNvbnN0cnVjdGVkIGRpcmVjdGx5XG4gKiBieSB0aGUgdXNlcjsgaXQgaXMgb25seSBnZW5lcmF0ZWQgYnkgdGhlIHtAbGluayBBY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzfSBhbmQge0BsaW5rIEJsb2JTQVNTaWduYXR1cmVWYWx1ZXN9XG4gKiB0eXBlcy4gT25jZSBnZW5lcmF0ZWQsIGl0IGNhbiBiZSBlbmNvZGVkIGludG8gYSB7QGxpbmsgU3RyaW5nfSBhbmQgYXBwZW5kZWQgdG8gYSBVUkwgZGlyZWN0bHkgKHRob3VnaCBjYXV0aW9uIHNob3VsZFxuICogYmUgdGFrZW4gaGVyZSBpbiBjYXNlIHRoZXJlIGFyZSBleGlzdGluZyBxdWVyeSBwYXJhbWV0ZXJzLCB3aGljaCBtaWdodCBhZmZlY3QgdGhlIGFwcHJvcHJpYXRlIG1lYW5zIG9mIGFwcGVuZGluZ1xuICogdGhlc2UgcXVlcnkgcGFyYW1ldGVycykuXG4gKlxuICogTk9URTogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIGltbXV0YWJsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNBU1F1ZXJ5UGFyYW1ldGVycyB7XG4gICAgY29uc3RydWN0b3IodmVyc2lvbiwgc2lnbmF0dXJlLCBwZXJtaXNzaW9uc09yT3B0aW9ucywgc2VydmljZXMsIHJlc291cmNlVHlwZXMsIHByb3RvY29sLCBzdGFydHNPbiwgZXhwaXJlc09uLCBpcFJhbmdlLCBpZGVudGlmaWVyLCByZXNvdXJjZSwgY2FjaGVDb250cm9sLCBjb250ZW50RGlzcG9zaXRpb24sIGNvbnRlbnRFbmNvZGluZywgY29udGVudExhbmd1YWdlLCBjb250ZW50VHlwZSwgdXNlckRlbGVnYXRpb25LZXksIHByZWF1dGhvcml6ZWRBZ2VudE9iamVjdElkLCBjb3JyZWxhdGlvbklkLCBlbmNyeXB0aW9uU2NvcGUpIHtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5zaWduYXR1cmUgPSBzaWduYXR1cmU7XG4gICAgICAgIGlmIChwZXJtaXNzaW9uc09yT3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBwZXJtaXNzaW9uc09yT3B0aW9ucyAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgLy8gU0FTUXVlcnlQYXJhbWV0ZXJzT3B0aW9uc1xuICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zT3JPcHRpb25zLnBlcm1pc3Npb25zO1xuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlcyA9IHBlcm1pc3Npb25zT3JPcHRpb25zLnNlcnZpY2VzO1xuICAgICAgICAgICAgdGhpcy5yZXNvdXJjZVR5cGVzID0gcGVybWlzc2lvbnNPck9wdGlvbnMucmVzb3VyY2VUeXBlcztcbiAgICAgICAgICAgIHRoaXMucHJvdG9jb2wgPSBwZXJtaXNzaW9uc09yT3B0aW9ucy5wcm90b2NvbDtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRzT24gPSBwZXJtaXNzaW9uc09yT3B0aW9ucy5zdGFydHNPbjtcbiAgICAgICAgICAgIHRoaXMuZXhwaXJlc09uID0gcGVybWlzc2lvbnNPck9wdGlvbnMuZXhwaXJlc09uO1xuICAgICAgICAgICAgdGhpcy5pcFJhbmdlSW5uZXIgPSBwZXJtaXNzaW9uc09yT3B0aW9ucy5pcFJhbmdlO1xuICAgICAgICAgICAgdGhpcy5pZGVudGlmaWVyID0gcGVybWlzc2lvbnNPck9wdGlvbnMuaWRlbnRpZmllcjtcbiAgICAgICAgICAgIHRoaXMuZW5jcnlwdGlvblNjb3BlID0gcGVybWlzc2lvbnNPck9wdGlvbnMuZW5jcnlwdGlvblNjb3BlO1xuICAgICAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHBlcm1pc3Npb25zT3JPcHRpb25zLnJlc291cmNlO1xuICAgICAgICAgICAgdGhpcy5jYWNoZUNvbnRyb2wgPSBwZXJtaXNzaW9uc09yT3B0aW9ucy5jYWNoZUNvbnRyb2w7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnREaXNwb3NpdGlvbiA9IHBlcm1pc3Npb25zT3JPcHRpb25zLmNvbnRlbnREaXNwb3NpdGlvbjtcbiAgICAgICAgICAgIHRoaXMuY29udGVudEVuY29kaW5nID0gcGVybWlzc2lvbnNPck9wdGlvbnMuY29udGVudEVuY29kaW5nO1xuICAgICAgICAgICAgdGhpcy5jb250ZW50TGFuZ3VhZ2UgPSBwZXJtaXNzaW9uc09yT3B0aW9ucy5jb250ZW50TGFuZ3VhZ2U7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gcGVybWlzc2lvbnNPck9wdGlvbnMuY29udGVudFR5cGU7XG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbnNPck9wdGlvbnMudXNlckRlbGVnYXRpb25LZXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNpZ25lZE9pZCA9IHBlcm1pc3Npb25zT3JPcHRpb25zLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZE9iamVjdElkO1xuICAgICAgICAgICAgICAgIHRoaXMuc2lnbmVkVGVuYW50SWQgPSBwZXJtaXNzaW9uc09yT3B0aW9ucy51c2VyRGVsZWdhdGlvbktleS5zaWduZWRUZW5hbnRJZDtcbiAgICAgICAgICAgICAgICB0aGlzLnNpZ25lZFN0YXJ0c09uID0gcGVybWlzc2lvbnNPck9wdGlvbnMudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkU3RhcnRzT247XG4gICAgICAgICAgICAgICAgdGhpcy5zaWduZWRFeHBpcmVzT24gPSBwZXJtaXNzaW9uc09yT3B0aW9ucy51c2VyRGVsZWdhdGlvbktleS5zaWduZWRFeHBpcmVzT247XG4gICAgICAgICAgICAgICAgdGhpcy5zaWduZWRTZXJ2aWNlID0gcGVybWlzc2lvbnNPck9wdGlvbnMudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkU2VydmljZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNpZ25lZFZlcnNpb24gPSBwZXJtaXNzaW9uc09yT3B0aW9ucy51c2VyRGVsZWdhdGlvbktleS5zaWduZWRWZXJzaW9uO1xuICAgICAgICAgICAgICAgIHRoaXMucHJlYXV0aG9yaXplZEFnZW50T2JqZWN0SWQgPSBwZXJtaXNzaW9uc09yT3B0aW9ucy5wcmVhdXRob3JpemVkQWdlbnRPYmplY3RJZDtcbiAgICAgICAgICAgICAgICB0aGlzLmNvcnJlbGF0aW9uSWQgPSBwZXJtaXNzaW9uc09yT3B0aW9ucy5jb3JyZWxhdGlvbklkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlcyA9IHNlcnZpY2VzO1xuICAgICAgICAgICAgdGhpcy5yZXNvdXJjZVR5cGVzID0gcmVzb3VyY2VUeXBlcztcbiAgICAgICAgICAgIHRoaXMuZXhwaXJlc09uID0gZXhwaXJlc09uO1xuICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zT3JPcHRpb25zO1xuICAgICAgICAgICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sO1xuICAgICAgICAgICAgdGhpcy5zdGFydHNPbiA9IHN0YXJ0c09uO1xuICAgICAgICAgICAgdGhpcy5pcFJhbmdlSW5uZXIgPSBpcFJhbmdlO1xuICAgICAgICAgICAgdGhpcy5lbmNyeXB0aW9uU2NvcGUgPSBlbmNyeXB0aW9uU2NvcGU7XG4gICAgICAgICAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICAgICAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlO1xuICAgICAgICAgICAgdGhpcy5jYWNoZUNvbnRyb2wgPSBjYWNoZUNvbnRyb2w7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnREaXNwb3NpdGlvbiA9IGNvbnRlbnREaXNwb3NpdGlvbjtcbiAgICAgICAgICAgIHRoaXMuY29udGVudEVuY29kaW5nID0gY29udGVudEVuY29kaW5nO1xuICAgICAgICAgICAgdGhpcy5jb250ZW50TGFuZ3VhZ2UgPSBjb250ZW50TGFuZ3VhZ2U7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7XG4gICAgICAgICAgICBpZiAodXNlckRlbGVnYXRpb25LZXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNpZ25lZE9pZCA9IHVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZE9iamVjdElkO1xuICAgICAgICAgICAgICAgIHRoaXMuc2lnbmVkVGVuYW50SWQgPSB1c2VyRGVsZWdhdGlvbktleS5zaWduZWRUZW5hbnRJZDtcbiAgICAgICAgICAgICAgICB0aGlzLnNpZ25lZFN0YXJ0c09uID0gdXNlckRlbGVnYXRpb25LZXkuc2lnbmVkU3RhcnRzT247XG4gICAgICAgICAgICAgICAgdGhpcy5zaWduZWRFeHBpcmVzT24gPSB1c2VyRGVsZWdhdGlvbktleS5zaWduZWRFeHBpcmVzT247XG4gICAgICAgICAgICAgICAgdGhpcy5zaWduZWRTZXJ2aWNlID0gdXNlckRlbGVnYXRpb25LZXkuc2lnbmVkU2VydmljZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNpZ25lZFZlcnNpb24gPSB1c2VyRGVsZWdhdGlvbktleS5zaWduZWRWZXJzaW9uO1xuICAgICAgICAgICAgICAgIHRoaXMucHJlYXV0aG9yaXplZEFnZW50T2JqZWN0SWQgPSBwcmVhdXRob3JpemVkQWdlbnRPYmplY3RJZDtcbiAgICAgICAgICAgICAgICB0aGlzLmNvcnJlbGF0aW9uSWQgPSBjb3JyZWxhdGlvbklkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsLiBJUCByYW5nZSBhbGxvd2VkIGZvciB0aGlzIFNBUy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBpcFJhbmdlKCkge1xuICAgICAgICBpZiAodGhpcy5pcFJhbmdlSW5uZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZW5kOiB0aGlzLmlwUmFuZ2VJbm5lci5lbmQsXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuaXBSYW5nZUlubmVyLnN0YXJ0LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGVzIGFsbCBTQVMgcXVlcnkgcGFyYW1ldGVycyBpbnRvIGEgc3RyaW5nIHRoYXQgY2FuIGJlIGFwcGVuZGVkIHRvIGEgVVJMLlxuICAgICAqXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IFtcbiAgICAgICAgICAgIFwic3ZcIixcbiAgICAgICAgICAgIFwic3NcIixcbiAgICAgICAgICAgIFwic3J0XCIsXG4gICAgICAgICAgICBcInNwclwiLFxuICAgICAgICAgICAgXCJzdFwiLFxuICAgICAgICAgICAgXCJzZVwiLFxuICAgICAgICAgICAgXCJzaXBcIixcbiAgICAgICAgICAgIFwic2lcIixcbiAgICAgICAgICAgIFwic2VzXCIsXG4gICAgICAgICAgICBcInNrb2lkXCIsXG4gICAgICAgICAgICBcInNrdGlkXCIsXG4gICAgICAgICAgICBcInNrdFwiLFxuICAgICAgICAgICAgXCJza2VcIixcbiAgICAgICAgICAgIFwic2tzXCIsXG4gICAgICAgICAgICBcInNrdlwiLFxuICAgICAgICAgICAgXCJzclwiLFxuICAgICAgICAgICAgXCJzcFwiLFxuICAgICAgICAgICAgXCJzaWdcIixcbiAgICAgICAgICAgIFwicnNjY1wiLFxuICAgICAgICAgICAgXCJyc2NkXCIsXG4gICAgICAgICAgICBcInJzY2VcIixcbiAgICAgICAgICAgIFwicnNjbFwiLFxuICAgICAgICAgICAgXCJyc2N0XCIsXG4gICAgICAgICAgICBcInNhb2lkXCIsXG4gICAgICAgICAgICBcInNjaWRcIixcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgcXVlcmllcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtcykge1xuICAgICAgICAgICAgc3dpdGNoIChwYXJhbSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdlwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLnZlcnNpb24pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3NcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5zZXJ2aWNlcyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzcnRcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5yZXNvdXJjZVR5cGVzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNwclwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLnByb3RvY29sKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0XCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMuc3RhcnRzT24gPyB0cnVuY2F0ZWRJU084MDYxRGF0ZSh0aGlzLnN0YXJ0c09uLCBmYWxzZSkgOiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic2VcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5leHBpcmVzT24gPyB0cnVuY2F0ZWRJU084MDYxRGF0ZSh0aGlzLmV4cGlyZXNPbiwgZmFsc2UpIDogdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNpcFwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLmlwUmFuZ2UgPyBpcFJhbmdlVG9TdHJpbmcodGhpcy5pcFJhbmdlKSA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzaVwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLmlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic2VzXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMuZW5jcnlwdGlvblNjb3BlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNrb2lkXCI6IC8vIFNpZ25lZCBvYmplY3QgSURcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5zaWduZWRPaWQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic2t0aWRcIjogLy8gU2lnbmVkIHRlbmFudCBJRFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLnNpZ25lZFRlbmFudElkKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNrdFwiOiAvLyBTaWduZWQga2V5IHN0YXJ0IHRpbWVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5zaWduZWRTdGFydHNPbiA/IHRydW5jYXRlZElTTzgwNjFEYXRlKHRoaXMuc2lnbmVkU3RhcnRzT24sIGZhbHNlKSA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJza2VcIjogLy8gU2lnbmVkIGtleSBleHBpcnkgdGltZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLnNpZ25lZEV4cGlyZXNPbiA/IHRydW5jYXRlZElTTzgwNjFEYXRlKHRoaXMuc2lnbmVkRXhwaXJlc09uLCBmYWxzZSkgOiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic2tzXCI6IC8vIFNpZ25lZCBrZXkgc2VydmljZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLnNpZ25lZFNlcnZpY2UpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic2t2XCI6IC8vIFNpZ25lZCBrZXkgdmVyc2lvblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLnNpZ25lZFZlcnNpb24pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3JcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5yZXNvdXJjZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzcFwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLnBlcm1pc3Npb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNpZ1wiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLnNpZ25hdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJyc2NjXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMuY2FjaGVDb250cm9sKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInJzY2RcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5jb250ZW50RGlzcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwicnNjZVwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLmNvbnRlbnRFbmNvZGluZyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJyc2NsXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMuY29udGVudExhbmd1YWdlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInJzY3RcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5jb250ZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzYW9pZFwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLnByZWF1dGhvcml6ZWRBZ2VudE9iamVjdElkKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNjaWRcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHF1ZXJpZXMuam9pbihcIiZcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJpdmF0ZSBoZWxwZXIgbWV0aG9kIHVzZWQgdG8gZmlsdGVyIGFuZCBhcHBlbmQgcXVlcnkga2V5L3ZhbHVlIHBhaXJzIGludG8gYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcXVlcmllcyAtXG4gICAgICogQHBhcmFtIGtleSAtXG4gICAgICogQHBhcmFtIHZhbHVlIC1cbiAgICAgKi9cbiAgICB0cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBrZXkgPSBlbmNvZGVVUklDb21wb25lbnQoa2V5KTtcbiAgICAgICAgdmFsdWUgPSBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICAgICAgICBpZiAoa2V5Lmxlbmd0aCA+IDAgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcXVlcmllcy5wdXNoKGAke2tleX09JHt2YWx1ZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNBU1F1ZXJ5UGFyYW1ldGVycy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEJsb2JTQVNQZXJtaXNzaW9ucyB9IGZyb20gXCIuL0Jsb2JTQVNQZXJtaXNzaW9uc1wiO1xuaW1wb3J0IHsgQ29udGFpbmVyU0FTUGVybWlzc2lvbnMgfSBmcm9tIFwiLi9Db250YWluZXJTQVNQZXJtaXNzaW9uc1wiO1xuaW1wb3J0IHsgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwgfSBmcm9tIFwiLi4vY3JlZGVudGlhbHMvU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxcIjtcbmltcG9ydCB7IFVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbCB9IGZyb20gXCIuLi9jcmVkZW50aWFscy9Vc2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWxcIjtcbmltcG9ydCB7IGlwUmFuZ2VUb1N0cmluZyB9IGZyb20gXCIuL1Nhc0lQUmFuZ2VcIjtcbmltcG9ydCB7IFNBU1F1ZXJ5UGFyYW1ldGVycyB9IGZyb20gXCIuL1NBU1F1ZXJ5UGFyYW1ldGVyc1wiO1xuaW1wb3J0IHsgU0VSVklDRV9WRVJTSU9OIH0gZnJvbSBcIi4uL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdHJ1bmNhdGVkSVNPODA2MURhdGUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHMuY29tbW9uXCI7XG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMsIHNoYXJlZEtleUNyZWRlbnRpYWxPclVzZXJEZWxlZ2F0aW9uS2V5LCBhY2NvdW50TmFtZSkge1xuICAgIGNvbnN0IHZlcnNpb24gPSBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24gPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24gOiBTRVJWSUNFX1ZFUlNJT047XG4gICAgY29uc3Qgc2hhcmVkS2V5Q3JlZGVudGlhbCA9IHNoYXJlZEtleUNyZWRlbnRpYWxPclVzZXJEZWxlZ2F0aW9uS2V5IGluc3RhbmNlb2YgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxcbiAgICAgICAgPyBzaGFyZWRLZXlDcmVkZW50aWFsT3JVc2VyRGVsZWdhdGlvbktleVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBsZXQgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsO1xuICAgIGlmIChzaGFyZWRLZXlDcmVkZW50aWFsID09PSB1bmRlZmluZWQgJiYgYWNjb3VudE5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwgPSBuZXcgVXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsKGFjY291bnROYW1lLCBzaGFyZWRLZXlDcmVkZW50aWFsT3JVc2VyRGVsZWdhdGlvbktleSk7XG4gICAgfVxuICAgIGlmIChzaGFyZWRLZXlDcmVkZW50aWFsID09PSB1bmRlZmluZWQgJiYgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSW52YWxpZCBzaGFyZWRLZXlDcmVkZW50aWFsLCB1c2VyRGVsZWdhdGlvbktleSBvciBhY2NvdW50TmFtZS5cIik7XG4gICAgfVxuICAgIC8vIFZlcnNpb24gMjAyMC0xMi0wNiBhZGRzIHN1cHBvcnQgZm9yIGVuY3J5cHRpb25zY29wZSBpbiBTQVMuXG4gICAgaWYgKHZlcnNpb24gPj0gXCIyMDIwLTEyLTA2XCIpIHtcbiAgICAgICAgaWYgKHNoYXJlZEtleUNyZWRlbnRpYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlQmxvYlNBU1F1ZXJ5UGFyYW1ldGVyczIwMjAxMjA2KGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMsIHNoYXJlZEtleUNyZWRlbnRpYWwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlQmxvYlNBU1F1ZXJ5UGFyYW1ldGVyc1VESzIwMjAxMjA2KGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMsIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVmVyc2lvbiAyMDE5LTEyLTEyIGFkZHMgc3VwcG9ydCBmb3IgdGhlIGJsb2IgdGFncyBwZXJtaXNzaW9uLlxuICAgIC8vIFZlcnNpb24gMjAxOC0xMS0wOSBhZGRzIHN1cHBvcnQgZm9yIHRoZSBzaWduZWQgcmVzb3VyY2UgYW5kIHNpZ25lZCBibG9iIHNuYXBzaG90IHRpbWUgZmllbGRzLlxuICAgIC8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9jb25zdHJ1Y3RpbmctYS1zZXJ2aWNlLXNhcyNjb25zdHJ1Y3RpbmctdGhlLXNpZ25hdHVyZS1zdHJpbmdcbiAgICBpZiAodmVyc2lvbiA+PSBcIjIwMTgtMTEtMDlcIikge1xuICAgICAgICBpZiAoc2hhcmVkS2V5Q3JlZGVudGlhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzMjAxODExMDkoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcywgc2hhcmVkS2V5Q3JlZGVudGlhbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBWZXJzaW9uIDIwMjAtMDItMTAgZGVsZWdhdGlvbiBTQVMgc2lnbmF0dXJlIGNvbnN0cnVjdGlvbiBpbmNsdWRlcyBwcmVhdXRob3JpemVkQWdlbnRPYmplY3RJZCwgYWdlbnRPYmplY3RJZCwgY29ycmVsYXRpb25JZC5cbiAgICAgICAgICAgIGlmICh2ZXJzaW9uID49IFwiMjAyMC0wMi0xMFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlQmxvYlNBU1F1ZXJ5UGFyYW1ldGVyc1VESzIwMjAwMjEwKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMsIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzVURLMjAxODExMDkoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcywgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodmVyc2lvbiA+PSBcIjIwMTUtMDQtMDVcIikge1xuICAgICAgICBpZiAoc2hhcmVkS2V5Q3JlZGVudGlhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzMjAxNTA0MDUoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcywgc2hhcmVkS2V5Q3JlZGVudGlhbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIid2ZXJzaW9uJyBtdXN0IGJlID49ICcyMDE4LTExLTA5JyB3aGVuIGdlbmVyYXRpbmcgdXNlciBkZWxlZ2F0aW9uIFNBUyB1c2luZyB1c2VyIGRlbGVnYXRpb24ga2V5LlwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIid2ZXJzaW9uJyBtdXN0IGJlID49ICcyMDE1LTA0LTA1Jy5cIik7XG59XG4vKipcbiAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAqIElNUExFTUVOVEFUSU9OIEZPUiBBUEkgVkVSU0lPTiBGUk9NIDIwMTUtMDQtMDUgQU5EIEJFRk9SRSAyMDE4LTExLTA5LlxuICpcbiAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgU0FTUXVlcnlQYXJhbWV0ZXJzLlxuICpcbiAqIE9ubHkgYWNjZXB0cyByZXF1aXJlZCBzZXR0aW5ncyBuZWVkZWQgdG8gY3JlYXRlIGEgU0FTLiBGb3Igb3B0aW9uYWwgc2V0dGluZ3MgcGxlYXNlXG4gKiBzZXQgY29ycmVzcG9uZGluZyBwcm9wZXJ0aWVzIGRpcmVjdGx5LCBzdWNoIGFzIHBlcm1pc3Npb25zLCBzdGFydHNPbiBhbmQgaWRlbnRpZmllci5cbiAqXG4gKiBXQVJOSU5HOiBXaGVuIGlkZW50aWZpZXIgaXMgbm90IHByb3ZpZGVkLCBwZXJtaXNzaW9ucyBhbmQgZXhwaXJlc09uIGFyZSByZXF1aXJlZC5cbiAqIFlvdSBNVVNUIGFzc2lnbiB2YWx1ZSB0byBpZGVudGlmaWVyIG9yIGV4cGlyZXNPbiAmIHBlcm1pc3Npb25zIG1hbnVhbGx5IGlmIHlvdSBpbml0aWFsIHdpdGhcbiAqIHRoaXMgY29uc3RydWN0b3IuXG4gKlxuICogQHBhcmFtIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMgLVxuICogQHBhcmFtIHNoYXJlZEtleUNyZWRlbnRpYWwgLVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUJsb2JTQVNRdWVyeVBhcmFtZXRlcnMyMDE1MDQwNShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLCBzaGFyZWRLZXlDcmVkZW50aWFsKSB7XG4gICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcyA9IFNBU1NpZ25hdHVyZVZhbHVlc1Nhbml0eUNoZWNrQW5kQXV0b2ZpbGwoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcyk7XG4gICAgaWYgKCFibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlkZW50aWZpZXIgJiZcbiAgICAgICAgIShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zICYmIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uKSkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk11c3QgcHJvdmlkZSAncGVybWlzc2lvbnMnIGFuZCAnZXhwaXJlc09uJyBmb3IgQmxvYiBTQVMgZ2VuZXJhdGlvbiB3aGVuICdpZGVudGlmaWVyJyBpcyBub3QgcHJvdmlkZWQuXCIpO1xuICAgIH1cbiAgICBsZXQgcmVzb3VyY2UgPSBcImNcIjtcbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSkge1xuICAgICAgICByZXNvdXJjZSA9IFwiYlwiO1xuICAgIH1cbiAgICAvLyBDYWxsaW5nIHBhcnNlIGFuZCB0b1N0cmluZyBndWFyYW50ZWVzIHRoZSBwcm9wZXIgb3JkZXJpbmcgYW5kIHRocm93cyBvbiBpbnZhbGlkIGNoYXJhY3RlcnMuXG4gICAgbGV0IHZlcmlmaWVkUGVybWlzc2lvbnM7XG4gICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMpIHtcbiAgICAgICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuYmxvYk5hbWUpIHtcbiAgICAgICAgICAgIHZlcmlmaWVkUGVybWlzc2lvbnMgPSBCbG9iU0FTUGVybWlzc2lvbnMucGFyc2UoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy50b1N0cmluZygpKS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmVyaWZpZWRQZXJtaXNzaW9ucyA9IENvbnRhaW5lclNBU1Blcm1pc3Npb25zLnBhcnNlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMudG9TdHJpbmcoKSkudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBTaWduYXR1cmUgaXMgZ2VuZXJhdGVkIG9uIHRoZSB1bi11cmwtZW5jb2RlZCB2YWx1ZXMuXG4gICAgY29uc3Qgc3RyaW5nVG9TaWduID0gW1xuICAgICAgICB2ZXJpZmllZFBlcm1pc3Npb25zID8gdmVyaWZpZWRQZXJtaXNzaW9ucyA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT25cbiAgICAgICAgICAgID8gdHJ1bmNhdGVkSVNPODA2MURhdGUoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPbiwgZmFsc2UpXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uXG4gICAgICAgICAgICA/IHRydW5jYXRlZElTTzgwNjFEYXRlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uLCBmYWxzZSlcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgZ2V0Q2Fub25pY2FsTmFtZShzaGFyZWRLZXlDcmVkZW50aWFsLmFjY291bnROYW1lLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRhaW5lck5hbWUsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuYmxvYk5hbWUpLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlkZW50aWZpZXIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSA/IGlwUmFuZ2VUb1N0cmluZyhibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UpIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wcm90b2NvbCA/IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24sXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY2FjaGVDb250cm9sID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jYWNoZUNvbnRyb2wgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnREaXNwb3NpdGlvbiA/IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudERpc3Bvc2l0aW9uIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RW5jb2RpbmcgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRFbmNvZGluZyA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudExhbmd1YWdlID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50TGFuZ3VhZ2UgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRUeXBlID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50VHlwZSA6IFwiXCIsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHNoYXJlZEtleUNyZWRlbnRpYWwuY29tcHV0ZUhNQUNTSEEyNTYoc3RyaW5nVG9TaWduKTtcbiAgICByZXR1cm4gbmV3IFNBU1F1ZXJ5UGFyYW1ldGVycyhibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24sIHNpZ25hdHVyZSwgdmVyaWZpZWRQZXJtaXNzaW9ucywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT24sIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaWRlbnRpZmllciwgcmVzb3VyY2UsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY2FjaGVDb250cm9sLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnREaXNwb3NpdGlvbiwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RW5jb2RpbmcsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudExhbmd1YWdlLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRUeXBlKTtcbn1cbi8qKlxuICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICogSU1QTEVNRU5UQVRJT04gRk9SIEFQSSBWRVJTSU9OIEZST00gMjAxOC0xMS0wOS5cbiAqXG4gKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFNBU1F1ZXJ5UGFyYW1ldGVycy5cbiAqXG4gKiBPbmx5IGFjY2VwdHMgcmVxdWlyZWQgc2V0dGluZ3MgbmVlZGVkIHRvIGNyZWF0ZSBhIFNBUy4gRm9yIG9wdGlvbmFsIHNldHRpbmdzIHBsZWFzZVxuICogc2V0IGNvcnJlc3BvbmRpbmcgcHJvcGVydGllcyBkaXJlY3RseSwgc3VjaCBhcyBwZXJtaXNzaW9ucywgc3RhcnRzT24gYW5kIGlkZW50aWZpZXIuXG4gKlxuICogV0FSTklORzogV2hlbiBpZGVudGlmaWVyIGlzIG5vdCBwcm92aWRlZCwgcGVybWlzc2lvbnMgYW5kIGV4cGlyZXNPbiBhcmUgcmVxdWlyZWQuXG4gKiBZb3UgTVVTVCBhc3NpZ24gdmFsdWUgdG8gaWRlbnRpZmllciBvciBleHBpcmVzT24gJiBwZXJtaXNzaW9ucyBtYW51YWxseSBpZiB5b3UgaW5pdGlhbCB3aXRoXG4gKiB0aGlzIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBwYXJhbSBibG9iU0FTU2lnbmF0dXJlVmFsdWVzIC1cbiAqIEBwYXJhbSBzaGFyZWRLZXlDcmVkZW50aWFsIC1cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzMjAxODExMDkoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcywgc2hhcmVkS2V5Q3JlZGVudGlhbCkge1xuICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMgPSBTQVNTaWduYXR1cmVWYWx1ZXNTYW5pdHlDaGVja0FuZEF1dG9maWxsKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMpO1xuICAgIGlmICghYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pZGVudGlmaWVyICYmXG4gICAgICAgICEoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucyAmJiBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNdXN0IHByb3ZpZGUgJ3Blcm1pc3Npb25zJyBhbmQgJ2V4cGlyZXNPbicgZm9yIEJsb2IgU0FTIGdlbmVyYXRpb24gd2hlbiAnaWRlbnRpZmllcicgaXMgbm90IHByb3ZpZGVkLlwiKTtcbiAgICB9XG4gICAgbGV0IHJlc291cmNlID0gXCJjXCI7XG4gICAgbGV0IHRpbWVzdGFtcCA9IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc25hcHNob3RUaW1lO1xuICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmJsb2JOYW1lKSB7XG4gICAgICAgIHJlc291cmNlID0gXCJiXCI7XG4gICAgICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnNuYXBzaG90VGltZSkge1xuICAgICAgICAgICAgcmVzb3VyY2UgPSBcImJzXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uSWQpIHtcbiAgICAgICAgICAgIHJlc291cmNlID0gXCJidlwiO1xuICAgICAgICAgICAgdGltZXN0YW1wID0gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uSWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2FsbGluZyBwYXJzZSBhbmQgdG9TdHJpbmcgZ3VhcmFudGVlcyB0aGUgcHJvcGVyIG9yZGVyaW5nIGFuZCB0aHJvd3Mgb24gaW52YWxpZCBjaGFyYWN0ZXJzLlxuICAgIGxldCB2ZXJpZmllZFBlcm1pc3Npb25zO1xuICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zKSB7XG4gICAgICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmJsb2JOYW1lKSB7XG4gICAgICAgICAgICB2ZXJpZmllZFBlcm1pc3Npb25zID0gQmxvYlNBU1Blcm1pc3Npb25zLnBhcnNlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMudG9TdHJpbmcoKSkudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZlcmlmaWVkUGVybWlzc2lvbnMgPSBDb250YWluZXJTQVNQZXJtaXNzaW9ucy5wYXJzZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLnRvU3RyaW5nKCkpLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU2lnbmF0dXJlIGlzIGdlbmVyYXRlZCBvbiB0aGUgdW4tdXJsLWVuY29kZWQgdmFsdWVzLlxuICAgIGNvbnN0IHN0cmluZ1RvU2lnbiA9IFtcbiAgICAgICAgdmVyaWZpZWRQZXJtaXNzaW9ucyA/IHZlcmlmaWVkUGVybWlzc2lvbnMgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uXG4gICAgICAgICAgICA/IHRydW5jYXRlZElTTzgwNjFEYXRlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT24sIGZhbHNlKVxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPblxuICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPbiwgZmFsc2UpXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgIGdldENhbm9uaWNhbE5hbWUoc2hhcmVkS2V5Q3JlZGVudGlhbC5hY2NvdW50TmFtZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250YWluZXJOYW1lLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmJsb2JOYW1lKSxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pZGVudGlmaWVyLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UgPyBpcFJhbmdlVG9TdHJpbmcoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pcFJhbmdlKSA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnByb3RvY29sIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uLFxuICAgICAgICByZXNvdXJjZSxcbiAgICAgICAgdGltZXN0YW1wLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNhY2hlQ29udHJvbCA/IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY2FjaGVDb250cm9sIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RGlzcG9zaXRpb24gPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnREaXNwb3NpdGlvbiA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudEVuY29kaW5nID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RW5jb2RpbmcgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRMYW5ndWFnZSA/IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudExhbmd1YWdlIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50VHlwZSA/IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudFR5cGUgOiBcIlwiLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBzaGFyZWRLZXlDcmVkZW50aWFsLmNvbXB1dGVITUFDU0hBMjU2KHN0cmluZ1RvU2lnbik7XG4gICAgcmV0dXJuIG5ldyBTQVNRdWVyeVBhcmFtZXRlcnMoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uLCBzaWduYXR1cmUsIHZlcmlmaWVkUGVybWlzc2lvbnMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnByb3RvY29sLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPbiwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pcFJhbmdlLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlkZW50aWZpZXIsIHJlc291cmNlLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNhY2hlQ29udHJvbCwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RGlzcG9zaXRpb24sIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudEVuY29kaW5nLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRMYW5ndWFnZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50VHlwZSk7XG59XG4vKipcbiAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAqIElNUExFTUVOVEFUSU9OIEZPUiBBUEkgVkVSU0lPTiBGUk9NIDIwMjAtMTItMDYuXG4gKlxuICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBTQVNRdWVyeVBhcmFtZXRlcnMuXG4gKlxuICogT25seSBhY2NlcHRzIHJlcXVpcmVkIHNldHRpbmdzIG5lZWRlZCB0byBjcmVhdGUgYSBTQVMuIEZvciBvcHRpb25hbCBzZXR0aW5ncyBwbGVhc2VcbiAqIHNldCBjb3JyZXNwb25kaW5nIHByb3BlcnRpZXMgZGlyZWN0bHksIHN1Y2ggYXMgcGVybWlzc2lvbnMsIHN0YXJ0c09uIGFuZCBpZGVudGlmaWVyLlxuICpcbiAqIFdBUk5JTkc6IFdoZW4gaWRlbnRpZmllciBpcyBub3QgcHJvdmlkZWQsIHBlcm1pc3Npb25zIGFuZCBleHBpcmVzT24gYXJlIHJlcXVpcmVkLlxuICogWW91IE1VU1QgYXNzaWduIHZhbHVlIHRvIGlkZW50aWZpZXIgb3IgZXhwaXJlc09uICYgcGVybWlzc2lvbnMgbWFudWFsbHkgaWYgeW91IGluaXRpYWwgd2l0aFxuICogdGhpcyBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcGFyYW0gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcyAtXG4gKiBAcGFyYW0gc2hhcmVkS2V5Q3JlZGVudGlhbCAtXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlQmxvYlNBU1F1ZXJ5UGFyYW1ldGVyczIwMjAxMjA2KGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMsIHNoYXJlZEtleUNyZWRlbnRpYWwpIHtcbiAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzID0gU0FTU2lnbmF0dXJlVmFsdWVzU2FuaXR5Q2hlY2tBbmRBdXRvZmlsbChibG9iU0FTU2lnbmF0dXJlVmFsdWVzKTtcbiAgICBpZiAoIWJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaWRlbnRpZmllciAmJlxuICAgICAgICAhKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMgJiYgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT24pKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTXVzdCBwcm92aWRlICdwZXJtaXNzaW9ucycgYW5kICdleHBpcmVzT24nIGZvciBCbG9iIFNBUyBnZW5lcmF0aW9uIHdoZW4gJ2lkZW50aWZpZXInIGlzIG5vdCBwcm92aWRlZC5cIik7XG4gICAgfVxuICAgIGxldCByZXNvdXJjZSA9IFwiY1wiO1xuICAgIGxldCB0aW1lc3RhbXAgPSBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnNuYXBzaG90VGltZTtcbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSkge1xuICAgICAgICByZXNvdXJjZSA9IFwiYlwiO1xuICAgICAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zbmFwc2hvdFRpbWUpIHtcbiAgICAgICAgICAgIHJlc291cmNlID0gXCJic1wiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbklkKSB7XG4gICAgICAgICAgICByZXNvdXJjZSA9IFwiYnZcIjtcbiAgICAgICAgICAgIHRpbWVzdGFtcCA9IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbklkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENhbGxpbmcgcGFyc2UgYW5kIHRvU3RyaW5nIGd1YXJhbnRlZXMgdGhlIHByb3BlciBvcmRlcmluZyBhbmQgdGhyb3dzIG9uIGludmFsaWQgY2hhcmFjdGVycy5cbiAgICBsZXQgdmVyaWZpZWRQZXJtaXNzaW9ucztcbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucykge1xuICAgICAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSkge1xuICAgICAgICAgICAgdmVyaWZpZWRQZXJtaXNzaW9ucyA9IEJsb2JTQVNQZXJtaXNzaW9ucy5wYXJzZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLnRvU3RyaW5nKCkpLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2ZXJpZmllZFBlcm1pc3Npb25zID0gQ29udGFpbmVyU0FTUGVybWlzc2lvbnMucGFyc2UoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy50b1N0cmluZygpKS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNpZ25hdHVyZSBpcyBnZW5lcmF0ZWQgb24gdGhlIHVuLXVybC1lbmNvZGVkIHZhbHVlcy5cbiAgICBjb25zdCBzdHJpbmdUb1NpZ24gPSBbXG4gICAgICAgIHZlcmlmaWVkUGVybWlzc2lvbnMgPyB2ZXJpZmllZFBlcm1pc3Npb25zIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPblxuICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uLCBmYWxzZSlcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT25cbiAgICAgICAgICAgID8gdHJ1bmNhdGVkSVNPODA2MURhdGUoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT24sIGZhbHNlKVxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgICBnZXRDYW5vbmljYWxOYW1lKHNoYXJlZEtleUNyZWRlbnRpYWwuYWNjb3VudE5hbWUsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGFpbmVyTmFtZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSksXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaWRlbnRpZmllcixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pcFJhbmdlID8gaXBSYW5nZVRvU3RyaW5nKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSkgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnByb3RvY29sID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wcm90b2NvbCA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbixcbiAgICAgICAgcmVzb3VyY2UsXG4gICAgICAgIHRpbWVzdGFtcCxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5lbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY2FjaGVDb250cm9sID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jYWNoZUNvbnRyb2wgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnREaXNwb3NpdGlvbiA/IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudERpc3Bvc2l0aW9uIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RW5jb2RpbmcgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRFbmNvZGluZyA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudExhbmd1YWdlID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50TGFuZ3VhZ2UgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRUeXBlID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50VHlwZSA6IFwiXCIsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHNoYXJlZEtleUNyZWRlbnRpYWwuY29tcHV0ZUhNQUNTSEEyNTYoc3RyaW5nVG9TaWduKTtcbiAgICByZXR1cm4gbmV3IFNBU1F1ZXJ5UGFyYW1ldGVycyhibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24sIHNpZ25hdHVyZSwgdmVyaWZpZWRQZXJtaXNzaW9ucywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT24sIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaWRlbnRpZmllciwgcmVzb3VyY2UsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY2FjaGVDb250cm9sLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnREaXNwb3NpdGlvbiwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RW5jb2RpbmcsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudExhbmd1YWdlLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRUeXBlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmVuY3J5cHRpb25TY29wZSk7XG59XG4vKipcbiAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAqIElNUExFTUVOVEFUSU9OIEZPUiBBUEkgVkVSU0lPTiBGUk9NIDIwMTgtMTEtMDkuXG4gKlxuICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBTQVNRdWVyeVBhcmFtZXRlcnMuXG4gKlxuICogT25seSBhY2NlcHRzIHJlcXVpcmVkIHNldHRpbmdzIG5lZWRlZCB0byBjcmVhdGUgYSBTQVMuIEZvciBvcHRpb25hbCBzZXR0aW5ncyBwbGVhc2VcbiAqIHNldCBjb3JyZXNwb25kaW5nIHByb3BlcnRpZXMgZGlyZWN0bHksIHN1Y2ggYXMgcGVybWlzc2lvbnMsIHN0YXJ0c09uLlxuICpcbiAqIFdBUk5JTkc6IGlkZW50aWZpZXIgd2lsbCBiZSBpZ25vcmVkLCBwZXJtaXNzaW9ucyBhbmQgZXhwaXJlc09uIGFyZSByZXF1aXJlZC5cbiAqXG4gKiBAcGFyYW0gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcyAtXG4gKiBAcGFyYW0gdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsIC1cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzVURLMjAxODExMDkoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcywgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsKSB7XG4gICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcyA9IFNBU1NpZ25hdHVyZVZhbHVlc1Nhbml0eUNoZWNrQW5kQXV0b2ZpbGwoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcyk7XG4gICAgLy8gU3RvcmVkIGFjY2VzcyBwb2xpY2llcyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgYSB1c2VyIGRlbGVnYXRpb24gU0FTLlxuICAgIGlmICghYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucyB8fCAhYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT24pIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNdXN0IHByb3ZpZGUgJ3Blcm1pc3Npb25zJyBhbmQgJ2V4cGlyZXNPbicgZm9yIEJsb2IgU0FTIGdlbmVyYXRpb24gd2hlbiBnZW5lcmF0aW5nIHVzZXIgZGVsZWdhdGlvbiBTQVMuXCIpO1xuICAgIH1cbiAgICBsZXQgcmVzb3VyY2UgPSBcImNcIjtcbiAgICBsZXQgdGltZXN0YW1wID0gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zbmFwc2hvdFRpbWU7XG4gICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuYmxvYk5hbWUpIHtcbiAgICAgICAgcmVzb3VyY2UgPSBcImJcIjtcbiAgICAgICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc25hcHNob3RUaW1lKSB7XG4gICAgICAgICAgICByZXNvdXJjZSA9IFwiYnNcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb25JZCkge1xuICAgICAgICAgICAgcmVzb3VyY2UgPSBcImJ2XCI7XG4gICAgICAgICAgICB0aW1lc3RhbXAgPSBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb25JZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDYWxsaW5nIHBhcnNlIGFuZCB0b1N0cmluZyBndWFyYW50ZWVzIHRoZSBwcm9wZXIgb3JkZXJpbmcgYW5kIHRocm93cyBvbiBpbnZhbGlkIGNoYXJhY3RlcnMuXG4gICAgbGV0IHZlcmlmaWVkUGVybWlzc2lvbnM7XG4gICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMpIHtcbiAgICAgICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuYmxvYk5hbWUpIHtcbiAgICAgICAgICAgIHZlcmlmaWVkUGVybWlzc2lvbnMgPSBCbG9iU0FTUGVybWlzc2lvbnMucGFyc2UoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy50b1N0cmluZygpKS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmVyaWZpZWRQZXJtaXNzaW9ucyA9IENvbnRhaW5lclNBU1Blcm1pc3Npb25zLnBhcnNlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMudG9TdHJpbmcoKSkudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBTaWduYXR1cmUgaXMgZ2VuZXJhdGVkIG9uIHRoZSB1bi11cmwtZW5jb2RlZCB2YWx1ZXMuXG4gICAgY29uc3Qgc3RyaW5nVG9TaWduID0gW1xuICAgICAgICB2ZXJpZmllZFBlcm1pc3Npb25zID8gdmVyaWZpZWRQZXJtaXNzaW9ucyA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT25cbiAgICAgICAgICAgID8gdHJ1bmNhdGVkSVNPODA2MURhdGUoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPbiwgZmFsc2UpXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uXG4gICAgICAgICAgICA/IHRydW5jYXRlZElTTzgwNjFEYXRlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uLCBmYWxzZSlcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgZ2V0Q2Fub25pY2FsTmFtZSh1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwuYWNjb3VudE5hbWUsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGFpbmVyTmFtZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSksXG4gICAgICAgIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRPYmplY3RJZCxcbiAgICAgICAgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFRlbmFudElkLFxuICAgICAgICB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkU3RhcnRzT25cbiAgICAgICAgICAgID8gdHJ1bmNhdGVkSVNPODA2MURhdGUodXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFN0YXJ0c09uLCBmYWxzZSlcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZEV4cGlyZXNPblxuICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZSh1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkRXhwaXJlc09uLCBmYWxzZSlcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFNlcnZpY2UsXG4gICAgICAgIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRWZXJzaW9uLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UgPyBpcFJhbmdlVG9TdHJpbmcoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pcFJhbmdlKSA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnByb3RvY29sIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uLFxuICAgICAgICByZXNvdXJjZSxcbiAgICAgICAgdGltZXN0YW1wLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNhY2hlQ29udHJvbCxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RGlzcG9zaXRpb24sXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudEVuY29kaW5nLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRMYW5ndWFnZSxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50VHlwZSxcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLmNvbXB1dGVITUFDU0hBMjU2KHN0cmluZ1RvU2lnbik7XG4gICAgcmV0dXJuIG5ldyBTQVNRdWVyeVBhcmFtZXRlcnMoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uLCBzaWduYXR1cmUsIHZlcmlmaWVkUGVybWlzc2lvbnMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnByb3RvY29sLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPbiwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pcFJhbmdlLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlkZW50aWZpZXIsIHJlc291cmNlLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNhY2hlQ29udHJvbCwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RGlzcG9zaXRpb24sIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudEVuY29kaW5nLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRMYW5ndWFnZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50VHlwZSwgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5KTtcbn1cbi8qKlxuICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICogSU1QTEVNRU5UQVRJT04gRk9SIEFQSSBWRVJTSU9OIEZST00gMjAyMC0wMi0xMC5cbiAqXG4gKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFNBU1F1ZXJ5UGFyYW1ldGVycy5cbiAqXG4gKiBPbmx5IGFjY2VwdHMgcmVxdWlyZWQgc2V0dGluZ3MgbmVlZGVkIHRvIGNyZWF0ZSBhIFNBUy4gRm9yIG9wdGlvbmFsIHNldHRpbmdzIHBsZWFzZVxuICogc2V0IGNvcnJlc3BvbmRpbmcgcHJvcGVydGllcyBkaXJlY3RseSwgc3VjaCBhcyBwZXJtaXNzaW9ucywgc3RhcnRzT24uXG4gKlxuICogV0FSTklORzogaWRlbnRpZmllciB3aWxsIGJlIGlnbm9yZWQsIHBlcm1pc3Npb25zIGFuZCBleHBpcmVzT24gYXJlIHJlcXVpcmVkLlxuICpcbiAqIEBwYXJhbSBibG9iU0FTU2lnbmF0dXJlVmFsdWVzIC1cbiAqIEBwYXJhbSB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwgLVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUJsb2JTQVNRdWVyeVBhcmFtZXRlcnNVREsyMDIwMDIxMChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLCB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwpIHtcbiAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzID0gU0FTU2lnbmF0dXJlVmFsdWVzU2FuaXR5Q2hlY2tBbmRBdXRvZmlsbChibG9iU0FTU2lnbmF0dXJlVmFsdWVzKTtcbiAgICAvLyBTdG9yZWQgYWNjZXNzIHBvbGljaWVzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBhIHVzZXIgZGVsZWdhdGlvbiBTQVMuXG4gICAgaWYgKCFibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zIHx8ICFibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPbikge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk11c3QgcHJvdmlkZSAncGVybWlzc2lvbnMnIGFuZCAnZXhwaXJlc09uJyBmb3IgQmxvYiBTQVMgZ2VuZXJhdGlvbiB3aGVuIGdlbmVyYXRpbmcgdXNlciBkZWxlZ2F0aW9uIFNBUy5cIik7XG4gICAgfVxuICAgIGxldCByZXNvdXJjZSA9IFwiY1wiO1xuICAgIGxldCB0aW1lc3RhbXAgPSBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnNuYXBzaG90VGltZTtcbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSkge1xuICAgICAgICByZXNvdXJjZSA9IFwiYlwiO1xuICAgICAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zbmFwc2hvdFRpbWUpIHtcbiAgICAgICAgICAgIHJlc291cmNlID0gXCJic1wiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbklkKSB7XG4gICAgICAgICAgICByZXNvdXJjZSA9IFwiYnZcIjtcbiAgICAgICAgICAgIHRpbWVzdGFtcCA9IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbklkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENhbGxpbmcgcGFyc2UgYW5kIHRvU3RyaW5nIGd1YXJhbnRlZXMgdGhlIHByb3BlciBvcmRlcmluZyBhbmQgdGhyb3dzIG9uIGludmFsaWQgY2hhcmFjdGVycy5cbiAgICBsZXQgdmVyaWZpZWRQZXJtaXNzaW9ucztcbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucykge1xuICAgICAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSkge1xuICAgICAgICAgICAgdmVyaWZpZWRQZXJtaXNzaW9ucyA9IEJsb2JTQVNQZXJtaXNzaW9ucy5wYXJzZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLnRvU3RyaW5nKCkpLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2ZXJpZmllZFBlcm1pc3Npb25zID0gQ29udGFpbmVyU0FTUGVybWlzc2lvbnMucGFyc2UoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy50b1N0cmluZygpKS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNpZ25hdHVyZSBpcyBnZW5lcmF0ZWQgb24gdGhlIHVuLXVybC1lbmNvZGVkIHZhbHVlcy5cbiAgICBjb25zdCBzdHJpbmdUb1NpZ24gPSBbXG4gICAgICAgIHZlcmlmaWVkUGVybWlzc2lvbnMgPyB2ZXJpZmllZFBlcm1pc3Npb25zIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPblxuICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uLCBmYWxzZSlcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT25cbiAgICAgICAgICAgID8gdHJ1bmNhdGVkSVNPODA2MURhdGUoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT24sIGZhbHNlKVxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgICBnZXRDYW5vbmljYWxOYW1lKHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC5hY2NvdW50TmFtZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250YWluZXJOYW1lLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmJsb2JOYW1lKSxcbiAgICAgICAgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZE9iamVjdElkLFxuICAgICAgICB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkVGVuYW50SWQsXG4gICAgICAgIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRTdGFydHNPblxuICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZSh1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkU3RhcnRzT24sIGZhbHNlKVxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgICB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkRXhwaXJlc09uXG4gICAgICAgICAgICA/IHRydW5jYXRlZElTTzgwNjFEYXRlKHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRFeHBpcmVzT24sIGZhbHNlKVxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgICB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkU2VydmljZSxcbiAgICAgICAgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFZlcnNpb24sXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJlYXV0aG9yaXplZEFnZW50T2JqZWN0SWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UgPyBpcFJhbmdlVG9TdHJpbmcoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pcFJhbmdlKSA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnByb3RvY29sIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uLFxuICAgICAgICByZXNvdXJjZSxcbiAgICAgICAgdGltZXN0YW1wLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNhY2hlQ29udHJvbCxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RGlzcG9zaXRpb24sXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudEVuY29kaW5nLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRMYW5ndWFnZSxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50VHlwZSxcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLmNvbXB1dGVITUFDU0hBMjU2KHN0cmluZ1RvU2lnbik7XG4gICAgcmV0dXJuIG5ldyBTQVNRdWVyeVBhcmFtZXRlcnMoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uLCBzaWduYXR1cmUsIHZlcmlmaWVkUGVybWlzc2lvbnMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnByb3RvY29sLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPbiwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pcFJhbmdlLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlkZW50aWZpZXIsIHJlc291cmNlLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNhY2hlQ29udHJvbCwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RGlzcG9zaXRpb24sIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudEVuY29kaW5nLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRMYW5ndWFnZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50VHlwZSwgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnByZWF1dGhvcml6ZWRBZ2VudE9iamVjdElkLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvcnJlbGF0aW9uSWQpO1xufVxuLyoqXG4gKiBPTkxZIEFWQUlMQUJMRSBJTiBOT0RFLkpTIFJVTlRJTUUuXG4gKiBJTVBMRU1FTlRBVElPTiBGT1IgQVBJIFZFUlNJT04gRlJPTSAyMDIwLTEyLTA2LlxuICpcbiAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgU0FTUXVlcnlQYXJhbWV0ZXJzLlxuICpcbiAqIE9ubHkgYWNjZXB0cyByZXF1aXJlZCBzZXR0aW5ncyBuZWVkZWQgdG8gY3JlYXRlIGEgU0FTLiBGb3Igb3B0aW9uYWwgc2V0dGluZ3MgcGxlYXNlXG4gKiBzZXQgY29ycmVzcG9uZGluZyBwcm9wZXJ0aWVzIGRpcmVjdGx5LCBzdWNoIGFzIHBlcm1pc3Npb25zLCBzdGFydHNPbi5cbiAqXG4gKiBXQVJOSU5HOiBpZGVudGlmaWVyIHdpbGwgYmUgaWdub3JlZCwgcGVybWlzc2lvbnMgYW5kIGV4cGlyZXNPbiBhcmUgcmVxdWlyZWQuXG4gKlxuICogQHBhcmFtIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMgLVxuICogQHBhcmFtIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbCAtXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlQmxvYlNBU1F1ZXJ5UGFyYW1ldGVyc1VESzIwMjAxMjA2KGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMsIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbCkge1xuICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMgPSBTQVNTaWduYXR1cmVWYWx1ZXNTYW5pdHlDaGVja0FuZEF1dG9maWxsKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMpO1xuICAgIC8vIFN0b3JlZCBhY2Nlc3MgcG9saWNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIGEgdXNlciBkZWxlZ2F0aW9uIFNBUy5cbiAgICBpZiAoIWJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMgfHwgIWJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTXVzdCBwcm92aWRlICdwZXJtaXNzaW9ucycgYW5kICdleHBpcmVzT24nIGZvciBCbG9iIFNBUyBnZW5lcmF0aW9uIHdoZW4gZ2VuZXJhdGluZyB1c2VyIGRlbGVnYXRpb24gU0FTLlwiKTtcbiAgICB9XG4gICAgbGV0IHJlc291cmNlID0gXCJjXCI7XG4gICAgbGV0IHRpbWVzdGFtcCA9IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc25hcHNob3RUaW1lO1xuICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmJsb2JOYW1lKSB7XG4gICAgICAgIHJlc291cmNlID0gXCJiXCI7XG4gICAgICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnNuYXBzaG90VGltZSkge1xuICAgICAgICAgICAgcmVzb3VyY2UgPSBcImJzXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uSWQpIHtcbiAgICAgICAgICAgIHJlc291cmNlID0gXCJidlwiO1xuICAgICAgICAgICAgdGltZXN0YW1wID0gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uSWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2FsbGluZyBwYXJzZSBhbmQgdG9TdHJpbmcgZ3VhcmFudGVlcyB0aGUgcHJvcGVyIG9yZGVyaW5nIGFuZCB0aHJvd3Mgb24gaW52YWxpZCBjaGFyYWN0ZXJzLlxuICAgIGxldCB2ZXJpZmllZFBlcm1pc3Npb25zO1xuICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zKSB7XG4gICAgICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmJsb2JOYW1lKSB7XG4gICAgICAgICAgICB2ZXJpZmllZFBlcm1pc3Npb25zID0gQmxvYlNBU1Blcm1pc3Npb25zLnBhcnNlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMudG9TdHJpbmcoKSkudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZlcmlmaWVkUGVybWlzc2lvbnMgPSBDb250YWluZXJTQVNQZXJtaXNzaW9ucy5wYXJzZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLnRvU3RyaW5nKCkpLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU2lnbmF0dXJlIGlzIGdlbmVyYXRlZCBvbiB0aGUgdW4tdXJsLWVuY29kZWQgdmFsdWVzLlxuICAgIGNvbnN0IHN0cmluZ1RvU2lnbiA9IFtcbiAgICAgICAgdmVyaWZpZWRQZXJtaXNzaW9ucyA/IHZlcmlmaWVkUGVybWlzc2lvbnMgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uXG4gICAgICAgICAgICA/IHRydW5jYXRlZElTTzgwNjFEYXRlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT24sIGZhbHNlKVxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPblxuICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPbiwgZmFsc2UpXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgIGdldENhbm9uaWNhbE5hbWUodXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLmFjY291bnROYW1lLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRhaW5lck5hbWUsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuYmxvYk5hbWUpLFxuICAgICAgICB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkT2JqZWN0SWQsXG4gICAgICAgIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRUZW5hbnRJZCxcbiAgICAgICAgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFN0YXJ0c09uXG4gICAgICAgICAgICA/IHRydW5jYXRlZElTTzgwNjFEYXRlKHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRTdGFydHNPbiwgZmFsc2UpXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRFeHBpcmVzT25cbiAgICAgICAgICAgID8gdHJ1bmNhdGVkSVNPODA2MURhdGUodXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZEV4cGlyZXNPbiwgZmFsc2UpXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRTZXJ2aWNlLFxuICAgICAgICB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkVmVyc2lvbixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wcmVhdXRob3JpemVkQWdlbnRPYmplY3RJZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSA/IGlwUmFuZ2VUb1N0cmluZyhibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UpIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wcm90b2NvbCA/IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24sXG4gICAgICAgIHJlc291cmNlLFxuICAgICAgICB0aW1lc3RhbXAsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNhY2hlQ29udHJvbCxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RGlzcG9zaXRpb24sXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudEVuY29kaW5nLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRMYW5ndWFnZSxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50VHlwZSxcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLmNvbXB1dGVITUFDU0hBMjU2KHN0cmluZ1RvU2lnbik7XG4gICAgcmV0dXJuIG5ldyBTQVNRdWVyeVBhcmFtZXRlcnMoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uLCBzaWduYXR1cmUsIHZlcmlmaWVkUGVybWlzc2lvbnMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnByb3RvY29sLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPbiwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pcFJhbmdlLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlkZW50aWZpZXIsIHJlc291cmNlLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNhY2hlQ29udHJvbCwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RGlzcG9zaXRpb24sIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudEVuY29kaW5nLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRMYW5ndWFnZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50VHlwZSwgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnByZWF1dGhvcml6ZWRBZ2VudE9iamVjdElkLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvcnJlbGF0aW9uSWQsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZW5jcnlwdGlvblNjb3BlKTtcbn1cbmZ1bmN0aW9uIGdldENhbm9uaWNhbE5hbWUoYWNjb3VudE5hbWUsIGNvbnRhaW5lck5hbWUsIGJsb2JOYW1lKSB7XG4gICAgLy8gQ29udGFpbmVyOiBcIi9ibG9iL2FjY291bnQvY29udGFpbmVyTmFtZVwiXG4gICAgLy8gQmxvYjogICAgICBcIi9ibG9iL2FjY291bnQvY29udGFpbmVyTmFtZS9ibG9iTmFtZVwiXG4gICAgY29uc3QgZWxlbWVudHMgPSBbYC9ibG9iLyR7YWNjb3VudE5hbWV9LyR7Y29udGFpbmVyTmFtZX1gXTtcbiAgICBpZiAoYmxvYk5hbWUpIHtcbiAgICAgICAgZWxlbWVudHMucHVzaChgLyR7YmxvYk5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50cy5qb2luKFwiXCIpO1xufVxuZnVuY3Rpb24gU0FTU2lnbmF0dXJlVmFsdWVzU2FuaXR5Q2hlY2tBbmRBdXRvZmlsbChibG9iU0FTU2lnbmF0dXJlVmFsdWVzKSB7XG4gICAgY29uc3QgdmVyc2lvbiA9IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbiA/IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbiA6IFNFUlZJQ0VfVkVSU0lPTjtcbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zbmFwc2hvdFRpbWUgJiYgdmVyc2lvbiA8IFwiMjAxOC0xMS0wOVwiKSB7XG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCIndmVyc2lvbicgbXVzdCBiZSA+PSAnMjAxOC0xMS0wOScgd2hlbiBwcm92aWRpbmcgJ3NuYXBzaG90VGltZScuXCIpO1xuICAgIH1cbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSA9PT0gdW5kZWZpbmVkICYmIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc25hcHNob3RUaW1lKSB7XG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJNdXN0IHByb3ZpZGUgJ2Jsb2JOYW1lJyB3aGVuIHByb3ZpZGluZyAnc25hcHNob3RUaW1lJy5cIik7XG4gICAgfVxuICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb25JZCAmJiB2ZXJzaW9uIDwgXCIyMDE5LTEwLTEwXCIpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIid2ZXJzaW9uJyBtdXN0IGJlID49ICcyMDE5LTEwLTEwJyB3aGVuIHByb3ZpZGluZyAndmVyc2lvbklkJy5cIik7XG4gICAgfVxuICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmJsb2JOYW1lID09PSB1bmRlZmluZWQgJiYgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uSWQpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIk11c3QgcHJvdmlkZSAnYmxvYk5hbWUnIHdoZW4gcHJvdmlkaW5nICd2ZXJzaW9uSWQnLlwiKTtcbiAgICB9XG4gICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMgJiZcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy5zZXRJbW11dGFiaWxpdHlQb2xpY3kgJiZcbiAgICAgICAgdmVyc2lvbiA8IFwiMjAyMC0wOC0wNFwiKSB7XG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCIndmVyc2lvbicgbXVzdCBiZSA+PSAnMjAyMC0wOC0wNCcgd2hlbiBwcm92aWRlZCAnaScgcGVybWlzc2lvbi5cIik7XG4gICAgfVxuICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zICYmXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMuZGVsZXRlVmVyc2lvbiAmJlxuICAgICAgICB2ZXJzaW9uIDwgXCIyMDE5LTEwLTEwXCIpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIid2ZXJzaW9uJyBtdXN0IGJlID49ICcyMDE5LTEwLTEwJyB3aGVuIHByb3ZpZGluZyAneCcgcGVybWlzc2lvbi5cIik7XG4gICAgfVxuICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zICYmXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMucGVybWFuZW50RGVsZXRlICYmXG4gICAgICAgIHZlcnNpb24gPCBcIjIwMTktMTAtMTBcIikge1xuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiJ3ZlcnNpb24nIG11c3QgYmUgPj0gJzIwMTktMTAtMTAnIHdoZW4gcHJvdmlkaW5nICd5JyBwZXJtaXNzaW9uLlwiKTtcbiAgICB9XG4gICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMgJiZcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy50YWcgJiZcbiAgICAgICAgdmVyc2lvbiA8IFwiMjAxOS0xMi0xMlwiKSB7XG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCIndmVyc2lvbicgbXVzdCBiZSA+PSAnMjAxOS0xMi0xMicgd2hlbiBwcm92aWRpbmcgJ3QnIHBlcm1pc3Npb24uXCIpO1xuICAgIH1cbiAgICBpZiAodmVyc2lvbiA8IFwiMjAyMC0wMi0xMFwiICYmXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMgJiZcbiAgICAgICAgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMubW92ZSB8fCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLmV4ZWN1dGUpKSB7XG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCIndmVyc2lvbicgbXVzdCBiZSA+PSAnMjAyMC0wMi0xMCcgd2hlbiBwcm92aWRpbmcgdGhlICdtJyBvciAnZScgcGVybWlzc2lvbi5cIik7XG4gICAgfVxuICAgIGlmICh2ZXJzaW9uIDwgXCIyMDIxLTA0LTEwXCIgJiZcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucyAmJlxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLmZpbHRlckJ5VGFncykge1xuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiJ3ZlcnNpb24nIG11c3QgYmUgPj0gJzIwMjEtMDQtMTAnIHdoZW4gcHJvdmlkaW5nIHRoZSAnZicgcGVybWlzc2lvbi5cIik7XG4gICAgfVxuICAgIGlmICh2ZXJzaW9uIDwgXCIyMDIwLTAyLTEwXCIgJiZcbiAgICAgICAgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJlYXV0aG9yaXplZEFnZW50T2JqZWN0SWQgfHwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb3JyZWxhdGlvbklkKSkge1xuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiJ3ZlcnNpb24nIG11c3QgYmUgPj0gJzIwMjAtMDItMTAnIHdoZW4gcHJvdmlkaW5nICdwcmVhdXRob3JpemVkQWdlbnRPYmplY3RJZCcgb3IgJ2NvcnJlbGF0aW9uSWQnLlwiKTtcbiAgICB9XG4gICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZW5jcnlwdGlvblNjb3BlICYmIHZlcnNpb24gPCBcIjIwMjAtMTItMDZcIikge1xuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiJ3ZlcnNpb24nIG11c3QgYmUgPj0gJzIwMjAtMTItMDYnIHdoZW4gcHJvdmlkZWQgJ2VuY3J5cHRpb25TY29wZScgaW4gU0FTLlwiKTtcbiAgICB9XG4gICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICByZXR1cm4gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICpcbiAqIENvZGUgZ2VuZXJhdGVkIGJ5IE1pY3Jvc29mdCAoUikgQXV0b1Jlc3QgQ29kZSBHZW5lcmF0b3IuXG4gKiBDaGFuZ2VzIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IgYW5kIHdpbGwgYmUgbG9zdCBpZiB0aGUgY29kZSBpcyByZWdlbmVyYXRlZC5cbiAqL1xuaW1wb3J0ICogYXMgY29yZUh0dHAgZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmltcG9ydCAqIGFzIE1hcHBlcnMgZnJvbSBcIi4uL21vZGVscy9tYXBwZXJzXCI7XG5pbXBvcnQgKiBhcyBQYXJhbWV0ZXJzIGZyb20gXCIuLi9tb2RlbHMvcGFyYW1ldGVyc1wiO1xuLyoqIENsYXNzIHJlcHJlc2VudGluZyBhIEJsb2IuICovXG5leHBvcnQgY2xhc3MgQmxvYiB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgQmxvYiBjbGFzcy5cbiAgICAgKiBAcGFyYW0gY2xpZW50IFJlZmVyZW5jZSB0byB0aGUgc2VydmljZSBjbGllbnRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQpIHtcbiAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBEb3dubG9hZCBvcGVyYXRpb24gcmVhZHMgb3IgZG93bmxvYWRzIGEgYmxvYiBmcm9tIHRoZSBzeXN0ZW0sIGluY2x1ZGluZyBpdHMgbWV0YWRhdGEgYW5kXG4gICAgICogcHJvcGVydGllcy4gWW91IGNhbiBhbHNvIGNhbGwgRG93bmxvYWQgdG8gcmVhZCBhIHNuYXBzaG90LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgZG93bmxvYWQob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgZG93bmxvYWRPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIEdldCBQcm9wZXJ0aWVzIG9wZXJhdGlvbiByZXR1cm5zIGFsbCB1c2VyLWRlZmluZWQgbWV0YWRhdGEsIHN0YW5kYXJkIEhUVFAgcHJvcGVydGllcywgYW5kIHN5c3RlbVxuICAgICAqIHByb3BlcnRpZXMgZm9yIHRoZSBibG9iLiBJdCBkb2VzIG5vdCByZXR1cm4gdGhlIGNvbnRlbnQgb2YgdGhlIGJsb2IuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBnZXRQcm9wZXJ0aWVzKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGdldFByb3BlcnRpZXNPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHN0b3JhZ2UgYWNjb3VudCdzIHNvZnQgZGVsZXRlIGZlYXR1cmUgaXMgZGlzYWJsZWQgdGhlbiwgd2hlbiBhIGJsb2IgaXMgZGVsZXRlZCwgaXQgaXNcbiAgICAgKiBwZXJtYW5lbnRseSByZW1vdmVkIGZyb20gdGhlIHN0b3JhZ2UgYWNjb3VudC4gSWYgdGhlIHN0b3JhZ2UgYWNjb3VudCdzIHNvZnQgZGVsZXRlIGZlYXR1cmUgaXNcbiAgICAgKiBlbmFibGVkLCB0aGVuLCB3aGVuIGEgYmxvYiBpcyBkZWxldGVkLCBpdCBpcyBtYXJrZWQgZm9yIGRlbGV0aW9uIGFuZCBiZWNvbWVzIGluYWNjZXNzaWJsZVxuICAgICAqIGltbWVkaWF0ZWx5LiBIb3dldmVyLCB0aGUgYmxvYiBzZXJ2aWNlIHJldGFpbnMgdGhlIGJsb2Igb3Igc25hcHNob3QgZm9yIHRoZSBudW1iZXIgb2YgZGF5cyBzcGVjaWZpZWRcbiAgICAgKiBieSB0aGUgRGVsZXRlUmV0ZW50aW9uUG9saWN5IHNlY3Rpb24gb2YgW1N0b3JhZ2Ugc2VydmljZSBwcm9wZXJ0aWVzXVxuICAgICAqIChTZXQtQmxvYi1TZXJ2aWNlLVByb3BlcnRpZXMubWQpLiBBZnRlciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBkYXlzIGhhcyBwYXNzZWQsIHRoZSBibG9iJ3MgZGF0YSBpc1xuICAgICAqIHBlcm1hbmVudGx5IHJlbW92ZWQgZnJvbSB0aGUgc3RvcmFnZSBhY2NvdW50LiBOb3RlIHRoYXQgeW91IGNvbnRpbnVlIHRvIGJlIGNoYXJnZWQgZm9yIHRoZVxuICAgICAqIHNvZnQtZGVsZXRlZCBibG9iJ3Mgc3RvcmFnZSB1bnRpbCBpdCBpcyBwZXJtYW5lbnRseSByZW1vdmVkLiBVc2UgdGhlIExpc3QgQmxvYnMgQVBJIGFuZCBzcGVjaWZ5IHRoZVxuICAgICAqIFwiaW5jbHVkZT1kZWxldGVkXCIgcXVlcnkgcGFyYW1ldGVyIHRvIGRpc2NvdmVyIHdoaWNoIGJsb2JzIGFuZCBzbmFwc2hvdHMgaGF2ZSBiZWVuIHNvZnQgZGVsZXRlZC4gWW91XG4gICAgICogY2FuIHRoZW4gdXNlIHRoZSBVbmRlbGV0ZSBCbG9iIEFQSSB0byByZXN0b3JlIGEgc29mdC1kZWxldGVkIGJsb2IuIEFsbCBvdGhlciBvcGVyYXRpb25zIG9uIGFcbiAgICAgKiBzb2Z0LWRlbGV0ZWQgYmxvYiBvciBzbmFwc2hvdCBjYXVzZXMgdGhlIHNlcnZpY2UgdG8gcmV0dXJuIGFuIEhUVFAgc3RhdHVzIGNvZGUgb2YgNDA0XG4gICAgICogKFJlc291cmNlTm90Rm91bmQpLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgZGVsZXRlKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGRlbGV0ZU9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVbmRlbGV0ZSBhIGJsb2IgdGhhdCB3YXMgcHJldmlvdXNseSBzb2Z0IGRlbGV0ZWRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHVuZGVsZXRlKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIHVuZGVsZXRlT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHRpbWUgYSBibG9iIHdpbGwgZXhwaXJlIGFuZCBiZSBkZWxldGVkLlxuICAgICAqIEBwYXJhbSBleHBpcnlPcHRpb25zIFJlcXVpcmVkLiBJbmRpY2F0ZXMgbW9kZSBvZiB0aGUgZXhwaXJ5IHRpbWVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHNldEV4cGlyeShleHBpcnlPcHRpb25zLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGV4cGlyeU9wdGlvbnMsXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgc2V0RXhwaXJ5T3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBTZXQgSFRUUCBIZWFkZXJzIG9wZXJhdGlvbiBzZXRzIHN5c3RlbSBwcm9wZXJ0aWVzIG9uIHRoZSBibG9iXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBzZXRIdHRwSGVhZGVycyhvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBzZXRIdHRwSGVhZGVyc09wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgU2V0IEltbXV0YWJpbGl0eSBQb2xpY3kgb3BlcmF0aW9uIHNldHMgdGhlIGltbXV0YWJpbGl0eSBwb2xpY3kgb24gdGhlIGJsb2JcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHNldEltbXV0YWJpbGl0eVBvbGljeShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBzZXRJbW11dGFiaWxpdHlQb2xpY3lPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIERlbGV0ZSBJbW11dGFiaWxpdHkgUG9saWN5IG9wZXJhdGlvbiBkZWxldGVzIHRoZSBpbW11dGFiaWxpdHkgcG9saWN5IG9uIHRoZSBibG9iXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBkZWxldGVJbW11dGFiaWxpdHlQb2xpY3kob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgZGVsZXRlSW1tdXRhYmlsaXR5UG9saWN5T3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBTZXQgTGVnYWwgSG9sZCBvcGVyYXRpb24gc2V0cyBhIGxlZ2FsIGhvbGQgb24gdGhlIGJsb2IuXG4gICAgICogQHBhcmFtIGxlZ2FsSG9sZCBTcGVjaWZpZWQgaWYgYSBsZWdhbCBob2xkIHNob3VsZCBiZSBzZXQgb24gdGhlIGJsb2IuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBzZXRMZWdhbEhvbGQobGVnYWxIb2xkLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGxlZ2FsSG9sZCxcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBzZXRMZWdhbEhvbGRPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIFNldCBCbG9iIE1ldGFkYXRhIG9wZXJhdGlvbiBzZXRzIHVzZXItZGVmaW5lZCBtZXRhZGF0YSBmb3IgdGhlIHNwZWNpZmllZCBibG9iIGFzIG9uZSBvciBtb3JlXG4gICAgICogbmFtZS12YWx1ZSBwYWlyc1xuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgc2V0TWV0YWRhdGEob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgc2V0TWV0YWRhdGFPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogW1VwZGF0ZV0gVGhlIExlYXNlIEJsb2Igb3BlcmF0aW9uIGVzdGFibGlzaGVzIGFuZCBtYW5hZ2VzIGEgbG9jayBvbiBhIGJsb2IgZm9yIHdyaXRlIGFuZCBkZWxldGVcbiAgICAgKiBvcGVyYXRpb25zXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBhY3F1aXJlTGVhc2Uob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgYWNxdWlyZUxlYXNlT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtVcGRhdGVdIFRoZSBMZWFzZSBCbG9iIG9wZXJhdGlvbiBlc3RhYmxpc2hlcyBhbmQgbWFuYWdlcyBhIGxvY2sgb24gYSBibG9iIGZvciB3cml0ZSBhbmQgZGVsZXRlXG4gICAgICogb3BlcmF0aW9uc1xuICAgICAqIEBwYXJhbSBsZWFzZUlkIFNwZWNpZmllcyB0aGUgY3VycmVudCBsZWFzZSBJRCBvbiB0aGUgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICByZWxlYXNlTGVhc2UobGVhc2VJZCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBsZWFzZUlkLFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIHJlbGVhc2VMZWFzZU9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBbVXBkYXRlXSBUaGUgTGVhc2UgQmxvYiBvcGVyYXRpb24gZXN0YWJsaXNoZXMgYW5kIG1hbmFnZXMgYSBsb2NrIG9uIGEgYmxvYiBmb3Igd3JpdGUgYW5kIGRlbGV0ZVxuICAgICAqIG9wZXJhdGlvbnNcbiAgICAgKiBAcGFyYW0gbGVhc2VJZCBTcGVjaWZpZXMgdGhlIGN1cnJlbnQgbGVhc2UgSUQgb24gdGhlIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgcmVuZXdMZWFzZShsZWFzZUlkLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGxlYXNlSWQsXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgcmVuZXdMZWFzZU9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBbVXBkYXRlXSBUaGUgTGVhc2UgQmxvYiBvcGVyYXRpb24gZXN0YWJsaXNoZXMgYW5kIG1hbmFnZXMgYSBsb2NrIG9uIGEgYmxvYiBmb3Igd3JpdGUgYW5kIGRlbGV0ZVxuICAgICAqIG9wZXJhdGlvbnNcbiAgICAgKiBAcGFyYW0gbGVhc2VJZCBTcGVjaWZpZXMgdGhlIGN1cnJlbnQgbGVhc2UgSUQgb24gdGhlIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSBwcm9wb3NlZExlYXNlSWQgUHJvcG9zZWQgbGVhc2UgSUQsIGluIGEgR1VJRCBzdHJpbmcgZm9ybWF0LiBUaGUgQmxvYiBzZXJ2aWNlIHJldHVybnMgNDAwXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAoSW52YWxpZCByZXF1ZXN0KSBpZiB0aGUgcHJvcG9zZWQgbGVhc2UgSUQgaXMgbm90IGluIHRoZSBjb3JyZWN0IGZvcm1hdC4gU2VlIEd1aWQgQ29uc3RydWN0b3JcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIGZvciBhIGxpc3Qgb2YgdmFsaWQgR1VJRCBzdHJpbmcgZm9ybWF0cy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGNoYW5nZUxlYXNlKGxlYXNlSWQsIHByb3Bvc2VkTGVhc2VJZCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBsZWFzZUlkLFxuICAgICAgICAgICAgcHJvcG9zZWRMZWFzZUlkLFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGNoYW5nZUxlYXNlT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtVcGRhdGVdIFRoZSBMZWFzZSBCbG9iIG9wZXJhdGlvbiBlc3RhYmxpc2hlcyBhbmQgbWFuYWdlcyBhIGxvY2sgb24gYSBibG9iIGZvciB3cml0ZSBhbmQgZGVsZXRlXG4gICAgICogb3BlcmF0aW9uc1xuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgYnJlYWtMZWFzZShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBicmVha0xlYXNlT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBDcmVhdGUgU25hcHNob3Qgb3BlcmF0aW9uIGNyZWF0ZXMgYSByZWFkLW9ubHkgc25hcHNob3Qgb2YgYSBibG9iXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBjcmVhdGVTbmFwc2hvdChvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBjcmVhdGVTbmFwc2hvdE9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgU3RhcnQgQ29weSBGcm9tIFVSTCBvcGVyYXRpb24gY29waWVzIGEgYmxvYiBvciBhbiBpbnRlcm5ldCByZXNvdXJjZSB0byBhIG5ldyBibG9iLlxuICAgICAqIEBwYXJhbSBjb3B5U291cmNlIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIHBhZ2UgYmxvYiBzbmFwc2hvdC4gVGhpcyB2YWx1ZSBpcyBhIFVSTCBvZiB1cCB0b1xuICAgICAqICAgICAgICAgICAgICAgICAgIDIgS0IgaW4gbGVuZ3RoIHRoYXQgc3BlY2lmaWVzIGEgcGFnZSBibG9iIHNuYXBzaG90LiBUaGUgdmFsdWUgc2hvdWxkIGJlIFVSTC1lbmNvZGVkIGFzIGl0IHdvdWxkXG4gICAgICogICAgICAgICAgICAgICAgICAgYXBwZWFyIGluIGEgcmVxdWVzdCBVUkkuIFRoZSBzb3VyY2UgYmxvYiBtdXN0IGVpdGhlciBiZSBwdWJsaWMgb3IgbXVzdCBiZSBhdXRoZW50aWNhdGVkIHZpYSBhIHNoYXJlZFxuICAgICAqICAgICAgICAgICAgICAgICAgIGFjY2VzcyBzaWduYXR1cmUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBzdGFydENvcHlGcm9tVVJMKGNvcHlTb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgY29weVNvdXJjZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBzdGFydENvcHlGcm9tVVJMT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBDb3B5IEZyb20gVVJMIG9wZXJhdGlvbiBjb3BpZXMgYSBibG9iIG9yIGFuIGludGVybmV0IHJlc291cmNlIHRvIGEgbmV3IGJsb2IuIEl0IHdpbGwgbm90IHJldHVyblxuICAgICAqIGEgcmVzcG9uc2UgdW50aWwgdGhlIGNvcHkgaXMgY29tcGxldGUuXG4gICAgICogQHBhcmFtIGNvcHlTb3VyY2UgU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgcGFnZSBibG9iIHNuYXBzaG90LiBUaGlzIHZhbHVlIGlzIGEgVVJMIG9mIHVwIHRvXG4gICAgICogICAgICAgICAgICAgICAgICAgMiBLQiBpbiBsZW5ndGggdGhhdCBzcGVjaWZpZXMgYSBwYWdlIGJsb2Igc25hcHNob3QuIFRoZSB2YWx1ZSBzaG91bGQgYmUgVVJMLWVuY29kZWQgYXMgaXQgd291bGRcbiAgICAgKiAgICAgICAgICAgICAgICAgICBhcHBlYXIgaW4gYSByZXF1ZXN0IFVSSS4gVGhlIHNvdXJjZSBibG9iIG11c3QgZWl0aGVyIGJlIHB1YmxpYyBvciBtdXN0IGJlIGF1dGhlbnRpY2F0ZWQgdmlhIGEgc2hhcmVkXG4gICAgICogICAgICAgICAgICAgICAgICAgYWNjZXNzIHNpZ25hdHVyZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGNvcHlGcm9tVVJMKGNvcHlTb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgY29weVNvdXJjZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBjb3B5RnJvbVVSTE9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgQWJvcnQgQ29weSBGcm9tIFVSTCBvcGVyYXRpb24gYWJvcnRzIGEgcGVuZGluZyBDb3B5IEZyb20gVVJMIG9wZXJhdGlvbiwgYW5kIGxlYXZlcyBhIGRlc3RpbmF0aW9uXG4gICAgICogYmxvYiB3aXRoIHplcm8gbGVuZ3RoIGFuZCBmdWxsIG1ldGFkYXRhLlxuICAgICAqIEBwYXJhbSBjb3B5SWQgVGhlIGNvcHkgaWRlbnRpZmllciBwcm92aWRlZCBpbiB0aGUgeC1tcy1jb3B5LWlkIGhlYWRlciBvZiB0aGUgb3JpZ2luYWwgQ29weSBCbG9iXG4gICAgICogICAgICAgICAgICAgICBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBhYm9ydENvcHlGcm9tVVJMKGNvcHlJZCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBjb3B5SWQsXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgYWJvcnRDb3B5RnJvbVVSTE9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgU2V0IFRpZXIgb3BlcmF0aW9uIHNldHMgdGhlIHRpZXIgb24gYSBibG9iLiBUaGUgb3BlcmF0aW9uIGlzIGFsbG93ZWQgb24gYSBwYWdlIGJsb2IgaW4gYSBwcmVtaXVtXG4gICAgICogc3RvcmFnZSBhY2NvdW50IGFuZCBvbiBhIGJsb2NrIGJsb2IgaW4gYSBibG9iIHN0b3JhZ2UgYWNjb3VudCAobG9jYWxseSByZWR1bmRhbnQgc3RvcmFnZSBvbmx5KS4gQVxuICAgICAqIHByZW1pdW0gcGFnZSBibG9iJ3MgdGllciBkZXRlcm1pbmVzIHRoZSBhbGxvd2VkIHNpemUsIElPUFMsIGFuZCBiYW5kd2lkdGggb2YgdGhlIGJsb2IuIEEgYmxvY2tcbiAgICAgKiBibG9iJ3MgdGllciBkZXRlcm1pbmVzIEhvdC9Db29sL0FyY2hpdmUgc3RvcmFnZSB0eXBlLiBUaGlzIG9wZXJhdGlvbiBkb2VzIG5vdCB1cGRhdGUgdGhlIGJsb2Inc1xuICAgICAqIEVUYWcuXG4gICAgICogQHBhcmFtIHRpZXIgSW5kaWNhdGVzIHRoZSB0aWVyIHRvIGJlIHNldCBvbiB0aGUgYmxvYi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHNldFRpZXIodGllciwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICB0aWVyLFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIHNldFRpZXJPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2t1IG5hbWUgYW5kIGFjY291bnQga2luZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgZ2V0QWNjb3VudEluZm8ob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgZ2V0QWNjb3VudEluZm9PcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIFF1ZXJ5IG9wZXJhdGlvbiBlbmFibGVzIHVzZXJzIHRvIHNlbGVjdC9wcm9qZWN0IG9uIGJsb2IgZGF0YSBieSBwcm92aWRpbmcgc2ltcGxlIHF1ZXJ5XG4gICAgICogZXhwcmVzc2lvbnMuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBxdWVyeShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBxdWVyeU9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgR2V0IFRhZ3Mgb3BlcmF0aW9uIGVuYWJsZXMgdXNlcnMgdG8gZ2V0IHRoZSB0YWdzIGFzc29jaWF0ZWQgd2l0aCBhIGJsb2IuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBnZXRUYWdzKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGdldFRhZ3NPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIFNldCBUYWdzIG9wZXJhdGlvbiBlbmFibGVzIHVzZXJzIHRvIHNldCB0YWdzIG9uIGEgYmxvYi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHNldFRhZ3Mob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgc2V0VGFnc09wZXJhdGlvblNwZWMpO1xuICAgIH1cbn1cbi8vIE9wZXJhdGlvbiBTcGVjaWZpY2F0aW9uc1xuY29uc3QgeG1sU2VyaWFsaXplciA9IG5ldyBjb3JlSHR0cC5TZXJpYWxpemVyKE1hcHBlcnMsIC8qIGlzWG1sICovIHRydWUpO1xuY29uc3QgZG93bmxvYWRPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIkdFVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiB7IG5hbWU6IFwiU3RyZWFtXCIgfSxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJwYXJzZWRSZXNwb25zZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iRG93bmxvYWRIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIDIwNjoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6IHsgbmFtZTogXCJTdHJlYW1cIiB9LFxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcInBhcnNlZFJlc3BvbnNlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JEb3dubG9hZEhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JEb3dubG9hZEV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgUGFyYW1ldGVycy5zbmFwc2hvdCxcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uSWRcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMucmFuZ2UsXG4gICAgICAgIFBhcmFtZXRlcnMucmFuZ2VHZXRDb250ZW50TUQ1LFxuICAgICAgICBQYXJhbWV0ZXJzLnJhbmdlR2V0Q29udGVudENSQzY0LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXksXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleVNoYTI1NixcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uQWxnb3JpdGhtLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZUYWdzXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgZ2V0UHJvcGVydGllc09wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiSEVBRFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYkdldFByb3BlcnRpZXNIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iR2V0UHJvcGVydGllc0V4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgUGFyYW1ldGVycy5zbmFwc2hvdCxcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uSWRcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5U2hhMjU2LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25BbGdvcml0aG0sXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk5vbmVNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZlRhZ3NcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBkZWxldGVPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIkRFTEVURVwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDI6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYkRlbGV0ZUhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JEZWxldGVFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMuc25hcHNob3QsXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbklkLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JEZWxldGVUeXBlXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZUYWdzLFxuICAgICAgICBQYXJhbWV0ZXJzLmRlbGV0ZVNuYXBzaG90c1xuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IHVuZGVsZXRlT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JVbmRlbGV0ZUhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JVbmRlbGV0ZUV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLCBQYXJhbWV0ZXJzLmNvbXA4XSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3Qgc2V0RXhwaXJ5T3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JTZXRFeHBpcnlIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iU2V0RXhwaXJ5RXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsIFBhcmFtZXRlcnMuY29tcDExXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmV4cGlyeU9wdGlvbnMsXG4gICAgICAgIFBhcmFtZXRlcnMuZXhwaXJlc09uXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3Qgc2V0SHR0cEhlYWRlcnNPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYlNldEh0dHBIZWFkZXJzSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYlNldEh0dHBIZWFkZXJzRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLmNvbXAsIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kc10sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFncyxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ2FjaGVDb250cm9sLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50VHlwZSxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudE1ENSxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudEVuY29kaW5nLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50TGFuZ3VhZ2UsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNvbnRlbnREaXNwb3NpdGlvblxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IHNldEltbXV0YWJpbGl0eVBvbGljeU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iU2V0SW1tdXRhYmlsaXR5UG9saWN5SGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYlNldEltbXV0YWJpbGl0eVBvbGljeUV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLCBQYXJhbWV0ZXJzLmNvbXAxMl0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pbW11dGFiaWxpdHlQb2xpY3lFeHBpcnksXG4gICAgICAgIFBhcmFtZXRlcnMuaW1tdXRhYmlsaXR5UG9saWN5TW9kZVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGRlbGV0ZUltbXV0YWJpbGl0eVBvbGljeU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iRGVsZXRlSW1tdXRhYmlsaXR5UG9saWN5SGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYkRlbGV0ZUltbXV0YWJpbGl0eVBvbGljeUV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLCBQYXJhbWV0ZXJzLmNvbXAxMl0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IHNldExlZ2FsSG9sZE9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iU2V0TGVnYWxIb2xkSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYlNldExlZ2FsSG9sZEV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLCBQYXJhbWV0ZXJzLmNvbXAxM10sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWdhbEhvbGRcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBzZXRNZXRhZGF0YU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iU2V0TWV0YWRhdGFIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iU2V0TWV0YWRhdGFFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcywgUGFyYW1ldGVycy5jb21wNl0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5tZXRhZGF0YSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbkFsZ29yaXRobSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFncyxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uU2NvcGVcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBhY3F1aXJlTGVhc2VPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDE6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYkFjcXVpcmVMZWFzZUhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JBY3F1aXJlTGVhc2VFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcywgUGFyYW1ldGVycy5jb21wMTBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjdGlvbixcbiAgICAgICAgUGFyYW1ldGVycy5kdXJhdGlvbixcbiAgICAgICAgUGFyYW1ldGVycy5wcm9wb3NlZExlYXNlSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk5vbmVNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZlRhZ3NcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCByZWxlYXNlTGVhc2VPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYlJlbGVhc2VMZWFzZUhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JSZWxlYXNlTGVhc2VFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcywgUGFyYW1ldGVycy5jb21wMTBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjdGlvbjEsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZDEsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk5vbmVNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZlRhZ3NcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCByZW5ld0xlYXNlT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JSZW5ld0xlYXNlSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYlJlbmV3TGVhc2VFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcywgUGFyYW1ldGVycy5jb21wMTBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjdGlvbjIsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk5vbmVNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZlRhZ3NcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBjaGFuZ2VMZWFzZU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iQ2hhbmdlTGVhc2VIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iQ2hhbmdlTGVhc2VFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcywgUGFyYW1ldGVycy5jb21wMTBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjdGlvbjQsXG4gICAgICAgIFBhcmFtZXRlcnMucHJvcG9zZWRMZWFzZUlkMSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFnc1xuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGJyZWFrTGVhc2VPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDI6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYkJyZWFrTGVhc2VIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iQnJlYWtMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLCBQYXJhbWV0ZXJzLmNvbXAxMF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuYWN0aW9uMyxcbiAgICAgICAgUGFyYW1ldGVycy5icmVha1BlcmlvZCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFnc1xuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGNyZWF0ZVNuYXBzaG90T3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAxOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JDcmVhdGVTbmFwc2hvdEhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JDcmVhdGVTbmFwc2hvdEV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLCBQYXJhbWV0ZXJzLmNvbXAxNF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5tZXRhZGF0YSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbkFsZ29yaXRobSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFncyxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uU2NvcGVcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBzdGFydENvcHlGcm9tVVJMT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAyOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JTdGFydENvcHlGcm9tVVJMSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYlN0YXJ0Q29weUZyb21VUkxFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMudGltZW91dEluU2Vjb25kc10sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5tZXRhZGF0YSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFncyxcbiAgICAgICAgUGFyYW1ldGVycy5pbW11dGFiaWxpdHlQb2xpY3lFeHBpcnksXG4gICAgICAgIFBhcmFtZXRlcnMuaW1tdXRhYmlsaXR5UG9saWN5TW9kZSxcbiAgICAgICAgUGFyYW1ldGVycy50aWVyLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlaHlkcmF0ZVByaW9yaXR5LFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VJZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VJZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUlmVGFncyxcbiAgICAgICAgUGFyYW1ldGVycy5jb3B5U291cmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JUYWdzU3RyaW5nLFxuICAgICAgICBQYXJhbWV0ZXJzLnNlYWxCbG9iLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlZ2FsSG9sZDFcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBjb3B5RnJvbVVSTE9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMjoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iQ29weUZyb21VUkxIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iQ29weUZyb21VUkxFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMudGltZW91dEluU2Vjb25kc10sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5tZXRhZGF0YSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFncyxcbiAgICAgICAgUGFyYW1ldGVycy5pbW11dGFiaWxpdHlQb2xpY3lFeHBpcnksXG4gICAgICAgIFBhcmFtZXRlcnMuaW1tdXRhYmlsaXR5UG9saWN5TW9kZSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgIFBhcmFtZXRlcnMudGllcixcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VJZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlSWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlSWZNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VJZk5vbmVNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5jb3B5U291cmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JUYWdzU3RyaW5nLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlZ2FsSG9sZDEsXG4gICAgICAgIFBhcmFtZXRlcnMueE1zUmVxdWlyZXNTeW5jLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUNvbnRlbnRNRDUsXG4gICAgICAgIFBhcmFtZXRlcnMuY29weVNvdXJjZUF1dGhvcml6YXRpb24sXG4gICAgICAgIFBhcmFtZXRlcnMuY29weVNvdXJjZVRhZ3NcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBhYm9ydENvcHlGcm9tVVJMT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjA0OiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JBYm9ydENvcHlGcm9tVVJMSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYkFib3J0Q29weUZyb21VUkxFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMuY29tcDE1LFxuICAgICAgICBQYXJhbWV0ZXJzLmNvcHlJZFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvcHlBY3Rpb25BYm9ydENvbnN0YW50XG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3Qgc2V0VGllck9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iU2V0VGllckhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgMjAyOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JTZXRUaWVySGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYlNldFRpZXJFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMuc25hcHNob3QsXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbklkLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbXAxNlxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFncyxcbiAgICAgICAgUGFyYW1ldGVycy5yZWh5ZHJhdGVQcmlvcml0eSxcbiAgICAgICAgUGFyYW1ldGVycy50aWVyMVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGdldEFjY291bnRJbmZvT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JHZXRBY2NvdW50SW5mb0hlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JHZXRBY2NvdW50SW5mb0V4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy5jb21wLCBQYXJhbWV0ZXJzLnJlc3R5cGUxXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnZlcnNpb24sIFBhcmFtZXRlcnMuYWNjZXB0MV0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IHF1ZXJ5T3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQT1NUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6IHsgbmFtZTogXCJTdHJlYW1cIiB9LFxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcInBhcnNlZFJlc3BvbnNlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JRdWVyeUhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgMjA2OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogeyBuYW1lOiBcIlN0cmVhbVwiIH0sXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwicGFyc2VkUmVzcG9uc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYlF1ZXJ5SGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYlF1ZXJ5RXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICByZXF1ZXN0Qm9keTogUGFyYW1ldGVycy5xdWVyeVJlcXVlc3QsXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgUGFyYW1ldGVycy5zbmFwc2hvdCxcbiAgICAgICAgUGFyYW1ldGVycy5jb21wMTdcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLmNvbnRlbnRUeXBlLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdCxcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbkFsZ29yaXRobSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFnc1xuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veG1sOyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgbWVkaWFUeXBlOiBcInhtbFwiLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBnZXRUYWdzT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLkJsb2JUYWdzLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iR2V0VGFnc0hlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JHZXRUYWdzRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBQYXJhbWV0ZXJzLnNuYXBzaG90LFxuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb25JZCxcbiAgICAgICAgUGFyYW1ldGVycy5jb21wMThcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5pZlRhZ3NcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBzZXRUYWdzT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjA0OiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JTZXRUYWdzSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYlNldFRhZ3NFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJlcXVlc3RCb2R5OiBQYXJhbWV0ZXJzLnRhZ3MsXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuY29tcDE4XG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy5jb250ZW50VHlwZSxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQsXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5pZlRhZ3MsXG4gICAgICAgIFBhcmFtZXRlcnMudHJhbnNhY3Rpb25hbENvbnRlbnRNRDUsXG4gICAgICAgIFBhcmFtZXRlcnMudHJhbnNhY3Rpb25hbENvbnRlbnRDcmM2NFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veG1sOyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgbWVkaWFUeXBlOiBcInhtbFwiLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ibG9iLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgZ2VuZXJhdGVVdWlkIH0gZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmltcG9ydCB7IFN0b3JhZ2VDbGllbnRDb250ZXh0IH0gZnJvbSBcIi4vZ2VuZXJhdGVkL3NyYy9pbmRleFwiO1xuaW1wb3J0IHsgU3BhblN0YXR1c0NvZGUgfSBmcm9tIFwiQGF6dXJlL2NvcmUtdHJhY2luZ1wiO1xuaW1wb3J0IHsgQmxvYiBhcyBTdG9yYWdlQmxvYiwgQ29udGFpbmVyIH0gZnJvbSBcIi4vZ2VuZXJhdGVkL3NyYy9vcGVyYXRpb25zXCI7XG5pbXBvcnQgeyBFVGFnTm9uZSB9IGZyb20gXCIuL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSwgY3JlYXRlU3BhbiB9IGZyb20gXCIuL3V0aWxzL3RyYWNpbmdcIjtcbi8qKlxuICogQSBjbGllbnQgdGhhdCBtYW5hZ2VzIGxlYXNlcyBmb3IgYSB7QGxpbmsgQ29udGFpbmVyQ2xpZW50fSBvciBhIHtAbGluayBCbG9iQ2xpZW50fS5cbiAqL1xuZXhwb3J0IGNsYXNzIEJsb2JMZWFzZUNsaWVudCB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBCbG9iTGVhc2VDbGllbnQuXG4gICAgICogQHBhcmFtIGNsaWVudCAtIFRoZSBjbGllbnQgdG8gbWFrZSB0aGUgbGVhc2Ugb3BlcmF0aW9uIHJlcXVlc3RzLlxuICAgICAqIEBwYXJhbSBsZWFzZUlkIC0gSW5pdGlhbCBwcm9wb3NlZCBsZWFzZSBpZC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQsIGxlYXNlSWQpIHtcbiAgICAgICAgY29uc3QgY2xpZW50Q29udGV4dCA9IG5ldyBTdG9yYWdlQ2xpZW50Q29udGV4dChjbGllbnQudXJsLCBjbGllbnQucGlwZWxpbmUudG9TZXJ2aWNlQ2xpZW50T3B0aW9ucygpKTtcbiAgICAgICAgdGhpcy5fdXJsID0gY2xpZW50LnVybDtcbiAgICAgICAgaWYgKGNsaWVudC5uYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lck9yQmxvYk9wZXJhdGlvbiA9IG5ldyBDb250YWluZXIoY2xpZW50Q29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pc0NvbnRhaW5lciA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyT3JCbG9iT3BlcmF0aW9uID0gbmV3IFN0b3JhZ2VCbG9iKGNsaWVudENvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbGVhc2VJZCkge1xuICAgICAgICAgICAgbGVhc2VJZCA9IGdlbmVyYXRlVXVpZCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2xlYXNlSWQgPSBsZWFzZUlkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsZWFzZSBJZC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBsZWFzZUlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGVhc2VJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdXJsLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IHVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXN0YWJsaXNoZXMgYW5kIG1hbmFnZXMgYSBsb2NrIG9uIGEgY29udGFpbmVyIGZvciBkZWxldGUgb3BlcmF0aW9ucywgb3Igb24gYSBibG9iXG4gICAgICogZm9yIHdyaXRlIGFuZCBkZWxldGUgb3BlcmF0aW9ucy5cbiAgICAgKiBUaGUgbG9jayBkdXJhdGlvbiBjYW4gYmUgMTUgdG8gNjAgc2Vjb25kcywgb3IgY2FuIGJlIGluZmluaXRlLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2xlYXNlLWNvbnRhaW5lclxuICAgICAqIGFuZFxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2xlYXNlLWJsb2JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBkdXJhdGlvbiAtIE11c3QgYmUgYmV0d2VlbiAxNSB0byA2MCBzZWNvbmRzLCBvciBpbmZpbml0ZSAoLTEpXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBvcHRpb24gdG8gY29uZmlndXJlIGxlYXNlIG1hbmFnZW1lbnQgb3BlcmF0aW9ucy5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciBhY3F1aXJlIGxlYXNlIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBhY3F1aXJlTGVhc2UoZHVyYXRpb24sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZjtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JMZWFzZUNsaWVudC1hY3F1aXJlTGVhc2VcIiwgb3B0aW9ucyk7XG4gICAgICAgIGlmICh0aGlzLl9pc0NvbnRhaW5lciAmJlxuICAgICAgICAgICAgKCgoKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaWZNYXRjaCkgJiYgKChfYiA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmlmTWF0Y2gpICE9PSBFVGFnTm9uZSkgfHxcbiAgICAgICAgICAgICAgICAoKChfYyA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlmTm9uZU1hdGNoKSAmJiAoKF9kID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuaWZOb25lTWF0Y2gpICE9PSBFVGFnTm9uZSkgfHxcbiAgICAgICAgICAgICAgICAoKF9lID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UudGFnQ29uZGl0aW9ucykpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSBJZk1hdGNoLCBJZk5vbmVNYXRjaCBhbmQgdGFncyBhY2Nlc3MgY29uZGl0aW9ucyBhcmUgaWdub3JlZCBieSB0aGUgc2VydmljZS4gVmFsdWVzIG90aGVyIHRoYW4gdW5kZWZpbmVkIG9yIHRoZWlyIGRlZmF1bHQgdmFsdWVzIGFyZSBub3QgYWNjZXB0YWJsZS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb250YWluZXJPckJsb2JPcGVyYXRpb24uYWNxdWlyZUxlYXNlKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgZHVyYXRpb24sIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9mID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2YudGFnQ29uZGl0aW9ucyB9KSwgcHJvcG9zZWRMZWFzZUlkOiB0aGlzLl9sZWFzZUlkIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRvIGNoYW5nZSB0aGUgSUQgb2YgdGhlIGxlYXNlLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2xlYXNlLWNvbnRhaW5lclxuICAgICAqIGFuZFxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2xlYXNlLWJsb2JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wb3NlZExlYXNlSWQgLSB0aGUgcHJvcG9zZWQgbmV3IGxlYXNlIElkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gb3B0aW9uIHRvIGNvbmZpZ3VyZSBsZWFzZSBtYW5hZ2VtZW50IG9wZXJhdGlvbnMuXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgY2hhbmdlIGxlYXNlIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBjaGFuZ2VMZWFzZShwcm9wb3NlZExlYXNlSWQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZjtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JMZWFzZUNsaWVudC1jaGFuZ2VMZWFzZVwiLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ29udGFpbmVyICYmXG4gICAgICAgICAgICAoKCgoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pZk1hdGNoKSAmJiAoKF9iID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWZNYXRjaCkgIT09IEVUYWdOb25lKSB8fFxuICAgICAgICAgICAgICAgICgoKF9jID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuaWZOb25lTWF0Y2gpICYmICgoX2QgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5pZk5vbmVNYXRjaCkgIT09IEVUYWdOb25lKSB8fFxuICAgICAgICAgICAgICAgICgoX2UgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS50YWdDb25kaXRpb25zKSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIElmTWF0Y2gsIElmTm9uZU1hdGNoIGFuZCB0YWdzIGFjY2VzcyBjb25kaXRpb25zIGFyZSBpZ25vcmVkIGJ5IHRoZSBzZXJ2aWNlLiBWYWx1ZXMgb3RoZXIgdGhhbiB1bmRlZmluZWQgb3IgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgYXJlIG5vdCBhY2NlcHRhYmxlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9jb250YWluZXJPckJsb2JPcGVyYXRpb24uY2hhbmdlTGVhc2UodGhpcy5fbGVhc2VJZCwgcHJvcG9zZWRMZWFzZUlkLCBPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9mID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2YudGFnQ29uZGl0aW9ucyB9KSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICAgICAgdGhpcy5fbGVhc2VJZCA9IHByb3Bvc2VkTGVhc2VJZDtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gZnJlZSB0aGUgbGVhc2UgaWYgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZCBzbyB0aGF0IGFub3RoZXIgY2xpZW50IG1heVxuICAgICAqIGltbWVkaWF0ZWx5IGFjcXVpcmUgYSBsZWFzZSBhZ2FpbnN0IHRoZSBjb250YWluZXIgb3IgdGhlIGJsb2IuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvbGVhc2UtY29udGFpbmVyXG4gICAgICogYW5kXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvbGVhc2UtYmxvYlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBvcHRpb24gdG8gY29uZmlndXJlIGxlYXNlIG1hbmFnZW1lbnQgb3BlcmF0aW9ucy5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciByZWxlYXNlIGxlYXNlIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyByZWxlYXNlTGVhc2Uob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYkxlYXNlQ2xpZW50LXJlbGVhc2VMZWFzZVwiLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ29udGFpbmVyICYmXG4gICAgICAgICAgICAoKCgoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pZk1hdGNoKSAmJiAoKF9iID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWZNYXRjaCkgIT09IEVUYWdOb25lKSB8fFxuICAgICAgICAgICAgICAgICgoKF9jID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuaWZOb25lTWF0Y2gpICYmICgoX2QgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5pZk5vbmVNYXRjaCkgIT09IEVUYWdOb25lKSB8fFxuICAgICAgICAgICAgICAgICgoX2UgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS50YWdDb25kaXRpb25zKSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIElmTWF0Y2gsIElmTm9uZU1hdGNoIGFuZCB0YWdzIGFjY2VzcyBjb25kaXRpb25zIGFyZSBpZ25vcmVkIGJ5IHRoZSBzZXJ2aWNlLiBWYWx1ZXMgb3RoZXIgdGhhbiB1bmRlZmluZWQgb3IgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgYXJlIG5vdCBhY2NlcHRhYmxlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NvbnRhaW5lck9yQmxvYk9wZXJhdGlvbi5yZWxlYXNlTGVhc2UodGhpcy5fbGVhc2VJZCwgT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfZiA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2YgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9mLnRhZ0NvbmRpdGlvbnMgfSkgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gcmVuZXcgdGhlIGxlYXNlLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2xlYXNlLWNvbnRhaW5lclxuICAgICAqIGFuZFxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2xlYXNlLWJsb2JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9uIHRvIGNvbmZpZ3VyZSBsZWFzZSBtYW5hZ2VtZW50IG9wZXJhdGlvbnMuXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgcmVuZXcgbGVhc2Ugb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHJlbmV3TGVhc2Uob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYkxlYXNlQ2xpZW50LXJlbmV3TGVhc2VcIiwgb3B0aW9ucyk7XG4gICAgICAgIGlmICh0aGlzLl9pc0NvbnRhaW5lciAmJlxuICAgICAgICAgICAgKCgoKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaWZNYXRjaCkgJiYgKChfYiA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmlmTWF0Y2gpICE9PSBFVGFnTm9uZSkgfHxcbiAgICAgICAgICAgICAgICAoKChfYyA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlmTm9uZU1hdGNoKSAmJiAoKF9kID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuaWZOb25lTWF0Y2gpICE9PSBFVGFnTm9uZSkgfHxcbiAgICAgICAgICAgICAgICAoKF9lID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UudGFnQ29uZGl0aW9ucykpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSBJZk1hdGNoLCBJZk5vbmVNYXRjaCBhbmQgdGFncyBhY2Nlc3MgY29uZGl0aW9ucyBhcmUgaWdub3JlZCBieSB0aGUgc2VydmljZS4gVmFsdWVzIG90aGVyIHRoYW4gdW5kZWZpbmVkIG9yIHRoZWlyIGRlZmF1bHQgdmFsdWVzIGFyZSBub3QgYWNjZXB0YWJsZS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb250YWluZXJPckJsb2JPcGVyYXRpb24ucmVuZXdMZWFzZSh0aGlzLl9sZWFzZUlkLCBPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9mID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2YudGFnQ29uZGl0aW9ucyB9KSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUbyBlbmQgdGhlIGxlYXNlIGJ1dCBlbnN1cmUgdGhhdCBhbm90aGVyIGNsaWVudCBjYW5ub3QgYWNxdWlyZSBhIG5ldyBsZWFzZVxuICAgICAqIHVudGlsIHRoZSBjdXJyZW50IGxlYXNlIHBlcmlvZCBoYXMgZXhwaXJlZC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9sZWFzZS1jb250YWluZXJcbiAgICAgKiBhbmRcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9sZWFzZS1ibG9iXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYnJlYWtQZXJpb2QgLSBCcmVhayBwZXJpb2RcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIG9wdGlvbnMgdG8gY29uZmlndXJlIGxlYXNlIG1hbmFnZW1lbnQgb3BlcmF0aW9ucy5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciBicmVhayBsZWFzZSBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgYnJlYWtMZWFzZShicmVha1BlcmlvZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYkxlYXNlQ2xpZW50LWJyZWFrTGVhc2VcIiwgb3B0aW9ucyk7XG4gICAgICAgIGlmICh0aGlzLl9pc0NvbnRhaW5lciAmJlxuICAgICAgICAgICAgKCgoKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaWZNYXRjaCkgJiYgKChfYiA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmlmTWF0Y2gpICE9PSBFVGFnTm9uZSkgfHxcbiAgICAgICAgICAgICAgICAoKChfYyA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlmTm9uZU1hdGNoKSAmJiAoKF9kID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuaWZOb25lTWF0Y2gpICE9PSBFVGFnTm9uZSkgfHxcbiAgICAgICAgICAgICAgICAoKF9lID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UudGFnQ29uZGl0aW9ucykpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSBJZk1hdGNoLCBJZk5vbmVNYXRjaCBhbmQgdGFncyBhY2Nlc3MgY29uZGl0aW9ucyBhcmUgaWdub3JlZCBieSB0aGUgc2VydmljZS4gVmFsdWVzIG90aGVyIHRoYW4gdW5kZWZpbmVkIG9yIHRoZWlyIGRlZmF1bHQgdmFsdWVzIGFyZSBub3QgYWNjZXB0YWJsZS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG9wZXJhdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGJyZWFrUGVyaW9kLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfZiA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2YgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9mLnRhZ0NvbmRpdGlvbnMgfSkgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NvbnRhaW5lck9yQmxvYk9wZXJhdGlvbi5icmVha0xlYXNlKG9wZXJhdGlvbk9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJsb2JMZWFzZUNsaWVudC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSBcInN0cmVhbVwiO1xuLyoqXG4gKiBPTkxZIEFWQUlMQUJMRSBJTiBOT0RFLkpTIFJVTlRJTUUuXG4gKlxuICogQSBOb2RlLmpzIFJlYWRhYmxlU3RyZWFtIHdpbGwgaW50ZXJuYWxseSByZXRyeSB3aGVuIGludGVybmFsIFJlYWRhYmxlU3RyZWFtIHVuZXhwZWN0ZWQgZW5kcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFJldHJpYWJsZVJlYWRhYmxlU3RyZWFtIGV4dGVuZHMgUmVhZGFibGUge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUmV0cmlhYmxlUmVhZGFibGVTdHJlYW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc291cmNlIC0gVGhlIGN1cnJlbnQgUmVhZGFibGVTdHJlYW0gcmV0dXJuZWQgZnJvbSBnZXR0ZXJcbiAgICAgKiBAcGFyYW0gZ2V0dGVyIC0gQSBtZXRob2QgY2FsbGluZyBkb3dubG9hZGluZyByZXF1ZXN0IHJldHVybmluZ1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIG5ldyBSZWFkYWJsZVN0cmVhbSBmcm9tIHNwZWNpZmllZCBvZmZzZXRcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gT2Zmc2V0IHBvc2l0aW9uIGluIG9yaWdpbmFsIGRhdGEgc291cmNlIHRvIHJlYWRcbiAgICAgKiBAcGFyYW0gY291bnQgLSBIb3cgbXVjaCBkYXRhIGluIG9yaWdpbmFsIGRhdGEgc291cmNlIHRvIHJlYWRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc291cmNlLCBnZXR0ZXIsIG9mZnNldCwgY291bnQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcih7IGhpZ2hXYXRlck1hcms6IG9wdGlvbnMuaGlnaFdhdGVyTWFyayB9KTtcbiAgICAgICAgdGhpcy5yZXRyaWVzID0gMDtcbiAgICAgICAgdGhpcy5zb3VyY2VEYXRhSGFuZGxlciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRvSW5qZWN0RXJyb3JPbmNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRvSW5qZWN0RXJyb3JPbmNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuc291cmNlLnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2UucmVtb3ZlQWxsTGlzdGVuZXJzKFwiZGF0YVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZS5lbWl0KFwiZW5kXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgLy8gICBgT2Zmc2V0OiAke3RoaXMub2Zmc2V0fSwgUmVjZWl2ZWQgJHtkYXRhLmxlbmd0aH0gZnJvbSBpbnRlcm5hbCBzdHJlYW1gXG4gICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAodGhpcy5vblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblByb2dyZXNzKHsgbG9hZGVkQnl0ZXM6IHRoaXMub2Zmc2V0IC0gdGhpcy5zdGFydCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5wdXNoKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2UucGF1c2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zb3VyY2VFcnJvck9yRW5kSGFuZGxlciA9IChlcnIpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBTb3VyY2Ugc3RyZWFtIGVtaXRzIGVuZCBvciBlcnJvciwgb2Zmc2V0OiAke1xuICAgICAgICAgICAgLy8gICAgIHRoaXMub2Zmc2V0XG4gICAgICAgICAgICAvLyAgIH0sIGRlc3QgZW5kIDogJHt0aGlzLmVuZH1gXG4gICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVTb3VyY2VFdmVudEhhbmRsZXJzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5vZmZzZXQgLSAxID09PSB0aGlzLmVuZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHVzaChudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub2Zmc2V0IDw9IHRoaXMuZW5kKSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgLy8gICBgcmV0cmllczogJHt0aGlzLnJldHJpZXN9LCBtYXggcmV0cmllczogJHt0aGlzLm1heFJldHJpZXN9YFxuICAgICAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmV0cmllcyA8IHRoaXMubWF4UmV0cnlSZXF1ZXN0cykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJldHJpZXMgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXR0ZXIodGhpcy5vZmZzZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigobmV3U291cmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZSA9IG5ld1NvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U291cmNlRXZlbnRIYW5kbGVycygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3kobmV3IEVycm9yKGBEYXRhIGNvcnJ1cHRpb24gZmFpbHVyZTogcmVjZWl2ZWQgbGVzcyBkYXRhIHRoYW4gcmVxdWlyZWQgYW5kIHJlYWNoZWQgbWF4UmV0aXJlcyBsaW1pdGF0aW9uLiBSZWNlaXZlZCBkYXRhIG9mZnNldDogJHt0aGlzLm9mZnNldCAtIDF9LCBkYXRhIG5lZWRlZCBvZmZzZXQ6ICR7dGhpcy5lbmR9LCByZXRyaWVzOiAke3RoaXMucmV0cmllc30sIG1heCByZXRyaWVzOiAke3RoaXMubWF4UmV0cnlSZXF1ZXN0c31gKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KG5ldyBFcnJvcihgRGF0YSBjb3JydXB0aW9uIGZhaWx1cmU6IFJlY2VpdmVkIG1vcmUgZGF0YSB0aGFuIG9yaWdpbmFsIHJlcXVlc3QsIGRhdGEgbmVlZGVkIG9mZnNldCBpcyAke3RoaXMuZW5kfSwgcmVjZWl2ZWQgb2Zmc2V0OiAke3RoaXMub2Zmc2V0IC0gMX1gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZ2V0dGVyID0gZ2V0dGVyO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgdGhpcy5zdGFydCA9IG9mZnNldDtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHRoaXMuZW5kID0gb2Zmc2V0ICsgY291bnQgLSAxO1xuICAgICAgICB0aGlzLm1heFJldHJ5UmVxdWVzdHMgPVxuICAgICAgICAgICAgb3B0aW9ucy5tYXhSZXRyeVJlcXVlc3RzICYmIG9wdGlvbnMubWF4UmV0cnlSZXF1ZXN0cyA+PSAwID8gb3B0aW9ucy5tYXhSZXRyeVJlcXVlc3RzIDogMDtcbiAgICAgICAgdGhpcy5vblByb2dyZXNzID0gb3B0aW9ucy5vblByb2dyZXNzO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLnNldFNvdXJjZUV2ZW50SGFuZGxlcnMoKTtcbiAgICB9XG4gICAgX3JlYWQoKSB7XG4gICAgICAgIHRoaXMuc291cmNlLnJlc3VtZSgpO1xuICAgIH1cbiAgICBzZXRTb3VyY2VFdmVudEhhbmRsZXJzKCkge1xuICAgICAgICB0aGlzLnNvdXJjZS5vbihcImRhdGFcIiwgdGhpcy5zb3VyY2VEYXRhSGFuZGxlcik7XG4gICAgICAgIHRoaXMuc291cmNlLm9uKFwiZW5kXCIsIHRoaXMuc291cmNlRXJyb3JPckVuZEhhbmRsZXIpO1xuICAgICAgICB0aGlzLnNvdXJjZS5vbihcImVycm9yXCIsIHRoaXMuc291cmNlRXJyb3JPckVuZEhhbmRsZXIpO1xuICAgIH1cbiAgICByZW1vdmVTb3VyY2VFdmVudEhhbmRsZXJzKCkge1xuICAgICAgICB0aGlzLnNvdXJjZS5yZW1vdmVMaXN0ZW5lcihcImRhdGFcIiwgdGhpcy5zb3VyY2VEYXRhSGFuZGxlcik7XG4gICAgICAgIHRoaXMuc291cmNlLnJlbW92ZUxpc3RlbmVyKFwiZW5kXCIsIHRoaXMuc291cmNlRXJyb3JPckVuZEhhbmRsZXIpO1xuICAgICAgICB0aGlzLnNvdXJjZS5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIHRoaXMuc291cmNlRXJyb3JPckVuZEhhbmRsZXIpO1xuICAgIH1cbiAgICBfZGVzdHJveShlcnJvciwgY2FsbGJhY2spIHtcbiAgICAgICAgLy8gcmVtb3ZlIGxpc3RlbmVyIGZyb20gc291cmNlIGFuZCByZWxlYXNlIHNvdXJjZVxuICAgICAgICB0aGlzLnJlbW92ZVNvdXJjZUV2ZW50SGFuZGxlcnMoKTtcbiAgICAgICAgdGhpcy5zb3VyY2UuZGVzdHJveSgpO1xuICAgICAgICBjYWxsYmFjayhlcnJvciA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGVycm9yKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZXRyaWFibGVSZWFkYWJsZVN0cmVhbS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IGlzTm9kZSB9IGZyb20gXCJAYXp1cmUvY29yZS1odHRwXCI7XG5pbXBvcnQgeyBSZXRyaWFibGVSZWFkYWJsZVN0cmVhbSwgfSBmcm9tIFwiLi91dGlscy9SZXRyaWFibGVSZWFkYWJsZVN0cmVhbVwiO1xuLyoqXG4gKiBPTkxZIEFWQUlMQUJMRSBJTiBOT0RFLkpTIFJVTlRJTUUuXG4gKlxuICogQmxvYkRvd25sb2FkUmVzcG9uc2UgaW1wbGVtZW50cyBCbG9iRG93bmxvYWRSZXNwb25zZVBhcnNlZCBpbnRlcmZhY2UsIGFuZCBpbiBOb2RlLmpzIHJ1bnRpbWUgaXQgd2lsbFxuICogYXV0b21hdGljYWxseSByZXRyeSB3aGVuIGludGVybmFsIHJlYWQgc3RyZWFtIHVuZXhwZWN0ZWQgZW5kcy4gKFRoaXMga2luZCBvZiB1bmV4cGVjdGVkIGVuZHMgY2Fubm90XG4gKiB0cmlnZ2VyIHJldHJpZXMgZGVmaW5lZCBpbiBwaXBlbGluZSByZXRyeSBwb2xpY3kuKVxuICpcbiAqIFRoZSB7QGxpbmsgcmVhZGFibGVTdHJlYW1Cb2R5fSBzdHJlYW0gd2lsbCByZXRyeSB1bmRlcmxheWVyLCB5b3UgY2FuIGp1c3QgdXNlIGl0IGFzIGEgbm9ybWFsIE5vZGUuanNcbiAqIFJlYWRhYmxlIHN0cmVhbS5cbiAqL1xuZXhwb3J0IGNsYXNzIEJsb2JEb3dubG9hZFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEJsb2JEb3dubG9hZFJlc3BvbnNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9yaWdpbmFsUmVzcG9uc2UgLVxuICAgICAqIEBwYXJhbSBnZXR0ZXIgLVxuICAgICAqIEBwYXJhbSBvZmZzZXQgLVxuICAgICAqIEBwYXJhbSBjb3VudCAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9yaWdpbmFsUmVzcG9uc2UsIGdldHRlciwgb2Zmc2V0LCBjb3VudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMub3JpZ2luYWxSZXNwb25zZSA9IG9yaWdpbmFsUmVzcG9uc2U7XG4gICAgICAgIHRoaXMuYmxvYkRvd25sb2FkU3RyZWFtID0gbmV3IFJldHJpYWJsZVJlYWRhYmxlU3RyZWFtKHRoaXMub3JpZ2luYWxSZXNwb25zZS5yZWFkYWJsZVN0cmVhbUJvZHksIGdldHRlciwgb2Zmc2V0LCBjb3VudCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBzZXJ2aWNlIHN1cHBvcnRzXG4gICAgICogcmVxdWVzdHMgZm9yIHBhcnRpYWwgZmlsZSBjb250ZW50LlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGFjY2VwdFJhbmdlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5hY2NlcHRSYW5nZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgaXQgd2FzIHByZXZpb3VzbHkgc3BlY2lmaWVkXG4gICAgICogZm9yIHRoZSBmaWxlLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNhY2hlQ29udHJvbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jYWNoZUNvbnRyb2w7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHNwZWNpZmllZFxuICAgICAqIGZvciB0aGUgJ3gtbXMtY29udGVudC1kaXNwb3NpdGlvbicgaGVhZGVyIGFuZCBzcGVjaWZpZXMgaG93IHRvIHByb2Nlc3MgdGhlXG4gICAgICogcmVzcG9uc2UuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29udGVudERpc3Bvc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvbnRlbnREaXNwb3NpdGlvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdmFsdWUgdGhhdCB3YXMgc3BlY2lmaWVkXG4gICAgICogZm9yIHRoZSBDb250ZW50LUVuY29kaW5nIHJlcXVlc3QgaGVhZGVyLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvbnRlbnRFbmNvZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb250ZW50RW5jb2Rpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHNwZWNpZmllZFxuICAgICAqIGZvciB0aGUgQ29udGVudC1MYW5ndWFnZSByZXF1ZXN0IGhlYWRlci5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb250ZW50TGFuZ3VhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29udGVudExhbmd1YWdlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBzZXF1ZW5jZSBudW1iZXIgZm9yIGFcbiAgICAgKiBwYWdlIGJsb2IuIFRoaXMgaGVhZGVyIGlzIG5vdCByZXR1cm5lZCBmb3IgYmxvY2sgYmxvYnMgb3IgYXBwZW5kIGJsb2JzLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGJsb2JTZXF1ZW5jZU51bWJlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5ibG9iU2VxdWVuY2VOdW1iZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBibG9iJ3MgdHlwZS4gUG9zc2libGUgdmFsdWVzIGluY2x1ZGU6XG4gICAgICogJ0Jsb2NrQmxvYicsICdQYWdlQmxvYicsICdBcHBlbmRCbG9iJy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBibG9iVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5ibG9iVHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBieXRlcyBwcmVzZW50IGluIHRoZVxuICAgICAqIHJlc3BvbnNlIGJvZHkuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29udGVudExlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb250ZW50TGVuZ3RoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgZmlsZSBoYXMgYW4gTUQ1IGhhc2ggYW5kIHRoZVxuICAgICAqIHJlcXVlc3QgaXMgdG8gcmVhZCB0aGUgZnVsbCBmaWxlLCB0aGlzIHJlc3BvbnNlIGhlYWRlciBpcyByZXR1cm5lZCBzbyB0aGF0XG4gICAgICogdGhlIGNsaWVudCBjYW4gY2hlY2sgZm9yIG1lc3NhZ2UgY29udGVudCBpbnRlZ3JpdHkuIElmIHRoZSByZXF1ZXN0IGlzIHRvXG4gICAgICogcmVhZCBhIHNwZWNpZmllZCByYW5nZSBhbmQgdGhlICd4LW1zLXJhbmdlLWdldC1jb250ZW50LW1kNScgaXMgc2V0IHRvXG4gICAgICogdHJ1ZSwgdGhlbiB0aGUgcmVxdWVzdCByZXR1cm5zIGFuIE1ENSBoYXNoIGZvciB0aGUgcmFuZ2UsIGFzIGxvbmcgYXMgdGhlXG4gICAgICogcmFuZ2Ugc2l6ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gNCBNQi4gSWYgbmVpdGhlciBvZiB0aGVzZSBzZXRzIG9mXG4gICAgICogY29uZGl0aW9ucyBpcyB0cnVlLCB0aGVuIG5vIHZhbHVlIGlzIHJldHVybmVkIGZvciB0aGUgJ0NvbnRlbnQtTUQ1J1xuICAgICAqIGhlYWRlci5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb250ZW50TUQ1KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvbnRlbnRNRDU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGUgcmFuZ2Ugb2YgYnl0ZXMgcmV0dXJuZWQgaWZcbiAgICAgKiB0aGUgY2xpZW50IHJlcXVlc3RlZCBhIHN1YnNldCBvZiB0aGUgZmlsZSBieSBzZXR0aW5nIHRoZSBSYW5nZSByZXF1ZXN0XG4gICAgICogaGVhZGVyLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvbnRlbnRSYW5nZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb250ZW50UmFuZ2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjb250ZW50IHR5cGUgc3BlY2lmaWVkIGZvciB0aGUgZmlsZS5cbiAgICAgKiBUaGUgZGVmYXVsdCBjb250ZW50IHR5cGUgaXMgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb250ZW50VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb250ZW50VHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uY2x1c2lvbiB0aW1lIG9mIHRoZSBsYXN0IGF0dGVtcHRlZFxuICAgICAqIENvcHkgRmlsZSBvcGVyYXRpb24gd2hlcmUgdGhpcyBmaWxlIHdhcyB0aGUgZGVzdGluYXRpb24gZmlsZS4gVGhpcyB2YWx1ZVxuICAgICAqIGNhbiBzcGVjaWZ5IHRoZSB0aW1lIG9mIGEgY29tcGxldGVkLCBhYm9ydGVkLCBvciBmYWlsZWQgY29weSBhdHRlbXB0LlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvcHlDb21wbGV0ZWRPbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb3B5Q29tcGxldGVkT247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0cmluZyBpZGVudGlmaWVyIGZvciB0aGUgbGFzdCBhdHRlbXB0ZWQgQ29weVxuICAgICAqIEZpbGUgb3BlcmF0aW9uIHdoZXJlIHRoaXMgZmlsZSB3YXMgdGhlIGRlc3RpbmF0aW9uIGZpbGUuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29weUlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvcHlJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udGFpbnMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgYW5kXG4gICAgICogdGhlIHRvdGFsIGJ5dGVzIGluIHRoZSBzb3VyY2UgaW4gdGhlIGxhc3QgYXR0ZW1wdGVkIENvcHkgRmlsZSBvcGVyYXRpb25cbiAgICAgKiB3aGVyZSB0aGlzIGZpbGUgd2FzIHRoZSBkZXN0aW5hdGlvbiBmaWxlLiBDYW4gc2hvdyBiZXR3ZWVuIDAgYW5kXG4gICAgICogQ29udGVudC1MZW5ndGggYnl0ZXMgY29waWVkLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvcHlQcm9ncmVzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb3B5UHJvZ3Jlc3M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVSTCB1cCB0byAyS0IgaW4gbGVuZ3RoIHRoYXQgc3BlY2lmaWVzIHRoZVxuICAgICAqIHNvdXJjZSBmaWxlIHVzZWQgaW4gdGhlIGxhc3QgYXR0ZW1wdGVkIENvcHkgRmlsZSBvcGVyYXRpb24gd2hlcmUgdGhpcyBmaWxlXG4gICAgICogd2FzIHRoZSBkZXN0aW5hdGlvbiBmaWxlLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvcHlTb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29weVNvdXJjZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhdGUgb2YgdGhlIGNvcHkgb3BlcmF0aW9uXG4gICAgICogaWRlbnRpZmllZCBieSAneC1tcy1jb3B5LWlkJy4gUG9zc2libGUgdmFsdWVzIGluY2x1ZGU6ICdwZW5kaW5nJyxcbiAgICAgKiAnc3VjY2VzcycsICdhYm9ydGVkJywgJ2ZhaWxlZCdcbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb3B5U3RhdHVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvcHlTdGF0dXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9ubHkgYXBwZWFycyB3aGVuXG4gICAgICogeC1tcy1jb3B5LXN0YXR1cyBpcyBmYWlsZWQgb3IgcGVuZGluZy4gRGVzY3JpYmVzIGNhdXNlIG9mIGZhdGFsIG9yXG4gICAgICogbm9uLWZhdGFsIGNvcHkgb3BlcmF0aW9uIGZhaWx1cmUuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29weVN0YXR1c0Rlc2NyaXB0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvcHlTdGF0dXNEZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2hlbiBhIGJsb2IgaXMgbGVhc2VkLFxuICAgICAqIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBsZWFzZSBpcyBvZiBpbmZpbml0ZSBvciBmaXhlZCBkdXJhdGlvbi4gUG9zc2libGVcbiAgICAgKiB2YWx1ZXMgaW5jbHVkZTogJ2luZmluaXRlJywgJ2ZpeGVkJy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBsZWFzZUR1cmF0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmxlYXNlRHVyYXRpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExlYXNlIHN0YXRlIG9mIHRoZSBibG9iLiBQb3NzaWJsZVxuICAgICAqIHZhbHVlcyBpbmNsdWRlOiAnYXZhaWxhYmxlJywgJ2xlYXNlZCcsICdleHBpcmVkJywgJ2JyZWFraW5nJywgJ2Jyb2tlbicuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgbGVhc2VTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5sZWFzZVN0YXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBsZWFzZSBzdGF0dXMgb2YgdGhlXG4gICAgICogYmxvYi4gUG9zc2libGUgdmFsdWVzIGluY2x1ZGU6ICdsb2NrZWQnLCAndW5sb2NrZWQnLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGxlYXNlU3RhdHVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmxlYXNlU3RhdHVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIFVUQyBkYXRlL3RpbWUgdmFsdWUgZ2VuZXJhdGVkIGJ5IHRoZSBzZXJ2aWNlIHRoYXRcbiAgICAgKiBpbmRpY2F0ZXMgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIHJlc3BvbnNlIHdhcyBpbml0aWF0ZWQuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5kYXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGNvbW1pdHRlZCBibG9ja3NcbiAgICAgKiBwcmVzZW50IGluIHRoZSBibG9iLiBUaGlzIGhlYWRlciBpcyByZXR1cm5lZCBvbmx5IGZvciBhcHBlbmQgYmxvYnMuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgYmxvYkNvbW1pdHRlZEJsb2NrQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuYmxvYkNvbW1pdHRlZEJsb2NrQ291bnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBFVGFnIGNvbnRhaW5zIGEgdmFsdWUgdGhhdCB5b3UgY2FuIHVzZSB0b1xuICAgICAqIHBlcmZvcm0gb3BlcmF0aW9ucyBjb25kaXRpb25hbGx5LCBpbiBxdW90ZXMuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgZXRhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5ldGFnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBibG9iXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgdGFnQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UudGFnQ291bnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBjb2RlLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGVycm9yQ29kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5lcnJvckNvZGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGlzIGhlYWRlciBpcyBzZXQgdG9cbiAgICAgKiB0cnVlIGlmIHRoZSBmaWxlIGRhdGEgYW5kIGFwcGxpY2F0aW9uIG1ldGFkYXRhIGFyZSBjb21wbGV0ZWx5IGVuY3J5cHRlZFxuICAgICAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtLiBPdGhlcndpc2UsIHRoZSB2YWx1ZSBpcyBzZXQgdG8gZmFsc2UgKHdoZW5cbiAgICAgKiB0aGUgZmlsZSBpcyB1bmVuY3J5cHRlZCwgb3IgaWYgb25seSBwYXJ0cyBvZiB0aGUgZmlsZS9hcHBsaWNhdGlvbiBtZXRhZGF0YVxuICAgICAqIGFyZSBlbmNyeXB0ZWQpLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGlzU2VydmVyRW5jcnlwdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmlzU2VydmVyRW5jcnlwdGVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgYmxvYiBoYXMgYSBNRDUgaGFzaCwgYW5kIGlmXG4gICAgICogcmVxdWVzdCBjb250YWlucyByYW5nZSBoZWFkZXIgKFJhbmdlIG9yIHgtbXMtcmFuZ2UpLCB0aGlzIHJlc3BvbnNlIGhlYWRlclxuICAgICAqIGlzIHJldHVybmVkIHdpdGggdGhlIHZhbHVlIG9mIHRoZSB3aG9sZSBibG9iJ3MgTUQ1IHZhbHVlLiBUaGlzIHZhbHVlIG1heVxuICAgICAqIG9yIG1heSBub3QgYmUgZXF1YWwgdG8gdGhlIHZhbHVlIHJldHVybmVkIGluIENvbnRlbnQtTUQ1IGhlYWRlciwgd2l0aCB0aGVcbiAgICAgKiBsYXR0ZXIgY2FsY3VsYXRlZCBmcm9tIHRoZSByZXF1ZXN0ZWQgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgYmxvYkNvbnRlbnRNRDUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuYmxvYkNvbnRlbnRNRDU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRhdGUgYW5kIHRpbWUgdGhlIGZpbGUgd2FzIGxhc3RcbiAgICAgKiBtb2RpZmllZC4gQW55IG9wZXJhdGlvbiB0aGF0IG1vZGlmaWVzIHRoZSBmaWxlIG9yIGl0cyBwcm9wZXJ0aWVzIHVwZGF0ZXNcbiAgICAgKiB0aGUgbGFzdCBtb2RpZmllZCB0aW1lLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGxhc3RNb2RpZmllZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5sYXN0TW9kaWZpZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIFVUQyBkYXRlIGFuZCB0aW1lIGdlbmVyYXRlZCBieSB0aGUgc2VydmljZSB0aGF0IGluZGljYXRlcyB0aGUgdGltZSBhdCB3aGljaCB0aGUgYmxvYiB3YXNcbiAgICAgKiBsYXN0IHJlYWQgb3Igd3JpdHRlbiB0by5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBsYXN0QWNjZXNzZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UubGFzdEFjY2Vzc2VkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkYXRlIGFuZCB0aW1lIHRoZSBibG9iIHdhcyBjcmVhdGVkLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNyZWF0ZWRPbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jcmVhdGVkT247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgbmFtZS12YWx1ZSBwYWlyXG4gICAgICogdG8gYXNzb2NpYXRlIHdpdGggYSBmaWxlIHN0b3JhZ2Ugb2JqZWN0LlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IG1ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLm1ldGFkYXRhO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGhlYWRlciB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSByZXF1ZXN0XG4gICAgICogdGhhdCB3YXMgbWFkZSBhbmQgY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZyB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCByZXF1ZXN0SWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UucmVxdWVzdElkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiBhIGNsaWVudCByZXF1ZXN0IGlkIGhlYWRlciBpcyBzZW50IGluIHRoZSByZXF1ZXN0LCB0aGlzIGhlYWRlciB3aWxsIGJlIHByZXNlbnQgaW4gdGhlXG4gICAgICogcmVzcG9uc2Ugd2l0aCB0aGUgc2FtZSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjbGllbnRSZXF1ZXN0SWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY2xpZW50UmVxdWVzdElkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhlIHZlcnNpb24gb2YgdGhlIEJsb2Igc2VydmljZSB1c2VkXG4gICAgICogdG8gZXhlY3V0ZSB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCB2ZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLnZlcnNpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGUgdmVyc2lvbklkIG9mIHRoZSBkb3dubG9hZGVkIGJsb2IgdmVyc2lvbi5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCB2ZXJzaW9uSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UudmVyc2lvbklkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB2ZXJzaW9uIG9mIHRoaXMgYmxvYiBpcyBhIGN1cnJlbnQgdmVyc2lvbi5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBpc0N1cnJlbnRWZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmlzQ3VycmVudFZlcnNpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBTSEEtMjU2IGhhc2ggb2YgdGhlIGVuY3J5cHRpb24ga2V5IHVzZWQgdG8gZW5jcnlwdCB0aGUgYmxvYi4gVGhpcyB2YWx1ZSBpcyBvbmx5IHJldHVybmVkXG4gICAgICogd2hlbiB0aGUgYmxvYiB3YXMgZW5jcnlwdGVkIHdpdGggYSBjdXN0b21lci1wcm92aWRlZCBrZXkuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgZW5jcnlwdGlvbktleVNoYTI1NigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5lbmNyeXB0aW9uS2V5U2hhMjU2O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcmVxdWVzdCBpcyB0byByZWFkIGEgc3BlY2lmaWVkIHJhbmdlIGFuZCB0aGUgeC1tcy1yYW5nZS1nZXQtY29udGVudC1jcmM2NCBpcyBzZXQgdG9cbiAgICAgKiB0cnVlLCB0aGVuIHRoZSByZXF1ZXN0IHJldHVybnMgYSBjcmM2NCBmb3IgdGhlIHJhbmdlLCBhcyBsb25nIGFzIHRoZSByYW5nZSBzaXplIGlzIGxlc3MgdGhhblxuICAgICAqIG9yIGVxdWFsIHRvIDQgTUIuIElmIGJvdGggeC1tcy1yYW5nZS1nZXQtY29udGVudC1jcmM2NCAmIHgtbXMtcmFuZ2UtZ2V0LWNvbnRlbnQtbWQ1IGlzXG4gICAgICogc3BlY2lmaWVkIGluIHRoZSBzYW1lIHJlcXVlc3QsIGl0IHdpbGwgZmFpbCB3aXRoIDQwMChCYWQgUmVxdWVzdClcbiAgICAgKi9cbiAgICBnZXQgY29udGVudENyYzY0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvbnRlbnRDcmM2NDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT2JqZWN0IFJlcGxpY2F0aW9uIFBvbGljeSBJZCBvZiB0aGUgZGVzdGluYXRpb24gYmxvYi5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBvYmplY3RSZXBsaWNhdGlvbkRlc3RpbmF0aW9uUG9saWN5SWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2Uub2JqZWN0UmVwbGljYXRpb25EZXN0aW5hdGlvblBvbGljeUlkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZWQgT2JqZWN0IFJlcGxpY2F0aW9uIFBvbGljeSBJZCwgUnVsZSBJZChzKSBhbmQgc3RhdHVzIG9mIHRoZSBzb3VyY2UgYmxvYi5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBvYmplY3RSZXBsaWNhdGlvblNvdXJjZVByb3BlcnRpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2Uub2JqZWN0UmVwbGljYXRpb25Tb3VyY2VQcm9wZXJ0aWVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGlzIGJsb2IgaGFzIGJlZW4gc2VhbGVkLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGlzU2VhbGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmlzU2VhbGVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVVEMgZGF0ZS90aW1lIHZhbHVlIGdlbmVyYXRlZCBieSB0aGUgc2VydmljZSB0aGF0IGluZGljYXRlcyB0aGUgdGltZSBhdCB3aGljaCB0aGUgYmxvYiBpbW11dGFiaWxpdHkgcG9saWN5IHdpbGwgZXhwaXJlLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGltbXV0YWJpbGl0eVBvbGljeUV4cGlyZXNPbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5pbW11dGFiaWxpdHlQb2xpY3lFeHBpcmVzT247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpbW11dGFiaWxpdHkgcG9saWN5IG1vZGUuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgaW1tdXRhYmlsaXR5UG9saWN5TW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5pbW11dGFiaWxpdHlQb2xpY3lNb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgYSBsZWdhbCBob2xkIGlzIHByZXNlbnQgb24gdGhlIGJsb2IuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgbGVnYWxIb2xkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmxlZ2FsSG9sZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlc3BvbnNlIGJvZHkgYXMgYSBicm93c2VyIEJsb2IuXG4gICAgICogQWx3YXlzIHVuZGVmaW5lZCBpbiBub2RlLmpzLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvbnRlbnRBc0Jsb2IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuYmxvYkJvZHk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSByZXNwb25zZSBib2R5IGFzIGEgbm9kZS5qcyBSZWFkYWJsZSBzdHJlYW0uXG4gICAgICogQWx3YXlzIHVuZGVmaW5lZCBpbiB0aGUgYnJvd3Nlci5cbiAgICAgKlxuICAgICAqIEl0IHdpbGwgYXV0b21hdGljYWxseSByZXRyeSB3aGVuIGludGVybmFsIHJlYWQgc3RyZWFtIHVuZXhwZWN0ZWQgZW5kcy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCByZWFkYWJsZVN0cmVhbUJvZHkoKSB7XG4gICAgICAgIHJldHVybiBpc05vZGUgPyB0aGlzLmJsb2JEb3dubG9hZFN0cmVhbSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIEhUVFAgcmVzcG9uc2UuXG4gICAgICovXG4gICAgZ2V0IF9yZXNwb25zZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5fcmVzcG9uc2U7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmxvYkRvd25sb2FkUmVzcG9uc2UuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5leHBvcnQge307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb2RlbHMuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBfX2FzeW5jRGVsZWdhdG9yLCBfX2FzeW5jR2VuZXJhdG9yLCBfX2FzeW5jVmFsdWVzLCBfX2F3YWl0IH0gZnJvbSBcInRzbGliXCI7XG4vKipcbiAqIHJldHVybnMgYW4gYXN5bmMgaXRlcmF0b3IgdGhhdCBpdGVyYXRlcyBvdmVyIHJlc3VsdHMuIEl0IGFsc28gaGFzIGEgYGJ5UGFnZWBcbiAqIG1ldGhvZCB0aGF0IHJldHVybnMgcGFnZXMgb2YgaXRlbXMgYXQgb25jZS5cbiAqXG4gKiBAcGFyYW0gcGFnZWRSZXN1bHQgLSBhbiBvYmplY3QgdGhhdCBzcGVjaWZpZXMgaG93IHRvIGdldCBwYWdlcy5cbiAqIEByZXR1cm5zIGEgcGFnZWQgYXN5bmMgaXRlcmF0b3IgdGhhdCBpdGVyYXRlcyBvdmVyIHJlc3VsdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWdlZEFzeW5jSXRlcmF0b3IocGFnZWRSZXN1bHQpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgaXRlciA9IGdldEl0ZW1Bc3luY0l0ZXJhdG9yKHBhZ2VkUmVzdWx0KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBuZXh0KCkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXIubmV4dCgpO1xuICAgICAgICB9LFxuICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIGJ5UGFnZTogKF9hID0gcGFnZWRSZXN1bHQgPT09IG51bGwgfHwgcGFnZWRSZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhZ2VkUmVzdWx0LmJ5UGFnZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogKChzZXR0aW5ncykgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBjb250aW51YXRpb25Ub2tlbiwgbWF4UGFnZVNpemUgfSA9IHNldHRpbmdzICE9PSBudWxsICYmIHNldHRpbmdzICE9PSB2b2lkIDAgPyBzZXR0aW5ncyA6IHt9O1xuICAgICAgICAgICAgcmV0dXJuIGdldFBhZ2VBc3luY0l0ZXJhdG9yKHBhZ2VkUmVzdWx0LCB7XG4gICAgICAgICAgICAgICAgcGFnZUxpbms6IGNvbnRpbnVhdGlvblRva2VuLFxuICAgICAgICAgICAgICAgIG1heFBhZ2VTaXplLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgIH07XG59XG5mdW5jdGlvbiBnZXRJdGVtQXN5bmNJdGVyYXRvcihwYWdlZFJlc3VsdCkge1xuICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIGdldEl0ZW1Bc3luY0l0ZXJhdG9yXzEoKSB7XG4gICAgICAgIHZhciBlXzEsIF9hLCBlXzIsIF9iO1xuICAgICAgICBjb25zdCBwYWdlcyA9IGdldFBhZ2VBc3luY0l0ZXJhdG9yKHBhZ2VkUmVzdWx0KTtcbiAgICAgICAgY29uc3QgZmlyc3RWYWwgPSB5aWVsZCBfX2F3YWl0KHBhZ2VzLm5leHQoKSk7XG4gICAgICAgIC8vIGlmIHRoZSByZXN1bHQgZG9lcyBub3QgaGF2ZSBhbiBhcnJheSBzaGFwZSwgaS5lLiBUUGFnZSA9IFRFbGVtZW50LCB0aGVuIHdlIHJldHVybiBpdCBhcyBpc1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlyc3RWYWwudmFsdWUpKSB7XG4gICAgICAgICAgICAvLyBjYW4gZXh0cmFjdCBlbGVtZW50cyBmcm9tIHRoaXMgcGFnZVxuICAgICAgICAgICAgY29uc3QgeyB0b0VsZW1lbnRzIH0gPSBwYWdlZFJlc3VsdDtcbiAgICAgICAgICAgIGlmICh0b0VsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgX19hd2FpdCh5aWVsZCogX19hc3luY0RlbGVnYXRvcihfX2FzeW5jVmFsdWVzKHRvRWxlbWVudHMoZmlyc3RWYWwudmFsdWUpKSkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHBhZ2VzXzEgPSBfX2FzeW5jVmFsdWVzKHBhZ2VzKSwgcGFnZXNfMV8xOyBwYWdlc18xXzEgPSB5aWVsZCBfX2F3YWl0KHBhZ2VzXzEubmV4dCgpKSwgIXBhZ2VzXzFfMS5kb25lOykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZSA9IHBhZ2VzXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIF9fYXdhaXQoeWllbGQqIF9fYXN5bmNEZWxlZ2F0b3IoX19hc3luY1ZhbHVlcyh0b0VsZW1lbnRzKHBhZ2UpKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFnZXNfMV8xICYmICFwYWdlc18xXzEuZG9uZSAmJiAoX2EgPSBwYWdlc18xLnJldHVybikpIHlpZWxkIF9fYXdhaXQoX2EuY2FsbChwYWdlc18xKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHlpZWxkIHlpZWxkIF9fYXdhaXQoZmlyc3RWYWwudmFsdWUpO1xuICAgICAgICAgICAgICAgIC8vIGBwYWdlc2AgaXMgb2YgdHlwZSBgQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFRQYWdlPmAgYnV0IFRQYWdlID0gVEVsZW1lbnQgaW4gdGhpcyBjYXNlXG4gICAgICAgICAgICAgICAgeWllbGQgX19hd2FpdCh5aWVsZCogX19hc3luY0RlbGVnYXRvcihfX2FzeW5jVmFsdWVzKHBhZ2VzKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgeWllbGQgX19hd2FpdCh5aWVsZCogX19hc3luY0RlbGVnYXRvcihfX2FzeW5jVmFsdWVzKGZpcnN0VmFsLnZhbHVlKSkpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBwYWdlc18yID0gX19hc3luY1ZhbHVlcyhwYWdlcyksIHBhZ2VzXzJfMTsgcGFnZXNfMl8xID0geWllbGQgX19hd2FpdChwYWdlc18yLm5leHQoKSksICFwYWdlc18yXzEuZG9uZTspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZSA9IHBhZ2VzXzJfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFnZXMgaXMgb2YgdHlwZSBgQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFRQYWdlPmAgc28gYHBhZ2VgIGlzIG9mIHR5cGUgYFRQYWdlYC4gSW4gdGhpcyBicmFuY2gsXG4gICAgICAgICAgICAgICAgICAgIC8vIGl0IG11c3QgYmUgdGhlIGNhc2UgdGhhdCBgVFBhZ2UgPSBURWxlbWVudFtdYFxuICAgICAgICAgICAgICAgICAgICB5aWVsZCBfX2F3YWl0KHlpZWxkKiBfX2FzeW5jRGVsZWdhdG9yKF9fYXN5bmNWYWx1ZXMocGFnZSkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2VzXzJfMSAmJiAhcGFnZXNfMl8xLmRvbmUgJiYgKF9iID0gcGFnZXNfMi5yZXR1cm4pKSB5aWVsZCBfX2F3YWl0KF9iLmNhbGwocGFnZXNfMikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGdldFBhZ2VBc3luY0l0ZXJhdG9yKHBhZ2VkUmVzdWx0LCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBnZXRQYWdlQXN5bmNJdGVyYXRvcl8xKCkge1xuICAgICAgICBjb25zdCB7IHBhZ2VMaW5rLCBtYXhQYWdlU2l6ZSB9ID0gb3B0aW9ucztcbiAgICAgICAgbGV0IHJlc3BvbnNlID0geWllbGQgX19hd2FpdChwYWdlZFJlc3VsdC5nZXRQYWdlKHBhZ2VMaW5rICE9PSBudWxsICYmIHBhZ2VMaW5rICE9PSB2b2lkIDAgPyBwYWdlTGluayA6IHBhZ2VkUmVzdWx0LmZpcnN0UGFnZUxpbmssIG1heFBhZ2VTaXplKSk7XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCBfX2F3YWl0KHZvaWQgMCk7XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQgeWllbGQgX19hd2FpdChyZXNwb25zZS5wYWdlKTtcbiAgICAgICAgd2hpbGUgKHJlc3BvbnNlLm5leHRQYWdlTGluaykge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBfX2F3YWl0KHBhZ2VkUmVzdWx0LmdldFBhZ2UocmVzcG9uc2UubmV4dFBhZ2VMaW5rLCBtYXhQYWdlU2l6ZSkpO1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCBfX2F3YWl0KHZvaWQgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB5aWVsZCB5aWVsZCBfX2F3YWl0KHJlc3BvbnNlLnBhZ2UpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRQYWdlZEFzeW5jSXRlcmF0b3IuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5leHBvcnQgKiBmcm9tIFwiLi9tb2RlbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2dldFBhZ2VkQXN5bmNJdGVyYXRvclwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5leHBvcnQgY29uc3QgQVZST19TWU5DX01BUktFUl9TSVpFID0gMTY7XG5leHBvcnQgY29uc3QgQVZST19JTklUX0JZVEVTID0gbmV3IFVpbnQ4QXJyYXkoWzc5LCA5OCwgMTA2LCAxXSk7XG5leHBvcnQgY29uc3QgQVZST19DT0RFQ19LRVkgPSBcImF2cm8uY29kZWNcIjtcbmV4cG9ydCBjb25zdCBBVlJPX1NDSEVNQV9LRVkgPSBcImF2cm8uc2NoZW1hXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdnJvQ29uc3RhbnRzLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuZXhwb3J0IGNsYXNzIEF2cm9QYXJzZXIge1xuICAgIC8qKlxuICAgICAqIFJlYWRzIGEgZml4ZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdHJlYW0gLVxuICAgICAqIEBwYXJhbSBsZW5ndGggLVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgcmVhZEZpeGVkQnl0ZXMoc3RyZWFtLCBsZW5ndGgsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBieXRlcyA9IGF3YWl0IHN0cmVhbS5yZWFkKGxlbmd0aCwgeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCB9KTtcbiAgICAgICAgaWYgKGJ5dGVzLmxlbmd0aCAhPT0gbGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJIaXQgc3RyZWFtIGVuZC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhIHNpbmdsZSBieXRlIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdHJlYW0gLVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgcmVhZEJ5dGUoc3RyZWFtLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgYnVmID0gYXdhaXQgQXZyb1BhcnNlci5yZWFkRml4ZWRCeXRlcyhzdHJlYW0sIDEsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gYnVmWzBdO1xuICAgIH1cbiAgICAvLyBpbnQgYW5kIGxvbmcgYXJlIHN0b3JlZCBpbiB2YXJpYWJsZS1sZW5ndGggemlnLXphZyBjb2RpbmcuXG4gICAgLy8gdmFyaWFibGUtbGVuZ3RoOiBodHRwczovL2x1Y2VuZS5hcGFjaGUub3JnL2NvcmUvM181XzAvZmlsZWZvcm1hdHMuaHRtbCNWSW50XG4gICAgLy8gemlnLXphZzogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL2VuY29kaW5nP2Nzdz0xI3R5cGVzXG4gICAgc3RhdGljIGFzeW5jIHJlYWRaaWdaYWdMb25nKHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGxldCB6aWdaYWdFbmNvZGVkID0gMDtcbiAgICAgICAgbGV0IHNpZ25pZmljYW5jZUluQml0ID0gMDtcbiAgICAgICAgbGV0IGJ5dGUsIGhhdmVNb3JlQnl0ZSwgc2lnbmlmaWNhbmNlSW5GbG9hdDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgYnl0ZSA9IGF3YWl0IEF2cm9QYXJzZXIucmVhZEJ5dGUoc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGhhdmVNb3JlQnl0ZSA9IGJ5dGUgJiAweDgwO1xuICAgICAgICAgICAgemlnWmFnRW5jb2RlZCB8PSAoYnl0ZSAmIDB4N2YpIDw8IHNpZ25pZmljYW5jZUluQml0O1xuICAgICAgICAgICAgc2lnbmlmaWNhbmNlSW5CaXQgKz0gNztcbiAgICAgICAgfSB3aGlsZSAoaGF2ZU1vcmVCeXRlICYmIHNpZ25pZmljYW5jZUluQml0IDwgMjgpOyAvLyBiaXR3aXNlIG9wZXJhdGlvbiBvbmx5IHdvcmtzIGZvciAzMi1iaXQgaW50ZWdlcnNcbiAgICAgICAgaWYgKGhhdmVNb3JlQnl0ZSkge1xuICAgICAgICAgICAgLy8gU3dpdGNoIHRvIGZsb2F0IGFyaXRobWV0aWNcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWFzc2lnblxuICAgICAgICAgICAgemlnWmFnRW5jb2RlZCA9IHppZ1phZ0VuY29kZWQ7XG4gICAgICAgICAgICBzaWduaWZpY2FuY2VJbkZsb2F0ID0gMjY4NDM1NDU2OyAvLyAyICoqIDI4LlxuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGJ5dGUgPSBhd2FpdCBBdnJvUGFyc2VyLnJlYWRCeXRlKHN0cmVhbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgemlnWmFnRW5jb2RlZCArPSAoYnl0ZSAmIDB4N2YpICogc2lnbmlmaWNhbmNlSW5GbG9hdDtcbiAgICAgICAgICAgICAgICBzaWduaWZpY2FuY2VJbkZsb2F0ICo9IDEyODsgLy8gMiAqKiA3XG4gICAgICAgICAgICB9IHdoaWxlIChieXRlICYgMHg4MCk7XG4gICAgICAgICAgICBjb25zdCByZXMgPSAoemlnWmFnRW5jb2RlZCAlIDIgPyAtKHppZ1phZ0VuY29kZWQgKyAxKSA6IHppZ1phZ0VuY29kZWQpIC8gMjtcbiAgICAgICAgICAgIGlmIChyZXMgPCBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiB8fCByZXMgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludGVnZXIgb3ZlcmZsb3cuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHppZ1phZ0VuY29kZWQgPj4gMSkgXiAtKHppZ1phZ0VuY29kZWQgJiAxKTtcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIHJlYWRMb25nKHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBBdnJvUGFyc2VyLnJlYWRaaWdaYWdMb25nKHN0cmVhbSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyByZWFkSW50KHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBBdnJvUGFyc2VyLnJlYWRaaWdaYWdMb25nKHN0cmVhbSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyByZWFkTnVsbCgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyByZWFkQm9vbGVhbihzdHJlYW0sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBiID0gYXdhaXQgQXZyb1BhcnNlci5yZWFkQnl0ZShzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICBpZiAoYiA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYiA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnl0ZSB3YXMgbm90IGEgYm9vbGVhbi5cIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIHJlYWRGbG9hdChzdHJlYW0sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB1OGFyciA9IGF3YWl0IEF2cm9QYXJzZXIucmVhZEZpeGVkQnl0ZXMoc3RyZWFtLCA0LCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyh1OGFyci5idWZmZXIsIHU4YXJyLmJ5dGVPZmZzZXQsIHU4YXJyLmJ5dGVMZW5ndGgpO1xuICAgICAgICByZXR1cm4gdmlldy5nZXRGbG9hdDMyKDAsIHRydWUpOyAvLyBsaXR0bGVFbmRpYW4gPSB0cnVlXG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyByZWFkRG91YmxlKHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHU4YXJyID0gYXdhaXQgQXZyb1BhcnNlci5yZWFkRml4ZWRCeXRlcyhzdHJlYW0sIDgsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KHU4YXJyLmJ1ZmZlciwgdThhcnIuYnl0ZU9mZnNldCwgdThhcnIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHJldHVybiB2aWV3LmdldEZsb2F0NjQoMCwgdHJ1ZSk7IC8vIGxpdHRsZUVuZGlhbiA9IHRydWVcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIHJlYWRCeXRlcyhzdHJlYW0sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBzaXplID0gYXdhaXQgQXZyb1BhcnNlci5yZWFkTG9uZyhzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICBpZiAoc2l6ZSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJ5dGVzIHNpemUgd2FzIG5lZ2F0aXZlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyZWFtLnJlYWQoc2l6ZSwgeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCB9KTtcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIHJlYWRTdHJpbmcoc3RyZWFtLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgdThhcnIgPSBhd2FpdCBBdnJvUGFyc2VyLnJlYWRCeXRlcyhzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB1dGY4ZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICAgICAgICByZXR1cm4gdXRmOGRlY29kZXIuZGVjb2RlKHU4YXJyKTtcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIHJlYWRNYXBQYWlyKHN0cmVhbSwgcmVhZEl0ZW1NZXRob2QsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBBdnJvUGFyc2VyLnJlYWRTdHJpbmcoc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgICAgLy8gRlVUVVJFOiB0aGlzIHdvbid0IHdvcmsgd2l0aCByZWFkRml4ZWQgKGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkKSB3aGljaCBuZWVkcyBhIGxlbmd0aCBhcyB0aGUgcGFyYW1ldGVyLlxuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHJlYWRJdGVtTWV0aG9kKHN0cmVhbSwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB7IGtleSwgdmFsdWUgfTtcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIHJlYWRNYXAoc3RyZWFtLCByZWFkSXRlbU1ldGhvZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHJlYWRQYWlyTWV0aG9kID0gKHMsIG9wdHMgPSB7fSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEF2cm9QYXJzZXIucmVhZE1hcFBhaXIocywgcmVhZEl0ZW1NZXRob2QsIG9wdHMpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwYWlycyA9IGF3YWl0IEF2cm9QYXJzZXIucmVhZEFycmF5KHN0cmVhbSwgcmVhZFBhaXJNZXRob2QsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBkaWN0ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgcGFpciBvZiBwYWlycykge1xuICAgICAgICAgICAgZGljdFtwYWlyLmtleV0gPSBwYWlyLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkaWN0O1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgcmVhZEFycmF5KHN0cmVhbSwgcmVhZEl0ZW1NZXRob2QsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBjb3VudCA9IGF3YWl0IEF2cm9QYXJzZXIucmVhZExvbmcoc3RyZWFtLCBvcHRpb25zKTsgY291bnQgIT09IDA7IGNvdW50ID0gYXdhaXQgQXZyb1BhcnNlci5yZWFkTG9uZyhzdHJlYW0sIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBpZiAoY291bnQgPCAwKSB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JlIGJsb2NrIHNpemVzXG4gICAgICAgICAgICAgICAgYXdhaXQgQXZyb1BhcnNlci5yZWFkTG9uZyhzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGNvdW50ID0gLWNvdW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKGNvdW50LS0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gYXdhaXQgcmVhZEl0ZW1NZXRob2Qoc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG59XG52YXIgQXZyb0NvbXBsZXg7XG4oZnVuY3Rpb24gKEF2cm9Db21wbGV4KSB7XG4gICAgQXZyb0NvbXBsZXhbXCJSRUNPUkRcIl0gPSBcInJlY29yZFwiO1xuICAgIEF2cm9Db21wbGV4W1wiRU5VTVwiXSA9IFwiZW51bVwiO1xuICAgIEF2cm9Db21wbGV4W1wiQVJSQVlcIl0gPSBcImFycmF5XCI7XG4gICAgQXZyb0NvbXBsZXhbXCJNQVBcIl0gPSBcIm1hcFwiO1xuICAgIEF2cm9Db21wbGV4W1wiVU5JT05cIl0gPSBcInVuaW9uXCI7XG4gICAgQXZyb0NvbXBsZXhbXCJGSVhFRFwiXSA9IFwiZml4ZWRcIjtcbn0pKEF2cm9Db21wbGV4IHx8IChBdnJvQ29tcGxleCA9IHt9KSk7XG52YXIgQXZyb1ByaW1pdGl2ZTtcbihmdW5jdGlvbiAoQXZyb1ByaW1pdGl2ZSkge1xuICAgIEF2cm9QcmltaXRpdmVbXCJOVUxMXCJdID0gXCJudWxsXCI7XG4gICAgQXZyb1ByaW1pdGl2ZVtcIkJPT0xFQU5cIl0gPSBcImJvb2xlYW5cIjtcbiAgICBBdnJvUHJpbWl0aXZlW1wiSU5UXCJdID0gXCJpbnRcIjtcbiAgICBBdnJvUHJpbWl0aXZlW1wiTE9OR1wiXSA9IFwibG9uZ1wiO1xuICAgIEF2cm9QcmltaXRpdmVbXCJGTE9BVFwiXSA9IFwiZmxvYXRcIjtcbiAgICBBdnJvUHJpbWl0aXZlW1wiRE9VQkxFXCJdID0gXCJkb3VibGVcIjtcbiAgICBBdnJvUHJpbWl0aXZlW1wiQllURVNcIl0gPSBcImJ5dGVzXCI7XG4gICAgQXZyb1ByaW1pdGl2ZVtcIlNUUklOR1wiXSA9IFwic3RyaW5nXCI7XG59KShBdnJvUHJpbWl0aXZlIHx8IChBdnJvUHJpbWl0aXZlID0ge30pKTtcbmV4cG9ydCBjbGFzcyBBdnJvVHlwZSB7XG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB0aGUgQXZyb1R5cGUgZnJvbSB0aGUgQXZybyBTY2hlbWEuXG4gICAgICovXG4gICAgc3RhdGljIGZyb21TY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gQXZyb1R5cGUuZnJvbVN0cmluZ1NjaGVtYShzY2hlbWEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgICAgICAgICAgcmV0dXJuIEF2cm9UeXBlLmZyb21BcnJheVNjaGVtYShzY2hlbWEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIEF2cm9UeXBlLmZyb21PYmplY3RTY2hlbWEoc2NoZW1hKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZnJvbVN0cmluZ1NjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgc3dpdGNoIChzY2hlbWEpIHtcbiAgICAgICAgICAgIGNhc2UgQXZyb1ByaW1pdGl2ZS5OVUxMOlxuICAgICAgICAgICAgY2FzZSBBdnJvUHJpbWl0aXZlLkJPT0xFQU46XG4gICAgICAgICAgICBjYXNlIEF2cm9QcmltaXRpdmUuSU5UOlxuICAgICAgICAgICAgY2FzZSBBdnJvUHJpbWl0aXZlLkxPTkc6XG4gICAgICAgICAgICBjYXNlIEF2cm9QcmltaXRpdmUuRkxPQVQ6XG4gICAgICAgICAgICBjYXNlIEF2cm9QcmltaXRpdmUuRE9VQkxFOlxuICAgICAgICAgICAgY2FzZSBBdnJvUHJpbWl0aXZlLkJZVEVTOlxuICAgICAgICAgICAgY2FzZSBBdnJvUHJpbWl0aXZlLlNUUklORzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF2cm9QcmltaXRpdmVUeXBlKHNjaGVtYSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBBdnJvIHR5cGUgJHtzY2hlbWF9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGZyb21BcnJheVNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBdnJvVW5pb25UeXBlKHNjaGVtYS5tYXAoQXZyb1R5cGUuZnJvbVNjaGVtYSkpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbU9iamVjdFNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHNjaGVtYS50eXBlO1xuICAgICAgICAvLyBQcmltaXRpdmVzIGNhbiBiZSBkZWZpbmVkIGFzIHN0cmluZ3Mgb3Igb2JqZWN0c1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEF2cm9UeXBlLmZyb21TdHJpbmdTY2hlbWEodHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBBdnJvQ29tcGxleC5SRUNPUkQ6XG4gICAgICAgICAgICAgICAgaWYgKHNjaGVtYS5hbGlhc2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgYWxpYXNlcyBjdXJyZW50bHkgaXMgbm90IHN1cHBvcnRlZCwgc2NoZW1hOiAke3NjaGVtYX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFzY2hlbWEubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlcXVpcmVkIGF0dHJpYnV0ZSAnbmFtZScgZG9lc24ndCBleGlzdCBvbiBzY2hlbWE6ICR7c2NoZW1hfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY2FzZS1kZWNsYXJhdGlvbnNcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZHMgPSB7fTtcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYS5maWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXF1aXJlZCBhdHRyaWJ1dGUgJ2ZpZWxkcycgZG9lc24ndCBleGlzdCBvbiBzY2hlbWE6ICR7c2NoZW1hfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHNjaGVtYS5maWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRzW2ZpZWxkLm5hbWVdID0gQXZyb1R5cGUuZnJvbVNjaGVtYShmaWVsZC50eXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdnJvUmVjb3JkVHlwZShmaWVsZHMsIHNjaGVtYS5uYW1lKTtcbiAgICAgICAgICAgIGNhc2UgQXZyb0NvbXBsZXguRU5VTTpcbiAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLmFsaWFzZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBhbGlhc2VzIGN1cnJlbnRseSBpcyBub3Qgc3VwcG9ydGVkLCBzY2hlbWE6ICR7c2NoZW1hfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYS5zeW1ib2xzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWlyZWQgYXR0cmlidXRlICdzeW1ib2xzJyBkb2Vzbid0IGV4aXN0IG9uIHNjaGVtYTogJHtzY2hlbWF9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXZyb0VudW1UeXBlKHNjaGVtYS5zeW1ib2xzKTtcbiAgICAgICAgICAgIGNhc2UgQXZyb0NvbXBsZXguTUFQOlxuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hLnZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlcXVpcmVkIGF0dHJpYnV0ZSAndmFsdWVzJyBkb2Vzbid0IGV4aXN0IG9uIHNjaGVtYTogJHtzY2hlbWF9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXZyb01hcFR5cGUoQXZyb1R5cGUuZnJvbVNjaGVtYShzY2hlbWEudmFsdWVzKSk7XG4gICAgICAgICAgICBjYXNlIEF2cm9Db21wbGV4LkFSUkFZOiAvLyBVbnVzZWQgdG9kYXlcbiAgICAgICAgICAgIGNhc2UgQXZyb0NvbXBsZXguRklYRUQ6IC8vIFVudXNlZCB0b2RheVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgQXZybyB0eXBlICR7dHlwZX0gaW4gJHtzY2hlbWF9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBBdnJvUHJpbWl0aXZlVHlwZSBleHRlbmRzIEF2cm9UeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihwcmltaXRpdmUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fcHJpbWl0aXZlID0gcHJpbWl0aXZlO1xuICAgIH1cbiAgICByZWFkKHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5fcHJpbWl0aXZlKSB7XG4gICAgICAgICAgICBjYXNlIEF2cm9QcmltaXRpdmUuTlVMTDpcbiAgICAgICAgICAgICAgICByZXR1cm4gQXZyb1BhcnNlci5yZWFkTnVsbCgpO1xuICAgICAgICAgICAgY2FzZSBBdnJvUHJpbWl0aXZlLkJPT0xFQU46XG4gICAgICAgICAgICAgICAgcmV0dXJuIEF2cm9QYXJzZXIucmVhZEJvb2xlYW4oc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGNhc2UgQXZyb1ByaW1pdGl2ZS5JTlQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEF2cm9QYXJzZXIucmVhZEludChzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgY2FzZSBBdnJvUHJpbWl0aXZlLkxPTkc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEF2cm9QYXJzZXIucmVhZExvbmcoc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGNhc2UgQXZyb1ByaW1pdGl2ZS5GTE9BVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gQXZyb1BhcnNlci5yZWFkRmxvYXQoc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGNhc2UgQXZyb1ByaW1pdGl2ZS5ET1VCTEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEF2cm9QYXJzZXIucmVhZERvdWJsZShzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgY2FzZSBBdnJvUHJpbWl0aXZlLkJZVEVTOlxuICAgICAgICAgICAgICAgIHJldHVybiBBdnJvUGFyc2VyLnJlYWRCeXRlcyhzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgY2FzZSBBdnJvUHJpbWl0aXZlLlNUUklORzpcbiAgICAgICAgICAgICAgICByZXR1cm4gQXZyb1BhcnNlci5yZWFkU3RyaW5nKHN0cmVhbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gQXZybyBQcmltaXRpdmVcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBBdnJvRW51bVR5cGUgZXh0ZW5kcyBBdnJvVHlwZSB7XG4gICAgY29uc3RydWN0b3Ioc3ltYm9scykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9zeW1ib2xzID0gc3ltYm9scztcbiAgICB9XG4gICAgYXN5bmMgcmVhZChzdHJlYW0sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IEF2cm9QYXJzZXIucmVhZEludChzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3ltYm9sc1t2YWx1ZV07XG4gICAgfVxufVxuY2xhc3MgQXZyb1VuaW9uVHlwZSBleHRlbmRzIEF2cm9UeXBlIHtcbiAgICBjb25zdHJ1Y3Rvcih0eXBlcykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl90eXBlcyA9IHR5cGVzO1xuICAgIH1cbiAgICBhc3luYyByZWFkKHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgICAgICBjb25zdCB0eXBlSW5kZXggPSBhd2FpdCBBdnJvUGFyc2VyLnJlYWRJbnQoc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGVzW3R5cGVJbmRleF0ucmVhZChzdHJlYW0sIG9wdGlvbnMpO1xuICAgIH1cbn1cbmNsYXNzIEF2cm9NYXBUeXBlIGV4dGVuZHMgQXZyb1R5cGUge1xuICAgIGNvbnN0cnVjdG9yKGl0ZW1UeXBlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX2l0ZW1UeXBlID0gaXRlbVR5cGU7XG4gICAgfVxuICAgIHJlYWQoc3RyZWFtLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgcmVhZEl0ZW1NZXRob2QgPSAocywgb3B0cykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1UeXBlLnJlYWQocywgb3B0cyk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBBdnJvUGFyc2VyLnJlYWRNYXAoc3RyZWFtLCByZWFkSXRlbU1ldGhvZCwgb3B0aW9ucyk7XG4gICAgfVxufVxuY2xhc3MgQXZyb1JlY29yZFR5cGUgZXh0ZW5kcyBBdnJvVHlwZSB7XG4gICAgY29uc3RydWN0b3IoZmllbGRzLCBuYW1lKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX2ZpZWxkcyA9IGZpZWxkcztcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gICAgfVxuICAgIGFzeW5jIHJlYWQoc3RyZWFtLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0ge307XG4gICAgICAgIHJlY29yZFtcIiRzY2hlbWFcIl0gPSB0aGlzLl9uYW1lO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLl9maWVsZHMpIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5fZmllbGRzLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgcmVjb3JkW2tleV0gPSBhd2FpdCB0aGlzLl9maWVsZHNba2V5XS5yZWFkKHN0cmVhbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdnJvUGFyc2VyLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5c0VxdWFsKGEsIGIpIHtcbiAgICBpZiAoYSA9PT0gYilcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuICAgIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoYVtpXSAhPT0gYltpXSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5jb21tb24uanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBfX2FzeW5jR2VuZXJhdG9yLCBfX2F3YWl0IH0gZnJvbSBcInRzbGliXCI7XG4vLyBUT0RPOiBEbyBhIHJldmlldyBvZiBub24taW50ZXJmYWNlc1xuLyogZXNsaW50LWRpc2FibGUgQGF6dXJlL2F6dXJlLXNkay90cy11c2UtaW50ZXJmYWNlLXBhcmFtZXRlcnMgKi9cbmltcG9ydCBcIkBhenVyZS9jb3JlLXBhZ2luZ1wiO1xuaW1wb3J0IHsgQVZST19DT0RFQ19LRVksIEFWUk9fSU5JVF9CWVRFUywgQVZST19TQ0hFTUFfS0VZLCBBVlJPX1NZTkNfTUFSS0VSX1NJWkUsIH0gZnJvbSBcIi4vQXZyb0NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQXZyb1BhcnNlciwgQXZyb1R5cGUgfSBmcm9tIFwiLi9BdnJvUGFyc2VyXCI7XG5pbXBvcnQgeyBhcnJheXNFcXVhbCB9IGZyb20gXCIuL3V0aWxzL3V0aWxzLmNvbW1vblwiO1xuZXhwb3J0IGNsYXNzIEF2cm9SZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKGRhdGFTdHJlYW0sIGhlYWRlclN0cmVhbSwgY3VycmVudEJsb2NrT2Zmc2V0LCBpbmRleFdpdGhpbkN1cnJlbnRCbG9jaykge1xuICAgICAgICB0aGlzLl9kYXRhU3RyZWFtID0gZGF0YVN0cmVhbTtcbiAgICAgICAgdGhpcy5faGVhZGVyU3RyZWFtID0gaGVhZGVyU3RyZWFtIHx8IGRhdGFTdHJlYW07XG4gICAgICAgIHRoaXMuX2luaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2Jsb2NrT2Zmc2V0ID0gY3VycmVudEJsb2NrT2Zmc2V0IHx8IDA7XG4gICAgICAgIHRoaXMuX29iamVjdEluZGV4ID0gaW5kZXhXaXRoaW5DdXJyZW50QmxvY2sgfHwgMDtcbiAgICAgICAgdGhpcy5faW5pdGlhbEJsb2NrT2Zmc2V0ID0gY3VycmVudEJsb2NrT2Zmc2V0IHx8IDA7XG4gICAgfVxuICAgIGdldCBibG9ja09mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jsb2NrT2Zmc2V0O1xuICAgIH1cbiAgICBnZXQgb2JqZWN0SW5kZXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vYmplY3RJbmRleDtcbiAgICB9XG4gICAgYXN5bmMgaW5pdGlhbGl6ZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgaGVhZGVyID0gYXdhaXQgQXZyb1BhcnNlci5yZWFkRml4ZWRCeXRlcyh0aGlzLl9oZWFkZXJTdHJlYW0sIEFWUk9fSU5JVF9CWVRFUy5sZW5ndGgsIHtcbiAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFhcnJheXNFcXVhbChoZWFkZXIsIEFWUk9fSU5JVF9CWVRFUykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0cmVhbSBpcyBub3QgYW4gQXZybyBmaWxlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWxlIG1ldGFkYXRhIGlzIHdyaXR0ZW4gYXMgaWYgZGVmaW5lZCBieSB0aGUgZm9sbG93aW5nIG1hcCBzY2hlbWE6XG4gICAgICAgIC8vIHsgXCJ0eXBlXCI6IFwibWFwXCIsIFwidmFsdWVzXCI6IFwiYnl0ZXNcIn1cbiAgICAgICAgdGhpcy5fbWV0YWRhdGEgPSBhd2FpdCBBdnJvUGFyc2VyLnJlYWRNYXAodGhpcy5faGVhZGVyU3RyZWFtLCBBdnJvUGFyc2VyLnJlYWRTdHJpbmcsIHtcbiAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gVmFsaWRhdGUgY29kZWNcbiAgICAgICAgY29uc3QgY29kZWMgPSB0aGlzLl9tZXRhZGF0YVtBVlJPX0NPREVDX0tFWV07XG4gICAgICAgIGlmICghKGNvZGVjID09PSB1bmRlZmluZWQgfHwgY29kZWMgPT09IG51bGwgfHwgY29kZWMgPT09IFwibnVsbFwiKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29kZWNzIGFyZSBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSAxNi1ieXRlLCByYW5kb21seS1nZW5lcmF0ZWQgc3luYyBtYXJrZXIgZm9yIHRoaXMgZmlsZS5cbiAgICAgICAgdGhpcy5fc3luY01hcmtlciA9IGF3YWl0IEF2cm9QYXJzZXIucmVhZEZpeGVkQnl0ZXModGhpcy5faGVhZGVyU3RyZWFtLCBBVlJPX1NZTkNfTUFSS0VSX1NJWkUsIHtcbiAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gUGFyc2UgdGhlIHNjaGVtYVxuICAgICAgICBjb25zdCBzY2hlbWEgPSBKU09OLnBhcnNlKHRoaXMuX21ldGFkYXRhW0FWUk9fU0NIRU1BX0tFWV0pO1xuICAgICAgICB0aGlzLl9pdGVtVHlwZSA9IEF2cm9UeXBlLmZyb21TY2hlbWEoc2NoZW1hKTtcbiAgICAgICAgaWYgKHRoaXMuX2Jsb2NrT2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9ibG9ja09mZnNldCA9IHRoaXMuX2luaXRpYWxCbG9ja09mZnNldCArIHRoaXMuX2RhdGFTdHJlYW0ucG9zaXRpb247XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXRlbXNSZW1haW5pbmdJbkJsb2NrID0gYXdhaXQgQXZyb1BhcnNlci5yZWFkTG9uZyh0aGlzLl9kYXRhU3RyZWFtLCB7XG4gICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHNraXAgYmxvY2sgbGVuZ3RoXG4gICAgICAgIGF3YWl0IEF2cm9QYXJzZXIucmVhZExvbmcodGhpcy5fZGF0YVN0cmVhbSwgeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCB9KTtcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5fb2JqZWN0SW5kZXggJiYgdGhpcy5fb2JqZWN0SW5kZXggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX29iamVjdEluZGV4OyBpKyspIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9pdGVtVHlwZS5yZWFkKHRoaXMuX2RhdGFTdHJlYW0sIHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5faXRlbXNSZW1haW5pbmdJbkJsb2NrLS07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFzTmV4dCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9pbml0aWFsaXplZCB8fCB0aGlzLl9pdGVtc1JlbWFpbmluZ0luQmxvY2sgPiAwO1xuICAgIH1cbiAgICBwYXJzZU9iamVjdHMob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIHBhcnNlT2JqZWN0c18xKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIF9fYXdhaXQodGhpcy5pbml0aWFsaXplKG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlICh0aGlzLmhhc05leHQoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIF9fYXdhaXQodGhpcy5faXRlbVR5cGUucmVhZCh0aGlzLl9kYXRhU3RyZWFtLCB7XG4gICAgICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9pdGVtc1JlbWFpbmluZ0luQmxvY2stLTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vYmplY3RJbmRleCsrO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pdGVtc1JlbWFpbmluZ0luQmxvY2sgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFya2VyID0geWllbGQgX19hd2FpdChBdnJvUGFyc2VyLnJlYWRGaXhlZEJ5dGVzKHRoaXMuX2RhdGFTdHJlYW0sIEFWUk9fU1lOQ19NQVJLRVJfU0laRSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmxvY2tPZmZzZXQgPSB0aGlzLl9pbml0aWFsQmxvY2tPZmZzZXQgKyB0aGlzLl9kYXRhU3RyZWFtLnBvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vYmplY3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXJyYXlzRXF1YWwodGhpcy5fc3luY01hcmtlciwgbWFya2VyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RyZWFtIGlzIG5vdCBhIHZhbGlkIEF2cm8gZmlsZS5cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1zUmVtYWluaW5nSW5CbG9jayA9IHlpZWxkIF9fYXdhaXQoQXZyb1BhcnNlci5yZWFkTG9uZyh0aGlzLl9kYXRhU3RyZWFtLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGl0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1zUmVtYWluaW5nSW5CbG9jayA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2l0ZW1zUmVtYWluaW5nSW5CbG9jayA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBibG9jayBzaXplXG4gICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBfX2F3YWl0KEF2cm9QYXJzZXIucmVhZExvbmcodGhpcy5fZGF0YVN0cmVhbSwgeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeWllbGQgeWllbGQgX19hd2FpdChyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdnJvUmVhZGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuZXhwb3J0IGNsYXNzIEF2cm9SZWFkYWJsZSB7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdnJvUmVhZGFibGUuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBBdnJvUmVhZGFibGUgfSBmcm9tIFwiLi9BdnJvUmVhZGFibGVcIjtcbmltcG9ydCB7IEFib3J0RXJyb3IgfSBmcm9tIFwiQGF6dXJlL2Fib3J0LWNvbnRyb2xsZXJcIjtcbmNvbnN0IEFCT1JUX0VSUk9SID0gbmV3IEFib3J0RXJyb3IoXCJSZWFkaW5nIGZyb20gdGhlIGF2cm8gc3RyZWFtIHdhcyBhYm9ydGVkLlwiKTtcbmV4cG9ydCBjbGFzcyBBdnJvUmVhZGFibGVGcm9tU3RyZWFtIGV4dGVuZHMgQXZyb1JlYWRhYmxlIHtcbiAgICBjb25zdHJ1Y3RvcihyZWFkYWJsZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLl9wb3NpdGlvbiA9IDA7XG4gICAgfVxuICAgIHRvVWludDhBcnJheShkYXRhKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBnZXQgcG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3NpdGlvbjtcbiAgICB9XG4gICAgYXN5bmMgcmVhZChzaXplLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoKF9hID0gb3B0aW9ucy5hYm9ydFNpZ25hbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFib3J0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IEFCT1JUX0VSUk9SO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaXplIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzaXplIHBhcmFtZXRlciBzaG91bGQgYmUgcG9zaXRpdmU6ICR7c2l6ZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9yZWFkYWJsZS5yZWFkYWJsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RyZWFtIG5vIGxvbmdlciByZWFkYWJsZS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGFscmVhZHkgZW5vdWdoIGRhdGEuXG4gICAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5fcmVhZGFibGUucmVhZChzaXplKTtcbiAgICAgICAgaWYgKGNodW5rKSB7XG4gICAgICAgICAgICB0aGlzLl9wb3NpdGlvbiArPSBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgICAvLyBjaHVuay5sZW5ndGggbWF5YmUgbGVzcyB0aGFuIGRlc2lyZWQgc2l6ZSBpZiB0aGUgc3RyZWFtIGVuZHMuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b1VpbnQ4QXJyYXkoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcmVnaXN0ZXIgY2FsbGJhY2sgdG8gd2FpdCBmb3IgZW5vdWdoIGRhdGEgdG8gcmVhZFxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbiAgICAgICAgICAgICAgICBjb25zdCBjbGVhblVwID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkYWJsZS5yZW1vdmVMaXN0ZW5lcihcInJlYWRhYmxlXCIsIHJlYWRhYmxlQ2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkYWJsZS5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIHJlamVjdENhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZGFibGUucmVtb3ZlTGlzdGVuZXIoXCJlbmRcIiwgcmVqZWN0Q2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkYWJsZS5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsIHJlamVjdENhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWJvcnRTaWduYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYWJvcnRTaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0SGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRhYmxlQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrQ2h1bmsgPSB0aGlzLl9yZWFkYWJsZS5yZWFkKHNpemUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tDaHVuaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcG9zaXRpb24gKz0gY2FsbGJhY2tDaHVuay5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhblVwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFja0NodW5rLmxlbmd0aCBtYXliZSBsZXNzIHRoYW4gZGVzaXJlZCBzaXplIGlmIHRoZSBzdHJlYW0gZW5kcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy50b1VpbnQ4QXJyYXkoY2FsbGJhY2tDaHVuaykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWplY3RDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW5VcCgpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IGFib3J0SGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW5VcCgpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoQUJPUlRfRVJST1IpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVhZGFibGUub24oXCJyZWFkYWJsZVwiLCByZWFkYWJsZUNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkYWJsZS5vbmNlKFwiZXJyb3JcIiwgcmVqZWN0Q2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRhYmxlLm9uY2UoXCJlbmRcIiwgcmVqZWN0Q2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRhYmxlLm9uY2UoXCJjbG9zZVwiLCByZWplY3RDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWJvcnRTaWduYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5hYm9ydFNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgYWJvcnRIYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXZyb1JlYWRhYmxlRnJvbVN0cmVhbS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSBcInN0cmVhbVwiO1xuaW1wb3J0IHsgQXZyb1JlYWRhYmxlRnJvbVN0cmVhbSwgQXZyb1JlYWRlciB9IGZyb20gXCIuLi8uLi8uLi9zdG9yYWdlLWludGVybmFsLWF2cm8vc3JjXCI7XG4vKipcbiAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAqXG4gKiBBIE5vZGUuanMgQmxvYlF1aWNrUXVlcnlTdHJlYW0gd2lsbCBpbnRlcm5hbGx5IHBhcnNlIGF2cm8gZGF0YSBzdHJlYW0gZm9yIGJsb2IgcXVlcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBCbG9iUXVpY2tRdWVyeVN0cmVhbSBleHRlbmRzIFJlYWRhYmxlIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEJsb2JRdWlja1F1ZXJ5U3RyZWFtLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNvdXJjZSAtIFRoZSBjdXJyZW50IFJlYWRhYmxlU3RyZWFtIHJldHVybmVkIGZyb20gZ2V0dGVyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYXZyb1BhdXNlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBvcHRpb25zLm9uUHJvZ3Jlc3M7XG4gICAgICAgIHRoaXMub25FcnJvciA9IG9wdGlvbnMub25FcnJvcjtcbiAgICAgICAgdGhpcy5hdnJvUmVhZGVyID0gbmV3IEF2cm9SZWFkZXIobmV3IEF2cm9SZWFkYWJsZUZyb21TdHJlYW0odGhpcy5zb3VyY2UpKTtcbiAgICAgICAgdGhpcy5hdnJvSXRlciA9IHRoaXMuYXZyb1JlYWRlci5wYXJzZU9iamVjdHMoeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCB9KTtcbiAgICB9XG4gICAgX3JlYWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmF2cm9QYXVzZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZEludGVybmFsKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcImVycm9yXCIsIGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyByZWFkSW50ZXJuYWwoKSB7XG4gICAgICAgIHRoaXMuYXZyb1BhdXNlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgYXZyb05leHQ7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGF2cm9OZXh0ID0gYXdhaXQgdGhpcy5hdnJvSXRlci5uZXh0KCk7XG4gICAgICAgICAgICBpZiAoYXZyb05leHQuZG9uZSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2JqID0gYXZyb05leHQudmFsdWU7XG4gICAgICAgICAgICBjb25zdCBzY2hlbWEgPSBvYmouJHNjaGVtYTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJNaXNzaW5nIHNjaGVtYSBpbiBhdnJvIHJlY29yZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzd2l0Y2ggKHNjaGVtYSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjb20ubWljcm9zb2Z0LmF6dXJlLnN0b3JhZ2UucXVlcnlCbG9iQ29udGVudHMucmVzdWx0RGF0YVwiOlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gb2JqLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJJbnZhbGlkIGRhdGEgaW4gYXZybyByZXN1bHQgcmVjb3JkLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5wdXNoKEJ1ZmZlci5mcm9tKGRhdGEpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXZyb1BhdXNlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNvbS5taWNyb3NvZnQuYXp1cmUuc3RvcmFnZS5xdWVyeUJsb2JDb250ZW50cy5wcm9ncmVzc1wiOlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBieXRlc1NjYW5uZWQgPSBvYmouYnl0ZXNTY2FubmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBieXRlc1NjYW5uZWQgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcIkludmFsaWQgYnl0ZXNTY2FubmVkIGluIGF2cm8gcHJvZ3Jlc3MgcmVjb3JkLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MoeyBsb2FkZWRCeXRlczogYnl0ZXNTY2FubmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjb20ubWljcm9zb2Z0LmF6dXJlLnN0b3JhZ2UucXVlcnlCbG9iQ29udGVudHMuZW5kXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsQnl0ZXMgPSBvYmoudG90YWxCeXRlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdG90YWxCeXRlcyAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwiSW52YWxpZCB0b3RhbEJ5dGVzIGluIGF2cm8gZW5kIHJlY29yZC5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MoeyBsb2FkZWRCeXRlczogdG90YWxCeXRlcyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnB1c2gobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjb20ubWljcm9zb2Z0LmF6dXJlLnN0b3JhZ2UucXVlcnlCbG9iQ29udGVudHMuZXJyb3JcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmF0YWwgPSBvYmouZmF0YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZhdGFsICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwiSW52YWxpZCBmYXRhbCBpbiBhdnJvIGVycm9yIHJlY29yZC5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gb2JqLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcIkludmFsaWQgbmFtZSBpbiBhdnJvIGVycm9yIHJlY29yZC5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IG9iai5kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGVzY3JpcHRpb24gIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcIkludmFsaWQgZGVzY3JpcHRpb24gaW4gYXZybyBlcnJvciByZWNvcmQuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBvYmoucG9zaXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBvc2l0aW9uICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJJbnZhbGlkIHBvc2l0aW9uIGluIGF2cm8gZXJyb3IgcmVjb3JkLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ZhdGFsOiBmYXRhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBVbmtub3duIHNjaGVtYSAke3NjaGVtYX0gaW4gYXZybyBwcm9ncmVzcyByZWNvcmQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKCFhdnJvTmV4dC5kb25lICYmICF0aGlzLmF2cm9QYXVzZWQpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJsb2JRdWlja1F1ZXJ5U3RyZWFtLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmltcG9ydCB7IEJsb2JRdWlja1F1ZXJ5U3RyZWFtIH0gZnJvbSBcIi4vdXRpbHMvQmxvYlF1aWNrUXVlcnlTdHJlYW1cIjtcbi8qKlxuICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICpcbiAqIEJsb2JRdWVyeVJlc3BvbnNlIGltcGxlbWVudHMgQmxvYkRvd25sb2FkUmVzcG9uc2VNb2RlbCBpbnRlcmZhY2UsIGFuZCBpbiBOb2RlLmpzIHJ1bnRpbWUgaXQgd2lsbFxuICogcGFyc2UgYXZvciBkYXRhIHJldHVybmVkIGJ5IGJsb2IgcXVlcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBCbG9iUXVlcnlSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBCbG9iUXVlcnlSZXNwb25zZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcmlnaW5hbFJlc3BvbnNlIC1cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3JpZ2luYWxSZXNwb25zZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMub3JpZ2luYWxSZXNwb25zZSA9IG9yaWdpbmFsUmVzcG9uc2U7XG4gICAgICAgIHRoaXMuYmxvYkRvd25sb2FkU3RyZWFtID0gbmV3IEJsb2JRdWlja1F1ZXJ5U3RyZWFtKHRoaXMub3JpZ2luYWxSZXNwb25zZS5yZWFkYWJsZVN0cmVhbUJvZHksIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc2VydmljZSBzdXBwb3J0c1xuICAgICAqIHJlcXVlc3RzIGZvciBwYXJ0aWFsIGZpbGUgY29udGVudC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBhY2NlcHRSYW5nZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuYWNjZXB0UmFuZ2VzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIGl0IHdhcyBwcmV2aW91c2x5IHNwZWNpZmllZFxuICAgICAqIGZvciB0aGUgZmlsZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjYWNoZUNvbnRyb2woKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY2FjaGVDb250cm9sO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IHdhcyBzcGVjaWZpZWRcbiAgICAgKiBmb3IgdGhlICd4LW1zLWNvbnRlbnQtZGlzcG9zaXRpb24nIGhlYWRlciBhbmQgc3BlY2lmaWVzIGhvdyB0byBwcm9jZXNzIHRoZVxuICAgICAqIHJlc3BvbnNlLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvbnRlbnREaXNwb3NpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb250ZW50RGlzcG9zaXRpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHNwZWNpZmllZFxuICAgICAqIGZvciB0aGUgQ29udGVudC1FbmNvZGluZyByZXF1ZXN0IGhlYWRlci5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb250ZW50RW5jb2RpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29udGVudEVuY29kaW5nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IHdhcyBzcGVjaWZpZWRcbiAgICAgKiBmb3IgdGhlIENvbnRlbnQtTGFuZ3VhZ2UgcmVxdWVzdCBoZWFkZXIuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29udGVudExhbmd1YWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvbnRlbnRMYW5ndWFnZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgc2VxdWVuY2UgbnVtYmVyIGZvciBhXG4gICAgICogcGFnZSBibG9iLiBUaGlzIGhlYWRlciBpcyBub3QgcmV0dXJuZWQgZm9yIGJsb2NrIGJsb2JzIG9yIGFwcGVuZCBibG9icy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBibG9iU2VxdWVuY2VOdW1iZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuYmxvYlNlcXVlbmNlTnVtYmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYmxvYidzIHR5cGUuIFBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlOlxuICAgICAqICdCbG9ja0Jsb2InLCAnUGFnZUJsb2InLCAnQXBwZW5kQmxvYicuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgYmxvYlR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuYmxvYlR5cGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgcHJlc2VudCBpbiB0aGVcbiAgICAgKiByZXNwb25zZSBib2R5LlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29udGVudExlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGZpbGUgaGFzIGFuIE1ENSBoYXNoIGFuZCB0aGVcbiAgICAgKiByZXF1ZXN0IGlzIHRvIHJlYWQgdGhlIGZ1bGwgZmlsZSwgdGhpcyByZXNwb25zZSBoZWFkZXIgaXMgcmV0dXJuZWQgc28gdGhhdFxuICAgICAqIHRoZSBjbGllbnQgY2FuIGNoZWNrIGZvciBtZXNzYWdlIGNvbnRlbnQgaW50ZWdyaXR5LiBJZiB0aGUgcmVxdWVzdCBpcyB0b1xuICAgICAqIHJlYWQgYSBzcGVjaWZpZWQgcmFuZ2UgYW5kIHRoZSAneC1tcy1yYW5nZS1nZXQtY29udGVudC1tZDUnIGlzIHNldCB0b1xuICAgICAqIHRydWUsIHRoZW4gdGhlIHJlcXVlc3QgcmV0dXJucyBhbiBNRDUgaGFzaCBmb3IgdGhlIHJhbmdlLCBhcyBsb25nIGFzIHRoZVxuICAgICAqIHJhbmdlIHNpemUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDQgTUIuIElmIG5laXRoZXIgb2YgdGhlc2Ugc2V0cyBvZlxuICAgICAqIGNvbmRpdGlvbnMgaXMgdHJ1ZSwgdGhlbiBubyB2YWx1ZSBpcyByZXR1cm5lZCBmb3IgdGhlICdDb250ZW50LU1ENSdcbiAgICAgKiBoZWFkZXIuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29udGVudE1ENSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb250ZW50TUQ1O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhlIHJhbmdlIG9mIGJ5dGVzIHJldHVybmVkIGlmXG4gICAgICogdGhlIGNsaWVudCByZXF1ZXN0ZWQgYSBzdWJzZXQgb2YgdGhlIGZpbGUgYnkgc2V0dGluZyB0aGUgUmFuZ2UgcmVxdWVzdFxuICAgICAqIGhlYWRlci5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb250ZW50UmFuZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29udGVudFJhbmdlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudCB0eXBlIHNwZWNpZmllZCBmb3IgdGhlIGZpbGUuXG4gICAgICogVGhlIGRlZmF1bHQgY29udGVudCB0eXBlIGlzICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29udGVudFR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29udGVudFR5cGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbmNsdXNpb24gdGltZSBvZiB0aGUgbGFzdCBhdHRlbXB0ZWRcbiAgICAgKiBDb3B5IEZpbGUgb3BlcmF0aW9uIHdoZXJlIHRoaXMgZmlsZSB3YXMgdGhlIGRlc3RpbmF0aW9uIGZpbGUuIFRoaXMgdmFsdWVcbiAgICAgKiBjYW4gc3BlY2lmeSB0aGUgdGltZSBvZiBhIGNvbXBsZXRlZCwgYWJvcnRlZCwgb3IgZmFpbGVkIGNvcHkgYXR0ZW1wdC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb3B5Q29tcGxldGVkT24oKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0cmluZyBpZGVudGlmaWVyIGZvciB0aGUgbGFzdCBhdHRlbXB0ZWQgQ29weVxuICAgICAqIEZpbGUgb3BlcmF0aW9uIHdoZXJlIHRoaXMgZmlsZSB3YXMgdGhlIGRlc3RpbmF0aW9uIGZpbGUuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29weUlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvcHlJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udGFpbnMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgYW5kXG4gICAgICogdGhlIHRvdGFsIGJ5dGVzIGluIHRoZSBzb3VyY2UgaW4gdGhlIGxhc3QgYXR0ZW1wdGVkIENvcHkgRmlsZSBvcGVyYXRpb25cbiAgICAgKiB3aGVyZSB0aGlzIGZpbGUgd2FzIHRoZSBkZXN0aW5hdGlvbiBmaWxlLiBDYW4gc2hvdyBiZXR3ZWVuIDAgYW5kXG4gICAgICogQ29udGVudC1MZW5ndGggYnl0ZXMgY29waWVkLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvcHlQcm9ncmVzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb3B5UHJvZ3Jlc3M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVSTCB1cCB0byAyS0IgaW4gbGVuZ3RoIHRoYXQgc3BlY2lmaWVzIHRoZVxuICAgICAqIHNvdXJjZSBmaWxlIHVzZWQgaW4gdGhlIGxhc3QgYXR0ZW1wdGVkIENvcHkgRmlsZSBvcGVyYXRpb24gd2hlcmUgdGhpcyBmaWxlXG4gICAgICogd2FzIHRoZSBkZXN0aW5hdGlvbiBmaWxlLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvcHlTb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29weVNvdXJjZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhdGUgb2YgdGhlIGNvcHkgb3BlcmF0aW9uXG4gICAgICogaWRlbnRpZmllZCBieSAneC1tcy1jb3B5LWlkJy4gUG9zc2libGUgdmFsdWVzIGluY2x1ZGU6ICdwZW5kaW5nJyxcbiAgICAgKiAnc3VjY2VzcycsICdhYm9ydGVkJywgJ2ZhaWxlZCdcbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb3B5U3RhdHVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvcHlTdGF0dXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9ubHkgYXBwZWFycyB3aGVuXG4gICAgICogeC1tcy1jb3B5LXN0YXR1cyBpcyBmYWlsZWQgb3IgcGVuZGluZy4gRGVzY3JpYmVzIGNhdXNlIG9mIGZhdGFsIG9yXG4gICAgICogbm9uLWZhdGFsIGNvcHkgb3BlcmF0aW9uIGZhaWx1cmUuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29weVN0YXR1c0Rlc2NyaXB0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvcHlTdGF0dXNEZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2hlbiBhIGJsb2IgaXMgbGVhc2VkLFxuICAgICAqIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBsZWFzZSBpcyBvZiBpbmZpbml0ZSBvciBmaXhlZCBkdXJhdGlvbi4gUG9zc2libGVcbiAgICAgKiB2YWx1ZXMgaW5jbHVkZTogJ2luZmluaXRlJywgJ2ZpeGVkJy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBsZWFzZUR1cmF0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmxlYXNlRHVyYXRpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExlYXNlIHN0YXRlIG9mIHRoZSBibG9iLiBQb3NzaWJsZVxuICAgICAqIHZhbHVlcyBpbmNsdWRlOiAnYXZhaWxhYmxlJywgJ2xlYXNlZCcsICdleHBpcmVkJywgJ2JyZWFraW5nJywgJ2Jyb2tlbicuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgbGVhc2VTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5sZWFzZVN0YXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBsZWFzZSBzdGF0dXMgb2YgdGhlXG4gICAgICogYmxvYi4gUG9zc2libGUgdmFsdWVzIGluY2x1ZGU6ICdsb2NrZWQnLCAndW5sb2NrZWQnLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGxlYXNlU3RhdHVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmxlYXNlU3RhdHVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIFVUQyBkYXRlL3RpbWUgdmFsdWUgZ2VuZXJhdGVkIGJ5IHRoZSBzZXJ2aWNlIHRoYXRcbiAgICAgKiBpbmRpY2F0ZXMgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIHJlc3BvbnNlIHdhcyBpbml0aWF0ZWQuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5kYXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGNvbW1pdHRlZCBibG9ja3NcbiAgICAgKiBwcmVzZW50IGluIHRoZSBibG9iLiBUaGlzIGhlYWRlciBpcyByZXR1cm5lZCBvbmx5IGZvciBhcHBlbmQgYmxvYnMuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgYmxvYkNvbW1pdHRlZEJsb2NrQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuYmxvYkNvbW1pdHRlZEJsb2NrQ291bnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBFVGFnIGNvbnRhaW5zIGEgdmFsdWUgdGhhdCB5b3UgY2FuIHVzZSB0b1xuICAgICAqIHBlcmZvcm0gb3BlcmF0aW9ucyBjb25kaXRpb25hbGx5LCBpbiBxdW90ZXMuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgZXRhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5ldGFnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBlcnJvckNvZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuZXJyb3JDb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhpcyBoZWFkZXIgaXMgc2V0IHRvXG4gICAgICogdHJ1ZSBpZiB0aGUgZmlsZSBkYXRhIGFuZCBhcHBsaWNhdGlvbiBtZXRhZGF0YSBhcmUgY29tcGxldGVseSBlbmNyeXB0ZWRcbiAgICAgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobS4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgaXMgc2V0IHRvIGZhbHNlICh3aGVuXG4gICAgICogdGhlIGZpbGUgaXMgdW5lbmNyeXB0ZWQsIG9yIGlmIG9ubHkgcGFydHMgb2YgdGhlIGZpbGUvYXBwbGljYXRpb24gbWV0YWRhdGFcbiAgICAgKiBhcmUgZW5jcnlwdGVkKS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBpc1NlcnZlckVuY3J5cHRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5pc1NlcnZlckVuY3J5cHRlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGJsb2IgaGFzIGEgTUQ1IGhhc2gsIGFuZCBpZlxuICAgICAqIHJlcXVlc3QgY29udGFpbnMgcmFuZ2UgaGVhZGVyIChSYW5nZSBvciB4LW1zLXJhbmdlKSwgdGhpcyByZXNwb25zZSBoZWFkZXJcbiAgICAgKiBpcyByZXR1cm5lZCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgd2hvbGUgYmxvYidzIE1ENSB2YWx1ZS4gVGhpcyB2YWx1ZSBtYXlcbiAgICAgKiBvciBtYXkgbm90IGJlIGVxdWFsIHRvIHRoZSB2YWx1ZSByZXR1cm5lZCBpbiBDb250ZW50LU1ENSBoZWFkZXIsIHdpdGggdGhlXG4gICAgICogbGF0dGVyIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcmVxdWVzdGVkIHJhbmdlLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGJsb2JDb250ZW50TUQ1KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmJsb2JDb250ZW50TUQ1O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkYXRlIGFuZCB0aW1lIHRoZSBmaWxlIHdhcyBsYXN0XG4gICAgICogbW9kaWZpZWQuIEFueSBvcGVyYXRpb24gdGhhdCBtb2RpZmllcyB0aGUgZmlsZSBvciBpdHMgcHJvcGVydGllcyB1cGRhdGVzXG4gICAgICogdGhlIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBsYXN0TW9kaWZpZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UubGFzdE1vZGlmaWVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIG5hbWUtdmFsdWUgcGFpclxuICAgICAqIHRvIGFzc29jaWF0ZSB3aXRoIGEgZmlsZSBzdG9yYWdlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBtZXRhZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5tZXRhZGF0YTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBoZWFkZXIgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgcmVxdWVzdFxuICAgICAqIHRoYXQgd2FzIG1hZGUgYW5kIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgcmVxdWVzdElkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLnJlcXVlc3RJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgYSBjbGllbnQgcmVxdWVzdCBpZCBoZWFkZXIgaXMgc2VudCBpbiB0aGUgcmVxdWVzdCwgdGhpcyBoZWFkZXIgd2lsbCBiZSBwcmVzZW50IGluIHRoZVxuICAgICAqIHJlc3BvbnNlIHdpdGggdGhlIHNhbWUgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY2xpZW50UmVxdWVzdElkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNsaWVudFJlcXVlc3RJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBGaWxlIHNlcnZpY2UgdXNlZFxuICAgICAqIHRvIGV4ZWN1dGUgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgdmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS52ZXJzaW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgU0hBLTI1NiBoYXNoIG9mIHRoZSBlbmNyeXB0aW9uIGtleSB1c2VkIHRvIGVuY3J5cHQgdGhlIGJsb2IuIFRoaXMgdmFsdWUgaXMgb25seSByZXR1cm5lZFxuICAgICAqIHdoZW4gdGhlIGJsb2Igd2FzIGVuY3J5cHRlZCB3aXRoIGEgY3VzdG9tZXItcHJvdmlkZWQga2V5LlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGVuY3J5cHRpb25LZXlTaGEyNTYoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuZW5jcnlwdGlvbktleVNoYTI1NjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHJlcXVlc3QgaXMgdG8gcmVhZCBhIHNwZWNpZmllZCByYW5nZSBhbmQgdGhlIHgtbXMtcmFuZ2UtZ2V0LWNvbnRlbnQtY3JjNjQgaXMgc2V0IHRvXG4gICAgICogdHJ1ZSwgdGhlbiB0aGUgcmVxdWVzdCByZXR1cm5zIGEgY3JjNjQgZm9yIHRoZSByYW5nZSwgYXMgbG9uZyBhcyB0aGUgcmFuZ2Ugc2l6ZSBpcyBsZXNzIHRoYW5cbiAgICAgKiBvciBlcXVhbCB0byA0IE1CLiBJZiBib3RoIHgtbXMtcmFuZ2UtZ2V0LWNvbnRlbnQtY3JjNjQgJiB4LW1zLXJhbmdlLWdldC1jb250ZW50LW1kNSBpc1xuICAgICAqIHNwZWNpZmllZCBpbiB0aGUgc2FtZSByZXF1ZXN0LCBpdCB3aWxsIGZhaWwgd2l0aCA0MDAoQmFkIFJlcXVlc3QpXG4gICAgICovXG4gICAgZ2V0IGNvbnRlbnRDcmM2NCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb250ZW50Q3JjNjQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSByZXNwb25zZSBib2R5IGFzIGEgYnJvd3NlciBCbG9iLlxuICAgICAqIEFsd2F5cyB1bmRlZmluZWQgaW4gbm9kZS5qcy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBibG9iQm9keSgpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlc3BvbnNlIGJvZHkgYXMgYSBub2RlLmpzIFJlYWRhYmxlIHN0cmVhbS5cbiAgICAgKiBBbHdheXMgdW5kZWZpbmVkIGluIHRoZSBicm93c2VyLlxuICAgICAqXG4gICAgICogSXQgd2lsbCBwYXJzZSBhdm9yIGRhdGEgcmV0dXJuZWQgYnkgYmxvYiBxdWVyeS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCByZWFkYWJsZVN0cmVhbUJvZHkoKSB7XG4gICAgICAgIHJldHVybiBpc05vZGUgPyB0aGlzLmJsb2JEb3dubG9hZFN0cmVhbSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIEhUVFAgcmVzcG9uc2UuXG4gICAgICovXG4gICAgZ2V0IF9yZXNwb25zZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5fcmVzcG9uc2U7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmxvYlF1ZXJ5UmVzcG9uc2UuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICpcbiAqIENvZGUgZ2VuZXJhdGVkIGJ5IE1pY3Jvc29mdCAoUikgQXV0b1Jlc3QgQ29kZSBHZW5lcmF0b3IuXG4gKiBDaGFuZ2VzIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IgYW5kIHdpbGwgYmUgbG9zdCBpZiB0aGUgY29kZSBpcyByZWdlbmVyYXRlZC5cbiAqL1xuaW1wb3J0ICogYXMgY29yZUh0dHAgZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmltcG9ydCAqIGFzIE1hcHBlcnMgZnJvbSBcIi4uL21vZGVscy9tYXBwZXJzXCI7XG5pbXBvcnQgKiBhcyBQYXJhbWV0ZXJzIGZyb20gXCIuLi9tb2RlbHMvcGFyYW1ldGVyc1wiO1xuLyoqIENsYXNzIHJlcHJlc2VudGluZyBhIEFwcGVuZEJsb2IuICovXG5leHBvcnQgY2xhc3MgQXBwZW5kQmxvYiB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgQXBwZW5kQmxvYiBjbGFzcy5cbiAgICAgKiBAcGFyYW0gY2xpZW50IFJlZmVyZW5jZSB0byB0aGUgc2VydmljZSBjbGllbnRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQpIHtcbiAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBDcmVhdGUgQXBwZW5kIEJsb2Igb3BlcmF0aW9uIGNyZWF0ZXMgYSBuZXcgYXBwZW5kIGJsb2IuXG4gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGNyZWF0ZShjb250ZW50TGVuZ3RoLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgY3JlYXRlT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBBcHBlbmQgQmxvY2sgb3BlcmF0aW9uIGNvbW1pdHMgYSBuZXcgYmxvY2sgb2YgZGF0YSB0byB0aGUgZW5kIG9mIGFuIGV4aXN0aW5nIGFwcGVuZCBibG9iLiBUaGVcbiAgICAgKiBBcHBlbmQgQmxvY2sgb3BlcmF0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGlmIHRoZSBibG9iIHdhcyBjcmVhdGVkIHdpdGggeC1tcy1ibG9iLXR5cGUgc2V0IHRvXG4gICAgICogQXBwZW5kQmxvYi4gQXBwZW5kIEJsb2NrIGlzIHN1cHBvcnRlZCBvbmx5IG9uIHZlcnNpb24gMjAxNS0wMi0yMSB2ZXJzaW9uIG9yIGxhdGVyLlxuICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIGJvZHkgSW5pdGlhbCBkYXRhXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBhcHBlbmRCbG9jayhjb250ZW50TGVuZ3RoLCBib2R5LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGFwcGVuZEJsb2NrT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBBcHBlbmQgQmxvY2sgb3BlcmF0aW9uIGNvbW1pdHMgYSBuZXcgYmxvY2sgb2YgZGF0YSB0byB0aGUgZW5kIG9mIGFuIGV4aXN0aW5nIGFwcGVuZCBibG9iIHdoZXJlXG4gICAgICogdGhlIGNvbnRlbnRzIGFyZSByZWFkIGZyb20gYSBzb3VyY2UgdXJsLiBUaGUgQXBwZW5kIEJsb2NrIG9wZXJhdGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpZiB0aGUgYmxvYlxuICAgICAqIHdhcyBjcmVhdGVkIHdpdGggeC1tcy1ibG9iLXR5cGUgc2V0IHRvIEFwcGVuZEJsb2IuIEFwcGVuZCBCbG9jayBpcyBzdXBwb3J0ZWQgb25seSBvbiB2ZXJzaW9uXG4gICAgICogMjAxNS0wMi0yMSB2ZXJzaW9uIG9yIGxhdGVyLlxuICAgICAqIEBwYXJhbSBzb3VyY2VVcmwgU3BlY2lmeSBhIFVSTCB0byB0aGUgY29weSBzb3VyY2UuXG4gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGFwcGVuZEJsb2NrRnJvbVVybChzb3VyY2VVcmwsIGNvbnRlbnRMZW5ndGgsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgc291cmNlVXJsLFxuICAgICAgICAgICAgY29udGVudExlbmd0aCxcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBhcHBlbmRCbG9ja0Zyb21VcmxPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIFNlYWwgb3BlcmF0aW9uIHNlYWxzIHRoZSBBcHBlbmQgQmxvYiB0byBtYWtlIGl0IHJlYWQtb25seS4gU2VhbCBpcyBzdXBwb3J0ZWQgb25seSBvbiB2ZXJzaW9uXG4gICAgICogMjAxOS0xMi0xMiB2ZXJzaW9uIG9yIGxhdGVyLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgc2VhbChvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBzZWFsT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxufVxuLy8gT3BlcmF0aW9uIFNwZWNpZmljYXRpb25zXG5jb25zdCB4bWxTZXJpYWxpemVyID0gbmV3IGNvcmVIdHRwLlNlcmlhbGl6ZXIoTWFwcGVycywgLyogaXNYbWwgKi8gdHJ1ZSk7XG5jb25zdCBzZXJpYWxpemVyID0gbmV3IGNvcmVIdHRwLlNlcmlhbGl6ZXIoTWFwcGVycywgLyogaXNYbWwgKi8gZmFsc2UpO1xuY29uc3QgY3JlYXRlT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAxOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkFwcGVuZEJsb2JDcmVhdGVIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5BcHBlbmRCbG9iQ3JlYXRlRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHNdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMuY29udGVudExlbmd0aCxcbiAgICAgICAgUGFyYW1ldGVycy5tZXRhZGF0YSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbkFsZ29yaXRobSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFncyxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ2FjaGVDb250cm9sLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50VHlwZSxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudE1ENSxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudEVuY29kaW5nLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50TGFuZ3VhZ2UsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNvbnRlbnREaXNwb3NpdGlvbixcbiAgICAgICAgUGFyYW1ldGVycy5pbW11dGFiaWxpdHlQb2xpY3lFeHBpcnksXG4gICAgICAgIFBhcmFtZXRlcnMuaW1tdXRhYmlsaXR5UG9saWN5TW9kZSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYlRhZ3NTdHJpbmcsXG4gICAgICAgIFBhcmFtZXRlcnMubGVnYWxIb2xkMSxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iVHlwZTFcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBhcHBlbmRCbG9ja09wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMToge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5BcHBlbmRCbG9iQXBwZW5kQmxvY2tIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5BcHBlbmRCbG9iQXBwZW5kQmxvY2tFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJlcXVlc3RCb2R5OiBQYXJhbWV0ZXJzLmJvZHkxLFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcywgUGFyYW1ldGVycy5jb21wMjJdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbnRlbnRMZW5ndGgsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5U2hhMjU2LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25BbGdvcml0aG0sXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk5vbmVNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZlRhZ3MsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICBQYXJhbWV0ZXJzLnRyYW5zYWN0aW9uYWxDb250ZW50TUQ1LFxuICAgICAgICBQYXJhbWV0ZXJzLnRyYW5zYWN0aW9uYWxDb250ZW50Q3JjNjQsXG4gICAgICAgIFBhcmFtZXRlcnMuY29udGVudFR5cGUxLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDIsXG4gICAgICAgIFBhcmFtZXRlcnMubWF4U2l6ZSxcbiAgICAgICAgUGFyYW1ldGVycy5hcHBlbmRQb3NpdGlvblxuICAgIF0sXG4gICAgbWVkaWFUeXBlOiBcImJpbmFyeVwiLFxuICAgIHNlcmlhbGl6ZXJcbn07XG5jb25zdCBhcHBlbmRCbG9ja0Zyb21VcmxPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDE6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQXBwZW5kQmxvYkFwcGVuZEJsb2NrRnJvbVVybEhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkFwcGVuZEJsb2JBcHBlbmRCbG9ja0Zyb21VcmxFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcywgUGFyYW1ldGVycy5jb21wMjJdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMuY29udGVudExlbmd0aCxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbkFsZ29yaXRobSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFncyxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlSWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlSWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlQ29udGVudE1ENSxcbiAgICAgICAgUGFyYW1ldGVycy5jb3B5U291cmNlQXV0aG9yaXphdGlvbixcbiAgICAgICAgUGFyYW1ldGVycy50cmFuc2FjdGlvbmFsQ29udGVudE1ENSxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VVcmwsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlQ29udGVudENyYzY0LFxuICAgICAgICBQYXJhbWV0ZXJzLm1heFNpemUsXG4gICAgICAgIFBhcmFtZXRlcnMuYXBwZW5kUG9zaXRpb24sXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlUmFuZ2UxXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3Qgc2VhbE9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5BcHBlbmRCbG9iU2VhbEhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkFwcGVuZEJsb2JTZWFsRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsIFBhcmFtZXRlcnMuY29tcDIzXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuYXBwZW5kUG9zaXRpb25cbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcHBlbmRCbG9iLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqXG4gKiBDb2RlIGdlbmVyYXRlZCBieSBNaWNyb3NvZnQgKFIpIEF1dG9SZXN0IENvZGUgR2VuZXJhdG9yLlxuICogQ2hhbmdlcyBtYXkgY2F1c2UgaW5jb3JyZWN0IGJlaGF2aW9yIGFuZCB3aWxsIGJlIGxvc3QgaWYgdGhlIGNvZGUgaXMgcmVnZW5lcmF0ZWQuXG4gKi9cbmltcG9ydCAqIGFzIGNvcmVIdHRwIGZyb20gXCJAYXp1cmUvY29yZS1odHRwXCI7XG5pbXBvcnQgKiBhcyBNYXBwZXJzIGZyb20gXCIuLi9tb2RlbHMvbWFwcGVyc1wiO1xuaW1wb3J0ICogYXMgUGFyYW1ldGVycyBmcm9tIFwiLi4vbW9kZWxzL3BhcmFtZXRlcnNcIjtcbi8qKiBDbGFzcyByZXByZXNlbnRpbmcgYSBCbG9ja0Jsb2IuICovXG5leHBvcnQgY2xhc3MgQmxvY2tCbG9iIHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyBCbG9ja0Jsb2IgY2xhc3MuXG4gICAgICogQHBhcmFtIGNsaWVudCBSZWZlcmVuY2UgdG8gdGhlIHNlcnZpY2UgY2xpZW50XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgVXBsb2FkIEJsb2NrIEJsb2Igb3BlcmF0aW9uIHVwZGF0ZXMgdGhlIGNvbnRlbnQgb2YgYW4gZXhpc3RpbmcgYmxvY2sgYmxvYi4gVXBkYXRpbmcgYW4gZXhpc3RpbmdcbiAgICAgKiBibG9jayBibG9iIG92ZXJ3cml0ZXMgYW55IGV4aXN0aW5nIG1ldGFkYXRhIG9uIHRoZSBibG9iLiBQYXJ0aWFsIHVwZGF0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBQdXRcbiAgICAgKiBCbG9iOyB0aGUgY29udGVudCBvZiB0aGUgZXhpc3RpbmcgYmxvYiBpcyBvdmVyd3JpdHRlbiB3aXRoIHRoZSBjb250ZW50IG9mIHRoZSBuZXcgYmxvYi4gVG8gcGVyZm9ybSBhXG4gICAgICogcGFydGlhbCB1cGRhdGUgb2YgdGhlIGNvbnRlbnQgb2YgYSBibG9jayBibG9iLCB1c2UgdGhlIFB1dCBCbG9jayBMaXN0IG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBib2R5IEluaXRpYWwgZGF0YVxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgdXBsb2FkKGNvbnRlbnRMZW5ndGgsIGJvZHksIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgY29udGVudExlbmd0aCxcbiAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgdXBsb2FkT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBQdXQgQmxvYiBmcm9tIFVSTCBvcGVyYXRpb24gY3JlYXRlcyBhIG5ldyBCbG9jayBCbG9iIHdoZXJlIHRoZSBjb250ZW50cyBvZiB0aGUgYmxvYiBhcmUgcmVhZFxuICAgICAqIGZyb20gYSBnaXZlbiBVUkwuICBUaGlzIEFQSSBpcyBzdXBwb3J0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIDIwMjAtMDQtMDggdmVyc2lvbi4gUGFydGlhbCB1cGRhdGVzIGFyZVxuICAgICAqIG5vdCBzdXBwb3J0ZWQgd2l0aCBQdXQgQmxvYiBmcm9tIFVSTDsgdGhlIGNvbnRlbnQgb2YgYW4gZXhpc3RpbmcgYmxvYiBpcyBvdmVyd3JpdHRlbiB3aXRoIHRoZVxuICAgICAqIGNvbnRlbnQgb2YgdGhlIG5ldyBibG9iLiAgVG8gcGVyZm9ybSBwYXJ0aWFsIHVwZGF0ZXMgdG8gYSBibG9jayBibG9i4oCZcyBjb250ZW50cyB1c2luZyBhIHNvdXJjZSBVUkwsXG4gICAgICogdXNlIHRoZSBQdXQgQmxvY2sgZnJvbSBVUkwgQVBJIGluIGNvbmp1bmN0aW9uIHdpdGggUHV0IEJsb2NrIExpc3QuXG4gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gY29weVNvdXJjZSBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBwYWdlIGJsb2Igc25hcHNob3QuIFRoaXMgdmFsdWUgaXMgYSBVUkwgb2YgdXAgdG9cbiAgICAgKiAgICAgICAgICAgICAgICAgICAyIEtCIGluIGxlbmd0aCB0aGF0IHNwZWNpZmllcyBhIHBhZ2UgYmxvYiBzbmFwc2hvdC4gVGhlIHZhbHVlIHNob3VsZCBiZSBVUkwtZW5jb2RlZCBhcyBpdCB3b3VsZFxuICAgICAqICAgICAgICAgICAgICAgICAgIGFwcGVhciBpbiBhIHJlcXVlc3QgVVJJLiBUaGUgc291cmNlIGJsb2IgbXVzdCBlaXRoZXIgYmUgcHVibGljIG9yIG11c3QgYmUgYXV0aGVudGljYXRlZCB2aWEgYSBzaGFyZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICBhY2Nlc3Mgc2lnbmF0dXJlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgcHV0QmxvYkZyb21VcmwoY29udGVudExlbmd0aCwgY29weVNvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICAgICAgY29weVNvdXJjZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBwdXRCbG9iRnJvbVVybE9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgU3RhZ2UgQmxvY2sgb3BlcmF0aW9uIGNyZWF0ZXMgYSBuZXcgYmxvY2sgdG8gYmUgY29tbWl0dGVkIGFzIHBhcnQgb2YgYSBibG9iXG4gICAgICogQHBhcmFtIGJsb2NrSWQgQSB2YWxpZCBCYXNlNjQgc3RyaW5nIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgYmxvY2suIFByaW9yIHRvIGVuY29kaW5nLCB0aGUgc3RyaW5nXG4gICAgICogICAgICAgICAgICAgICAgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gNjQgYnl0ZXMgaW4gc2l6ZS4gRm9yIGEgZ2l2ZW4gYmxvYiwgdGhlIGxlbmd0aCBvZiB0aGUgdmFsdWUgc3BlY2lmaWVkXG4gICAgICogICAgICAgICAgICAgICAgZm9yIHRoZSBibG9ja2lkIHBhcmFtZXRlciBtdXN0IGJlIHRoZSBzYW1lIHNpemUgZm9yIGVhY2ggYmxvY2suXG4gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gYm9keSBJbml0aWFsIGRhdGFcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHN0YWdlQmxvY2soYmxvY2tJZCwgY29udGVudExlbmd0aCwgYm9keSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBibG9ja0lkLFxuICAgICAgICAgICAgY29udGVudExlbmd0aCxcbiAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgc3RhZ2VCbG9ja09wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgU3RhZ2UgQmxvY2sgb3BlcmF0aW9uIGNyZWF0ZXMgYSBuZXcgYmxvY2sgdG8gYmUgY29tbWl0dGVkIGFzIHBhcnQgb2YgYSBibG9iIHdoZXJlIHRoZSBjb250ZW50c1xuICAgICAqIGFyZSByZWFkIGZyb20gYSBVUkwuXG4gICAgICogQHBhcmFtIGJsb2NrSWQgQSB2YWxpZCBCYXNlNjQgc3RyaW5nIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgYmxvY2suIFByaW9yIHRvIGVuY29kaW5nLCB0aGUgc3RyaW5nXG4gICAgICogICAgICAgICAgICAgICAgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gNjQgYnl0ZXMgaW4gc2l6ZS4gRm9yIGEgZ2l2ZW4gYmxvYiwgdGhlIGxlbmd0aCBvZiB0aGUgdmFsdWUgc3BlY2lmaWVkXG4gICAgICogICAgICAgICAgICAgICAgZm9yIHRoZSBibG9ja2lkIHBhcmFtZXRlciBtdXN0IGJlIHRoZSBzYW1lIHNpemUgZm9yIGVhY2ggYmxvY2suXG4gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gc291cmNlVXJsIFNwZWNpZnkgYSBVUkwgdG8gdGhlIGNvcHkgc291cmNlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgc3RhZ2VCbG9ja0Zyb21VUkwoYmxvY2tJZCwgY29udGVudExlbmd0aCwgc291cmNlVXJsLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGJsb2NrSWQsXG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICAgICAgc291cmNlVXJsLFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIHN0YWdlQmxvY2tGcm9tVVJMT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBDb21taXQgQmxvY2sgTGlzdCBvcGVyYXRpb24gd3JpdGVzIGEgYmxvYiBieSBzcGVjaWZ5aW5nIHRoZSBsaXN0IG9mIGJsb2NrIElEcyB0aGF0IG1ha2UgdXAgdGhlXG4gICAgICogYmxvYi4gSW4gb3JkZXIgdG8gYmUgd3JpdHRlbiBhcyBwYXJ0IG9mIGEgYmxvYiwgYSBibG9jayBtdXN0IGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgd3JpdHRlbiB0byB0aGVcbiAgICAgKiBzZXJ2ZXIgaW4gYSBwcmlvciBQdXQgQmxvY2sgb3BlcmF0aW9uLiBZb3UgY2FuIGNhbGwgUHV0IEJsb2NrIExpc3QgdG8gdXBkYXRlIGEgYmxvYiBieSB1cGxvYWRpbmdcbiAgICAgKiBvbmx5IHRob3NlIGJsb2NrcyB0aGF0IGhhdmUgY2hhbmdlZCwgdGhlbiBjb21taXR0aW5nIHRoZSBuZXcgYW5kIGV4aXN0aW5nIGJsb2NrcyB0b2dldGhlci4gWW91IGNhblxuICAgICAqIGRvIHRoaXMgYnkgc3BlY2lmeWluZyB3aGV0aGVyIHRvIGNvbW1pdCBhIGJsb2NrIGZyb20gdGhlIGNvbW1pdHRlZCBibG9jayBsaXN0IG9yIGZyb20gdGhlXG4gICAgICogdW5jb21taXR0ZWQgYmxvY2sgbGlzdCwgb3IgdG8gY29tbWl0IHRoZSBtb3N0IHJlY2VudGx5IHVwbG9hZGVkIHZlcnNpb24gb2YgdGhlIGJsb2NrLCB3aGljaGV2ZXIgbGlzdFxuICAgICAqIGl0IG1heSBiZWxvbmcgdG8uXG4gICAgICogQHBhcmFtIGJsb2NrcyBCbG9iIEJsb2Nrcy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGNvbW1pdEJsb2NrTGlzdChibG9ja3MsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgYmxvY2tzLFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGNvbW1pdEJsb2NrTGlzdE9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgR2V0IEJsb2NrIExpc3Qgb3BlcmF0aW9uIHJldHJpZXZlcyB0aGUgbGlzdCBvZiBibG9ja3MgdGhhdCBoYXZlIGJlZW4gdXBsb2FkZWQgYXMgcGFydCBvZiBhIGJsb2NrXG4gICAgICogYmxvYlxuICAgICAqIEBwYXJhbSBsaXN0VHlwZSBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlIGxpc3Qgb2YgY29tbWl0dGVkIGJsb2NrcywgdGhlIGxpc3Qgb2YgdW5jb21taXR0ZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgYmxvY2tzLCBvciBib3RoIGxpc3RzIHRvZ2V0aGVyLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgZ2V0QmxvY2tMaXN0KGxpc3RUeXBlLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGxpc3RUeXBlLFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGdldEJsb2NrTGlzdE9wZXJhdGlvblNwZWMpO1xuICAgIH1cbn1cbi8vIE9wZXJhdGlvbiBTcGVjaWZpY2F0aW9uc1xuY29uc3QgeG1sU2VyaWFsaXplciA9IG5ldyBjb3JlSHR0cC5TZXJpYWxpemVyKE1hcHBlcnMsIC8qIGlzWG1sICovIHRydWUpO1xuY29uc3Qgc2VyaWFsaXplciA9IG5ldyBjb3JlSHR0cC5TZXJpYWxpemVyKE1hcHBlcnMsIC8qIGlzWG1sICovIGZhbHNlKTtcbmNvbnN0IHVwbG9hZE9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMToge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9ja0Jsb2JVcGxvYWRIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9ja0Jsb2JVcGxvYWRFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJlcXVlc3RCb2R5OiBQYXJhbWV0ZXJzLmJvZHkxLFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMudGltZW91dEluU2Vjb25kc10sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuY29udGVudExlbmd0aCxcbiAgICAgICAgUGFyYW1ldGVycy5tZXRhZGF0YSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbkFsZ29yaXRobSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFncyxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ2FjaGVDb250cm9sLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50VHlwZSxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudE1ENSxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudEVuY29kaW5nLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50TGFuZ3VhZ2UsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNvbnRlbnREaXNwb3NpdGlvbixcbiAgICAgICAgUGFyYW1ldGVycy5pbW11dGFiaWxpdHlQb2xpY3lFeHBpcnksXG4gICAgICAgIFBhcmFtZXRlcnMuaW1tdXRhYmlsaXR5UG9saWN5TW9kZSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgIFBhcmFtZXRlcnMudGllcixcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iVGFnc1N0cmluZyxcbiAgICAgICAgUGFyYW1ldGVycy5sZWdhbEhvbGQxLFxuICAgICAgICBQYXJhbWV0ZXJzLnRyYW5zYWN0aW9uYWxDb250ZW50TUQ1LFxuICAgICAgICBQYXJhbWV0ZXJzLnRyYW5zYWN0aW9uYWxDb250ZW50Q3JjNjQsXG4gICAgICAgIFBhcmFtZXRlcnMuY29udGVudFR5cGUxLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDIsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYlR5cGUyXG4gICAgXSxcbiAgICBtZWRpYVR5cGU6IFwiYmluYXJ5XCIsXG4gICAgc2VyaWFsaXplclxufTtcbmNvbnN0IHB1dEJsb2JGcm9tVXJsT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAxOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2NrQmxvYlB1dEJsb2JGcm9tVXJsSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvY2tCbG9iUHV0QmxvYkZyb21VcmxFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMudGltZW91dEluU2Vjb25kc10sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5jb250ZW50TGVuZ3RoLFxuICAgICAgICBQYXJhbWV0ZXJzLm1ldGFkYXRhLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXksXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleVNoYTI1NixcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uQWxnb3JpdGhtLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZUYWdzLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDYWNoZUNvbnRyb2wsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNvbnRlbnRUeXBlLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50TUQ1LFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50RW5jb2RpbmcsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNvbnRlbnRMYW5ndWFnZSxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudERpc3Bvc2l0aW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgUGFyYW1ldGVycy50aWVyLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VJZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VJZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUlmVGFncyxcbiAgICAgICAgUGFyYW1ldGVycy5jb3B5U291cmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JUYWdzU3RyaW5nLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUNvbnRlbnRNRDUsXG4gICAgICAgIFBhcmFtZXRlcnMuY29weVNvdXJjZUF1dGhvcml6YXRpb24sXG4gICAgICAgIFBhcmFtZXRlcnMuY29weVNvdXJjZVRhZ3MsXG4gICAgICAgIFBhcmFtZXRlcnMudHJhbnNhY3Rpb25hbENvbnRlbnRNRDUsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYlR5cGUyLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvcHlTb3VyY2VCbG9iUHJvcGVydGllc1xuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IHN0YWdlQmxvY2tPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDE6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvY2tCbG9iU3RhZ2VCbG9ja0hlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2NrQmxvYlN0YWdlQmxvY2tFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJlcXVlc3RCb2R5OiBQYXJhbWV0ZXJzLmJvZHkxLFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMuY29tcDI0LFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2NrSWRcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbnRlbnRMZW5ndGgsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbkFsZ29yaXRobSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgIFBhcmFtZXRlcnMudHJhbnNhY3Rpb25hbENvbnRlbnRNRDUsXG4gICAgICAgIFBhcmFtZXRlcnMudHJhbnNhY3Rpb25hbENvbnRlbnRDcmM2NCxcbiAgICAgICAgUGFyYW1ldGVycy5jb250ZW50VHlwZTEsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MlxuICAgIF0sXG4gICAgbWVkaWFUeXBlOiBcImJpbmFyeVwiLFxuICAgIHNlcmlhbGl6ZXJcbn07XG5jb25zdCBzdGFnZUJsb2NrRnJvbVVSTE9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMToge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9ja0Jsb2JTdGFnZUJsb2NrRnJvbVVSTEhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2NrQmxvYlN0YWdlQmxvY2tGcm9tVVJMRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbXAyNCxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9ja0lkXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbnRlbnRMZW5ndGgsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbkFsZ29yaXRobSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlSWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlSWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlQ29udGVudE1ENSxcbiAgICAgICAgUGFyYW1ldGVycy5jb3B5U291cmNlQXV0aG9yaXphdGlvbixcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VVcmwsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlQ29udGVudENyYzY0LFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZVJhbmdlMVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGNvbW1pdEJsb2NrTGlzdE9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMToge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9ja0Jsb2JDb21taXRCbG9ja0xpc3RIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9ja0Jsb2JDb21taXRCbG9ja0xpc3RFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJlcXVlc3RCb2R5OiBQYXJhbWV0ZXJzLmJsb2NrcyxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsIFBhcmFtZXRlcnMuY29tcDI1XSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy5jb250ZW50VHlwZSxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQsXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMubWV0YWRhdGEsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5U2hhMjU2LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25BbGdvcml0aG0sXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk5vbmVNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZlRhZ3MsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNhY2hlQ29udHJvbCxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudFR5cGUsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNvbnRlbnRNRDUsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNvbnRlbnRFbmNvZGluZyxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudExhbmd1YWdlLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50RGlzcG9zaXRpb24sXG4gICAgICAgIFBhcmFtZXRlcnMuaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJ5LFxuICAgICAgICBQYXJhbWV0ZXJzLmltbXV0YWJpbGl0eVBvbGljeU1vZGUsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICBQYXJhbWV0ZXJzLnRpZXIsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYlRhZ3NTdHJpbmcsXG4gICAgICAgIFBhcmFtZXRlcnMubGVnYWxIb2xkMSxcbiAgICAgICAgUGFyYW1ldGVycy50cmFuc2FjdGlvbmFsQ29udGVudE1ENSxcbiAgICAgICAgUGFyYW1ldGVycy50cmFuc2FjdGlvbmFsQ29udGVudENyYzY0XG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi94bWw7IGNoYXJzZXQ9dXRmLThcIixcbiAgICBtZWRpYVR5cGU6IFwieG1sXCIsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGdldEJsb2NrTGlzdE9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5CbG9ja0xpc3QsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2NrQmxvYkdldEJsb2NrTGlzdEhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2NrQmxvYkdldEJsb2NrTGlzdEV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgUGFyYW1ldGVycy5zbmFwc2hvdCxcbiAgICAgICAgUGFyYW1ldGVycy5jb21wMjUsXG4gICAgICAgIFBhcmFtZXRlcnMubGlzdFR5cGVcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5pZlRhZ3NcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ibG9ja0Jsb2IuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICpcbiAqIENvZGUgZ2VuZXJhdGVkIGJ5IE1pY3Jvc29mdCAoUikgQXV0b1Jlc3QgQ29kZSBHZW5lcmF0b3IuXG4gKiBDaGFuZ2VzIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IgYW5kIHdpbGwgYmUgbG9zdCBpZiB0aGUgY29kZSBpcyByZWdlbmVyYXRlZC5cbiAqL1xuaW1wb3J0ICogYXMgY29yZUh0dHAgZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmltcG9ydCAqIGFzIE1hcHBlcnMgZnJvbSBcIi4uL21vZGVscy9tYXBwZXJzXCI7XG5pbXBvcnQgKiBhcyBQYXJhbWV0ZXJzIGZyb20gXCIuLi9tb2RlbHMvcGFyYW1ldGVyc1wiO1xuLyoqIENsYXNzIHJlcHJlc2VudGluZyBhIFBhZ2VCbG9iLiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VCbG9iIHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyBQYWdlQmxvYiBjbGFzcy5cbiAgICAgKiBAcGFyYW0gY2xpZW50IFJlZmVyZW5jZSB0byB0aGUgc2VydmljZSBjbGllbnRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQpIHtcbiAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBDcmVhdGUgb3BlcmF0aW9uIGNyZWF0ZXMgYSBuZXcgcGFnZSBibG9iLlxuICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIGJsb2JDb250ZW50TGVuZ3RoIFRoaXMgaGVhZGVyIHNwZWNpZmllcyB0aGUgbWF4aW11bSBzaXplIGZvciB0aGUgcGFnZSBibG9iLCB1cCB0byAxIFRCLiBUaGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBibG9iIHNpemUgbXVzdCBiZSBhbGlnbmVkIHRvIGEgNTEyLWJ5dGUgYm91bmRhcnkuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBjcmVhdGUoY29udGVudExlbmd0aCwgYmxvYkNvbnRlbnRMZW5ndGgsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgY29udGVudExlbmd0aCxcbiAgICAgICAgICAgIGJsb2JDb250ZW50TGVuZ3RoLFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGNyZWF0ZU9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgVXBsb2FkIFBhZ2VzIG9wZXJhdGlvbiB3cml0ZXMgYSByYW5nZSBvZiBwYWdlcyB0byBhIHBhZ2UgYmxvYlxuICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIGJvZHkgSW5pdGlhbCBkYXRhXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICB1cGxvYWRQYWdlcyhjb250ZW50TGVuZ3RoLCBib2R5LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIHVwbG9hZFBhZ2VzT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBDbGVhciBQYWdlcyBvcGVyYXRpb24gY2xlYXJzIGEgc2V0IG9mIHBhZ2VzIGZyb20gYSBwYWdlIGJsb2JcbiAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgY2xlYXJQYWdlcyhjb250ZW50TGVuZ3RoLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgY2xlYXJQYWdlc09wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgVXBsb2FkIFBhZ2VzIG9wZXJhdGlvbiB3cml0ZXMgYSByYW5nZSBvZiBwYWdlcyB0byBhIHBhZ2UgYmxvYiB3aGVyZSB0aGUgY29udGVudHMgYXJlIHJlYWQgZnJvbSBhXG4gICAgICogVVJMXG4gICAgICogQHBhcmFtIHNvdXJjZVVybCBTcGVjaWZ5IGEgVVJMIHRvIHRoZSBjb3B5IHNvdXJjZS5cbiAgICAgKiBAcGFyYW0gc291cmNlUmFuZ2UgQnl0ZXMgb2Ygc291cmNlIGRhdGEgaW4gdGhlIHNwZWNpZmllZCByYW5nZS4gVGhlIGxlbmd0aCBvZiB0aGlzIHJhbmdlIHNob3VsZFxuICAgICAqICAgICAgICAgICAgICAgICAgICBtYXRjaCB0aGUgQ29udGVudExlbmd0aCBoZWFkZXIgYW5kIHgtbXMtcmFuZ2UvUmFuZ2UgZGVzdGluYXRpb24gcmFuZ2UgaGVhZGVyLlxuICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiBieXRlcyB0byB3aGljaCB0aGUgc291cmNlIHJhbmdlIHdvdWxkIGJlIHdyaXR0ZW4uIFRoZSByYW5nZSBzaG91bGQgYmUgNTEyXG4gICAgICogICAgICAgICAgICAgIGFsaWduZWQgYW5kIHJhbmdlLWVuZCBpcyByZXF1aXJlZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHVwbG9hZFBhZ2VzRnJvbVVSTChzb3VyY2VVcmwsIHNvdXJjZVJhbmdlLCBjb250ZW50TGVuZ3RoLCByYW5nZSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBzb3VyY2VVcmwsXG4gICAgICAgICAgICBzb3VyY2VSYW5nZSxcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCB1cGxvYWRQYWdlc0Zyb21VUkxPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIEdldCBQYWdlIFJhbmdlcyBvcGVyYXRpb24gcmV0dXJucyB0aGUgbGlzdCBvZiB2YWxpZCBwYWdlIHJhbmdlcyBmb3IgYSBwYWdlIGJsb2Igb3Igc25hcHNob3Qgb2YgYVxuICAgICAqIHBhZ2UgYmxvYlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgZ2V0UGFnZVJhbmdlcyhvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBnZXRQYWdlUmFuZ2VzT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBHZXQgUGFnZSBSYW5nZXMgRGlmZiBvcGVyYXRpb24gcmV0dXJucyB0aGUgbGlzdCBvZiB2YWxpZCBwYWdlIHJhbmdlcyBmb3IgYSBwYWdlIGJsb2IgdGhhdCB3ZXJlXG4gICAgICogY2hhbmdlZCBiZXR3ZWVuIHRhcmdldCBibG9iIGFuZCBwcmV2aW91cyBzbmFwc2hvdC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGdldFBhZ2VSYW5nZXNEaWZmKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGdldFBhZ2VSYW5nZXNEaWZmT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2l6ZSB0aGUgQmxvYlxuICAgICAqIEBwYXJhbSBibG9iQ29udGVudExlbmd0aCBUaGlzIGhlYWRlciBzcGVjaWZpZXMgdGhlIG1heGltdW0gc2l6ZSBmb3IgdGhlIHBhZ2UgYmxvYiwgdXAgdG8gMSBUQi4gVGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgYmxvYiBzaXplIG11c3QgYmUgYWxpZ25lZCB0byBhIDUxMi1ieXRlIGJvdW5kYXJ5LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgcmVzaXplKGJsb2JDb250ZW50TGVuZ3RoLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGJsb2JDb250ZW50TGVuZ3RoLFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIHJlc2l6ZU9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgYmxvYlxuICAgICAqIEBwYXJhbSBzZXF1ZW5jZU51bWJlckFjdGlvbiBSZXF1aXJlZCBpZiB0aGUgeC1tcy1ibG9iLXNlcXVlbmNlLW51bWJlciBoZWFkZXIgaXMgc2V0IGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwcm9wZXJ0eSBhcHBsaWVzIHRvIHBhZ2UgYmxvYnMgb25seS4gVGhpcyBwcm9wZXJ0eSBpbmRpY2F0ZXMgaG93IHRoZSBzZXJ2aWNlIHNob3VsZCBtb2RpZnkgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2IncyBzZXF1ZW5jZSBudW1iZXJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHVwZGF0ZVNlcXVlbmNlTnVtYmVyKHNlcXVlbmNlTnVtYmVyQWN0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIHNlcXVlbmNlTnVtYmVyQWN0aW9uLFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIHVwZGF0ZVNlcXVlbmNlTnVtYmVyT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBDb3B5IEluY3JlbWVudGFsIG9wZXJhdGlvbiBjb3BpZXMgYSBzbmFwc2hvdCBvZiB0aGUgc291cmNlIHBhZ2UgYmxvYiB0byBhIGRlc3RpbmF0aW9uIHBhZ2UgYmxvYi5cbiAgICAgKiBUaGUgc25hcHNob3QgaXMgY29waWVkIHN1Y2ggdGhhdCBvbmx5IHRoZSBkaWZmZXJlbnRpYWwgY2hhbmdlcyBiZXR3ZWVuIHRoZSBwcmV2aW91c2x5IGNvcGllZFxuICAgICAqIHNuYXBzaG90IGFyZSB0cmFuc2ZlcnJlZCB0byB0aGUgZGVzdGluYXRpb24uIFRoZSBjb3BpZWQgc25hcHNob3RzIGFyZSBjb21wbGV0ZSBjb3BpZXMgb2YgdGhlXG4gICAgICogb3JpZ2luYWwgc25hcHNob3QgYW5kIGNhbiBiZSByZWFkIG9yIGNvcGllZCBmcm9tIGFzIHVzdWFsLiBUaGlzIEFQSSBpcyBzdXBwb3J0ZWQgc2luY2UgUkVTVCB2ZXJzaW9uXG4gICAgICogMjAxNi0wNS0zMS5cbiAgICAgKiBAcGFyYW0gY29weVNvdXJjZSBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBwYWdlIGJsb2Igc25hcHNob3QuIFRoaXMgdmFsdWUgaXMgYSBVUkwgb2YgdXAgdG9cbiAgICAgKiAgICAgICAgICAgICAgICAgICAyIEtCIGluIGxlbmd0aCB0aGF0IHNwZWNpZmllcyBhIHBhZ2UgYmxvYiBzbmFwc2hvdC4gVGhlIHZhbHVlIHNob3VsZCBiZSBVUkwtZW5jb2RlZCBhcyBpdCB3b3VsZFxuICAgICAqICAgICAgICAgICAgICAgICAgIGFwcGVhciBpbiBhIHJlcXVlc3QgVVJJLiBUaGUgc291cmNlIGJsb2IgbXVzdCBlaXRoZXIgYmUgcHVibGljIG9yIG11c3QgYmUgYXV0aGVudGljYXRlZCB2aWEgYSBzaGFyZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICBhY2Nlc3Mgc2lnbmF0dXJlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgY29weUluY3JlbWVudGFsKGNvcHlTb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgY29weVNvdXJjZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBjb3B5SW5jcmVtZW50YWxPcGVyYXRpb25TcGVjKTtcbiAgICB9XG59XG4vLyBPcGVyYXRpb24gU3BlY2lmaWNhdGlvbnNcbmNvbnN0IHhtbFNlcmlhbGl6ZXIgPSBuZXcgY29yZUh0dHAuU2VyaWFsaXplcihNYXBwZXJzLCAvKiBpc1htbCAqLyB0cnVlKTtcbmNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgY29yZUh0dHAuU2VyaWFsaXplcihNYXBwZXJzLCAvKiBpc1htbCAqLyBmYWxzZSk7XG5jb25zdCBjcmVhdGVPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDE6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuUGFnZUJsb2JDcmVhdGVIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5QYWdlQmxvYkNyZWF0ZUV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbnRlbnRMZW5ndGgsXG4gICAgICAgIFBhcmFtZXRlcnMubWV0YWRhdGEsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5U2hhMjU2LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25BbGdvcml0aG0sXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk5vbmVNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZlRhZ3MsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNhY2hlQ29udHJvbCxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudFR5cGUsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNvbnRlbnRNRDUsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNvbnRlbnRFbmNvZGluZyxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudExhbmd1YWdlLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50RGlzcG9zaXRpb24sXG4gICAgICAgIFBhcmFtZXRlcnMuaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJ5LFxuICAgICAgICBQYXJhbWV0ZXJzLmltbXV0YWJpbGl0eVBvbGljeU1vZGUsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICBQYXJhbWV0ZXJzLnRpZXIsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYlRhZ3NTdHJpbmcsXG4gICAgICAgIFBhcmFtZXRlcnMubGVnYWxIb2xkMSxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iVHlwZSxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudExlbmd0aCxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iU2VxdWVuY2VOdW1iZXJcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCB1cGxvYWRQYWdlc09wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMToge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5QYWdlQmxvYlVwbG9hZFBhZ2VzSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuUGFnZUJsb2JVcGxvYWRQYWdlc0V4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcmVxdWVzdEJvZHk6IFBhcmFtZXRlcnMuYm9keTEsXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLCBQYXJhbWV0ZXJzLmNvbXAxOV0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuY29udGVudExlbmd0aCxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5yYW5nZSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbkFsZ29yaXRobSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFncyxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgIFBhcmFtZXRlcnMudHJhbnNhY3Rpb25hbENvbnRlbnRNRDUsXG4gICAgICAgIFBhcmFtZXRlcnMudHJhbnNhY3Rpb25hbENvbnRlbnRDcmM2NCxcbiAgICAgICAgUGFyYW1ldGVycy5jb250ZW50VHlwZTEsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MixcbiAgICAgICAgUGFyYW1ldGVycy5wYWdlV3JpdGUsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZTZXF1ZW5jZU51bWJlckxlc3NUaGFuT3JFcXVhbFRvLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmU2VxdWVuY2VOdW1iZXJMZXNzVGhhbixcbiAgICAgICAgUGFyYW1ldGVycy5pZlNlcXVlbmNlTnVtYmVyRXF1YWxUb1xuICAgIF0sXG4gICAgbWVkaWFUeXBlOiBcImJpbmFyeVwiLFxuICAgIHNlcmlhbGl6ZXJcbn07XG5jb25zdCBjbGVhclBhZ2VzT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAxOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLlBhZ2VCbG9iQ2xlYXJQYWdlc0hlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLlBhZ2VCbG9iQ2xlYXJQYWdlc0V4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLCBQYXJhbWV0ZXJzLmNvbXAxOV0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5jb250ZW50TGVuZ3RoLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLnJhbmdlLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXksXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleVNoYTI1NixcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uQWxnb3JpdGhtLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZUYWdzLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlNlcXVlbmNlTnVtYmVyTGVzc1RoYW5PckVxdWFsVG8sXG4gICAgICAgIFBhcmFtZXRlcnMuaWZTZXF1ZW5jZU51bWJlckxlc3NUaGFuLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmU2VxdWVuY2VOdW1iZXJFcXVhbFRvLFxuICAgICAgICBQYXJhbWV0ZXJzLnBhZ2VXcml0ZTFcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCB1cGxvYWRQYWdlc0Zyb21VUkxPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDE6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuUGFnZUJsb2JVcGxvYWRQYWdlc0Zyb21VUkxIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5QYWdlQmxvYlVwbG9hZFBhZ2VzRnJvbVVSTEV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLCBQYXJhbWV0ZXJzLmNvbXAxOV0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5jb250ZW50TGVuZ3RoLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXksXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleVNoYTI1NixcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uQWxnb3JpdGhtLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZUYWdzLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VJZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlSWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlSWZNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VJZk5vbmVNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VDb250ZW50TUQ1LFxuICAgICAgICBQYXJhbWV0ZXJzLmNvcHlTb3VyY2VBdXRob3JpemF0aW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnBhZ2VXcml0ZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlNlcXVlbmNlTnVtYmVyTGVzc1RoYW5PckVxdWFsVG8sXG4gICAgICAgIFBhcmFtZXRlcnMuaWZTZXF1ZW5jZU51bWJlckxlc3NUaGFuLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmU2VxdWVuY2VOdW1iZXJFcXVhbFRvLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZVVybCxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VSYW5nZSxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VDb250ZW50Q3JjNjQsXG4gICAgICAgIFBhcmFtZXRlcnMucmFuZ2UxXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgZ2V0UGFnZVJhbmdlc09wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5QYWdlTGlzdCxcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuUGFnZUJsb2JHZXRQYWdlUmFuZ2VzSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuUGFnZUJsb2JHZXRQYWdlUmFuZ2VzRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBQYXJhbWV0ZXJzLm1hcmtlcixcbiAgICAgICAgUGFyYW1ldGVycy5tYXhQYWdlU2l6ZSxcbiAgICAgICAgUGFyYW1ldGVycy5zbmFwc2hvdCxcbiAgICAgICAgUGFyYW1ldGVycy5jb21wMjBcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMucmFuZ2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk5vbmVNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZlRhZ3NcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBnZXRQYWdlUmFuZ2VzRGlmZk9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5QYWdlTGlzdCxcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuUGFnZUJsb2JHZXRQYWdlUmFuZ2VzRGlmZkhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLlBhZ2VCbG9iR2V0UGFnZVJhbmdlc0RpZmZFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMubWFya2VyLFxuICAgICAgICBQYXJhbWV0ZXJzLm1heFBhZ2VTaXplLFxuICAgICAgICBQYXJhbWV0ZXJzLnNuYXBzaG90LFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbXAyMCxcbiAgICAgICAgUGFyYW1ldGVycy5wcmV2c25hcHNob3RcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMucmFuZ2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk5vbmVNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZlRhZ3MsXG4gICAgICAgIFBhcmFtZXRlcnMucHJldlNuYXBzaG90VXJsXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgcmVzaXplT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLlBhZ2VCbG9iUmVzaXplSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuUGFnZUJsb2JSZXNpemVFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMuY29tcCwgUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXksXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleVNoYTI1NixcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uQWxnb3JpdGhtLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZUYWdzLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudExlbmd0aFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IHVwZGF0ZVNlcXVlbmNlTnVtYmVyT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLlBhZ2VCbG9iVXBkYXRlU2VxdWVuY2VOdW1iZXJIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5QYWdlQmxvYlVwZGF0ZVNlcXVlbmNlTnVtYmVyRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLmNvbXAsIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kc10sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFncyxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgIFBhcmFtZXRlcnMuc2VxdWVuY2VOdW1iZXJBY3Rpb25cbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBjb3B5SW5jcmVtZW50YWxPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDI6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuUGFnZUJsb2JDb3B5SW5jcmVtZW50YWxIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5QYWdlQmxvYkNvcHlJbmNyZW1lbnRhbEV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLCBQYXJhbWV0ZXJzLmNvbXAyMV0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk5vbmVNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZlRhZ3MsXG4gICAgICAgIFBhcmFtZXRlcnMuY29weVNvdXJjZVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhZ2VCbG9iLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgRW5jcnlwdGlvbkFsZ29yaXRobUFFUzI1IH0gZnJvbSBcIi4vdXRpbHMvY29uc3RhbnRzXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGFjY2VzcyB0aWVyIG9uIGEgYmxvYi5cbiAqIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBibG9jayBibG9iIGxldmVsIHRpZXJpbmcgc2VlIHtAbGluayBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9henVyZS9zdG9yYWdlL2Jsb2JzL3N0b3JhZ2UtYmxvYi1zdG9yYWdlLXRpZXJzfEhvdCwgY29vbCBhbmQgYXJjaGl2ZSBzdG9yYWdlIHRpZXJzLn1cbiAqL1xuZXhwb3J0IHZhciBCbG9ja0Jsb2JUaWVyO1xuKGZ1bmN0aW9uIChCbG9ja0Jsb2JUaWVyKSB7XG4gICAgLyoqXG4gICAgICogT3B0aW1pemVkIGZvciBzdG9yaW5nIGRhdGEgdGhhdCBpcyBhY2Nlc3NlZCBmcmVxdWVudGx5LlxuICAgICAqL1xuICAgIEJsb2NrQmxvYlRpZXJbXCJIb3RcIl0gPSBcIkhvdFwiO1xuICAgIC8qKlxuICAgICAqIE9wdGltaXplZCBmb3Igc3RvcmluZyBkYXRhIHRoYXQgaXMgaW5mcmVxdWVudGx5IGFjY2Vzc2VkIGFuZCBzdG9yZWQgZm9yIGF0IGxlYXN0IDMwIGRheXMuXG4gICAgICovXG4gICAgQmxvY2tCbG9iVGllcltcIkNvb2xcIl0gPSBcIkNvb2xcIjtcbiAgICAvKipcbiAgICAgKiBPcHRpbWl6ZWQgZm9yIHN0b3JpbmcgZGF0YSB0aGF0IGlzIHJhcmVseSBhY2Nlc3NlZC5cbiAgICAgKi9cbiAgICBCbG9ja0Jsb2JUaWVyW1wiQ29sZFwiXSA9IFwiQ29sZFwiO1xuICAgIC8qKlxuICAgICAqIE9wdGltaXplZCBmb3Igc3RvcmluZyBkYXRhIHRoYXQgaXMgcmFyZWx5IGFjY2Vzc2VkIGFuZCBzdG9yZWQgZm9yIGF0IGxlYXN0IDE4MCBkYXlzXG4gICAgICogd2l0aCBmbGV4aWJsZSBsYXRlbmN5IHJlcXVpcmVtZW50cyAob24gdGhlIG9yZGVyIG9mIGhvdXJzKS5cbiAgICAgKi9cbiAgICBCbG9ja0Jsb2JUaWVyW1wiQXJjaGl2ZVwiXSA9IFwiQXJjaGl2ZVwiO1xufSkoQmxvY2tCbG9iVGllciB8fCAoQmxvY2tCbG9iVGllciA9IHt9KSk7XG4vKipcbiAqIFNwZWNpZmllcyB0aGUgcGFnZSBibG9iIHRpZXIgdG8gc2V0IHRoZSBibG9iIHRvLiBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSB0byBwYWdlIGJsb2JzIG9uIHByZW1pdW0gc3RvcmFnZSBhY2NvdW50cy5cbiAqIFBsZWFzZSBzZWUge0BsaW5rIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2F6dXJlL3N0b3JhZ2Uvc3RvcmFnZS1wcmVtaXVtLXN0b3JhZ2Ujc2NhbGFiaWxpdHktYW5kLXBlcmZvcm1hbmNlLXRhcmdldHN8aGVyZX1cbiAqIGZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgY29ycmVzcG9uZGluZyBJT1BTIGFuZCB0aHJvdWdocHV0IHBlciBQYWdlQmxvYlRpZXIuXG4gKi9cbmV4cG9ydCB2YXIgUHJlbWl1bVBhZ2VCbG9iVGllcjtcbihmdW5jdGlvbiAoUHJlbWl1bVBhZ2VCbG9iVGllcikge1xuICAgIC8qKlxuICAgICAqIFA0IFRpZXIuXG4gICAgICovXG4gICAgUHJlbWl1bVBhZ2VCbG9iVGllcltcIlA0XCJdID0gXCJQNFwiO1xuICAgIC8qKlxuICAgICAqIFA2IFRpZXIuXG4gICAgICovXG4gICAgUHJlbWl1bVBhZ2VCbG9iVGllcltcIlA2XCJdID0gXCJQNlwiO1xuICAgIC8qKlxuICAgICAqIFAxMCBUaWVyLlxuICAgICAqL1xuICAgIFByZW1pdW1QYWdlQmxvYlRpZXJbXCJQMTBcIl0gPSBcIlAxMFwiO1xuICAgIC8qKlxuICAgICAqIFAxNSBUaWVyLlxuICAgICAqL1xuICAgIFByZW1pdW1QYWdlQmxvYlRpZXJbXCJQMTVcIl0gPSBcIlAxNVwiO1xuICAgIC8qKlxuICAgICAqIFAyMCBUaWVyLlxuICAgICAqL1xuICAgIFByZW1pdW1QYWdlQmxvYlRpZXJbXCJQMjBcIl0gPSBcIlAyMFwiO1xuICAgIC8qKlxuICAgICAqIFAzMCBUaWVyLlxuICAgICAqL1xuICAgIFByZW1pdW1QYWdlQmxvYlRpZXJbXCJQMzBcIl0gPSBcIlAzMFwiO1xuICAgIC8qKlxuICAgICAqIFA0MCBUaWVyLlxuICAgICAqL1xuICAgIFByZW1pdW1QYWdlQmxvYlRpZXJbXCJQNDBcIl0gPSBcIlA0MFwiO1xuICAgIC8qKlxuICAgICAqIFA1MCBUaWVyLlxuICAgICAqL1xuICAgIFByZW1pdW1QYWdlQmxvYlRpZXJbXCJQNTBcIl0gPSBcIlA1MFwiO1xuICAgIC8qKlxuICAgICAqIFA2MCBUaWVyLlxuICAgICAqL1xuICAgIFByZW1pdW1QYWdlQmxvYlRpZXJbXCJQNjBcIl0gPSBcIlA2MFwiO1xuICAgIC8qKlxuICAgICAqIFA3MCBUaWVyLlxuICAgICAqL1xuICAgIFByZW1pdW1QYWdlQmxvYlRpZXJbXCJQNzBcIl0gPSBcIlA3MFwiO1xuICAgIC8qKlxuICAgICAqIFA4MCBUaWVyLlxuICAgICAqL1xuICAgIFByZW1pdW1QYWdlQmxvYlRpZXJbXCJQODBcIl0gPSBcIlA4MFwiO1xufSkoUHJlbWl1bVBhZ2VCbG9iVGllciB8fCAoUHJlbWl1bVBhZ2VCbG9iVGllciA9IHt9KSk7XG5leHBvcnQgZnVuY3Rpb24gdG9BY2Nlc3NUaWVyKHRpZXIpIHtcbiAgICBpZiAodGllciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aWVyOyAvLyBObyBtb3JlIGNoZWNrIGlmIHN0cmluZyBpcyBhIHZhbGlkIEFjY2Vzc1RpZXIsIGFuZCBsZWZ0IHRoaXMgdG8gdW5kZXJsYXkgbG9naWMgdG8gZGVjaWRlKHNlcnZpY2UpLlxufVxuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUNwa0lmU3BlY2lmaWVkKGNwaywgaXNIdHRwcykge1xuICAgIGlmIChjcGsgJiYgIWlzSHR0cHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDdXN0b21lci1wcm92aWRlZCBlbmNyeXB0aW9uIGtleSBtdXN0IGJlIHVzZWQgb3ZlciBIVFRQUy5cIik7XG4gICAgfVxuICAgIGlmIChjcGsgJiYgIWNway5lbmNyeXB0aW9uQWxnb3JpdGhtKSB7XG4gICAgICAgIGNway5lbmNyeXB0aW9uQWxnb3JpdGhtID0gRW5jcnlwdGlvbkFsZ29yaXRobUFFUzI1O1xuICAgIH1cbn1cbi8qKlxuICogRGVmaW5lcyB0aGUga25vd24gY2xvdWQgYXVkaWVuY2VzIGZvciBTdG9yYWdlLlxuICovXG5leHBvcnQgdmFyIFN0b3JhZ2VCbG9iQXVkaWVuY2U7XG4oZnVuY3Rpb24gKFN0b3JhZ2VCbG9iQXVkaWVuY2UpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgT0F1dGggc2NvcGUgdG8gdXNlIHRvIHJldHJpZXZlIGFuIEFBRCB0b2tlbiBmb3IgQXp1cmUgU3RvcmFnZS5cbiAgICAgKi9cbiAgICBTdG9yYWdlQmxvYkF1ZGllbmNlW1wiU3RvcmFnZU9BdXRoU2NvcGVzXCJdID0gXCJodHRwczovL3N0b3JhZ2UuYXp1cmUuY29tLy5kZWZhdWx0XCI7XG4gICAgLyoqXG4gICAgICogVGhlIE9BdXRoIHNjb3BlIHRvIHVzZSB0byByZXRyaWV2ZSBhbiBBQUQgdG9rZW4gZm9yIEF6dXJlIERpc2suXG4gICAgICovXG4gICAgU3RvcmFnZUJsb2JBdWRpZW5jZVtcIkRpc2tDb21wdXRlT0F1dGhTY29wZXNcIl0gPSBcImh0dHBzOi8vZGlzay5jb21wdXRlLmF6dXJlLmNvbS8uZGVmYXVsdFwiO1xufSkoU3RvcmFnZUJsb2JBdWRpZW5jZSB8fCAoU3RvcmFnZUJsb2JBdWRpZW5jZSA9IHt9KSk7XG5leHBvcnQgZnVuY3Rpb24gZ2V0QmxvYlNlcnZpY2VBY2NvdW50QXVkaWVuY2Uoc3RvcmFnZUFjY291bnROYW1lKSB7XG4gICAgcmV0dXJuIGBodHRwczovLyR7c3RvcmFnZUFjY291bnROYW1lfS5ibG9iLmNvcmUud2luZG93cy5uZXQvLmRlZmF1bHRgO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bW9kZWxzLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLyoqXG4gKiBGdW5jdGlvbiB0aGF0IGNvbnZlcnRzIFBhZ2VSYW5nZSBhbmQgQ2xlYXJSYW5nZSB0byBhIGNvbW1vbiBSYW5nZSBvYmplY3QuXG4gKiBQYWdlUmFuZ2UgYW5kIENsZWFyUmFuZ2UgaGF2ZSBzdGFydCBhbmQgZW5kIHdoaWxlIFJhbmdlIG9mZnNldCBhbmQgY291bnRcbiAqIHRoaXMgZnVuY3Rpb24gbm9ybWFsaXplcyB0byBSYW5nZS5cbiAqIEBwYXJhbSByZXNwb25zZSAtIE1vZGVsIFBhZ2VCbG9iIFJhbmdlIHJlc3BvbnNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5nZVJlc3BvbnNlRnJvbU1vZGVsKHJlc3BvbnNlKSB7XG4gICAgY29uc3QgcGFnZVJhbmdlID0gKHJlc3BvbnNlLl9yZXNwb25zZS5wYXJzZWRCb2R5LnBhZ2VSYW5nZSB8fCBbXSkubWFwKCh4KSA9PiAoe1xuICAgICAgICBvZmZzZXQ6IHguc3RhcnQsXG4gICAgICAgIGNvdW50OiB4LmVuZCAtIHguc3RhcnQsXG4gICAgfSkpO1xuICAgIGNvbnN0IGNsZWFyUmFuZ2UgPSAocmVzcG9uc2UuX3Jlc3BvbnNlLnBhcnNlZEJvZHkuY2xlYXJSYW5nZSB8fCBbXSkubWFwKCh4KSA9PiAoe1xuICAgICAgICBvZmZzZXQ6IHguc3RhcnQsXG4gICAgICAgIGNvdW50OiB4LmVuZCAtIHguc3RhcnQsXG4gICAgfSkpO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc3BvbnNlKSwgeyBwYWdlUmFuZ2UsXG4gICAgICAgIGNsZWFyUmFuZ2UsIF9yZXNwb25zZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNwb25zZS5fcmVzcG9uc2UpLCB7IHBhcnNlZEJvZHk6IHtcbiAgICAgICAgICAgICAgICBwYWdlUmFuZ2UsXG4gICAgICAgICAgICAgICAgY2xlYXJSYW5nZSxcbiAgICAgICAgICAgIH0gfSkgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QYWdlQmxvYlJhbmdlUmVzcG9uc2UuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4vKipcbiAqIFdoZW4gYSBwb2xsZXIgaXMgbWFudWFsbHkgc3RvcHBlZCB0aHJvdWdoIHRoZSBgc3RvcFBvbGxpbmdgIG1ldGhvZCxcbiAqIHRoZSBwb2xsZXIgd2lsbCBiZSByZWplY3RlZCB3aXRoIGFuIGluc3RhbmNlIG9mIHRoZSBQb2xsZXJTdG9wcGVkRXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBQb2xsZXJTdG9wcGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJQb2xsZXJTdG9wcGVkRXJyb3JcIjtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFBvbGxlclN0b3BwZWRFcnJvci5wcm90b3R5cGUpO1xuICAgIH1cbn1cbi8qKlxuICogV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNhbmNlbGxlZCwgdGhlIHBvbGxlciB3aWxsIGJlIHJlamVjdGVkIHdpdGggYW4gaW5zdGFuY2VcbiAqIG9mIHRoZSBQb2xsZXJDYW5jZWxsZWRFcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFBvbGxlckNhbmNlbGxlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUG9sbGVyQ2FuY2VsbGVkRXJyb3JcIjtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFBvbGxlckNhbmNlbGxlZEVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxufVxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgcmVwcmVzZW50cyB0aGUgZGVmaW5pdGlvbiBvZiBhIHByb2dyYW0gdGhhdCBwb2xscyB0aHJvdWdoIGNvbnNlY3V0aXZlIHJlcXVlc3RzXG4gKiB1bnRpbCBpdCByZWFjaGVzIGEgc3RhdGUgb2YgY29tcGxldGlvbi5cbiAqXG4gKiBBIHBvbGxlciBjYW4gYmUgZXhlY3V0ZWQgbWFudWFsbHksIGJ5IHBvbGxpbmcgcmVxdWVzdCBieSByZXF1ZXN0IGJ5IGNhbGxpbmcgdG8gdGhlIGBwb2xsKClgIG1ldGhvZCByZXBlYXRlZGx5LCB1bnRpbCBpdHMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC5cbiAqIEl0IGFsc28gcHJvdmlkZXMgYSB3YXkgdG8gd2FpdCB1bnRpbCB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcywgYnkgY2FsbGluZyBgcG9sbFVudGlsRG9uZSgpYCBhbmQgd2FpdGluZyB1bnRpbCB0aGUgb3BlcmF0aW9uIGZpbmlzaGVzLlxuICogUG9sbGVycyBjYW4gYWxzbyByZXF1ZXN0IHRoZSBjYW5jZWxsYXRpb24gb2YgdGhlIG9uZ29pbmcgcHJvY2VzcyB0byB3aG9tIGlzIHByb3ZpZGluZyB0aGUgdW5kZXJseWluZyBsb25nIHJ1bm5pbmcgb3BlcmF0aW9uLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBwb2xsZXIgPSBuZXcgTXlQb2xsZXIoKTtcbiAqXG4gKiAvLyBQb2xsaW5nIGp1c3Qgb25jZTpcbiAqIGF3YWl0IHBvbGxlci5wb2xsKCk7XG4gKlxuICogLy8gV2UgY2FuIHRyeSB0byBjYW5jZWwgdGhlIHJlcXVlc3QgaGVyZSwgYnkgY2FsbGluZzpcbiAqIC8vXG4gKiAvLyAgICAgYXdhaXQgcG9sbGVyLmNhbmNlbE9wZXJhdGlvbigpO1xuICogLy9cbiAqXG4gKiAvLyBHZXR0aW5nIHRoZSBmaW5hbCByZXN1bHQ6XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBwb2xsZXIucG9sbFVudGlsRG9uZSgpO1xuICogYGBgXG4gKlxuICogVGhlIFBvbGxlciBpcyBkZWZpbmVkIGJ5IHR3byB0eXBlcywgYSB0eXBlIHJlcHJlc2VudGluZyB0aGUgc3RhdGUgb2YgdGhlIHBvbGxlciwgd2hpY2hcbiAqIG11c3QgaW5jbHVkZSBhIGJhc2ljIHNldCBvZiBwcm9wZXJ0aWVzIGZyb20gYFBvbGxPcGVyYXRpb25TdGF0ZTxUUmVzdWx0PmAsXG4gKiBhbmQgYSByZXR1cm4gdHlwZSBkZWZpbmVkIGJ5IGBUUmVzdWx0YCwgd2hpY2ggY2FuIGJlIGFueXRoaW5nLlxuICpcbiAqIFRoZSBQb2xsZXIgY2xhc3MgaW1wbGVtZW50cyB0aGUgYFBvbGxlckxpa2VgIGludGVyZmFjZSwgd2hpY2ggYWxsb3dzIHBvbGxlciBpbXBsZW1lbnRhdGlvbnMgdG8gYXZvaWQgaGF2aW5nXG4gKiB0byBleHBvcnQgdGhlIFBvbGxlcidzIGNsYXNzIGRpcmVjdGx5LCBhbmQgaW5zdGVhZCBvbmx5IGV4cG9ydCB0aGUgYWxyZWFkeSBpbnN0YW50aWF0ZWQgcG9sbGVyIHdpdGggdGhlIFBvbGxlckxpa2UgdHlwZS5cbiAqXG4gKiBgYGB0c1xuICogY2xhc3MgQ2xpZW50IHtcbiAqICAgcHVibGljIGFzeW5jIG1ha2VQb2xsZXI6IFBvbGxlckxpa2U8TXlPcGVyYXRpb25TdGF0ZSwgTXlSZXN1bHQ+IHtcbiAqICAgICBjb25zdCBwb2xsZXIgPSBuZXcgTXlQb2xsZXIoe30pO1xuICogICAgIC8vIEl0IG1pZ2h0IGJlIHByZWZlcnJlZCB0byByZXR1cm4gdGhlIHBvbGxlciBhZnRlciB0aGUgZmlyc3QgcmVxdWVzdCBpcyBtYWRlLFxuICogICAgIC8vIHNvIHRoYXQgc29tZSBpbmZvcm1hdGlvbiBjYW4gYmUgb2J0YWluZWQgcmlnaHQgYXdheS5cbiAqICAgICBhd2FpdCBwb2xsZXIucG9sbCgpO1xuICogICAgIHJldHVybiBwb2xsZXI7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBjb25zdCBwb2xsZXI6IFBvbGxlckxpa2U8TXlPcGVyYXRpb25TdGF0ZSwgTXlSZXN1bHQ+ID0gbXlDbGllbnQubWFrZVBvbGxlcigpO1xuICogYGBgXG4gKlxuICogQSBwb2xsZXIgY2FuIGJlIGNyZWF0ZWQgdGhyb3VnaCBpdHMgY29uc3RydWN0b3IsIHRoZW4gaXQgY2FuIGJlIHBvbGxlZCB1bnRpbCBpdCdzIGNvbXBsZXRlZC5cbiAqIEF0IGFueSBwb2ludCBpbiB0aW1lLCB0aGUgc3RhdGUgb2YgdGhlIHBvbGxlciBjYW4gYmUgb2J0YWluZWQgd2l0aG91dCBkZWxheSB0aHJvdWdoIHRoZSBnZXRPcGVyYXRpb25TdGF0ZSBtZXRob2QuXG4gKiBBdCBhbnkgcG9pbnQgaW4gdGltZSwgdGhlIGludGVybWVkaWF0ZSBmb3JtcyBvZiB0aGUgcmVzdWx0IHR5cGUgY2FuIGJlIHJlcXVlc3RlZCB3aXRob3V0IGRlbGF5LlxuICogT25jZSB0aGUgdW5kZXJseWluZyBvcGVyYXRpb24gaXMgbWFya2VkIGFzIGNvbXBsZXRlZCwgdGhlIHBvbGxlciB3aWxsIHN0b3AgYW5kIHRoZSBmaW5hbCB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBwb2xsZXIgPSBteUNsaWVudC5tYWtlUG9sbGVyKCk7XG4gKiBjb25zdCBzdGF0ZTogTXlPcGVyYXRpb25TdGF0ZSA9IHBvbGxlci5nZXRPcGVyYXRpb25TdGF0ZSgpO1xuICpcbiAqIC8vIFRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0IGNhbiBiZSBvYnRhaW5lZCBhdCBhbnkgdGltZS5cbiAqIGNvbnN0IHJlc3VsdDogTXlSZXN1bHQgfCB1bmRlZmluZWQgPSBwb2xsZXIuZ2V0UmVzdWx0KCk7XG4gKlxuICogLy8gVGhlIGZpbmFsIHJlc3VsdCBjYW4gb25seSBiZSBvYnRhaW5lZCBhZnRlciB0aGUgcG9sbGVyIGZpbmlzaGVzLlxuICogY29uc3QgcmVzdWx0OiBNeVJlc3VsdCA9IGF3YWl0IHBvbGxlci5wb2xsVW50aWxEb25lKCk7XG4gKiBgYGBcbiAqXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuZXhwb3J0IGNsYXNzIFBvbGxlciB7XG4gICAgLyoqXG4gICAgICogQSBwb2xsZXIgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgYnkgcGFzc2luZyBpbiBhdCBsZWFzdCB0aGUgYmFzaWMgcHJvcGVydGllcyBvZiB0aGUgYFBvbGxPcGVyYXRpb248VFN0YXRlLCBUUmVzdWx0PmAuXG4gICAgICpcbiAgICAgKiBXaGVuIHdyaXRpbmcgYW4gaW1wbGVtZW50YXRpb24gb2YgYSBQb2xsZXIsIHRoaXMgaW1wbGVtZW50YXRpb24gbmVlZHMgdG8gZGVhbCB3aXRoIHRoZSBpbml0aWFsaXphdGlvblxuICAgICAqIG9mIGFueSBjdXN0b20gc3RhdGUgYmV5b25kIHRoZSBiYXNpYyBkZWZpbml0aW9uIG9mIHRoZSBwb2xsZXIuIFRoZSBiYXNpYyBwb2xsZXIgYXNzdW1lcyB0aGF0IHRoZSBwb2xsZXInc1xuICAgICAqIG9wZXJhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQsIGF0IGxlYXN0IGl0cyBiYXNpYyBwcm9wZXJ0aWVzLiBUaGUgY29kZSBiZWxvdyBzaG93cyBob3cgdG8gYXBwcm9hY2hcbiAgICAgKiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RydWN0b3Igb2YgYSBuZXcgY3VzdG9tIHBvbGxlci5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZXhwb3J0IGNsYXNzIE15UG9sbGVyIGV4dGVuZHMgUG9sbGVyPE15T3BlcmF0aW9uU3RhdGUsIHN0cmluZz4ge1xuICAgICAqICAgY29uc3RydWN0b3Ioe1xuICAgICAqICAgICAvLyBBbnl0aGluZyB5b3UgbWlnaHQgbmVlZCBvdXRzaWRlIG9mIHRoZSBiYXNpY3NcbiAgICAgKiAgIH0pIHtcbiAgICAgKiAgICAgbGV0IHN0YXRlOiBNeU9wZXJhdGlvblN0YXRlID0ge1xuICAgICAqICAgICAgIHByaXZhdGVQcm9wZXJ0eTogcHJpdmF0ZSxcbiAgICAgKiAgICAgICBwdWJsaWNQcm9wZXJ0eTogcHVibGljLFxuICAgICAqICAgICB9O1xuICAgICAqXG4gICAgICogICAgIGNvbnN0IG9wZXJhdGlvbiA9IHtcbiAgICAgKiAgICAgICBzdGF0ZSxcbiAgICAgKiAgICAgICB1cGRhdGUsXG4gICAgICogICAgICAgY2FuY2VsLFxuICAgICAqICAgICAgIHRvU3RyaW5nXG4gICAgICogICAgIH1cbiAgICAgKlxuICAgICAqICAgICAvLyBTZW5kaW5nIHRoZSBvcGVyYXRpb24gdG8gdGhlIHBhcmVudCdzIGNvbnN0cnVjdG9yLlxuICAgICAqICAgICBzdXBlcihvcGVyYXRpb24pO1xuICAgICAqXG4gICAgICogICAgIC8vIFlvdSBjYW4gYXNzaWduIG1vcmUgbG9jYWwgcHJvcGVydGllcyBoZXJlLlxuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEluc2lkZSBvZiB0aGlzIGNvbnN0cnVjdG9yLCBhIG5ldyBwcm9taXNlIGlzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSB1c2VkIHRvXG4gICAgICogdGVsbCB0aGUgdXNlciB3aGVuIHRoZSBwb2xsZXIgZmluaXNoZXMgKHNlZSBgcG9sbFVudGlsRG9uZSgpYCkuIFRoZSBwcm9taXNlJ3NcbiAgICAgKiByZXNvbHZlIGFuZCByZWplY3QgbWV0aG9kcyBhcmUgYWxzbyB1c2VkIGludGVybmFsbHkgdG8gY29udHJvbCB3aGVuIHRvIHJlc29sdmVcbiAgICAgKiBvciByZWplY3QgYW55b25lIHdhaXRpbmcgZm9yIHRoZSBwb2xsZXIgdG8gZmluaXNoLlxuICAgICAqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIG9mIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uIG9mIGEgcG9sbGVyIGlzIHdoZXJlIGFueSBzZXJpYWxpemVkIHZlcnNpb24gb2ZcbiAgICAgKiBhIHByZXZpb3VzIHBvbGxlcidzIG9wZXJhdGlvbiBzaG91bGQgYmUgZGVzZXJpYWxpemVkIGludG8gdGhlIG9wZXJhdGlvbiBzZW50IHRvIHRoZVxuICAgICAqIGJhc2UgY29uc3RydWN0b3IuIEZvciBleGFtcGxlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBleHBvcnQgY2xhc3MgTXlQb2xsZXIgZXh0ZW5kcyBQb2xsZXI8TXlPcGVyYXRpb25TdGF0ZSwgc3RyaW5nPiB7XG4gICAgICogICBjb25zdHJ1Y3RvcihcbiAgICAgKiAgICAgYmFzZU9wZXJhdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICogICApIHtcbiAgICAgKiAgICAgbGV0IHN0YXRlOiBNeU9wZXJhdGlvblN0YXRlID0ge307XG4gICAgICogICAgIGlmIChiYXNlT3BlcmF0aW9uKSB7XG4gICAgICogICAgICAgc3RhdGUgPSB7XG4gICAgICogICAgICAgICAuLi5KU09OLnBhcnNlKGJhc2VPcGVyYXRpb24pLnN0YXRlLFxuICAgICAqICAgICAgICAgLi4uc3RhdGVcbiAgICAgKiAgICAgICB9O1xuICAgICAqICAgICB9XG4gICAgICogICAgIGNvbnN0IG9wZXJhdGlvbiA9IHtcbiAgICAgKiAgICAgICBzdGF0ZSxcbiAgICAgKiAgICAgICAvLyAuLi5cbiAgICAgKiAgICAgfVxuICAgICAqICAgICBzdXBlcihvcGVyYXRpb24pO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcGVyYXRpb24gLSBNdXN0IGNvbnRhaW4gdGhlIGJhc2ljIHByb3BlcnRpZXMgb2YgYFBvbGxPcGVyYXRpb248U3RhdGUsIFRSZXN1bHQ+YC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcGVyYXRpb24pIHtcbiAgICAgICAgLyoqIGNvbnRyb2xzIHdoZXRoZXIgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIG9wZXJhdGlvbiBmYWlsZWQgb3Igd2FzIGNhbmNlbGVkLiAqL1xuICAgICAgICB0aGlzLnJlc29sdmVPblVuc3VjY2Vzc2Z1bCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN0b3BwZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnBvbGxQcm9ncmVzc0NhbGxiYWNrcyA9IFtdO1xuICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgVW5oYW5kbGVkUHJvbWlzZVJlamVjdGlvbldhcm5pbmcgaW4gbm9kZS5qcyBmcm9tIGJlaW5nIHRocm93bi5cbiAgICAgICAgLy8gVGhlIGFib3ZlIHdhcm5pbmcgd291bGQgZ2V0IHRocm93biBpZiBgcG9sbGVyLnBvbGxgIGlzIGNhbGxlZCwgaXQgcmV0dXJucyBhbiBlcnJvcixcbiAgICAgICAgLy8gYW5kIHB1bGxVbnRpbERvbmUgZGlkIG5vdCBoYXZlIGEgLmNhdGNoIG9yIGF3YWl0IHRyeS9jYXRjaCBvbiBpdCdzIHJldHVybiB2YWx1ZS5cbiAgICAgICAgdGhpcy5wcm9taXNlLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgIC8qIGludGVudGlvbmFsbHkgYmxhbmsgKi9cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyBhIGxvb3AgdGhhdCB3aWxsIGJyZWFrIG9ubHkgaWYgdGhlIHBvbGxlciBpcyBkb25lXG4gICAgICogb3IgaWYgdGhlIHBvbGxlciBpcyBzdG9wcGVkLlxuICAgICAqL1xuICAgIGFzeW5jIHN0YXJ0UG9sbGluZyhwb2xsT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLnN0b3BwZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICghdGhpcy5pc1N0b3BwZWQoKSAmJiAhdGhpcy5pc0RvbmUoKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wb2xsKHBvbGxPcHRpb25zKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsYXkoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBwb2xsT25jZSBkb2VzIG9uZSBwb2xsaW5nLCBieSBjYWxsaW5nIHRvIHRoZSB1cGRhdGUgbWV0aG9kIG9mIHRoZSB1bmRlcmx5aW5nXG4gICAgICogcG9sbCBvcGVyYXRpb24gdG8gbWFrZSBhbnkgcmVsZXZhbnQgY2hhbmdlIGVmZmVjdGl2ZS5cbiAgICAgKlxuICAgICAqIEl0IG9ubHkgb3B0aW9uYWxseSByZWNlaXZlcyBhbiBvYmplY3Qgd2l0aCBhbiBhYm9ydFNpZ25hbCBwcm9wZXJ0eSwgZnJvbSBcXEBhenVyZS9hYm9ydC1jb250cm9sbGVyJ3MgQWJvcnRTaWduYWxMaWtlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBwcm9wZXJ0aWVzIHBhc3NlZCB0byB0aGUgb3BlcmF0aW9uJ3MgdXBkYXRlIG1ldGhvZC5cbiAgICAgKi9cbiAgICBhc3luYyBwb2xsT25jZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRG9uZSgpKSB7XG4gICAgICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IGF3YWl0IHRoaXMub3BlcmF0aW9uLnVwZGF0ZSh7XG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgZmlyZVByb2dyZXNzOiB0aGlzLmZpcmVQcm9ncmVzcy5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9jZXNzVXBkYXRlZFN0YXRlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGZpcmVQcm9ncmVzcyBjYWxscyB0aGUgZnVuY3Rpb25zIHBhc3NlZCBpbiB2aWEgb25Qcm9ncmVzcyB0aGUgbWV0aG9kIG9mIHRoZSBwb2xsZXIuXG4gICAgICpcbiAgICAgKiBJdCBsb29wcyBvdmVyIGFsbCBvZiB0aGUgY2FsbGJhY2tzIHJlY2VpdmVkIGZyb20gb25Qcm9ncmVzcywgYW5kIGV4ZWN1dGVzIHRoZW0sIHNlbmRpbmcgdGhlbVxuICAgICAqIHRoZSBjdXJyZW50IG9wZXJhdGlvbiBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGF0ZSAtIFRoZSBjdXJyZW50IG9wZXJhdGlvbiBzdGF0ZS5cbiAgICAgKi9cbiAgICBmaXJlUHJvZ3Jlc3Moc3RhdGUpIHtcbiAgICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiB0aGlzLnBvbGxQcm9ncmVzc0NhbGxiYWNrcykge1xuICAgICAgICAgICAgY2FsbGJhY2soc3RhdGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHVuZGVybHlpbmcgb3BlcmF0aW9uJ3MgY2FuY2VsIG1ldGhvZC5cbiAgICAgKi9cbiAgICBhc3luYyBjYW5jZWxPbmNlKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IGF3YWl0IHRoaXMub3BlcmF0aW9uLmNhbmNlbChvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb21pc2UgdGhhdCB3aWxsIHJlc29sdmUgb25jZSBhIHNpbmdsZSBwb2xsaW5nIHJlcXVlc3QgZmluaXNoZXMuXG4gICAgICogSXQgZG9lcyB0aGlzIGJ5IGNhbGxpbmcgdGhlIHVwZGF0ZSBtZXRob2Qgb2YgdGhlIFBvbGxlcidzIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEl0IG9ubHkgb3B0aW9uYWxseSByZWNlaXZlcyBhbiBvYmplY3Qgd2l0aCBhbiBhYm9ydFNpZ25hbCBwcm9wZXJ0eSwgZnJvbSBcXEBhenVyZS9hYm9ydC1jb250cm9sbGVyJ3MgQWJvcnRTaWduYWxMaWtlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBwcm9wZXJ0aWVzIHBhc3NlZCB0byB0aGUgb3BlcmF0aW9uJ3MgdXBkYXRlIG1ldGhvZC5cbiAgICAgKi9cbiAgICBwb2xsKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMucG9sbE9uY2VQcm9taXNlKSB7XG4gICAgICAgICAgICB0aGlzLnBvbGxPbmNlUHJvbWlzZSA9IHRoaXMucG9sbE9uY2Uob3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBjbGVhclBvbGxPbmNlUHJvbWlzZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvbGxPbmNlUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnBvbGxPbmNlUHJvbWlzZS50aGVuKGNsZWFyUG9sbE9uY2VQcm9taXNlLCBjbGVhclBvbGxPbmNlUHJvbWlzZSkuY2F0Y2godGhpcy5yZWplY3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBvbGxPbmNlUHJvbWlzZTtcbiAgICB9XG4gICAgcHJvY2Vzc1VwZGF0ZWRTdGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9uLnN0YXRlLmVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJlc29sdmVPblVuc3VjY2Vzc2Z1bCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVqZWN0KHRoaXMub3BlcmF0aW9uLnN0YXRlLmVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLm9wZXJhdGlvbi5zdGF0ZS5lcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcGVyYXRpb24uc3RhdGUuaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVzb2x2ZU9uVW5zdWNjZXNzZnVsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgUG9sbGVyQ2FuY2VsbGVkRXJyb3IoXCJPcGVyYXRpb24gd2FzIGNhbmNlbGVkXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0RvbmUoKSAmJiB0aGlzLnJlc29sdmUpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBwb2xsZXIgaGFzIGZpbmlzaGVkIHBvbGxpbmcsIHRoaXMgbWVhbnMgd2Ugbm93IGhhdmUgYSByZXN1bHQuXG4gICAgICAgICAgICAvLyBIb3dldmVyLCBpdCBjYW4gYmUgdGhlIGNhc2UgdGhhdCBUUmVzdWx0IGlzIGluc3RhbnRpYXRlZCB0byB2b2lkLCBzb1xuICAgICAgICAgICAgLy8gd2UgYXJlIG5vdCBleHBlY3RpbmcgYSByZXN1bHQgYW55d2F5LiBUbyBhc3NlcnQgdGhhdCB3ZSBtaWdodCBub3RcbiAgICAgICAgICAgIC8vIGhhdmUgYSByZXN1bHQgZXZlbnR1YWxseSBhZnRlciBmaW5pc2hpbmcgcG9sbGluZywgd2UgY2FzdCB0aGUgcmVzdWx0XG4gICAgICAgICAgICAvLyB0byBUUmVzdWx0LlxuICAgICAgICAgICAgdGhpcy5yZXNvbHZlKHRoaXMuZ2V0UmVzdWx0KCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgd2lsbCByZXNvbHZlIG9uY2UgdGhlIHVuZGVybHlpbmcgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBhc3luYyBwb2xsVW50aWxEb25lKHBvbGxPcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMuc3RvcHBlZCkge1xuICAgICAgICAgICAgdGhpcy5zdGFydFBvbGxpbmcocG9sbE9wdGlvbnMpLmNhdGNoKHRoaXMucmVqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBzdGF0ZSBjb3VsZCBoYXZlIGJlZW4gdXBkYXRlZCBieVxuICAgICAgICAvLyBgY2FuY2VsT3BlcmF0aW9uYCwgZS5nLiB0aGUgb3BlcmF0aW9uIGlzIGNhbmNlbGVkIG9yIGFuIGVycm9yIG9jY3VycmVkLlxuICAgICAgICB0aGlzLnByb2Nlc3NVcGRhdGVkU3RhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgYWZ0ZXIgZWFjaCBwb2xsaW5nIGlzIGNvbXBsZXRlZCxcbiAgICAgKiBzZW5kaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwb2xsZXIncyBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBJdCByZXR1cm5zIGEgbWV0aG9kIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RvcCByZWNlaXZpbmcgdXBkYXRlcyBvbiB0aGUgZ2l2ZW4gY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICovXG4gICAgb25Qcm9ncmVzcyhjYWxsYmFjaykge1xuICAgICAgICB0aGlzLnBvbGxQcm9ncmVzc0NhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucG9sbFByb2dyZXNzQ2FsbGJhY2tzID0gdGhpcy5wb2xsUHJvZ3Jlc3NDYWxsYmFja3MuZmlsdGVyKChjKSA9PiBjICE9PSBjYWxsYmFjayk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcG9sbGVyIGhhcyBmaW5pc2hlZCBwb2xsaW5nLlxuICAgICAqL1xuICAgIGlzRG9uZSgpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLm9wZXJhdGlvbi5zdGF0ZTtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oc3RhdGUuaXNDb21wbGV0ZWQgfHwgc3RhdGUuaXNDYW5jZWxsZWQgfHwgc3RhdGUuZXJyb3IpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdG9wcyB0aGUgcG9sbGVyIGZyb20gY29udGludWluZyB0byBwb2xsLlxuICAgICAqL1xuICAgIHN0b3BQb2xsaW5nKCkge1xuICAgICAgICBpZiAoIXRoaXMuc3RvcHBlZCkge1xuICAgICAgICAgICAgdGhpcy5zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlamVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVqZWN0KG5ldyBQb2xsZXJTdG9wcGVkRXJyb3IoXCJUaGlzIHBvbGxlciBpcyBhbHJlYWR5IHN0b3BwZWRcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcG9sbGVyIGlzIHN0b3BwZWQuXG4gICAgICovXG4gICAgaXNTdG9wcGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9wcGVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0cyB0byBjYW5jZWwgdGhlIHVuZGVybHlpbmcgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICogSXQgb25seSBvcHRpb25hbGx5IHJlY2VpdmVzIGFuIG9iamVjdCB3aXRoIGFuIGFib3J0U2lnbmFsIHByb3BlcnR5LCBmcm9tIFxcQGF6dXJlL2Fib3J0LWNvbnRyb2xsZXIncyBBYm9ydFNpZ25hbExpa2UuXG4gICAgICpcbiAgICAgKiBJZiBpdCdzIGNhbGxlZCBhZ2FpbiBiZWZvcmUgaXQgZmluaXNoZXMsIGl0IHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHByb3BlcnRpZXMgcGFzc2VkIHRvIHRoZSBvcGVyYXRpb24ncyB1cGRhdGUgbWV0aG9kLlxuICAgICAqL1xuICAgIGNhbmNlbE9wZXJhdGlvbihvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbmNlbFByb21pc2UpIHtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsUHJvbWlzZSA9IHRoaXMuY2FuY2VsT25jZShvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcHRpb25zLmFib3J0U2lnbmFsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNhbmNlbCByZXF1ZXN0IGlzIGN1cnJlbnRseSBwZW5kaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNhbmNlbFByb21pc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN0YXRlIG9mIHRoZSBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBFdmVuIHRob3VnaCBUU3RhdGUgd2lsbCBiZSB0aGUgc2FtZSB0eXBlIGluc2lkZSBhbnkgb2YgdGhlIG1ldGhvZHMgb2YgYW55IGV4dGVuc2lvbiBvZiB0aGUgUG9sbGVyIGNsYXNzLFxuICAgICAqIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgcG9sbGVycyBjYW4gY3VzdG9taXplIHdoYXQncyBzaGFyZWQgd2l0aCB0aGUgcHVibGljIGJ5IHdyaXRpbmcgdGhlaXIgb3duXG4gICAgICogdmVyc2lvbiBvZiB0aGUgYGdldE9wZXJhdGlvblN0YXRlYCBtZXRob2QsIGFuZCBieSBkZWZpbmluZyB0d28gdHlwZXMsIG9uZSByZXByZXNlbnRpbmcgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBwb2xsZXJcbiAgICAgKiBhbmQgYSBwdWJsaWMgdHlwZSByZXByZXNlbnRpbmcgYSBzYWZlIHRvIHNoYXJlIHN1YnNldCBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGUgaW50ZXJuYWwgc3RhdGUuXG4gICAgICogVGhlaXIgZGVmaW5pdGlvbiBvZiBnZXRPcGVyYXRpb25TdGF0ZSBjYW4gdGhlbiByZXR1cm4gdGhlaXIgcHVibGljIHR5cGUuXG4gICAgICpcbiAgICAgKiBFeGFtcGxlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiAvLyBMZXQncyBzYXkgd2UgaGF2ZSBvdXIgcG9sbGVyJ3Mgb3BlcmF0aW9uIHN0YXRlIGRlZmluZWQgYXM6XG4gICAgICogaW50ZXJmYWNlIE15T3BlcmF0aW9uU3RhdGUgZXh0ZW5kcyBQb2xsT3BlcmF0aW9uU3RhdGU8UmVzdWx0VHlwZT4ge1xuICAgICAqICAgcHJpdmF0ZVByb3BlcnR5Pzogc3RyaW5nO1xuICAgICAqICAgcHVibGljUHJvcGVydHk/OiBzdHJpbmc7XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gVG8gYWxsb3cgdXMgdG8gaGF2ZSBhIHRydWUgc2VwYXJhdGlvbiBvZiBwdWJsaWMgYW5kIHByaXZhdGUgc3RhdGUsIHdlIGhhdmUgdG8gZGVmaW5lIGFub3RoZXIgaW50ZXJmYWNlOlxuICAgICAqIGludGVyZmFjZSBQdWJsaWNTdGF0ZSBleHRlbmRzIFBvbGxPcGVyYXRpb25TdGF0ZTxSZXN1bHRUeXBlPiB7XG4gICAgICogICBwdWJsaWNQcm9wZXJ0eT86IHN0cmluZztcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiAvLyBUaGVuLCB3ZSBkZWZpbmUgb3VyIFBvbGxlciBhcyBmb2xsb3dzOlxuICAgICAqIGV4cG9ydCBjbGFzcyBNeVBvbGxlciBleHRlbmRzIFBvbGxlcjxNeU9wZXJhdGlvblN0YXRlLCBSZXN1bHRUeXBlPiB7XG4gICAgICogICAvLyAuLi4gTW9yZSBjb250ZW50IGlzIG5lZWRlZCBoZXJlIC4uLlxuICAgICAqXG4gICAgICogICBwdWJsaWMgZ2V0T3BlcmF0aW9uU3RhdGUoKTogUHVibGljU3RhdGUge1xuICAgICAqICAgICBjb25zdCBzdGF0ZTogUHVibGljU3RhdGUgPSB0aGlzLm9wZXJhdGlvbi5zdGF0ZTtcbiAgICAgKiAgICAgcmV0dXJuIHtcbiAgICAgKiAgICAgICAvLyBQcm9wZXJ0aWVzIGZyb20gUG9sbE9wZXJhdGlvblN0YXRlPFRSZXN1bHQ+XG4gICAgICogICAgICAgaXNTdGFydGVkOiBzdGF0ZS5pc1N0YXJ0ZWQsXG4gICAgICogICAgICAgaXNDb21wbGV0ZWQ6IHN0YXRlLmlzQ29tcGxldGVkLFxuICAgICAqICAgICAgIGlzQ2FuY2VsbGVkOiBzdGF0ZS5pc0NhbmNlbGxlZCxcbiAgICAgKiAgICAgICBlcnJvcjogc3RhdGUuZXJyb3IsXG4gICAgICogICAgICAgcmVzdWx0OiBzdGF0ZS5yZXN1bHQsXG4gICAgICpcbiAgICAgKiAgICAgICAvLyBUaGUgb25seSBvdGhlciBwcm9wZXJ0eSBuZWVkZWQgYnkgUHVibGljU3RhdGUuXG4gICAgICogICAgICAgcHVibGljUHJvcGVydHk6IHN0YXRlLnB1YmxpY1Byb3BlcnR5XG4gICAgICogICAgIH1cbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIHNlZSB0aGlzIGluIHRoZSB0ZXN0cyBvZiB0aGlzIHJlcG9zaXRvcnksIGdvIHRvIHRoZSBmaWxlOlxuICAgICAqIGAuLi90ZXN0L3V0aWxzL3Rlc3RQb2xsZXIudHNgXG4gICAgICogYW5kIGxvb2sgZm9yIHRoZSBnZXRPcGVyYXRpb25TdGF0ZSBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKi9cbiAgICBnZXRPcGVyYXRpb25TdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uLnN0YXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgdmFsdWUgb2YgdGhlIG9wZXJhdGlvbixcbiAgICAgKiByZWdhcmRsZXNzIG9mIHRoZSBzdGF0ZSBvZiB0aGUgcG9sbGVyLlxuICAgICAqIEl0IGNhbiByZXR1cm4gdW5kZWZpbmVkIG9yIGFuIGluY29tcGxldGUgZm9ybSBvZiB0aGUgZmluYWwgVFJlc3VsdCB2YWx1ZVxuICAgICAqIGRlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24uXG4gICAgICovXG4gICAgZ2V0UmVzdWx0KCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMub3BlcmF0aW9uLnN0YXRlO1xuICAgICAgICByZXR1cm4gc3RhdGUucmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgc2VyaWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBwb2xsZXIncyBvcGVyYXRpb25cbiAgICAgKiBieSBpbnZva2luZyB0aGUgb3BlcmF0aW9uJ3MgdG9TdHJpbmcgbWV0aG9kLlxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcGVyYXRpb24udG9TdHJpbmcoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBkZWxheSB9IGZyb20gXCJAYXp1cmUvY29yZS1odHRwXCI7XG5pbXBvcnQgeyBQb2xsZXIgfSBmcm9tIFwiQGF6dXJlL2NvcmUtbHJvXCI7XG4vKipcbiAqIFRoaXMgaXMgdGhlIHBvbGxlciByZXR1cm5lZCBieSB7QGxpbmsgQmxvYkNsaWVudC5iZWdpbkNvcHlGcm9tVVJMfS5cbiAqIFRoaXMgY2FuIG5vdCBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkgb3V0c2lkZSBvZiB0aGlzIHBhY2thZ2UuXG4gKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgY2xhc3MgQmxvYkJlZ2luQ29weUZyb21VcmxQb2xsZXIgZXh0ZW5kcyBQb2xsZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyBibG9iQ2xpZW50LCBjb3B5U291cmNlLCBpbnRlcnZhbEluTXMgPSAxNTAwMCwgb25Qcm9ncmVzcywgcmVzdW1lRnJvbSwgc3RhcnRDb3B5RnJvbVVSTE9wdGlvbnMsIH0gPSBvcHRpb25zO1xuICAgICAgICBsZXQgc3RhdGU7XG4gICAgICAgIGlmIChyZXN1bWVGcm9tKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEpTT04ucGFyc2UocmVzdW1lRnJvbSkuc3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uID0gbWFrZUJsb2JCZWdpbkNvcHlGcm9tVVJMUG9sbE9wZXJhdGlvbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBibG9iQ2xpZW50LFxuICAgICAgICAgICAgY29weVNvdXJjZSxcbiAgICAgICAgICAgIHN0YXJ0Q29weUZyb21VUkxPcHRpb25zIH0pKTtcbiAgICAgICAgc3VwZXIob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvblByb2dyZXNzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRoaXMub25Qcm9ncmVzcyhvblByb2dyZXNzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmludGVydmFsSW5NcyA9IGludGVydmFsSW5NcztcbiAgICB9XG4gICAgZGVsYXkoKSB7XG4gICAgICAgIHJldHVybiBkZWxheSh0aGlzLmludGVydmFsSW5Ncyk7XG4gICAgfVxufVxuLyoqXG4gKiBOb3RlOiBJbnRlbnRpb25hbGx5IHVzaW5nIGZ1bmN0aW9uIGV4cHJlc3Npb24gb3ZlciBhcnJvdyBmdW5jdGlvbiBleHByZXNzaW9uXG4gKiBzbyB0aGF0IHRoZSBmdW5jdGlvbiBjYW4gYmUgaW52b2tlZCB3aXRoIGEgZGlmZmVyZW50IGNvbnRleHQuXG4gKiBUaGlzIGFmZmVjdHMgd2hhdCBgdGhpc2AgcmVmZXJzIHRvLlxuICogQGhpZGRlblxuICovXG5jb25zdCBjYW5jZWwgPSBhc3luYyBmdW5jdGlvbiBjYW5jZWwob3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHsgY29weUlkIH0gPSBzdGF0ZTtcbiAgICBpZiAoc3RhdGUuaXNDb21wbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VCbG9iQmVnaW5Db3B5RnJvbVVSTFBvbGxPcGVyYXRpb24oc3RhdGUpO1xuICAgIH1cbiAgICBpZiAoIWNvcHlJZCkge1xuICAgICAgICBzdGF0ZS5pc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBtYWtlQmxvYkJlZ2luQ29weUZyb21VUkxQb2xsT3BlcmF0aW9uKHN0YXRlKTtcbiAgICB9XG4gICAgLy8gaWYgYWJvcnRDb3B5RnJvbVVSTCB0aHJvd3MsIGl0IHdpbGwgYnViYmxlIHVwIHRvIHVzZXIncyBwb2xsZXIuY2FuY2VsT3BlcmF0aW9uIGNhbGxcbiAgICBhd2FpdCBzdGF0ZS5ibG9iQ2xpZW50LmFib3J0Q29weUZyb21VUkwoY29weUlkLCB7XG4gICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgIH0pO1xuICAgIHN0YXRlLmlzQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gbWFrZUJsb2JCZWdpbkNvcHlGcm9tVVJMUG9sbE9wZXJhdGlvbihzdGF0ZSk7XG59O1xuLyoqXG4gKiBOb3RlOiBJbnRlbnRpb25hbGx5IHVzaW5nIGZ1bmN0aW9uIGV4cHJlc3Npb24gb3ZlciBhcnJvdyBmdW5jdGlvbiBleHByZXNzaW9uXG4gKiBzbyB0aGF0IHRoZSBmdW5jdGlvbiBjYW4gYmUgaW52b2tlZCB3aXRoIGEgZGlmZmVyZW50IGNvbnRleHQuXG4gKiBUaGlzIGFmZmVjdHMgd2hhdCBgdGhpc2AgcmVmZXJzIHRvLlxuICogQGhpZGRlblxuICovXG5jb25zdCB1cGRhdGUgPSBhc3luYyBmdW5jdGlvbiB1cGRhdGUob3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHsgYmxvYkNsaWVudCwgY29weVNvdXJjZSwgc3RhcnRDb3B5RnJvbVVSTE9wdGlvbnMgfSA9IHN0YXRlO1xuICAgIGlmICghc3RhdGUuaXNTdGFydGVkKSB7XG4gICAgICAgIHN0YXRlLmlzU3RhcnRlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJsb2JDbGllbnQuc3RhcnRDb3B5RnJvbVVSTChjb3B5U291cmNlLCBzdGFydENvcHlGcm9tVVJMT3B0aW9ucyk7XG4gICAgICAgIC8vIGNvcHlJZCBpcyBuZWVkZWQgdG8gYWJvcnRcbiAgICAgICAgc3RhdGUuY29weUlkID0gcmVzdWx0LmNvcHlJZDtcbiAgICAgICAgaWYgKHJlc3VsdC5jb3B5U3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgICAgc3RhdGUucmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICAgICAgc3RhdGUuaXNDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKCFzdGF0ZS5pc0NvbXBsZXRlZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RhdGUuYmxvYkNsaWVudC5nZXRQcm9wZXJ0aWVzKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwgfSk7XG4gICAgICAgICAgICBjb25zdCB7IGNvcHlTdGF0dXMsIGNvcHlQcm9ncmVzcyB9ID0gcmVzdWx0O1xuICAgICAgICAgICAgY29uc3QgcHJldkNvcHlQcm9ncmVzcyA9IHN0YXRlLmNvcHlQcm9ncmVzcztcbiAgICAgICAgICAgIGlmIChjb3B5UHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5jb3B5UHJvZ3Jlc3MgPSBjb3B5UHJvZ3Jlc3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29weVN0YXR1cyA9PT0gXCJwZW5kaW5nXCIgJiZcbiAgICAgICAgICAgICAgICBjb3B5UHJvZ3Jlc3MgIT09IHByZXZDb3B5UHJvZ3Jlc3MgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2Ygb3B0aW9ucy5maXJlUHJvZ3Jlc3MgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgaW4gc2V0VGltZW91dCwgb3Igc3dhbGxvdyBlcnJvcj9cbiAgICAgICAgICAgICAgICBvcHRpb25zLmZpcmVQcm9ncmVzcyhzdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb3B5U3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgICAgICAgIHN0YXRlLnJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBzdGF0ZS5pc0NvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb3B5U3RhdHVzID09PSBcImZhaWxlZFwiKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IgPSBuZXcgRXJyb3IoYEJsb2IgY29weSBmYWlsZWQgd2l0aCByZWFzb246IFwiJHtyZXN1bHQuY29weVN0YXR1c0Rlc2NyaXB0aW9uIHx8IFwidW5rbm93blwifVwiYCk7XG4gICAgICAgICAgICAgICAgc3RhdGUuaXNDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHN0YXRlLmVycm9yID0gZXJyO1xuICAgICAgICAgICAgc3RhdGUuaXNDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYWtlQmxvYkJlZ2luQ29weUZyb21VUkxQb2xsT3BlcmF0aW9uKHN0YXRlKTtcbn07XG4vKipcbiAqIE5vdGU6IEludGVudGlvbmFsbHkgdXNpbmcgZnVuY3Rpb24gZXhwcmVzc2lvbiBvdmVyIGFycm93IGZ1bmN0aW9uIGV4cHJlc3Npb25cbiAqIHNvIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbiBiZSBpbnZva2VkIHdpdGggYSBkaWZmZXJlbnQgY29udGV4dC5cbiAqIFRoaXMgYWZmZWN0cyB3aGF0IGB0aGlzYCByZWZlcnMgdG8uXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IHRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgc3RhdGU6IHRoaXMuc3RhdGUgfSwgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgLy8gcmVtb3ZlIGJsb2JDbGllbnQgZnJvbSBzZXJpYWxpemVkIHN0YXRlIHNpbmNlIGEgY2xpZW50IGNhbid0IGJlIGh5ZHJhdGVkIGZyb20gdGhpcyBpbmZvLlxuICAgICAgICBpZiAoa2V5ID09PSBcImJsb2JDbGllbnRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG59O1xuLyoqXG4gKiBDcmVhdGVzIGEgcG9sbCBvcGVyYXRpb24gZ2l2ZW4gdGhlIHByb3ZpZGVkIHN0YXRlLlxuICogQGhpZGRlblxuICovXG5mdW5jdGlvbiBtYWtlQmxvYkJlZ2luQ29weUZyb21VUkxQb2xsT3BlcmF0aW9uKHN0YXRlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdGU6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSxcbiAgICAgICAgY2FuY2VsLFxuICAgICAgICB0b1N0cmluZyxcbiAgICAgICAgdXBkYXRlLFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CbG9iU3RhcnRDb3B5RnJvbVVybFBvbGxlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbi8qKlxuICogR2VuZXJhdGUgYSByYW5nZSBzdHJpbmcuIEZvciBleGFtcGxlOlxuICpcbiAqIFwiYnl0ZXM9MjU1LVwiIG9yIFwiYnl0ZXM9MC01MTFcIlxuICpcbiAqIEBwYXJhbSBpUmFuZ2UgLVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZ2VUb1N0cmluZyhpUmFuZ2UpIHtcbiAgICBpZiAoaVJhbmdlLm9mZnNldCA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFJhbmdlLm9mZnNldCBjYW5ub3QgYmUgc21hbGxlciB0aGFuIDAuYCk7XG4gICAgfVxuICAgIGlmIChpUmFuZ2UuY291bnQgJiYgaVJhbmdlLmNvdW50IDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFJhbmdlLmNvdW50IG11c3QgYmUgbGFyZ2VyIHRoYW4gMC4gTGVhdmUgaXQgdW5kZWZpbmVkIGlmIHlvdSB3YW50IGEgcmFuZ2UgZnJvbSBvZmZzZXQgdG8gdGhlIGVuZC5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGlSYW5nZS5jb3VudFxuICAgICAgICA/IGBieXRlcz0ke2lSYW5nZS5vZmZzZXR9LSR7aVJhbmdlLm9mZnNldCArIGlSYW5nZS5jb3VudCAtIDF9YFxuICAgICAgICA6IGBieXRlcz0ke2lSYW5nZS5vZmZzZXR9LWA7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SYW5nZS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbi8vIEluIGJyb3dzZXIsIGR1cmluZyB3ZWJwYWNrIG9yIGJyb3dzZXJpZnkgYnVuZGxpbmcsIHRoaXMgbW9kdWxlIHdpbGwgYmUgcmVwbGFjZWQgYnkgJ2V2ZW50cydcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Hb3phbGEvZXZlbnRzXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCI7XG4vKipcbiAqIFN0YXRlcyBmb3IgQmF0Y2guXG4gKi9cbnZhciBCYXRjaFN0YXRlcztcbihmdW5jdGlvbiAoQmF0Y2hTdGF0ZXMpIHtcbiAgICBCYXRjaFN0YXRlc1tCYXRjaFN0YXRlc1tcIkdvb2RcIl0gPSAwXSA9IFwiR29vZFwiO1xuICAgIEJhdGNoU3RhdGVzW0JhdGNoU3RhdGVzW1wiRXJyb3JcIl0gPSAxXSA9IFwiRXJyb3JcIjtcbn0pKEJhdGNoU3RhdGVzIHx8IChCYXRjaFN0YXRlcyA9IHt9KSk7XG4vKipcbiAqIEJhdGNoIHByb3ZpZGVzIGJhc2ljIHBhcmFsbGVsIGV4ZWN1dGlvbiB3aXRoIGNvbmN1cnJlbmN5IGxpbWl0cy5cbiAqIFdpbGwgc3RvcCBleGVjdXRlIGxlZnQgb3BlcmF0aW9ucyB3aGVuIG9uZSBvZiB0aGUgZXhlY3V0ZWQgb3BlcmF0aW9uIHRocm93cyBhbiBlcnJvci5cbiAqIEJ1dCBCYXRjaCBjYW5ub3QgY2FuY2VsIG9uZ29pbmcgb3BlcmF0aW9ucywgeW91IG5lZWQgdG8gY2FuY2VsIHRoZW0gYnkgeW91cnNlbGYuXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXRjaCB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBCYXRjaC5cbiAgICAgKiBAcGFyYW0gY29uY3VycmVuY3kgLVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbmN1cnJlbmN5ID0gNSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogTnVtYmVyIG9mIGFjdGl2ZSBvcGVyYXRpb25zIHVuZGVyIGV4ZWN1dGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWN0aXZlcyA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOdW1iZXIgb2YgY29tcGxldGVkIG9wZXJhdGlvbnMgdW5kZXIgZXhlY3V0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb21wbGV0ZWQgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogT2Zmc2V0IG9mIG5leHQgb3BlcmF0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogT3BlcmF0aW9uIGFycmF5IHRvIGJlIGV4ZWN1dGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vcGVyYXRpb25zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTdGF0ZXMgb2YgQmF0Y2guIFdoZW4gYW4gZXJyb3IgaGFwcGVucywgc3RhdGUgd2lsbCB0dXJuIGludG8gZXJyb3IuXG4gICAgICAgICAqIEJhdGNoIHdpbGwgc3RvcCBleGVjdXRlIGxlZnQgb3BlcmF0aW9ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc3RhdGUgPSBCYXRjaFN0YXRlcy5Hb29kO1xuICAgICAgICBpZiAoY29uY3VycmVuY3kgPCAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcImNvbmN1cnJlbmN5IG11c3QgYmUgbGFyZ2VyIHRoYW4gMFwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbmN1cnJlbmN5ID0gY29uY3VycmVuY3k7XG4gICAgICAgIHRoaXMuZW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkIGEgb3BlcmF0aW9uIGludG8gcXVldWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3BlcmF0aW9uIC1cbiAgICAgKi9cbiAgICBhZGRPcGVyYXRpb24ob3BlcmF0aW9uKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucy5wdXNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVzKys7XG4gICAgICAgICAgICAgICAgYXdhaXQgb3BlcmF0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVzLS07XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZWQrKztcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFsbGVsRXhlY3V0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0dGVyLmVtaXQoXCJlcnJvclwiLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydCBleGVjdXRlIG9wZXJhdGlvbnMgaW4gdGhlIHF1ZXVlLlxuICAgICAqXG4gICAgICovXG4gICAgYXN5bmMgZG8oKSB7XG4gICAgICAgIGlmICh0aGlzLm9wZXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXJhbGxlbEV4ZWN1dGUoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdHRlci5vbihcImZpbmlzaFwiLCByZXNvbHZlKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdHRlci5vbihcImVycm9yXCIsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBCYXRjaFN0YXRlcy5FcnJvcjtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgbmV4dCBvcGVyYXRpb24gdG8gYmUgZXhlY3V0ZWQuIFJldHVybiBudWxsIHdoZW4gcmVhY2hpbmcgZW5kcy5cbiAgICAgKlxuICAgICAqL1xuICAgIG5leHRPcGVyYXRpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCA8IHRoaXMub3BlcmF0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZXJhdGlvbnNbdGhpcy5vZmZzZXQrK107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0IGV4ZWN1dGUgb3BlcmF0aW9ucy4gT25lIG9uZSB0aGUgbW9zdCBpbXBvcnRhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuXG4gICAgICogdGhpcyBtZXRob2Qgd2l0aCBkbygpIGlzIHRoYXQgZG8oKSB3cmFwcyBhcyBhbiBzeW5jIG1ldGhvZC5cbiAgICAgKlxuICAgICAqL1xuICAgIHBhcmFsbGVsRXhlY3V0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IEJhdGNoU3RhdGVzLkVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29tcGxldGVkID49IHRoaXMub3BlcmF0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdHRlci5lbWl0KFwiZmluaXNoXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh0aGlzLmFjdGl2ZXMgPCB0aGlzLmNvbmN1cnJlbmN5KSB7XG4gICAgICAgICAgICBjb25zdCBvcGVyYXRpb24gPSB0aGlzLm5leHRPcGVyYXRpb24oKTtcbiAgICAgICAgICAgIGlmIChvcGVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhdGNoLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tIFwic3RyZWFtXCI7XG4vKipcbiAqIFRoaXMgY2xhc3MgZ2VuZXJhdGVzIGEgcmVhZGFibGUgc3RyZWFtIGZyb20gdGhlIGRhdGEgaW4gYW4gYXJyYXkgb2YgYnVmZmVycy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJ1ZmZlcnNTdHJlYW0gZXh0ZW5kcyBSZWFkYWJsZSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBCdWZmZXJzU3RyZWFtIHRoYXQgd2lsbCBlbWl0IHRoZSBkYXRhXG4gICAgICogY29udGFpbmVkIGluIHRoZSBhcnJheSBvZiBidWZmZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGJ1ZmZlcnMgLSBBcnJheSBvZiBidWZmZXJzIGNvbnRhaW5pbmcgdGhlIGRhdGFcbiAgICAgKiBAcGFyYW0gYnl0ZUxlbmd0aCAtIFRoZSB0b3RhbCBsZW5ndGggb2YgZGF0YSBjb250YWluZWQgaW4gdGhlIGJ1ZmZlcnNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihidWZmZXJzLCBieXRlTGVuZ3RoLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlcnMgPSBidWZmZXJzO1xuICAgICAgICB0aGlzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoO1xuICAgICAgICB0aGlzLmJ5dGVPZmZzZXRJbkN1cnJlbnRCdWZmZXIgPSAwO1xuICAgICAgICB0aGlzLmJ1ZmZlckluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5wdXNoZWRCeXRlc0xlbmd0aCA9IDA7XG4gICAgICAgIC8vIGNoZWNrIGJ5dGVMZW5ndGggaXMgbm8gbGFyZ2VyIHRoYW4gYnVmZmVyc1tdIHRvdGFsIGxlbmd0aFxuICAgICAgICBsZXQgYnVmZmVyc0xlbmd0aCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgYnVmIG9mIHRoaXMuYnVmZmVycykge1xuICAgICAgICAgICAgYnVmZmVyc0xlbmd0aCArPSBidWYuYnl0ZUxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnVmZmVyc0xlbmd0aCA8IHRoaXMuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YSBzaXplIHNob3VsZG4ndCBiZSBsYXJnZXIgdGhhbiB0aGUgdG90YWwgbGVuZ3RoIG9mIGJ1ZmZlcnMuXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludGVybmFsIF9yZWFkKCkgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gd2FudHMgdG8gcHVsbCBtb3JlIGRhdGEgaW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2l6ZSAtIE9wdGlvbmFsLiBUaGUgc2l6ZSBvZiBkYXRhIHRvIGJlIHJlYWRcbiAgICAgKi9cbiAgICBfcmVhZChzaXplKSB7XG4gICAgICAgIGlmICh0aGlzLnB1c2hlZEJ5dGVzTGVuZ3RoID49IHRoaXMuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5wdXNoKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2l6ZSkge1xuICAgICAgICAgICAgc2l6ZSA9IHRoaXMucmVhZGFibGVIaWdoV2F0ZXJNYXJrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG91dEJ1ZmZlcnMgPSBbXTtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IHNpemUgJiYgdGhpcy5wdXNoZWRCeXRlc0xlbmd0aCA8IHRoaXMuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgLy8gVGhlIGxhc3QgYnVmZmVyIG1heSBiZSBsb25nZXIgdGhhbiB0aGUgZGF0YSBpdCBjb250YWlucy5cbiAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ0RhdGFJbkFsbEJ1ZmZlcnMgPSB0aGlzLmJ5dGVMZW5ndGggLSB0aGlzLnB1c2hlZEJ5dGVzTGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nQ2FwYWNpdHlJblRoaXNCdWZmZXIgPSB0aGlzLmJ1ZmZlcnNbdGhpcy5idWZmZXJJbmRleF0uYnl0ZUxlbmd0aCAtIHRoaXMuYnl0ZU9mZnNldEluQ3VycmVudEJ1ZmZlcjtcbiAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZyA9IE1hdGgubWluKHJlbWFpbmluZ0NhcGFjaXR5SW5UaGlzQnVmZmVyLCByZW1haW5pbmdEYXRhSW5BbGxCdWZmZXJzKTtcbiAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPiBzaXplIC0gaSkge1xuICAgICAgICAgICAgICAgIC8vIGNodW5rU2l6ZSA9IHNpemUgLSBpXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kID0gdGhpcy5ieXRlT2Zmc2V0SW5DdXJyZW50QnVmZmVyICsgc2l6ZSAtIGk7XG4gICAgICAgICAgICAgICAgb3V0QnVmZmVycy5wdXNoKHRoaXMuYnVmZmVyc1t0aGlzLmJ1ZmZlckluZGV4XS5zbGljZSh0aGlzLmJ5dGVPZmZzZXRJbkN1cnJlbnRCdWZmZXIsIGVuZCkpO1xuICAgICAgICAgICAgICAgIHRoaXMucHVzaGVkQnl0ZXNMZW5ndGggKz0gc2l6ZSAtIGk7XG4gICAgICAgICAgICAgICAgdGhpcy5ieXRlT2Zmc2V0SW5DdXJyZW50QnVmZmVyID0gZW5kO1xuICAgICAgICAgICAgICAgIGkgPSBzaXplO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY2h1bmtTaXplID0gcmVtYWluaW5nXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kID0gdGhpcy5ieXRlT2Zmc2V0SW5DdXJyZW50QnVmZmVyICsgcmVtYWluaW5nO1xuICAgICAgICAgICAgICAgIG91dEJ1ZmZlcnMucHVzaCh0aGlzLmJ1ZmZlcnNbdGhpcy5idWZmZXJJbmRleF0uc2xpY2UodGhpcy5ieXRlT2Zmc2V0SW5DdXJyZW50QnVmZmVyLCBlbmQpKTtcbiAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nID09PSByZW1haW5pbmdDYXBhY2l0eUluVGhpc0J1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmJ1ZmZlcnNbdGhpcy5idWZmZXJJbmRleF0gdXNlZCB1cCwgc2hpZnQgdG8gbmV4dCBvbmVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ieXRlT2Zmc2V0SW5DdXJyZW50QnVmZmVyID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWZmZXJJbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ieXRlT2Zmc2V0SW5DdXJyZW50QnVmZmVyID0gZW5kO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnB1c2hlZEJ5dGVzTGVuZ3RoICs9IHJlbWFpbmluZztcbiAgICAgICAgICAgICAgICBpICs9IHJlbWFpbmluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAob3V0QnVmZmVycy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aGlzLnB1c2goQnVmZmVyLmNvbmNhdChvdXRCdWZmZXJzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3V0QnVmZmVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaChvdXRCdWZmZXJzWzBdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJ1ZmZlcnNTdHJlYW0uanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBCdWZmZXJzU3RyZWFtIH0gZnJvbSBcIi4vQnVmZmVyc1N0cmVhbVwiO1xuLyoqXG4gKiBtYXhCdWZmZXJMZW5ndGggaXMgbWF4IHNpemUgb2YgZWFjaCBidWZmZXIgaW4gdGhlIHBvb2xlZCBidWZmZXJzLlxuICovXG4vLyBDYW4ndCB1c2UgaW1wb3J0IGFzIFR5cGVzY3JpcHQgZG9lc24ndCByZWNvZ25pemUgXCJidWZmZXJcIi5cbmNvbnN0IG1heEJ1ZmZlckxlbmd0aCA9IHJlcXVpcmUoXCJidWZmZXJcIikuY29uc3RhbnRzLk1BWF9MRU5HVEg7XG4vKipcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBidWZmZXIgY29udGFpbmVyIHdoaWNoIGNvbmNlcHR1YWxseSBoYXMgbm8gaGFyZCBzaXplIGxpbWl0LlxuICogSXQgYWNjZXB0cyBhIGNhcGFjaXR5LCBhbiBhcnJheSBvZiBpbnB1dCBidWZmZXJzIGFuZCB0aGUgdG90YWwgbGVuZ3RoIG9mIGlucHV0IGRhdGEuXG4gKiBJdCB3aWxsIGFsbG9jYXRlIGFuIGludGVybmFsIFwiYnVmZmVyXCIgb2YgdGhlIGNhcGFjaXR5IGFuZCBmaWxsIHRoZSBkYXRhIGluIHRoZSBpbnB1dCBidWZmZXJzXG4gKiBpbnRvIHRoZSBpbnRlcm5hbCBcImJ1ZmZlclwiIHNlcmlhbGx5IHdpdGggcmVzcGVjdCB0byB0aGUgdG90YWwgbGVuZ3RoLlxuICogVGhlbiBieSBjYWxsaW5nIFBvb2xlZEJ1ZmZlci5nZXRSZWFkYWJsZVN0cmVhbSgpLCB5b3UgY2FuIGdldCBhIHJlYWRhYmxlIHN0cmVhbVxuICogYXNzZW1ibGVkIGZyb20gYWxsIHRoZSBkYXRhIGluIHRoZSBpbnRlcm5hbCBcImJ1ZmZlclwiLlxuICovXG5leHBvcnQgY2xhc3MgUG9vbGVkQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eSwgYnVmZmVycywgdG90YWxMZW5ndGgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEludGVybmFsIGJ1ZmZlcnMgdXNlZCB0byBrZWVwIHRoZSBkYXRhLlxuICAgICAgICAgKiBFYWNoIGJ1ZmZlciBoYXMgYSBsZW5ndGggb2YgdGhlIG1heEJ1ZmZlckxlbmd0aCBleGNlcHQgbGFzdCBvbmUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmJ1ZmZlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5jYXBhY2l0eSA9IGNhcGFjaXR5O1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgLy8gYWxsb2NhdGVcbiAgICAgICAgY29uc3QgYnVmZmVyTnVtID0gTWF0aC5jZWlsKGNhcGFjaXR5IC8gbWF4QnVmZmVyTGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXJOdW07IGkrKykge1xuICAgICAgICAgICAgbGV0IGxlbiA9IGkgPT09IGJ1ZmZlck51bSAtIDEgPyBjYXBhY2l0eSAlIG1heEJ1ZmZlckxlbmd0aCA6IG1heEJ1ZmZlckxlbmd0aDtcbiAgICAgICAgICAgIGlmIChsZW4gPT09IDApIHtcbiAgICAgICAgICAgICAgICBsZW4gPSBtYXhCdWZmZXJMZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlcnMucHVzaChCdWZmZXIuYWxsb2NVbnNhZmUobGVuKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1ZmZlcnMpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsbChidWZmZXJzLCB0b3RhbExlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBwb29sZWQgYnVmZmVycy5cbiAgICAgKi9cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpbGwgdGhlIGludGVybmFsIGJ1ZmZlcnMgd2l0aCBkYXRhIGluIHRoZSBpbnB1dCBidWZmZXJzIHNlcmlhbGx5XG4gICAgICogd2l0aCByZXNwZWN0IHRvIHRoZSB0b3RhbCBsZW5ndGggYW5kIHRoZSB0b3RhbCBjYXBhY2l0eSBvZiB0aGUgaW50ZXJuYWwgYnVmZmVycy5cbiAgICAgKiBEYXRhIGNvcGllZCB3aWxsIGJlIHNoaWZ0IG91dCBvZiB0aGUgaW5wdXQgYnVmZmVycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBidWZmZXJzIC0gSW5wdXQgYnVmZmVycyBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIGZpbGxlZCBpbiB0aGUgcG9vbGVkIGJ1ZmZlclxuICAgICAqIEBwYXJhbSB0b3RhbExlbmd0aCAtIFRvdGFsIGxlbmd0aCBvZiB0aGUgZGF0YSB0byBiZSBmaWxsZWQgaW4uXG4gICAgICpcbiAgICAgKi9cbiAgICBmaWxsKGJ1ZmZlcnMsIHRvdGFsTGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX3NpemUgPSBNYXRoLm1pbih0aGlzLmNhcGFjaXR5LCB0b3RhbExlbmd0aCk7XG4gICAgICAgIGxldCBpID0gMCwgaiA9IDAsIHRhcmdldE9mZnNldCA9IDAsIHNvdXJjZU9mZnNldCA9IDAsIHRvdGFsQ29waWVkTnVtID0gMDtcbiAgICAgICAgd2hpbGUgKHRvdGFsQ29waWVkTnVtIDwgdGhpcy5fc2l6ZSkge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gYnVmZmVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuYnVmZmVyc1tqXTtcbiAgICAgICAgICAgIGNvbnN0IGNvcGllZE51bSA9IHNvdXJjZS5jb3B5KHRhcmdldCwgdGFyZ2V0T2Zmc2V0LCBzb3VyY2VPZmZzZXQpO1xuICAgICAgICAgICAgdG90YWxDb3BpZWROdW0gKz0gY29waWVkTnVtO1xuICAgICAgICAgICAgc291cmNlT2Zmc2V0ICs9IGNvcGllZE51bTtcbiAgICAgICAgICAgIHRhcmdldE9mZnNldCArPSBjb3BpZWROdW07XG4gICAgICAgICAgICBpZiAoc291cmNlT2Zmc2V0ID09PSBzb3VyY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIHNvdXJjZU9mZnNldCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGFyZ2V0T2Zmc2V0ID09PSB0YXJnZXQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaisrO1xuICAgICAgICAgICAgICAgIHRhcmdldE9mZnNldCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2xlYXIgY29waWVkIGZyb20gc291cmNlIGJ1ZmZlcnNcbiAgICAgICAgYnVmZmVycy5zcGxpY2UoMCwgaSk7XG4gICAgICAgIGlmIChidWZmZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGJ1ZmZlcnNbMF0gPSBidWZmZXJzWzBdLnNsaWNlKHNvdXJjZU9mZnNldCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByZWFkYWJsZSBzdHJlYW0gYXNzZW1ibGVkIGZyb20gYWxsIHRoZSBkYXRhIGluIHRoZSBpbnRlcm5hbCBidWZmZXJzLlxuICAgICAqXG4gICAgICovXG4gICAgZ2V0UmVhZGFibGVTdHJlYW0oKSB7XG4gICAgICAgIHJldHVybiBuZXcgQnVmZmVyc1N0cmVhbSh0aGlzLmJ1ZmZlcnMsIHRoaXMuc2l6ZSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UG9vbGVkQnVmZmVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcImV2ZW50c1wiO1xuaW1wb3J0IHsgUG9vbGVkQnVmZmVyIH0gZnJvbSBcIi4vUG9vbGVkQnVmZmVyXCI7XG4vKipcbiAqIFRoaXMgY2xhc3MgYWNjZXB0cyBhIE5vZGUuanMgUmVhZGFibGUgc3RyZWFtIGFzIGlucHV0LCBhbmQga2VlcHMgcmVhZGluZyBkYXRhXG4gKiBmcm9tIHRoZSBzdHJlYW0gaW50byB0aGUgaW50ZXJuYWwgYnVmZmVyIHN0cnVjdHVyZSwgdW50aWwgaXQgcmVhY2hlcyBtYXhCdWZmZXJzLlxuICogRXZlcnkgYXZhaWxhYmxlIGJ1ZmZlciB3aWxsIHRyeSB0byB0cmlnZ2VyIG91dGdvaW5nSGFuZGxlci5cbiAqXG4gKiBUaGUgaW50ZXJuYWwgYnVmZmVyIHN0cnVjdHVyZSBpbmNsdWRlcyBhbiBpbmNvbWluZyBidWZmZXIgYXJyYXksIGFuZCBhIG91dGdvaW5nXG4gKiBidWZmZXIgYXJyYXkuIFRoZSBpbmNvbWluZyBidWZmZXIgYXJyYXkgaW5jbHVkZXMgdGhlIFwiZW1wdHlcIiBidWZmZXJzIGNhbiBiZSBmaWxsZWRcbiAqIHdpdGggbmV3IGluY29taW5nIGRhdGEuIFRoZSBvdXRnb2luZyBhcnJheSBpbmNsdWRlcyB0aGUgZmlsbGVkIGJ1ZmZlcnMgdG8gYmVcbiAqIGhhbmRsZWQgYnkgb3V0Z29pbmdIYW5kbGVyLiBFdmVyeSBhYm92ZSBidWZmZXIgc2l6ZSBpcyBkZWZpbmVkIGJ5IHBhcmFtZXRlciBidWZmZXJTaXplLlxuICpcbiAqIE5VTV9PRl9BTExfQlVGRkVSUyA9IEJVRkZFUlNfSU5fSU5DT01JTkcgKyBCVUZGRVJTX0lOX09VVEdPSU5HICsgQlVGRkVSU19VTkRFUl9IQU5ETElOR1xuICpcbiAqIE5VTV9PRl9BTExfQlVGRkVSUyBsZXNzZXIgdGhhbiBvciBlcXVhbCB0byBtYXhCdWZmZXJzXG4gKlxuICogUEVSRk9STUFOQ0UgSU1QUk9WRU1FTlQgVElQUzpcbiAqIDEuIElucHV0IHN0cmVhbSBoaWdoV2F0ZXJNYXJrIGlzIGJldHRlciB0byBzZXQgYSBzYW1lIHZhbHVlIHdpdGggYnVmZmVyU2l6ZVxuICogICAgcGFyYW1ldGVyLCB3aGljaCB3aWxsIGF2b2lkIEJ1ZmZlci5jb25jYXQoKSBvcGVyYXRpb25zLlxuICogMi4gY29uY3VycmVuY3kgc2hvdWxkIHNldCBhIHNtYWxsZXIgdmFsdWUgdGhhbiBtYXhCdWZmZXJzLCB3aGljaCBpcyBoZWxwZnVsIHRvXG4gKiAgICByZWR1Y2UgdGhlIHBvc3NpYmlsaXR5IHdoZW4gYSBvdXRnb2luZyBoYW5kbGVyIHdhaXRzIGZvciB0aGUgc3RyZWFtIGRhdGEuXG4gKiAgICBpbiB0aGlzIHNpdHVhdGlvbiwgb3V0Z29pbmcgaGFuZGxlcnMgYXJlIGJsb2NrZWQuXG4gKiAgICBPdXRnb2luZyBxdWV1ZSBzaG91bGRuJ3QgYmUgZW1wdHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBCdWZmZXJTY2hlZHVsZXIge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQnVmZmVyU2NoZWR1bGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlYWRhYmxlIC0gQSBOb2RlLmpzIFJlYWRhYmxlIHN0cmVhbVxuICAgICAqIEBwYXJhbSBidWZmZXJTaXplIC0gQnVmZmVyIHNpemUgb2YgZXZlcnkgbWFpbnRhaW5lZCBidWZmZXJcbiAgICAgKiBAcGFyYW0gbWF4QnVmZmVycyAtIEhvdyBtYW55IGJ1ZmZlcnMgY2FuIGJlIGFsbG9jYXRlZFxuICAgICAqIEBwYXJhbSBvdXRnb2luZ0hhbmRsZXIgLSBBbiBhc3luYyBmdW5jdGlvbiBzY2hlZHVsZWQgdG8gYmVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZCB3aGVuIGEgYnVmZmVyIGZ1bGx5IGZpbGxlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBzdHJlYW0gZGF0YVxuICAgICAqIEBwYXJhbSBjb25jdXJyZW5jeSAtIENvbmN1cnJlbmN5IG9mIGV4ZWN1dGluZyBvdXRnb2luZ0hhbmRsZXJzICg+MClcbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgLSBbT3B0aW9uYWxdIEVuY29kaW5nIG9mIFJlYWRhYmxlIHN0cmVhbSB3aGVuIGl0J3MgYSBzdHJpbmcgc3RyZWFtXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocmVhZGFibGUsIGJ1ZmZlclNpemUsIG1heEJ1ZmZlcnMsIG91dGdvaW5nSGFuZGxlciwgY29uY3VycmVuY3ksIGVuY29kaW5nKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBpbnRlcm5hbCBldmVudCBlbWl0dGVyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5lbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQW4gaW50ZXJuYWwgb2Zmc2V0IG1hcmtlciB0byB0cmFjayBkYXRhIG9mZnNldCBpbiBieXRlcyBvZiBuZXh0IG91dGdvaW5nSGFuZGxlci5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIGludGVybmFsIG1hcmtlciB0byB0cmFjayB3aGV0aGVyIHN0cmVhbSBpcyBlbmQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzU3RyZWFtRW5kID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBpbnRlcm5hbCBtYXJrZXIgdG8gdHJhY2sgd2hldGhlciBzdHJlYW0gb3Igb3V0Z29pbmdIYW5kbGVyIHJldHVybnMgZXJyb3IuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhvdyBtYW55IGhhbmRsZXJzIGFyZSBleGVjdXRpbmcuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmV4ZWN1dGluZ091dGdvaW5nSGFuZGxlcnMgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogSG93IG1hbnkgYnVmZmVycyBoYXZlIGJlZW4gYWxsb2NhdGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5udW1CdWZmZXJzID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJlY2F1c2UgdGhpcyBjbGFzcyBkb2Vzbid0IGtub3cgaG93IG11Y2ggZGF0YSBldmVyeSB0aW1lIHN0cmVhbSBwb3BzLCB3aGljaFxuICAgICAgICAgKiBpcyBkZWZpbmVkIGJ5IGhpZ2hXYXRlck1hcmtlciBvZiB0aGUgc3RyZWFtLiBTbyBCdWZmZXJTY2hlZHVsZXIgd2lsbCBjYWNoZVxuICAgICAgICAgKiBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHN0cmVhbSwgd2hlbiBkYXRhIGluIHVucmVzb2x2ZWREYXRhQXJyYXkgZXhjZWVkcyB0aGVcbiAgICAgICAgICogYmxvY2tTaXplIGRlZmluZWQsIGl0IHdpbGwgdHJ5IHRvIGNvbmNhdCBhIGJsb2NrU2l6ZSBvZiBidWZmZXIsIGZpbGwgaW50byBhdmFpbGFibGVcbiAgICAgICAgICogYnVmZmVycyBmcm9tIGluY29taW5nIGFuZCBwdXNoIHRvIG91dGdvaW5nIGFycmF5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51bnJlc29sdmVkRGF0YUFycmF5ID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIb3cgbXVjaCBkYXRhIGNvbnNpc3RlZCBpbiB1bnJlc29sdmVkRGF0YUFycmF5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51bnJlc29sdmVkTGVuZ3RoID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhcnJheSBpbmNsdWRlcyBhbGwgdGhlIGF2YWlsYWJsZSBidWZmZXJzIGNhbiBiZSB1c2VkIHRvIGZpbGwgZGF0YSBmcm9tIHN0cmVhbS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaW5jb21pbmcgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhcnJheSAocXVldWUpIGluY2x1ZGVzIGFsbCB0aGUgYnVmZmVycyBmaWxsZWQgZnJvbSBzdHJlYW0gZGF0YS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub3V0Z29pbmcgPSBbXTtcbiAgICAgICAgaWYgKGJ1ZmZlclNpemUgPD0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYGJ1ZmZlclNpemUgbXVzdCBiZSBsYXJnZXIgdGhhbiAwLCBjdXJyZW50IGlzICR7YnVmZmVyU2l6ZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4QnVmZmVycyA8PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgbWF4QnVmZmVycyBtdXN0IGJlIGxhcmdlciB0aGFuIDAsIGN1cnJlbnQgaXMgJHttYXhCdWZmZXJzfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25jdXJyZW5jeSA8PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgY29uY3VycmVuY3kgbXVzdCBiZSBsYXJnZXIgdGhhbiAwLCBjdXJyZW50IGlzICR7Y29uY3VycmVuY3l9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWZmZXJTaXplID0gYnVmZmVyU2l6ZTtcbiAgICAgICAgdGhpcy5tYXhCdWZmZXJzID0gbWF4QnVmZmVycztcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLm91dGdvaW5nSGFuZGxlciA9IG91dGdvaW5nSGFuZGxlcjtcbiAgICAgICAgdGhpcy5jb25jdXJyZW5jeSA9IGNvbmN1cnJlbmN5O1xuICAgICAgICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0IHRoZSBzY2hlZHVsZXIsIHdpbGwgcmV0dXJuIGVycm9yIHdoZW4gc3RyZWFtIG9mIGFueSBvZiB0aGUgb3V0Z29pbmdIYW5kbGVyc1xuICAgICAqIHJldHVybnMgZXJyb3IuXG4gICAgICpcbiAgICAgKi9cbiAgICBhc3luYyBkbygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVhZGFibGUub24oXCJkYXRhXCIsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiID8gQnVmZmVyLmZyb20oZGF0YSwgdGhpcy5lbmNvZGluZykgOiBkYXRhO1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kVW5yZXNvbHZlZERhdGEoZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJlc29sdmVEYXRhKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWFkYWJsZS5wYXVzZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZWFkYWJsZS5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXR0ZXIuZW1pdChcImVycm9yXCIsIGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucmVhZGFibGUub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNTdHJlYW1FbmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdHRlci5lbWl0KFwiY2hlY2tFbmRcIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZW1pdHRlci5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMucmVhZGFibGUucGF1c2UoKTtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyLm9uKFwiY2hlY2tFbmRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm91dGdvaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyT3V0Z29pbmdIYW5kbGVycygpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU3RyZWFtRW5kICYmIHRoaXMuZXhlY3V0aW5nT3V0Z29pbmdIYW5kbGVycyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51bnJlc29sdmVkTGVuZ3RoID4gMCAmJiB0aGlzLnVucmVzb2x2ZWRMZW5ndGggPCB0aGlzLmJ1ZmZlclNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuc2hpZnRCdWZmZXJGcm9tVW5yZXNvbHZlZERhdGFBcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRnb2luZ0hhbmRsZXIoKCkgPT4gYnVmZmVyLmdldFJlYWRhYmxlU3RyZWFtKCksIGJ1ZmZlci5zaXplLCB0aGlzLm9mZnNldClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNvbHZlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChyZWplY3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudW5yZXNvbHZlZExlbmd0aCA+PSB0aGlzLmJ1ZmZlclNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0IGEgbmV3IGRhdGEgaW50byB1bnJlc29sdmVkIGFycmF5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGEgLVxuICAgICAqL1xuICAgIGFwcGVuZFVucmVzb2x2ZWREYXRhKGRhdGEpIHtcbiAgICAgICAgdGhpcy51bnJlc29sdmVkRGF0YUFycmF5LnB1c2goZGF0YSk7XG4gICAgICAgIHRoaXMudW5yZXNvbHZlZExlbmd0aCArPSBkYXRhLmxlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJ5IHRvIHNoaWZ0IGEgYnVmZmVyIHdpdGggc2l6ZSBpbiBibG9ja1NpemUuIFRoZSBidWZmZXIgcmV0dXJuZWQgbWF5IGJlIGxlc3NcbiAgICAgKiB0aGFuIGJsb2NrU2l6ZSB3aGVuIGRhdGEgaW4gdW5yZXNvbHZlZERhdGFBcnJheSBpcyBsZXNzIHRoYW4gYnVmZmVyU2l6ZS5cbiAgICAgKlxuICAgICAqL1xuICAgIHNoaWZ0QnVmZmVyRnJvbVVucmVzb2x2ZWREYXRhQXJyYXkoYnVmZmVyKSB7XG4gICAgICAgIGlmICghYnVmZmVyKSB7XG4gICAgICAgICAgICBidWZmZXIgPSBuZXcgUG9vbGVkQnVmZmVyKHRoaXMuYnVmZmVyU2l6ZSwgdGhpcy51bnJlc29sdmVkRGF0YUFycmF5LCB0aGlzLnVucmVzb2x2ZWRMZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnVmZmVyLmZpbGwodGhpcy51bnJlc29sdmVkRGF0YUFycmF5LCB0aGlzLnVucmVzb2x2ZWRMZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudW5yZXNvbHZlZExlbmd0aCAtPSBidWZmZXIuc2l6ZTtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBkYXRhIGluIHVucmVzb2x2ZWREYXRhQXJyYXkuIEZvciBldmVyeSBidWZmZXIgd2l0aCBzaXplIGluIGJsb2NrU2l6ZVxuICAgICAqIHNoaWZ0ZWQsIGl0IHdpbGwgdHJ5IHRvIGdldCAob3IgYWxsb2NhdGUgYSBidWZmZXIpIGZyb20gaW5jb21pbmcsIGFuZCBmaWxsIGl0LFxuICAgICAqIHRoZW4gcHVzaCBpdCBpbnRvIG91dGdvaW5nIHRvIGJlIGhhbmRsZWQgYnkgb3V0Z29pbmcgaGFuZGxlci5cbiAgICAgKlxuICAgICAqIFJldHVybiBmYWxzZSB3aGVuIGF2YWlsYWJsZSBidWZmZXJzIGluIGluY29taW5nIGFyZSBub3QgZW5vdWdoLCBlbHNlIHRydWUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBSZXR1cm4gZmFsc2Ugd2hlbiBidWZmZXJzIGluIGluY29taW5nIGFyZSBub3QgZW5vdWdoLCBlbHNlIHRydWUuXG4gICAgICovXG4gICAgcmVzb2x2ZURhdGEoKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLnVucmVzb2x2ZWRMZW5ndGggPj0gdGhpcy5idWZmZXJTaXplKSB7XG4gICAgICAgICAgICBsZXQgYnVmZmVyO1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5jb21pbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHRoaXMuaW5jb21pbmcuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0QnVmZmVyRnJvbVVucmVzb2x2ZWREYXRhQXJyYXkoYnVmZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm51bUJ1ZmZlcnMgPCB0aGlzLm1heEJ1ZmZlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5zaGlmdEJ1ZmZlckZyb21VbnJlc29sdmVkRGF0YUFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubnVtQnVmZmVycysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTm8gYXZhaWxhYmxlIGJ1ZmZlciwgd2FpdCBmb3IgYnVmZmVyIHJldHVybmVkXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm91dGdvaW5nLnB1c2goYnVmZmVyKTtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlck91dGdvaW5nSGFuZGxlcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJ5IHRvIHRyaWdnZXIgYSBvdXRnb2luZyBoYW5kbGVyIGZvciBldmVyeSBidWZmZXIgaW4gb3V0Z29pbmcuIFN0b3Agd2hlblxuICAgICAqIGNvbmN1cnJlbmN5IHJlYWNoZXMuXG4gICAgICovXG4gICAgYXN5bmMgdHJpZ2dlck91dGdvaW5nSGFuZGxlcnMoKSB7XG4gICAgICAgIGxldCBidWZmZXI7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmV4ZWN1dGluZ091dGdvaW5nSGFuZGxlcnMgPj0gdGhpcy5jb25jdXJyZW5jeSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlciA9IHRoaXMub3V0Z29pbmcuc2hpZnQoKTtcbiAgICAgICAgICAgIGlmIChidWZmZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJPdXRnb2luZ0hhbmRsZXIoYnVmZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoYnVmZmVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJpZ2dlciBhIG91dGdvaW5nIGhhbmRsZXIgZm9yIGEgYnVmZmVyIHNoaWZ0ZWQgZnJvbSBvdXRnb2luZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBidWZmZXIgLVxuICAgICAqL1xuICAgIGFzeW5jIHRyaWdnZXJPdXRnb2luZ0hhbmRsZXIoYnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlckxlbmd0aCA9IGJ1ZmZlci5zaXplO1xuICAgICAgICB0aGlzLmV4ZWN1dGluZ091dGdvaW5nSGFuZGxlcnMrKztcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gYnVmZmVyTGVuZ3RoO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5vdXRnb2luZ0hhbmRsZXIoKCkgPT4gYnVmZmVyLmdldFJlYWRhYmxlU3RyZWFtKCksIGJ1ZmZlckxlbmd0aCwgdGhpcy5vZmZzZXQgLSBidWZmZXJMZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdHRlci5lbWl0KFwiZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV4ZWN1dGluZ091dGdvaW5nSGFuZGxlcnMtLTtcbiAgICAgICAgdGhpcy5yZXVzZUJ1ZmZlcihidWZmZXIpO1xuICAgICAgICB0aGlzLmVtaXR0ZXIuZW1pdChcImNoZWNrRW5kXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYnVmZmVyIHVzZWQgYnkgb3V0Z29pbmcgaGFuZGxlciBpbnRvIGluY29taW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIGJ1ZmZlciAtXG4gICAgICovXG4gICAgcmV1c2VCdWZmZXIoYnVmZmVyKSB7XG4gICAgICAgIHRoaXMuaW5jb21pbmcucHVzaChidWZmZXIpO1xuICAgICAgICBpZiAoIXRoaXMuaXNFcnJvciAmJiB0aGlzLnJlc29sdmVEYXRhKCkgJiYgIXRoaXMuaXNTdHJlYW1FbmQpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZGFibGUucmVzdW1lKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CdWZmZXJTY2hlZHVsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSBcInV0aWxcIjtcbmltcG9ydCB7IFJFUVVFU1RfVElNRU9VVCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuLyoqXG4gKiBSZWFkcyBhIHJlYWRhYmxlIHN0cmVhbSBpbnRvIGJ1ZmZlci4gRmlsbCB0aGUgYnVmZmVyIGZyb20gb2Zmc2V0IHRvIGVuZC5cbiAqXG4gKiBAcGFyYW0gc3RyZWFtIC0gQSBOb2RlLmpzIFJlYWRhYmxlIHN0cmVhbVxuICogQHBhcmFtIGJ1ZmZlciAtIEJ1ZmZlciB0byBiZSBmaWxsZWQsIGxlbmd0aCBtdXN0IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBvZmZzZXRcbiAqIEBwYXJhbSBvZmZzZXQgLSBGcm9tIHdoaWNoIHBvc2l0aW9uIGluIHRoZSBidWZmZXIgdG8gYmUgZmlsbGVkLCBpbmNsdXNpdmVcbiAqIEBwYXJhbSBlbmQgLSBUbyB3aGljaCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyIHRvIGJlIGZpbGxlZCwgZXhjbHVzaXZlXG4gKiBAcGFyYW0gZW5jb2RpbmcgLSBFbmNvZGluZyBvZiB0aGUgUmVhZGFibGUgc3RyZWFtXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdHJlYW1Ub0J1ZmZlcihzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBlbmQsIGVuY29kaW5nKSB7XG4gICAgbGV0IHBvcyA9IDA7IC8vIFBvc2l0aW9uIGluIHN0cmVhbVxuICAgIGNvbnN0IGNvdW50ID0gZW5kIC0gb2Zmc2V0OyAvLyBUb3RhbCBhbW91bnQgb2YgZGF0YSBuZWVkZWQgaW4gc3RyZWFtXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihgVGhlIG9wZXJhdGlvbiBjYW5ub3QgYmUgY29tcGxldGVkIGluIHRpbWVvdXQuYCkpLCBSRVFVRVNUX1RJTUVPVVQpO1xuICAgICAgICBzdHJlYW0ub24oXCJyZWFkYWJsZVwiLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAocG9zID49IGNvdW50KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY2h1bmsgPSBzdHJlYW0ucmVhZCgpO1xuICAgICAgICAgICAgaWYgKCFjaHVuaykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2h1bmsgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLCBlbmNvZGluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBIb3cgbXVjaCBkYXRhIG5lZWRlZCBpbiB0aGlzIGNodW5rXG4gICAgICAgICAgICBjb25zdCBjaHVua0xlbmd0aCA9IHBvcyArIGNodW5rLmxlbmd0aCA+IGNvdW50ID8gY291bnQgLSBwb3MgOiBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgICBidWZmZXIuZmlsbChjaHVuay5zbGljZSgwLCBjaHVua0xlbmd0aCksIG9mZnNldCArIHBvcywgb2Zmc2V0ICsgcG9zICsgY2h1bmtMZW5ndGgpO1xuICAgICAgICAgICAgcG9zICs9IGNodW5rTGVuZ3RoO1xuICAgICAgICB9KTtcbiAgICAgICAgc3RyZWFtLm9uKFwiZW5kXCIsICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICAgIGlmIChwb3MgPCBjb3VudCkge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFN0cmVhbSBkcmFpbnMgYmVmb3JlIGdldHRpbmcgZW5vdWdoIGRhdGEgbmVlZGVkLiBEYXRhIHJlYWQ6ICR7cG9zfSwgZGF0YSBuZWVkOiAke2NvdW50fWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0cmVhbS5vbihcImVycm9yXCIsIChtc2cpID0+IHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICAgIHJlamVjdChtc2cpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbi8qKlxuICogUmVhZHMgYSByZWFkYWJsZSBzdHJlYW0gaW50byBidWZmZXIgZW50aXJlbHkuXG4gKlxuICogQHBhcmFtIHN0cmVhbSAtIEEgTm9kZS5qcyBSZWFkYWJsZSBzdHJlYW1cbiAqIEBwYXJhbSBidWZmZXIgLSBCdWZmZXIgdG8gYmUgZmlsbGVkLCBsZW5ndGggbXVzdCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gb2Zmc2V0XG4gKiBAcGFyYW0gZW5jb2RpbmcgLSBFbmNvZGluZyBvZiB0aGUgUmVhZGFibGUgc3RyZWFtXG4gKiBAcmV0dXJucyB3aXRoIHRoZSBjb3VudCBvZiBieXRlcyByZWFkLlxuICogQHRocm93cyBgUmFuZ2VFcnJvcmAgSWYgYnVmZmVyIHNpemUgaXMgbm90IGJpZyBlbm91Z2guXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdHJlYW1Ub0J1ZmZlcjIoc3RyZWFtLCBidWZmZXIsIGVuY29kaW5nKSB7XG4gICAgbGV0IHBvcyA9IDA7IC8vIFBvc2l0aW9uIGluIHN0cmVhbVxuICAgIGNvbnN0IGJ1ZmZlclNpemUgPSBidWZmZXIubGVuZ3RoO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHN0cmVhbS5vbihcInJlYWRhYmxlXCIsICgpID0+IHtcbiAgICAgICAgICAgIGxldCBjaHVuayA9IHN0cmVhbS5yZWFkKCk7XG4gICAgICAgICAgICBpZiAoIWNodW5rKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb3MgKyBjaHVuay5sZW5ndGggPiBidWZmZXJTaXplKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgU3RyZWFtIGV4Y2VlZHMgYnVmZmVyIHNpemUuIEJ1ZmZlciBzaXplOiAke2J1ZmZlclNpemV9YCkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlci5maWxsKGNodW5rLCBwb3MsIHBvcyArIGNodW5rLmxlbmd0aCk7XG4gICAgICAgICAgICBwb3MgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICB9KTtcbiAgICAgICAgc3RyZWFtLm9uKFwiZW5kXCIsICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUocG9zKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0cmVhbS5vbihcImVycm9yXCIsIHJlamVjdCk7XG4gICAgfSk7XG59XG4vKipcbiAqIFJlYWRzIGEgcmVhZGFibGUgc3RyZWFtIGludG8gYSBidWZmZXIuXG4gKlxuICogQHBhcmFtIHN0cmVhbSAtIEEgTm9kZS5qcyBSZWFkYWJsZSBzdHJlYW1cbiAqIEBwYXJhbSBlbmNvZGluZyAtIEVuY29kaW5nIG9mIHRoZSBSZWFkYWJsZSBzdHJlYW1cbiAqIEByZXR1cm5zIHdpdGggdGhlIGNvdW50IG9mIGJ5dGVzIHJlYWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdHJlYW1Ub0J1ZmZlcjMocmVhZGFibGVTdHJlYW0sIGVuY29kaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgICAgIHJlYWRhYmxlU3RyZWFtLm9uKFwiZGF0YVwiLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgY2h1bmtzLnB1c2goZGF0YSBpbnN0YW5jZW9mIEJ1ZmZlciA/IGRhdGEgOiBCdWZmZXIuZnJvbShkYXRhLCBlbmNvZGluZykpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVhZGFibGVTdHJlYW0ub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShCdWZmZXIuY29uY2F0KGNodW5rcykpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVhZGFibGVTdHJlYW0ub24oXCJlcnJvclwiLCByZWplY3QpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBPTkxZIEFWQUlMQUJMRSBJTiBOT0RFLkpTIFJVTlRJTUUuXG4gKlxuICogV3JpdGVzIHRoZSBjb250ZW50IG9mIGEgcmVhZHN0cmVhbSB0byBhIGxvY2FsIGZpbGUuIFJldHVybnMgYSBQcm9taXNlIHdoaWNoIGlzIGNvbXBsZXRlZCBhZnRlciB0aGUgZmlsZSBoYW5kbGUgaXMgY2xvc2VkLlxuICpcbiAqIEBwYXJhbSBycyAtIFRoZSByZWFkIHN0cmVhbS5cbiAqIEBwYXJhbSBmaWxlIC0gRGVzdGluYXRpb24gZmlsZSBwYXRoLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFN0cmVhbVRvTG9jYWxGaWxlKHJzLCBmaWxlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3Qgd3MgPSBmcy5jcmVhdGVXcml0ZVN0cmVhbShmaWxlKTtcbiAgICAgICAgcnMub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHdzLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgICAgICB3cy5vbihcImNsb3NlXCIsIHJlc29sdmUpO1xuICAgICAgICBycy5waXBlKHdzKTtcbiAgICB9KTtcbn1cbi8qKlxuICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICpcbiAqIFByb21pc2lmaWVkIHZlcnNpb24gb2YgZnMuc3RhdCgpLlxuICovXG5leHBvcnQgY29uc3QgZnNTdGF0ID0gdXRpbC5wcm9taXNpZnkoZnMuc3RhdCk7XG5leHBvcnQgY29uc3QgZnNDcmVhdGVSZWFkU3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLm5vZGUuanMubWFwIiwiaW1wb3J0IHsgX19hc3luY0RlbGVnYXRvciwgX19hc3luY0dlbmVyYXRvciwgX19hc3luY1ZhbHVlcywgX19hd2FpdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVVdWlkLCBnZXREZWZhdWx0UHJveHlTZXR0aW5ncywgaXNOb2RlLCBpc1Rva2VuQ3JlZGVudGlhbCwgVVJMQnVpbGRlciwgfSBmcm9tIFwiQGF6dXJlL2NvcmUtaHR0cFwiO1xuaW1wb3J0IHsgU3BhblN0YXR1c0NvZGUgfSBmcm9tIFwiQGF6dXJlL2NvcmUtdHJhY2luZ1wiO1xuaW1wb3J0IHsgQmxvYkRvd25sb2FkUmVzcG9uc2UgfSBmcm9tIFwiLi9CbG9iRG93bmxvYWRSZXNwb25zZVwiO1xuaW1wb3J0IHsgQmxvYlF1ZXJ5UmVzcG9uc2UgfSBmcm9tIFwiLi9CbG9iUXVlcnlSZXNwb25zZVwiO1xuaW1wb3J0IHsgQW5vbnltb3VzQ3JlZGVudGlhbCB9IGZyb20gXCIuL2NyZWRlbnRpYWxzL0Fub255bW91c0NyZWRlbnRpYWxcIjtcbmltcG9ydCB7IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsIH0gZnJvbSBcIi4vY3JlZGVudGlhbHMvU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxcIjtcbmltcG9ydCB7IEFwcGVuZEJsb2IsIEJsb2IgYXMgU3RvcmFnZUJsb2IsIEJsb2NrQmxvYiwgUGFnZUJsb2IgfSBmcm9tIFwiLi9nZW5lcmF0ZWQvc3JjL29wZXJhdGlvbnNcIjtcbmltcG9ydCB7IGVuc3VyZUNwa0lmU3BlY2lmaWVkLCB0b0FjY2Vzc1RpZXIsIH0gZnJvbSBcIi4vbW9kZWxzXCI7XG5pbXBvcnQgeyByYW5nZVJlc3BvbnNlRnJvbU1vZGVsLCB9IGZyb20gXCIuL1BhZ2VCbG9iUmFuZ2VSZXNwb25zZVwiO1xuaW1wb3J0IHsgbmV3UGlwZWxpbmUsIGlzUGlwZWxpbmVMaWtlIH0gZnJvbSBcIi4vUGlwZWxpbmVcIjtcbmltcG9ydCB7IEJsb2JCZWdpbkNvcHlGcm9tVXJsUG9sbGVyLCB9IGZyb20gXCIuL3BvbGxlcnMvQmxvYlN0YXJ0Q29weUZyb21VcmxQb2xsZXJcIjtcbmltcG9ydCB7IHJhbmdlVG9TdHJpbmcgfSBmcm9tIFwiLi9SYW5nZVwiO1xuaW1wb3J0IHsgU3RvcmFnZUNsaWVudCB9IGZyb20gXCIuL1N0b3JhZ2VDbGllbnRcIjtcbmltcG9ydCB7IEJhdGNoIH0gZnJvbSBcIi4vdXRpbHMvQmF0Y2hcIjtcbmltcG9ydCB7IEJ1ZmZlclNjaGVkdWxlciB9IGZyb20gXCIuLi8uLi9zdG9yYWdlLWNvbW1vbi9zcmNcIjtcbmltcG9ydCB7IEJsb2JEb2VzTm90VXNlQ3VzdG9tZXJTcGVjaWZpZWRFbmNyeXB0aW9uLCBCbG9iVXNlc0N1c3RvbWVyU3BlY2lmaWVkRW5jcnlwdGlvbk1zZywgQkxPQ0tfQkxPQl9NQVhfQkxPQ0tTLCBCTE9DS19CTE9CX01BWF9TVEFHRV9CTE9DS19CWVRFUywgQkxPQ0tfQkxPQl9NQVhfVVBMT0FEX0JMT0JfQllURVMsIERFRkFVTFRfQkxPQl9ET1dOTE9BRF9CTE9DS19CWVRFUywgREVGQVVMVF9CTE9DS19CVUZGRVJfU0laRV9CWVRFUywgREVGQVVMVF9NQVhfRE9XTkxPQURfUkVUUllfUkVRVUVTVFMsIEVUYWdBbnksIFVSTENvbnN0YW50cywgfSBmcm9tIFwiLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IGNyZWF0ZVNwYW4sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UgfSBmcm9tIFwiLi91dGlscy90cmFjaW5nXCI7XG5pbXBvcnQgeyBhcHBlbmRUb1VSTFBhdGgsIGFwcGVuZFRvVVJMUXVlcnksIGV4dHJhY3RDb25uZWN0aW9uU3RyaW5nUGFydHMsIEV4dHJhY3RQYWdlUmFuZ2VJbmZvSXRlbXMsIGdlbmVyYXRlQmxvY2tJRCwgZ2V0VVJMUGFyYW1ldGVyLCBodHRwQXV0aG9yaXphdGlvblRvU3RyaW5nLCBpc0lwRW5kcG9pbnRTdHlsZSwgcGFyc2VPYmplY3RSZXBsaWNhdGlvblJlY29yZCwgc2V0VVJMUGFyYW1ldGVyLCB0b0Jsb2JUYWdzLCB0b0Jsb2JUYWdzU3RyaW5nLCB0b1F1ZXJ5U2VyaWFsaXphdGlvbiwgdG9UYWdzLCB9IGZyb20gXCIuL3V0aWxzL3V0aWxzLmNvbW1vblwiO1xuaW1wb3J0IHsgZnNDcmVhdGVSZWFkU3RyZWFtLCBmc1N0YXQsIHJlYWRTdHJlYW1Ub0xvY2FsRmlsZSwgc3RyZWFtVG9CdWZmZXIsIH0gZnJvbSBcIi4vdXRpbHMvdXRpbHMubm9kZVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzIH0gZnJvbSBcIi4vc2FzL0Jsb2JTQVNTaWduYXR1cmVWYWx1ZXNcIjtcbmltcG9ydCB7IEJsb2JMZWFzZUNsaWVudCB9IGZyb20gXCIuL0Jsb2JMZWFzZUNsaWVudFwiO1xuLyoqXG4gKiBBIEJsb2JDbGllbnQgcmVwcmVzZW50cyBhIFVSTCB0byBhbiBBenVyZSBTdG9yYWdlIGJsb2I7IHRoZSBibG9iIG1heSBiZSBhIGJsb2NrIGJsb2IsXG4gKiBhcHBlbmQgYmxvYiwgb3IgcGFnZSBibG9iLlxuICovXG5leHBvcnQgY2xhc3MgQmxvYkNsaWVudCBleHRlbmRzIFN0b3JhZ2VDbGllbnQge1xuICAgIGNvbnN0cnVjdG9yKHVybE9yQ29ubmVjdGlvblN0cmluZywgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUsIGJsb2JOYW1lT3JPcHRpb25zLCBcbiAgICAvLyBMZWdhY3ksIG5vIGZpeCBmb3IgZXNsaW50IGVycm9yIHdpdGhvdXQgYnJlYWtpbmcuIERpc2FibGUgaXQgZm9yIHRoaXMgaW50ZXJmYWNlLlxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYXp1cmUvYXp1cmUtc2RrL3RzLW5hbWluZy1vcHRpb25zKi9cbiAgICBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBsZXQgcGlwZWxpbmU7XG4gICAgICAgIGxldCB1cmw7XG4gICAgICAgIGlmIChpc1BpcGVsaW5lTGlrZShjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSkpIHtcbiAgICAgICAgICAgIC8vICh1cmw6IHN0cmluZywgcGlwZWxpbmU6IFBpcGVsaW5lKVxuICAgICAgICAgICAgdXJsID0gdXJsT3JDb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgcGlwZWxpbmUgPSBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoaXNOb2RlICYmIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lIGluc3RhbmNlb2YgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwpIHx8XG4gICAgICAgICAgICBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSBpbnN0YW5jZW9mIEFub255bW91c0NyZWRlbnRpYWwgfHxcbiAgICAgICAgICAgIGlzVG9rZW5DcmVkZW50aWFsKGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lKSkge1xuICAgICAgICAgICAgLy8gKHVybDogc3RyaW5nLCBjcmVkZW50aWFsPzogU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwgfCBBbm9ueW1vdXNDcmVkZW50aWFsIHwgVG9rZW5DcmVkZW50aWFsLCBvcHRpb25zPzogU3RvcmFnZVBpcGVsaW5lT3B0aW9ucylcbiAgICAgICAgICAgIHVybCA9IHVybE9yQ29ubmVjdGlvblN0cmluZztcbiAgICAgICAgICAgIG9wdGlvbnMgPSBibG9iTmFtZU9yT3B0aW9ucztcbiAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAvLyAodXJsOiBzdHJpbmcsIGNyZWRlbnRpYWw/OiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCB8IEFub255bW91c0NyZWRlbnRpYWwgfCBUb2tlbkNyZWRlbnRpYWwsIG9wdGlvbnM/OiBTdG9yYWdlUGlwZWxpbmVPcHRpb25zKVxuICAgICAgICAgICAgLy8gVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkLiBVc2UgYW5vbnltb3VzIGNyZWRlbnRpYWwuXG4gICAgICAgICAgICB1cmwgPSB1cmxPckNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICAgICAgICBpZiAoYmxvYk5hbWVPck9wdGlvbnMgJiYgdHlwZW9mIGJsb2JOYW1lT3JPcHRpb25zICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IGJsb2JOYW1lT3JPcHRpb25zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShuZXcgQW5vbnltb3VzQ3JlZGVudGlhbCgpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICBibG9iTmFtZU9yT3B0aW9ucyAmJlxuICAgICAgICAgICAgdHlwZW9mIGJsb2JOYW1lT3JPcHRpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAvLyAoY29ubmVjdGlvblN0cmluZzogc3RyaW5nLCBjb250YWluZXJOYW1lOiBzdHJpbmcsIGJsb2JOYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBTdG9yYWdlUGlwZWxpbmVPcHRpb25zKVxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyTmFtZSA9IGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lO1xuICAgICAgICAgICAgY29uc3QgYmxvYk5hbWUgPSBibG9iTmFtZU9yT3B0aW9ucztcbiAgICAgICAgICAgIGNvbnN0IGV4dHJhY3RlZENyZWRzID0gZXh0cmFjdENvbm5lY3Rpb25TdHJpbmdQYXJ0cyh1cmxPckNvbm5lY3Rpb25TdHJpbmcpO1xuICAgICAgICAgICAgaWYgKGV4dHJhY3RlZENyZWRzLmtpbmQgPT09IFwiQWNjb3VudENvbm5TdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkS2V5Q3JlZGVudGlhbCA9IG5ldyBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbChleHRyYWN0ZWRDcmVkcy5hY2NvdW50TmFtZSwgZXh0cmFjdGVkQ3JlZHMuYWNjb3VudEtleSk7XG4gICAgICAgICAgICAgICAgICAgIHVybCA9IGFwcGVuZFRvVVJMUGF0aChhcHBlbmRUb1VSTFBhdGgoZXh0cmFjdGVkQ3JlZHMudXJsLCBlbmNvZGVVUklDb21wb25lbnQoY29udGFpbmVyTmFtZSkpLCBlbmNvZGVVUklDb21wb25lbnQoYmxvYk5hbWUpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnByb3h5T3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wcm94eU9wdGlvbnMgPSBnZXREZWZhdWx0UHJveHlTZXR0aW5ncyhleHRyYWN0ZWRDcmVkcy5wcm94eVVyaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShzaGFyZWRLZXlDcmVkZW50aWFsLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFjY291bnQgY29ubmVjdGlvbiBzdHJpbmcgaXMgb25seSBzdXBwb3J0ZWQgaW4gTm9kZS5qcyBlbnZpcm9ubWVudFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChleHRyYWN0ZWRDcmVkcy5raW5kID09PSBcIlNBU0Nvbm5TdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHVybCA9XG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvVVJMUGF0aChhcHBlbmRUb1VSTFBhdGgoZXh0cmFjdGVkQ3JlZHMudXJsLCBlbmNvZGVVUklDb21wb25lbnQoY29udGFpbmVyTmFtZSkpLCBlbmNvZGVVUklDb21wb25lbnQoYmxvYk5hbWUpKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIj9cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0ZWRDcmVkcy5hY2NvdW50U2FzO1xuICAgICAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUobmV3IEFub255bW91c0NyZWRlbnRpYWwoKSwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25uZWN0aW9uIHN0cmluZyBtdXN0IGJlIGVpdGhlciBhbiBBY2NvdW50IGNvbm5lY3Rpb24gc3RyaW5nIG9yIGEgU0FTIGNvbm5lY3Rpb24gc3RyaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0aW5nIG5vbi1lbXB0eSBzdHJpbmdzIGZvciBjb250YWluZXJOYW1lIGFuZCBibG9iTmFtZSBwYXJhbWV0ZXJzXCIpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKHVybCwgcGlwZWxpbmUpO1xuICAgICAgICAoeyBibG9iTmFtZTogdGhpcy5fbmFtZSwgY29udGFpbmVyTmFtZTogdGhpcy5fY29udGFpbmVyTmFtZSB9ID1cbiAgICAgICAgICAgIHRoaXMuZ2V0QmxvYkFuZENvbnRhaW5lck5hbWVzRnJvbVVybCgpKTtcbiAgICAgICAgdGhpcy5ibG9iQ29udGV4dCA9IG5ldyBTdG9yYWdlQmxvYih0aGlzLnN0b3JhZ2VDbGllbnRDb250ZXh0KTtcbiAgICAgICAgdGhpcy5fc25hcHNob3QgPSBnZXRVUkxQYXJhbWV0ZXIodGhpcy51cmwsIFVSTENvbnN0YW50cy5QYXJhbWV0ZXJzLlNOQVBTSE9UKTtcbiAgICAgICAgdGhpcy5fdmVyc2lvbklkID0gZ2V0VVJMUGFyYW1ldGVyKHRoaXMudXJsLCBVUkxDb25zdGFudHMuUGFyYW1ldGVycy5WRVJTSU9OSUQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmxvYi5cbiAgICAgKi9cbiAgICBnZXQgbmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBzdG9yYWdlIGNvbnRhaW5lciB0aGUgYmxvYiBpcyBhc3NvY2lhdGVkIHdpdGguXG4gICAgICovXG4gICAgZ2V0IGNvbnRhaW5lck5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXJOYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEJsb2JDbGllbnQgb2JqZWN0IGlkZW50aWNhbCB0byB0aGUgc291cmNlIGJ1dCB3aXRoIHRoZSBzcGVjaWZpZWQgc25hcHNob3QgdGltZXN0YW1wLlxuICAgICAqIFByb3ZpZGUgXCJcIiB3aWxsIHJlbW92ZSB0aGUgc25hcHNob3QgYW5kIHJldHVybiBhIENsaWVudCB0byB0aGUgYmFzZSBibG9iLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNuYXBzaG90IC0gVGhlIHNuYXBzaG90IHRpbWVzdGFtcC5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBCbG9iQ2xpZW50IG9iamVjdCBpZGVudGljYWwgdG8gdGhlIHNvdXJjZSBidXQgd2l0aCB0aGUgc3BlY2lmaWVkIHNuYXBzaG90IHRpbWVzdGFtcFxuICAgICAqL1xuICAgIHdpdGhTbmFwc2hvdChzbmFwc2hvdCkge1xuICAgICAgICByZXR1cm4gbmV3IEJsb2JDbGllbnQoc2V0VVJMUGFyYW1ldGVyKHRoaXMudXJsLCBVUkxDb25zdGFudHMuUGFyYW1ldGVycy5TTkFQU0hPVCwgc25hcHNob3QubGVuZ3RoID09PSAwID8gdW5kZWZpbmVkIDogc25hcHNob3QpLCB0aGlzLnBpcGVsaW5lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBCbG9iQ2xpZW50IG9iamVjdCBwb2ludGluZyB0byBhIHZlcnNpb24gb2YgdGhpcyBibG9iLlxuICAgICAqIFByb3ZpZGUgXCJcIiB3aWxsIHJlbW92ZSB0aGUgdmVyc2lvbklkIGFuZCByZXR1cm4gYSBDbGllbnQgdG8gdGhlIGJhc2UgYmxvYi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uSWQgLSBUaGUgdmVyc2lvbklkLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IEJsb2JDbGllbnQgb2JqZWN0IHBvaW50aW5nIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgYmxvYi5cbiAgICAgKi9cbiAgICB3aXRoVmVyc2lvbih2ZXJzaW9uSWQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iQ2xpZW50KHNldFVSTFBhcmFtZXRlcih0aGlzLnVybCwgVVJMQ29uc3RhbnRzLlBhcmFtZXRlcnMuVkVSU0lPTklELCB2ZXJzaW9uSWQubGVuZ3RoID09PSAwID8gdW5kZWZpbmVkIDogdmVyc2lvbklkKSwgdGhpcy5waXBlbGluZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBBcHBlbmRCbG9iQ2xpZW50IG9iamVjdC5cbiAgICAgKlxuICAgICAqL1xuICAgIGdldEFwcGVuZEJsb2JDbGllbnQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQXBwZW5kQmxvYkNsaWVudCh0aGlzLnVybCwgdGhpcy5waXBlbGluZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBCbG9ja0Jsb2JDbGllbnQgb2JqZWN0LlxuICAgICAqXG4gICAgICovXG4gICAgZ2V0QmxvY2tCbG9iQ2xpZW50KCkge1xuICAgICAgICByZXR1cm4gbmV3IEJsb2NrQmxvYkNsaWVudCh0aGlzLnVybCwgdGhpcy5waXBlbGluZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBQYWdlQmxvYkNsaWVudCBvYmplY3QuXG4gICAgICpcbiAgICAgKi9cbiAgICBnZXRQYWdlQmxvYkNsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQmxvYkNsaWVudCh0aGlzLnVybCwgdGhpcy5waXBlbGluZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIG9yIGRvd25sb2FkcyBhIGJsb2IgZnJvbSB0aGUgc3lzdGVtLCBpbmNsdWRpbmcgaXRzIG1ldGFkYXRhIGFuZCBwcm9wZXJ0aWVzLlxuICAgICAqIFlvdSBjYW4gYWxzbyBjYWxsIEdldCBCbG9iIHRvIHJlYWQgYSBzbmFwc2hvdC5cbiAgICAgKlxuICAgICAqICogSW4gTm9kZS5qcywgZGF0YSByZXR1cm5zIGluIGEgUmVhZGFibGUgc3RyZWFtIHJlYWRhYmxlU3RyZWFtQm9keVxuICAgICAqICogSW4gYnJvd3NlcnMsIGRhdGEgcmV0dXJucyBpbiBhIHByb21pc2UgYmxvYkJvZHlcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2dldC1ibG9iXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gRnJvbSB3aGljaCBwb3NpdGlvbiBvZiB0aGUgYmxvYiB0byBkb3dubG9hZCwgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDBcbiAgICAgKiBAcGFyYW0gY291bnQgLSBIb3cgbXVjaCBkYXRhIHRvIGJlIGRvd25sb2FkZWQsIGdyZWF0ZXIgdGhhbiAwLiBXaWxsIGRvd25sb2FkIHRvIHRoZSBlbmQgd2hlbiB1bmRlZmluZWRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIG9wdGlvbnMgdG8gQmxvYiBEb3dubG9hZCBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNhZ2UgKE5vZGUuanMpOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiAvLyBEb3dubG9hZCBhbmQgY29udmVydCBhIGJsb2IgdG8gYSBzdHJpbmdcbiAgICAgKiBjb25zdCBkb3dubG9hZEJsb2NrQmxvYlJlc3BvbnNlID0gYXdhaXQgYmxvYkNsaWVudC5kb3dubG9hZCgpO1xuICAgICAqIGNvbnN0IGRvd25sb2FkZWQgPSBhd2FpdCBzdHJlYW1Ub0J1ZmZlcihkb3dubG9hZEJsb2NrQmxvYlJlc3BvbnNlLnJlYWRhYmxlU3RyZWFtQm9keSk7XG4gICAgICogY29uc29sZS5sb2coXCJEb3dubG9hZGVkIGJsb2IgY29udGVudDpcIiwgZG93bmxvYWRlZC50b1N0cmluZygpKTtcbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIHN0cmVhbVRvQnVmZmVyKHJlYWRhYmxlU3RyZWFtKSB7XG4gICAgICogcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgKiBjb25zdCBjaHVua3MgPSBbXTtcbiAgICAgKiByZWFkYWJsZVN0cmVhbS5vbihcImRhdGFcIiwgKGRhdGEpID0+IHtcbiAgICAgKiBjaHVua3MucHVzaChkYXRhIGluc3RhbmNlb2YgQnVmZmVyID8gZGF0YSA6IEJ1ZmZlci5mcm9tKGRhdGEpKTtcbiAgICAgKiB9KTtcbiAgICAgKiByZWFkYWJsZVN0cmVhbS5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICogcmVzb2x2ZShCdWZmZXIuY29uY2F0KGNodW5rcykpO1xuICAgICAqIH0pO1xuICAgICAqIHJlYWRhYmxlU3RyZWFtLm9uKFwiZXJyb3JcIiwgcmVqZWN0KTtcbiAgICAgKiB9KTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzYWdlIChicm93c2VyKTpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gRG93bmxvYWQgYW5kIGNvbnZlcnQgYSBibG9iIHRvIGEgc3RyaW5nXG4gICAgICogY29uc3QgZG93bmxvYWRCbG9ja0Jsb2JSZXNwb25zZSA9IGF3YWl0IGJsb2JDbGllbnQuZG93bmxvYWQoKTtcbiAgICAgKiBjb25zdCBkb3dubG9hZGVkID0gYXdhaXQgYmxvYlRvU3RyaW5nKGF3YWl0IGRvd25sb2FkQmxvY2tCbG9iUmVzcG9uc2UuYmxvYkJvZHkpO1xuICAgICAqIGNvbnNvbGUubG9nKFxuICAgICAqICAgXCJEb3dubG9hZGVkIGJsb2IgY29udGVudFwiLFxuICAgICAqICAgZG93bmxvYWRlZFxuICAgICAqICk7XG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBibG9iVG9TdHJpbmcoYmxvYjogQmxvYik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICogICBjb25zdCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgKiAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgKiAgICAgZmlsZVJlYWRlci5vbmxvYWRlbmQgPSAoZXY6IGFueSkgPT4ge1xuICAgICAqICAgICAgIHJlc29sdmUoZXYudGFyZ2V0IS5yZXN1bHQpO1xuICAgICAqICAgICB9O1xuICAgICAqICAgICBmaWxlUmVhZGVyLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICogICAgIGZpbGVSZWFkZXIucmVhZEFzVGV4dChibG9iKTtcbiAgICAgKiAgIH0pO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhc3luYyBkb3dubG9hZChvZmZzZXQgPSAwLCBjb3VudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIGVuc3VyZUNwa0lmU3BlY2lmaWVkKG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgdGhpcy5pc0h0dHBzKTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JDbGllbnQtZG93bmxvYWRcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmJsb2JDb250ZXh0LmRvd25sb2FkKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSwgcmVxdWVzdE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgb25Eb3dubG9hZFByb2dyZXNzOiBpc05vZGUgPyB1bmRlZmluZWQgOiBvcHRpb25zLm9uUHJvZ3Jlc3MsIC8vIGZvciBOb2RlLmpzLCBwcm9ncmVzcyBpcyByZXBvcnRlZCBieSBSZXRyaWFibGVSZWFkYWJsZVN0cmVhbVxuICAgICAgICAgICAgICAgIH0sIHJhbmdlOiBvZmZzZXQgPT09IDAgJiYgIWNvdW50ID8gdW5kZWZpbmVkIDogcmFuZ2VUb1N0cmluZyh7IG9mZnNldCwgY291bnQgfSksIHJhbmdlR2V0Q29udGVudE1ENTogb3B0aW9ucy5yYW5nZUdldENvbnRlbnRNRDUsIHJhbmdlR2V0Q29udGVudENSQzY0OiBvcHRpb25zLnJhbmdlR2V0Q29udGVudENyYzY0LCBzbmFwc2hvdDogb3B0aW9ucy5zbmFwc2hvdCwgY3BrSW5mbzogb3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5IH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgICAgICBjb25zdCB3cmFwcGVkUmVzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXMpLCB7IF9yZXNwb25zZTogcmVzLl9yZXNwb25zZSwgb2JqZWN0UmVwbGljYXRpb25EZXN0aW5hdGlvblBvbGljeUlkOiByZXMub2JqZWN0UmVwbGljYXRpb25Qb2xpY3lJZCwgb2JqZWN0UmVwbGljYXRpb25Tb3VyY2VQcm9wZXJ0aWVzOiBwYXJzZU9iamVjdFJlcGxpY2F0aW9uUmVjb3JkKHJlcy5vYmplY3RSZXBsaWNhdGlvblJ1bGVzKSB9KTtcbiAgICAgICAgICAgIC8vIFJldHVybiBicm93c2VyIHJlc3BvbnNlIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICBpZiAoIWlzTm9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkUmVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV2Ugc3VwcG9ydCByZXRyeWluZyB3aGVuIGRvd25sb2FkIHN0cmVhbSB1bmV4cGVjdGVkIGVuZHMgaW4gTm9kZS5qcyBydW50aW1lXG4gICAgICAgICAgICAvLyBGb2xsb3dpbmcgY29kZSBzaG91bGRuJ3QgYmUgYnVuZGxlZCBpbnRvIGJyb3dzZXIgYnVpbGQsIGhvd2V2ZXIgc29tZVxuICAgICAgICAgICAgLy8gYnVuZGxlcnMgbWF5IHRyeSB0byBidW5kbGUgZm9sbG93aW5nIGNvZGUgYW5kIFwiRmlsZVJlYWRSZXNwb25zZS50c1wiLlxuICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCBcIkZpbGVEb3dubG9hZFJlc3BvbnNlLmJyb3dzZXIudHNcIiB3aWxsIGJlIHVzZWQgYXMgYSBzaGltIG9mIFwiRmlsZURvd25sb2FkUmVzcG9uc2UudHNcIlxuICAgICAgICAgICAgLy8gVGhlIGNvbmZpZyBpcyBpbiBwYWNrYWdlLmpzb24gXCJicm93c2VyXCIgZmllbGRcbiAgICAgICAgICAgIGlmIChvcHRpb25zLm1heFJldHJ5UmVxdWVzdHMgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLm1heFJldHJ5UmVxdWVzdHMgPCAwKSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogRGVmYXVsdCB2YWx1ZSBvciBtYWtlIGl0IGEgcmVxdWlyZWQgcGFyYW1ldGVyP1xuICAgICAgICAgICAgICAgIG9wdGlvbnMubWF4UmV0cnlSZXF1ZXN0cyA9IERFRkFVTFRfTUFYX0RPV05MT0FEX1JFVFJZX1JFUVVFU1RTO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcy5jb250ZW50TGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgRmlsZSBkb3dubG9hZCByZXNwb25zZSBkb2Vzbid0IGNvbnRhaW4gdmFsaWQgY29udGVudCBsZW5ndGggaGVhZGVyYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXJlcy5ldGFnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEZpbGUgZG93bmxvYWQgcmVzcG9uc2UgZG9lc24ndCBjb250YWluIHZhbGlkIGV0YWcgaGVhZGVyYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJsb2JEb3dubG9hZFJlc3BvbnNlKHdyYXBwZWRSZXMsIGFzeW5jIChzdGFydCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkRG93bmxvYWRPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZk1hdGNoOiBvcHRpb25zLmNvbmRpdGlvbnMuaWZNYXRjaCB8fCByZXMuZXRhZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmTW9kaWZpZWRTaW5jZTogb3B0aW9ucy5jb25kaXRpb25zLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmTm9uZU1hdGNoOiBvcHRpb25zLmNvbmRpdGlvbnMuaWZOb25lTWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZlVubW9kaWZpZWRTaW5jZTogb3B0aW9ucy5jb25kaXRpb25zLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICByYW5nZTogcmFuZ2VUb1N0cmluZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogb2Zmc2V0ICsgcmVzLmNvbnRlbnRMZW5ndGggLSBzdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICByYW5nZUdldENvbnRlbnRNRDU6IG9wdGlvbnMucmFuZ2VHZXRDb250ZW50TUQ1LFxuICAgICAgICAgICAgICAgICAgICByYW5nZUdldENvbnRlbnRDUkM2NDogb3B0aW9ucy5yYW5nZUdldENvbnRlbnRDcmM2NCxcbiAgICAgICAgICAgICAgICAgICAgc25hcHNob3Q6IG9wdGlvbnMuc25hcHNob3QsXG4gICAgICAgICAgICAgICAgICAgIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIC8vIERlYnVnIHB1cnBvc2Ugb25seVxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIC8vICAgYFJlYWQgZnJvbSBpbnRlcm5hbCBzdHJlYW0sIHJhbmdlOiAke1xuICAgICAgICAgICAgICAgIC8vICAgICB1cGRhdGVkT3B0aW9ucy5yYW5nZVxuICAgICAgICAgICAgICAgIC8vICAgfSwgb3B0aW9uczogJHtKU09OLnN0cmluZ2lmeSh1cGRhdGVkT3B0aW9ucyl9YFxuICAgICAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmJsb2JDb250ZXh0LmRvd25sb2FkKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCB9LCB1cGRhdGVkRG93bmxvYWRPcHRpb25zKSkpLnJlYWRhYmxlU3RyZWFtQm9keTtcbiAgICAgICAgICAgIH0sIG9mZnNldCwgcmVzLmNvbnRlbnRMZW5ndGgsIHtcbiAgICAgICAgICAgICAgICBtYXhSZXRyeVJlcXVlc3RzOiBvcHRpb25zLm1heFJldHJ5UmVxdWVzdHMsXG4gICAgICAgICAgICAgICAgb25Qcm9ncmVzczogb3B0aW9ucy5vblByb2dyZXNzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQXp1cmUgYmxvYiByZXNvdXJjZSByZXByZXNlbnRlZCBieSB0aGlzIGNsaWVudCBleGlzdHM7IGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIE5PVEU6IHVzZSB0aGlzIGZ1bmN0aW9uIHdpdGggY2FyZSBzaW5jZSBhbiBleGlzdGluZyBibG9iIG1pZ2h0IGJlIGRlbGV0ZWQgYnkgb3RoZXIgY2xpZW50cyBvclxuICAgICAqIGFwcGxpY2F0aW9ucy4gVmljZSB2ZXJzYSBuZXcgYmxvYnMgbWlnaHQgYmUgYWRkZWQgYnkgb3RoZXIgY2xpZW50cyBvciBhcHBsaWNhdGlvbnMgYWZ0ZXIgdGhpc1xuICAgICAqIGZ1bmN0aW9uIGNvbXBsZXRlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gb3B0aW9ucyB0byBFeGlzdHMgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGV4aXN0cyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JDbGllbnQtZXhpc3RzXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZW5zdXJlQ3BrSWZTcGVjaWZpZWQob3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCB0aGlzLmlzSHR0cHMpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRQcm9wZXJ0aWVzKHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICBjdXN0b21lclByb3ZpZGVkS2V5OiBvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksXG4gICAgICAgICAgICAgICAgY29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlLnN0YXR1c0NvZGUgPT09IDQwNCkge1xuICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkIGV4Y2VwdGlvbiB3aGVuIGNoZWNraW5nIGJsb2IgZXhpc3RlbmNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZS5zdGF0dXNDb2RlID09PSA0MDkgJiZcbiAgICAgICAgICAgICAgICAoZS5kZXRhaWxzLmVycm9yQ29kZSA9PT0gQmxvYlVzZXNDdXN0b21lclNwZWNpZmllZEVuY3J5cHRpb25Nc2cgfHxcbiAgICAgICAgICAgICAgICAgICAgZS5kZXRhaWxzLmVycm9yQ29kZSA9PT0gQmxvYkRvZXNOb3RVc2VDdXN0b21lclNwZWNpZmllZEVuY3J5cHRpb24pKSB7XG4gICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gY2hlY2tpbmcgYmxvYiBleGlzdGVuY2VcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIHVzZXItZGVmaW5lZCBtZXRhZGF0YSwgc3RhbmRhcmQgSFRUUCBwcm9wZXJ0aWVzLCBhbmQgc3lzdGVtIHByb3BlcnRpZXNcbiAgICAgKiBmb3IgdGhlIGJsb2IuIEl0IGRvZXMgbm90IHJldHVybiB0aGUgY29udGVudCBvZiB0aGUgYmxvYi5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9nZXQtYmxvYi1wcm9wZXJ0aWVzXG4gICAgICpcbiAgICAgKiBXQVJOSU5HOiBUaGUgYG1ldGFkYXRhYCBvYmplY3QgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIHdpbGwgaGF2ZSBpdHMga2V5cyBpbiBsb3dlcmNhc2UsIGV2ZW4gaWZcbiAgICAgKiB0aGV5IG9yaWdpbmFsbHkgY29udGFpbmVkIHVwcGVyY2FzZSBjaGFyYWN0ZXJzLiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgbWV0YWRhdGEga2V5cyByZXR1cm5lZCBieVxuICAgICAqIHRoZSBtZXRob2RzIG9mIHtAbGluayBDb250YWluZXJDbGllbnR9IHRoYXQgbGlzdCBibG9icyB1c2luZyB0aGUgYGluY2x1ZGVNZXRhZGF0YWAgb3B0aW9uLCB3aGljaFxuICAgICAqIHdpbGwgcmV0YWluIHRoZWlyIG9yaWdpbmFsIGNhc2luZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyB0byBHZXQgUHJvcGVydGllcyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UHJvcGVydGllcyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYkNsaWVudC1nZXRQcm9wZXJ0aWVzXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICAgICAgZW5zdXJlQ3BrSWZTcGVjaWZpZWQob3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCB0aGlzLmlzSHR0cHMpO1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5ibG9iQ29udGV4dC5nZXRQcm9wZXJ0aWVzKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSwgY3BrSW5mbzogb3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5IH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXMpLCB7IF9yZXNwb25zZTogcmVzLl9yZXNwb25zZSwgb2JqZWN0UmVwbGljYXRpb25EZXN0aW5hdGlvblBvbGljeUlkOiByZXMub2JqZWN0UmVwbGljYXRpb25Qb2xpY3lJZCwgb2JqZWN0UmVwbGljYXRpb25Tb3VyY2VQcm9wZXJ0aWVzOiBwYXJzZU9iamVjdFJlcGxpY2F0aW9uUmVjb3JkKHJlcy5vYmplY3RSZXBsaWNhdGlvblJ1bGVzKSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFya3MgdGhlIHNwZWNpZmllZCBibG9iIG9yIHNuYXBzaG90IGZvciBkZWxldGlvbi4gVGhlIGJsb2IgaXMgbGF0ZXIgZGVsZXRlZFxuICAgICAqIGR1cmluZyBnYXJiYWdlIGNvbGxlY3Rpb24uIE5vdGUgdGhhdCBpbiBvcmRlciB0byBkZWxldGUgYSBibG9iLCB5b3UgbXVzdCBkZWxldGVcbiAgICAgKiBhbGwgb2YgaXRzIHNuYXBzaG90cy4gWW91IGNhbiBkZWxldGUgYm90aCBhdCB0aGUgc2FtZSB0aW1lIHdpdGggdGhlIERlbGV0ZVxuICAgICAqIEJsb2Igb3BlcmF0aW9uLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2RlbGV0ZS1ibG9iXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIG9wdGlvbnMgdG8gQmxvYiBEZWxldGUgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYkNsaWVudC1kZWxldGVcIiwgb3B0aW9ucyk7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJsb2JDb250ZXh0LmRlbGV0ZShPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGRlbGV0ZVNuYXBzaG90czogb3B0aW9ucy5kZWxldGVTbmFwc2hvdHMsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSkgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFya3MgdGhlIHNwZWNpZmllZCBibG9iIG9yIHNuYXBzaG90IGZvciBkZWxldGlvbiBpZiBpdCBleGlzdHMuIFRoZSBibG9iIGlzIGxhdGVyIGRlbGV0ZWRcbiAgICAgKiBkdXJpbmcgZ2FyYmFnZSBjb2xsZWN0aW9uLiBOb3RlIHRoYXQgaW4gb3JkZXIgdG8gZGVsZXRlIGEgYmxvYiwgeW91IG11c3QgZGVsZXRlXG4gICAgICogYWxsIG9mIGl0cyBzbmFwc2hvdHMuIFlvdSBjYW4gZGVsZXRlIGJvdGggYXQgdGhlIHNhbWUgdGltZSB3aXRoIHRoZSBEZWxldGVcbiAgICAgKiBCbG9iIG9wZXJhdGlvbi5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9kZWxldGUtYmxvYlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIHRvIEJsb2IgRGVsZXRlIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGVJZkV4aXN0cyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JDbGllbnQtZGVsZXRlSWZFeGlzdHNcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmRlbGV0ZSh1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgc3VjY2VlZGVkOiB0cnVlIH0sIHJlcyksIHsgX3Jlc3BvbnNlOiByZXMuX3Jlc3BvbnNlIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoKChfYSA9IGUuZGV0YWlscykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmVycm9yQ29kZSkgPT09IFwiQmxvYk5vdEZvdW5kXCIpIHtcbiAgICAgICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIkV4cGVjdGVkIGV4Y2VwdGlvbiB3aGVuIGRlbGV0aW5nIGEgYmxvYiBvciBzbmFwc2hvdCBvbmx5IGlmIGl0IGV4aXN0cy5cIixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgc3VjY2VlZGVkOiBmYWxzZSB9LCAoX2IgPSBlLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucGFyc2VkSGVhZGVycyksIHsgX3Jlc3BvbnNlOiBlLnJlc3BvbnNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzdG9yZXMgdGhlIGNvbnRlbnRzIGFuZCBtZXRhZGF0YSBvZiBzb2Z0IGRlbGV0ZWQgYmxvYiBhbmQgYW55IGFzc29jaWF0ZWRcbiAgICAgKiBzb2Z0IGRlbGV0ZWQgc25hcHNob3RzLiBVbmRlbGV0ZSBCbG9iIGlzIHN1cHBvcnRlZCBvbmx5IG9uIHZlcnNpb24gMjAxNy0wNy0yOVxuICAgICAqIG9yIGxhdGVyLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL3VuZGVsZXRlLWJsb2JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyB0byBCbG9iIFVuZGVsZXRlIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyB1bmRlbGV0ZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JDbGllbnQtdW5kZWxldGVcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ibG9iQ29udGV4dC51bmRlbGV0ZShPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBzeXN0ZW0gcHJvcGVydGllcyBvbiB0aGUgYmxvYi5cbiAgICAgKlxuICAgICAqIElmIG5vIHZhbHVlIHByb3ZpZGVkLCBvciBubyB2YWx1ZSBwcm92aWRlZCBmb3IgdGhlIHNwZWNpZmllZCBibG9iIEhUVFAgaGVhZGVycyxcbiAgICAgKiB0aGVzZSBibG9iIEhUVFAgaGVhZGVycyB3aXRob3V0IGEgdmFsdWUgd2lsbCBiZSBjbGVhcmVkLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL3NldC1ibG9iLXByb3BlcnRpZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBibG9iSFRUUEhlYWRlcnMgLSBJZiBubyB2YWx1ZSBwcm92aWRlZCwgb3Igbm8gdmFsdWUgcHJvdmlkZWQgZm9yXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGJsb2IgSFRUUCBoZWFkZXJzLCB0aGVzZSBibG9iIEhUVFBcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgd2l0aG91dCBhIHZhbHVlIHdpbGwgYmUgY2xlYXJlZC5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgY29tbW9uIGhlYWRlciB0byBzZXQgaXMgYGJsb2JDb250ZW50VHlwZWBcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsaW5nIHRoZSBicm93c2VyIHRvIHByb3ZpZGUgZnVuY3Rpb25hbGl0eVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWQgb24gZmlsZSB0eXBlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyB0byBCbG9iIFNldCBIVFRQIEhlYWRlcnMgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHNldEhUVFBIZWFkZXJzKGJsb2JIVFRQSGVhZGVycywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JDbGllbnQtc2V0SFRUUEhlYWRlcnNcIiwgb3B0aW9ucyk7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVuc3VyZUNwa0lmU3BlY2lmaWVkKG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgdGhpcy5pc0h0dHBzKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJsb2JDb250ZXh0LnNldEh0dHBIZWFkZXJzKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgYmxvYkh0dHBIZWFkZXJzOiBibG9iSFRUUEhlYWRlcnMsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSkgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB1c2VyLWRlZmluZWQgbWV0YWRhdGEgZm9yIHRoZSBzcGVjaWZpZWQgYmxvYiBhcyBvbmUgb3IgbW9yZSBuYW1lLXZhbHVlIHBhaXJzLlxuICAgICAqXG4gICAgICogSWYgbm8gb3B0aW9uIHByb3ZpZGVkLCBvciBubyBtZXRhZGF0YSBkZWZpbmVkIGluIHRoZSBwYXJhbWV0ZXIsIHRoZSBibG9iXG4gICAgICogbWV0YWRhdGEgd2lsbCBiZSByZW1vdmVkLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL3NldC1ibG9iLW1ldGFkYXRhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBSZXBsYWNlIGV4aXN0aW5nIG1ldGFkYXRhIHdpdGggdGhpcyB2YWx1ZS5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBubyB2YWx1ZSBwcm92aWRlZCB0aGUgZXhpc3RpbmcgbWV0YWRhdGEgd2lsbCBiZSByZW1vdmVkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyB0byBTZXQgTWV0YWRhdGEgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHNldE1ldGFkYXRhKG1ldGFkYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYkNsaWVudC1zZXRNZXRhZGF0YVwiLCBvcHRpb25zKTtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZW5zdXJlQ3BrSWZTcGVjaWZpZWQob3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCB0aGlzLmlzSHR0cHMpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYmxvYkNvbnRleHQuc2V0TWV0YWRhdGEoT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbWV0YWRhdGEsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSwgY3BrSW5mbzogb3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCBlbmNyeXB0aW9uU2NvcGU6IG9wdGlvbnMuZW5jcnlwdGlvblNjb3BlIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGFncyBvbiB0aGUgdW5kZXJseWluZyBibG9iLlxuICAgICAqIEEgYmxvYiBjYW4gaGF2ZSB1cCB0byAxMCB0YWdzLiBUYWcga2V5cyBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTI4IGNoYXJhY3RlcnMuICBUYWcgdmFsdWVzIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTYgY2hhcmFjdGVycy5cbiAgICAgKiBWYWxpZCB0YWcga2V5IGFuZCB2YWx1ZSBjaGFyYWN0ZXJzIGluY2x1ZGUgbG93ZXIgYW5kIHVwcGVyIGNhc2UgbGV0dGVycywgZGlnaXRzICgwLTkpLFxuICAgICAqIHNwYWNlICgnICcpLCBwbHVzICgnKycpLCBtaW51cyAoJy0nKSwgcGVyaW9kICgnLicpLCBmb3dhcmQgc2xhc2ggKCcvJyksIGNvbG9uICgnOicpLCBlcXVhbHMgKCc9JyksIGFuZCB1bmRlcnNjb3JlICgnXycpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZ3MgLVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBhc3luYyBzZXRUYWdzKHRhZ3MsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iQ2xpZW50LXNldFRhZ3NcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ibG9iQ29udGV4dC5zZXRUYWdzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSwgeyB0YWdzOiB0b0Jsb2JUYWdzKHRhZ3MpIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIHVuZGVybHlpbmcgYmxvYi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBhc3luYyBnZXRUYWdzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iQ2xpZW50LWdldFRhZ3NcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYmxvYkNvbnRleHQuZ2V0VGFncyhPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSkgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRSZXNwb25zZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzcG9uc2UpLCB7IF9yZXNwb25zZTogcmVzcG9uc2UuX3Jlc3BvbnNlLCB0YWdzOiB0b1RhZ3MoeyBibG9iVGFnU2V0OiByZXNwb25zZS5ibG9iVGFnU2V0IH0pIHx8IHt9IH0pO1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRSZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGEge0BsaW5rIEJsb2JMZWFzZUNsaWVudH0gdGhhdCBtYW5hZ2VzIGxlYXNlcyBvbiB0aGUgYmxvYi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wb3NlTGVhc2VJZCAtIEluaXRpYWwgcHJvcG9zZWQgbGVhc2UgSWQuXG4gICAgICogQHJldHVybnMgQSBuZXcgQmxvYkxlYXNlQ2xpZW50IG9iamVjdCBmb3IgbWFuYWdpbmcgbGVhc2VzIG9uIHRoZSBibG9iLlxuICAgICAqL1xuICAgIGdldEJsb2JMZWFzZUNsaWVudChwcm9wb3NlTGVhc2VJZCkge1xuICAgICAgICByZXR1cm4gbmV3IEJsb2JMZWFzZUNsaWVudCh0aGlzLCBwcm9wb3NlTGVhc2VJZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByZWFkLW9ubHkgc25hcHNob3Qgb2YgYSBibG9iLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL3NuYXBzaG90LWJsb2JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyB0byB0aGUgQmxvYiBDcmVhdGUgU25hcHNob3Qgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZVNuYXBzaG90KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iQ2xpZW50LWNyZWF0ZVNuYXBzaG90XCIsIG9wdGlvbnMpO1xuICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbnN1cmVDcGtJZlNwZWNpZmllZChvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIHRoaXMuaXNIdHRwcyk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ibG9iQ29udGV4dC5jcmVhdGVTbmFwc2hvdChPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSwgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLCBjcGtJbmZvOiBvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIGVuY3J5cHRpb25TY29wZTogb3B0aW9ucy5lbmNyeXB0aW9uU2NvcGUgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQXN5bmNocm9ub3VzbHkgY29waWVzIGEgYmxvYiB0byBhIGRlc3RpbmF0aW9uIHdpdGhpbiB0aGUgc3RvcmFnZSBhY2NvdW50LlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBsb25nIHJ1bm5pbmcgb3BlcmF0aW9uIHBvbGxlciB0aGF0IGFsbG93cyB5b3UgdG8gd2FpdFxuICAgICAqIGluZGVmaW5pdGVseSB1bnRpbCB0aGUgY29weSBpcyBjb21wbGV0ZWQuXG4gICAgICogWW91IGNhbiBhbHNvIGNhbmNlbCBhIGNvcHkgYmVmb3JlIGl0IGlzIGNvbXBsZXRlZCBieSBjYWxsaW5nIGBjYW5jZWxPcGVyYXRpb25gIG9uIHRoZSBwb2xsZXIuXG4gICAgICogTm90ZSB0aGF0IHRoZSBvblByb2dyZXNzIGNhbGxiYWNrIHdpbGwgbm90IGJlIGludm9rZWQgaWYgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW4gdGhlIGZpcnN0XG4gICAgICogcmVxdWVzdCwgYW5kIGF0dGVtcHRpbmcgdG8gY2FuY2VsIGEgY29tcGxldGVkIGNvcHkgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IgYmVpbmcgdGhyb3duLlxuICAgICAqXG4gICAgICogSW4gdmVyc2lvbiAyMDEyLTAyLTEyIGFuZCBsYXRlciwgdGhlIHNvdXJjZSBmb3IgYSBDb3B5IEJsb2Igb3BlcmF0aW9uIGNhbiBiZVxuICAgICAqIGEgY29tbWl0dGVkIGJsb2IgaW4gYW55IEF6dXJlIHN0b3JhZ2UgYWNjb3VudC5cbiAgICAgKiBCZWdpbm5pbmcgd2l0aCB2ZXJzaW9uIDIwMTUtMDItMjEsIHRoZSBzb3VyY2UgZm9yIGEgQ29weSBCbG9iIG9wZXJhdGlvbiBjYW4gYmVcbiAgICAgKiBhbiBBenVyZSBmaWxlIGluIGFueSBBenVyZSBzdG9yYWdlIGFjY291bnQuXG4gICAgICogT25seSBzdG9yYWdlIGFjY291bnRzIGNyZWF0ZWQgb24gb3IgYWZ0ZXIgSnVuZSA3dGgsIDIwMTIgYWxsb3cgdGhlIENvcHkgQmxvYlxuICAgICAqIG9wZXJhdGlvbiB0byBjb3B5IGZyb20gYW5vdGhlciBzdG9yYWdlIGFjY291bnQuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvY29weS1ibG9iXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGF1dG9tYXRpYyBwb2xsaW5nOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjb3B5UG9sbGVyID0gYXdhaXQgYmxvYkNsaWVudC5iZWdpbkNvcHlGcm9tVVJMKCd1cmwnKTtcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBjb3B5UG9sbGVyLnBvbGxVbnRpbERvbmUoKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgbWFudWFsIHBvbGxpbmc6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNvcHlQb2xsZXIgPSBhd2FpdCBibG9iQ2xpZW50LmJlZ2luQ29weUZyb21VUkwoJ3VybCcpO1xuICAgICAqIHdoaWxlICghcG9sbGVyLmlzRG9uZSgpKSB7XG4gICAgICogICAgYXdhaXQgcG9sbGVyLnBvbGwoKTtcbiAgICAgKiB9XG4gICAgICogY29uc3QgcmVzdWx0ID0gY29weVBvbGxlci5nZXRSZXN1bHQoKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgcHJvZ3Jlc3MgdXBkYXRlczpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY29weVBvbGxlciA9IGF3YWl0IGJsb2JDbGllbnQuYmVnaW5Db3B5RnJvbVVSTCgndXJsJywge1xuICAgICAqICAgb25Qcm9ncmVzcyhzdGF0ZSkge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhgUHJvZ3Jlc3M6ICR7c3RhdGUuY29weVByb2dyZXNzfWApO1xuICAgICAqICAgfVxuICAgICAqIH0pO1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvcHlQb2xsZXIucG9sbFVudGlsRG9uZSgpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBhIGNoYW5naW5nIHBvbGxpbmcgaW50ZXJ2YWwgKGRlZmF1bHQgMTUgc2Vjb25kcyk6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNvcHlQb2xsZXIgPSBhd2FpdCBibG9iQ2xpZW50LmJlZ2luQ29weUZyb21VUkwoJ3VybCcsIHtcbiAgICAgKiAgIGludGVydmFsSW5NczogMTAwMCAvLyBwb2xsIGJsb2IgZXZlcnkgMSBzZWNvbmQgZm9yIGNvcHkgcHJvZ3Jlc3NcbiAgICAgKiB9KTtcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBjb3B5UG9sbGVyLnBvbGxVbnRpbERvbmUoKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgY29weSBjYW5jZWxsYXRpb246XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNvcHlQb2xsZXIgPSBhd2FpdCBibG9iQ2xpZW50LmJlZ2luQ29weUZyb21VUkwoJ3VybCcpO1xuICAgICAqIC8vIGNhbmNlbCBvcGVyYXRpb24gYWZ0ZXIgc3RhcnRpbmcgaXQuXG4gICAgICogdHJ5IHtcbiAgICAgKiAgIGF3YWl0IGNvcHlQb2xsZXIuY2FuY2VsT3BlcmF0aW9uKCk7XG4gICAgICogICAvLyBjYWxscyB0byBnZXQgdGhlIHJlc3VsdCBub3cgdGhyb3cgUG9sbGVyQ2FuY2VsbGVkRXJyb3JcbiAgICAgKiAgIGF3YWl0IGNvcHlQb2xsZXIuZ2V0UmVzdWx0KCk7XG4gICAgICogfSBjYXRjaCAoZXJyKSB7XG4gICAgICogICBpZiAoZXJyLm5hbWUgPT09ICdQb2xsZXJDYW5jZWxsZWRFcnJvcicpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ1RoZSBjb3B5IHdhcyBjYW5jZWxsZWQuJyk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIGNvcHlTb3VyY2UgLSB1cmwgdG8gdGhlIHNvdXJjZSBBenVyZSBCbG9iL0ZpbGUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIHRvIHRoZSBCbG9iIFN0YXJ0IENvcHkgRnJvbSBVUkwgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGJlZ2luQ29weUZyb21VUkwoY29weVNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IHtcbiAgICAgICAgICAgIGFib3J0Q29weUZyb21VUkw6ICguLi5hcmdzKSA9PiB0aGlzLmFib3J0Q29weUZyb21VUkwoLi4uYXJncyksXG4gICAgICAgICAgICBnZXRQcm9wZXJ0aWVzOiAoLi4uYXJncykgPT4gdGhpcy5nZXRQcm9wZXJ0aWVzKC4uLmFyZ3MpLFxuICAgICAgICAgICAgc3RhcnRDb3B5RnJvbVVSTDogKC4uLmFyZ3MpID0+IHRoaXMuc3RhcnRDb3B5RnJvbVVSTCguLi5hcmdzKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcG9sbGVyID0gbmV3IEJsb2JCZWdpbkNvcHlGcm9tVXJsUG9sbGVyKHtcbiAgICAgICAgICAgIGJsb2JDbGllbnQ6IGNsaWVudCxcbiAgICAgICAgICAgIGNvcHlTb3VyY2UsXG4gICAgICAgICAgICBpbnRlcnZhbEluTXM6IG9wdGlvbnMuaW50ZXJ2YWxJbk1zLFxuICAgICAgICAgICAgb25Qcm9ncmVzczogb3B0aW9ucy5vblByb2dyZXNzLFxuICAgICAgICAgICAgcmVzdW1lRnJvbTogb3B0aW9ucy5yZXN1bWVGcm9tLFxuICAgICAgICAgICAgc3RhcnRDb3B5RnJvbVVSTE9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBUcmlnZ2VyIHRoZSBzdGFydENvcHlGcm9tVVJMIGNhbGwgYnkgY2FsbGluZyBwb2xsLlxuICAgICAgICAvLyBBbnkgZXJyb3JzIGZyb20gdGhpcyBtZXRob2Qgc2hvdWxkIGJlIHN1cmZhY2VkIHRvIHRoZSB1c2VyLlxuICAgICAgICBhd2FpdCBwb2xsZXIucG9sbCgpO1xuICAgICAgICByZXR1cm4gcG9sbGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBYm9ydHMgYSBwZW5kaW5nIGFzeW5jaHJvbm91cyBDb3B5IEJsb2Igb3BlcmF0aW9uLCBhbmQgbGVhdmVzIGEgZGVzdGluYXRpb24gYmxvYiB3aXRoIHplcm9cbiAgICAgKiBsZW5ndGggYW5kIGZ1bGwgbWV0YWRhdGEuIFZlcnNpb24gMjAxMi0wMi0xMiBhbmQgbmV3ZXIuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvYWJvcnQtY29weS1ibG9iXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29weUlkIC0gSWQgb2YgdGhlIENvcHkgRnJvbSBVUkwgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyB0byB0aGUgQmxvYiBBYm9ydCBDb3B5IEZyb20gVVJMIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBhYm9ydENvcHlGcm9tVVJMKGNvcHlJZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iQ2xpZW50LWFib3J0Q29weUZyb21VUkxcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ibG9iQ29udGV4dC5hYm9ydENvcHlGcm9tVVJMKGNvcHlJZCwgT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgc3luY2hyb25vdXMgQ29weSBGcm9tIFVSTCBvcGVyYXRpb24gY29waWVzIGEgYmxvYiBvciBhbiBpbnRlcm5ldCByZXNvdXJjZSB0byBhIG5ldyBibG9iLiBJdCB3aWxsIG5vdFxuICAgICAqIHJldHVybiBhIHJlc3BvbnNlIHVudGlsIHRoZSBjb3B5IGlzIGNvbXBsZXRlLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2NvcHktYmxvYi1mcm9tLXVybFxuICAgICAqXG4gICAgICogQHBhcmFtIGNvcHlTb3VyY2UgLSBUaGUgc291cmNlIFVSTCB0byBjb3B5IGZyb20sIFNoYXJlZCBBY2Nlc3MgU2lnbmF0dXJlKFNBUykgbWF5YmUgbmVlZGVkIGZvciBhdXRoZW50aWNhdGlvblxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBhc3luYyBzeW5jQ29weUZyb21VUkwoY29weVNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYkNsaWVudC1zeW5jQ29weUZyb21VUkxcIiwgb3B0aW9ucyk7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zID0gb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zIHx8IHt9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYmxvYkNvbnRleHQuY29weUZyb21VUkwoY29weVNvdXJjZSwgT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBtZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSwgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSwgc291cmNlTW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmTWF0Y2g6IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucy5pZk1hdGNoLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VJZk1vZGlmaWVkU2luY2U6IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmTm9uZU1hdGNoOiBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMuaWZOb25lTWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmVW5tb2RpZmllZFNpbmNlOiBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgICAgICAgICAgfSwgc291cmNlQ29udGVudE1ENTogb3B0aW9ucy5zb3VyY2VDb250ZW50TUQ1LCBjb3B5U291cmNlQXV0aG9yaXphdGlvbjogaHR0cEF1dGhvcml6YXRpb25Ub1N0cmluZyhvcHRpb25zLnNvdXJjZUF1dGhvcml6YXRpb24pLCB0aWVyOiB0b0FjY2Vzc1RpZXIob3B0aW9ucy50aWVyKSwgYmxvYlRhZ3NTdHJpbmc6IHRvQmxvYlRhZ3NTdHJpbmcob3B0aW9ucy50YWdzKSwgaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJ5OiAoX2IgPSBvcHRpb25zLmltbXV0YWJpbGl0eVBvbGljeSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmV4cGlyaWVzT24sIGltbXV0YWJpbGl0eVBvbGljeU1vZGU6IChfYyA9IG9wdGlvbnMuaW1tdXRhYmlsaXR5UG9saWN5KSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MucG9saWN5TW9kZSwgbGVnYWxIb2xkOiBvcHRpb25zLmxlZ2FsSG9sZCwgZW5jcnlwdGlvblNjb3BlOiBvcHRpb25zLmVuY3J5cHRpb25TY29wZSwgY29weVNvdXJjZVRhZ3M6IG9wdGlvbnMuY29weVNvdXJjZVRhZ3MgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGllciBvbiBhIGJsb2IuIFRoZSBvcGVyYXRpb24gaXMgYWxsb3dlZCBvbiBhIHBhZ2UgYmxvYiBpbiBhIHByZW1pdW1cbiAgICAgKiBzdG9yYWdlIGFjY291bnQgYW5kIG9uIGEgYmxvY2sgYmxvYiBpbiBhIGJsb2Igc3RvcmFnZSBhY2NvdW50IChsb2NhbGx5IHJlZHVuZGFudFxuICAgICAqIHN0b3JhZ2Ugb25seSkuIEEgcHJlbWl1bSBwYWdlIGJsb2IncyB0aWVyIGRldGVybWluZXMgdGhlIGFsbG93ZWQgc2l6ZSwgSU9QUyxcbiAgICAgKiBhbmQgYmFuZHdpZHRoIG9mIHRoZSBibG9iLiBBIGJsb2NrIGJsb2IncyB0aWVyIGRldGVybWluZXMgSG90L0Nvb2wvQXJjaGl2ZVxuICAgICAqIHN0b3JhZ2UgdHlwZS4gVGhpcyBvcGVyYXRpb24gZG9lcyBub3QgdXBkYXRlIHRoZSBibG9iJ3MgRVRhZy5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9zZXQtYmxvYi10aWVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGllciAtIFRoZSB0aWVyIHRvIGJlIHNldCBvbiB0aGUgYmxvYi4gVmFsaWQgdmFsdWVzIGFyZSBIb3QsIENvb2wsIG9yIEFyY2hpdmUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIHRvIHRoZSBCbG9iIFNldCBUaWVyIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBzZXRBY2Nlc3NUaWVyKHRpZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iQ2xpZW50LXNldEFjY2Vzc1RpZXJcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ibG9iQ29udGV4dC5zZXRUaWVyKHRvQWNjZXNzVGllcih0aWVyKSwgT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLCByZWh5ZHJhdGVQcmlvcml0eTogb3B0aW9ucy5yZWh5ZHJhdGVQcmlvcml0eSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBkb3dubG9hZFRvQnVmZmVyKHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCA9IHt9KSB7XG4gICAgICAgIGxldCBidWZmZXI7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICBsZXQgb3B0aW9ucyA9IHBhcmFtNDtcbiAgICAgICAgaWYgKHBhcmFtMSBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgICAgICAgYnVmZmVyID0gcGFyYW0xO1xuICAgICAgICAgICAgb2Zmc2V0ID0gcGFyYW0yIHx8IDA7XG4gICAgICAgICAgICBjb3VudCA9IHR5cGVvZiBwYXJhbTMgPT09IFwibnVtYmVyXCIgPyBwYXJhbTMgOiAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb2Zmc2V0ID0gdHlwZW9mIHBhcmFtMSA9PT0gXCJudW1iZXJcIiA/IHBhcmFtMSA6IDA7XG4gICAgICAgICAgICBjb3VudCA9IHR5cGVvZiBwYXJhbTIgPT09IFwibnVtYmVyXCIgPyBwYXJhbTIgOiAwO1xuICAgICAgICAgICAgb3B0aW9ucyA9IHBhcmFtMyB8fCB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYkNsaWVudC1kb3dubG9hZFRvQnVmZmVyXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmJsb2NrU2l6ZSkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuYmxvY2tTaXplID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2NrU2l6ZSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcImJsb2NrU2l6ZSBvcHRpb24gbXVzdCBiZSA+PSAwXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvY2tTaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ibG9ja1NpemUgPSBERUZBVUxUX0JMT0JfRE9XTkxPQURfQkxPQ0tfQllURVM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwib2Zmc2V0IG9wdGlvbiBtdXN0IGJlID49IDBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY291bnQgJiYgY291bnQgPD0gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiY291bnQgb3B0aW9uIG11c3QgYmUgZ3JlYXRlciB0aGFuIDBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuY29uZGl0aW9ucykge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ3VzdG9tZXIgZG9lc24ndCBzcGVjaWZ5IGxlbmd0aCwgZ2V0IGl0XG4gICAgICAgICAgICBpZiAoIWNvdW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmdldFByb3BlcnRpZXMoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSwgeyB0cmFjaW5nT3B0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLnRyYWNpbmdPcHRpb25zKSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpIH0pKTtcbiAgICAgICAgICAgICAgICBjb3VudCA9IHJlc3BvbnNlLmNvbnRlbnRMZW5ndGggLSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgb2Zmc2V0ICR7b2Zmc2V0fSBzaG91bGRuJ3QgYmUgbGFyZ2VyIHRoYW4gYmxvYiBzaXplICR7cmVzcG9uc2UuY29udGVudExlbmd0aH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBbGxvY2F0ZSB0aGUgYnVmZmVyIG9mIHNpemUgPSBjb3VudCBpZiB0aGUgYnVmZmVyIGlzIG5vdCBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKCFidWZmZXIpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBCdWZmZXIuYWxsb2MoY291bnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gYWxsb2NhdGUgdGhlIGJ1ZmZlciBvZiBzaXplOiAke2NvdW50fShpbiBieXRlcykuIFBsZWFzZSB0cnkgcGFzc2luZyB5b3VyIG93biBidWZmZXIgdG8gdGhlIFwiZG93bmxvYWRUb0J1ZmZlclwiIG1ldGhvZCBvciB0cnkgdXNpbmcgb3RoZXIgbWV0aG9kcyBsaWtlIFwiZG93bmxvYWRcIiBvciBcImRvd25sb2FkVG9GaWxlXCIuXFx0ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IGNvdW50KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZSBidWZmZXIncyBzaXplIHNob3VsZCBiZSBlcXVhbCB0byBvciBsYXJnZXIgdGhhbiB0aGUgcmVxdWVzdCBjb3VudCBvZiBieXRlczogJHtjb3VudH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0cmFuc2ZlclByb2dyZXNzID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGJhdGNoID0gbmV3IEJhdGNoKG9wdGlvbnMuY29uY3VycmVuY3kpO1xuICAgICAgICAgICAgZm9yIChsZXQgb2ZmID0gb2Zmc2V0OyBvZmYgPCBvZmZzZXQgKyBjb3VudDsgb2ZmID0gb2ZmICsgb3B0aW9ucy5ibG9ja1NpemUpIHtcbiAgICAgICAgICAgICAgICBiYXRjaC5hZGRPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBFeGNsdXNpdmUgY2h1bmsgZW5kIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgIGxldCBjaHVua0VuZCA9IG9mZnNldCArIGNvdW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAob2ZmICsgb3B0aW9ucy5ibG9ja1NpemUgPCBjaHVua0VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtFbmQgPSBvZmYgKyBvcHRpb25zLmJsb2NrU2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZG93bmxvYWQob2ZmLCBjaHVua0VuZCAtIG9mZiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhSZXRyeVJlcXVlc3RzOiBvcHRpb25zLm1heFJldHJ5UmVxdWVzdHNQZXJCbG9jayxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbWVyUHJvdmlkZWRLZXk6IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMudHJhY2luZ09wdGlvbnMpLCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW0gPSByZXNwb25zZS5yZWFkYWJsZVN0cmVhbUJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHN0cmVhbVRvQnVmZmVyKHN0cmVhbSwgYnVmZmVyLCBvZmYgLSBvZmZzZXQsIGNodW5rRW5kIC0gb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHByb2dyZXNzIGFmdGVyIGJsb2NrIGlzIGRvd25sb2FkZWQsIGluIGNhc2Ugb2YgYmxvY2sgdHJ5aW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIENvdWxkIHByb3ZpZGUgZmluZXIgZ3JhaW5lZCBwcm9ncmVzcyB1cGRhdGluZyBpbnNpZGUgSFRUUCByZXF1ZXN0cyxcbiAgICAgICAgICAgICAgICAgICAgLy8gb25seSBpZiBjb252ZW5pZW5jZSBsYXllciBkb3dubG9hZCB0cnkgaXMgZW5hYmxlZFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlclByb2dyZXNzICs9IGNodW5rRW5kIC0gb2ZmO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5vblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uUHJvZ3Jlc3MoeyBsb2FkZWRCeXRlczogdHJhbnNmZXJQcm9ncmVzcyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgYmF0Y2guZG8oKTtcbiAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAgICAgKlxuICAgICAqIERvd25sb2FkcyBhbiBBenVyZSBCbG9iIHRvIGEgbG9jYWwgZmlsZS5cbiAgICAgKiBGYWlscyBpZiB0aGUgdGhlIGdpdmVuIGZpbGUgcGF0aCBhbHJlYWR5IGV4aXRzLlxuICAgICAqIE9mZnNldCBhbmQgY291bnQgYXJlIG9wdGlvbmFsLCBwYXNzIDAgYW5kIHVuZGVmaW5lZCByZXNwZWN0aXZlbHkgdG8gZG93bmxvYWQgdGhlIGVudGlyZSBibG9iLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpbGVQYXRoIC1cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gRnJvbSB3aGljaCBwb3NpdGlvbiBvZiB0aGUgYmxvY2sgYmxvYiB0byBkb3dubG9hZC5cbiAgICAgKiBAcGFyYW0gY291bnQgLSBIb3cgbXVjaCBkYXRhIHRvIGJlIGRvd25sb2FkZWQuIFdpbGwgZG93bmxvYWQgdG8gdGhlIGVuZCB3aGVuIHBhc3NpbmcgdW5kZWZpbmVkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBCbG9iIGRvd25sb2FkIG9wdGlvbnMuXG4gICAgICogQHJldHVybnMgVGhlIHJlc3BvbnNlIGRhdGEgZm9yIGJsb2IgZG93bmxvYWQgb3BlcmF0aW9uLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCB3aXRoIHJlYWRhYmxlU3RyZWFtQm9keSBzZXQgdG8gdW5kZWZpbmVkIHNpbmNlIGl0c1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgaXMgYWxyZWFkeSByZWFkIGFuZCB3cml0dGVuIGludG8gYSBsb2NhbCBmaWxlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIHNwZWNpZmllZCBwYXRoLlxuICAgICAqL1xuICAgIGFzeW5jIGRvd25sb2FkVG9GaWxlKGZpbGVQYXRoLCBvZmZzZXQgPSAwLCBjb3VudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iQ2xpZW50LWRvd25sb2FkVG9GaWxlXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmRvd25sb2FkKG9mZnNldCwgY291bnQsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHsgdHJhY2luZ09wdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy50cmFjaW5nT3B0aW9ucyksIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSB9KSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UucmVhZGFibGVTdHJlYW1Cb2R5KSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcmVhZFN0cmVhbVRvTG9jYWxGaWxlKHJlc3BvbnNlLnJlYWRhYmxlU3RyZWFtQm9keSwgZmlsZVBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIHN0cmVhbSBpcyBubyBsb25nZXIgYWNjZXNzaWJsZSBzbyBzZXR0aW5nIGl0IHRvIHVuZGVmaW5lZC5cbiAgICAgICAgICAgIHJlc3BvbnNlLmJsb2JEb3dubG9hZFN0cmVhbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0QmxvYkFuZENvbnRhaW5lck5hbWVzRnJvbVVybCgpIHtcbiAgICAgICAgbGV0IGNvbnRhaW5lck5hbWU7XG4gICAgICAgIGxldCBibG9iTmFtZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vICBVUkwgbWF5IGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nXG4gICAgICAgICAgICAvLyBcImh0dHBzOi8vbXlhY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9teWNvbnRhaW5lci9ibG9iP3Nhc1N0cmluZ1wiO1xuICAgICAgICAgICAgLy8gXCJodHRwczovL215YWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvbXljb250YWluZXIvYmxvYlwiO1xuICAgICAgICAgICAgLy8gXCJodHRwczovL215YWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvbXljb250YWluZXIvYmxvYi9hLnR4dD9zYXNTdHJpbmdcIjtcbiAgICAgICAgICAgIC8vIFwiaHR0cHM6Ly9teWFjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L215Y29udGFpbmVyL2Jsb2IvYS50eHRcIjtcbiAgICAgICAgICAgIC8vIElQdjQvSVB2NiBhZGRyZXNzIGhvc3RzLCBFbmRwb2ludHMgLSBgaHR0cDovLzEyNy4wLjAuMToxMDAwMC9kZXZzdG9yZWFjY291bnQxL2NvbnRhaW5lcm5hbWUvYmxvYmBcbiAgICAgICAgICAgIC8vIGh0dHA6Ly9sb2NhbGhvc3Q6MTAwMDEvZGV2c3RvcmVhY2NvdW50MS9jb250YWluZXJuYW1lL2Jsb2JcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IFVSTEJ1aWxkZXIucGFyc2UodGhpcy51cmwpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZFVybC5nZXRIb3N0KCkuc3BsaXQoXCIuXCIpWzFdID09PSBcImJsb2JcIikge1xuICAgICAgICAgICAgICAgIC8vIFwiaHR0cHM6Ly9teWFjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L2NvbnRhaW5lcm5hbWUvYmxvYlwiLlxuICAgICAgICAgICAgICAgIC8vIC5nZXRQYXRoKCkgLT4gL2NvbnRhaW5lcm5hbWUvYmxvYlxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhDb21wb25lbnRzID0gcGFyc2VkVXJsLmdldFBhdGgoKS5tYXRjaChcIi8oW14vXSopKC8oLiopKT9cIik7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyTmFtZSA9IHBhdGhDb21wb25lbnRzWzFdO1xuICAgICAgICAgICAgICAgIGJsb2JOYW1lID0gcGF0aENvbXBvbmVudHNbM107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0lwRW5kcG9pbnRTdHlsZShwYXJzZWRVcmwpKSB7XG4gICAgICAgICAgICAgICAgLy8gSVB2NC9JUHY2IGFkZHJlc3MgaG9zdHMuLi4gRXhhbXBsZSAtIGh0dHA6Ly8xOTIuMC4wLjEwOjEwMDAxL2RldnN0b3JlYWNjb3VudDEvY29udGFpbmVybmFtZS9ibG9iXG4gICAgICAgICAgICAgICAgLy8gU2luZ2xlIHdvcmQgZG9tYWluIHdpdGhvdXQgYSBbZG90XSBpbiB0aGUgZW5kcG9pbnQuLi4gRXhhbXBsZSAtIGh0dHA6Ly9sb2NhbGhvc3Q6MTAwMDEvZGV2c3RvcmVhY2NvdW50MS9jb250YWluZXJuYW1lL2Jsb2JcbiAgICAgICAgICAgICAgICAvLyAuZ2V0UGF0aCgpIC0+IC9kZXZzdG9yZWFjY291bnQxL2NvbnRhaW5lcm5hbWUvYmxvYlxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhDb21wb25lbnRzID0gcGFyc2VkVXJsLmdldFBhdGgoKS5tYXRjaChcIi8oW14vXSopLyhbXi9dKikoLyguKikpP1wiKTtcbiAgICAgICAgICAgICAgICBjb250YWluZXJOYW1lID0gcGF0aENvbXBvbmVudHNbMl07XG4gICAgICAgICAgICAgICAgYmxvYk5hbWUgPSBwYXRoQ29tcG9uZW50c1s0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFwiaHR0cHM6Ly9jdXN0b21kb21haW4uY29tL2NvbnRhaW5lcm5hbWUvYmxvYlwiLlxuICAgICAgICAgICAgICAgIC8vIC5nZXRQYXRoKCkgLT4gL2NvbnRhaW5lcm5hbWUvYmxvYlxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhDb21wb25lbnRzID0gcGFyc2VkVXJsLmdldFBhdGgoKS5tYXRjaChcIi8oW14vXSopKC8oLiopKT9cIik7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyTmFtZSA9IHBhdGhDb21wb25lbnRzWzFdO1xuICAgICAgICAgICAgICAgIGJsb2JOYW1lID0gcGF0aENvbXBvbmVudHNbM107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBkZWNvZGUgdGhlIGVuY29kZWQgYmxvYk5hbWUsIGNvbnRhaW5lck5hbWUgLSB0byBnZXQgYWxsIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgdGhhdCBtaWdodCBiZSBwcmVzZW50IGluIHRoZW1cbiAgICAgICAgICAgIGNvbnRhaW5lck5hbWUgPSBkZWNvZGVVUklDb21wb25lbnQoY29udGFpbmVyTmFtZSk7XG4gICAgICAgICAgICBibG9iTmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudChibG9iTmFtZSk7XG4gICAgICAgICAgICAvLyBBenVyZSBTdG9yYWdlIFNlcnZlciB3aWxsIHJlcGxhY2UgXCJcXFwiIHdpdGggXCIvXCIgaW4gdGhlIGJsb2IgbmFtZXNcbiAgICAgICAgICAgIC8vICAgZG9pbmcgdGhlIHNhbWUgaW4gdGhlIFNESyBzaWRlIHNvIHRoYXQgdGhlIHVzZXIgZG9lc24ndCBoYXZlIHRvIHJlcGxhY2UgXCJcXFwiIGluc3RhbmNlcyBpbiB0aGUgYmxvYk5hbWVcbiAgICAgICAgICAgIGJsb2JOYW1lID0gYmxvYk5hbWUucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lck5hbWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm92aWRlZCBjb250YWluZXJOYW1lIGlzIGludmFsaWQuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgYmxvYk5hbWUsIGNvbnRhaW5lck5hbWUgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBleHRyYWN0IGJsb2JOYW1lIGFuZCBjb250YWluZXJOYW1lIHdpdGggcHJvdmlkZWQgaW5mb3JtYXRpb24uXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFzeW5jaHJvbm91c2x5IGNvcGllcyBhIGJsb2IgdG8gYSBkZXN0aW5hdGlvbiB3aXRoaW4gdGhlIHN0b3JhZ2UgYWNjb3VudC5cbiAgICAgKiBJbiB2ZXJzaW9uIDIwMTItMDItMTIgYW5kIGxhdGVyLCB0aGUgc291cmNlIGZvciBhIENvcHkgQmxvYiBvcGVyYXRpb24gY2FuIGJlXG4gICAgICogYSBjb21taXR0ZWQgYmxvYiBpbiBhbnkgQXp1cmUgc3RvcmFnZSBhY2NvdW50LlxuICAgICAqIEJlZ2lubmluZyB3aXRoIHZlcnNpb24gMjAxNS0wMi0yMSwgdGhlIHNvdXJjZSBmb3IgYSBDb3B5IEJsb2Igb3BlcmF0aW9uIGNhbiBiZVxuICAgICAqIGFuIEF6dXJlIGZpbGUgaW4gYW55IEF6dXJlIHN0b3JhZ2UgYWNjb3VudC5cbiAgICAgKiBPbmx5IHN0b3JhZ2UgYWNjb3VudHMgY3JlYXRlZCBvbiBvciBhZnRlciBKdW5lIDd0aCwgMjAxMiBhbGxvdyB0aGUgQ29weSBCbG9iXG4gICAgICogb3BlcmF0aW9uIHRvIGNvcHkgZnJvbSBhbm90aGVyIHN0b3JhZ2UgYWNjb3VudC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9jb3B5LWJsb2JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb3B5U291cmNlIC0gdXJsIHRvIHRoZSBzb3VyY2UgQXp1cmUgQmxvYi9GaWxlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyB0byB0aGUgQmxvYiBTdGFydCBDb3B5IEZyb20gVVJMIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBzdGFydENvcHlGcm9tVVJMKGNvcHlTb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JDbGllbnQtc3RhcnRDb3B5RnJvbVVSTFwiLCBvcHRpb25zKTtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMgPSBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ibG9iQ29udGV4dC5zdGFydENvcHlGcm9tVVJMKGNvcHlTb3VyY2UsIE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksIHNvdXJjZU1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2VJZk1hdGNoOiBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMuaWZNYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZNb2RpZmllZFNpbmNlOiBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VJZk5vbmVNYXRjaDogb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zLmlmTm9uZU1hdGNoLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VJZlVubW9kaWZpZWRTaW5jZTogb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VJZlRhZ3M6IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucy50YWdDb25kaXRpb25zLFxuICAgICAgICAgICAgICAgIH0sIGltbXV0YWJpbGl0eVBvbGljeUV4cGlyeTogKF9iID0gb3B0aW9ucy5pbW11dGFiaWxpdHlQb2xpY3kpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5leHBpcmllc09uLCBpbW11dGFiaWxpdHlQb2xpY3lNb2RlOiAoX2MgPSBvcHRpb25zLmltbXV0YWJpbGl0eVBvbGljeSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnBvbGljeU1vZGUsIGxlZ2FsSG9sZDogb3B0aW9ucy5sZWdhbEhvbGQsIHJlaHlkcmF0ZVByaW9yaXR5OiBvcHRpb25zLnJlaHlkcmF0ZVByaW9yaXR5LCB0aWVyOiB0b0FjY2Vzc1RpZXIob3B0aW9ucy50aWVyKSwgYmxvYlRhZ3NTdHJpbmc6IHRvQmxvYlRhZ3NTdHJpbmcob3B0aW9ucy50YWdzKSwgc2VhbEJsb2I6IG9wdGlvbnMuc2VhbEJsb2IgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogT25seSBhdmFpbGFibGUgZm9yIEJsb2JDbGllbnQgY29uc3RydWN0ZWQgd2l0aCBhIHNoYXJlZCBrZXkgY3JlZGVudGlhbC5cbiAgICAgKlxuICAgICAqIEdlbmVyYXRlcyBhIEJsb2IgU2VydmljZSBTaGFyZWQgQWNjZXNzIFNpZ25hdHVyZSAoU0FTKSBVUkkgYmFzZWQgb24gdGhlIGNsaWVudCBwcm9wZXJ0aWVzXG4gICAgICogYW5kIHBhcmFtZXRlcnMgcGFzc2VkIGluLiBUaGUgU0FTIGlzIHNpZ25lZCBieSB0aGUgc2hhcmVkIGtleSBjcmVkZW50aWFsIG9mIHRoZSBjbGllbnQuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9jb25zdHJ1Y3RpbmctYS1zZXJ2aWNlLXNhc1xuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm5zIFRoZSBTQVMgVVJJIGNvbnNpc3Rpbmcgb2YgdGhlIFVSSSB0byB0aGUgcmVzb3VyY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBjbGllbnQsIGZvbGxvd2VkIGJ5IHRoZSBnZW5lcmF0ZWQgU0FTIHRva2VuLlxuICAgICAqL1xuICAgIGdlbmVyYXRlU2FzVXJsKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBpZiAoISh0aGlzLmNyZWRlbnRpYWwgaW5zdGFuY2VvZiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkNhbiBvbmx5IGdlbmVyYXRlIHRoZSBTQVMgd2hlbiB0aGUgY2xpZW50IGlzIGluaXRpYWxpemVkIHdpdGggYSBzaGFyZWQga2V5IGNyZWRlbnRpYWxcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzYXMgPSBnZW5lcmF0ZUJsb2JTQVNRdWVyeVBhcmFtZXRlcnMoT2JqZWN0LmFzc2lnbih7IGNvbnRhaW5lck5hbWU6IHRoaXMuX2NvbnRhaW5lck5hbWUsIGJsb2JOYW1lOiB0aGlzLl9uYW1lLCBzbmFwc2hvdFRpbWU6IHRoaXMuX3NuYXBzaG90LCB2ZXJzaW9uSWQ6IHRoaXMuX3ZlcnNpb25JZCB9LCBvcHRpb25zKSwgdGhpcy5jcmVkZW50aWFsKS50b1N0cmluZygpO1xuICAgICAgICAgICAgcmVzb2x2ZShhcHBlbmRUb1VSTFF1ZXJ5KHRoaXMudXJsLCBzYXMpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZSB0aGUgaW1tdXRhYmxpbGl0eSBwb2xpY3kgb24gdGhlIGJsb2IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIG9wdGlvbnMgdG8gZGVsZXRlIGltbXV0YWJpbGl0eSBwb2xpY3kgb24gdGhlIGJsb2IuXG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlSW1tdXRhYmlsaXR5UG9saWN5KG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JDbGllbnQtZGVsZXRlSW1tdXRhYmlsaXR5UG9saWN5XCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYmxvYkNvbnRleHQuZGVsZXRlSW1tdXRhYmlsaXR5UG9saWN5KE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmFib3J0U2lnbmFsIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBpbW11dGFibGlsaXR5IHBvbGljeSBvbiB0aGUgYmxvYi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyB0byBzZXQgaW1tdXRhYmlsaXR5IHBvbGljeSBvbiB0aGUgYmxvYi5cbiAgICAgKi9cbiAgICBhc3luYyBzZXRJbW11dGFiaWxpdHlQb2xpY3koaW1tdXRhYmlsaXR5UG9saWN5LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iQ2xpZW50LXNldEltbXV0YWJpbGl0eVBvbGljeVwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJsb2JDb250ZXh0LnNldEltbXV0YWJpbGl0eVBvbGljeShPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJ5OiBpbW11dGFiaWxpdHlQb2xpY3kuZXhwaXJpZXNPbiwgaW1tdXRhYmlsaXR5UG9saWN5TW9kZTogaW1tdXRhYmlsaXR5UG9saWN5LnBvbGljeU1vZGUsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBsZWdhbCBob2xkIG9uIHRoZSBibG9iLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIHRvIHNldCBsZWdhbCBob2xkIG9uIHRoZSBibG9iLlxuICAgICAqL1xuICAgIGFzeW5jIHNldExlZ2FsSG9sZChsZWdhbEhvbGRFbmFibGVkLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iQ2xpZW50LXNldExlZ2FsSG9sZFwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJsb2JDb250ZXh0LnNldExlZ2FsSG9sZChsZWdhbEhvbGRFbmFibGVkLCBPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5hYm9ydFNpZ25hbCB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQXBwZW5kQmxvYkNsaWVudCBkZWZpbmVzIGEgc2V0IG9mIG9wZXJhdGlvbnMgYXBwbGljYWJsZSB0byBhcHBlbmQgYmxvYnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBBcHBlbmRCbG9iQ2xpZW50IGV4dGVuZHMgQmxvYkNsaWVudCB7XG4gICAgY29uc3RydWN0b3IodXJsT3JDb25uZWN0aW9uU3RyaW5nLCBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSwgYmxvYk5hbWVPck9wdGlvbnMsIFxuICAgIC8vIExlZ2FjeSwgbm8gZml4IGZvciBlc2xpbnQgZXJyb3Igd2l0aG91dCBicmVha2luZy4gRGlzYWJsZSBpdCBmb3IgdGhpcyBpbnRlcmZhY2UuXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhenVyZS9henVyZS1zZGsvdHMtbmFtaW5nLW9wdGlvbnMqL1xuICAgIG9wdGlvbnMpIHtcbiAgICAgICAgLy8gSW4gVHlwZVNjcmlwdCB3ZSBjYW5ub3Qgc2ltcGx5IHBhc3MgYWxsIHBhcmFtZXRlcnMgdG8gc3VwZXIoKSBsaWtlIGJlbG93IHNvIGhhdmUgdG8gZHVwbGljYXRlIHRoZSBjb2RlIGluc3RlYWQuXG4gICAgICAgIC8vICAgc3VwZXIocywgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWVPck9wdGlvbnMsIGJsb2JOYW1lT3JPcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgbGV0IHBpcGVsaW5lO1xuICAgICAgICBsZXQgdXJsO1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgaWYgKGlzUGlwZWxpbmVMaWtlKGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lKSkge1xuICAgICAgICAgICAgLy8gKHVybDogc3RyaW5nLCBwaXBlbGluZTogUGlwZWxpbmUpXG4gICAgICAgICAgICB1cmwgPSB1cmxPckNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICAgICAgICBwaXBlbGluZSA9IGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChpc05vZGUgJiYgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgaW5zdGFuY2VvZiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCkgfHxcbiAgICAgICAgICAgIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lIGluc3RhbmNlb2YgQW5vbnltb3VzQ3JlZGVudGlhbCB8fFxuICAgICAgICAgICAgaXNUb2tlbkNyZWRlbnRpYWwoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUpKSB7XG4gICAgICAgICAgICAvLyAodXJsOiBzdHJpbmcsIGNyZWRlbnRpYWw/OiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCB8IEFub255bW91c0NyZWRlbnRpYWwgfCBUb2tlbkNyZWRlbnRpYWwsIG9wdGlvbnM/OiBTdG9yYWdlUGlwZWxpbmVPcHRpb25zKSAgICAgIHVybCA9IHVybE9yQ29ubmVjdGlvblN0cmluZztcbiAgICAgICAgICAgIHVybCA9IHVybE9yQ29ubmVjdGlvblN0cmluZztcbiAgICAgICAgICAgIG9wdGlvbnMgPSBibG9iTmFtZU9yT3B0aW9ucztcbiAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAvLyAodXJsOiBzdHJpbmcsIGNyZWRlbnRpYWw/OiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCB8IEFub255bW91c0NyZWRlbnRpYWwgfCBUb2tlbkNyZWRlbnRpYWwsIG9wdGlvbnM/OiBTdG9yYWdlUGlwZWxpbmVPcHRpb25zKVxuICAgICAgICAgICAgdXJsID0gdXJsT3JDb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgLy8gVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkLiBVc2UgYW5vbnltb3VzIGNyZWRlbnRpYWwuXG4gICAgICAgICAgICBwaXBlbGluZSA9IG5ld1BpcGVsaW5lKG5ldyBBbm9ueW1vdXNDcmVkZW50aWFsKCksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lICYmXG4gICAgICAgICAgICB0eXBlb2YgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgIGJsb2JOYW1lT3JPcHRpb25zICYmXG4gICAgICAgICAgICB0eXBlb2YgYmxvYk5hbWVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIC8vIChjb25uZWN0aW9uU3RyaW5nOiBzdHJpbmcsIGNvbnRhaW5lck5hbWU6IHN0cmluZywgYmxvYk5hbWU6IHN0cmluZywgb3B0aW9ucz86IFN0b3JhZ2VQaXBlbGluZU9wdGlvbnMpXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJOYW1lID0gY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWU7XG4gICAgICAgICAgICBjb25zdCBibG9iTmFtZSA9IGJsb2JOYW1lT3JPcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgZXh0cmFjdGVkQ3JlZHMgPSBleHRyYWN0Q29ubmVjdGlvblN0cmluZ1BhcnRzKHVybE9yQ29ubmVjdGlvblN0cmluZyk7XG4gICAgICAgICAgICBpZiAoZXh0cmFjdGVkQ3JlZHMua2luZCA9PT0gXCJBY2NvdW50Q29ublN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRLZXlDcmVkZW50aWFsID0gbmV3IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsKGV4dHJhY3RlZENyZWRzLmFjY291bnROYW1lLCBleHRyYWN0ZWRDcmVkcy5hY2NvdW50S2V5KTtcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gYXBwZW5kVG9VUkxQYXRoKGFwcGVuZFRvVVJMUGF0aChleHRyYWN0ZWRDcmVkcy51cmwsIGVuY29kZVVSSUNvbXBvbmVudChjb250YWluZXJOYW1lKSksIGVuY29kZVVSSUNvbXBvbmVudChibG9iTmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMucHJveHlPcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByb3h5T3B0aW9ucyA9IGdldERlZmF1bHRQcm94eVNldHRpbmdzKGV4dHJhY3RlZENyZWRzLnByb3h5VXJpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSA9IG5ld1BpcGVsaW5lKHNoYXJlZEtleUNyZWRlbnRpYWwsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWNjb3VudCBjb25uZWN0aW9uIHN0cmluZyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBOb2RlLmpzIGVudmlyb25tZW50XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGV4dHJhY3RlZENyZWRzLmtpbmQgPT09IFwiU0FTQ29ublN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgdXJsID1cbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG9VUkxQYXRoKGFwcGVuZFRvVVJMUGF0aChleHRyYWN0ZWRDcmVkcy51cmwsIGVuY29kZVVSSUNvbXBvbmVudChjb250YWluZXJOYW1lKSksIGVuY29kZVVSSUNvbXBvbmVudChibG9iTmFtZSkpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiP1wiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RlZENyZWRzLmFjY291bnRTYXM7XG4gICAgICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShuZXcgQW5vbnltb3VzQ3JlZGVudGlhbCgpLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbm5lY3Rpb24gc3RyaW5nIG11c3QgYmUgZWl0aGVyIGFuIEFjY291bnQgY29ubmVjdGlvbiBzdHJpbmcgb3IgYSBTQVMgY29ubmVjdGlvbiBzdHJpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3Rpbmcgbm9uLWVtcHR5IHN0cmluZ3MgZm9yIGNvbnRhaW5lck5hbWUgYW5kIGJsb2JOYW1lIHBhcmFtZXRlcnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIodXJsLCBwaXBlbGluZSk7XG4gICAgICAgIHRoaXMuYXBwZW5kQmxvYkNvbnRleHQgPSBuZXcgQXBwZW5kQmxvYih0aGlzLnN0b3JhZ2VDbGllbnRDb250ZXh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBBcHBlbmRCbG9iQ2xpZW50IG9iamVjdCBpZGVudGljYWwgdG8gdGhlIHNvdXJjZSBidXQgd2l0aCB0aGVcbiAgICAgKiBzcGVjaWZpZWQgc25hcHNob3QgdGltZXN0YW1wLlxuICAgICAqIFByb3ZpZGUgXCJcIiB3aWxsIHJlbW92ZSB0aGUgc25hcHNob3QgYW5kIHJldHVybiBhIENsaWVudCB0byB0aGUgYmFzZSBibG9iLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNuYXBzaG90IC0gVGhlIHNuYXBzaG90IHRpbWVzdGFtcC5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBBcHBlbmRCbG9iQ2xpZW50IG9iamVjdCBpZGVudGljYWwgdG8gdGhlIHNvdXJjZSBidXQgd2l0aCB0aGUgc3BlY2lmaWVkIHNuYXBzaG90IHRpbWVzdGFtcC5cbiAgICAgKi9cbiAgICB3aXRoU25hcHNob3Qoc25hcHNob3QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBcHBlbmRCbG9iQ2xpZW50KHNldFVSTFBhcmFtZXRlcih0aGlzLnVybCwgVVJMQ29uc3RhbnRzLlBhcmFtZXRlcnMuU05BUFNIT1QsIHNuYXBzaG90Lmxlbmd0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IHNuYXBzaG90KSwgdGhpcy5waXBlbGluZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSAwLWxlbmd0aCBhcHBlbmQgYmxvYi4gQ2FsbCBBcHBlbmRCbG9jayB0byBhcHBlbmQgZGF0YSB0byBhbiBhcHBlbmQgYmxvYi5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9wdXQtYmxvYlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBBcHBlbmQgQmxvY2sgQ3JlYXRlIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2FnZTpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgYXBwZW5kQmxvYkNsaWVudCA9IGNvbnRhaW5lckNsaWVudC5nZXRBcHBlbmRCbG9iQ2xpZW50KFwiPGJsb2IgbmFtZT5cIik7XG4gICAgICogYXdhaXQgYXBwZW5kQmxvYkNsaWVudC5jcmVhdGUoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGUob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQXBwZW5kQmxvYkNsaWVudC1jcmVhdGVcIiwgb3B0aW9ucyk7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVuc3VyZUNwa0lmU3BlY2lmaWVkKG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgdGhpcy5pc0h0dHBzKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwcGVuZEJsb2JDb250ZXh0LmNyZWF0ZSgwLCBPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGJsb2JIdHRwSGVhZGVyczogb3B0aW9ucy5ibG9iSFRUUEhlYWRlcnMsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSwgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLCBjcGtJbmZvOiBvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIGVuY3J5cHRpb25TY29wZTogb3B0aW9ucy5lbmNyeXB0aW9uU2NvcGUsIGltbXV0YWJpbGl0eVBvbGljeUV4cGlyeTogKF9iID0gb3B0aW9ucy5pbW11dGFiaWxpdHlQb2xpY3kpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5leHBpcmllc09uLCBpbW11dGFiaWxpdHlQb2xpY3lNb2RlOiAoX2MgPSBvcHRpb25zLmltbXV0YWJpbGl0eVBvbGljeSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnBvbGljeU1vZGUsIGxlZ2FsSG9sZDogb3B0aW9ucy5sZWdhbEhvbGQsIGJsb2JUYWdzU3RyaW5nOiB0b0Jsb2JUYWdzU3RyaW5nKG9wdGlvbnMudGFncykgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIDAtbGVuZ3RoIGFwcGVuZCBibG9iLiBDYWxsIEFwcGVuZEJsb2NrIHRvIGFwcGVuZCBkYXRhIHRvIGFuIGFwcGVuZCBibG9iLlxuICAgICAqIElmIHRoZSBibG9iIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhlIGNvbnRlbnQgb2YgdGhlIGV4aXN0aW5nIGJsb2Igd2lsbCByZW1haW4gdW5jaGFuZ2VkLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL3B1dC1ibG9iXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlSWZOb3RFeGlzdHMob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJBcHBlbmRCbG9iQ2xpZW50LWNyZWF0ZUlmTm90RXhpc3RzXCIsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBjb25kaXRpb25zID0geyBpZk5vbmVNYXRjaDogRVRhZ0FueSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jcmVhdGUoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB1cGRhdGVkT3B0aW9ucyksIHsgY29uZGl0aW9ucyB9KSk7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgc3VjY2VlZGVkOiB0cnVlIH0sIHJlcyksIHsgX3Jlc3BvbnNlOiByZXMuX3Jlc3BvbnNlIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoKChfYSA9IGUuZGV0YWlscykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmVycm9yQ29kZSkgPT09IFwiQmxvYkFscmVhZHlFeGlzdHNcIikge1xuICAgICAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiRXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gY3JlYXRpbmcgYSBibG9iIG9ubHkgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC5cIixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgc3VjY2VlZGVkOiBmYWxzZSB9LCAoX2IgPSBlLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucGFyc2VkSGVhZGVycyksIHsgX3Jlc3BvbnNlOiBlLnJlc3BvbnNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VhbHMgdGhlIGFwcGVuZCBibG9iLCBtYWtpbmcgaXQgcmVhZCBvbmx5LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGFzeW5jIHNlYWwob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkFwcGVuZEJsb2JDbGllbnQtc2VhbFwiLCBvcHRpb25zKTtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBwZW5kQmxvYkNvbnRleHQuc2VhbChPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGFwcGVuZFBvc2l0aW9uQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbW1pdHMgYSBuZXcgYmxvY2sgb2YgZGF0YSB0byB0aGUgZW5kIG9mIHRoZSBleGlzdGluZyBhcHBlbmQgYmxvYi5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9hcHBlbmQtYmxvY2tcbiAgICAgKlxuICAgICAqIEBwYXJhbSBib2R5IC0gRGF0YSB0byBiZSBhcHBlbmRlZC5cbiAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCAtIExlbmd0aCBvZiB0aGUgYm9keSBpbiBieXRlcy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIEFwcGVuZCBCbG9jayBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNhZ2U6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNvbnRlbnQgPSBcIkhlbGxvIFdvcmxkIVwiO1xuICAgICAqXG4gICAgICogLy8gQ3JlYXRlIGEgbmV3IGFwcGVuZCBibG9iIGFuZCBhcHBlbmQgZGF0YSB0byB0aGUgYmxvYi5cbiAgICAgKiBjb25zdCBuZXdBcHBlbmRCbG9iQ2xpZW50ID0gY29udGFpbmVyQ2xpZW50LmdldEFwcGVuZEJsb2JDbGllbnQoXCI8YmxvYiBuYW1lPlwiKTtcbiAgICAgKiBhd2FpdCBuZXdBcHBlbmRCbG9iQ2xpZW50LmNyZWF0ZSgpO1xuICAgICAqIGF3YWl0IG5ld0FwcGVuZEJsb2JDbGllbnQuYXBwZW5kQmxvY2soY29udGVudCwgY29udGVudC5sZW5ndGgpO1xuICAgICAqXG4gICAgICogLy8gQXBwZW5kIGRhdGEgdG8gYW4gZXhpc3RpbmcgYXBwZW5kIGJsb2IuXG4gICAgICogY29uc3QgZXhpc3RpbmdBcHBlbmRCbG9iQ2xpZW50ID0gY29udGFpbmVyQ2xpZW50LmdldEFwcGVuZEJsb2JDbGllbnQoXCI8YmxvYiBuYW1lPlwiKTtcbiAgICAgKiBhd2FpdCBleGlzdGluZ0FwcGVuZEJsb2JDbGllbnQuYXBwZW5kQmxvY2soY29udGVudCwgY29udGVudC5sZW5ndGgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIGFwcGVuZEJsb2NrKGJvZHksIGNvbnRlbnRMZW5ndGgsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJBcHBlbmRCbG9iQ2xpZW50LWFwcGVuZEJsb2NrXCIsIG9wdGlvbnMpO1xuICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbnN1cmVDcGtJZlNwZWNpZmllZChvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIHRoaXMuaXNIdHRwcyk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcHBlbmRCbG9iQ29udGV4dC5hcHBlbmRCbG9jayhjb250ZW50TGVuZ3RoLCBib2R5LCBPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGFwcGVuZFBvc2l0aW9uQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLCByZXF1ZXN0T3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICBvblVwbG9hZFByb2dyZXNzOiBvcHRpb25zLm9uUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgfSwgdHJhbnNhY3Rpb25hbENvbnRlbnRNRDU6IG9wdGlvbnMudHJhbnNhY3Rpb25hbENvbnRlbnRNRDUsIHRyYW5zYWN0aW9uYWxDb250ZW50Q3JjNjQ6IG9wdGlvbnMudHJhbnNhY3Rpb25hbENvbnRlbnRDcmM2NCwgY3BrSW5mbzogb3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCBlbmNyeXB0aW9uU2NvcGU6IG9wdGlvbnMuZW5jcnlwdGlvblNjb3BlIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBBcHBlbmQgQmxvY2sgb3BlcmF0aW9uIGNvbW1pdHMgYSBuZXcgYmxvY2sgb2YgZGF0YSB0byB0aGUgZW5kIG9mIGFuIGV4aXN0aW5nIGFwcGVuZCBibG9iXG4gICAgICogd2hlcmUgdGhlIGNvbnRlbnRzIGFyZSByZWFkIGZyb20gYSBzb3VyY2UgdXJsLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2FwcGVuZC1ibG9jay1mcm9tLXVybFxuICAgICAqXG4gICAgICogQHBhcmFtIHNvdXJjZVVSTCAtXG4gICAgICogICAgICAgICAgICAgICAgIFRoZSB1cmwgdG8gdGhlIGJsb2IgdGhhdCB3aWxsIGJlIHRoZSBzb3VyY2Ugb2YgdGhlIGNvcHkuIEEgc291cmNlIGJsb2IgaW4gdGhlIHNhbWUgc3RvcmFnZSBhY2NvdW50IGNhblxuICAgICAqICAgICAgICAgICAgICAgICBiZSBhdXRoZW50aWNhdGVkIHZpYSBTaGFyZWQgS2V5LiBIb3dldmVyLCBpZiB0aGUgc291cmNlIGlzIGEgYmxvYiBpbiBhbm90aGVyIGFjY291bnQsIHRoZSBzb3VyY2UgYmxvYlxuICAgICAqICAgICAgICAgICAgICAgICBtdXN0IGVpdGhlciBiZSBwdWJsaWMgb3IgbXVzdCBiZSBhdXRoZW50aWNhdGVkIHZpYSBhIHNoYXJlZCBhY2Nlc3Mgc2lnbmF0dXJlLiBJZiB0aGUgc291cmNlIGJsb2IgaXNcbiAgICAgKiAgICAgICAgICAgICAgICAgcHVibGljLCBubyBhdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZCB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHNvdXJjZU9mZnNldCAtIE9mZnNldCBpbiBzb3VyY2UgdG8gYmUgYXBwZW5kZWRcbiAgICAgKiBAcGFyYW0gY291bnQgLSBOdW1iZXIgb2YgYnl0ZXMgdG8gYmUgYXBwZW5kZWQgYXMgYSBibG9ja1xuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBhc3luYyBhcHBlbmRCbG9ja0Zyb21VUkwoc291cmNlVVJMLCBzb3VyY2VPZmZzZXQsIGNvdW50LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQXBwZW5kQmxvYkNsaWVudC1hcHBlbmRCbG9ja0Zyb21VUkxcIiwgb3B0aW9ucyk7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zID0gb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zIHx8IHt9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZW5zdXJlQ3BrSWZTcGVjaWZpZWQob3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCB0aGlzLmlzSHR0cHMpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBwZW5kQmxvYkNvbnRleHQuYXBwZW5kQmxvY2tGcm9tVXJsKHNvdXJjZVVSTCwgMCwgT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBzb3VyY2VSYW5nZTogcmFuZ2VUb1N0cmluZyh7IG9mZnNldDogc291cmNlT2Zmc2V0LCBjb3VudCB9KSwgc291cmNlQ29udGVudE1ENTogb3B0aW9ucy5zb3VyY2VDb250ZW50TUQ1LCBzb3VyY2VDb250ZW50Q3JjNjQ6IG9wdGlvbnMuc291cmNlQ29udGVudENyYzY0LCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgYXBwZW5kUG9zaXRpb25BY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSwgc291cmNlTW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmTWF0Y2g6IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucy5pZk1hdGNoLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VJZk1vZGlmaWVkU2luY2U6IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmTm9uZU1hdGNoOiBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMuaWZOb25lTWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmVW5tb2RpZmllZFNpbmNlOiBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgICAgICAgICAgfSwgY29weVNvdXJjZUF1dGhvcml6YXRpb246IGh0dHBBdXRob3JpemF0aW9uVG9TdHJpbmcob3B0aW9ucy5zb3VyY2VBdXRob3JpemF0aW9uKSwgY3BrSW5mbzogb3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCBlbmNyeXB0aW9uU2NvcGU6IG9wdGlvbnMuZW5jcnlwdGlvblNjb3BlIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBCbG9ja0Jsb2JDbGllbnQgZGVmaW5lcyBhIHNldCBvZiBvcGVyYXRpb25zIGFwcGxpY2FibGUgdG8gYmxvY2sgYmxvYnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBCbG9ja0Jsb2JDbGllbnQgZXh0ZW5kcyBCbG9iQ2xpZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih1cmxPckNvbm5lY3Rpb25TdHJpbmcsIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lLCBibG9iTmFtZU9yT3B0aW9ucywgXG4gICAgLy8gTGVnYWN5LCBubyBmaXggZm9yIGVzbGludCBlcnJvciB3aXRob3V0IGJyZWFraW5nLiBEaXNhYmxlIGl0IGZvciB0aGlzIGludGVyZmFjZS5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGF6dXJlL2F6dXJlLXNkay90cy1uYW1pbmctb3B0aW9ucyovXG4gICAgb3B0aW9ucykge1xuICAgICAgICAvLyBJbiBUeXBlU2NyaXB0IHdlIGNhbm5vdCBzaW1wbHkgcGFzcyBhbGwgcGFyYW1ldGVycyB0byBzdXBlcigpIGxpa2UgYmVsb3cgc28gaGF2ZSB0byBkdXBsaWNhdGUgdGhlIGNvZGUgaW5zdGVhZC5cbiAgICAgICAgLy8gICBzdXBlcihzLCBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZU9yT3B0aW9ucywgYmxvYk5hbWVPck9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICBsZXQgcGlwZWxpbmU7XG4gICAgICAgIGxldCB1cmw7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBpZiAoaXNQaXBlbGluZUxpa2UoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUpKSB7XG4gICAgICAgICAgICAvLyAodXJsOiBzdHJpbmcsIHBpcGVsaW5lOiBQaXBlbGluZSlcbiAgICAgICAgICAgIHVybCA9IHVybE9yQ29ubmVjdGlvblN0cmluZztcbiAgICAgICAgICAgIHBpcGVsaW5lID0gY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKGlzTm9kZSAmJiBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSBpbnN0YW5jZW9mIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsKSB8fFxuICAgICAgICAgICAgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgaW5zdGFuY2VvZiBBbm9ueW1vdXNDcmVkZW50aWFsIHx8XG4gICAgICAgICAgICBpc1Rva2VuQ3JlZGVudGlhbChjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSkpIHtcbiAgICAgICAgICAgIC8vICh1cmw6IHN0cmluZywgY3JlZGVudGlhbD86IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsIHwgQW5vbnltb3VzQ3JlZGVudGlhbCB8IFRva2VuQ3JlZGVudGlhbCwgb3B0aW9ucz86IFN0b3JhZ2VQaXBlbGluZU9wdGlvbnMpXG4gICAgICAgICAgICB1cmwgPSB1cmxPckNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICAgICAgICBvcHRpb25zID0gYmxvYk5hbWVPck9wdGlvbnM7XG4gICAgICAgICAgICBwaXBlbGluZSA9IG5ld1BpcGVsaW5lKGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgLy8gKHVybDogc3RyaW5nLCBjcmVkZW50aWFsPzogU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwgfCBBbm9ueW1vdXNDcmVkZW50aWFsIHwgVG9rZW5DcmVkZW50aWFsLCBvcHRpb25zPzogU3RvcmFnZVBpcGVsaW5lT3B0aW9ucylcbiAgICAgICAgICAgIC8vIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZC4gVXNlIGFub255bW91cyBjcmVkZW50aWFsLlxuICAgICAgICAgICAgdXJsID0gdXJsT3JDb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgaWYgKGJsb2JOYW1lT3JPcHRpb25zICYmIHR5cGVvZiBibG9iTmFtZU9yT3B0aW9ucyAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBibG9iTmFtZU9yT3B0aW9ucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUobmV3IEFub255bW91c0NyZWRlbnRpYWwoKSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgYmxvYk5hbWVPck9wdGlvbnMgJiZcbiAgICAgICAgICAgIHR5cGVvZiBibG9iTmFtZU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgLy8gKGNvbm5lY3Rpb25TdHJpbmc6IHN0cmluZywgY29udGFpbmVyTmFtZTogc3RyaW5nLCBibG9iTmFtZTogc3RyaW5nLCBvcHRpb25zPzogU3RvcmFnZVBpcGVsaW5lT3B0aW9ucylcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWUgPSBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGJsb2JOYW1lID0gYmxvYk5hbWVPck9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCBleHRyYWN0ZWRDcmVkcyA9IGV4dHJhY3RDb25uZWN0aW9uU3RyaW5nUGFydHModXJsT3JDb25uZWN0aW9uU3RyaW5nKTtcbiAgICAgICAgICAgIGlmIChleHRyYWN0ZWRDcmVkcy5raW5kID09PSBcIkFjY291bnRDb25uU3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZEtleUNyZWRlbnRpYWwgPSBuZXcgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwoZXh0cmFjdGVkQ3JlZHMuYWNjb3VudE5hbWUsIGV4dHJhY3RlZENyZWRzLmFjY291bnRLZXkpO1xuICAgICAgICAgICAgICAgICAgICB1cmwgPSBhcHBlbmRUb1VSTFBhdGgoYXBwZW5kVG9VUkxQYXRoKGV4dHJhY3RlZENyZWRzLnVybCwgZW5jb2RlVVJJQ29tcG9uZW50KGNvbnRhaW5lck5hbWUpKSwgZW5jb2RlVVJJQ29tcG9uZW50KGJsb2JOYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5wcm94eU9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHJveHlPcHRpb25zID0gZ2V0RGVmYXVsdFByb3h5U2V0dGluZ3MoZXh0cmFjdGVkQ3JlZHMucHJveHlVcmkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUoc2hhcmVkS2V5Q3JlZGVudGlhbCwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBY2NvdW50IGNvbm5lY3Rpb24gc3RyaW5nIGlzIG9ubHkgc3VwcG9ydGVkIGluIE5vZGUuanMgZW52aXJvbm1lbnRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXh0cmFjdGVkQ3JlZHMua2luZCA9PT0gXCJTQVNDb25uU3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICB1cmwgPVxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRUb1VSTFBhdGgoYXBwZW5kVG9VUkxQYXRoKGV4dHJhY3RlZENyZWRzLnVybCwgZW5jb2RlVVJJQ29tcG9uZW50KGNvbnRhaW5lck5hbWUpKSwgZW5jb2RlVVJJQ29tcG9uZW50KGJsb2JOYW1lKSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCI/XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdGVkQ3JlZHMuYWNjb3VudFNhcztcbiAgICAgICAgICAgICAgICBwaXBlbGluZSA9IG5ld1BpcGVsaW5lKG5ldyBBbm9ueW1vdXNDcmVkZW50aWFsKCksIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ubmVjdGlvbiBzdHJpbmcgbXVzdCBiZSBlaXRoZXIgYW4gQWNjb3VudCBjb25uZWN0aW9uIHN0cmluZyBvciBhIFNBUyBjb25uZWN0aW9uIHN0cmluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGluZyBub24tZW1wdHkgc3RyaW5ncyBmb3IgY29udGFpbmVyTmFtZSBhbmQgYmxvYk5hbWUgcGFyYW1ldGVyc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcih1cmwsIHBpcGVsaW5lKTtcbiAgICAgICAgdGhpcy5ibG9ja0Jsb2JDb250ZXh0ID0gbmV3IEJsb2NrQmxvYih0aGlzLnN0b3JhZ2VDbGllbnRDb250ZXh0KTtcbiAgICAgICAgdGhpcy5fYmxvYkNvbnRleHQgPSBuZXcgU3RvcmFnZUJsb2IodGhpcy5zdG9yYWdlQ2xpZW50Q29udGV4dCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQmxvY2tCbG9iQ2xpZW50IG9iamVjdCBpZGVudGljYWwgdG8gdGhlIHNvdXJjZSBidXQgd2l0aCB0aGVcbiAgICAgKiBzcGVjaWZpZWQgc25hcHNob3QgdGltZXN0YW1wLlxuICAgICAqIFByb3ZpZGUgXCJcIiB3aWxsIHJlbW92ZSB0aGUgc25hcHNob3QgYW5kIHJldHVybiBhIFVSTCB0byB0aGUgYmFzZSBibG9iLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNuYXBzaG90IC0gVGhlIHNuYXBzaG90IHRpbWVzdGFtcC5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBCbG9ja0Jsb2JDbGllbnQgb2JqZWN0IGlkZW50aWNhbCB0byB0aGUgc291cmNlIGJ1dCB3aXRoIHRoZSBzcGVjaWZpZWQgc25hcHNob3QgdGltZXN0YW1wLlxuICAgICAqL1xuICAgIHdpdGhTbmFwc2hvdChzbmFwc2hvdCkge1xuICAgICAgICByZXR1cm4gbmV3IEJsb2NrQmxvYkNsaWVudChzZXRVUkxQYXJhbWV0ZXIodGhpcy51cmwsIFVSTENvbnN0YW50cy5QYXJhbWV0ZXJzLlNOQVBTSE9ULCBzbmFwc2hvdC5sZW5ndGggPT09IDAgPyB1bmRlZmluZWQgOiBzbmFwc2hvdCksIHRoaXMucGlwZWxpbmUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPTkxZIEFWQUlMQUJMRSBJTiBOT0RFLkpTIFJVTlRJTUUuXG4gICAgICpcbiAgICAgKiBRdWljayBxdWVyeSBmb3IgYSBKU09OIG9yIENTViBmb3JtYXR0ZWQgYmxvYi5cbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNhZ2UgKE5vZGUuanMpOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiAvLyBRdWVyeSBhbmQgY29udmVydCBhIGJsb2IgdG8gYSBzdHJpbmdcbiAgICAgKiBjb25zdCBxdWVyeUJsb2NrQmxvYlJlc3BvbnNlID0gYXdhaXQgYmxvY2tCbG9iQ2xpZW50LnF1ZXJ5KFwic2VsZWN0ICogZnJvbSBCbG9iU3RvcmFnZVwiKTtcbiAgICAgKiBjb25zdCBkb3dubG9hZGVkID0gKGF3YWl0IHN0cmVhbVRvQnVmZmVyKHF1ZXJ5QmxvY2tCbG9iUmVzcG9uc2UucmVhZGFibGVTdHJlYW1Cb2R5KSkudG9TdHJpbmcoKTtcbiAgICAgKiBjb25zb2xlLmxvZyhcIlF1ZXJ5IGJsb2IgY29udGVudDpcIiwgZG93bmxvYWRlZCk7XG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBzdHJlYW1Ub0J1ZmZlcihyZWFkYWJsZVN0cmVhbSkge1xuICAgICAqICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgKiAgICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgICogICAgIHJlYWRhYmxlU3RyZWFtLm9uKFwiZGF0YVwiLCAoZGF0YSkgPT4ge1xuICAgICAqICAgICAgIGNodW5rcy5wdXNoKGRhdGEgaW5zdGFuY2VvZiBCdWZmZXIgPyBkYXRhIDogQnVmZmVyLmZyb20oZGF0YSkpO1xuICAgICAqICAgICB9KTtcbiAgICAgKiAgICAgcmVhZGFibGVTdHJlYW0ub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAqICAgICAgIHJlc29sdmUoQnVmZmVyLmNvbmNhdChjaHVua3MpKTtcbiAgICAgKiAgICAgfSk7XG4gICAgICogICAgIHJlYWRhYmxlU3RyZWFtLm9uKFwiZXJyb3JcIiwgcmVqZWN0KTtcbiAgICAgKiAgIH0pO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBxdWVyeSAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGFzeW5jIHF1ZXJ5KHF1ZXJ5LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBlbnN1cmVDcGtJZlNwZWNpZmllZChvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIHRoaXMuaXNIdHRwcyk7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9ja0Jsb2JDbGllbnQtcXVlcnlcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWlzTm9kZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgb3BlcmF0aW9uIGN1cnJlbnRseSBpcyBvbmx5IHN1cHBvcnRlZCBpbiBOb2RlLmpzLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVuc3VyZUNwa0lmU3BlY2lmaWVkKG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgdGhpcy5pc0h0dHBzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fYmxvYkNvbnRleHQucXVlcnkoT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBxdWVyeVJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlUeXBlOiBcIlNRTFwiLFxuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBxdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRTZXJpYWxpemF0aW9uOiB0b1F1ZXJ5U2VyaWFsaXphdGlvbihvcHRpb25zLmlucHV0VGV4dENvbmZpZ3VyYXRpb24pLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRTZXJpYWxpemF0aW9uOiB0b1F1ZXJ5U2VyaWFsaXphdGlvbihvcHRpb25zLm91dHB1dFRleHRDb25maWd1cmF0aW9uKSxcbiAgICAgICAgICAgICAgICB9LCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLCBjcGtJbmZvOiBvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXkgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQmxvYlF1ZXJ5UmVzcG9uc2UocmVzcG9uc2UsIHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICBvblByb2dyZXNzOiBvcHRpb25zLm9uUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgb25FcnJvcjogb3B0aW9ucy5vbkVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYmxvY2sgYmxvYiwgb3IgdXBkYXRlcyB0aGUgY29udGVudCBvZiBhbiBleGlzdGluZyBibG9jayBibG9iLlxuICAgICAqIFVwZGF0aW5nIGFuIGV4aXN0aW5nIGJsb2NrIGJsb2Igb3ZlcndyaXRlcyBhbnkgZXhpc3RpbmcgbWV0YWRhdGEgb24gdGhlIGJsb2IuXG4gICAgICogUGFydGlhbCB1cGRhdGVzIGFyZSBub3Qgc3VwcG9ydGVkOyB0aGUgY29udGVudCBvZiB0aGUgZXhpc3RpbmcgYmxvYiBpc1xuICAgICAqIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5ldyBjb250ZW50LiBUbyBwZXJmb3JtIGEgcGFydGlhbCB1cGRhdGUgb2YgYSBibG9jayBibG9iJ3MsXG4gICAgICogdXNlIHtAbGluayBzdGFnZUJsb2NrfSBhbmQge0BsaW5rIGNvbW1pdEJsb2NrTGlzdH0uXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGEgbm9uLXBhcmFsbGVsIHVwbG9hZGluZyBtZXRob2QsIHBsZWFzZSB1c2Uge0BsaW5rIHVwbG9hZEZpbGV9LFxuICAgICAqIHtAbGluayB1cGxvYWRTdHJlYW19IG9yIHtAbGluayB1cGxvYWRCcm93c2VyRGF0YX0gZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgICAqIHdpdGggY29uY3VycmVuY3kgdXBsb2FkaW5nLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvcHV0LWJsb2JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBib2R5IC0gQmxvYiwgc3RyaW5nLCBBcnJheUJ1ZmZlciwgQXJyYXlCdWZmZXJWaWV3IG9yIGEgZnVuY3Rpb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCByZXR1cm5zIGEgbmV3IFJlYWRhYmxlIHN0cmVhbSB3aG9zZSBvZmZzZXQgaXMgZnJvbSBkYXRhIHNvdXJjZSBiZWdpbm5pbmcuXG4gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggLSBMZW5ndGggb2YgYm9keSBpbiBieXRlcy4gVXNlIEJ1ZmZlci5ieXRlTGVuZ3RoKCkgdG8gY2FsY3VsYXRlIGJvZHkgbGVuZ3RoIGZvciBhXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluY2x1ZGluZyBub24gbm9uLUJhc2U2NC9IZXgtZW5jb2RlZCBjaGFyYWN0ZXJzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgQmxvY2sgQmxvYiBVcGxvYWQgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHRoZSBCbG9jayBCbG9iIFVwbG9hZCBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzYWdlOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjb250ZW50ID0gXCJIZWxsbyB3b3JsZCFcIjtcbiAgICAgKiBjb25zdCB1cGxvYWRCbG9iUmVzcG9uc2UgPSBhd2FpdCBibG9ja0Jsb2JDbGllbnQudXBsb2FkKGNvbnRlbnQsIGNvbnRlbnQubGVuZ3RoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhc3luYyB1cGxvYWQoYm9keSwgY29udGVudExlbmd0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9ja0Jsb2JDbGllbnQtdXBsb2FkXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZW5zdXJlQ3BrSWZTcGVjaWZpZWQob3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCB0aGlzLmlzSHR0cHMpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYmxvY2tCbG9iQ29udGV4dC51cGxvYWQoY29udGVudExlbmd0aCwgYm9keSwgT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBibG9iSHR0cEhlYWRlcnM6IG9wdGlvbnMuYmxvYkhUVFBIZWFkZXJzLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSwgcmVxdWVzdE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgb25VcGxvYWRQcm9ncmVzczogb3B0aW9ucy5vblByb2dyZXNzLFxuICAgICAgICAgICAgICAgIH0sIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgZW5jcnlwdGlvblNjb3BlOiBvcHRpb25zLmVuY3J5cHRpb25TY29wZSwgaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJ5OiAoX2IgPSBvcHRpb25zLmltbXV0YWJpbGl0eVBvbGljeSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmV4cGlyaWVzT24sIGltbXV0YWJpbGl0eVBvbGljeU1vZGU6IChfYyA9IG9wdGlvbnMuaW1tdXRhYmlsaXR5UG9saWN5KSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MucG9saWN5TW9kZSwgbGVnYWxIb2xkOiBvcHRpb25zLmxlZ2FsSG9sZCwgdGllcjogdG9BY2Nlc3NUaWVyKG9wdGlvbnMudGllciksIGJsb2JUYWdzU3RyaW5nOiB0b0Jsb2JUYWdzU3RyaW5nKG9wdGlvbnMudGFncykgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBCbG9jayBCbG9iIHdoZXJlIHRoZSBjb250ZW50cyBvZiB0aGUgYmxvYiBhcmUgcmVhZCBmcm9tIGEgZ2l2ZW4gVVJMLlxuICAgICAqIFRoaXMgQVBJIGlzIHN1cHBvcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgMjAyMC0wNC0wOCB2ZXJzaW9uLiBQYXJ0aWFsIHVwZGF0ZXNcbiAgICAgKiBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIFB1dCBCbG9iIGZyb20gVVJMOyB0aGUgY29udGVudCBvZiBhbiBleGlzdGluZyBibG9iIGlzIG92ZXJ3cml0dGVuIHdpdGhcbiAgICAgKiB0aGUgY29udGVudCBvZiB0aGUgbmV3IGJsb2IuICBUbyBwZXJmb3JtIHBhcnRpYWwgdXBkYXRlcyB0byBhIGJsb2NrIGJsb2LigJlzIGNvbnRlbnRzIHVzaW5nIGFcbiAgICAgKiBzb3VyY2UgVVJMLCB1c2Uge0BsaW5rIHN0YWdlQmxvY2tGcm9tVVJMfSBhbmQge0BsaW5rIGNvbW1pdEJsb2NrTGlzdH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc291cmNlVVJMIC0gU3BlY2lmaWVzIHRoZSBVUkwgb2YgdGhlIGJsb2IuIFRoZSB2YWx1ZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGJlIGEgVVJMIG9mIHVwIHRvIDIgS0IgaW4gbGVuZ3RoIHRoYXQgc3BlY2lmaWVzIGEgYmxvYi5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBzaG91bGQgYmUgVVJMLWVuY29kZWQgYXMgaXQgd291bGQgYXBwZWFyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhIHJlcXVlc3QgVVJJLiBUaGUgc291cmNlIGJsb2IgbXVzdCBlaXRoZXIgYmUgcHVibGljXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBvciBtdXN0IGJlIGF1dGhlbnRpY2F0ZWQgdmlhIGEgc2hhcmVkIGFjY2VzcyBzaWduYXR1cmUuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgc291cmNlIGJsb2IgaXMgcHVibGljLCBubyBhdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLiBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIHNvdXJjZSBvYmplY3QgVVJMczpcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gaHR0cHM6Ly9teWFjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L215Y29udGFpbmVyL215YmxvYlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBodHRwczovL215YWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvbXljb250YWluZXIvbXlibG9iP3NuYXBzaG90PTxEYXRlVGltZT5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgYXN5bmMgc3luY1VwbG9hZEZyb21VUkwoc291cmNlVVJMLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvY2tCbG9iQ2xpZW50LXN5bmNVcGxvYWRGcm9tVVJMXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZW5zdXJlQ3BrSWZTcGVjaWZpZWQob3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCB0aGlzLmlzSHR0cHMpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYmxvY2tCbG9iQ29udGV4dC5wdXRCbG9iRnJvbVVybCgwLCBzb3VyY2VVUkwsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSwgeyBibG9iSHR0cEhlYWRlcnM6IG9wdGlvbnMuYmxvYkhUVFBIZWFkZXJzLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiBvcHRpb25zLmNvbmRpdGlvbnMudGFnQ29uZGl0aW9ucyB9KSwgc291cmNlTW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmTWF0Y2g6IChfYSA9IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlmTWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmTW9kaWZpZWRTaW5jZTogKF9iID0gb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VJZk5vbmVNYXRjaDogKF9jID0gb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuaWZOb25lTWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmVW5tb2RpZmllZFNpbmNlOiAoX2QgPSBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZUYWdzOiAoX2UgPSBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS50YWdDb25kaXRpb25zLFxuICAgICAgICAgICAgICAgIH0sIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgY29weVNvdXJjZUF1dGhvcml6YXRpb246IGh0dHBBdXRob3JpemF0aW9uVG9TdHJpbmcob3B0aW9ucy5zb3VyY2VBdXRob3JpemF0aW9uKSwgdGllcjogdG9BY2Nlc3NUaWVyKG9wdGlvbnMudGllciksIGJsb2JUYWdzU3RyaW5nOiB0b0Jsb2JUYWdzU3RyaW5nKG9wdGlvbnMudGFncyksIGNvcHlTb3VyY2VUYWdzOiBvcHRpb25zLmNvcHlTb3VyY2VUYWdzIH0pLCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGxvYWRzIHRoZSBzcGVjaWZpZWQgYmxvY2sgdG8gdGhlIGJsb2NrIGJsb2IncyBcInN0YWdpbmcgYXJlYVwiIHRvIGJlIGxhdGVyXG4gICAgICogY29tbWl0dGVkIGJ5IGEgY2FsbCB0byBjb21taXRCbG9ja0xpc3QuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvcHV0LWJsb2NrXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYmxvY2tJZCAtIEEgNjQtYnl0ZSB2YWx1ZSB0aGF0IGlzIGJhc2U2NC1lbmNvZGVkXG4gICAgICogQHBhcmFtIGJvZHkgLSBEYXRhIHRvIHVwbG9hZCB0byB0aGUgc3RhZ2luZyBhcmVhLlxuICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIC0gTnVtYmVyIG9mIGJ5dGVzIHRvIHVwbG9hZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIEJsb2NrIEJsb2IgU3RhZ2UgQmxvY2sgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHRoZSBCbG9jayBCbG9iIFN0YWdlIEJsb2NrIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBzdGFnZUJsb2NrKGJsb2NrSWQsIGJvZHksIGNvbnRlbnRMZW5ndGgsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvY2tCbG9iQ2xpZW50LXN0YWdlQmxvY2tcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbnN1cmVDcGtJZlNwZWNpZmllZChvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIHRoaXMuaXNIdHRwcyk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ibG9ja0Jsb2JDb250ZXh0LnN0YWdlQmxvY2soYmxvY2tJZCwgY29udGVudExlbmd0aCwgYm9keSwgT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgcmVxdWVzdE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgb25VcGxvYWRQcm9ncmVzczogb3B0aW9ucy5vblByb2dyZXNzLFxuICAgICAgICAgICAgICAgIH0sIHRyYW5zYWN0aW9uYWxDb250ZW50TUQ1OiBvcHRpb25zLnRyYW5zYWN0aW9uYWxDb250ZW50TUQ1LCB0cmFuc2FjdGlvbmFsQ29udGVudENyYzY0OiBvcHRpb25zLnRyYW5zYWN0aW9uYWxDb250ZW50Q3JjNjQsIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgZW5jcnlwdGlvblNjb3BlOiBvcHRpb25zLmVuY3J5cHRpb25TY29wZSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgU3RhZ2UgQmxvY2sgRnJvbSBVUkwgb3BlcmF0aW9uIGNyZWF0ZXMgYSBuZXcgYmxvY2sgdG8gYmUgY29tbWl0dGVkIGFzIHBhcnRcbiAgICAgKiBvZiBhIGJsb2Igd2hlcmUgdGhlIGNvbnRlbnRzIGFyZSByZWFkIGZyb20gYSBVUkwuXG4gICAgICogVGhpcyBBUEkgaXMgYXZhaWxhYmxlIHN0YXJ0aW5nIGluIHZlcnNpb24gMjAxOC0wMy0yOC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9wdXQtYmxvY2stZnJvbS11cmxcbiAgICAgKlxuICAgICAqIEBwYXJhbSBibG9ja0lkIC0gQSA2NC1ieXRlIHZhbHVlIHRoYXQgaXMgYmFzZTY0LWVuY29kZWRcbiAgICAgKiBAcGFyYW0gc291cmNlVVJMIC0gU3BlY2lmaWVzIHRoZSBVUkwgb2YgdGhlIGJsb2IuIFRoZSB2YWx1ZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGJlIGEgVVJMIG9mIHVwIHRvIDIgS0IgaW4gbGVuZ3RoIHRoYXQgc3BlY2lmaWVzIGEgYmxvYi5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBzaG91bGQgYmUgVVJMLWVuY29kZWQgYXMgaXQgd291bGQgYXBwZWFyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhIHJlcXVlc3QgVVJJLiBUaGUgc291cmNlIGJsb2IgbXVzdCBlaXRoZXIgYmUgcHVibGljXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBvciBtdXN0IGJlIGF1dGhlbnRpY2F0ZWQgdmlhIGEgc2hhcmVkIGFjY2VzcyBzaWduYXR1cmUuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgc291cmNlIGJsb2IgaXMgcHVibGljLCBubyBhdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLiBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIHNvdXJjZSBvYmplY3QgVVJMczpcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gaHR0cHM6Ly9teWFjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L215Y29udGFpbmVyL215YmxvYlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBodHRwczovL215YWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvbXljb250YWluZXIvbXlibG9iP3NuYXBzaG90PTxEYXRlVGltZT5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gRnJvbSB3aGljaCBwb3NpdGlvbiBvZiB0aGUgYmxvYiB0byBkb3dubG9hZCwgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDBcbiAgICAgKiBAcGFyYW0gY291bnQgLSBIb3cgbXVjaCBkYXRhIHRvIGJlIGRvd25sb2FkZWQsIGdyZWF0ZXIgdGhhbiAwLiBXaWxsIGRvd25sb2FkIHRvIHRoZSBlbmQgd2hlbiB1bmRlZmluZWRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIEJsb2NrIEJsb2IgU3RhZ2UgQmxvY2sgRnJvbSBVUkwgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHRoZSBCbG9jayBCbG9iIFN0YWdlIEJsb2NrIEZyb20gVVJMIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBzdGFnZUJsb2NrRnJvbVVSTChibG9ja0lkLCBzb3VyY2VVUkwsIG9mZnNldCA9IDAsIGNvdW50LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2NrQmxvYkNsaWVudC1zdGFnZUJsb2NrRnJvbVVSTFwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVuc3VyZUNwa0lmU3BlY2lmaWVkKG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgdGhpcy5pc0h0dHBzKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJsb2NrQmxvYkNvbnRleHQuc3RhZ2VCbG9ja0Zyb21VUkwoYmxvY2tJZCwgMCwgc291cmNlVVJMLCBPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBzb3VyY2VDb250ZW50TUQ1OiBvcHRpb25zLnNvdXJjZUNvbnRlbnRNRDUsIHNvdXJjZUNvbnRlbnRDcmM2NDogb3B0aW9ucy5zb3VyY2VDb250ZW50Q3JjNjQsIHNvdXJjZVJhbmdlOiBvZmZzZXQgPT09IDAgJiYgIWNvdW50ID8gdW5kZWZpbmVkIDogcmFuZ2VUb1N0cmluZyh7IG9mZnNldCwgY291bnQgfSksIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgZW5jcnlwdGlvblNjb3BlOiBvcHRpb25zLmVuY3J5cHRpb25TY29wZSwgY29weVNvdXJjZUF1dGhvcml6YXRpb246IGh0dHBBdXRob3JpemF0aW9uVG9TdHJpbmcob3B0aW9ucy5zb3VyY2VBdXRob3JpemF0aW9uKSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBibG9iIGJ5IHNwZWNpZnlpbmcgdGhlIGxpc3Qgb2YgYmxvY2sgSURzIHRoYXQgbWFrZSB1cCB0aGUgYmxvYi5cbiAgICAgKiBJbiBvcmRlciB0byBiZSB3cml0dGVuIGFzIHBhcnQgb2YgYSBibG9iLCBhIGJsb2NrIG11c3QgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSB3cml0dGVuXG4gICAgICogdG8gdGhlIHNlcnZlciBpbiBhIHByaW9yIHtAbGluayBzdGFnZUJsb2NrfSBvcGVyYXRpb24uIFlvdSBjYW4gY2FsbCB7QGxpbmsgY29tbWl0QmxvY2tMaXN0fSB0b1xuICAgICAqIHVwZGF0ZSBhIGJsb2IgYnkgdXBsb2FkaW5nIG9ubHkgdGhvc2UgYmxvY2tzIHRoYXQgaGF2ZSBjaGFuZ2VkLCB0aGVuIGNvbW1pdHRpbmcgdGhlIG5ldyBhbmQgZXhpc3RpbmdcbiAgICAgKiBibG9ja3MgdG9nZXRoZXIuIEFueSBibG9ja3Mgbm90IHNwZWNpZmllZCBpbiB0aGUgYmxvY2sgbGlzdCBhbmQgcGVybWFuZW50bHkgZGVsZXRlZC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9wdXQtYmxvY2stbGlzdFxuICAgICAqXG4gICAgICogQHBhcmFtIGJsb2NrcyAtICBBcnJheSBvZiA2NC1ieXRlIHZhbHVlIHRoYXQgaXMgYmFzZTY0LWVuY29kZWRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIEJsb2NrIEJsb2IgQ29tbWl0IEJsb2NrIExpc3Qgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHRoZSBCbG9jayBCbG9iIENvbW1pdCBCbG9jayBMaXN0IG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBjb21taXRCbG9ja0xpc3QoYmxvY2tzLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2NrQmxvYkNsaWVudC1jb21taXRCbG9ja0xpc3RcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbnN1cmVDcGtJZlNwZWNpZmllZChvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIHRoaXMuaXNIdHRwcyk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ibG9ja0Jsb2JDb250ZXh0LmNvbW1pdEJsb2NrTGlzdCh7IGxhdGVzdDogYmxvY2tzIH0sIE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgYmxvYkh0dHBIZWFkZXJzOiBvcHRpb25zLmJsb2JIVFRQSGVhZGVycywgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgZW5jcnlwdGlvblNjb3BlOiBvcHRpb25zLmVuY3J5cHRpb25TY29wZSwgaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJ5OiAoX2IgPSBvcHRpb25zLmltbXV0YWJpbGl0eVBvbGljeSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmV4cGlyaWVzT24sIGltbXV0YWJpbGl0eVBvbGljeU1vZGU6IChfYyA9IG9wdGlvbnMuaW1tdXRhYmlsaXR5UG9saWN5KSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MucG9saWN5TW9kZSwgbGVnYWxIb2xkOiBvcHRpb25zLmxlZ2FsSG9sZCwgdGllcjogdG9BY2Nlc3NUaWVyKG9wdGlvbnMudGllciksIGJsb2JUYWdzU3RyaW5nOiB0b0Jsb2JUYWdzU3RyaW5nKG9wdGlvbnMudGFncykgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBibG9ja3MgdGhhdCBoYXZlIGJlZW4gdXBsb2FkZWQgYXMgcGFydCBvZiBhIGJsb2NrIGJsb2JcbiAgICAgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGJsb2NrIGxpc3QgZmlsdGVyLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2dldC1ibG9jay1saXN0XG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGlzdFR5cGUgLSBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlIGxpc3Qgb2YgY29tbWl0dGVkIGJsb2NrcyxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGlzdCBvZiB1bmNvbW1pdHRlZCBibG9ja3MsIG9yIGJvdGggbGlzdHMgdG9nZXRoZXIuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBCbG9jayBCbG9iIEdldCBCbG9jayBMaXN0IG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgQmxvY2sgQmxvYiBHZXQgQmxvY2sgTGlzdCBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgZ2V0QmxvY2tMaXN0KGxpc3RUeXBlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvY2tCbG9iQ2xpZW50LWdldEJsb2NrTGlzdFwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuYmxvY2tCbG9iQ29udGV4dC5nZXRCbG9ja0xpc3QobGlzdFR5cGUsIE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICAgICAgaWYgKCFyZXMuY29tbWl0dGVkQmxvY2tzKSB7XG4gICAgICAgICAgICAgICAgcmVzLmNvbW1pdHRlZEJsb2NrcyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFyZXMudW5jb21taXR0ZWRCbG9ja3MpIHtcbiAgICAgICAgICAgICAgICByZXMudW5jb21taXR0ZWRCbG9ja3MgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEhpZ2ggbGV2ZWwgZnVuY3Rpb25zXG4gICAgLyoqXG4gICAgICogVXBsb2FkcyBhIEJ1ZmZlcihOb2RlLmpzKS9CbG9iKGJyb3dzZXJzKS9BcnJheUJ1ZmZlci9BcnJheUJ1ZmZlclZpZXcgb2JqZWN0IHRvIGEgQmxvY2tCbG9iLlxuICAgICAqXG4gICAgICogV2hlbiBkYXRhIGxlbmd0aCBpcyBubyBtb3JlIHRoYW4gdGhlIHNwZWNpZmlsZWQge0BsaW5rIEJsb2NrQmxvYlBhcmFsbGVsVXBsb2FkT3B0aW9ucy5tYXhTaW5nbGVTaG90U2l6ZX0gKGRlZmF1bHQgaXNcbiAgICAgKiB7QGxpbmsgQkxPQ0tfQkxPQl9NQVhfVVBMT0FEX0JMT0JfQllURVN9KSwgdGhpcyBtZXRob2Qgd2lsbCB1c2UgMSB7QGxpbmsgdXBsb2FkfSBjYWxsIHRvIGZpbmlzaCB0aGUgdXBsb2FkLlxuICAgICAqIE90aGVyd2lzZSwgdGhpcyBtZXRob2Qgd2lsbCBjYWxsIHtAbGluayBzdGFnZUJsb2NrfSB0byB1cGxvYWQgYmxvY2tzLCBhbmQgZmluYWxseSBjYWxsIHtAbGluayBjb21taXRCbG9ja0xpc3R9XG4gICAgICogdG8gY29tbWl0IHRoZSBibG9jayBsaXN0LlxuICAgICAqXG4gICAgICogQSBjb21tb24ge0BsaW5rIEJsb2NrQmxvYlBhcmFsbGVsVXBsb2FkT3B0aW9ucy5ibG9iSFRUUEhlYWRlcnN9IG9wdGlvbiB0byBzZXQgaXNcbiAgICAgKiBgYmxvYkNvbnRlbnRUeXBlYCwgZW5hYmxpbmcgdGhlIGJyb3dzZXIgdG8gcHJvdmlkZVxuICAgICAqIGZ1bmN0aW9uYWxpdHkgYmFzZWQgb24gZmlsZSB0eXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGEgLSBCdWZmZXIoTm9kZS5qcyksIEJsb2IsIEFycmF5QnVmZmVyIG9yIEFycmF5QnVmZmVyVmlld1xuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBhc3luYyB1cGxvYWREYXRhKGRhdGEsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvY2tCbG9iQ2xpZW50LXVwbG9hZERhdGFcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoaXNOb2RlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGJ1ZmZlcjtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBkYXRhO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gQnVmZmVyLmZyb20oZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gQnVmZmVyLmZyb20oZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgZGF0YS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBsb2FkU2Vla2FibGVJbnRlcm5hbCgob2Zmc2V0LCBzaXplKSA9PiBidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBzaXplKSwgYnVmZmVyLmJ5dGVMZW5ndGgsIHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJyb3dzZXJCbG9iID0gbmV3IEJsb2IoW2RhdGFdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51cGxvYWRTZWVrYWJsZUludGVybmFsKChvZmZzZXQsIHNpemUpID0+IGJyb3dzZXJCbG9iLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgc2l6ZSksIGJyb3dzZXJCbG9iLnNpemUsIHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogT05MWSBBVkFJTEFCTEUgSU4gQlJPV1NFUlMuXG4gICAgICpcbiAgICAgKiBVcGxvYWRzIGEgYnJvd3NlciBCbG9iL0ZpbGUvQXJyYXlCdWZmZXIvQXJyYXlCdWZmZXJWaWV3IG9iamVjdCB0byBibG9jayBibG9iLlxuICAgICAqXG4gICAgICogV2hlbiBidWZmZXIgbGVuZ3RoIGxlc3NlciB0aGFuIG9yIGVxdWFsIHRvIDI1Nk1CLCB0aGlzIG1ldGhvZCB3aWxsIHVzZSAxIHVwbG9hZCBjYWxsIHRvIGZpbmlzaCB0aGUgdXBsb2FkLlxuICAgICAqIE90aGVyd2lzZSwgdGhpcyBtZXRob2Qgd2lsbCBjYWxsIHtAbGluayBzdGFnZUJsb2NrfSB0byB1cGxvYWQgYmxvY2tzLCBhbmQgZmluYWxseSBjYWxsXG4gICAgICoge0BsaW5rIGNvbW1pdEJsb2NrTGlzdH0gdG8gY29tbWl0IHRoZSBibG9jayBsaXN0LlxuICAgICAqXG4gICAgICogQSBjb21tb24ge0BsaW5rIEJsb2NrQmxvYlBhcmFsbGVsVXBsb2FkT3B0aW9ucy5ibG9iSFRUUEhlYWRlcnN9IG9wdGlvbiB0byBzZXQgaXNcbiAgICAgKiBgYmxvYkNvbnRlbnRUeXBlYCwgZW5hYmxpbmcgdGhlIGJyb3dzZXIgdG8gcHJvdmlkZVxuICAgICAqIGZ1bmN0aW9uYWxpdHkgYmFzZWQgb24gZmlsZSB0eXBlLlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayB1cGxvYWREYXRhfSBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGJyb3dzZXJEYXRhIC0gQmxvYiwgRmlsZSwgQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3XG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHVwbG9hZCBicm93c2VyIGRhdGEuXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIEJsb2IgVXBsb2FkIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyB1cGxvYWRCcm93c2VyRGF0YShicm93c2VyRGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9ja0Jsb2JDbGllbnQtdXBsb2FkQnJvd3NlckRhdGFcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBicm93c2VyQmxvYiA9IG5ldyBCbG9iKFticm93c2VyRGF0YV0pO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXBsb2FkU2Vla2FibGVJbnRlcm5hbCgob2Zmc2V0LCBzaXplKSA9PiBicm93c2VyQmxvYi5zbGljZShvZmZzZXQsIG9mZnNldCArIHNpemUpLCBicm93c2VyQmxvYi5zaXplLCB1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqXG4gICAgICogVXBsb2FkcyBkYXRhIHRvIGJsb2NrIGJsb2IuIFJlcXVpcmVzIGEgYm9keUZhY3RvcnkgYXMgdGhlIGRhdGEgc291cmNlLFxuICAgICAqIHdoaWNoIG5lZWQgdG8gcmV0dXJuIGEge0BsaW5rIEh0dHBSZXF1ZXN0Qm9keX0gb2JqZWN0IHdpdGggdGhlIG9mZnNldCBhbmQgc2l6ZSBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIFdoZW4gZGF0YSBsZW5ndGggaXMgbm8gbW9yZSB0aGFuIHRoZSBzcGVjaWZpZWQge0BsaW5rIEJsb2NrQmxvYlBhcmFsbGVsVXBsb2FkT3B0aW9ucy5tYXhTaW5nbGVTaG90U2l6ZX0gKGRlZmF1bHQgaXNcbiAgICAgKiB7QGxpbmsgQkxPQ0tfQkxPQl9NQVhfVVBMT0FEX0JMT0JfQllURVN9KSwgdGhpcyBtZXRob2Qgd2lsbCB1c2UgMSB7QGxpbmsgdXBsb2FkfSBjYWxsIHRvIGZpbmlzaCB0aGUgdXBsb2FkLlxuICAgICAqIE90aGVyd2lzZSwgdGhpcyBtZXRob2Qgd2lsbCBjYWxsIHtAbGluayBzdGFnZUJsb2NrfSB0byB1cGxvYWQgYmxvY2tzLCBhbmQgZmluYWxseSBjYWxsIHtAbGluayBjb21taXRCbG9ja0xpc3R9XG4gICAgICogdG8gY29tbWl0IHRoZSBibG9jayBsaXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGJvZHlGYWN0b3J5IC1cbiAgICAgKiBAcGFyYW0gc2l6ZSAtIHNpemUgb2YgdGhlIGRhdGEgdG8gdXBsb2FkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBVcGxvYWQgdG8gQmxvY2sgQmxvYiBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIEJsb2IgVXBsb2FkIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyB1cGxvYWRTZWVrYWJsZUludGVybmFsKGJvZHlGYWN0b3J5LCBzaXplLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCFvcHRpb25zLmJsb2NrU2l6ZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5ibG9ja1NpemUgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmJsb2NrU2l6ZSA8IDAgfHwgb3B0aW9ucy5ibG9ja1NpemUgPiBCTE9DS19CTE9CX01BWF9TVEFHRV9CTE9DS19CWVRFUykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYGJsb2NrU2l6ZSBvcHRpb24gbXVzdCBiZSA+PSAwIGFuZCA8PSAke0JMT0NLX0JMT0JfTUFYX1NUQUdFX0JMT0NLX0JZVEVTfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLm1heFNpbmdsZVNob3RTaXplICE9PSAwICYmICFvcHRpb25zLm1heFNpbmdsZVNob3RTaXplKSB7XG4gICAgICAgICAgICBvcHRpb25zLm1heFNpbmdsZVNob3RTaXplID0gQkxPQ0tfQkxPQl9NQVhfVVBMT0FEX0JMT0JfQllURVM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMubWF4U2luZ2xlU2hvdFNpemUgPCAwIHx8XG4gICAgICAgICAgICBvcHRpb25zLm1heFNpbmdsZVNob3RTaXplID4gQkxPQ0tfQkxPQl9NQVhfVVBMT0FEX0JMT0JfQllURVMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBtYXhTaW5nbGVTaG90U2l6ZSBvcHRpb24gbXVzdCBiZSA+PSAwIGFuZCA8PSAke0JMT0NLX0JMT0JfTUFYX1VQTE9BRF9CTE9CX0JZVEVTfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmJsb2NrU2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHNpemUgPiBCTE9DS19CTE9CX01BWF9TVEFHRV9CTE9DS19CWVRFUyAqIEJMT0NLX0JMT0JfTUFYX0JMT0NLUykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGAke3NpemV9IGlzIHRvbyBsYXJnZXIgdG8gdXBsb2FkIHRvIGEgYmxvY2sgYmxvYi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaXplID4gb3B0aW9ucy5tYXhTaW5nbGVTaG90U2l6ZSkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuYmxvY2tTaXplID0gTWF0aC5jZWlsKHNpemUgLyBCTE9DS19CTE9CX01BWF9CTE9DS1MpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2NrU2l6ZSA8IERFRkFVTFRfQkxPQl9ET1dOTE9BRF9CTE9DS19CWVRFUykge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmJsb2NrU2l6ZSA9IERFRkFVTFRfQkxPQl9ET1dOTE9BRF9CTE9DS19CWVRFUztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcHRpb25zLmJsb2JIVFRQSGVhZGVycykge1xuICAgICAgICAgICAgb3B0aW9ucy5ibG9iSFRUUEhlYWRlcnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdGlvbnMuY29uZGl0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2NrQmxvYkNsaWVudC11cGxvYWRTZWVrYWJsZUludGVybmFsXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHNpemUgPD0gb3B0aW9ucy5tYXhTaW5nbGVTaG90U2l6ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVwbG9hZChib2R5RmFjdG9yeSgwLCBzaXplKSwgc2l6ZSwgdXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbnVtQmxvY2tzID0gTWF0aC5mbG9vcigoc2l6ZSAtIDEpIC8gb3B0aW9ucy5ibG9ja1NpemUpICsgMTtcbiAgICAgICAgICAgIGlmIChudW1CbG9ja3MgPiBCTE9DS19CTE9CX01BWF9CTE9DS1MpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlIGJ1ZmZlcidzIHNpemUgaXMgdG9vIGJpZyBvciB0aGUgQmxvY2tTaXplIGlzIHRvbyBzbWFsbDtgICtcbiAgICAgICAgICAgICAgICAgICAgYHRoZSBudW1iZXIgb2YgYmxvY2tzIG11c3QgYmUgPD0gJHtCTE9DS19CTE9CX01BWF9CTE9DS1N9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBibG9ja0xpc3QgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrSURQcmVmaXggPSBnZW5lcmF0ZVV1aWQoKTtcbiAgICAgICAgICAgIGxldCB0cmFuc2ZlclByb2dyZXNzID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGJhdGNoID0gbmV3IEJhdGNoKG9wdGlvbnMuY29uY3VycmVuY3kpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1CbG9ja3M7IGkrKykge1xuICAgICAgICAgICAgICAgIGJhdGNoLmFkZE9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrSUQgPSBnZW5lcmF0ZUJsb2NrSUQoYmxvY2tJRFByZWZpeCwgaSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gb3B0aW9ucy5ibG9ja1NpemUgKiBpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSBpID09PSBudW1CbG9ja3MgLSAxID8gc2l6ZSA6IHN0YXJ0ICsgb3B0aW9ucy5ibG9ja1NpemU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRMZW5ndGggPSBlbmQgLSBzdGFydDtcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tMaXN0LnB1c2goYmxvY2tJRCk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RhZ2VCbG9jayhibG9ja0lELCBib2R5RmFjdG9yeShzdGFydCwgY29udGVudExlbmd0aCksIGNvbnRlbnRMZW5ndGgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvblNjb3BlOiBvcHRpb25zLmVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBwcm9ncmVzcyBhZnRlciBibG9jayBpcyBzdWNjZXNzZnVsbHkgdXBsb2FkZWQgdG8gc2VydmVyLCBpbiBjYXNlIG9mIGJsb2NrIHRyeWluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBIb29rIHdpdGggY29udmVuaWVuY2UgbGF5ZXIgcHJvZ3Jlc3MgZXZlbnQgaW4gZmluZXIgbGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJQcm9ncmVzcyArPSBjb250ZW50TGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5vblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uUHJvZ3Jlc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZEJ5dGVzOiB0cmFuc2ZlclByb2dyZXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IGJhdGNoLmRvKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21taXRCbG9ja0xpc3QoYmxvY2tMaXN0LCB1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAgICAgKlxuICAgICAqIFVwbG9hZHMgYSBsb2NhbCBmaWxlIGluIGJsb2NrcyB0byBhIGJsb2NrIGJsb2IuXG4gICAgICpcbiAgICAgKiBXaGVuIGZpbGUgc2l6ZSBsZXNzZXIgdGhhbiBvciBlcXVhbCB0byAyNTZNQiwgdGhpcyBtZXRob2Qgd2lsbCB1c2UgMSB1cGxvYWQgY2FsbCB0byBmaW5pc2ggdGhlIHVwbG9hZC5cbiAgICAgKiBPdGhlcndpc2UsIHRoaXMgbWV0aG9kIHdpbGwgY2FsbCBzdGFnZUJsb2NrIHRvIHVwbG9hZCBibG9ja3MsIGFuZCBmaW5hbGx5IGNhbGwgY29tbWl0QmxvY2tMaXN0XG4gICAgICogdG8gY29tbWl0IHRoZSBibG9jayBsaXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpbGVQYXRoIC0gRnVsbCBwYXRoIG9mIGxvY2FsIGZpbGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gVXBsb2FkIHRvIEJsb2NrIEJsb2Igb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHRoZSBCbG9iIFVwbG9hZCBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgdXBsb2FkRmlsZShmaWxlUGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9ja0Jsb2JDbGllbnQtdXBsb2FkRmlsZVwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSAoYXdhaXQgZnNTdGF0KGZpbGVQYXRoKSkuc2l6ZTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVwbG9hZFNlZWthYmxlSW50ZXJuYWwoKG9mZnNldCwgY291bnQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4gZnNDcmVhdGVSZWFkU3RyZWFtKGZpbGVQYXRoLCB7XG4gICAgICAgICAgICAgICAgICAgIGF1dG9DbG9zZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBjb3VudCA/IG9mZnNldCArIGNvdW50IC0gMSA6IEluZmluaXR5LFxuICAgICAgICAgICAgICAgICAgICBzdGFydDogb2Zmc2V0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgc2l6ZSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSwgeyB0cmFjaW5nT3B0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLnRyYWNpbmdPcHRpb25zKSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICAgICAqXG4gICAgICogVXBsb2FkcyBhIE5vZGUuanMgUmVhZGFibGUgc3RyZWFtIGludG8gYmxvY2sgYmxvYi5cbiAgICAgKlxuICAgICAqIFBFUkZPUk1BTkNFIElNUFJPVkVNRU5UIFRJUFM6XG4gICAgICogKiBJbnB1dCBzdHJlYW0gaGlnaFdhdGVyTWFyayBpcyBiZXR0ZXIgdG8gc2V0IGEgc2FtZSB2YWx1ZSB3aXRoIGJ1ZmZlclNpemVcbiAgICAgKiAgICBwYXJhbWV0ZXIsIHdoaWNoIHdpbGwgYXZvaWQgQnVmZmVyLmNvbmNhdCgpIG9wZXJhdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RyZWFtIC0gTm9kZS5qcyBSZWFkYWJsZSBzdHJlYW1cbiAgICAgKiBAcGFyYW0gYnVmZmVyU2l6ZSAtIFNpemUgb2YgZXZlcnkgYnVmZmVyIGFsbG9jYXRlZCwgYWxzbyB0aGUgYmxvY2sgc2l6ZSBpbiB0aGUgdXBsb2FkZWQgYmxvY2sgYmxvYi4gRGVmYXVsdCB2YWx1ZSBpcyA4TUJcbiAgICAgKiBAcGFyYW0gbWF4Q29uY3VycmVuY3kgLSAgTWF4IGNvbmN1cnJlbmN5IGluZGljYXRlcyB0aGUgbWF4IG51bWJlciBvZiBidWZmZXJzIHRoYXQgY2FuIGJlIGFsbG9jYXRlZCxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlIGNvcnJlbGF0aW9uIHdpdGggbWF4IHVwbG9hZGluZyBjb25jdXJyZW5jeS4gRGVmYXVsdCB2YWx1ZSBpcyA1XG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIFVwbG9hZCBTdHJlYW0gdG8gQmxvY2sgQmxvYiBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIEJsb2IgVXBsb2FkIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyB1cGxvYWRTdHJlYW0oc3RyZWFtLCBidWZmZXJTaXplID0gREVGQVVMVF9CTE9DS19CVUZGRVJfU0laRV9CWVRFUywgbWF4Q29uY3VycmVuY3kgPSA1LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCFvcHRpb25zLmJsb2JIVFRQSGVhZGVycykge1xuICAgICAgICAgICAgb3B0aW9ucy5ibG9iSFRUUEhlYWRlcnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdGlvbnMuY29uZGl0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2NrQmxvYkNsaWVudC11cGxvYWRTdHJlYW1cIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYmxvY2tOdW0gPSAwO1xuICAgICAgICAgICAgY29uc3QgYmxvY2tJRFByZWZpeCA9IGdlbmVyYXRlVXVpZCgpO1xuICAgICAgICAgICAgbGV0IHRyYW5zZmVyUHJvZ3Jlc3MgPSAwO1xuICAgICAgICAgICAgY29uc3QgYmxvY2tMaXN0ID0gW107XG4gICAgICAgICAgICBjb25zdCBzY2hlZHVsZXIgPSBuZXcgQnVmZmVyU2NoZWR1bGVyKHN0cmVhbSwgYnVmZmVyU2l6ZSwgbWF4Q29uY3VycmVuY3ksIGFzeW5jIChib2R5LCBsZW5ndGgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBibG9ja0lEID0gZ2VuZXJhdGVCbG9ja0lEKGJsb2NrSURQcmVmaXgsIGJsb2NrTnVtKTtcbiAgICAgICAgICAgICAgICBibG9ja0xpc3QucHVzaChibG9ja0lEKTtcbiAgICAgICAgICAgICAgICBibG9ja051bSsrO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RhZ2VCbG9jayhibG9ja0lELCBib2R5LCBsZW5ndGgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IG9wdGlvbnMuZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHByb2dyZXNzIGFmdGVyIGJsb2NrIGlzIHN1Y2Nlc3NmdWxseSB1cGxvYWRlZCB0byBzZXJ2ZXIsIGluIGNhc2Ugb2YgYmxvY2sgdHJ5aW5nXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJQcm9ncmVzcyArPSBsZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMub25Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uUHJvZ3Jlc3MoeyBsb2FkZWRCeXRlczogdHJhbnNmZXJQcm9ncmVzcyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIC8vIGNvbmN1cnJlbmN5IHNob3VsZCBzZXQgYSBzbWFsbGVyIHZhbHVlIHRoYW4gbWF4Q29uY3VycmVuY3ksIHdoaWNoIGlzIGhlbHBmdWwgdG9cbiAgICAgICAgICAgIC8vIHJlZHVjZSB0aGUgcG9zc2liaWxpdHkgd2hlbiBhIG91dGdvaW5nIGhhbmRsZXIgd2FpdHMgZm9yIHN0cmVhbSBkYXRhLCBpblxuICAgICAgICAgICAgLy8gdGhpcyBzaXR1YXRpb24sIG91dGdvaW5nIGhhbmRsZXJzIGFyZSBibG9ja2VkLlxuICAgICAgICAgICAgLy8gT3V0Z29pbmcgcXVldWUgc2hvdWxkbid0IGJlIGVtcHR5LlxuICAgICAgICAgICAgTWF0aC5jZWlsKChtYXhDb25jdXJyZW5jeSAvIDQpICogMykpO1xuICAgICAgICAgICAgYXdhaXQgc2NoZWR1bGVyLmRvKCk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb21taXRCbG9ja0xpc3QoYmxvY2tMaXN0LCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB7IHRyYWNpbmdPcHRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMudHJhY2luZ09wdGlvbnMpLCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogUGFnZUJsb2JDbGllbnQgZGVmaW5lcyBhIHNldCBvZiBvcGVyYXRpb25zIGFwcGxpY2FibGUgdG8gcGFnZSBibG9icy5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VCbG9iQ2xpZW50IGV4dGVuZHMgQmxvYkNsaWVudCB7XG4gICAgY29uc3RydWN0b3IodXJsT3JDb25uZWN0aW9uU3RyaW5nLCBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSwgYmxvYk5hbWVPck9wdGlvbnMsIFxuICAgIC8vIExlZ2FjeSwgbm8gZml4IGZvciBlc2xpbnQgZXJyb3Igd2l0aG91dCBicmVha2luZy4gRGlzYWJsZSBpdCBmb3IgdGhpcyBpbnRlcmZhY2UuXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhenVyZS9henVyZS1zZGsvdHMtbmFtaW5nLW9wdGlvbnMqL1xuICAgIG9wdGlvbnMpIHtcbiAgICAgICAgLy8gSW4gVHlwZVNjcmlwdCB3ZSBjYW5ub3Qgc2ltcGx5IHBhc3MgYWxsIHBhcmFtZXRlcnMgdG8gc3VwZXIoKSBsaWtlIGJlbG93IHNvIGhhdmUgdG8gZHVwbGljYXRlIHRoZSBjb2RlIGluc3RlYWQuXG4gICAgICAgIC8vICAgc3VwZXIocywgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWVPck9wdGlvbnMsIGJsb2JOYW1lT3JPcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgbGV0IHBpcGVsaW5lO1xuICAgICAgICBsZXQgdXJsO1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgaWYgKGlzUGlwZWxpbmVMaWtlKGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lKSkge1xuICAgICAgICAgICAgLy8gKHVybDogc3RyaW5nLCBwaXBlbGluZTogUGlwZWxpbmUpXG4gICAgICAgICAgICB1cmwgPSB1cmxPckNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICAgICAgICBwaXBlbGluZSA9IGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChpc05vZGUgJiYgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgaW5zdGFuY2VvZiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCkgfHxcbiAgICAgICAgICAgIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lIGluc3RhbmNlb2YgQW5vbnltb3VzQ3JlZGVudGlhbCB8fFxuICAgICAgICAgICAgaXNUb2tlbkNyZWRlbnRpYWwoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUpKSB7XG4gICAgICAgICAgICAvLyAodXJsOiBzdHJpbmcsIGNyZWRlbnRpYWw/OiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCB8IEFub255bW91c0NyZWRlbnRpYWwgfCBUb2tlbkNyZWRlbnRpYWwsIG9wdGlvbnM/OiBTdG9yYWdlUGlwZWxpbmVPcHRpb25zKVxuICAgICAgICAgICAgdXJsID0gdXJsT3JDb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgb3B0aW9ucyA9IGJsb2JOYW1lT3JPcHRpb25zO1xuICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lICYmXG4gICAgICAgICAgICB0eXBlb2YgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIC8vICh1cmw6IHN0cmluZywgY3JlZGVudGlhbD86IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsIHwgQW5vbnltb3VzQ3JlZGVudGlhbCB8IFRva2VuQ3JlZGVudGlhbCwgb3B0aW9ucz86IFN0b3JhZ2VQaXBlbGluZU9wdGlvbnMpXG4gICAgICAgICAgICAvLyBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuIFVzZSBhbm9ueW1vdXMgY3JlZGVudGlhbC5cbiAgICAgICAgICAgIHVybCA9IHVybE9yQ29ubmVjdGlvblN0cmluZztcbiAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUobmV3IEFub255bW91c0NyZWRlbnRpYWwoKSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgYmxvYk5hbWVPck9wdGlvbnMgJiZcbiAgICAgICAgICAgIHR5cGVvZiBibG9iTmFtZU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgLy8gKGNvbm5lY3Rpb25TdHJpbmc6IHN0cmluZywgY29udGFpbmVyTmFtZTogc3RyaW5nLCBibG9iTmFtZTogc3RyaW5nLCBvcHRpb25zPzogU3RvcmFnZVBpcGVsaW5lT3B0aW9ucylcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWUgPSBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGJsb2JOYW1lID0gYmxvYk5hbWVPck9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCBleHRyYWN0ZWRDcmVkcyA9IGV4dHJhY3RDb25uZWN0aW9uU3RyaW5nUGFydHModXJsT3JDb25uZWN0aW9uU3RyaW5nKTtcbiAgICAgICAgICAgIGlmIChleHRyYWN0ZWRDcmVkcy5raW5kID09PSBcIkFjY291bnRDb25uU3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZEtleUNyZWRlbnRpYWwgPSBuZXcgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwoZXh0cmFjdGVkQ3JlZHMuYWNjb3VudE5hbWUsIGV4dHJhY3RlZENyZWRzLmFjY291bnRLZXkpO1xuICAgICAgICAgICAgICAgICAgICB1cmwgPSBhcHBlbmRUb1VSTFBhdGgoYXBwZW5kVG9VUkxQYXRoKGV4dHJhY3RlZENyZWRzLnVybCwgZW5jb2RlVVJJQ29tcG9uZW50KGNvbnRhaW5lck5hbWUpKSwgZW5jb2RlVVJJQ29tcG9uZW50KGJsb2JOYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5wcm94eU9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHJveHlPcHRpb25zID0gZ2V0RGVmYXVsdFByb3h5U2V0dGluZ3MoZXh0cmFjdGVkQ3JlZHMucHJveHlVcmkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUoc2hhcmVkS2V5Q3JlZGVudGlhbCwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBY2NvdW50IGNvbm5lY3Rpb24gc3RyaW5nIGlzIG9ubHkgc3VwcG9ydGVkIGluIE5vZGUuanMgZW52aXJvbm1lbnRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXh0cmFjdGVkQ3JlZHMua2luZCA9PT0gXCJTQVNDb25uU3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICB1cmwgPVxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRUb1VSTFBhdGgoYXBwZW5kVG9VUkxQYXRoKGV4dHJhY3RlZENyZWRzLnVybCwgZW5jb2RlVVJJQ29tcG9uZW50KGNvbnRhaW5lck5hbWUpKSwgZW5jb2RlVVJJQ29tcG9uZW50KGJsb2JOYW1lKSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCI/XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdGVkQ3JlZHMuYWNjb3VudFNhcztcbiAgICAgICAgICAgICAgICBwaXBlbGluZSA9IG5ld1BpcGVsaW5lKG5ldyBBbm9ueW1vdXNDcmVkZW50aWFsKCksIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ubmVjdGlvbiBzdHJpbmcgbXVzdCBiZSBlaXRoZXIgYW4gQWNjb3VudCBjb25uZWN0aW9uIHN0cmluZyBvciBhIFNBUyBjb25uZWN0aW9uIHN0cmluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGluZyBub24tZW1wdHkgc3RyaW5ncyBmb3IgY29udGFpbmVyTmFtZSBhbmQgYmxvYk5hbWUgcGFyYW1ldGVyc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcih1cmwsIHBpcGVsaW5lKTtcbiAgICAgICAgdGhpcy5wYWdlQmxvYkNvbnRleHQgPSBuZXcgUGFnZUJsb2IodGhpcy5zdG9yYWdlQ2xpZW50Q29udGV4dCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgUGFnZUJsb2JDbGllbnQgb2JqZWN0IGlkZW50aWNhbCB0byB0aGUgc291cmNlIGJ1dCB3aXRoIHRoZVxuICAgICAqIHNwZWNpZmllZCBzbmFwc2hvdCB0aW1lc3RhbXAuXG4gICAgICogUHJvdmlkZSBcIlwiIHdpbGwgcmVtb3ZlIHRoZSBzbmFwc2hvdCBhbmQgcmV0dXJuIGEgQ2xpZW50IHRvIHRoZSBiYXNlIGJsb2IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc25hcHNob3QgLSBUaGUgc25hcHNob3QgdGltZXN0YW1wLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IFBhZ2VCbG9iQ2xpZW50IG9iamVjdCBpZGVudGljYWwgdG8gdGhlIHNvdXJjZSBidXQgd2l0aCB0aGUgc3BlY2lmaWVkIHNuYXBzaG90IHRpbWVzdGFtcC5cbiAgICAgKi9cbiAgICB3aXRoU25hcHNob3Qoc25hcHNob3QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQmxvYkNsaWVudChzZXRVUkxQYXJhbWV0ZXIodGhpcy51cmwsIFVSTENvbnN0YW50cy5QYXJhbWV0ZXJzLlNOQVBTSE9ULCBzbmFwc2hvdC5sZW5ndGggPT09IDAgPyB1bmRlZmluZWQgOiBzbmFwc2hvdCksIHRoaXMucGlwZWxpbmUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcGFnZSBibG9iIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLiBDYWxsIHVwbG9hZFBhZ2VzIHRvIHVwbG9hZCBkYXRhXG4gICAgICogZGF0YSB0byBhIHBhZ2UgYmxvYi5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9wdXQtYmxvYlxuICAgICAqXG4gICAgICogQHBhcmFtIHNpemUgLSBzaXplIG9mIHRoZSBwYWdlIGJsb2IuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBQYWdlIEJsb2IgQ3JlYXRlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgUGFnZSBCbG9iIENyZWF0ZSBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlKHNpemUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiUGFnZUJsb2JDbGllbnQtY3JlYXRlXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZW5zdXJlQ3BrSWZTcGVjaWZpZWQob3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCB0aGlzLmlzSHR0cHMpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucGFnZUJsb2JDb250ZXh0LmNyZWF0ZSgwLCBzaXplLCBPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGJsb2JIdHRwSGVhZGVyczogb3B0aW9ucy5ibG9iSFRUUEhlYWRlcnMsIGJsb2JTZXF1ZW5jZU51bWJlcjogb3B0aW9ucy5ibG9iU2VxdWVuY2VOdW1iZXIsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSwgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLCBjcGtJbmZvOiBvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIGVuY3J5cHRpb25TY29wZTogb3B0aW9ucy5lbmNyeXB0aW9uU2NvcGUsIGltbXV0YWJpbGl0eVBvbGljeUV4cGlyeTogKF9iID0gb3B0aW9ucy5pbW11dGFiaWxpdHlQb2xpY3kpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5leHBpcmllc09uLCBpbW11dGFiaWxpdHlQb2xpY3lNb2RlOiAoX2MgPSBvcHRpb25zLmltbXV0YWJpbGl0eVBvbGljeSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnBvbGljeU1vZGUsIGxlZ2FsSG9sZDogb3B0aW9ucy5sZWdhbEhvbGQsIHRpZXI6IHRvQWNjZXNzVGllcihvcHRpb25zLnRpZXIpLCBibG9iVGFnc1N0cmluZzogdG9CbG9iVGFnc1N0cmluZyhvcHRpb25zLnRhZ3MpIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBwYWdlIGJsb2Igb2YgdGhlIHNwZWNpZmllZCBsZW5ndGguIENhbGwgdXBsb2FkUGFnZXMgdG8gdXBsb2FkIGRhdGFcbiAgICAgKiBkYXRhIHRvIGEgcGFnZSBibG9iLiBJZiB0aGUgYmxvYiB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMsIHRoZSBjb250ZW50XG4gICAgICogb2YgdGhlIGV4aXN0aW5nIGJsb2Igd2lsbCByZW1haW4gdW5jaGFuZ2VkLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL3B1dC1ibG9iXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2l6ZSAtIHNpemUgb2YgdGhlIHBhZ2UgYmxvYi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlSWZOb3RFeGlzdHMoc2l6ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJQYWdlQmxvYkNsaWVudC1jcmVhdGVJZk5vdEV4aXN0c1wiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB7IGlmTm9uZU1hdGNoOiBFVGFnQW55IH07XG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNyZWF0ZShzaXplLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGNvbmRpdGlvbnMsIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyB9KSk7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgc3VjY2VlZGVkOiB0cnVlIH0sIHJlcyksIHsgX3Jlc3BvbnNlOiByZXMuX3Jlc3BvbnNlIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoKChfYSA9IGUuZGV0YWlscykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmVycm9yQ29kZSkgPT09IFwiQmxvYkFscmVhZHlFeGlzdHNcIikge1xuICAgICAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiRXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gY3JlYXRpbmcgYSBibG9iIG9ubHkgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC5cIixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgc3VjY2VlZGVkOiBmYWxzZSB9LCAoX2IgPSBlLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucGFyc2VkSGVhZGVycyksIHsgX3Jlc3BvbnNlOiBlLnJlc3BvbnNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIDEgb3IgbW9yZSBwYWdlcyB0byB0aGUgcGFnZSBibG9iLiBUaGUgc3RhcnQgYW5kIGVuZCBvZmZzZXRzIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA1MTIuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvcHV0LXBhZ2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSBib2R5IC0gRGF0YSB0byB1cGxvYWRcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gT2Zmc2V0IG9mIGRlc3RpbmF0aW9uIHBhZ2UgYmxvYlxuICAgICAqIEBwYXJhbSBjb3VudCAtIENvbnRlbnQgbGVuZ3RoIG9mIHRoZSBib2R5LCBhbHNvIG51bWJlciBvZiBieXRlcyB0byBiZSB1cGxvYWRlZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgUGFnZSBCbG9iIFVwbG9hZCBQYWdlcyBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIFBhZ2UgQmxvYiBVcGxvYWQgUGFnZXMgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHVwbG9hZFBhZ2VzKGJvZHksIG9mZnNldCwgY291bnQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIlBhZ2VCbG9iQ2xpZW50LXVwbG9hZFBhZ2VzXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZW5zdXJlQ3BrSWZTcGVjaWZpZWQob3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCB0aGlzLmlzSHR0cHMpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucGFnZUJsb2JDb250ZXh0LnVwbG9hZFBhZ2VzKGNvdW50LCBib2R5LCBPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksIHJlcXVlc3RPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIG9uVXBsb2FkUHJvZ3Jlc3M6IG9wdGlvbnMub25Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgICB9LCByYW5nZTogcmFuZ2VUb1N0cmluZyh7IG9mZnNldCwgY291bnQgfSksIHNlcXVlbmNlTnVtYmVyQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCB0cmFuc2FjdGlvbmFsQ29udGVudE1ENTogb3B0aW9ucy50cmFuc2FjdGlvbmFsQ29udGVudE1ENSwgdHJhbnNhY3Rpb25hbENvbnRlbnRDcmM2NDogb3B0aW9ucy50cmFuc2FjdGlvbmFsQ29udGVudENyYzY0LCBjcGtJbmZvOiBvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIGVuY3J5cHRpb25TY29wZTogb3B0aW9ucy5lbmNyeXB0aW9uU2NvcGUgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIFVwbG9hZCBQYWdlcyBvcGVyYXRpb24gd3JpdGVzIGEgcmFuZ2Ugb2YgcGFnZXMgdG8gYSBwYWdlIGJsb2Igd2hlcmUgdGhlXG4gICAgICogY29udGVudHMgYXJlIHJlYWQgZnJvbSBhIFVSTC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9wdXQtcGFnZS1mcm9tLXVybFxuICAgICAqXG4gICAgICogQHBhcmFtIHNvdXJjZVVSTCAtIFNwZWNpZnkgYSBVUkwgdG8gdGhlIGNvcHkgc291cmNlLCBTaGFyZWQgQWNjZXNzIFNpZ25hdHVyZShTQVMpIG1heWJlIG5lZWRlZCBmb3IgYXV0aGVudGljYXRpb25cbiAgICAgKiBAcGFyYW0gc291cmNlT2Zmc2V0IC0gVGhlIHNvdXJjZSBvZmZzZXQgdG8gY29weSBmcm9tLiBQYXNzIDAgdG8gY29weSBmcm9tIHRoZSBiZWdpbm5pbmcgb2Ygc291cmNlIHBhZ2UgYmxvYlxuICAgICAqIEBwYXJhbSBkZXN0T2Zmc2V0IC0gT2Zmc2V0IG9mIGRlc3RpbmF0aW9uIHBhZ2UgYmxvYlxuICAgICAqIEBwYXJhbSBjb3VudCAtIE51bWJlciBvZiBieXRlcyB0byBiZSB1cGxvYWRlZCBmcm9tIHNvdXJjZSBwYWdlIGJsb2JcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgYXN5bmMgdXBsb2FkUGFnZXNGcm9tVVJMKHNvdXJjZVVSTCwgc291cmNlT2Zmc2V0LCBkZXN0T2Zmc2V0LCBjb3VudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMgPSBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJQYWdlQmxvYkNsaWVudC11cGxvYWRQYWdlc0Zyb21VUkxcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbnN1cmVDcGtJZlNwZWNpZmllZChvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIHRoaXMuaXNIdHRwcyk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wYWdlQmxvYkNvbnRleHQudXBsb2FkUGFnZXNGcm9tVVJMKHNvdXJjZVVSTCwgcmFuZ2VUb1N0cmluZyh7IG9mZnNldDogc291cmNlT2Zmc2V0LCBjb3VudCB9KSwgMCwgcmFuZ2VUb1N0cmluZyh7IG9mZnNldDogZGVzdE9mZnNldCwgY291bnQgfSksIE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgc291cmNlQ29udGVudE1ENTogb3B0aW9ucy5zb3VyY2VDb250ZW50TUQ1LCBzb3VyY2VDb250ZW50Q3JjNjQ6IG9wdGlvbnMuc291cmNlQ29udGVudENyYzY0LCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgc2VxdWVuY2VOdW1iZXJBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSwgc291cmNlTW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmTWF0Y2g6IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucy5pZk1hdGNoLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VJZk1vZGlmaWVkU2luY2U6IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmTm9uZU1hdGNoOiBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMuaWZOb25lTWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmVW5tb2RpZmllZFNpbmNlOiBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgICAgICAgICAgfSwgY3BrSW5mbzogb3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCBlbmNyeXB0aW9uU2NvcGU6IG9wdGlvbnMuZW5jcnlwdGlvblNjb3BlLCBjb3B5U291cmNlQXV0aG9yaXphdGlvbjogaHR0cEF1dGhvcml6YXRpb25Ub1N0cmluZyhvcHRpb25zLnNvdXJjZUF1dGhvcml6YXRpb24pIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZyZWVzIHRoZSBzcGVjaWZpZWQgcGFnZXMgZnJvbSB0aGUgcGFnZSBibG9iLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL3B1dC1wYWdlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gU3RhcnRpbmcgYnl0ZSBwb3NpdGlvbiBvZiB0aGUgcGFnZXMgdG8gY2xlYXIuXG4gICAgICogQHBhcmFtIGNvdW50IC0gTnVtYmVyIG9mIGJ5dGVzIHRvIGNsZWFyLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgUGFnZSBCbG9iIENsZWFyIFBhZ2VzIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgUGFnZSBCbG9iIENsZWFyIFBhZ2VzIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBjbGVhclBhZ2VzKG9mZnNldCA9IDAsIGNvdW50LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJQYWdlQmxvYkNsaWVudC1jbGVhclBhZ2VzXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucGFnZUJsb2JDb250ZXh0LmNsZWFyUGFnZXMoMCwgT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLCByYW5nZTogcmFuZ2VUb1N0cmluZyh7IG9mZnNldCwgY291bnQgfSksIHNlcXVlbmNlTnVtYmVyQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBjcGtJbmZvOiBvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIGVuY3J5cHRpb25TY29wZTogb3B0aW9ucy5lbmNyeXB0aW9uU2NvcGUgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiB2YWxpZCBwYWdlIHJhbmdlcyBmb3IgYSBwYWdlIGJsb2Igb3Igc25hcHNob3Qgb2YgYSBwYWdlIGJsb2IuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZ2V0LXBhZ2UtcmFuZ2VzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gU3RhcnRpbmcgYnl0ZSBwb3NpdGlvbiBvZiB0aGUgcGFnZSByYW5nZXMuXG4gICAgICogQHBhcmFtIGNvdW50IC0gTnVtYmVyIG9mIGJ5dGVzIHRvIGdldC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIFBhZ2UgQmxvYiBHZXQgUmFuZ2VzIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgUGFnZSBCbG9iIEdldCBSYW5nZXMgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFBhZ2VSYW5nZXMob2Zmc2V0ID0gMCwgY291bnQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIlBhZ2VCbG9iQ2xpZW50LWdldFBhZ2VSYW5nZXNcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wYWdlQmxvYkNvbnRleHRcbiAgICAgICAgICAgICAgICAuZ2V0UGFnZVJhbmdlcyhPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksIHJhbmdlOiByYW5nZVRvU3RyaW5nKHsgb2Zmc2V0LCBjb3VudCB9KSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpXG4gICAgICAgICAgICAgICAgLnRoZW4ocmFuZ2VSZXNwb25zZUZyb21Nb2RlbCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGdldFBhZ2VSYW5nZXNTZWdtZW50IHJldHVybnMgYSBzaW5nbGUgc2VnbWVudCBvZiBwYWdlIHJhbmdlcyBzdGFydGluZyBmcm9tIHRoZVxuICAgICAqIHNwZWNpZmllZCBNYXJrZXIuIFVzZSBhbiBlbXB0eSBNYXJrZXIgdG8gc3RhcnQgZW51bWVyYXRpb24gZnJvbSB0aGUgYmVnaW5uaW5nLlxuICAgICAqIEFmdGVyIGdldHRpbmcgYSBzZWdtZW50LCBwcm9jZXNzIGl0LCBhbmQgdGhlbiBjYWxsIGdldFBhZ2VSYW5nZXNTZWdtZW50IGFnYWluXG4gICAgICogKHBhc3NpbmcgdGhlIHRoZSBwcmV2aW91c2x5LXJldHVybmVkIE1hcmtlcikgdG8gZ2V0IHRoZSBuZXh0IHNlZ21lbnQuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZ2V0LXBhZ2UtcmFuZ2VzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gU3RhcnRpbmcgYnl0ZSBwb3NpdGlvbiBvZiB0aGUgcGFnZSByYW5nZXMuXG4gICAgICogQHBhcmFtIGNvdW50IC0gTnVtYmVyIG9mIGJ5dGVzIHRvIGdldC5cbiAgICAgKiBAcGFyYW0gbWFya2VyIC0gQSBzdHJpbmcgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSBwb3J0aW9uIG9mIHRoZSBsaXN0IHRvIGJlIHJldHVybmVkIHdpdGggdGhlIG5leHQgbGlzdCBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIFBhZ2VCbG9iIEdldCBQYWdlIFJhbmdlcyBTZWdtZW50IG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBsaXN0UGFnZVJhbmdlc1NlZ21lbnQob2Zmc2V0ID0gMCwgY291bnQsIG1hcmtlciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIlBhZ2VCbG9iQ2xpZW50LWdldFBhZ2VSYW5nZXNTZWdtZW50XCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucGFnZUJsb2JDb250ZXh0LmdldFBhZ2VSYW5nZXMoT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLCByYW5nZTogcmFuZ2VUb1N0cmluZyh7IG9mZnNldCwgY291bnQgfSksIG1hcmtlcjogbWFya2VyLCBtYXhQYWdlU2l6ZTogb3B0aW9ucy5tYXhQYWdlU2l6ZSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvciBmb3Ige0BsaW5rIFBhZ2VCbG9iR2V0UGFnZVJhbmdlc1Jlc3BvbnNlTW9kZWx9XG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gU3RhcnRpbmcgYnl0ZSBwb3NpdGlvbiBvZiB0aGUgcGFnZSByYW5nZXMuXG4gICAgICogQHBhcmFtIGNvdW50IC0gTnVtYmVyIG9mIGJ5dGVzIHRvIGdldC5cbiAgICAgKiBAcGFyYW0gbWFya2VyIC0gQSBzdHJpbmcgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSBwb3J0aW9uIG9mXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBnZXQgb2YgcGFnZSByYW5nZXMgdG8gYmUgcmV0dXJuZWQgd2l0aCB0aGUgbmV4dCBnZXR0aW5nIG9wZXJhdGlvbi4gVGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBDb250aW51YXRpb25Ub2tlbiB2YWx1ZSB3aXRoaW4gdGhlIHJlc3BvbnNlIGJvZHkgaWYgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGdldHRpbmcgb3BlcmF0aW9uIGRpZCBub3QgcmV0dXJuIGFsbCBwYWdlIHJhbmdlcyByZW1haW5pbmcgd2l0aGluIHRoZSBjdXJyZW50IHBhZ2UuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBDb250aW51YXRpb25Ub2tlbiB2YWx1ZSBjYW4gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXJrZXIgcGFyYW1ldGVyIGluIGEgc3Vic2VxdWVudCBjYWxsIHRvIHJlcXVlc3QgdGhlIG5leHQgcGFnZSBvZiBnZXRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuIFRoZSBtYXJrZXIgdmFsdWUgaXMgb3BhcXVlIHRvIHRoZSBjbGllbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIExpc3QgUGFnZSBSYW5nZXMgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGxpc3RQYWdlUmFuZ2VJdGVtU2VnbWVudHMob2Zmc2V0ID0gMCwgY291bnQsIG1hcmtlciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIGxpc3RQYWdlUmFuZ2VJdGVtU2VnbWVudHNfMSgpIHtcbiAgICAgICAgICAgIGxldCBnZXRQYWdlUmFuZ2VJdGVtU2VnbWVudHNSZXNwb25zZTtcbiAgICAgICAgICAgIGlmICghIW1hcmtlciB8fCBtYXJrZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFnZVJhbmdlSXRlbVNlZ21lbnRzUmVzcG9uc2UgPSB5aWVsZCBfX2F3YWl0KHRoaXMubGlzdFBhZ2VSYW5nZXNTZWdtZW50KG9mZnNldCwgY291bnQsIG1hcmtlciwgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICBtYXJrZXIgPSBnZXRQYWdlUmFuZ2VJdGVtU2VnbWVudHNSZXNwb25zZS5jb250aW51YXRpb25Ub2tlbjtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgeWllbGQgX19hd2FpdCh5aWVsZCBfX2F3YWl0KGdldFBhZ2VSYW5nZUl0ZW1TZWdtZW50c1Jlc3BvbnNlKSk7XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAobWFya2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIG9mIHtAbGluayBQYWdlUmFuZ2VJbmZvfSBvYmplY3RzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gU3RhcnRpbmcgYnl0ZSBwb3NpdGlvbiBvZiB0aGUgcGFnZSByYW5nZXMuXG4gICAgICogQHBhcmFtIGNvdW50IC0gTnVtYmVyIG9mIGJ5dGVzIHRvIGdldC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gTGlzdCBQYWdlIFJhbmdlcyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgbGlzdFBhZ2VSYW5nZUl0ZW1zKG9mZnNldCA9IDAsIGNvdW50LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogbGlzdFBhZ2VSYW5nZUl0ZW1zXzEoKSB7XG4gICAgICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgICAgIGxldCBtYXJrZXI7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9iID0gX19hc3luY1ZhbHVlcyh0aGlzLmxpc3RQYWdlUmFuZ2VJdGVtU2VnbWVudHMob2Zmc2V0LCBjb3VudCwgbWFya2VyLCBvcHRpb25zKSksIF9jOyBfYyA9IHlpZWxkIF9fYXdhaXQoX2IubmV4dCgpKSwgIV9jLmRvbmU7KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdldFBhZ2VSYW5nZXNTZWdtZW50ID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIF9fYXdhaXQoeWllbGQqIF9fYXN5bmNEZWxlZ2F0b3IoX19hc3luY1ZhbHVlcyhFeHRyYWN0UGFnZVJhbmdlSW5mb0l0ZW1zKGdldFBhZ2VSYW5nZXNTZWdtZW50KSkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIHlpZWxkIF9fYXdhaXQoX2EuY2FsbChfYikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFzeW5jIGl0ZXJhYmxlIGl0ZXJhdG9yIHRvIGxpc3Qgb2YgcGFnZSByYW5nZXMgZm9yIGEgcGFnZSBibG9iLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2dldC1wYWdlLXJhbmdlc1xuICAgICAqXG4gICAgICogIC5ieVBhZ2UoKSByZXR1cm5zIGFuIGFzeW5jIGl0ZXJhYmxlIGl0ZXJhdG9yIHRvIGxpc3Qgb2YgcGFnZSByYW5nZXMgZm9yIGEgcGFnZSBibG9iLlxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBgZm9yIGF3YWl0YCBzeW50YXg6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIEdldCB0aGUgcGFnZUJsb2JDbGllbnQgYmVmb3JlIHlvdSBydW4gdGhlc2Ugc25pcHBldHMsXG4gICAgICogLy8gQ2FuIGJlIG9idGFpbmVkIGZyb20gYGJsb2JTZXJ2aWNlQ2xpZW50LmdldENvbnRhaW5lckNsaWVudChcIjx5b3VyLWNvbnRhaW5lci1uYW1lPlwiKS5nZXRQYWdlQmxvYkNsaWVudChcIjx5b3VyLWJsb2ItbmFtZT5cIik7YFxuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBmb3IgYXdhaXQgKGNvbnN0IHBhZ2VSYW5nZSBvZiBwYWdlQmxvYkNsaWVudC5saXN0UGFnZVJhbmdlcygpKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgUGFnZSByYW5nZSAke2krK306ICR7cGFnZVJhbmdlLnN0YXJ0fSAtICR7cGFnZVJhbmdlLmVuZH1gKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGBpdGVyLm5leHQoKWA6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBsZXQgaXRlciA9IHBhZ2VCbG9iQ2xpZW50Lmxpc3RQYWdlUmFuZ2VzKCk7XG4gICAgICogbGV0IHBhZ2VSYW5nZUl0ZW0gPSBhd2FpdCBpdGVyLm5leHQoKTtcbiAgICAgKiB3aGlsZSAoIXBhZ2VSYW5nZUl0ZW0uZG9uZSkge1xuICAgICAqICAgY29uc29sZS5sb2coYFBhZ2UgcmFuZ2UgJHtpKyt9OiAke3BhZ2VSYW5nZUl0ZW0udmFsdWUuc3RhcnR9IC0gJHtwYWdlUmFuZ2VJdGVtLnZhbHVlLmVuZH0sIElzQ2xlYXI6ICR7cGFnZVJhbmdlSXRlbS52YWx1ZS5pc0NsZWFyfWApO1xuICAgICAqICAgcGFnZVJhbmdlSXRlbSA9IGF3YWl0IGl0ZXIubmV4dCgpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGJ5UGFnZSgpYDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gcGFzc2luZyBvcHRpb25hbCBtYXhQYWdlU2l6ZSBpbiB0aGUgcGFnZSBzZXR0aW5nc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBmb3IgYXdhaXQgKGNvbnN0IHJlc3BvbnNlIG9mIHBhZ2VCbG9iQ2xpZW50Lmxpc3RQYWdlUmFuZ2VzKCkuYnlQYWdlKHsgbWF4UGFnZVNpemU6IDIwIH0pKSB7XG4gICAgICogICBmb3IgKGNvbnN0IHBhZ2VSYW5nZSBvZiByZXNwb25zZSkge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhgUGFnZSByYW5nZSAke2krK306ICR7cGFnZVJhbmdlLnN0YXJ0fSAtICR7cGFnZVJhbmdlLmVuZH1gKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIHBhZ2luZyB3aXRoIGEgbWFya2VyOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogbGV0IGl0ZXJhdG9yID0gcGFnZUJsb2JDbGllbnQubGlzdFBhZ2VSYW5nZXMoKS5ieVBhZ2UoeyBtYXhQYWdlU2l6ZTogMiB9KTtcbiAgICAgKiBsZXQgcmVzcG9uc2UgPSAoYXdhaXQgaXRlcmF0b3IubmV4dCgpKS52YWx1ZTtcbiAgICAgKlxuICAgICAqIC8vIFByaW50cyAyIHBhZ2UgcmFuZ2VzXG4gICAgICogZm9yIChjb25zdCBwYWdlUmFuZ2Ugb2YgcmVzcG9uc2UpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBQYWdlIHJhbmdlICR7aSsrfTogJHtwYWdlUmFuZ2Uuc3RhcnR9IC0gJHtwYWdlUmFuZ2UuZW5kfWApO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIEdldHMgbmV4dCBtYXJrZXJcbiAgICAgKiBsZXQgbWFya2VyID0gcmVzcG9uc2UuY29udGludWF0aW9uVG9rZW47XG4gICAgICpcbiAgICAgKiAvLyBQYXNzaW5nIG5leHQgbWFya2VyIGFzIGNvbnRpbnVhdGlvblRva2VuXG4gICAgICpcbiAgICAgKiBpdGVyYXRvciA9IHBhZ2VCbG9iQ2xpZW50Lmxpc3RQYWdlUmFuZ2VzKCkuYnlQYWdlKHsgY29udGludWF0aW9uVG9rZW46IG1hcmtlciwgbWF4UGFnZVNpemU6IDEwIH0pO1xuICAgICAqIHJlc3BvbnNlID0gKGF3YWl0IGl0ZXJhdG9yLm5leHQoKSkudmFsdWU7XG4gICAgICpcbiAgICAgKiAvLyBQcmludHMgMTAgcGFnZSByYW5nZXNcbiAgICAgKiBmb3IgKGNvbnN0IGJsb2Igb2YgcmVzcG9uc2UpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBQYWdlIHJhbmdlICR7aSsrfTogJHtwYWdlUmFuZ2Uuc3RhcnR9IC0gJHtwYWdlUmFuZ2UuZW5kfWApO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gU3RhcnRpbmcgYnl0ZSBwb3NpdGlvbiBvZiB0aGUgcGFnZSByYW5nZXMuXG4gICAgICogQHBhcmFtIGNvdW50IC0gTnVtYmVyIG9mIGJ5dGVzIHRvIGdldC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIFBhZ2UgQmxvYiBHZXQgUmFuZ2VzIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBBbiBhc3luY0l0ZXJhYmxlSXRlcmF0b3IgdGhhdCBzdXBwb3J0cyBwYWdpbmcuXG4gICAgICovXG4gICAgbGlzdFBhZ2VSYW5nZXMob2Zmc2V0ID0gMCwgY291bnQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIC8vIEFzeW5jSXRlcmFibGVJdGVyYXRvciB0byBpdGVyYXRlIG92ZXIgYmxvYnNcbiAgICAgICAgY29uc3QgaXRlciA9IHRoaXMubGlzdFBhZ2VSYW5nZUl0ZW1zKG9mZnNldCwgY291bnQsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUaGUgbmV4dCBtZXRob2QsIHBhcnQgb2YgdGhlIGl0ZXJhdGlvbiBwcm90b2NvbFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBuZXh0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyLm5leHQoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBjb25uZWN0aW9uIHRvIHRoZSBhc3luYyBpdGVyYXRvciwgcGFydCBvZiB0aGUgaXRlcmF0aW9uIHByb3RvY29sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBSZXR1cm4gYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRoYXQgd29ya3MgYSBwYWdlIGF0IGEgdGltZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBieVBhZ2U6IChzZXR0aW5ncyA9IHt9KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGlzdFBhZ2VSYW5nZUl0ZW1TZWdtZW50cyhvZmZzZXQsIGNvdW50LCBzZXR0aW5ncy5jb250aW51YXRpb25Ub2tlbiwgT2JqZWN0LmFzc2lnbih7IG1heFBhZ2VTaXplOiBzZXR0aW5ncy5tYXhQYWdlU2l6ZSB9LCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb2xsZWN0aW9uIG9mIHBhZ2UgcmFuZ2VzIHRoYXQgZGlmZmVyIGJldHdlZW4gYSBzcGVjaWZpZWQgc25hcHNob3QgYW5kIHRoaXMgcGFnZSBibG9iLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2dldC1wYWdlLXJhbmdlc1xuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCAtIFN0YXJ0aW5nIGJ5dGUgcG9zaXRpb24gb2YgdGhlIHBhZ2UgYmxvYlxuICAgICAqIEBwYXJhbSBjb3VudCAtIE51bWJlciBvZiBieXRlcyB0byBnZXQgcmFuZ2VzIGRpZmYuXG4gICAgICogQHBhcmFtIHByZXZTbmFwc2hvdCAtIFRpbWVzdGFtcCBvZiBzbmFwc2hvdCB0byByZXRyaWV2ZSB0aGUgZGlmZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIFBhZ2UgQmxvYiBHZXQgUGFnZSBSYW5nZXMgRGlmZiBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIFBhZ2UgQmxvYiBHZXQgUGFnZSBSYW5nZSBEaWZmIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRQYWdlUmFuZ2VzRGlmZihvZmZzZXQsIGNvdW50LCBwcmV2U25hcHNob3QsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIlBhZ2VCbG9iQ2xpZW50LWdldFBhZ2VSYW5nZXNEaWZmXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucGFnZUJsb2JDb250ZXh0XG4gICAgICAgICAgICAgICAgLmdldFBhZ2VSYW5nZXNEaWZmKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSwgcHJldnNuYXBzaG90OiBwcmV2U25hcHNob3QsIHJhbmdlOiByYW5nZVRvU3RyaW5nKHsgb2Zmc2V0LCBjb3VudCB9KSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpXG4gICAgICAgICAgICAgICAgLnRoZW4ocmFuZ2VSZXNwb25zZUZyb21Nb2RlbCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGdldFBhZ2VSYW5nZXNEaWZmU2VnbWVudCByZXR1cm5zIGEgc2luZ2xlIHNlZ21lbnQgb2YgcGFnZSByYW5nZXMgc3RhcnRpbmcgZnJvbSB0aGVcbiAgICAgKiBzcGVjaWZpZWQgTWFya2VyIGZvciBkaWZmZXJlbmNlIGJldHdlZW4gcHJldmlvdXMgc25hcHNob3QgYW5kIHRoZSB0YXJnZXQgcGFnZSBibG9iLlxuICAgICAqIFVzZSBhbiBlbXB0eSBNYXJrZXIgdG8gc3RhcnQgZW51bWVyYXRpb24gZnJvbSB0aGUgYmVnaW5uaW5nLlxuICAgICAqIEFmdGVyIGdldHRpbmcgYSBzZWdtZW50LCBwcm9jZXNzIGl0LCBhbmQgdGhlbiBjYWxsIGdldFBhZ2VSYW5nZXNEaWZmU2VnbWVudCBhZ2FpblxuICAgICAqIChwYXNzaW5nIHRoZSB0aGUgcHJldmlvdXNseS1yZXR1cm5lZCBNYXJrZXIpIHRvIGdldCB0aGUgbmV4dCBzZWdtZW50LlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2dldC1wYWdlLXJhbmdlc1xuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCAtIFN0YXJ0aW5nIGJ5dGUgcG9zaXRpb24gb2YgdGhlIHBhZ2UgcmFuZ2VzLlxuICAgICAqIEBwYXJhbSBjb3VudCAtIE51bWJlciBvZiBieXRlcyB0byBnZXQuXG4gICAgICogQHBhcmFtIHByZXZTbmFwc2hvdE9yVXJsIC0gVGltZXN0YW1wIG9mIHNuYXBzaG90IHRvIHJldHJpZXZlIHRoZSBkaWZmZXJlbmNlIG9yIFVSTCBvZiBzbmFwc2hvdCB0byByZXRyaWV2ZSB0aGUgZGlmZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0gbWFya2VyIC0gQSBzdHJpbmcgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSBwb3J0aW9uIG9mIHRoZSBnZXQgdG8gYmUgcmV0dXJuZWQgd2l0aCB0aGUgbmV4dCBnZXQgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgUGFnZSBCbG9iIEdldCBQYWdlIFJhbmdlcyBEaWZmIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBsaXN0UGFnZVJhbmdlc0RpZmZTZWdtZW50KG9mZnNldCwgY291bnQsIHByZXZTbmFwc2hvdE9yVXJsLCBtYXJrZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiUGFnZUJsb2JDbGllbnQtZ2V0UGFnZVJhbmdlc0RpZmZTZWdtZW50XCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucGFnZUJsb2JDb250ZXh0LmdldFBhZ2VSYW5nZXNEaWZmKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmFib3J0U2lnbmFsLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jb25kaXRpb25zLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLCBwcmV2c25hcHNob3Q6IHByZXZTbmFwc2hvdE9yVXJsLCByYW5nZTogcmFuZ2VUb1N0cmluZyh7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogb2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICBjb3VudDogY291bnQsXG4gICAgICAgICAgICAgICAgfSksIG1hcmtlcjogbWFya2VyLCBtYXhQYWdlU2l6ZTogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm1heFBhZ2VTaXplIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIGZvciB7QGxpbmsgUGFnZUJsb2JHZXRQYWdlUmFuZ2VzRGlmZlJlc3BvbnNlTW9kZWx9XG4gICAgICpcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBTdGFydGluZyBieXRlIHBvc2l0aW9uIG9mIHRoZSBwYWdlIHJhbmdlcy5cbiAgICAgKiBAcGFyYW0gY291bnQgLSBOdW1iZXIgb2YgYnl0ZXMgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSBwcmV2U25hcHNob3RPclVybCAtIFRpbWVzdGFtcCBvZiBzbmFwc2hvdCB0byByZXRyaWV2ZSB0aGUgZGlmZmVyZW5jZSBvciBVUkwgb2Ygc25hcHNob3QgdG8gcmV0cmlldmUgdGhlIGRpZmZlcmVuY2UuXG4gICAgICogQHBhcmFtIG1hcmtlciAtIEEgc3RyaW5nIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgcG9ydGlvbiBvZlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZ2V0IG9mIHBhZ2UgcmFuZ2VzIHRvIGJlIHJldHVybmVkIHdpdGggdGhlIG5leHQgZ2V0dGluZyBvcGVyYXRpb24uIFRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gcmV0dXJucyB0aGUgQ29udGludWF0aW9uVG9rZW4gdmFsdWUgd2l0aGluIHRoZSByZXNwb25zZSBib2R5IGlmIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBnZXR0aW5nIG9wZXJhdGlvbiBkaWQgbm90IHJldHVybiBhbGwgcGFnZSByYW5nZXMgcmVtYWluaW5nIHdpdGhpbiB0aGUgY3VycmVudCBwYWdlLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgQ29udGludWF0aW9uVG9rZW4gdmFsdWUgY2FuIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFya2VyIHBhcmFtZXRlciBpbiBhIHN1YnNlcXVlbnQgY2FsbCB0byByZXF1ZXN0IHRoZSBuZXh0IHBhZ2Ugb2YgZ2V0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLiBUaGUgbWFya2VyIHZhbHVlIGlzIG9wYXF1ZSB0byB0aGUgY2xpZW50LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgUGFnZSBCbG9iIEdldCBQYWdlIFJhbmdlcyBEaWZmIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBsaXN0UGFnZVJhbmdlRGlmZkl0ZW1TZWdtZW50cyhvZmZzZXQsIGNvdW50LCBwcmV2U25hcHNob3RPclVybCwgbWFya2VyLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIGxpc3RQYWdlUmFuZ2VEaWZmSXRlbVNlZ21lbnRzXzEoKSB7XG4gICAgICAgICAgICBsZXQgZ2V0UGFnZVJhbmdlSXRlbVNlZ21lbnRzUmVzcG9uc2U7XG4gICAgICAgICAgICBpZiAoISFtYXJrZXIgfHwgbWFya2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIGdldFBhZ2VSYW5nZUl0ZW1TZWdtZW50c1Jlc3BvbnNlID0geWllbGQgX19hd2FpdCh0aGlzLmxpc3RQYWdlUmFuZ2VzRGlmZlNlZ21lbnQob2Zmc2V0LCBjb3VudCwgcHJldlNuYXBzaG90T3JVcmwsIG1hcmtlciwgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICBtYXJrZXIgPSBnZXRQYWdlUmFuZ2VJdGVtU2VnbWVudHNSZXNwb25zZS5jb250aW51YXRpb25Ub2tlbjtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgeWllbGQgX19hd2FpdCh5aWVsZCBfX2F3YWl0KGdldFBhZ2VSYW5nZUl0ZW1TZWdtZW50c1Jlc3BvbnNlKSk7XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAobWFya2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIG9mIHtAbGluayBQYWdlUmFuZ2VJbmZvfSBvYmplY3RzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gU3RhcnRpbmcgYnl0ZSBwb3NpdGlvbiBvZiB0aGUgcGFnZSByYW5nZXMuXG4gICAgICogQHBhcmFtIGNvdW50IC0gTnVtYmVyIG9mIGJ5dGVzIHRvIGdldC5cbiAgICAgKiBAcGFyYW0gcHJldlNuYXBzaG90T3JVcmwgLSBUaW1lc3RhbXAgb2Ygc25hcHNob3QgdG8gcmV0cmlldmUgdGhlIGRpZmZlcmVuY2Ugb3IgVVJMIG9mIHNuYXBzaG90IHRvIHJldHJpZXZlIHRoZSBkaWZmZXJlbmNlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgUGFnZSBCbG9iIEdldCBQYWdlIFJhbmdlcyBEaWZmIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBsaXN0UGFnZVJhbmdlRGlmZkl0ZW1zKG9mZnNldCwgY291bnQsIHByZXZTbmFwc2hvdE9yVXJsLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIGxpc3RQYWdlUmFuZ2VEaWZmSXRlbXNfMSgpIHtcbiAgICAgICAgICAgIHZhciBlXzIsIF9hO1xuICAgICAgICAgICAgbGV0IG1hcmtlcjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX2FzeW5jVmFsdWVzKHRoaXMubGlzdFBhZ2VSYW5nZURpZmZJdGVtU2VnbWVudHMob2Zmc2V0LCBjb3VudCwgcHJldlNuYXBzaG90T3JVcmwsIG1hcmtlciwgb3B0aW9ucykpLCBfYzsgX2MgPSB5aWVsZCBfX2F3YWl0KF9iLm5leHQoKSksICFfYy5kb25lOykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBnZXRQYWdlUmFuZ2VzU2VnbWVudCA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBfX2F3YWl0KHlpZWxkKiBfX2FzeW5jRGVsZWdhdG9yKF9fYXN5bmNWYWx1ZXMoRXh0cmFjdFBhZ2VSYW5nZUluZm9JdGVtcyhnZXRQYWdlUmFuZ2VzU2VnbWVudCkpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfMl8xKSB7IGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07IH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSB5aWVsZCBfX2F3YWl0KF9hLmNhbGwoX2IpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhc3luYyBpdGVyYWJsZSBpdGVyYXRvciB0byBsaXN0IG9mIHBhZ2UgcmFuZ2VzIHRoYXQgZGlmZmVyIGJldHdlZW4gYSBzcGVjaWZpZWQgc25hcHNob3QgYW5kIHRoaXMgcGFnZSBibG9iLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2dldC1wYWdlLXJhbmdlc1xuICAgICAqXG4gICAgICogIC5ieVBhZ2UoKSByZXR1cm5zIGFuIGFzeW5jIGl0ZXJhYmxlIGl0ZXJhdG9yIHRvIGxpc3Qgb2YgcGFnZSByYW5nZXMgdGhhdCBkaWZmZXIgYmV0d2VlbiBhIHNwZWNpZmllZCBzbmFwc2hvdCBhbmQgdGhpcyBwYWdlIGJsb2IuXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGBmb3IgYXdhaXRgIHN5bnRheDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gR2V0IHRoZSBwYWdlQmxvYkNsaWVudCBiZWZvcmUgeW91IHJ1biB0aGVzZSBzbmlwcGV0cyxcbiAgICAgKiAvLyBDYW4gYmUgb2J0YWluZWQgZnJvbSBgYmxvYlNlcnZpY2VDbGllbnQuZ2V0Q29udGFpbmVyQ2xpZW50KFwiPHlvdXItY29udGFpbmVyLW5hbWU+XCIpLmdldFBhZ2VCbG9iQ2xpZW50KFwiPHlvdXItYmxvYi1uYW1lPlwiKTtgXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGZvciBhd2FpdCAoY29uc3QgcGFnZVJhbmdlIG9mIHBhZ2VCbG9iQ2xpZW50Lmxpc3RQYWdlUmFuZ2VzRGlmZigpKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgUGFnZSByYW5nZSAke2krK306ICR7cGFnZVJhbmdlLnN0YXJ0fSAtICR7cGFnZVJhbmdlLmVuZH1gKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGBpdGVyLm5leHQoKWA6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBsZXQgaXRlciA9IHBhZ2VCbG9iQ2xpZW50Lmxpc3RQYWdlUmFuZ2VzRGlmZigpO1xuICAgICAqIGxldCBwYWdlUmFuZ2VJdGVtID0gYXdhaXQgaXRlci5uZXh0KCk7XG4gICAgICogd2hpbGUgKCFwYWdlUmFuZ2VJdGVtLmRvbmUpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBQYWdlIHJhbmdlICR7aSsrfTogJHtwYWdlUmFuZ2VJdGVtLnZhbHVlLnN0YXJ0fSAtICR7cGFnZVJhbmdlSXRlbS52YWx1ZS5lbmR9LCBJc0NsZWFyOiAke3BhZ2VSYW5nZUl0ZW0udmFsdWUuaXNDbGVhcn1gKTtcbiAgICAgKiAgIHBhZ2VSYW5nZUl0ZW0gPSBhd2FpdCBpdGVyLm5leHQoKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGBieVBhZ2UoKWA6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIHBhc3Npbmcgb3B0aW9uYWwgbWF4UGFnZVNpemUgaW4gdGhlIHBhZ2Ugc2V0dGluZ3NcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogZm9yIGF3YWl0IChjb25zdCByZXNwb25zZSBvZiBwYWdlQmxvYkNsaWVudC5saXN0UGFnZVJhbmdlc0RpZmYoKS5ieVBhZ2UoeyBtYXhQYWdlU2l6ZTogMjAgfSkpIHtcbiAgICAgKiAgIGZvciAoY29uc3QgcGFnZVJhbmdlIG9mIHJlc3BvbnNlKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBQYWdlIHJhbmdlICR7aSsrfTogJHtwYWdlUmFuZ2Uuc3RhcnR9IC0gJHtwYWdlUmFuZ2UuZW5kfWApO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgcGFnaW5nIHdpdGggYSBtYXJrZXI6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBsZXQgaXRlcmF0b3IgPSBwYWdlQmxvYkNsaWVudC5saXN0UGFnZVJhbmdlc0RpZmYoKS5ieVBhZ2UoeyBtYXhQYWdlU2l6ZTogMiB9KTtcbiAgICAgKiBsZXQgcmVzcG9uc2UgPSAoYXdhaXQgaXRlcmF0b3IubmV4dCgpKS52YWx1ZTtcbiAgICAgKlxuICAgICAqIC8vIFByaW50cyAyIHBhZ2UgcmFuZ2VzXG4gICAgICogZm9yIChjb25zdCBwYWdlUmFuZ2Ugb2YgcmVzcG9uc2UpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBQYWdlIHJhbmdlICR7aSsrfTogJHtwYWdlUmFuZ2Uuc3RhcnR9IC0gJHtwYWdlUmFuZ2UuZW5kfWApO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIEdldHMgbmV4dCBtYXJrZXJcbiAgICAgKiBsZXQgbWFya2VyID0gcmVzcG9uc2UuY29udGludWF0aW9uVG9rZW47XG4gICAgICpcbiAgICAgKiAvLyBQYXNzaW5nIG5leHQgbWFya2VyIGFzIGNvbnRpbnVhdGlvblRva2VuXG4gICAgICpcbiAgICAgKiBpdGVyYXRvciA9IHBhZ2VCbG9iQ2xpZW50Lmxpc3RQYWdlUmFuZ2VzRGlmZigpLmJ5UGFnZSh7IGNvbnRpbnVhdGlvblRva2VuOiBtYXJrZXIsIG1heFBhZ2VTaXplOiAxMCB9KTtcbiAgICAgKiByZXNwb25zZSA9IChhd2FpdCBpdGVyYXRvci5uZXh0KCkpLnZhbHVlO1xuICAgICAqXG4gICAgICogLy8gUHJpbnRzIDEwIHBhZ2UgcmFuZ2VzXG4gICAgICogZm9yIChjb25zdCBibG9iIG9mIHJlc3BvbnNlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgUGFnZSByYW5nZSAke2krK306ICR7cGFnZVJhbmdlLnN0YXJ0fSAtICR7cGFnZVJhbmdlLmVuZH1gKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9mZnNldCAtIFN0YXJ0aW5nIGJ5dGUgcG9zaXRpb24gb2YgdGhlIHBhZ2UgcmFuZ2VzLlxuICAgICAqIEBwYXJhbSBjb3VudCAtIE51bWJlciBvZiBieXRlcyB0byBnZXQuXG4gICAgICogQHBhcmFtIHByZXZTbmFwc2hvdCAtIFRpbWVzdGFtcCBvZiBzbmFwc2hvdCB0byByZXRyaWV2ZSB0aGUgZGlmZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIFBhZ2UgQmxvYiBHZXQgUmFuZ2VzIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBBbiBhc3luY0l0ZXJhYmxlSXRlcmF0b3IgdGhhdCBzdXBwb3J0cyBwYWdpbmcuXG4gICAgICovXG4gICAgbGlzdFBhZ2VSYW5nZXNEaWZmKG9mZnNldCwgY291bnQsIHByZXZTbmFwc2hvdCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgLy8gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRvIGl0ZXJhdGUgb3ZlciBibG9ic1xuICAgICAgICBjb25zdCBpdGVyID0gdGhpcy5saXN0UGFnZVJhbmdlRGlmZkl0ZW1zKG9mZnNldCwgY291bnQsIHByZXZTbmFwc2hvdCwgT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucykpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUaGUgbmV4dCBtZXRob2QsIHBhcnQgb2YgdGhlIGl0ZXJhdGlvbiBwcm90b2NvbFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBuZXh0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyLm5leHQoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBjb25uZWN0aW9uIHRvIHRoZSBhc3luYyBpdGVyYXRvciwgcGFydCBvZiB0aGUgaXRlcmF0aW9uIHByb3RvY29sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBSZXR1cm4gYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRoYXQgd29ya3MgYSBwYWdlIGF0IGEgdGltZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBieVBhZ2U6IChzZXR0aW5ncyA9IHt9KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGlzdFBhZ2VSYW5nZURpZmZJdGVtU2VnbWVudHMob2Zmc2V0LCBjb3VudCwgcHJldlNuYXBzaG90LCBzZXR0aW5ncy5jb250aW51YXRpb25Ub2tlbiwgT2JqZWN0LmFzc2lnbih7IG1heFBhZ2VTaXplOiBzZXR0aW5ncy5tYXhQYWdlU2l6ZSB9LCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb2xsZWN0aW9uIG9mIHBhZ2UgcmFuZ2VzIHRoYXQgZGlmZmVyIGJldHdlZW4gYSBzcGVjaWZpZWQgc25hcHNob3QgYW5kIHRoaXMgcGFnZSBibG9iIGZvciBtYW5hZ2VkIGRpc2tzLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2dldC1wYWdlLXJhbmdlc1xuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCAtIFN0YXJ0aW5nIGJ5dGUgcG9zaXRpb24gb2YgdGhlIHBhZ2UgYmxvYlxuICAgICAqIEBwYXJhbSBjb3VudCAtIE51bWJlciBvZiBieXRlcyB0byBnZXQgcmFuZ2VzIGRpZmYuXG4gICAgICogQHBhcmFtIHByZXZTbmFwc2hvdFVybCAtIFVSTCBvZiBzbmFwc2hvdCB0byByZXRyaWV2ZSB0aGUgZGlmZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIFBhZ2UgQmxvYiBHZXQgUGFnZSBSYW5nZXMgRGlmZiBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIFBhZ2UgQmxvYiBHZXQgUGFnZSBSYW5nZSBEaWZmIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRQYWdlUmFuZ2VzRGlmZkZvck1hbmFnZWREaXNrcyhvZmZzZXQsIGNvdW50LCBwcmV2U25hcHNob3RVcmwsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIlBhZ2VCbG9iQ2xpZW50LUdldFBhZ2VSYW5nZXNEaWZmRm9yTWFuYWdlZERpc2tzXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucGFnZUJsb2JDb250ZXh0XG4gICAgICAgICAgICAgICAgLmdldFBhZ2VSYW5nZXNEaWZmKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSwgcHJldlNuYXBzaG90VXJsLCByYW5nZTogcmFuZ2VUb1N0cmluZyh7IG9mZnNldCwgY291bnQgfSkgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKVxuICAgICAgICAgICAgICAgIC50aGVuKHJhbmdlUmVzcG9uc2VGcm9tTW9kZWwpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNpemVzIHRoZSBwYWdlIGJsb2IgdG8gdGhlIHNwZWNpZmllZCBzaXplICh3aGljaCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNTEyKS5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9zZXQtYmxvYi1wcm9wZXJ0aWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2l6ZSAtIFRhcmdldCBzaXplXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBQYWdlIEJsb2IgUmVzaXplIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgUGFnZSBCbG9iIFJlc2l6ZSBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgcmVzaXplKHNpemUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIlBhZ2VCbG9iQ2xpZW50LXJlc2l6ZVwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnBhZ2VCbG9iQ29udGV4dC5yZXNpemUoc2l6ZSwgT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLCBlbmNyeXB0aW9uU2NvcGU6IG9wdGlvbnMuZW5jcnlwdGlvblNjb3BlIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgYSBwYWdlIGJsb2IncyBzZXF1ZW5jZSBudW1iZXIuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvc2V0LWJsb2ItcHJvcGVydGllc1xuICAgICAqXG4gICAgICogQHBhcmFtIHNlcXVlbmNlTnVtYmVyQWN0aW9uIC0gSW5kaWNhdGVzIGhvdyB0aGUgc2VydmljZSBzaG91bGQgbW9kaWZ5IHRoZSBibG9iJ3Mgc2VxdWVuY2UgbnVtYmVyLlxuICAgICAqIEBwYXJhbSBzZXF1ZW5jZU51bWJlciAtIFJlcXVpcmVkIGlmIHNlcXVlbmNlTnVtYmVyQWN0aW9uIGlzIG1heCBvciB1cGRhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIFBhZ2UgQmxvYiBVcGRhdGUgU2VxdWVuY2UgTnVtYmVyIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgUGFnZSBCbG9iIFVwZGF0ZSBTZXF1ZW5jZSBOdW1iZXIgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVNlcXVlbmNlTnVtYmVyKHNlcXVlbmNlTnVtYmVyQWN0aW9uLCBzZXF1ZW5jZU51bWJlciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiUGFnZUJsb2JDbGllbnQtdXBkYXRlU2VxdWVuY2VOdW1iZXJcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wYWdlQmxvYkNvbnRleHQudXBkYXRlU2VxdWVuY2VOdW1iZXIoc2VxdWVuY2VOdW1iZXJBY3Rpb24sIE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgYmxvYlNlcXVlbmNlTnVtYmVyOiBzZXF1ZW5jZU51bWJlciwgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBCZWdpbnMgYW4gb3BlcmF0aW9uIHRvIHN0YXJ0IGFuIGluY3JlbWVudGFsIGNvcHkgZnJvbSBvbmUgcGFnZSBibG9iJ3Mgc25hcHNob3QgdG8gdGhpcyBwYWdlIGJsb2IuXG4gICAgICogVGhlIHNuYXBzaG90IGlzIGNvcGllZCBzdWNoIHRoYXQgb25seSB0aGUgZGlmZmVyZW50aWFsIGNoYW5nZXMgYmV0d2VlbiB0aGUgcHJldmlvdXNseVxuICAgICAqIGNvcGllZCBzbmFwc2hvdCBhcmUgdHJhbnNmZXJyZWQgdG8gdGhlIGRlc3RpbmF0aW9uLlxuICAgICAqIFRoZSBjb3BpZWQgc25hcHNob3RzIGFyZSBjb21wbGV0ZSBjb3BpZXMgb2YgdGhlIG9yaWdpbmFsIHNuYXBzaG90IGFuZCBjYW4gYmUgcmVhZCBvciBjb3BpZWQgZnJvbSBhcyB1c3VhbC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9pbmNyZW1lbnRhbC1jb3B5LWJsb2JcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2F6dXJlL3ZpcnR1YWwtbWFjaGluZXMvd2luZG93cy9pbmNyZW1lbnRhbC1zbmFwc2hvdHNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb3B5U291cmNlIC0gU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgcGFnZSBibG9iIHNuYXBzaG90LiBGb3IgZXhhbXBsZSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL215YWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvbXljb250YWluZXIvbXlibG9iP3NuYXBzaG90PTxEYXRlVGltZT5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIFBhZ2UgQmxvYiBDb3B5IEluY3JlbWVudGFsIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgUGFnZSBCbG9iIENvcHkgSW5jcmVtZW50YWwgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHN0YXJ0Q29weUluY3JlbWVudGFsKGNvcHlTb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJQYWdlQmxvYkNsaWVudC1zdGFydENvcHlJbmNyZW1lbnRhbFwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnBhZ2VCbG9iQ29udGV4dC5jb3B5SW5jcmVtZW50YWwoY29weVNvdXJjZSwgT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSkgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DbGllbnRzLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgc3RyZWFtVG9CdWZmZXIyIH0gZnJvbSBcIi4vdXRpbHMvdXRpbHMubm9kZVwiO1xuaW1wb3J0IHsgQkFUQ0hfTUFYX1BBWUxPQURfSU5fQllURVMgfSBmcm9tIFwiLi91dGlscy9jb25zdGFudHNcIjtcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRCb2R5QXNUZXh0KGJhdGNoUmVzcG9uc2UpIHtcbiAgICBsZXQgYnVmZmVyID0gQnVmZmVyLmFsbG9jKEJBVENIX01BWF9QQVlMT0FEX0lOX0JZVEVTKTtcbiAgICBjb25zdCByZXNwb25zZUxlbmd0aCA9IGF3YWl0IHN0cmVhbVRvQnVmZmVyMihiYXRjaFJlc3BvbnNlLnJlYWRhYmxlU3RyZWFtQm9keSwgYnVmZmVyKTtcbiAgICAvLyBTbGljZSB0aGUgYnVmZmVyIHRvIHRyaW0gdGhlIGVtcHR5IGVuZGluZy5cbiAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoMCwgcmVzcG9uc2VMZW5ndGgpO1xuICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1dGY4Qnl0ZUxlbmd0aChzdHIpIHtcbiAgICByZXR1cm4gQnVmZmVyLmJ5dGVMZW5ndGgoc3RyKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhdGNoVXRpbHMuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBIdHRwSGVhZGVycyB9IGZyb20gXCJAYXp1cmUvY29yZS1odHRwXCI7XG5pbXBvcnQgeyBIVFRQX1ZFUlNJT05fMV8xLCBIVFRQX0xJTkVfRU5ESU5HLCBIZWFkZXJDb25zdGFudHMsIEhUVFBVUkxDb25uZWN0aW9uLCB9IGZyb20gXCIuL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0Qm9keUFzVGV4dCB9IGZyb20gXCIuL0JhdGNoVXRpbHNcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuL2xvZ1wiO1xuY29uc3QgSFRUUF9IRUFERVJfREVMSU1JVEVSID0gXCI6IFwiO1xuY29uc3QgU1BBQ0VfREVMSU1JVEVSID0gXCIgXCI7XG5jb25zdCBOT1RfRk9VTkQgPSAtMTtcbi8qKlxuICogVXRpbCBjbGFzcyBmb3IgcGFyc2luZyBiYXRjaCByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEJhdGNoUmVzcG9uc2VQYXJzZXIge1xuICAgIGNvbnN0cnVjdG9yKGJhdGNoUmVzcG9uc2UsIHN1YlJlcXVlc3RzKSB7XG4gICAgICAgIGlmICghYmF0Y2hSZXNwb25zZSB8fCAhYmF0Y2hSZXNwb25zZS5jb250ZW50VHlwZSkge1xuICAgICAgICAgICAgLy8gSW4gc3BlY2lhbCBjYXNlKHJlcG9ydGVkKSwgc2VydmVyIG1heSByZXR1cm4gaW52YWxpZCBjb250ZW50LXR5cGUgd2hpY2ggY291bGQgbm90IGJlIHBhcnNlZC5cbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiYmF0Y2hSZXNwb25zZSBpcyBtYWxmb3JtZWQgb3IgZG9lc24ndCBjb250YWluIHZhbGlkIGNvbnRlbnQtdHlwZS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdWJSZXF1ZXN0cyB8fCBzdWJSZXF1ZXN0cy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSBwcmV2ZW50IGR1cmluZyBjb2RpbmcuXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgc3RhdGU6IHN1YlJlcXVlc3RzIGlzIG5vdCBwcm92aWRlZCBvciBzaXplIGlzIDAuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmF0Y2hSZXNwb25zZSA9IGJhdGNoUmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc3ViUmVxdWVzdHMgPSBzdWJSZXF1ZXN0cztcbiAgICAgICAgdGhpcy5yZXNwb25zZUJhdGNoQm91bmRhcnkgPSB0aGlzLmJhdGNoUmVzcG9uc2UuY29udGVudFR5cGUuc3BsaXQoXCI9XCIpWzFdO1xuICAgICAgICB0aGlzLnBlclJlc3BvbnNlUHJlZml4ID0gYC0tJHt0aGlzLnJlc3BvbnNlQmF0Y2hCb3VuZGFyeX0ke0hUVFBfTElORV9FTkRJTkd9YDtcbiAgICAgICAgdGhpcy5iYXRjaFJlc3BvbnNlRW5kaW5nID0gYC0tJHt0aGlzLnJlc3BvbnNlQmF0Y2hCb3VuZGFyeX0tLWA7XG4gICAgfVxuICAgIC8vIEZvciBleGFtcGxlIG9mIHJlc3BvbnNlLCBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2Jsb2ItYmF0Y2gjcmVzcG9uc2VcbiAgICBhc3luYyBwYXJzZUJhdGNoUmVzcG9uc2UoKSB7XG4gICAgICAgIC8vIFdoZW4gbG9naWMgcmVhY2ggaGVyZSwgc3VwcG9zZSBiYXRjaCByZXF1ZXN0IGhhcyBhbHJlYWR5IHN1Y2NlZWRlZCB3aXRoIDIwMiwgc28gd2UgY2FuIGZ1cnRoZXIgcGFyc2VcbiAgICAgICAgLy8gc3ViIHJlcXVlc3QncyByZXNwb25zZS5cbiAgICAgICAgaWYgKHRoaXMuYmF0Y2hSZXNwb25zZS5fcmVzcG9uc2Uuc3RhdHVzICE9PSBIVFRQVVJMQ29ubmVjdGlvbi5IVFRQX0FDQ0VQVEVEKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3RhdGU6IGJhdGNoIHJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzOiAnJHt0aGlzLmJhdGNoUmVzcG9uc2UuX3Jlc3BvbnNlLnN0YXR1c30nLmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keUFzVGV4dCA9IGF3YWl0IGdldEJvZHlBc1RleHQodGhpcy5iYXRjaFJlc3BvbnNlKTtcbiAgICAgICAgY29uc3Qgc3ViUmVzcG9uc2VzID0gcmVzcG9uc2VCb2R5QXNUZXh0XG4gICAgICAgICAgICAuc3BsaXQodGhpcy5iYXRjaFJlc3BvbnNlRW5kaW5nKVswXSAvLyBzdHJpbmcgYWZ0ZXIgZW5kaW5nIGlzIHVzZWxlc3NcbiAgICAgICAgICAgIC5zcGxpdCh0aGlzLnBlclJlc3BvbnNlUHJlZml4KVxuICAgICAgICAgICAgLnNsaWNlKDEpOyAvLyBzdHJpbmcgYmVmb3JlIGZpcnN0IHJlc3BvbnNlIGJvdW5kYXJ5IGlzIHVzZWxlc3NcbiAgICAgICAgY29uc3Qgc3ViUmVzcG9uc2VDb3VudCA9IHN1YlJlc3BvbnNlcy5sZW5ndGg7XG4gICAgICAgIC8vIERlZmVuc2l2ZSBjb2RpbmcgaW4gY2FzZSBvZiBwb3RlbnRpYWwgZXJyb3IgcGFyc2luZy5cbiAgICAgICAgLy8gTm90ZTogc3ViUmVzcG9uc2VDb3VudCA9PSAxIGlzIHNwZWNpYWwgY2FzZSB3aGVyZSBzdWIgcmVxdWVzdCBpcyBpbnZhbGlkLlxuICAgICAgICAvLyBXZSB0cnkgdG8gcHJldmVudCBzdWNoIGNhc2VzIHRocm91Z2ggZWFybHkgdmFsaWRhdGlvbiwgZS5nLiB2YWxpZGF0ZSBzdWIgcmVxdWVzdCBjb3VudCA+PSAxLlxuICAgICAgICAvLyBXaGlsZSBpbiB1bmV4cGVjdGVkIHN1YiByZXF1ZXN0IGludmFsaWQgY2FzZSwgd2UgYWxsb3cgc3ViIHJlc3BvbnNlIHRvIGJlIHBhcnNlZCBhbmQgcmV0dXJuIHRvIHVzZXIuXG4gICAgICAgIGlmIChzdWJSZXNwb25zZUNvdW50ICE9PSB0aGlzLnN1YlJlcXVlc3RzLnNpemUgJiYgc3ViUmVzcG9uc2VDb3VudCAhPT0gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzdGF0ZTogc3ViIHJlc3BvbnNlcycgY291bnQgaXMgbm90IGVxdWFsIHRvIHN1YiByZXF1ZXN0cycgY291bnQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlc2VyaWFsaXplZFN1YlJlc3BvbnNlcyA9IG5ldyBBcnJheShzdWJSZXNwb25zZUNvdW50KTtcbiAgICAgICAgbGV0IHN1YlJlc3BvbnNlc1N1Y2NlZWRlZENvdW50ID0gMDtcbiAgICAgICAgbGV0IHN1YlJlc3BvbnNlc0ZhaWxlZENvdW50ID0gMDtcbiAgICAgICAgLy8gUGFyc2Ugc3ViIHN1YlJlc3BvbnNlcy5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHN1YlJlc3BvbnNlQ291bnQ7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN1YlJlc3BvbnNlID0gc3ViUmVzcG9uc2VzW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IGRlc2VyaWFsaXplZFN1YlJlc3BvbnNlID0ge307XG4gICAgICAgICAgICBkZXNlcmlhbGl6ZWRTdWJSZXNwb25zZS5oZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZUxpbmVzID0gc3ViUmVzcG9uc2Uuc3BsaXQoYCR7SFRUUF9MSU5FX0VORElOR31gKTtcbiAgICAgICAgICAgIGxldCBzdWJSZXNwSGVhZGVyU3RhcnRGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IHN1YlJlc3BIZWFkZXJFbmRGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IHN1YlJlc3BGYWlsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBjb250ZW50SWQgPSBOT1RfRk9VTkQ7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlTGluZSBvZiByZXNwb25zZUxpbmVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzdWJSZXNwSGVhZGVyU3RhcnRGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDb252ZW50aW9uIGxpbmUgdG8gaW5kaWNhdGUgY29udGVudCBJRFxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VMaW5lLnN0YXJ0c1dpdGgoSGVhZGVyQ29uc3RhbnRzLkNPTlRFTlRfSUQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50SWQgPSBwYXJzZUludChyZXNwb25zZUxpbmUuc3BsaXQoSFRUUF9IRUFERVJfREVMSU1JVEVSKVsxXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gSHR0cCB2ZXJzaW9uIGxpbmUgd2l0aCBzdGF0dXMgY29kZSBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIHN1YiByZXF1ZXN0J3MgcmVzcG9uc2UuXG4gICAgICAgICAgICAgICAgICAgIC8vIEV4YW1wbGU6IEhUVFAvMS4xIDIwMiBBY2NlcHRlZFxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VMaW5lLnN0YXJ0c1dpdGgoSFRUUF9WRVJTSU9OXzFfMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YlJlc3BIZWFkZXJTdGFydEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRva2VucyA9IHJlc3BvbnNlTGluZS5zcGxpdChTUEFDRV9ERUxJTUlURVIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzZXJpYWxpemVkU3ViUmVzcG9uc2Uuc3RhdHVzID0gcGFyc2VJbnQodG9rZW5zWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2VyaWFsaXplZFN1YlJlc3BvbnNlLnN0YXR1c01lc3NhZ2UgPSB0b2tlbnMuc2xpY2UoMikuam9pbihTUEFDRV9ERUxJTUlURVIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIGNvbnZlbnRpb24gaGVhZGVycyBub3Qgc3BlY2lmaWNhbGx5IGZvciBzdWIgcmVxdWVzdCBpLmUuIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vaHR0cCBhbmQgQ29udGVudC1JRDogKlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VMaW5lLnRyaW0oKSA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdWIgcmVzcG9uc2UncyBoZWFkZXIgc3RhcnQgbGluZSBhbHJlYWR5IGZvdW5kLCBhbmQgdGhlIGZpcnN0IGVtcHR5IGxpbmUgaW5kaWNhdGVzIGhlYWRlciBlbmQgbGluZSBmb3VuZC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWJSZXNwSGVhZGVyRW5kRm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YlJlc3BIZWFkZXJFbmRGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIFNraXAgZW1wdHkgbGluZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBOb3RlOiB3aGVuIGNvZGUgcmVhY2ggaGVyZSwgaXQgaW5kaWNhdGVzIHN1YlJlc3BIZWFkZXJTdGFydEZvdW5kID09IHRydWVcbiAgICAgICAgICAgICAgICBpZiAoIXN1YlJlc3BIZWFkZXJFbmRGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VMaW5lLmluZGV4T2YoSFRUUF9IRUFERVJfREVMSU1JVEVSKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZmVuc2l2ZSBjb2RpbmcgdG8gcHJldmVudCBmcm9tIG1pc3NpbmcgdmFsdWFibGUgbGluZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3RhdGU6IGZpbmQgbm9uLWVtcHR5IGxpbmUgJyR7cmVzcG9uc2VMaW5lfScgd2l0aG91dCBIVFRQIGhlYWRlciBkZWxpbWl0ZXIgJyR7SFRUUF9IRUFERVJfREVMSU1JVEVSfScuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gUGFyc2UgaGVhZGVycyBvZiBzdWIgcmVzcG9uc2UuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRva2VucyA9IHJlc3BvbnNlTGluZS5zcGxpdChIVFRQX0hFQURFUl9ERUxJTUlURVIpO1xuICAgICAgICAgICAgICAgICAgICBkZXNlcmlhbGl6ZWRTdWJSZXNwb25zZS5oZWFkZXJzLnNldCh0b2tlbnNbMF0sIHRva2Vuc1sxXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbMF0gPT09IEhlYWRlckNvbnN0YW50cy5YX01TX0VSUk9SX0NPREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2VyaWFsaXplZFN1YlJlc3BvbnNlLmVycm9yQ29kZSA9IHRva2Vuc1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YlJlc3BGYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBBc3NlbWJsZSBib2R5IG9mIHN1YiByZXNwb25zZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXNlcmlhbGl6ZWRTdWJSZXNwb25zZS5ib2R5QXNUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNlcmlhbGl6ZWRTdWJSZXNwb25zZS5ib2R5QXNUZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZXNlcmlhbGl6ZWRTdWJSZXNwb25zZS5ib2R5QXNUZXh0ICs9IHJlc3BvbnNlTGluZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IC8vIElubmVyIGZvciBlbmRcbiAgICAgICAgICAgIC8vIFRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gdGhlIENvbnRlbnQtSUQgaGVhZGVyIGZvciBlYWNoIGNvcnJlc3BvbmRpbmcgc3VicmVxdWVzdCByZXNwb25zZSB0byB1c2UgZm9yIHRyYWNraW5nLlxuICAgICAgICAgICAgLy8gVGhlIENvbnRlbnQtSURzIGFyZSBzZXQgdG8gYSB2YWxpZCBpbmRleCBpbiB0aGUgc3VicmVxdWVzdHMgd2Ugc2VudC4gSW4gdGhlIHN0YXR1cyBjb2RlIDIwMiBwYXRoLCB3ZSBjb3VsZCBleHBlY3QgaXRcbiAgICAgICAgICAgIC8vIHRvIGJlIDEtMSBtYXBwaW5nIGZyb20gdGhlIFswLCBzdWJSZXF1ZXN0cy5zaXplKSB0byB0aGUgQ29udGVudC1JRHMgcmV0dXJuZWQuIElmIG5vdCwgd2Ugc2ltcGx5IGRvbid0IHJldHVybiB0aGF0XG4gICAgICAgICAgICAvLyB1bmV4cGVjdGVkIHN1YlJlc3BvbnNlIGluIHRoZSBwYXJzZWQgcmVwb25zZSBhbmQgd2UgY2FuIGFsd2F5cyBsb29rIGl0IHVwIGluIHRoZSByYXcgcmVzcG9uc2UgZm9yIGRlYnVnZ2luZyBwdXJwb3NlLlxuICAgICAgICAgICAgaWYgKGNvbnRlbnRJZCAhPT0gTk9UX0ZPVU5EICYmXG4gICAgICAgICAgICAgICAgTnVtYmVyLmlzSW50ZWdlcihjb250ZW50SWQpICYmXG4gICAgICAgICAgICAgICAgY29udGVudElkID49IDAgJiZcbiAgICAgICAgICAgICAgICBjb250ZW50SWQgPCB0aGlzLnN1YlJlcXVlc3RzLnNpemUgJiZcbiAgICAgICAgICAgICAgICBkZXNlcmlhbGl6ZWRTdWJSZXNwb25zZXNbY29udGVudElkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGVzZXJpYWxpemVkU3ViUmVzcG9uc2UuX3JlcXVlc3QgPSB0aGlzLnN1YlJlcXVlc3RzLmdldChjb250ZW50SWQpO1xuICAgICAgICAgICAgICAgIGRlc2VyaWFsaXplZFN1YlJlc3BvbnNlc1tjb250ZW50SWRdID0gZGVzZXJpYWxpemVkU3ViUmVzcG9uc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYHN1YlJlc3BvbnNlc1ske2luZGV4fV0gaXMgZHJvcHBlZCBhcyB0aGUgQ29udGVudC1JRCBpcyBub3QgZm91bmQgb3IgaW52YWxpZCwgQ29udGVudC1JRDogJHtjb250ZW50SWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3ViUmVzcEZhaWxlZCkge1xuICAgICAgICAgICAgICAgIHN1YlJlc3BvbnNlc0ZhaWxlZENvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdWJSZXNwb25zZXNTdWNjZWVkZWRDb3VudCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWJSZXNwb25zZXM6IGRlc2VyaWFsaXplZFN1YlJlc3BvbnNlcyxcbiAgICAgICAgICAgIHN1YlJlc3BvbnNlc1N1Y2NlZWRlZENvdW50OiBzdWJSZXNwb25zZXNTdWNjZWVkZWRDb3VudCxcbiAgICAgICAgICAgIHN1YlJlc3BvbnNlc0ZhaWxlZENvdW50OiBzdWJSZXNwb25zZXNGYWlsZWRDb3VudCxcbiAgICAgICAgfTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CYXRjaFJlc3BvbnNlUGFyc2VyLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxudmFyIE11dGV4TG9ja1N0YXR1cztcbihmdW5jdGlvbiAoTXV0ZXhMb2NrU3RhdHVzKSB7XG4gICAgTXV0ZXhMb2NrU3RhdHVzW011dGV4TG9ja1N0YXR1c1tcIkxPQ0tFRFwiXSA9IDBdID0gXCJMT0NLRURcIjtcbiAgICBNdXRleExvY2tTdGF0dXNbTXV0ZXhMb2NrU3RhdHVzW1wiVU5MT0NLRURcIl0gPSAxXSA9IFwiVU5MT0NLRURcIjtcbn0pKE11dGV4TG9ja1N0YXR1cyB8fCAoTXV0ZXhMb2NrU3RhdHVzID0ge30pKTtcbi8qKlxuICogQW4gYXN5bmMgbXV0ZXggbG9jay5cbiAqL1xuZXhwb3J0IGNsYXNzIE11dGV4IHtcbiAgICAvKipcbiAgICAgKiBMb2NrIGZvciBhIHNwZWNpZmljIGtleS4gSWYgdGhlIGxvY2sgaGFzIGJlZW4gYWNxdWlyZWQgYnkgYW5vdGhlciBjdXN0b21lciwgdGhlblxuICAgICAqIHdpbGwgd2FpdCB1bnRpbCBnZXR0aW5nIHRoZSBsb2NrLlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSAtIGxvY2sga2V5XG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIGxvY2soa2V5KSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMua2V5c1trZXldID09PSB1bmRlZmluZWQgfHwgdGhpcy5rZXlzW2tleV0gPT09IE11dGV4TG9ja1N0YXR1cy5VTkxPQ0tFRCkge1xuICAgICAgICAgICAgICAgIHRoaXMua2V5c1trZXldID0gTXV0ZXhMb2NrU3RhdHVzLkxPQ0tFRDtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uVW5sb2NrRXZlbnQoa2V5LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMua2V5c1trZXldID0gTXV0ZXhMb2NrU3RhdHVzLkxPQ0tFRDtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVW5sb2NrIGEga2V5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSAtXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIHVubG9jayhrZXkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5rZXlzW2tleV0gPT09IE11dGV4TG9ja1N0YXR1cy5MT0NLRUQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRVbmxvY2tFdmVudChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIHRoaXMua2V5c1trZXldO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIG9uVW5sb2NrRXZlbnQoa2V5LCBoYW5kbGVyKSB7XG4gICAgICAgIGlmICh0aGlzLmxpc3RlbmVyc1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW2tleV0gPSBbaGFuZGxlcl07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1trZXldLnB1c2goaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGVtaXRVbmxvY2tFdmVudChrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMubGlzdGVuZXJzW2tleV0gIT09IHVuZGVmaW5lZCAmJiB0aGlzLmxpc3RlbmVyc1trZXldLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmxpc3RlbmVyc1trZXldLnNoaWZ0KCk7XG4gICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuTXV0ZXgua2V5cyA9IHt9O1xuTXV0ZXgubGlzdGVuZXJzID0ge307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NdXRleC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEJhc2VSZXF1ZXN0UG9saWN5LCBkZXNlcmlhbGl6YXRpb25Qb2xpY3ksIGdlbmVyYXRlVXVpZCwgSHR0cEhlYWRlcnMsIFdlYlJlc291cmNlLCBpc1Rva2VuQ3JlZGVudGlhbCwgYmVhcmVyVG9rZW5BdXRoZW50aWNhdGlvblBvbGljeSwgaXNOb2RlLCB9IGZyb20gXCJAYXp1cmUvY29yZS1odHRwXCI7XG5pbXBvcnQgeyBTcGFuU3RhdHVzQ29kZSB9IGZyb20gXCJAYXp1cmUvY29yZS10cmFjaW5nXCI7XG5pbXBvcnQgeyBBbm9ueW1vdXNDcmVkZW50aWFsIH0gZnJvbSBcIi4vY3JlZGVudGlhbHMvQW5vbnltb3VzQ3JlZGVudGlhbFwiO1xuaW1wb3J0IHsgQmxvYkNsaWVudCB9IGZyb20gXCIuL0NsaWVudHNcIjtcbmltcG9ydCB7IE11dGV4IH0gZnJvbSBcIi4vdXRpbHMvTXV0ZXhcIjtcbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4vUGlwZWxpbmVcIjtcbmltcG9ydCB7IGF0dGFjaENyZWRlbnRpYWwsIGdldFVSTFBhdGgsIGdldFVSTFBhdGhBbmRRdWVyeSwgaUVxdWFsIH0gZnJvbSBcIi4vdXRpbHMvdXRpbHMuY29tbW9uXCI7XG5pbXBvcnQgeyBIZWFkZXJDb25zdGFudHMsIEJBVENIX01BWF9SRVFVRVNULCBIVFRQX1ZFUlNJT05fMV8xLCBIVFRQX0xJTkVfRU5ESU5HLCBTdG9yYWdlT0F1dGhTY29wZXMsIH0gZnJvbSBcIi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCB9IGZyb20gXCIuL2NyZWRlbnRpYWxzL1N0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsXCI7XG5pbXBvcnQgeyBjcmVhdGVTcGFuIH0gZnJvbSBcIi4vdXRpbHMvdHJhY2luZ1wiO1xuLyoqXG4gKiBBIEJsb2JCYXRjaCByZXByZXNlbnRzIGFuIGFnZ3JlZ2F0ZWQgc2V0IG9mIG9wZXJhdGlvbnMgb24gYmxvYnMuXG4gKiBDdXJyZW50bHksIG9ubHkgYGRlbGV0ZWAgYW5kIGBzZXRBY2Nlc3NUaWVyYCBhcmUgc3VwcG9ydGVkLlxuICovXG5leHBvcnQgY2xhc3MgQmxvYkJhdGNoIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYXRjaCA9IFwiYmF0Y2hcIjtcbiAgICAgICAgdGhpcy5iYXRjaFJlcXVlc3QgPSBuZXcgSW5uZXJCYXRjaFJlcXVlc3QoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBvZiBDb250ZW50LVR5cGUgZm9yIGEgYmF0Y2ggcmVxdWVzdC5cbiAgICAgKiBUaGUgdmFsdWUgbXVzdCBiZSBtdWx0aXBhcnQvbWl4ZWQgd2l0aCBhIGJhdGNoIGJvdW5kYXJ5LlxuICAgICAqIEV4YW1wbGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9YmF0Y2hfYTgxNzg2YzgtZTMwMS00ZTQyLWE3MjktYTMyY2EyNGFlMjUyXG4gICAgICovXG4gICAgZ2V0TXVsdGlQYXJ0Q29udGVudFR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhdGNoUmVxdWVzdC5nZXRNdWx0aXBhcnRDb250ZW50VHlwZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgYXNzZW1ibGVkIEhUVFAgcmVxdWVzdCBib2R5IGZvciBzdWIgcmVxdWVzdHMuXG4gICAgICovXG4gICAgZ2V0SHR0cFJlcXVlc3RCb2R5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXRjaFJlcXVlc3QuZ2V0SHR0cFJlcXVlc3RCb2R5KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBzdWIgcmVxdWVzdHMgdGhhdCBhcmUgYWRkZWQgaW50byB0aGUgYmF0Y2ggcmVxdWVzdC5cbiAgICAgKi9cbiAgICBnZXRTdWJSZXF1ZXN0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmF0Y2hSZXF1ZXN0LmdldFN1YlJlcXVlc3RzKCk7XG4gICAgfVxuICAgIGFzeW5jIGFkZFN1YlJlcXVlc3RJbnRlcm5hbChzdWJSZXF1ZXN0LCBhc3NlbWJsZVN1YlJlcXVlc3RGdW5jKSB7XG4gICAgICAgIGF3YWl0IE11dGV4LmxvY2sodGhpcy5iYXRjaCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmJhdGNoUmVxdWVzdC5wcmVBZGRTdWJSZXF1ZXN0KHN1YlJlcXVlc3QpO1xuICAgICAgICAgICAgYXdhaXQgYXNzZW1ibGVTdWJSZXF1ZXN0RnVuYygpO1xuICAgICAgICAgICAgdGhpcy5iYXRjaFJlcXVlc3QucG9zdEFkZFN1YlJlcXVlc3Qoc3ViUmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCBNdXRleC51bmxvY2sodGhpcy5iYXRjaCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0QmF0Y2hUeXBlKGJhdGNoVHlwZSkge1xuICAgICAgICBpZiAoIXRoaXMuYmF0Y2hUeXBlKSB7XG4gICAgICAgICAgICB0aGlzLmJhdGNoVHlwZSA9IGJhdGNoVHlwZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5iYXRjaFR5cGUgIT09IGJhdGNoVHlwZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEJsb2JCYXRjaCBvbmx5IHN1cHBvcnRzIG9uZSBvcGVyYXRpb24gdHlwZSBwZXIgYmF0Y2ggYW5kIGl0IGFscmVhZHkgaXMgYmVpbmcgdXNlZCBmb3IgJHt0aGlzLmJhdGNoVHlwZX0gb3BlcmF0aW9ucy5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBkZWxldGVCbG9iKHVybE9yQmxvYkNsaWVudCwgY3JlZGVudGlhbE9yT3B0aW9ucywgb3B0aW9ucykge1xuICAgICAgICBsZXQgdXJsO1xuICAgICAgICBsZXQgY3JlZGVudGlhbDtcbiAgICAgICAgaWYgKHR5cGVvZiB1cmxPckJsb2JDbGllbnQgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICgoaXNOb2RlICYmIGNyZWRlbnRpYWxPck9wdGlvbnMgaW5zdGFuY2VvZiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCkgfHxcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsT3JPcHRpb25zIGluc3RhbmNlb2YgQW5vbnltb3VzQ3JlZGVudGlhbCB8fFxuICAgICAgICAgICAgICAgIGlzVG9rZW5DcmVkZW50aWFsKGNyZWRlbnRpYWxPck9wdGlvbnMpKSkge1xuICAgICAgICAgICAgLy8gRmlyc3Qgb3ZlcmxvYWRcbiAgICAgICAgICAgIHVybCA9IHVybE9yQmxvYkNsaWVudDtcbiAgICAgICAgICAgIGNyZWRlbnRpYWwgPSBjcmVkZW50aWFsT3JPcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVybE9yQmxvYkNsaWVudCBpbnN0YW5jZW9mIEJsb2JDbGllbnQpIHtcbiAgICAgICAgICAgIC8vIFNlY29uZCBvdmVybG9hZFxuICAgICAgICAgICAgdXJsID0gdXJsT3JCbG9iQ2xpZW50LnVybDtcbiAgICAgICAgICAgIGNyZWRlbnRpYWwgPSB1cmxPckJsb2JDbGllbnQuY3JlZGVudGlhbDtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBjcmVkZW50aWFsT3JPcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50cy4gRWl0aGVyIHVybCBhbmQgY3JlZGVudGlhbCwgb3IgQmxvYkNsaWVudCBuZWVkIGJlIHByb3ZpZGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmF0Y2hEZWxldGVSZXF1ZXN0LWFkZFN1YlJlcXVlc3RcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnNldEJhdGNoVHlwZShcImRlbGV0ZVwiKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkU3ViUmVxdWVzdEludGVybmFsKHtcbiAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsOiBjcmVkZW50aWFsLFxuICAgICAgICAgICAgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBCbG9iQ2xpZW50KHVybCwgdGhpcy5iYXRjaFJlcXVlc3QuY3JlYXRlUGlwZWxpbmUoY3JlZGVudGlhbCkpLmRlbGV0ZSh1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgc2V0QmxvYkFjY2Vzc1RpZXIodXJsT3JCbG9iQ2xpZW50LCBjcmVkZW50aWFsT3JUaWVyLCB0aWVyT3JPcHRpb25zLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCB1cmw7XG4gICAgICAgIGxldCBjcmVkZW50aWFsO1xuICAgICAgICBsZXQgdGllcjtcbiAgICAgICAgaWYgKHR5cGVvZiB1cmxPckJsb2JDbGllbnQgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICgoaXNOb2RlICYmIGNyZWRlbnRpYWxPclRpZXIgaW5zdGFuY2VvZiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCkgfHxcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsT3JUaWVyIGluc3RhbmNlb2YgQW5vbnltb3VzQ3JlZGVudGlhbCB8fFxuICAgICAgICAgICAgICAgIGlzVG9rZW5DcmVkZW50aWFsKGNyZWRlbnRpYWxPclRpZXIpKSkge1xuICAgICAgICAgICAgLy8gRmlyc3Qgb3ZlcmxvYWRcbiAgICAgICAgICAgIHVybCA9IHVybE9yQmxvYkNsaWVudDtcbiAgICAgICAgICAgIGNyZWRlbnRpYWwgPSBjcmVkZW50aWFsT3JUaWVyO1xuICAgICAgICAgICAgdGllciA9IHRpZXJPck9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodXJsT3JCbG9iQ2xpZW50IGluc3RhbmNlb2YgQmxvYkNsaWVudCkge1xuICAgICAgICAgICAgLy8gU2Vjb25kIG92ZXJsb2FkXG4gICAgICAgICAgICB1cmwgPSB1cmxPckJsb2JDbGllbnQudXJsO1xuICAgICAgICAgICAgY3JlZGVudGlhbCA9IHVybE9yQmxvYkNsaWVudC5jcmVkZW50aWFsO1xuICAgICAgICAgICAgdGllciA9IGNyZWRlbnRpYWxPclRpZXI7XG4gICAgICAgICAgICBvcHRpb25zID0gdGllck9yT3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBhcmd1bWVudHMuIEVpdGhlciB1cmwgYW5kIGNyZWRlbnRpYWwsIG9yIEJsb2JDbGllbnQgbmVlZCBiZSBwcm92aWRlZC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJhdGNoU2V0VGllclJlcXVlc3QtYWRkU3ViUmVxdWVzdFwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc2V0QmF0Y2hUeXBlKFwic2V0QWNjZXNzVGllclwiKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkU3ViUmVxdWVzdEludGVybmFsKHtcbiAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsOiBjcmVkZW50aWFsLFxuICAgICAgICAgICAgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBCbG9iQ2xpZW50KHVybCwgdGhpcy5iYXRjaFJlcXVlc3QuY3JlYXRlUGlwZWxpbmUoY3JlZGVudGlhbCkpLnNldEFjY2Vzc1RpZXIodGllciwgdXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBJbm5lciBiYXRjaCByZXF1ZXN0IGNsYXNzIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBhc3NlbWJsaW5nIGFuZCBzZXJpYWxpemluZyBzdWIgcmVxdWVzdHMuXG4gKiBTZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2Jsb2ItYmF0Y2gjcmVxdWVzdC1ib2R5IGZvciBob3cgcmVxdWVzdHMgYXJlIGFzc2VtYmxlZC5cbiAqL1xuY2xhc3MgSW5uZXJCYXRjaFJlcXVlc3Qge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbkNvdW50ID0gMDtcbiAgICAgICAgdGhpcy5ib2R5ID0gXCJcIjtcbiAgICAgICAgY29uc3QgdGVtcEd1aWQgPSBnZW5lcmF0ZVV1aWQoKTtcbiAgICAgICAgLy8gYmF0Y2hfe2JhdGNoaWR9XG4gICAgICAgIHRoaXMuYm91bmRhcnkgPSBgYmF0Y2hfJHt0ZW1wR3VpZH1gO1xuICAgICAgICAvLyAtLWJhdGNoX3tiYXRjaGlkfVxuICAgICAgICAvLyBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2h0dHBcbiAgICAgICAgLy8gQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmluYXJ5XG4gICAgICAgIHRoaXMuc3ViUmVxdWVzdFByZWZpeCA9IGAtLSR7dGhpcy5ib3VuZGFyeX0ke0hUVFBfTElORV9FTkRJTkd9JHtIZWFkZXJDb25zdGFudHMuQ09OVEVOVF9UWVBFfTogYXBwbGljYXRpb24vaHR0cCR7SFRUUF9MSU5FX0VORElOR30ke0hlYWRlckNvbnN0YW50cy5DT05URU5UX1RSQU5TRkVSX0VOQ09ESU5HfTogYmluYXJ5YDtcbiAgICAgICAgLy8gbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT1iYXRjaF97YmF0Y2hpZH1cbiAgICAgICAgdGhpcy5tdWx0aXBhcnRDb250ZW50VHlwZSA9IGBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSR7dGhpcy5ib3VuZGFyeX1gO1xuICAgICAgICAvLyAtLWJhdGNoX3tiYXRjaGlkfS0tXG4gICAgICAgIHRoaXMuYmF0Y2hSZXF1ZXN0RW5kaW5nID0gYC0tJHt0aGlzLmJvdW5kYXJ5fS0tYDtcbiAgICAgICAgdGhpcy5zdWJSZXF1ZXN0cyA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHBpcGVsaW5lIHRvIGFzc2VtYmxlIHN1YiByZXF1ZXN0cy4gVGhlIGlkZWEgaGVyZSBpcyB0byB1c2UgZXhpc3RpbmdcbiAgICAgKiBjcmVkZW50aWFsIGFuZCBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBjb21wb25lbnRzLCB3aXRoIGFkZGl0aW9uYWwgcG9saWNpZXMgdG9cbiAgICAgKiBmaWx0ZXIgdW5uZWNlc3NhcnkgaGVhZGVycywgYXNzZW1ibGUgc3ViIHJlcXVlc3RzIGludG8gcmVxdWVzdCdzIGJvZHlcbiAgICAgKiBhbmQgaW50ZXJjZXB0IHJlcXVlc3QgZnJvbSBnb2luZyB0byB3aXJlLlxuICAgICAqIEBwYXJhbSBjcmVkZW50aWFsIC0gIFN1Y2ggYXMgQW5vbnltb3VzQ3JlZGVudGlhbCwgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwgb3IgYW55IGNyZWRlbnRpYWwgZnJvbSB0aGUgYEBhenVyZS9pZGVudGl0eWAgcGFja2FnZSB0byBhdXRoZW50aWNhdGUgcmVxdWVzdHMgdG8gdGhlIHNlcnZpY2UuIFlvdSBjYW4gYWxzbyBwcm92aWRlIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIFRva2VuQ3JlZGVudGlhbCBpbnRlcmZhY2UuIElmIG5vdCBzcGVjaWZpZWQsIEFub255bW91c0NyZWRlbnRpYWwgaXMgdXNlZC5cbiAgICAgKi9cbiAgICBjcmVhdGVQaXBlbGluZShjcmVkZW50aWFsKSB7XG4gICAgICAgIGNvbnN0IGlzQW5vbnltb3VzQ3JlZHMgPSBjcmVkZW50aWFsIGluc3RhbmNlb2YgQW5vbnltb3VzQ3JlZGVudGlhbDtcbiAgICAgICAgY29uc3QgcG9saWN5RmFjdG9yeUxlbmd0aCA9IDMgKyAoaXNBbm9ueW1vdXNDcmVkcyA/IDAgOiAxKTsgLy8gW2Rlc2VyaWFsaXphdGlvblBvbGljeSwgQmF0Y2hIZWFkZXJGaWx0ZXJQb2xpY3lGYWN0b3J5LCAoT3B0aW9uYWwpQ3JlZGVudGlhbCwgQmF0Y2hSZXF1ZXN0QXNzZW1ibGVQb2xpY3lGYWN0b3J5XVxuICAgICAgICBjb25zdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXkocG9saWN5RmFjdG9yeUxlbmd0aCk7XG4gICAgICAgIGZhY3Rvcmllc1swXSA9IGRlc2VyaWFsaXphdGlvblBvbGljeSgpOyAvLyBEZWZhdWx0IGRlc2VyaWFsaXphdGlvblBvbGljeSBpcyBwcm92aWRlZCBieSBwcm90b2NvbCBsYXllclxuICAgICAgICBmYWN0b3JpZXNbMV0gPSBuZXcgQmF0Y2hIZWFkZXJGaWx0ZXJQb2xpY3lGYWN0b3J5KCk7IC8vIFVzZSBiYXRjaCBoZWFkZXIgZmlsdGVyIHBvbGljeSB0byBleGNsdWRlIHVubmVjZXNzYXJ5IGhlYWRlcnNcbiAgICAgICAgaWYgKCFpc0Fub255bW91c0NyZWRzKSB7XG4gICAgICAgICAgICBmYWN0b3JpZXNbMl0gPSBpc1Rva2VuQ3JlZGVudGlhbChjcmVkZW50aWFsKVxuICAgICAgICAgICAgICAgID8gYXR0YWNoQ3JlZGVudGlhbChiZWFyZXJUb2tlbkF1dGhlbnRpY2F0aW9uUG9saWN5KGNyZWRlbnRpYWwsIFN0b3JhZ2VPQXV0aFNjb3BlcyksIGNyZWRlbnRpYWwpXG4gICAgICAgICAgICAgICAgOiBjcmVkZW50aWFsO1xuICAgICAgICB9XG4gICAgICAgIGZhY3Rvcmllc1twb2xpY3lGYWN0b3J5TGVuZ3RoIC0gMV0gPSBuZXcgQmF0Y2hSZXF1ZXN0QXNzZW1ibGVQb2xpY3lGYWN0b3J5KHRoaXMpOyAvLyBVc2UgYmF0Y2ggYXNzZW1ibGUgcG9saWN5IHRvIGFzc2VtYmxlIHJlcXVlc3QgYW5kIGludGVyY2VwdCByZXF1ZXN0IGZyb20gZ29pbmcgdG8gd2lyZVxuICAgICAgICByZXR1cm4gbmV3IFBpcGVsaW5lKGZhY3Rvcmllcywge30pO1xuICAgIH1cbiAgICBhcHBlbmRTdWJSZXF1ZXN0VG9Cb2R5KHJlcXVlc3QpIHtcbiAgICAgICAgLy8gU3RhcnQgdG8gYXNzZW1ibGUgc3ViIHJlcXVlc3RcbiAgICAgICAgdGhpcy5ib2R5ICs9IFtcbiAgICAgICAgICAgIHRoaXMuc3ViUmVxdWVzdFByZWZpeCxcbiAgICAgICAgICAgIGAke0hlYWRlckNvbnN0YW50cy5DT05URU5UX0lEfTogJHt0aGlzLm9wZXJhdGlvbkNvdW50fWAsXG4gICAgICAgICAgICBcIlwiLFxuICAgICAgICAgICAgYCR7cmVxdWVzdC5tZXRob2QudG9TdHJpbmcoKX0gJHtnZXRVUkxQYXRoQW5kUXVlcnkocmVxdWVzdC51cmwpfSAke0hUVFBfVkVSU0lPTl8xXzF9JHtIVFRQX0xJTkVfRU5ESU5HfWAsIC8vIHN1YiByZXF1ZXN0IHN0YXJ0IGxpbmUgd2l0aCBtZXRob2RcbiAgICAgICAgXS5qb2luKEhUVFBfTElORV9FTkRJTkcpO1xuICAgICAgICBmb3IgKGNvbnN0IGhlYWRlciBvZiByZXF1ZXN0LmhlYWRlcnMuaGVhZGVyc0FycmF5KCkpIHtcbiAgICAgICAgICAgIHRoaXMuYm9keSArPSBgJHtoZWFkZXIubmFtZX06ICR7aGVhZGVyLnZhbHVlfSR7SFRUUF9MSU5FX0VORElOR31gO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYm9keSArPSBIVFRQX0xJTkVfRU5ESU5HOyAvLyBzdWIgcmVxdWVzdCdzIGhlYWRlcnMgbmVlZCBiZSBlbmRpbmcgd2l0aCBhbiBlbXB0eSBsaW5lXG4gICAgICAgIC8vIE5vIGJvZHkgdG8gYXNzZW1ibGUgZm9yIGN1cnJlbnQgYmF0Y2ggcmVxdWVzdCBzdXBwb3J0XG4gICAgICAgIC8vIEVuZCB0byBhc3NlbWJsZSBzdWIgcmVxdWVzdFxuICAgIH1cbiAgICBwcmVBZGRTdWJSZXF1ZXN0KHN1YlJlcXVlc3QpIHtcbiAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9uQ291bnQgPj0gQkFUQ0hfTUFYX1JFUVVFU1QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBDYW5ub3QgZXhjZWVkICR7QkFUQ0hfTUFYX1JFUVVFU1R9IHN1YiByZXF1ZXN0cyBpbiBhIHNpbmdsZSBiYXRjaGApO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZhc3QgZmFpbCBpZiB1cmwgZm9yIHN1YiByZXF1ZXN0IGlzIGludmFsaWRcbiAgICAgICAgY29uc3QgcGF0aCA9IGdldFVSTFBhdGgoc3ViUmVxdWVzdC51cmwpO1xuICAgICAgICBpZiAoIXBhdGggfHwgcGF0aCA9PT0gXCJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgdXJsIGZvciBzdWIgcmVxdWVzdDogJyR7c3ViUmVxdWVzdC51cmx9J2ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHBvc3RBZGRTdWJSZXF1ZXN0KHN1YlJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy5zdWJSZXF1ZXN0cy5zZXQodGhpcy5vcGVyYXRpb25Db3VudCwgc3ViUmVxdWVzdCk7XG4gICAgICAgIHRoaXMub3BlcmF0aW9uQ291bnQrKztcbiAgICB9XG4gICAgLy8gUmV0dXJuIHRoZSBodHRwIHJlcXVlc3QgYm9keSB3aXRoIGFzc2VtYmxpbmcgdGhlIGVuZGluZyBsaW5lIHRvIHRoZSBzdWIgcmVxdWVzdCBib2R5LlxuICAgIGdldEh0dHBSZXF1ZXN0Qm9keSgpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuYm9keX0ke3RoaXMuYmF0Y2hSZXF1ZXN0RW5kaW5nfSR7SFRUUF9MSU5FX0VORElOR31gO1xuICAgIH1cbiAgICBnZXRNdWx0aXBhcnRDb250ZW50VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwYXJ0Q29udGVudFR5cGU7XG4gICAgfVxuICAgIGdldFN1YlJlcXVlc3RzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJSZXF1ZXN0cztcbiAgICB9XG59XG5jbGFzcyBCYXRjaFJlcXVlc3RBc3NlbWJsZVBvbGljeSBleHRlbmRzIEJhc2VSZXF1ZXN0UG9saWN5IHtcbiAgICBjb25zdHJ1Y3RvcihiYXRjaFJlcXVlc3QsIG5leHRQb2xpY3ksIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIobmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZHVtbXlSZXNwb25zZSA9IHtcbiAgICAgICAgICAgIHJlcXVlc3Q6IG5ldyBXZWJSZXNvdXJjZSgpLFxuICAgICAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5iYXRjaFJlcXVlc3QgPSBiYXRjaFJlcXVlc3Q7XG4gICAgfVxuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5iYXRjaFJlcXVlc3QuYXBwZW5kU3ViUmVxdWVzdFRvQm9keShyZXF1ZXN0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHVtbXlSZXNwb25zZTsgLy8gSW50ZXJjZXB0IHJlcXVlc3QgZnJvbSBnb2luZyB0byB3aXJlXG4gICAgfVxufVxuY2xhc3MgQmF0Y2hSZXF1ZXN0QXNzZW1ibGVQb2xpY3lGYWN0b3J5IHtcbiAgICBjb25zdHJ1Y3RvcihiYXRjaFJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy5iYXRjaFJlcXVlc3QgPSBiYXRjaFJlcXVlc3Q7XG4gICAgfVxuICAgIGNyZWF0ZShuZXh0UG9saWN5LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgQmF0Y2hSZXF1ZXN0QXNzZW1ibGVQb2xpY3kodGhpcy5iYXRjaFJlcXVlc3QsIG5leHRQb2xpY3ksIG9wdGlvbnMpO1xuICAgIH1cbn1cbmNsYXNzIEJhdGNoSGVhZGVyRmlsdGVyUG9saWN5IGV4dGVuZHMgQmFzZVJlcXVlc3RQb2xpY3kge1xuICAgIC8vIFRoZSBiYXNlIGNsYXNzIGhhcyBhIHByb3RlY3RlZCBjb25zdHJ1Y3Rvci4gQWRkaW5nIGEgcHVibGljIG9uZSB0byBlbmFibGUgY29uc3RydWN0aW5nIG9mIHRoaXMgY2xhc3MuXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2VsZXNzLWNvbnN0cnVjdG9yKi9cbiAgICBjb25zdHJ1Y3RvcihuZXh0UG9saWN5LCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG5leHRQb2xpY3ksIG9wdGlvbnMpO1xuICAgIH1cbiAgICBhc3luYyBzZW5kUmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgICAgIGxldCB4TXNIZWFkZXJOYW1lID0gXCJcIjtcbiAgICAgICAgZm9yIChjb25zdCBoZWFkZXIgb2YgcmVxdWVzdC5oZWFkZXJzLmhlYWRlcnNBcnJheSgpKSB7XG4gICAgICAgICAgICBpZiAoaUVxdWFsKGhlYWRlci5uYW1lLCBIZWFkZXJDb25zdGFudHMuWF9NU19WRVJTSU9OKSkge1xuICAgICAgICAgICAgICAgIHhNc0hlYWRlck5hbWUgPSBoZWFkZXIubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoeE1zSGVhZGVyTmFtZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnJlbW92ZSh4TXNIZWFkZXJOYW1lKTsgLy8gVGhlIHN1YnJlcXVlc3RzIHNob3VsZCBub3QgaGF2ZSB0aGUgeC1tcy12ZXJzaW9uIGhlYWRlci5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbmV4dFBvbGljeS5zZW5kUmVxdWVzdChyZXF1ZXN0KTtcbiAgICB9XG59XG5jbGFzcyBCYXRjaEhlYWRlckZpbHRlclBvbGljeUZhY3Rvcnkge1xuICAgIGNyZWF0ZShuZXh0UG9saWN5LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgQmF0Y2hIZWFkZXJGaWx0ZXJQb2xpY3kobmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmxvYkJhdGNoLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgQmF0Y2hSZXNwb25zZVBhcnNlciB9IGZyb20gXCIuL0JhdGNoUmVzcG9uc2VQYXJzZXJcIjtcbmltcG9ydCB7IHV0ZjhCeXRlTGVuZ3RoIH0gZnJvbSBcIi4vQmF0Y2hVdGlsc1wiO1xuaW1wb3J0IHsgQmxvYkJhdGNoIH0gZnJvbSBcIi4vQmxvYkJhdGNoXCI7XG5pbXBvcnQgeyBTcGFuU3RhdHVzQ29kZSB9IGZyb20gXCJAYXp1cmUvY29yZS10cmFjaW5nXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlLCBjcmVhdGVTcGFuIH0gZnJvbSBcIi4vdXRpbHMvdHJhY2luZ1wiO1xuaW1wb3J0IHsgU2VydmljZSwgQ29udGFpbmVyIH0gZnJvbSBcIi4vZ2VuZXJhdGVkL3NyYy9vcGVyYXRpb25zXCI7XG5pbXBvcnQgeyBBbm9ueW1vdXNDcmVkZW50aWFsIH0gZnJvbSBcIi4vY3JlZGVudGlhbHMvQW5vbnltb3VzQ3JlZGVudGlhbFwiO1xuaW1wb3J0IHsgU3RvcmFnZUNsaWVudENvbnRleHQgfSBmcm9tIFwiLi9nZW5lcmF0ZWQvc3JjL3N0b3JhZ2VDbGllbnRDb250ZXh0XCI7XG5pbXBvcnQgeyBuZXdQaXBlbGluZSwgaXNQaXBlbGluZUxpa2UgfSBmcm9tIFwiLi9QaXBlbGluZVwiO1xuaW1wb3J0IHsgZ2V0VVJMUGF0aCB9IGZyb20gXCIuL3V0aWxzL3V0aWxzLmNvbW1vblwiO1xuLyoqXG4gKiBBIEJsb2JCYXRjaENsaWVudCBhbGxvd3MgeW91IHRvIG1ha2UgYmF0Y2hlZCByZXF1ZXN0cyB0byB0aGUgQXp1cmUgU3RvcmFnZSBCbG9iIHNlcnZpY2UuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvYmxvYi1iYXRjaFxuICovXG5leHBvcnQgY2xhc3MgQmxvYkJhdGNoQ2xpZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih1cmwsIGNyZWRlbnRpYWxPclBpcGVsaW5lLCBcbiAgICAvLyBMZWdhY3ksIG5vIGZpeCBmb3IgZXNsaW50IGVycm9yIHdpdGhvdXQgYnJlYWtpbmcuIERpc2FibGUgaXQgZm9yIHRoaXMgaW50ZXJmYWNlLlxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYXp1cmUvYXp1cmUtc2RrL3RzLW5hbWluZy1vcHRpb25zKi9cbiAgICBvcHRpb25zKSB7XG4gICAgICAgIGxldCBwaXBlbGluZTtcbiAgICAgICAgaWYgKGlzUGlwZWxpbmVMaWtlKGNyZWRlbnRpYWxPclBpcGVsaW5lKSkge1xuICAgICAgICAgICAgcGlwZWxpbmUgPSBjcmVkZW50aWFsT3JQaXBlbGluZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghY3JlZGVudGlhbE9yUGlwZWxpbmUpIHtcbiAgICAgICAgICAgIC8vIG5vIGNyZWRlbnRpYWwgcHJvdmlkZWRcbiAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUobmV3IEFub255bW91c0NyZWRlbnRpYWwoKSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwaXBlbGluZSA9IG5ld1BpcGVsaW5lKGNyZWRlbnRpYWxPclBpcGVsaW5lLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdG9yYWdlQ2xpZW50Q29udGV4dCA9IG5ldyBTdG9yYWdlQ2xpZW50Q29udGV4dCh1cmwsIHBpcGVsaW5lLnRvU2VydmljZUNsaWVudE9wdGlvbnMoKSk7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRVUkxQYXRoKHVybCk7XG4gICAgICAgIGlmIChwYXRoICYmIHBhdGggIT09IFwiL1wiKSB7XG4gICAgICAgICAgICAvLyBDb250YWluZXIgc2NvcGVkLlxuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlT3JDb250YWluZXJDb250ZXh0ID0gbmV3IENvbnRhaW5lcihzdG9yYWdlQ2xpZW50Q29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2VPckNvbnRhaW5lckNvbnRleHQgPSBuZXcgU2VydmljZShzdG9yYWdlQ2xpZW50Q29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBCbG9iQmF0Y2h9LlxuICAgICAqIEEgQmxvYkJhdGNoIHJlcHJlc2VudHMgYW4gYWdncmVnYXRlZCBzZXQgb2Ygb3BlcmF0aW9ucyBvbiBibG9icy5cbiAgICAgKi9cbiAgICBjcmVhdGVCYXRjaCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iQmF0Y2goKTtcbiAgICB9XG4gICAgYXN5bmMgZGVsZXRlQmxvYnModXJsc09yQmxvYkNsaWVudHMsIGNyZWRlbnRpYWxPck9wdGlvbnMsIFxuICAgIC8vIExlZ2FjeSwgbm8gZml4IGZvciBlc2xpbnQgZXJyb3Igd2l0aG91dCBicmVha2luZy4gRGlzYWJsZSBpdCBmb3IgdGhpcyBpbnRlcmZhY2UuXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhenVyZS9henVyZS1zZGsvdHMtbmFtaW5nLW9wdGlvbnMqL1xuICAgIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgYmF0Y2ggPSBuZXcgQmxvYkJhdGNoKCk7XG4gICAgICAgIGZvciAoY29uc3QgdXJsT3JCbG9iQ2xpZW50IG9mIHVybHNPckJsb2JDbGllbnRzKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHVybE9yQmxvYkNsaWVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGF3YWl0IGJhdGNoLmRlbGV0ZUJsb2IodXJsT3JCbG9iQ2xpZW50LCBjcmVkZW50aWFsT3JPcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IGJhdGNoLmRlbGV0ZUJsb2IodXJsT3JCbG9iQ2xpZW50LCBjcmVkZW50aWFsT3JPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zdWJtaXRCYXRjaChiYXRjaCk7XG4gICAgfVxuICAgIGFzeW5jIHNldEJsb2JzQWNjZXNzVGllcih1cmxzT3JCbG9iQ2xpZW50cywgY3JlZGVudGlhbE9yVGllciwgdGllck9yT3B0aW9ucywgXG4gICAgLy8gTGVnYWN5LCBubyBmaXggZm9yIGVzbGludCBlcnJvciB3aXRob3V0IGJyZWFraW5nLiBEaXNhYmxlIGl0IGZvciB0aGlzIGludGVyZmFjZS5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGF6dXJlL2F6dXJlLXNkay90cy1uYW1pbmctb3B0aW9ucyovXG4gICAgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBiYXRjaCA9IG5ldyBCbG9iQmF0Y2goKTtcbiAgICAgICAgZm9yIChjb25zdCB1cmxPckJsb2JDbGllbnQgb2YgdXJsc09yQmxvYkNsaWVudHMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsT3JCbG9iQ2xpZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgYmF0Y2guc2V0QmxvYkFjY2Vzc1RpZXIodXJsT3JCbG9iQ2xpZW50LCBjcmVkZW50aWFsT3JUaWVyLCB0aWVyT3JPcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IGJhdGNoLnNldEJsb2JBY2Nlc3NUaWVyKHVybE9yQmxvYkNsaWVudCwgY3JlZGVudGlhbE9yVGllciwgdGllck9yT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3VibWl0QmF0Y2goYmF0Y2gpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdWJtaXQgYmF0Y2ggcmVxdWVzdCB3aGljaCBjb25zaXN0cyBvZiBtdWx0aXBsZSBzdWJyZXF1ZXN0cy5cbiAgICAgKlxuICAgICAqIEdldCBgYmxvYkJhdGNoQ2xpZW50YCBhbmQgb3RoZXIgZGV0YWlscyBiZWZvcmUgcnVubmluZyB0aGUgc25pcHBldHMuXG4gICAgICogYGJsb2JTZXJ2aWNlQ2xpZW50LmdldEJsb2JCYXRjaENsaWVudCgpYCBnaXZlcyB0aGUgYGJsb2JCYXRjaENsaWVudGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNhZ2U6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGxldCBiYXRjaFJlcXVlc3QgPSBuZXcgQmxvYkJhdGNoKCk7XG4gICAgICogYXdhaXQgYmF0Y2hSZXF1ZXN0LmRlbGV0ZUJsb2IodXJsSW5TdHJpbmcwLCBjcmVkZW50aWFsMCk7XG4gICAgICogYXdhaXQgYmF0Y2hSZXF1ZXN0LmRlbGV0ZUJsb2IodXJsSW5TdHJpbmcxLCBjcmVkZW50aWFsMSwge1xuICAgICAqICBkZWxldGVTbmFwc2hvdHM6IFwiaW5jbHVkZVwiXG4gICAgICogfSk7XG4gICAgICogY29uc3QgYmF0Y2hSZXNwID0gYXdhaXQgYmxvYkJhdGNoQ2xpZW50LnN1Ym1pdEJhdGNoKGJhdGNoUmVxdWVzdCk7XG4gICAgICogY29uc29sZS5sb2coYmF0Y2hSZXNwLnN1YlJlc3BvbnNlc1N1Y2NlZWRlZENvdW50KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYSBsZWFzZTpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogbGV0IGJhdGNoUmVxdWVzdCA9IG5ldyBCbG9iQmF0Y2goKTtcbiAgICAgKiBhd2FpdCBiYXRjaFJlcXVlc3Quc2V0QmxvYkFjY2Vzc1RpZXIoYmxvY2tCbG9iQ2xpZW50MCwgXCJDb29sXCIpO1xuICAgICAqIGF3YWl0IGJhdGNoUmVxdWVzdC5zZXRCbG9iQWNjZXNzVGllcihibG9ja0Jsb2JDbGllbnQxLCBcIkNvb2xcIiwge1xuICAgICAqICBjb25kaXRpb25zOiB7IGxlYXNlSWQ6IGxlYXNlSWQgfVxuICAgICAqIH0pO1xuICAgICAqIGNvbnN0IGJhdGNoUmVzcCA9IGF3YWl0IGJsb2JCYXRjaENsaWVudC5zdWJtaXRCYXRjaChiYXRjaFJlcXVlc3QpO1xuICAgICAqIGNvbnNvbGUubG9nKGJhdGNoUmVzcC5zdWJSZXNwb25zZXNTdWNjZWVkZWRDb3VudCk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9ibG9iLWJhdGNoXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYmF0Y2hSZXF1ZXN0IC0gQSBzZXQgb2YgRGVsZXRlIG9yIFNldFRpZXIgb3BlcmF0aW9ucy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgYXN5bmMgc3VibWl0QmF0Y2goYmF0Y2hSZXF1ZXN0LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCFiYXRjaFJlcXVlc3QgfHwgYmF0Y2hSZXF1ZXN0LmdldFN1YlJlcXVlc3RzKCkuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCYXRjaCByZXF1ZXN0IHNob3VsZCBjb250YWluIG9uZSBvciBtb3JlIHN1YiByZXF1ZXN0cy5cIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JCYXRjaENsaWVudC1zdWJtaXRCYXRjaFwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGJhdGNoUmVxdWVzdEJvZHkgPSBiYXRjaFJlcXVlc3QuZ2V0SHR0cFJlcXVlc3RCb2R5KCk7XG4gICAgICAgICAgICAvLyBTZXJ2aWNlU3VibWl0QmF0Y2hSZXNwb25zZU1vZGVsIGFuZCBDb250YWluZXJTdWJtaXRCYXRjaFJlc3BvbnNlIGFyZSBjb21wYXRpYmxlIGZvciBub3cuXG4gICAgICAgICAgICBjb25zdCByYXdCYXRjaFJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZXJ2aWNlT3JDb250YWluZXJDb250ZXh0LnN1Ym1pdEJhdGNoKHV0ZjhCeXRlTGVuZ3RoKGJhdGNoUmVxdWVzdEJvZHkpLCBiYXRjaFJlcXVlc3QuZ2V0TXVsdGlQYXJ0Q29udGVudFR5cGUoKSwgYmF0Y2hSZXF1ZXN0Qm9keSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBzdWIgcmVzcG9uc2VzIHJlc3VsdCwgaWYgbG9naWMgcmVhY2hlcyBoZXJlKGkuZS4gdGhlIGJhdGNoIHJlcXVlc3Qgc3VjY2VlZGVkIHdpdGggc3RhdHVzIGNvZGUgMjAyKS5cbiAgICAgICAgICAgIGNvbnN0IGJhdGNoUmVzcG9uc2VQYXJzZXIgPSBuZXcgQmF0Y2hSZXNwb25zZVBhcnNlcihyYXdCYXRjaFJlc3BvbnNlLCBiYXRjaFJlcXVlc3QuZ2V0U3ViUmVxdWVzdHMoKSk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZVN1bW1hcnkgPSBhd2FpdCBiYXRjaFJlc3BvbnNlUGFyc2VyLnBhcnNlQmF0Y2hSZXNwb25zZSgpO1xuICAgICAgICAgICAgY29uc3QgcmVzID0ge1xuICAgICAgICAgICAgICAgIF9yZXNwb25zZTogcmF3QmF0Y2hSZXNwb25zZS5fcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgY29udGVudFR5cGU6IHJhd0JhdGNoUmVzcG9uc2UuY29udGVudFR5cGUsXG4gICAgICAgICAgICAgICAgZXJyb3JDb2RlOiByYXdCYXRjaFJlc3BvbnNlLmVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IHJhd0JhdGNoUmVzcG9uc2UucmVxdWVzdElkLFxuICAgICAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDogcmF3QmF0Y2hSZXNwb25zZS5jbGllbnRSZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogcmF3QmF0Y2hSZXNwb25zZS52ZXJzaW9uLFxuICAgICAgICAgICAgICAgIHN1YlJlc3BvbnNlczogcmVzcG9uc2VTdW1tYXJ5LnN1YlJlc3BvbnNlcyxcbiAgICAgICAgICAgICAgICBzdWJSZXNwb25zZXNTdWNjZWVkZWRDb3VudDogcmVzcG9uc2VTdW1tYXJ5LnN1YlJlc3BvbnNlc1N1Y2NlZWRlZENvdW50LFxuICAgICAgICAgICAgICAgIHN1YlJlc3BvbnNlc0ZhaWxlZENvdW50OiByZXNwb25zZVN1bW1hcnkuc3ViUmVzcG9uc2VzRmFpbGVkQ291bnQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CbG9iQmF0Y2hDbGllbnQuanMubWFwIiwiaW1wb3J0IHsgX19hc3luY0RlbGVnYXRvciwgX19hc3luY0dlbmVyYXRvciwgX19hc3luY1ZhbHVlcywgX19hd2FpdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdFByb3h5U2V0dGluZ3MsIGlzTm9kZSwgaXNUb2tlbkNyZWRlbnRpYWwsIFVSTEJ1aWxkZXIsIH0gZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmltcG9ydCB7IFNwYW5TdGF0dXNDb2RlIH0gZnJvbSBcIkBhenVyZS9jb3JlLXRyYWNpbmdcIjtcbmltcG9ydCB7IEFub255bW91c0NyZWRlbnRpYWwgfSBmcm9tIFwiLi9jcmVkZW50aWFscy9Bbm9ueW1vdXNDcmVkZW50aWFsXCI7XG5pbXBvcnQgeyBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCB9IGZyb20gXCIuL2NyZWRlbnRpYWxzL1N0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsXCI7XG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi9nZW5lcmF0ZWQvc3JjL29wZXJhdGlvbnNcIjtcbmltcG9ydCB7IG5ld1BpcGVsaW5lLCBpc1BpcGVsaW5lTGlrZSB9IGZyb20gXCIuL1BpcGVsaW5lXCI7XG5pbXBvcnQgeyBTdG9yYWdlQ2xpZW50IH0gZnJvbSBcIi4vU3RvcmFnZUNsaWVudFwiO1xuaW1wb3J0IHsgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSwgY3JlYXRlU3BhbiB9IGZyb20gXCIuL3V0aWxzL3RyYWNpbmdcIjtcbmltcG9ydCB7IGFwcGVuZFRvVVJMUGF0aCwgYXBwZW5kVG9VUkxRdWVyeSwgQmxvYk5hbWVUb1N0cmluZywgQ29udmVydEludGVybmFsUmVzcG9uc2VPZkxpc3RCbG9iRmxhdCwgQ29udmVydEludGVybmFsUmVzcG9uc2VPZkxpc3RCbG9iSGllcmFyY2h5LCBFc2NhcGVQYXRoLCBleHRyYWN0Q29ubmVjdGlvblN0cmluZ1BhcnRzLCBpc0lwRW5kcG9pbnRTdHlsZSwgcGFyc2VPYmplY3RSZXBsaWNhdGlvblJlY29yZCwgdG9UYWdzLCB0cnVuY2F0ZWRJU084MDYxRGF0ZSwgfSBmcm9tIFwiLi91dGlscy91dGlscy5jb21tb25cIjtcbmltcG9ydCB7IGdlbmVyYXRlQmxvYlNBU1F1ZXJ5UGFyYW1ldGVycyB9IGZyb20gXCIuL3Nhcy9CbG9iU0FTU2lnbmF0dXJlVmFsdWVzXCI7XG5pbXBvcnQgeyBCbG9iTGVhc2VDbGllbnQgfSBmcm9tIFwiLi9CbG9iTGVhc2VDbGllbnRcIjtcbmltcG9ydCB7IEFwcGVuZEJsb2JDbGllbnQsIEJsb2JDbGllbnQsIEJsb2NrQmxvYkNsaWVudCwgUGFnZUJsb2JDbGllbnQsIH0gZnJvbSBcIi4vQ2xpZW50c1wiO1xuaW1wb3J0IHsgQmxvYkJhdGNoQ2xpZW50IH0gZnJvbSBcIi4vQmxvYkJhdGNoQ2xpZW50XCI7XG4vKipcbiAqIEEgQ29udGFpbmVyQ2xpZW50IHJlcHJlc2VudHMgYSBVUkwgdG8gdGhlIEF6dXJlIFN0b3JhZ2UgY29udGFpbmVyIGFsbG93aW5nIHlvdSB0byBtYW5pcHVsYXRlIGl0cyBibG9icy5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRhaW5lckNsaWVudCBleHRlbmRzIFN0b3JhZ2VDbGllbnQge1xuICAgIGNvbnN0cnVjdG9yKHVybE9yQ29ubmVjdGlvblN0cmluZywgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUsIFxuICAgIC8vIExlZ2FjeSwgbm8gZml4IGZvciBlc2xpbnQgZXJyb3Igd2l0aG91dCBicmVha2luZy4gRGlzYWJsZSBpdCBmb3IgdGhpcyBpbnRlcmZhY2UuXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhenVyZS9henVyZS1zZGsvdHMtbmFtaW5nLW9wdGlvbnMqL1xuICAgIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHBpcGVsaW5lO1xuICAgICAgICBsZXQgdXJsO1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgaWYgKGlzUGlwZWxpbmVMaWtlKGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lKSkge1xuICAgICAgICAgICAgLy8gKHVybDogc3RyaW5nLCBwaXBlbGluZTogUGlwZWxpbmUpXG4gICAgICAgICAgICB1cmwgPSB1cmxPckNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICAgICAgICBwaXBlbGluZSA9IGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChpc05vZGUgJiYgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgaW5zdGFuY2VvZiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCkgfHxcbiAgICAgICAgICAgIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lIGluc3RhbmNlb2YgQW5vbnltb3VzQ3JlZGVudGlhbCB8fFxuICAgICAgICAgICAgaXNUb2tlbkNyZWRlbnRpYWwoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUpKSB7XG4gICAgICAgICAgICAvLyAodXJsOiBzdHJpbmcsIGNyZWRlbnRpYWw/OiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCB8IEFub255bW91c0NyZWRlbnRpYWwgfCBUb2tlbkNyZWRlbnRpYWwsIG9wdGlvbnM/OiBTdG9yYWdlUGlwZWxpbmVPcHRpb25zKVxuICAgICAgICAgICAgdXJsID0gdXJsT3JDb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lICYmXG4gICAgICAgICAgICB0eXBlb2YgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIC8vICh1cmw6IHN0cmluZywgY3JlZGVudGlhbD86IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsIHwgQW5vbnltb3VzQ3JlZGVudGlhbCB8IFRva2VuQ3JlZGVudGlhbCwgb3B0aW9ucz86IFN0b3JhZ2VQaXBlbGluZU9wdGlvbnMpXG4gICAgICAgICAgICAvLyBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuIFVzZSBhbm9ueW1vdXMgY3JlZGVudGlhbC5cbiAgICAgICAgICAgIHVybCA9IHVybE9yQ29ubmVjdGlvblN0cmluZztcbiAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUobmV3IEFub255bW91c0NyZWRlbnRpYWwoKSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgLy8gKGNvbm5lY3Rpb25TdHJpbmc6IHN0cmluZywgY29udGFpbmVyTmFtZTogc3RyaW5nLCBibG9iTmFtZTogc3RyaW5nLCBvcHRpb25zPzogU3RvcmFnZVBpcGVsaW5lT3B0aW9ucylcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWUgPSBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGV4dHJhY3RlZENyZWRzID0gZXh0cmFjdENvbm5lY3Rpb25TdHJpbmdQYXJ0cyh1cmxPckNvbm5lY3Rpb25TdHJpbmcpO1xuICAgICAgICAgICAgaWYgKGV4dHJhY3RlZENyZWRzLmtpbmQgPT09IFwiQWNjb3VudENvbm5TdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkS2V5Q3JlZGVudGlhbCA9IG5ldyBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbChleHRyYWN0ZWRDcmVkcy5hY2NvdW50TmFtZSwgZXh0cmFjdGVkQ3JlZHMuYWNjb3VudEtleSk7XG4gICAgICAgICAgICAgICAgICAgIHVybCA9IGFwcGVuZFRvVVJMUGF0aChleHRyYWN0ZWRDcmVkcy51cmwsIGVuY29kZVVSSUNvbXBvbmVudChjb250YWluZXJOYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5wcm94eU9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHJveHlPcHRpb25zID0gZ2V0RGVmYXVsdFByb3h5U2V0dGluZ3MoZXh0cmFjdGVkQ3JlZHMucHJveHlVcmkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUoc2hhcmVkS2V5Q3JlZGVudGlhbCwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBY2NvdW50IGNvbm5lY3Rpb24gc3RyaW5nIGlzIG9ubHkgc3VwcG9ydGVkIGluIE5vZGUuanMgZW52aXJvbm1lbnRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXh0cmFjdGVkQ3JlZHMua2luZCA9PT0gXCJTQVNDb25uU3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICB1cmwgPVxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRUb1VSTFBhdGgoZXh0cmFjdGVkQ3JlZHMudXJsLCBlbmNvZGVVUklDb21wb25lbnQoY29udGFpbmVyTmFtZSkpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiP1wiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RlZENyZWRzLmFjY291bnRTYXM7XG4gICAgICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShuZXcgQW5vbnltb3VzQ3JlZGVudGlhbCgpLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbm5lY3Rpb24gc3RyaW5nIG11c3QgYmUgZWl0aGVyIGFuIEFjY291bnQgY29ubmVjdGlvbiBzdHJpbmcgb3IgYSBTQVMgY29ubmVjdGlvbiBzdHJpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3Rpbmcgbm9uLWVtcHR5IHN0cmluZ3MgZm9yIGNvbnRhaW5lck5hbWUgcGFyYW1ldGVyXCIpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKHVybCwgcGlwZWxpbmUpO1xuICAgICAgICB0aGlzLl9jb250YWluZXJOYW1lID0gdGhpcy5nZXRDb250YWluZXJOYW1lRnJvbVVybCgpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckNvbnRleHQgPSBuZXcgQ29udGFpbmVyKHRoaXMuc3RvcmFnZUNsaWVudENvbnRleHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29udGFpbmVyLlxuICAgICAqL1xuICAgIGdldCBjb250YWluZXJOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyTmFtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdW5kZXIgdGhlIHNwZWNpZmllZCBhY2NvdW50LiBJZiB0aGUgY29udGFpbmVyIHdpdGhcbiAgICAgKiB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCB0aGUgb3BlcmF0aW9uIGZhaWxzLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2NyZWF0ZS1jb250YWluZXJcbiAgICAgKiBOYW1pbmcgcnVsZXM6IEBzZWUgaHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9uYW1pbmctYW5kLXJlZmVyZW5jaW5nLWNvbnRhaW5lcnMtLWJsb2JzLS1hbmQtbWV0YWRhdGFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBDb250YWluZXIgQ3JlYXRlIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2FnZTpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY29udGFpbmVyQ2xpZW50ID0gYmxvYlNlcnZpY2VDbGllbnQuZ2V0Q29udGFpbmVyQ2xpZW50KFwiPGNvbnRhaW5lciBuYW1lPlwiKTtcbiAgICAgKiBjb25zdCBjcmVhdGVDb250YWluZXJSZXNwb25zZSA9IGF3YWl0IGNvbnRhaW5lckNsaWVudC5jcmVhdGUoKTtcbiAgICAgKiBjb25zb2xlLmxvZyhcIkNvbnRhaW5lciB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHlcIiwgY3JlYXRlQ29udGFpbmVyUmVzcG9uc2UucmVxdWVzdElkKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGUob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJDb250YWluZXJDbGllbnQtY3JlYXRlXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gU3ByZWFkIG9wZXJhdG9yIGluIGRlc3RydWN0dXJpbmcgYXNzaWdubWVudHMsXG4gICAgICAgICAgICAvLyB0aGlzIHdpbGwgZmlsdGVyIG91dCB1bndhbnRlZCBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlc3BvbnNlIG9iamVjdCBpbnRvIHJlc3VsdCBvYmplY3RcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbnRhaW5lckNvbnRleHQuY3JlYXRlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHVuZGVyIHRoZSBzcGVjaWZpZWQgYWNjb3VudC4gSWYgdGhlIGNvbnRhaW5lciB3aXRoXG4gICAgICogdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgaXQgaXMgbm90IGNoYW5nZWQuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvY3JlYXRlLWNvbnRhaW5lclxuICAgICAqIE5hbWluZyBydWxlczogQHNlZSBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL25hbWluZy1hbmQtcmVmZXJlbmNpbmctY29udGFpbmVycy0tYmxvYnMtLWFuZC1tZXRhZGF0YVxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZUlmTm90RXhpc3RzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQ29udGFpbmVyQ2xpZW50LWNyZWF0ZUlmTm90RXhpc3RzXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jcmVhdGUodXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7IHN1Y2NlZWRlZDogdHJ1ZSB9LCByZXMpLCB7IF9yZXNwb25zZTogcmVzLl9yZXNwb25zZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKCgoX2EgPSBlLmRldGFpbHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5lcnJvckNvZGUpID09PSBcIkNvbnRhaW5lckFscmVhZHlFeGlzdHNcIikge1xuICAgICAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiRXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gY3JlYXRpbmcgYSBjb250YWluZXIgb25seSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LlwiLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBzdWNjZWVkZWQ6IGZhbHNlIH0sIChfYiA9IGUucmVzcG9uc2UpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wYXJzZWRIZWFkZXJzKSwgeyBfcmVzcG9uc2U6IGUucmVzcG9uc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEF6dXJlIGNvbnRhaW5lciByZXNvdXJjZSByZXByZXNlbnRlZCBieSB0aGlzIGNsaWVudCBleGlzdHM7IGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIE5PVEU6IHVzZSB0aGlzIGZ1bmN0aW9uIHdpdGggY2FyZSBzaW5jZSBhbiBleGlzdGluZyBjb250YWluZXIgbWlnaHQgYmUgZGVsZXRlZCBieSBvdGhlciBjbGllbnRzIG9yXG4gICAgICogYXBwbGljYXRpb25zLiBWaWNlIHZlcnNhIG5ldyBjb250YWluZXJzIHdpdGggdGhlIHNhbWUgbmFtZSBtaWdodCBiZSBhZGRlZCBieSBvdGhlciBjbGllbnRzIG9yXG4gICAgICogYXBwbGljYXRpb25zIGFmdGVyIHRoaXMgZnVuY3Rpb24gY29tcGxldGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGFzeW5jIGV4aXN0cyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkNvbnRhaW5lckNsaWVudC1leGlzdHNcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdldFByb3BlcnRpZXMoe1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlLnN0YXR1c0NvZGUgPT09IDQwNCkge1xuICAgICAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiRXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gY2hlY2tpbmcgY29udGFpbmVyIGV4aXN0ZW5jZVwiLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgQmxvYkNsaWVudH1cbiAgICAgKlxuICAgICAqIEBwYXJhbSBibG9iTmFtZSAtIEEgYmxvYiBuYW1lXG4gICAgICogQHJldHVybnMgQSBuZXcgQmxvYkNsaWVudCBvYmplY3QgZm9yIHRoZSBnaXZlbiBibG9iIG5hbWUuXG4gICAgICovXG4gICAgZ2V0QmxvYkNsaWVudChibG9iTmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IEJsb2JDbGllbnQoYXBwZW5kVG9VUkxQYXRoKHRoaXMudXJsLCBFc2NhcGVQYXRoKGJsb2JOYW1lKSksIHRoaXMucGlwZWxpbmUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBBcHBlbmRCbG9iQ2xpZW50fVxuICAgICAqXG4gICAgICogQHBhcmFtIGJsb2JOYW1lIC0gQW4gYXBwZW5kIGJsb2IgbmFtZVxuICAgICAqL1xuICAgIGdldEFwcGVuZEJsb2JDbGllbnQoYmxvYk5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBcHBlbmRCbG9iQ2xpZW50KGFwcGVuZFRvVVJMUGF0aCh0aGlzLnVybCwgRXNjYXBlUGF0aChibG9iTmFtZSkpLCB0aGlzLnBpcGVsaW5lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBCbG9ja0Jsb2JDbGllbnR9XG4gICAgICpcbiAgICAgKiBAcGFyYW0gYmxvYk5hbWUgLSBBIGJsb2NrIGJsb2IgbmFtZVxuICAgICAqXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzYWdlOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjb250ZW50ID0gXCJIZWxsbyB3b3JsZCFcIjtcbiAgICAgKlxuICAgICAqIGNvbnN0IGJsb2NrQmxvYkNsaWVudCA9IGNvbnRhaW5lckNsaWVudC5nZXRCbG9ja0Jsb2JDbGllbnQoXCI8YmxvYiBuYW1lPlwiKTtcbiAgICAgKiBjb25zdCB1cGxvYWRCbG9iUmVzcG9uc2UgPSBhd2FpdCBibG9ja0Jsb2JDbGllbnQudXBsb2FkKGNvbnRlbnQsIGNvbnRlbnQubGVuZ3RoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXRCbG9ja0Jsb2JDbGllbnQoYmxvYk5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9ja0Jsb2JDbGllbnQoYXBwZW5kVG9VUkxQYXRoKHRoaXMudXJsLCBFc2NhcGVQYXRoKGJsb2JOYW1lKSksIHRoaXMucGlwZWxpbmUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFBhZ2VCbG9iQ2xpZW50fVxuICAgICAqXG4gICAgICogQHBhcmFtIGJsb2JOYW1lIC0gQSBwYWdlIGJsb2IgbmFtZVxuICAgICAqL1xuICAgIGdldFBhZ2VCbG9iQ2xpZW50KGJsb2JOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGFnZUJsb2JDbGllbnQoYXBwZW5kVG9VUkxQYXRoKHRoaXMudXJsLCBFc2NhcGVQYXRoKGJsb2JOYW1lKSksIHRoaXMucGlwZWxpbmUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCB1c2VyLWRlZmluZWQgbWV0YWRhdGEgYW5kIHN5c3RlbSBwcm9wZXJ0aWVzIGZvciB0aGUgc3BlY2lmaWVkXG4gICAgICogY29udGFpbmVyLiBUaGUgZGF0YSByZXR1cm5lZCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBjb250YWluZXIncyBsaXN0IG9mIGJsb2JzLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2dldC1jb250YWluZXItcHJvcGVydGllc1xuICAgICAqXG4gICAgICogV0FSTklORzogVGhlIGBtZXRhZGF0YWAgb2JqZWN0IHJldHVybmVkIGluIHRoZSByZXNwb25zZSB3aWxsIGhhdmUgaXRzIGtleXMgaW4gbG93ZXJjYXNlLCBldmVuIGlmXG4gICAgICogdGhleSBvcmlnaW5hbGx5IGNvbnRhaW5lZCB1cHBlcmNhc2UgY2hhcmFjdGVycy4gVGhpcyBkaWZmZXJzIGZyb20gdGhlIG1ldGFkYXRhIGtleXMgcmV0dXJuZWQgYnlcbiAgICAgKiB0aGUgYGxpc3RDb250YWluZXJzYCBtZXRob2Qgb2Yge0BsaW5rIEJsb2JTZXJ2aWNlQ2xpZW50fSB1c2luZyB0aGUgYGluY2x1ZGVNZXRhZGF0YWAgb3B0aW9uLCB3aGljaFxuICAgICAqIHdpbGwgcmV0YWluIHRoZWlyIG9yaWdpbmFsIGNhc2luZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBDb250YWluZXIgR2V0IFByb3BlcnRpZXMgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFByb3BlcnRpZXMob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5jb25kaXRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQ29udGFpbmVyQ2xpZW50LWdldFByb3BlcnRpZXNcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb250YWluZXJDb250ZXh0LmdldFByb3BlcnRpZXMoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwgfSwgb3B0aW9ucy5jb25kaXRpb25zKSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFya3MgdGhlIHNwZWNpZmllZCBjb250YWluZXIgZm9yIGRlbGV0aW9uLiBUaGUgY29udGFpbmVyIGFuZCBhbnkgYmxvYnNcbiAgICAgKiBjb250YWluZWQgd2l0aGluIGl0IGFyZSBsYXRlciBkZWxldGVkIGR1cmluZyBnYXJiYWdlIGNvbGxlY3Rpb24uXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZGVsZXRlLWNvbnRhaW5lclxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIENvbnRhaW5lciBEZWxldGUgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCFvcHRpb25zLmNvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJDb250YWluZXJDbGllbnQtZGVsZXRlXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29udGFpbmVyQ29udGV4dC5kZWxldGUoT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFya3MgdGhlIHNwZWNpZmllZCBjb250YWluZXIgZm9yIGRlbGV0aW9uIGlmIGl0IGV4aXN0cy4gVGhlIGNvbnRhaW5lciBhbmQgYW55IGJsb2JzXG4gICAgICogY29udGFpbmVkIHdpdGhpbiBpdCBhcmUgbGF0ZXIgZGVsZXRlZCBkdXJpbmcgZ2FyYmFnZSBjb2xsZWN0aW9uLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2RlbGV0ZS1jb250YWluZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBDb250YWluZXIgRGVsZXRlIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGVJZkV4aXN0cyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkNvbnRhaW5lckNsaWVudC1kZWxldGVJZkV4aXN0c1wiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZGVsZXRlKHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBzdWNjZWVkZWQ6IHRydWUgfSwgcmVzKSwgeyBfcmVzcG9uc2U6IHJlcy5fcmVzcG9uc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmICgoKF9hID0gZS5kZXRhaWxzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZXJyb3JDb2RlKSA9PT0gXCJDb250YWluZXJOb3RGb3VuZFwiKSB7XG4gICAgICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJFeHBlY3RlZCBleGNlcHRpb24gd2hlbiBkZWxldGluZyBhIGNvbnRhaW5lciBvbmx5IGlmIGl0IGV4aXN0cy5cIixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgc3VjY2VlZGVkOiBmYWxzZSB9LCAoX2IgPSBlLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucGFyc2VkSGVhZGVycyksIHsgX3Jlc3BvbnNlOiBlLnJlc3BvbnNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBvbmUgb3IgbW9yZSB1c2VyLWRlZmluZWQgbmFtZS12YWx1ZSBwYWlycyBmb3IgdGhlIHNwZWNpZmllZCBjb250YWluZXIuXG4gICAgICpcbiAgICAgKiBJZiBubyBvcHRpb24gcHJvdmlkZWQsIG9yIG5vIG1ldGFkYXRhIGRlZmluZWQgaW4gdGhlIHBhcmFtZXRlciwgdGhlIGNvbnRhaW5lclxuICAgICAqIG1ldGFkYXRhIHdpbGwgYmUgcmVtb3ZlZC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL3NldC1jb250YWluZXItbWV0YWRhdGFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXRhZGF0YSAtIFJlcGxhY2UgZXhpc3RpbmcgbWV0YWRhdGEgd2l0aCB0aGlzIHZhbHVlLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG5vIHZhbHVlIHByb3ZpZGVkIHRoZSBleGlzdGluZyBtZXRhZGF0YSB3aWxsIGJlIHJlbW92ZWQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIENvbnRhaW5lciBTZXQgTWV0YWRhdGEgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHNldE1ldGFkYXRhKG1ldGFkYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCFvcHRpb25zLmNvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmNvbmRpdGlvbnMuaWZVbm1vZGlmaWVkU2luY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwidGhlIElmVW5tb2RpZmllZFNpbmNlIG11c3QgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcyBiZWNhdXNlIHRoZXkgYXJlIGlnbm9yZWQgYnkgdGhlIGJsb2Igc2VydmljZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQ29udGFpbmVyQ2xpZW50LXNldE1ldGFkYXRhXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29udGFpbmVyQ29udGV4dC5zZXRNZXRhZGF0YShPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtZXRhZGF0YSwgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcGVybWlzc2lvbnMgZm9yIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyLiBUaGUgcGVybWlzc2lvbnMgaW5kaWNhdGVcbiAgICAgKiB3aGV0aGVyIGNvbnRhaW5lciBkYXRhIG1heSBiZSBhY2Nlc3NlZCBwdWJsaWNseS5cbiAgICAgKlxuICAgICAqIFdBUk5JTkc6IEphdmFTY3JpcHQgRGF0ZSB3aWxsIHBvdGVudGlhbGx5IGxvc2UgcHJlY2lzaW9uIHdoZW4gcGFyc2luZyBzdGFydHNPbiBhbmQgZXhwaXJlc09uIHN0cmluZ3MuXG4gICAgICogRm9yIGV4YW1wbGUsIG5ldyBEYXRlKFwiMjAxOC0xMi0zMVQwMzo0NDoyMy44ODI3ODkxWlwiKS50b0lTT1N0cmluZygpIHdpbGwgZ2V0IFwiMjAxOC0xMi0zMVQwMzo0NDoyMy44ODJaXCIuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9nZXQtY29udGFpbmVyLWFjbFxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIENvbnRhaW5lciBHZXQgQWNjZXNzIFBvbGljeSBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgZ2V0QWNjZXNzUG9saWN5KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIW9wdGlvbnMuY29uZGl0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkNvbnRhaW5lckNsaWVudC1nZXRBY2Nlc3NQb2xpY3lcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY29udGFpbmVyQ29udGV4dC5nZXRBY2Nlc3NQb2xpY3koT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICAgICAgY29uc3QgcmVzID0ge1xuICAgICAgICAgICAgICAgIF9yZXNwb25zZTogcmVzcG9uc2UuX3Jlc3BvbnNlLFxuICAgICAgICAgICAgICAgIGJsb2JQdWJsaWNBY2Nlc3M6IHJlc3BvbnNlLmJsb2JQdWJsaWNBY2Nlc3MsXG4gICAgICAgICAgICAgICAgZGF0ZTogcmVzcG9uc2UuZGF0ZSxcbiAgICAgICAgICAgICAgICBldGFnOiByZXNwb25zZS5ldGFnLFxuICAgICAgICAgICAgICAgIGVycm9yQ29kZTogcmVzcG9uc2UuZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZDogcmVzcG9uc2UubGFzdE1vZGlmaWVkLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogcmVzcG9uc2UucmVxdWVzdElkLFxuICAgICAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDogcmVzcG9uc2UuY2xpZW50UmVxdWVzdElkLFxuICAgICAgICAgICAgICAgIHNpZ25lZElkZW50aWZpZXJzOiBbXSxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiByZXNwb25zZS52ZXJzaW9uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWRlbnRpZmllciBvZiByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGxldCBhY2Nlc3NQb2xpY3kgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKGlkZW50aWZpZXIuYWNjZXNzUG9saWN5KSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc1BvbGljeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zOiBpZGVudGlmaWVyLmFjY2Vzc1BvbGljeS5wZXJtaXNzaW9ucyxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkZW50aWZpZXIuYWNjZXNzUG9saWN5LmV4cGlyZXNPbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzUG9saWN5LmV4cGlyZXNPbiA9IG5ldyBEYXRlKGlkZW50aWZpZXIuYWNjZXNzUG9saWN5LmV4cGlyZXNPbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkZW50aWZpZXIuYWNjZXNzUG9saWN5LnN0YXJ0c09uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NQb2xpY3kuc3RhcnRzT24gPSBuZXcgRGF0ZShpZGVudGlmaWVyLmFjY2Vzc1BvbGljeS5zdGFydHNPbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzLnNpZ25lZElkZW50aWZpZXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBhY2Nlc3NQb2xpY3ksXG4gICAgICAgICAgICAgICAgICAgIGlkOiBpZGVudGlmaWVyLmlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcGVybWlzc2lvbnMgZm9yIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyLiBUaGUgcGVybWlzc2lvbnMgaW5kaWNhdGVcbiAgICAgKiB3aGV0aGVyIGJsb2JzIGluIGEgY29udGFpbmVyIG1heSBiZSBhY2Nlc3NlZCBwdWJsaWNseS5cbiAgICAgKlxuICAgICAqIFdoZW4geW91IHNldCBwZXJtaXNzaW9ucyBmb3IgYSBjb250YWluZXIsIHRoZSBleGlzdGluZyBwZXJtaXNzaW9ucyBhcmUgcmVwbGFjZWQuXG4gICAgICogSWYgbm8gYWNjZXNzIG9yIGNvbnRhaW5lckFjbCBwcm92aWRlZCwgdGhlIGV4aXN0aW5nIGNvbnRhaW5lciBBQ0wgd2lsbCBiZVxuICAgICAqIHJlbW92ZWQuXG4gICAgICpcbiAgICAgKiBXaGVuIHlvdSBlc3RhYmxpc2ggYSBzdG9yZWQgYWNjZXNzIHBvbGljeSBvbiBhIGNvbnRhaW5lciwgaXQgbWF5IHRha2UgdXAgdG8gMzAgc2Vjb25kcyB0byB0YWtlIGVmZmVjdC5cbiAgICAgKiBEdXJpbmcgdGhpcyBpbnRlcnZhbCwgYSBzaGFyZWQgYWNjZXNzIHNpZ25hdHVyZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RvcmVkIGFjY2VzcyBwb2xpY3kgd2lsbFxuICAgICAqIGZhaWwgd2l0aCBzdGF0dXMgY29kZSA0MDMgKEZvcmJpZGRlbiksIHVudGlsIHRoZSBhY2Nlc3MgcG9saWN5IGJlY29tZXMgYWN0aXZlLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL3NldC1jb250YWluZXItYWNsXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWNjZXNzIC0gVGhlIGxldmVsIG9mIHB1YmxpYyBhY2Nlc3MgdG8gZGF0YSBpbiB0aGUgY29udGFpbmVyLlxuICAgICAqIEBwYXJhbSBjb250YWluZXJBY2wgLSBBcnJheSBvZiBlbGVtZW50cyBlYWNoIGhhdmluZyBhIHVuaXF1ZSBJZCBhbmQgZGV0YWlscyBvZiB0aGUgYWNjZXNzIHBvbGljeS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gQ29udGFpbmVyIFNldCBBY2Nlc3MgUG9saWN5IG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBzZXRBY2Nlc3NQb2xpY3koYWNjZXNzLCBjb250YWluZXJBY2wsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJDb250YWluZXJDbGllbnQtc2V0QWNjZXNzUG9saWN5XCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYWNsID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2YgY29udGFpbmVyQWNsIHx8IFtdKSB7XG4gICAgICAgICAgICAgICAgYWNsLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBhY2Nlc3NQb2xpY3k6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXNPbjogaWRlbnRpZmllci5hY2Nlc3NQb2xpY3kuZXhwaXJlc09uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZShpZGVudGlmaWVyLmFjY2Vzc1BvbGljeS5leHBpcmVzT24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IGlkZW50aWZpZXIuYWNjZXNzUG9saWN5LnBlcm1pc3Npb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRzT246IGlkZW50aWZpZXIuYWNjZXNzUG9saWN5LnN0YXJ0c09uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZShpZGVudGlmaWVyLmFjY2Vzc1BvbGljeS5zdGFydHNPbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGlkOiBpZGVudGlmaWVyLmlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29udGFpbmVyQ29udGV4dC5zZXRBY2Nlc3NQb2xpY3koT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBhY2Nlc3MsIGNvbnRhaW5lckFjbDogYWNsLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGEge0BsaW5rIEJsb2JMZWFzZUNsaWVudH0gdGhhdCBtYW5hZ2VzIGxlYXNlcyBvbiB0aGUgY29udGFpbmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3Bvc2VMZWFzZUlkIC0gSW5pdGlhbCBwcm9wb3NlZCBsZWFzZSBJZC5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBCbG9iTGVhc2VDbGllbnQgb2JqZWN0IGZvciBtYW5hZ2luZyBsZWFzZXMgb24gdGhlIGNvbnRhaW5lci5cbiAgICAgKi9cbiAgICBnZXRCbG9iTGVhc2VDbGllbnQocHJvcG9zZUxlYXNlSWQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iTGVhc2VDbGllbnQodGhpcywgcHJvcG9zZUxlYXNlSWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGJsb2NrIGJsb2IsIG9yIHVwZGF0ZXMgdGhlIGNvbnRlbnQgb2YgYW4gZXhpc3RpbmcgYmxvY2sgYmxvYi5cbiAgICAgKlxuICAgICAqIFVwZGF0aW5nIGFuIGV4aXN0aW5nIGJsb2NrIGJsb2Igb3ZlcndyaXRlcyBhbnkgZXhpc3RpbmcgbWV0YWRhdGEgb24gdGhlIGJsb2IuXG4gICAgICogUGFydGlhbCB1cGRhdGVzIGFyZSBub3Qgc3VwcG9ydGVkOyB0aGUgY29udGVudCBvZiB0aGUgZXhpc3RpbmcgYmxvYiBpc1xuICAgICAqIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5ldyBjb250ZW50LiBUbyBwZXJmb3JtIGEgcGFydGlhbCB1cGRhdGUgb2YgYSBibG9jayBibG9iJ3MsXG4gICAgICogdXNlIHtAbGluayBCbG9ja0Jsb2JDbGllbnQuc3RhZ2VCbG9ja30gYW5kIHtAbGluayBCbG9ja0Jsb2JDbGllbnQuY29tbWl0QmxvY2tMaXN0fS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgYSBub24tcGFyYWxsZWwgdXBsb2FkaW5nIG1ldGhvZCwgcGxlYXNlIHVzZSB7QGxpbmsgQmxvY2tCbG9iQ2xpZW50LnVwbG9hZEZpbGV9LFxuICAgICAqIHtAbGluayBCbG9ja0Jsb2JDbGllbnQudXBsb2FkU3RyZWFtfSBvciB7QGxpbmsgQmxvY2tCbG9iQ2xpZW50LnVwbG9hZEJyb3dzZXJEYXRhfSBmb3IgYmV0dGVyXG4gICAgICogcGVyZm9ybWFuY2Ugd2l0aCBjb25jdXJyZW5jeSB1cGxvYWRpbmcuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9wdXQtYmxvYlxuICAgICAqXG4gICAgICogQHBhcmFtIGJsb2JOYW1lIC0gTmFtZSBvZiB0aGUgYmxvY2sgYmxvYiB0byBjcmVhdGUgb3IgdXBkYXRlLlxuICAgICAqIEBwYXJhbSBib2R5IC0gQmxvYiwgc3RyaW5nLCBBcnJheUJ1ZmZlciwgQXJyYXlCdWZmZXJWaWV3IG9yIGEgZnVuY3Rpb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCByZXR1cm5zIGEgbmV3IFJlYWRhYmxlIHN0cmVhbSB3aG9zZSBvZmZzZXQgaXMgZnJvbSBkYXRhIHNvdXJjZSBiZWdpbm5pbmcuXG4gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggLSBMZW5ndGggb2YgYm9keSBpbiBieXRlcy4gVXNlIEJ1ZmZlci5ieXRlTGVuZ3RoKCkgdG8gY2FsY3VsYXRlIGJvZHkgbGVuZ3RoIGZvciBhXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluY2x1ZGluZyBub24gbm9uLUJhc2U2NC9IZXgtZW5jb2RlZCBjaGFyYWN0ZXJzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBjb25maWd1cmUgdGhlIEJsb2NrIEJsb2IgVXBsb2FkIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBCbG9jayBCbG9iIHVwbG9hZCByZXNwb25zZSBkYXRhIGFuZCB0aGUgY29ycmVzcG9uZGluZyBCbG9ja0Jsb2JDbGllbnQgaW5zdGFuY2UuXG4gICAgICovXG4gICAgYXN5bmMgdXBsb2FkQmxvY2tCbG9iKGJsb2JOYW1lLCBib2R5LCBjb250ZW50TGVuZ3RoLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkNvbnRhaW5lckNsaWVudC11cGxvYWRCbG9ja0Jsb2JcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBibG9ja0Jsb2JDbGllbnQgPSB0aGlzLmdldEJsb2NrQmxvYkNsaWVudChibG9iTmFtZSk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGJsb2NrQmxvYkNsaWVudC51cGxvYWQoYm9keSwgY29udGVudExlbmd0aCwgdXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBibG9ja0Jsb2JDbGllbnQsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYXJrcyB0aGUgc3BlY2lmaWVkIGJsb2Igb3Igc25hcHNob3QgZm9yIGRlbGV0aW9uLiBUaGUgYmxvYiBpcyBsYXRlciBkZWxldGVkXG4gICAgICogZHVyaW5nIGdhcmJhZ2UgY29sbGVjdGlvbi4gTm90ZSB0aGF0IGluIG9yZGVyIHRvIGRlbGV0ZSBhIGJsb2IsIHlvdSBtdXN0IGRlbGV0ZVxuICAgICAqIGFsbCBvZiBpdHMgc25hcHNob3RzLiBZb3UgY2FuIGRlbGV0ZSBib3RoIGF0IHRoZSBzYW1lIHRpbWUgd2l0aCB0aGUgRGVsZXRlXG4gICAgICogQmxvYiBvcGVyYXRpb24uXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZGVsZXRlLWJsb2JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBibG9iTmFtZSAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIEJsb2IgRGVsZXRlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBCbG9jayBibG9iIGRlbGV0aW9uIHJlc3BvbnNlIGRhdGEuXG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlQmxvYihibG9iTmFtZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJDb250YWluZXJDbGllbnQtZGVsZXRlQmxvYlwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBibG9iQ2xpZW50ID0gdGhpcy5nZXRCbG9iQ2xpZW50KGJsb2JOYW1lKTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcnNpb25JZCkge1xuICAgICAgICAgICAgICAgIGJsb2JDbGllbnQgPSBibG9iQ2xpZW50LndpdGhWZXJzaW9uKG9wdGlvbnMudmVyc2lvbklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBibG9iQ2xpZW50LmRlbGV0ZSh1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGxpc3RCbG9iRmxhdFNlZ21lbnQgcmV0dXJucyBhIHNpbmdsZSBzZWdtZW50IG9mIGJsb2JzIHN0YXJ0aW5nIGZyb20gdGhlXG4gICAgICogc3BlY2lmaWVkIE1hcmtlci4gVXNlIGFuIGVtcHR5IE1hcmtlciB0byBzdGFydCBlbnVtZXJhdGlvbiBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICogQWZ0ZXIgZ2V0dGluZyBhIHNlZ21lbnQsIHByb2Nlc3MgaXQsIGFuZCB0aGVuIGNhbGwgbGlzdEJsb2JzRmxhdFNlZ21lbnQgYWdhaW5cbiAgICAgKiAocGFzc2luZyB0aGUgdGhlIHByZXZpb3VzbHktcmV0dXJuZWQgTWFya2VyKSB0byBnZXQgdGhlIG5leHQgc2VnbWVudC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9saXN0LWJsb2JzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWFya2VyIC0gQSBzdHJpbmcgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSBwb3J0aW9uIG9mIHRoZSBsaXN0IHRvIGJlIHJldHVybmVkIHdpdGggdGhlIG5leHQgbGlzdCBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIENvbnRhaW5lciBMaXN0IEJsb2IgRmxhdCBTZWdtZW50IG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBsaXN0QmxvYkZsYXRTZWdtZW50KG1hcmtlciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJDb250YWluZXJDbGllbnQtbGlzdEJsb2JGbGF0U2VnbWVudFwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jb250YWluZXJDb250ZXh0Lmxpc3RCbG9iRmxhdFNlZ21lbnQoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgbWFya2VyIH0sIG9wdGlvbnMpLCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICAgICAgY29uc3Qgd3JhcHBlZFJlc3BvbnNlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNwb25zZSksIHsgX3Jlc3BvbnNlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc3BvbnNlLl9yZXNwb25zZSksIHsgcGFyc2VkQm9keTogQ29udmVydEludGVybmFsUmVzcG9uc2VPZkxpc3RCbG9iRmxhdChyZXNwb25zZS5fcmVzcG9uc2UucGFyc2VkQm9keSkgfSksIHNlZ21lbnQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzcG9uc2Uuc2VnbWVudCksIHsgYmxvYkl0ZW1zOiByZXNwb25zZS5zZWdtZW50LmJsb2JJdGVtcy5tYXAoKGJsb2JJdGVtSW50ZXJhbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvYkl0ZW0gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJsb2JJdGVtSW50ZXJhbCksIHsgbmFtZTogQmxvYk5hbWVUb1N0cmluZyhibG9iSXRlbUludGVyYWwubmFtZSksIHRhZ3M6IHRvVGFncyhibG9iSXRlbUludGVyYWwuYmxvYlRhZ3MpLCBvYmplY3RSZXBsaWNhdGlvblNvdXJjZVByb3BlcnRpZXM6IHBhcnNlT2JqZWN0UmVwbGljYXRpb25SZWNvcmQoYmxvYkl0ZW1JbnRlcmFsLm9iamVjdFJlcGxpY2F0aW9uTWV0YWRhdGEpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2JJdGVtO1xuICAgICAgICAgICAgICAgICAgICB9KSB9KSB9KTtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVkUmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGxpc3RCbG9iSGllcmFyY2h5U2VnbWVudCByZXR1cm5zIGEgc2luZ2xlIHNlZ21lbnQgb2YgYmxvYnMgc3RhcnRpbmcgZnJvbVxuICAgICAqIHRoZSBzcGVjaWZpZWQgTWFya2VyLiBVc2UgYW4gZW1wdHkgTWFya2VyIHRvIHN0YXJ0IGVudW1lcmF0aW9uIGZyb20gdGhlXG4gICAgICogYmVnaW5uaW5nLiBBZnRlciBnZXR0aW5nIGEgc2VnbWVudCwgcHJvY2VzcyBpdCwgYW5kIHRoZW4gY2FsbCBsaXN0QmxvYnNIaWVyYXJjaGljYWxTZWdtZW50XG4gICAgICogYWdhaW4gKHBhc3NpbmcgdGhlIHRoZSBwcmV2aW91c2x5LXJldHVybmVkIE1hcmtlcikgdG8gZ2V0IHRoZSBuZXh0IHNlZ21lbnQuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvbGlzdC1ibG9ic1xuICAgICAqXG4gICAgICogQHBhcmFtIGRlbGltaXRlciAtIFRoZSBjaGFyYWN0ZXIgb3Igc3RyaW5nIHVzZWQgdG8gZGVmaW5lIHRoZSB2aXJ0dWFsIGhpZXJhcmNoeVxuICAgICAqIEBwYXJhbSBtYXJrZXIgLSBBIHN0cmluZyB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHBvcnRpb24gb2YgdGhlIGxpc3QgdG8gYmUgcmV0dXJuZWQgd2l0aCB0aGUgbmV4dCBsaXN0IG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gQ29udGFpbmVyIExpc3QgQmxvYiBIaWVyYXJjaHkgU2VnbWVudCBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgbGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50KGRlbGltaXRlciwgbWFya2VyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQ29udGFpbmVyQ2xpZW50LWxpc3RCbG9iSGllcmFyY2h5U2VnbWVudFwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jb250YWluZXJDb250ZXh0Lmxpc3RCbG9iSGllcmFyY2h5U2VnbWVudChkZWxpbWl0ZXIsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7IG1hcmtlciB9LCBvcHRpb25zKSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRSZXNwb25zZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzcG9uc2UpLCB7IF9yZXNwb25zZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNwb25zZS5fcmVzcG9uc2UpLCB7IHBhcnNlZEJvZHk6IENvbnZlcnRJbnRlcm5hbFJlc3BvbnNlT2ZMaXN0QmxvYkhpZXJhcmNoeShyZXNwb25zZS5fcmVzcG9uc2UucGFyc2VkQm9keSkgfSksIHNlZ21lbnQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzcG9uc2Uuc2VnbWVudCksIHsgYmxvYkl0ZW1zOiByZXNwb25zZS5zZWdtZW50LmJsb2JJdGVtcy5tYXAoKGJsb2JJdGVtSW50ZXJhbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvYkl0ZW0gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJsb2JJdGVtSW50ZXJhbCksIHsgbmFtZTogQmxvYk5hbWVUb1N0cmluZyhibG9iSXRlbUludGVyYWwubmFtZSksIHRhZ3M6IHRvVGFncyhibG9iSXRlbUludGVyYWwuYmxvYlRhZ3MpLCBvYmplY3RSZXBsaWNhdGlvblNvdXJjZVByb3BlcnRpZXM6IHBhcnNlT2JqZWN0UmVwbGljYXRpb25SZWNvcmQoYmxvYkl0ZW1JbnRlcmFsLm9iamVjdFJlcGxpY2F0aW9uTWV0YWRhdGEpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2JJdGVtO1xuICAgICAgICAgICAgICAgICAgICB9KSwgYmxvYlByZWZpeGVzOiAoX2EgPSByZXNwb25zZS5zZWdtZW50LmJsb2JQcmVmaXhlcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1hcCgoYmxvYlByZWZpeEludGVybmFsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9iUHJlZml4ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBibG9iUHJlZml4SW50ZXJuYWwpLCB7IG5hbWU6IEJsb2JOYW1lVG9TdHJpbmcoYmxvYlByZWZpeEludGVybmFsLm5hbWUpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2JQcmVmaXg7XG4gICAgICAgICAgICAgICAgICAgIH0pIH0pIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRSZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgZm9yIENvbnRhaW5lckxpc3RCbG9iRmxhdFNlZ21lbnRSZXNwb25zZVxuICAgICAqXG4gICAgICogQHBhcmFtIG1hcmtlciAtIEEgc3RyaW5nIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgcG9ydGlvbiBvZlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGlzdCBvZiBibG9icyB0byBiZSByZXR1cm5lZCB3aXRoIHRoZSBuZXh0IGxpc3Rpbmcgb3BlcmF0aW9uLiBUaGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uIHJldHVybnMgdGhlIENvbnRpbnVhdGlvblRva2VuIHZhbHVlIHdpdGhpbiB0aGUgcmVzcG9uc2UgYm9keSBpZiB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGluZyBvcGVyYXRpb24gZGlkIG5vdCByZXR1cm4gYWxsIGJsb2JzIHJlbWFpbmluZyB0byBiZSBsaXN0ZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgY3VycmVudCBwYWdlLiBUaGUgQ29udGludWF0aW9uVG9rZW4gdmFsdWUgY2FuIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFya2VyIHBhcmFtZXRlciBpbiBhIHN1YnNlcXVlbnQgY2FsbCB0byByZXF1ZXN0IHRoZSBuZXh0IHBhZ2Ugb2YgbGlzdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy4gVGhlIG1hcmtlciB2YWx1ZSBpcyBvcGFxdWUgdG8gdGhlIGNsaWVudC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gbGlzdCBibG9icyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgbGlzdFNlZ21lbnRzKG1hcmtlciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIGxpc3RTZWdtZW50c18xKCkge1xuICAgICAgICAgICAgbGV0IGxpc3RCbG9ic0ZsYXRTZWdtZW50UmVzcG9uc2U7XG4gICAgICAgICAgICBpZiAoISFtYXJrZXIgfHwgbWFya2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RCbG9ic0ZsYXRTZWdtZW50UmVzcG9uc2UgPSB5aWVsZCBfX2F3YWl0KHRoaXMubGlzdEJsb2JGbGF0U2VnbWVudChtYXJrZXIsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICAgICAgbWFya2VyID0gbGlzdEJsb2JzRmxhdFNlZ21lbnRSZXNwb25zZS5jb250aW51YXRpb25Ub2tlbjtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgeWllbGQgX19hd2FpdCh5aWVsZCBfX2F3YWl0KGxpc3RCbG9ic0ZsYXRTZWdtZW50UmVzcG9uc2UpKTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChtYXJrZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3Igb2Yge0BsaW5rIEJsb2JJdGVtfSBvYmplY3RzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gbGlzdCBibG9icyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgbGlzdEl0ZW1zKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBsaXN0SXRlbXNfMSgpIHtcbiAgICAgICAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgICAgICAgbGV0IG1hcmtlcjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX2FzeW5jVmFsdWVzKHRoaXMubGlzdFNlZ21lbnRzKG1hcmtlciwgb3B0aW9ucykpLCBfYzsgX2MgPSB5aWVsZCBfX2F3YWl0KF9iLm5leHQoKSksICFfYy5kb25lOykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaXN0QmxvYnNGbGF0U2VnbWVudFJlc3BvbnNlID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIF9fYXdhaXQoeWllbGQqIF9fYXN5bmNEZWxlZ2F0b3IoX19hc3luY1ZhbHVlcyhsaXN0QmxvYnNGbGF0U2VnbWVudFJlc3BvbnNlLnNlZ21lbnQuYmxvYkl0ZW1zKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgeWllbGQgX19hd2FpdChfYS5jYWxsKF9iKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXN5bmMgaXRlcmFibGUgaXRlcmF0b3IgdG8gbGlzdCBhbGwgdGhlIGJsb2JzXG4gICAgICogdW5kZXIgdGhlIHNwZWNpZmllZCBhY2NvdW50LlxuICAgICAqXG4gICAgICogLmJ5UGFnZSgpIHJldHVybnMgYW4gYXN5bmMgaXRlcmFibGUgaXRlcmF0b3IgdG8gbGlzdCB0aGUgYmxvYnMgaW4gcGFnZXMuXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGBmb3IgYXdhaXRgIHN5bnRheDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gR2V0IHRoZSBjb250YWluZXJDbGllbnQgYmVmb3JlIHlvdSBydW4gdGhlc2Ugc25pcHBldHMsXG4gICAgICogLy8gQ2FuIGJlIG9idGFpbmVkIGZyb20gYGJsb2JTZXJ2aWNlQ2xpZW50LmdldENvbnRhaW5lckNsaWVudChcIjx5b3VyLWNvbnRhaW5lci1uYW1lPlwiKTtgXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGZvciBhd2FpdCAoY29uc3QgYmxvYiBvZiBjb250YWluZXJDbGllbnQubGlzdEJsb2JzRmxhdCgpKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgQmxvYiAke2krK306ICR7YmxvYi5uYW1lfWApO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGl0ZXIubmV4dCgpYDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGxldCBpdGVyID0gY29udGFpbmVyQ2xpZW50Lmxpc3RCbG9ic0ZsYXQoKTtcbiAgICAgKiBsZXQgYmxvYkl0ZW0gPSBhd2FpdCBpdGVyLm5leHQoKTtcbiAgICAgKiB3aGlsZSAoIWJsb2JJdGVtLmRvbmUpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBCbG9iICR7aSsrfTogJHtibG9iSXRlbS52YWx1ZS5uYW1lfWApO1xuICAgICAqICAgYmxvYkl0ZW0gPSBhd2FpdCBpdGVyLm5leHQoKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGBieVBhZ2UoKWA6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIHBhc3Npbmcgb3B0aW9uYWwgbWF4UGFnZVNpemUgaW4gdGhlIHBhZ2Ugc2V0dGluZ3NcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogZm9yIGF3YWl0IChjb25zdCByZXNwb25zZSBvZiBjb250YWluZXJDbGllbnQubGlzdEJsb2JzRmxhdCgpLmJ5UGFnZSh7IG1heFBhZ2VTaXplOiAyMCB9KSkge1xuICAgICAqICAgZm9yIChjb25zdCBibG9iIG9mIHJlc3BvbnNlLnNlZ21lbnQuYmxvYkl0ZW1zKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBCbG9iICR7aSsrfTogJHtibG9iLm5hbWV9YCk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBwYWdpbmcgd2l0aCBhIG1hcmtlcjpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGxldCBpdGVyYXRvciA9IGNvbnRhaW5lckNsaWVudC5saXN0QmxvYnNGbGF0KCkuYnlQYWdlKHsgbWF4UGFnZVNpemU6IDIgfSk7XG4gICAgICogbGV0IHJlc3BvbnNlID0gKGF3YWl0IGl0ZXJhdG9yLm5leHQoKSkudmFsdWU7XG4gICAgICpcbiAgICAgKiAvLyBQcmludHMgMiBibG9iIG5hbWVzXG4gICAgICogZm9yIChjb25zdCBibG9iIG9mIHJlc3BvbnNlLnNlZ21lbnQuYmxvYkl0ZW1zKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgQmxvYiAke2krK306ICR7YmxvYi5uYW1lfWApO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIEdldHMgbmV4dCBtYXJrZXJcbiAgICAgKiBsZXQgbWFya2VyID0gcmVzcG9uc2UuY29udGludWF0aW9uVG9rZW47XG4gICAgICpcbiAgICAgKiAvLyBQYXNzaW5nIG5leHQgbWFya2VyIGFzIGNvbnRpbnVhdGlvblRva2VuXG4gICAgICpcbiAgICAgKiBpdGVyYXRvciA9IGNvbnRhaW5lckNsaWVudC5saXN0QmxvYnNGbGF0KCkuYnlQYWdlKHsgY29udGludWF0aW9uVG9rZW46IG1hcmtlciwgbWF4UGFnZVNpemU6IDEwIH0pO1xuICAgICAqIHJlc3BvbnNlID0gKGF3YWl0IGl0ZXJhdG9yLm5leHQoKSkudmFsdWU7XG4gICAgICpcbiAgICAgKiAvLyBQcmludHMgMTAgYmxvYiBuYW1lc1xuICAgICAqIGZvciAoY29uc3QgYmxvYiBvZiByZXNwb25zZS5zZWdtZW50LmJsb2JJdGVtcykge1xuICAgICAqICAgY29uc29sZS5sb2coYEJsb2IgJHtpKyt9OiAke2Jsb2IubmFtZX1gKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gbGlzdCBibG9icy5cbiAgICAgKiBAcmV0dXJucyBBbiBhc3luY0l0ZXJhYmxlSXRlcmF0b3IgdGhhdCBzdXBwb3J0cyBwYWdpbmcuXG4gICAgICovXG4gICAgbGlzdEJsb2JzRmxhdChvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgaW5jbHVkZSA9IFtdO1xuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlQ29weSkge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwiY29weVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlRGVsZXRlZCkge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwiZGVsZXRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlTWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGluY2x1ZGUucHVzaChcIm1ldGFkYXRhXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVTbmFwc2hvdHMpIHtcbiAgICAgICAgICAgIGluY2x1ZGUucHVzaChcInNuYXBzaG90c1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlVmVyc2lvbnMpIHtcbiAgICAgICAgICAgIGluY2x1ZGUucHVzaChcInZlcnNpb25zXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVVbmNvbW1pdGVkQmxvYnMpIHtcbiAgICAgICAgICAgIGluY2x1ZGUucHVzaChcInVuY29tbWl0dGVkYmxvYnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZVRhZ3MpIHtcbiAgICAgICAgICAgIGluY2x1ZGUucHVzaChcInRhZ3NcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZURlbGV0ZWRXaXRoVmVyc2lvbnMpIHtcbiAgICAgICAgICAgIGluY2x1ZGUucHVzaChcImRlbGV0ZWR3aXRodmVyc2lvbnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZUltbXV0YWJpbGl0eVBvbGljeSkge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwiaW1tdXRhYmlsaXR5cG9saWN5XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVMZWdhbEhvbGQpIHtcbiAgICAgICAgICAgIGluY2x1ZGUucHVzaChcImxlZ2FsaG9sZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5wcmVmaXggPT09IFwiXCIpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucHJlZml4ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRPcHRpb25zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSwgKGluY2x1ZGUubGVuZ3RoID4gMCA/IHsgaW5jbHVkZTogaW5jbHVkZSB9IDoge30pKTtcbiAgICAgICAgLy8gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRvIGl0ZXJhdGUgb3ZlciBibG9ic1xuICAgICAgICBjb25zdCBpdGVyID0gdGhpcy5saXN0SXRlbXModXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUaGUgbmV4dCBtZXRob2QsIHBhcnQgb2YgdGhlIGl0ZXJhdGlvbiBwcm90b2NvbFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBuZXh0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyLm5leHQoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBjb25uZWN0aW9uIHRvIHRoZSBhc3luYyBpdGVyYXRvciwgcGFydCBvZiB0aGUgaXRlcmF0aW9uIHByb3RvY29sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBSZXR1cm4gYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRoYXQgd29ya3MgYSBwYWdlIGF0IGEgdGltZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBieVBhZ2U6IChzZXR0aW5ncyA9IHt9KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGlzdFNlZ21lbnRzKHNldHRpbmdzLmNvbnRpbnVhdGlvblRva2VuLCBPYmplY3QuYXNzaWduKHsgbWF4UGFnZVNpemU6IHNldHRpbmdzLm1heFBhZ2VTaXplIH0sIHVwZGF0ZWRPcHRpb25zKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvciBmb3IgQ29udGFpbmVyTGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50UmVzcG9uc2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSBkZWxpbWl0ZXIgLSBUaGUgY2hhcmFjdGVyIG9yIHN0cmluZyB1c2VkIHRvIGRlZmluZSB0aGUgdmlydHVhbCBoaWVyYXJjaHlcbiAgICAgKiBAcGFyYW0gbWFya2VyIC0gQSBzdHJpbmcgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSBwb3J0aW9uIG9mXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaXN0IG9mIGJsb2JzIHRvIGJlIHJldHVybmVkIHdpdGggdGhlIG5leHQgbGlzdGluZyBvcGVyYXRpb24uIFRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gcmV0dXJucyB0aGUgQ29udGludWF0aW9uVG9rZW4gdmFsdWUgd2l0aGluIHRoZSByZXNwb25zZSBib2R5IGlmIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0aW5nIG9wZXJhdGlvbiBkaWQgbm90IHJldHVybiBhbGwgYmxvYnMgcmVtYWluaW5nIHRvIGJlIGxpc3RlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBjdXJyZW50IHBhZ2UuIFRoZSBDb250aW51YXRpb25Ub2tlbiB2YWx1ZSBjYW4gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXJrZXIgcGFyYW1ldGVyIGluIGEgc3Vic2VxdWVudCBjYWxsIHRvIHJlcXVlc3QgdGhlIG5leHQgcGFnZSBvZiBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLiBUaGUgbWFya2VyIHZhbHVlIGlzIG9wYXF1ZSB0byB0aGUgY2xpZW50LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBsaXN0IGJsb2JzIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBsaXN0SGllcmFyY2h5U2VnbWVudHMoZGVsaW1pdGVyLCBtYXJrZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBsaXN0SGllcmFyY2h5U2VnbWVudHNfMSgpIHtcbiAgICAgICAgICAgIGxldCBsaXN0QmxvYnNIaWVyYXJjaHlTZWdtZW50UmVzcG9uc2U7XG4gICAgICAgICAgICBpZiAoISFtYXJrZXIgfHwgbWFya2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RCbG9ic0hpZXJhcmNoeVNlZ21lbnRSZXNwb25zZSA9IHlpZWxkIF9fYXdhaXQodGhpcy5saXN0QmxvYkhpZXJhcmNoeVNlZ21lbnQoZGVsaW1pdGVyLCBtYXJrZXIsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICAgICAgbWFya2VyID0gbGlzdEJsb2JzSGllcmFyY2h5U2VnbWVudFJlc3BvbnNlLmNvbnRpbnVhdGlvblRva2VuO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCB5aWVsZCBfX2F3YWl0KHlpZWxkIF9fYXdhaXQobGlzdEJsb2JzSGllcmFyY2h5U2VnbWVudFJlc3BvbnNlKSk7XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAobWFya2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIGZvciB7QGxpbmsgQmxvYlByZWZpeH0gYW5kIHtAbGluayBCbG9iSXRlbX0gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkZWxpbWl0ZXIgLSBUaGUgY2hhcmFjdGVyIG9yIHN0cmluZyB1c2VkIHRvIGRlZmluZSB0aGUgdmlydHVhbCBoaWVyYXJjaHlcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gbGlzdCBibG9icyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgbGlzdEl0ZW1zQnlIaWVyYXJjaHkoZGVsaW1pdGVyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogbGlzdEl0ZW1zQnlIaWVyYXJjaHlfMSgpIHtcbiAgICAgICAgICAgIHZhciBlXzIsIF9hO1xuICAgICAgICAgICAgbGV0IG1hcmtlcjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX2FzeW5jVmFsdWVzKHRoaXMubGlzdEhpZXJhcmNoeVNlZ21lbnRzKGRlbGltaXRlciwgbWFya2VyLCBvcHRpb25zKSksIF9jOyBfYyA9IHlpZWxkIF9fYXdhaXQoX2IubmV4dCgpKSwgIV9jLmRvbmU7KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RCbG9ic0hpZXJhcmNoeVNlZ21lbnRSZXNwb25zZSA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gbGlzdEJsb2JzSGllcmFyY2h5U2VnbWVudFJlc3BvbnNlLnNlZ21lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50LmJsb2JQcmVmaXhlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcmVmaXggb2Ygc2VnbWVudC5ibG9iUHJlZml4ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB5aWVsZCBfX2F3YWl0KE9iamVjdC5hc3NpZ24oeyBraW5kOiBcInByZWZpeFwiIH0sIHByZWZpeCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYmxvYiBvZiBzZWdtZW50LmJsb2JJdGVtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgeWllbGQgX19hd2FpdChPYmplY3QuYXNzaWduKHsga2luZDogXCJibG9iXCIgfSwgYmxvYikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfMl8xKSB7IGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07IH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSB5aWVsZCBfX2F3YWl0KF9hLmNhbGwoX2IpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhc3luYyBpdGVyYWJsZSBpdGVyYXRvciB0byBsaXN0IGFsbCB0aGUgYmxvYnMgYnkgaGllcmFyY2h5LlxuICAgICAqIHVuZGVyIHRoZSBzcGVjaWZpZWQgYWNjb3VudC5cbiAgICAgKlxuICAgICAqIC5ieVBhZ2UoKSByZXR1cm5zIGFuIGFzeW5jIGl0ZXJhYmxlIGl0ZXJhdG9yIHRvIGxpc3QgdGhlIGJsb2JzIGJ5IGhpZXJhcmNoeSBpbiBwYWdlcy5cbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGZvciBhd2FpdGAgc3ludGF4OlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgY29udGFpbmVyQ2xpZW50Lmxpc3RCbG9ic0J5SGllcmFyY2h5KFwiL1wiKSkge1xuICAgICAqICAgaWYgKGl0ZW0ua2luZCA9PT0gXCJwcmVmaXhcIikge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhgXFx0QmxvYlByZWZpeDogJHtpdGVtLm5hbWV9YCk7XG4gICAgICogICB9IGVsc2Uge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhgXFx0QmxvYkl0ZW06IG5hbWUgLSAke2l0ZW0ubmFtZX1gKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGBpdGVyLm5leHQoKWA6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGxldCBpdGVyID0gY29udGFpbmVyQ2xpZW50Lmxpc3RCbG9ic0J5SGllcmFyY2h5KFwiL1wiLCB7IHByZWZpeDogXCJwcmVmaXgxL1wiIH0pO1xuICAgICAqIGxldCBlbnRpdHkgPSBhd2FpdCBpdGVyLm5leHQoKTtcbiAgICAgKiB3aGlsZSAoIWVudGl0eS5kb25lKSB7XG4gICAgICogICBsZXQgaXRlbSA9IGVudGl0eS52YWx1ZTtcbiAgICAgKiAgIGlmIChpdGVtLmtpbmQgPT09IFwicHJlZml4XCIpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coYFxcdEJsb2JQcmVmaXg6ICR7aXRlbS5uYW1lfWApO1xuICAgICAqICAgfSBlbHNlIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coYFxcdEJsb2JJdGVtOiBuYW1lIC0gJHtpdGVtLm5hbWV9YCk7XG4gICAgICogICB9XG4gICAgICogICBlbnRpdHkgPSBhd2FpdCBpdGVyLm5leHQoKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGBieVBhZ2UoKWA6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnNvbGUubG9nKFwiTGlzdGluZyBibG9icyBieSBoaWVyYXJjaHkgYnkgcGFnZVwiKTtcbiAgICAgKiBmb3IgYXdhaXQgKGNvbnN0IHJlc3BvbnNlIG9mIGNvbnRhaW5lckNsaWVudC5saXN0QmxvYnNCeUhpZXJhcmNoeShcIi9cIikuYnlQYWdlKCkpIHtcbiAgICAgKiAgIGNvbnN0IHNlZ21lbnQgPSByZXNwb25zZS5zZWdtZW50O1xuICAgICAqICAgaWYgKHNlZ21lbnQuYmxvYlByZWZpeGVzKSB7XG4gICAgICogICAgIGZvciAoY29uc3QgcHJlZml4IG9mIHNlZ21lbnQuYmxvYlByZWZpeGVzKSB7XG4gICAgICogICAgICAgY29uc29sZS5sb2coYFxcdEJsb2JQcmVmaXg6ICR7cHJlZml4Lm5hbWV9YCk7XG4gICAgICogICAgIH1cbiAgICAgKiAgIH1cbiAgICAgKiAgIGZvciAoY29uc3QgYmxvYiBvZiByZXNwb25zZS5zZWdtZW50LmJsb2JJdGVtcykge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhgXFx0QmxvYkl0ZW06IG5hbWUgLSAke2Jsb2IubmFtZX1gKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIHBhZ2luZyB3aXRoIGEgbWF4IHBhZ2Ugc2l6ZTpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc29sZS5sb2coXCJMaXN0aW5nIGJsb2JzIGJ5IGhpZXJhcmNoeSBieSBwYWdlLCBzcGVjaWZ5aW5nIGEgcHJlZml4IGFuZCBhIG1heCBwYWdlIHNpemVcIik7XG4gICAgICpcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogZm9yIGF3YWl0IChjb25zdCByZXNwb25zZSBvZiBjb250YWluZXJDbGllbnRcbiAgICAgKiAgIC5saXN0QmxvYnNCeUhpZXJhcmNoeShcIi9cIiwgeyBwcmVmaXg6IFwicHJlZml4Mi9zdWIxL1wiIH0pXG4gICAgICogICAuYnlQYWdlKHsgbWF4UGFnZVNpemU6IDIgfSkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBQYWdlICR7aSsrfWApO1xuICAgICAqICAgY29uc3Qgc2VnbWVudCA9IHJlc3BvbnNlLnNlZ21lbnQ7XG4gICAgICpcbiAgICAgKiAgIGlmIChzZWdtZW50LmJsb2JQcmVmaXhlcykge1xuICAgICAqICAgICBmb3IgKGNvbnN0IHByZWZpeCBvZiBzZWdtZW50LmJsb2JQcmVmaXhlcykge1xuICAgICAqICAgICAgIGNvbnNvbGUubG9nKGBcXHRCbG9iUHJlZml4OiAke3ByZWZpeC5uYW1lfWApO1xuICAgICAqICAgICB9XG4gICAgICogICB9XG4gICAgICpcbiAgICAgKiAgIGZvciAoY29uc3QgYmxvYiBvZiByZXNwb25zZS5zZWdtZW50LmJsb2JJdGVtcykge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhgXFx0QmxvYkl0ZW06IG5hbWUgLSAke2Jsb2IubmFtZX1gKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVsaW1pdGVyIC0gVGhlIGNoYXJhY3RlciBvciBzdHJpbmcgdXNlZCB0byBkZWZpbmUgdGhlIHZpcnR1YWwgaGllcmFyY2h5XG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGxpc3QgYmxvYnMgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGxpc3RCbG9ic0J5SGllcmFyY2h5KGRlbGltaXRlciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmIChkZWxpbWl0ZXIgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiZGVsaW1pdGVyIHNob3VsZCBjb250YWluIG9uZSBvciBtb3JlIGNoYXJhY3RlcnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5jbHVkZSA9IFtdO1xuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlQ29weSkge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwiY29weVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlRGVsZXRlZCkge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwiZGVsZXRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlTWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGluY2x1ZGUucHVzaChcIm1ldGFkYXRhXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVTbmFwc2hvdHMpIHtcbiAgICAgICAgICAgIGluY2x1ZGUucHVzaChcInNuYXBzaG90c1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlVmVyc2lvbnMpIHtcbiAgICAgICAgICAgIGluY2x1ZGUucHVzaChcInZlcnNpb25zXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVVbmNvbW1pdGVkQmxvYnMpIHtcbiAgICAgICAgICAgIGluY2x1ZGUucHVzaChcInVuY29tbWl0dGVkYmxvYnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZVRhZ3MpIHtcbiAgICAgICAgICAgIGluY2x1ZGUucHVzaChcInRhZ3NcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZURlbGV0ZWRXaXRoVmVyc2lvbnMpIHtcbiAgICAgICAgICAgIGluY2x1ZGUucHVzaChcImRlbGV0ZWR3aXRodmVyc2lvbnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZUltbXV0YWJpbGl0eVBvbGljeSkge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwiaW1tdXRhYmlsaXR5cG9saWN5XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVMZWdhbEhvbGQpIHtcbiAgICAgICAgICAgIGluY2x1ZGUucHVzaChcImxlZ2FsaG9sZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5wcmVmaXggPT09IFwiXCIpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucHJlZml4ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRPcHRpb25zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSwgKGluY2x1ZGUubGVuZ3RoID4gMCA/IHsgaW5jbHVkZTogaW5jbHVkZSB9IDoge30pKTtcbiAgICAgICAgLy8gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRvIGl0ZXJhdGUgb3ZlciBibG9iIHByZWZpeGVzIGFuZCBibG9ic1xuICAgICAgICBjb25zdCBpdGVyID0gdGhpcy5saXN0SXRlbXNCeUhpZXJhcmNoeShkZWxpbWl0ZXIsIHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIG5leHQgbWV0aG9kLCBwYXJ0IG9mIHRoZSBpdGVyYXRpb24gcHJvdG9jb2xcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgYXN5bmMgbmV4dCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlci5uZXh0KCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUaGUgY29ubmVjdGlvbiB0byB0aGUgYXN5bmMgaXRlcmF0b3IsIHBhcnQgb2YgdGhlIGl0ZXJhdGlvbiBwcm90b2NvbFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogUmV0dXJuIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvciB0aGF0IHdvcmtzIGEgcGFnZSBhdCBhIHRpbWVcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgYnlQYWdlOiAoc2V0dGluZ3MgPSB7fSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxpc3RIaWVyYXJjaHlTZWdtZW50cyhkZWxpbWl0ZXIsIHNldHRpbmdzLmNvbnRpbnVhdGlvblRva2VuLCBPYmplY3QuYXNzaWduKHsgbWF4UGFnZVNpemU6IHNldHRpbmdzLm1heFBhZ2VTaXplIH0sIHVwZGF0ZWRPcHRpb25zKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgRmlsdGVyIEJsb2JzIG9wZXJhdGlvbiBlbmFibGVzIGNhbGxlcnMgdG8gbGlzdCBibG9icyBpbiB0aGUgY29udGFpbmVyIHdob3NlIHRhZ3NcbiAgICAgKiBtYXRjaCBhIGdpdmVuIHNlYXJjaCBleHByZXNzaW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24gLSBUaGUgd2hlcmUgcGFyYW1ldGVyIGVuYWJsZXMgdGhlIGNhbGxlciB0byBxdWVyeSBibG9icyB3aG9zZSB0YWdzIG1hdGNoIGEgZ2l2ZW4gZXhwcmVzc2lvbi5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZ2l2ZW4gZXhwcmVzc2lvbiBtdXN0IGV2YWx1YXRlIHRvIHRydWUgZm9yIGEgYmxvYiB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzdWx0cy5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVbT0RhdGEgLSBBQk5GXSBmaWx0ZXIgc3ludGF4IHJ1bGUgZGVmaW5lcyB0aGUgZm9ybWFsIGdyYW1tYXIgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgd2hlcmUgcXVlcnkgcGFyYW1ldGVyO1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvd2V2ZXIsIG9ubHkgYSBzdWJzZXQgb2YgdGhlIE9EYXRhIGZpbHRlciBzeW50YXggaXMgc3VwcG9ydGVkIGluIHRoZSBCbG9iIHNlcnZpY2UuXG4gICAgICogQHBhcmFtIG1hcmtlciAtIEEgc3RyaW5nIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgcG9ydGlvbiBvZlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGlzdCBvZiBibG9icyB0byBiZSByZXR1cm5lZCB3aXRoIHRoZSBuZXh0IGxpc3Rpbmcgb3BlcmF0aW9uLiBUaGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uIHJldHVybnMgdGhlIGNvbnRpbnVhdGlvblRva2VuIHZhbHVlIHdpdGhpbiB0aGUgcmVzcG9uc2UgYm9keSBpZiB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGluZyBvcGVyYXRpb24gZGlkIG5vdCByZXR1cm4gYWxsIGJsb2JzIHJlbWFpbmluZyB0byBiZSBsaXN0ZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgY3VycmVudCBwYWdlLiBUaGUgY29udGludWF0aW9uVG9rZW4gdmFsdWUgY2FuIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFya2VyIHBhcmFtZXRlciBpbiBhIHN1YnNlcXVlbnQgY2FsbCB0byByZXF1ZXN0IHRoZSBuZXh0IHBhZ2Ugb2YgbGlzdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy4gVGhlIG1hcmtlciB2YWx1ZSBpcyBvcGFxdWUgdG8gdGhlIGNsaWVudC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gZmluZCBibG9icyBieSB0YWdzLlxuICAgICAqL1xuICAgIGFzeW5jIGZpbmRCbG9ic0J5VGFnc1NlZ21lbnQodGFnRmlsdGVyU3FsRXhwcmVzc2lvbiwgbWFya2VyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkNvbnRhaW5lckNsaWVudC1maW5kQmxvYnNCeVRhZ3NTZWdtZW50XCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvbnRhaW5lckNvbnRleHQuZmlsdGVyQmxvYnMoT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCB3aGVyZTogdGFnRmlsdGVyU3FsRXhwcmVzc2lvbiwgbWFya2VyLCBtYXhQYWdlU2l6ZTogb3B0aW9ucy5tYXhQYWdlU2l6ZSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICAgICAgY29uc3Qgd3JhcHBlZFJlc3BvbnNlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNwb25zZSksIHsgX3Jlc3BvbnNlOiByZXNwb25zZS5fcmVzcG9uc2UsIGJsb2JzOiByZXNwb25zZS5ibG9icy5tYXAoKGJsb2IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGFnVmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKChfYSA9IGJsb2IudGFncykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmJsb2JUYWdTZXQubGVuZ3RoKSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFnVmFsdWUgPSBibG9iLnRhZ3MuYmxvYlRhZ1NldFswXS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBibG9iKSwgeyB0YWdzOiB0b1RhZ3MoYmxvYi50YWdzKSwgdGFnVmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgfSkgfSk7XG4gICAgICAgICAgICByZXR1cm4gd3JhcHBlZFJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvciBmb3IgQ29udGFpbmVyRmluZEJsb2JzQnlUYWdzU2VnbWVudFJlc3BvbnNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24gLSAgVGhlIHdoZXJlIHBhcmFtZXRlciBlbmFibGVzIHRoZSBjYWxsZXIgdG8gcXVlcnkgYmxvYnMgd2hvc2UgdGFncyBtYXRjaCBhIGdpdmVuIGV4cHJlc3Npb24uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBnaXZlbiBleHByZXNzaW9uIG11c3QgZXZhbHVhdGUgdG8gdHJ1ZSBmb3IgYSBibG9iIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXN1bHRzLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVbT0RhdGEgLSBBQk5GXSBmaWx0ZXIgc3ludGF4IHJ1bGUgZGVmaW5lcyB0aGUgZm9ybWFsIGdyYW1tYXIgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgd2hlcmUgcXVlcnkgcGFyYW1ldGVyO1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3dldmVyLCBvbmx5IGEgc3Vic2V0IG9mIHRoZSBPRGF0YSBmaWx0ZXIgc3ludGF4IGlzIHN1cHBvcnRlZCBpbiB0aGUgQmxvYiBzZXJ2aWNlLlxuICAgICAqIEBwYXJhbSBtYXJrZXIgLSBBIHN0cmluZyB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHBvcnRpb24gb2ZcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpc3Qgb2YgYmxvYnMgdG8gYmUgcmV0dXJuZWQgd2l0aCB0aGUgbmV4dCBsaXN0aW5nIG9wZXJhdGlvbi4gVGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBjb250aW51YXRpb25Ub2tlbiB2YWx1ZSB3aXRoaW4gdGhlIHJlc3BvbnNlIGJvZHkgaWYgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rpbmcgb3BlcmF0aW9uIGRpZCBub3QgcmV0dXJuIGFsbCBibG9icyByZW1haW5pbmcgdG8gYmUgbGlzdGVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGN1cnJlbnQgcGFnZS4gVGhlIGNvbnRpbnVhdGlvblRva2VuIHZhbHVlIGNhbiBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hcmtlciBwYXJhbWV0ZXIgaW4gYSBzdWJzZXF1ZW50IGNhbGwgdG8gcmVxdWVzdCB0aGUgbmV4dCBwYWdlIG9mIGxpc3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuIFRoZSBtYXJrZXIgdmFsdWUgaXMgb3BhcXVlIHRvIHRoZSBjbGllbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGZpbmQgYmxvYnMgYnkgdGFncy5cbiAgICAgKi9cbiAgICBmaW5kQmxvYnNCeVRhZ3NTZWdtZW50cyh0YWdGaWx0ZXJTcWxFeHByZXNzaW9uLCBtYXJrZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBmaW5kQmxvYnNCeVRhZ3NTZWdtZW50c18xKCkge1xuICAgICAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICAgICAgaWYgKCEhbWFya2VyIHx8IG1hcmtlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIF9fYXdhaXQodGhpcy5maW5kQmxvYnNCeVRhZ3NTZWdtZW50KHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24sIG1hcmtlciwgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5ibG9icyA9IHJlc3BvbnNlLmJsb2JzIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICBtYXJrZXIgPSByZXNwb25zZS5jb250aW51YXRpb25Ub2tlbjtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgeWllbGQgX19hd2FpdChyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAobWFya2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIGZvciBibG9icy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YWdGaWx0ZXJTcWxFeHByZXNzaW9uIC0gIFRoZSB3aGVyZSBwYXJhbWV0ZXIgZW5hYmxlcyB0aGUgY2FsbGVyIHRvIHF1ZXJ5IGJsb2JzIHdob3NlIHRhZ3MgbWF0Y2ggYSBnaXZlbiBleHByZXNzaW9uLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZ2l2ZW4gZXhwcmVzc2lvbiBtdXN0IGV2YWx1YXRlIHRvIHRydWUgZm9yIGEgYmxvYiB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzdWx0cy5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlW09EYXRhIC0gQUJORl0gZmlsdGVyIHN5bnRheCBydWxlIGRlZmluZXMgdGhlIGZvcm1hbCBncmFtbWFyIGZvciB0aGUgdmFsdWUgb2YgdGhlIHdoZXJlIHF1ZXJ5IHBhcmFtZXRlcjtcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG93ZXZlciwgb25seSBhIHN1YnNldCBvZiB0aGUgT0RhdGEgZmlsdGVyIHN5bnRheCBpcyBzdXBwb3J0ZWQgaW4gdGhlIEJsb2Igc2VydmljZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gZmluZEJsb2JzQnlUYWdzSXRlbXMuXG4gICAgICovXG4gICAgZmluZEJsb2JzQnlUYWdzSXRlbXModGFnRmlsdGVyU3FsRXhwcmVzc2lvbiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIGZpbmRCbG9ic0J5VGFnc0l0ZW1zXzEoKSB7XG4gICAgICAgICAgICB2YXIgZV8zLCBfYTtcbiAgICAgICAgICAgIGxldCBtYXJrZXI7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9iID0gX19hc3luY1ZhbHVlcyh0aGlzLmZpbmRCbG9ic0J5VGFnc1NlZ21lbnRzKHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24sIG1hcmtlciwgb3B0aW9ucykpLCBfYzsgX2MgPSB5aWVsZCBfX2F3YWl0KF9iLm5leHQoKSksICFfYy5kb25lOykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIF9fYXdhaXQoeWllbGQqIF9fYXN5bmNEZWxlZ2F0b3IoX19hc3luY1ZhbHVlcyhzZWdtZW50LmJsb2JzKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzNfMSkgeyBlXzMgPSB7IGVycm9yOiBlXzNfMSB9OyB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgeWllbGQgX19hd2FpdChfYS5jYWxsKF9iKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8zKSB0aHJvdyBlXzMuZXJyb3I7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXN5bmMgaXRlcmFibGUgaXRlcmF0b3IgdG8gZmluZCBhbGwgYmxvYnMgd2l0aCBzcGVjaWZpZWQgdGFnXG4gICAgICogdW5kZXIgdGhlIHNwZWNpZmllZCBjb250YWluZXIuXG4gICAgICpcbiAgICAgKiAuYnlQYWdlKCkgcmV0dXJucyBhbiBhc3luYyBpdGVyYWJsZSBpdGVyYXRvciB0byBsaXN0IHRoZSBibG9icyBpbiBwYWdlcy5cbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGZvciBhd2FpdGAgc3ludGF4OlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogZm9yIGF3YWl0IChjb25zdCBibG9iIG9mIGNvbnRhaW5lckNsaWVudC5maW5kQmxvYnNCeVRhZ3MoXCJ0YWdrZXk9J3RhZ3ZhbHVlJ1wiKSkge1xuICAgICAqICAgY29uc29sZS5sb2coYEJsb2IgJHtpKyt9OiAke2Jsb2IubmFtZX1gKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGBpdGVyLm5leHQoKWA6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBjb25zdCBpdGVyID0gY29udGFpbmVyQ2xpZW50LmZpbmRCbG9ic0J5VGFncyhcInRhZ2tleT0ndGFndmFsdWUnXCIpO1xuICAgICAqIGxldCBibG9iSXRlbSA9IGF3YWl0IGl0ZXIubmV4dCgpO1xuICAgICAqIHdoaWxlICghYmxvYkl0ZW0uZG9uZSkge1xuICAgICAqICAgY29uc29sZS5sb2coYEJsb2IgJHtpKyt9OiAke2Jsb2JJdGVtLnZhbHVlLm5hbWV9YCk7XG4gICAgICogICBibG9iSXRlbSA9IGF3YWl0IGl0ZXIubmV4dCgpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGJ5UGFnZSgpYDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gcGFzc2luZyBvcHRpb25hbCBtYXhQYWdlU2l6ZSBpbiB0aGUgcGFnZSBzZXR0aW5nc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBmb3IgYXdhaXQgKGNvbnN0IHJlc3BvbnNlIG9mIGNvbnRhaW5lckNsaWVudC5maW5kQmxvYnNCeVRhZ3MoXCJ0YWdrZXk9J3RhZ3ZhbHVlJ1wiKS5ieVBhZ2UoeyBtYXhQYWdlU2l6ZTogMjAgfSkpIHtcbiAgICAgKiAgIGlmIChyZXNwb25zZS5ibG9icykge1xuICAgICAqICAgICBmb3IgKGNvbnN0IGJsb2Igb2YgcmVzcG9uc2UuYmxvYnMpIHtcbiAgICAgKiAgICAgICBjb25zb2xlLmxvZyhgQmxvYiAke2krK306ICR7YmxvYi5uYW1lfWApO1xuICAgICAqICAgICB9XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBwYWdpbmcgd2l0aCBhIG1hcmtlcjpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGxldCBpdGVyYXRvciA9IGNvbnRhaW5lckNsaWVudC5maW5kQmxvYnNCeVRhZ3MoXCJ0YWdrZXk9J3RhZ3ZhbHVlJ1wiKS5ieVBhZ2UoeyBtYXhQYWdlU2l6ZTogMiB9KTtcbiAgICAgKiBsZXQgcmVzcG9uc2UgPSAoYXdhaXQgaXRlcmF0b3IubmV4dCgpKS52YWx1ZTtcbiAgICAgKlxuICAgICAqIC8vIFByaW50cyAyIGJsb2IgbmFtZXNcbiAgICAgKiBpZiAocmVzcG9uc2UuYmxvYnMpIHtcbiAgICAgKiAgIGZvciAoY29uc3QgYmxvYiBvZiByZXNwb25zZS5ibG9icykge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhgQmxvYiAke2krK306ICR7YmxvYi5uYW1lfWApO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIEdldHMgbmV4dCBtYXJrZXJcbiAgICAgKiBsZXQgbWFya2VyID0gcmVzcG9uc2UuY29udGludWF0aW9uVG9rZW47XG4gICAgICogLy8gUGFzc2luZyBuZXh0IG1hcmtlciBhcyBjb250aW51YXRpb25Ub2tlblxuICAgICAqIGl0ZXJhdG9yID0gY29udGFpbmVyQ2xpZW50XG4gICAgICogICAuZmluZEJsb2JzQnlUYWdzKFwidGFna2V5PSd0YWd2YWx1ZSdcIilcbiAgICAgKiAgIC5ieVBhZ2UoeyBjb250aW51YXRpb25Ub2tlbjogbWFya2VyLCBtYXhQYWdlU2l6ZTogMTAgfSk7XG4gICAgICogcmVzcG9uc2UgPSAoYXdhaXQgaXRlcmF0b3IubmV4dCgpKS52YWx1ZTtcbiAgICAgKlxuICAgICAqIC8vIFByaW50cyBibG9iIG5hbWVzXG4gICAgICogaWYgKHJlc3BvbnNlLmJsb2JzKSB7XG4gICAgICogICBmb3IgKGNvbnN0IGJsb2Igb2YgcmVzcG9uc2UuYmxvYnMpIHtcbiAgICAgKiAgICAgIGNvbnNvbGUubG9nKGBCbG9iICR7aSsrfTogJHtibG9iLm5hbWV9YCk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24gLSAgVGhlIHdoZXJlIHBhcmFtZXRlciBlbmFibGVzIHRoZSBjYWxsZXIgdG8gcXVlcnkgYmxvYnMgd2hvc2UgdGFncyBtYXRjaCBhIGdpdmVuIGV4cHJlc3Npb24uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBnaXZlbiBleHByZXNzaW9uIG11c3QgZXZhbHVhdGUgdG8gdHJ1ZSBmb3IgYSBibG9iIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXN1bHRzLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVbT0RhdGEgLSBBQk5GXSBmaWx0ZXIgc3ludGF4IHJ1bGUgZGVmaW5lcyB0aGUgZm9ybWFsIGdyYW1tYXIgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgd2hlcmUgcXVlcnkgcGFyYW1ldGVyO1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3dldmVyLCBvbmx5IGEgc3Vic2V0IG9mIHRoZSBPRGF0YSBmaWx0ZXIgc3ludGF4IGlzIHN1cHBvcnRlZCBpbiB0aGUgQmxvYiBzZXJ2aWNlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBmaW5kIGJsb2JzIGJ5IHRhZ3MuXG4gICAgICovXG4gICAgZmluZEJsb2JzQnlUYWdzKHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAvLyBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdG8gaXRlcmF0ZSBvdmVyIGJsb2JzXG4gICAgICAgIGNvbnN0IGxpc3RTZWdtZW50T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBpdGVyID0gdGhpcy5maW5kQmxvYnNCeVRhZ3NJdGVtcyh0YWdGaWx0ZXJTcWxFeHByZXNzaW9uLCBsaXN0U2VnbWVudE9wdGlvbnMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUaGUgbmV4dCBtZXRob2QsIHBhcnQgb2YgdGhlIGl0ZXJhdGlvbiBwcm90b2NvbFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBuZXh0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyLm5leHQoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBjb25uZWN0aW9uIHRvIHRoZSBhc3luYyBpdGVyYXRvciwgcGFydCBvZiB0aGUgaXRlcmF0aW9uIHByb3RvY29sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBSZXR1cm4gYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRoYXQgd29ya3MgYSBwYWdlIGF0IGEgdGltZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBieVBhZ2U6IChzZXR0aW5ncyA9IHt9KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZEJsb2JzQnlUYWdzU2VnbWVudHModGFnRmlsdGVyU3FsRXhwcmVzc2lvbiwgc2V0dGluZ3MuY29udGludWF0aW9uVG9rZW4sIE9iamVjdC5hc3NpZ24oeyBtYXhQYWdlU2l6ZTogc2V0dGluZ3MubWF4UGFnZVNpemUgfSwgbGlzdFNlZ21lbnRPcHRpb25zKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXRDb250YWluZXJOYW1lRnJvbVVybCgpIHtcbiAgICAgICAgbGV0IGNvbnRhaW5lck5hbWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyAgVVJMIG1heSBsb29rIGxpa2UgdGhlIGZvbGxvd2luZ1xuICAgICAgICAgICAgLy8gXCJodHRwczovL215YWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvbXljb250YWluZXI/c2FzU3RyaW5nXCI7XG4gICAgICAgICAgICAvLyBcImh0dHBzOi8vbXlhY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9teWNvbnRhaW5lclwiO1xuICAgICAgICAgICAgLy8gSVB2NC9JUHY2IGFkZHJlc3MgaG9zdHMsIEVuZHBvaW50cyAtIGBodHRwOi8vMTI3LjAuMC4xOjEwMDAwL2RldnN0b3JlYWNjb3VudDEvY29udGFpbmVybmFtZWBcbiAgICAgICAgICAgIC8vIGh0dHA6Ly9sb2NhbGhvc3Q6MTAwMDEvZGV2c3RvcmVhY2NvdW50MS9jb250YWluZXJuYW1lXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBVUkxCdWlsZGVyLnBhcnNlKHRoaXMudXJsKTtcbiAgICAgICAgICAgIGlmIChwYXJzZWRVcmwuZ2V0SG9zdCgpLnNwbGl0KFwiLlwiKVsxXSA9PT0gXCJibG9iXCIpIHtcbiAgICAgICAgICAgICAgICAvLyBcImh0dHBzOi8vbXlhY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9jb250YWluZXJuYW1lXCIuXG4gICAgICAgICAgICAgICAgLy8gXCJodHRwczovL2N1c3RvbWRvbWFpbi5jb20vY29udGFpbmVybmFtZVwiLlxuICAgICAgICAgICAgICAgIC8vIC5nZXRQYXRoKCkgLT4gL2NvbnRhaW5lcm5hbWVcbiAgICAgICAgICAgICAgICBjb250YWluZXJOYW1lID0gcGFyc2VkVXJsLmdldFBhdGgoKS5zcGxpdChcIi9cIilbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0lwRW5kcG9pbnRTdHlsZShwYXJzZWRVcmwpKSB7XG4gICAgICAgICAgICAgICAgLy8gSVB2NC9JUHY2IGFkZHJlc3MgaG9zdHMuLi4gRXhhbXBsZSAtIGh0dHA6Ly8xOTIuMC4wLjEwOjEwMDAxL2RldnN0b3JlYWNjb3VudDEvY29udGFpbmVybmFtZVxuICAgICAgICAgICAgICAgIC8vIFNpbmdsZSB3b3JkIGRvbWFpbiB3aXRob3V0IGEgW2RvdF0gaW4gdGhlIGVuZHBvaW50Li4uIEV4YW1wbGUgLSBodHRwOi8vbG9jYWxob3N0OjEwMDAxL2RldnN0b3JlYWNjb3VudDEvY29udGFpbmVybmFtZVxuICAgICAgICAgICAgICAgIC8vIC5nZXRQYXRoKCkgLT4gL2RldnN0b3JlYWNjb3VudDEvY29udGFpbmVybmFtZVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lck5hbWUgPSBwYXJzZWRVcmwuZ2V0UGF0aCgpLnNwbGl0KFwiL1wiKVsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFwiaHR0cHM6Ly9jdXN0b21kb21haW4uY29tL2NvbnRhaW5lcm5hbWVcIi5cbiAgICAgICAgICAgICAgICAvLyAuZ2V0UGF0aCgpIC0+IC9jb250YWluZXJuYW1lXG4gICAgICAgICAgICAgICAgY29udGFpbmVyTmFtZSA9IHBhcnNlZFVybC5nZXRQYXRoKCkuc3BsaXQoXCIvXCIpWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZGVjb2RlIHRoZSBlbmNvZGVkIGNvbnRhaW5lck5hbWUgLSB0byBnZXQgYWxsIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgdGhhdCBtaWdodCBiZSBwcmVzZW50IGluIGl0XG4gICAgICAgICAgICBjb250YWluZXJOYW1lID0gZGVjb2RlVVJJQ29tcG9uZW50KGNvbnRhaW5lck5hbWUpO1xuICAgICAgICAgICAgaWYgKCFjb250YWluZXJOYW1lKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJvdmlkZWQgY29udGFpbmVyTmFtZSBpcyBpbnZhbGlkLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXJOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGV4dHJhY3QgY29udGFpbmVyTmFtZSB3aXRoIHByb3ZpZGVkIGluZm9ybWF0aW9uLlwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBPbmx5IGF2YWlsYWJsZSBmb3IgQ29udGFpbmVyQ2xpZW50IGNvbnN0cnVjdGVkIHdpdGggYSBzaGFyZWQga2V5IGNyZWRlbnRpYWwuXG4gICAgICpcbiAgICAgKiBHZW5lcmF0ZXMgYSBCbG9iIENvbnRhaW5lciBTZXJ2aWNlIFNoYXJlZCBBY2Nlc3MgU2lnbmF0dXJlIChTQVMpIFVSSSBiYXNlZCBvbiB0aGUgY2xpZW50IHByb3BlcnRpZXNcbiAgICAgKiBhbmQgcGFyYW1ldGVycyBwYXNzZWQgaW4uIFRoZSBTQVMgaXMgc2lnbmVkIGJ5IHRoZSBzaGFyZWQga2V5IGNyZWRlbnRpYWwgb2YgdGhlIGNsaWVudC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2NvbnN0cnVjdGluZy1hLXNlcnZpY2Utc2FzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybnMgVGhlIFNBUyBVUkkgY29uc2lzdGluZyBvZiB0aGUgVVJJIHRvIHRoZSByZXNvdXJjZSByZXByZXNlbnRlZCBieSB0aGlzIGNsaWVudCwgZm9sbG93ZWQgYnkgdGhlIGdlbmVyYXRlZCBTQVMgdG9rZW4uXG4gICAgICovXG4gICAgZ2VuZXJhdGVTYXNVcmwob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGlmICghKHRoaXMuY3JlZGVudGlhbCBpbnN0YW5jZW9mIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQ2FuIG9ubHkgZ2VuZXJhdGUgdGhlIFNBUyB3aGVuIHRoZSBjbGllbnQgaXMgaW5pdGlhbGl6ZWQgd2l0aCBhIHNoYXJlZCBrZXkgY3JlZGVudGlhbFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNhcyA9IGdlbmVyYXRlQmxvYlNBU1F1ZXJ5UGFyYW1ldGVycyhPYmplY3QuYXNzaWduKHsgY29udGFpbmVyTmFtZTogdGhpcy5fY29udGFpbmVyTmFtZSB9LCBvcHRpb25zKSwgdGhpcy5jcmVkZW50aWFsKS50b1N0cmluZygpO1xuICAgICAgICAgICAgcmVzb2x2ZShhcHBlbmRUb1VSTFF1ZXJ5KHRoaXMudXJsLCBzYXMpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBCbG9iQmF0Y2hDbGllbnQgb2JqZWN0IHRvIGNvbmR1Y3QgYmF0Y2ggb3BlcmF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2Jsb2ItYmF0Y2hcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgbmV3IEJsb2JCYXRjaENsaWVudCBvYmplY3QgZm9yIHRoaXMgY29udGFpbmVyLlxuICAgICAqL1xuICAgIGdldEJsb2JCYXRjaENsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iQmF0Y2hDbGllbnQodGhpcy51cmwsIHRoaXMucGlwZWxpbmUpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnRhaW5lckNsaWVudC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbi8qKlxuICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICpcbiAqIFRoaXMgaXMgYSBoZWxwZXIgY2xhc3MgdG8gY29uc3RydWN0IGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSBhbiBBY2NvdW50U0FTLiBTZXR0aW5nIGEgdmFsdWVcbiAqIHRvIHRydWUgbWVhbnMgdGhhdCBhbnkgU0FTIHdoaWNoIHVzZXMgdGhlc2UgcGVybWlzc2lvbnMgd2lsbCBncmFudCBwZXJtaXNzaW9ucyBmb3IgdGhhdCBvcGVyYXRpb24uIE9uY2UgYWxsIHRoZVxuICogdmFsdWVzIGFyZSBzZXQsIHRoaXMgc2hvdWxkIGJlIHNlcmlhbGl6ZWQgd2l0aCB0b1N0cmluZyBhbmQgc2V0IGFzIHRoZSBwZXJtaXNzaW9ucyBmaWVsZCBvbiBhblxuICoge0BsaW5rIEFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXN9IG9iamVjdC4gSXQgaXMgcG9zc2libGUgdG8gY29uc3RydWN0IHRoZSBwZXJtaXNzaW9ucyBzdHJpbmcgd2l0aG91dCB0aGlzIGNsYXNzLCBidXRcbiAqIHRoZSBvcmRlciBvZiB0aGUgcGVybWlzc2lvbnMgaXMgcGFydGljdWxhciBhbmQgdGhpcyBjbGFzcyBndWFyYW50ZWVzIGNvcnJlY3RuZXNzLlxuICovXG5leHBvcnQgY2xhc3MgQWNjb3VudFNBU1Blcm1pc3Npb25zIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcm1pc3Npb24gdG8gcmVhZCByZXNvdXJjZXMgYW5kIGxpc3QgcXVldWVzIGFuZCB0YWJsZXMgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVhZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbiB0byB3cml0ZSByZXNvdXJjZXMgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMud3JpdGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcm1pc3Npb24gdG8gY3JlYXRlIGJsb2JzIGFuZCBmaWxlcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZWxldGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcm1pc3Npb24gdG8gZGVsZXRlIHZlcnNpb25zIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRlbGV0ZVZlcnNpb24gPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcm1pc3Npb24gdG8gbGlzdCBibG9iIGNvbnRhaW5lcnMsIGJsb2JzLCBzaGFyZXMsIGRpcmVjdG9yaWVzLCBhbmQgZmlsZXMgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGlzdCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbiB0byBhZGQgbWVzc2FnZXMsIHRhYmxlIGVudGl0aWVzLCBhbmQgYXBwZW5kIHRvIGJsb2JzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFkZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbiB0byBjcmVhdGUgYmxvYnMgYW5kIGZpbGVzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNyZWF0ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbnMgdG8gdXBkYXRlIG1lc3NhZ2VzIGFuZCB0YWJsZSBlbnRpdGllcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51cGRhdGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcm1pc3Npb24gdG8gZ2V0IGFuZCBkZWxldGUgbWVzc2FnZXMgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucHJvY2VzcyA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2ZpZXMgVGFnIGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50YWcgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcm1pc3Npb24gdG8gZmlsdGVyIGJsb2JzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maWx0ZXIgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcm1pc3Npb24gdG8gc2V0IGltbXV0YWJpbGl0eSBwb2xpY3kuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNldEltbXV0YWJpbGl0eVBvbGljeSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIHRoYXQgUGVybWFuZW50IERlbGV0ZSBpcyBwZXJtaXR0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnBlcm1hbmVudERlbGV0ZSA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZSBpbml0aWFsaXplcyB0aGUgQWNjb3VudFNBU1Blcm1pc3Npb25zIGZpZWxkcyBmcm9tIGEgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBlcm1pc3Npb25zIC1cbiAgICAgKi9cbiAgICBzdGF0aWMgcGFyc2UocGVybWlzc2lvbnMpIHtcbiAgICAgICAgY29uc3QgYWNjb3VudFNBU1Blcm1pc3Npb25zID0gbmV3IEFjY291bnRTQVNQZXJtaXNzaW9ucygpO1xuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgcGVybWlzc2lvbnMpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJyXCI6XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy5yZWFkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIndcIjpcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLndyaXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLmRlbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ4XCI6XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy5kZWxldGVWZXJzaW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImxcIjpcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLmxpc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiYVwiOlxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50U0FTUGVybWlzc2lvbnMuYWRkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNcIjpcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLmNyZWF0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ1XCI6XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy51cGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwicFwiOlxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50U0FTUGVybWlzc2lvbnMucHJvY2VzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ0XCI6XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy50YWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZlwiOlxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50U0FTUGVybWlzc2lvbnMuZmlsdGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImlcIjpcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLnNldEltbXV0YWJpbGl0eVBvbGljeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy5wZXJtYW5lbnREZWxldGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBwZXJtaXNzaW9uIGNoYXJhY3RlcjogJHtjfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2NvdW50U0FTUGVybWlzc2lvbnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgQWNjb3VudFNBU1Blcm1pc3Npb25zfSBmcm9tIGEgcmF3IG9iamVjdCB3aGljaCBjb250YWlucyBzYW1lIGtleXMgYXMgaXRcbiAgICAgKiBhbmQgYm9vbGVhbiB2YWx1ZXMgZm9yIHRoZW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGVybWlzc2lvbkxpa2UgLVxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tKHBlcm1pc3Npb25MaWtlKSB7XG4gICAgICAgIGNvbnN0IGFjY291bnRTQVNQZXJtaXNzaW9ucyA9IG5ldyBBY2NvdW50U0FTUGVybWlzc2lvbnMoKTtcbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLnJlYWQpIHtcbiAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy5yZWFkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2Uud3JpdGUpIHtcbiAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy53cml0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLmRlbGV0ZSkge1xuICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLmRlbGV0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLmRlbGV0ZVZlcnNpb24pIHtcbiAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy5kZWxldGVWZXJzaW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UuZmlsdGVyKSB7XG4gICAgICAgICAgICBhY2NvdW50U0FTUGVybWlzc2lvbnMuZmlsdGVyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UudGFnKSB7XG4gICAgICAgICAgICBhY2NvdW50U0FTUGVybWlzc2lvbnMudGFnID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UubGlzdCkge1xuICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLmxpc3QgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5hZGQpIHtcbiAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy5hZGQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5jcmVhdGUpIHtcbiAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy5jcmVhdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS51cGRhdGUpIHtcbiAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy51cGRhdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5wcm9jZXNzKSB7XG4gICAgICAgICAgICBhY2NvdW50U0FTUGVybWlzc2lvbnMucHJvY2VzcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLnNldEltbXV0YWJpbGl0eVBvbGljeSkge1xuICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLnNldEltbXV0YWJpbGl0eVBvbGljeSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLnBlcm1hbmVudERlbGV0ZSkge1xuICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLnBlcm1hbmVudERlbGV0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjY291bnRTQVNQZXJtaXNzaW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvZHVjZXMgdGhlIFNBUyBwZXJtaXNzaW9ucyBzdHJpbmcgZm9yIGFuIEF6dXJlIFN0b3JhZ2UgYWNjb3VudC5cbiAgICAgKiBDYWxsIHRoaXMgbWV0aG9kIHRvIHNldCBBY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzIFBlcm1pc3Npb25zIGZpZWxkLlxuICAgICAqXG4gICAgICogVXNpbmcgdGhpcyBtZXRob2Qgd2lsbCBndWFyYW50ZWUgdGhlIHJlc291cmNlIHR5cGVzIGFyZSBpblxuICAgICAqIGFuIG9yZGVyIGFjY2VwdGVkIGJ5IHRoZSBzZXJ2aWNlLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvY29uc3RydWN0aW5nLWFuLWFjY291bnQtc2FzXG4gICAgICpcbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgLy8gVGhlIG9yZGVyIG9mIHRoZSBjaGFyYWN0ZXJzIHNob3VsZCBiZSBhcyBzcGVjaWZpZWQgaGVyZSB0byBlbnN1cmUgY29ycmVjdG5lc3M6XG4gICAgICAgIC8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9jb25zdHJ1Y3RpbmctYW4tYWNjb3VudC1zYXNcbiAgICAgICAgLy8gVXNlIGEgc3RyaW5nIGFycmF5IGluc3RlYWQgb2Ygc3RyaW5nIGNvbmNhdGVuYXRpbmcgKz0gb3BlcmF0b3IgZm9yIHBlcmZvcm1hbmNlXG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gW107XG4gICAgICAgIGlmICh0aGlzLnJlYWQpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJyXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLndyaXRlKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwid1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZWxldGUpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRlbGV0ZVZlcnNpb24pIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJ4XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcImZcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudGFnKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwidFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5saXN0KSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwibFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hZGQpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJhXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNyZWF0ZSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcImNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudXBkYXRlKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwidVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9jZXNzKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwicFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZXRJbW11dGFiaWxpdHlQb2xpY3kpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJpXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBlcm1hbmVudERlbGV0ZSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcInlcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25zLmpvaW4oXCJcIik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWNjb3VudFNBU1Blcm1pc3Npb25zLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLyoqXG4gKiBPTkxZIEFWQUlMQUJMRSBJTiBOT0RFLkpTIFJVTlRJTUUuXG4gKlxuICogVGhpcyBpcyBhIGhlbHBlciBjbGFzcyB0byBjb25zdHJ1Y3QgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSByZXNvdXJjZXMgYWNjZXNzaWJsZSBieSBhbiBBY2NvdW50U0FTLiBTZXR0aW5nIGEgdmFsdWVcbiAqIHRvIHRydWUgbWVhbnMgdGhhdCBhbnkgU0FTIHdoaWNoIHVzZXMgdGhlc2UgcGVybWlzc2lvbnMgd2lsbCBncmFudCBhY2Nlc3MgdG8gdGhhdCByZXNvdXJjZSB0eXBlLiBPbmNlIGFsbCB0aGVcbiAqIHZhbHVlcyBhcmUgc2V0LCB0aGlzIHNob3VsZCBiZSBzZXJpYWxpemVkIHdpdGggdG9TdHJpbmcgYW5kIHNldCBhcyB0aGUgcmVzb3VyY2VzIGZpZWxkIG9uIGFuXG4gKiB7QGxpbmsgQWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlc30gb2JqZWN0LiBJdCBpcyBwb3NzaWJsZSB0byBjb25zdHJ1Y3QgdGhlIHJlc291cmNlcyBzdHJpbmcgd2l0aG91dCB0aGlzIGNsYXNzLCBidXRcbiAqIHRoZSBvcmRlciBvZiB0aGUgcmVzb3VyY2VzIGlzIHBhcnRpY3VsYXIgYW5kIHRoaXMgY2xhc3MgZ3VhcmFudGVlcyBjb3JyZWN0bmVzcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFjY291bnRTQVNSZXNvdXJjZVR5cGVzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcm1pc3Npb24gdG8gYWNjZXNzIHNlcnZpY2UgbGV2ZWwgQVBJcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zZXJ2aWNlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJtaXNzaW9uIHRvIGFjY2VzcyBjb250YWluZXIgbGV2ZWwgQVBJcyAoQmxvYiBDb250YWluZXJzLCBUYWJsZXMsIFF1ZXVlcywgRmlsZSBTaGFyZXMpIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbiB0byBhY2Nlc3Mgb2JqZWN0IGxldmVsIEFQSXMgKEJsb2JzLCBUYWJsZSBFbnRpdGllcywgUXVldWUgTWVzc2FnZXMsIEZpbGVzKSBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vYmplY3QgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiB7QGxpbmsgQWNjb3VudFNBU1Jlc291cmNlVHlwZXN9IGZyb20gdGhlIHNwZWNpZmllZCByZXNvdXJjZSB0eXBlcyBzdHJpbmcuIFRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW5cbiAgICAgKiBFcnJvciBpZiBpdCBlbmNvdW50ZXJzIGEgY2hhcmFjdGVyIHRoYXQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHZhbGlkIHJlc291cmNlIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzb3VyY2VUeXBlcyAtXG4gICAgICovXG4gICAgc3RhdGljIHBhcnNlKHJlc291cmNlVHlwZXMpIHtcbiAgICAgICAgY29uc3QgYWNjb3VudFNBU1Jlc291cmNlVHlwZXMgPSBuZXcgQWNjb3VudFNBU1Jlc291cmNlVHlwZXMoKTtcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHJlc291cmNlVHlwZXMpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRTQVNSZXNvdXJjZVR5cGVzLnNlcnZpY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiY1wiOlxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50U0FTUmVzb3VyY2VUeXBlcy5jb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwib1wiOlxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50U0FTUmVzb3VyY2VUeXBlcy5vYmplY3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCByZXNvdXJjZSB0eXBlOiAke2N9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjY291bnRTQVNSZXNvdXJjZVR5cGVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gcmVzb3VyY2UgdHlwZXMgdG8gYSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9jb25zdHJ1Y3RpbmctYW4tYWNjb3VudC1zYXNcbiAgICAgKlxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBjb25zdCByZXNvdXJjZVR5cGVzID0gW107XG4gICAgICAgIGlmICh0aGlzLnNlcnZpY2UpIHtcbiAgICAgICAgICAgIHJlc291cmNlVHlwZXMucHVzaChcInNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgICAgICByZXNvdXJjZVR5cGVzLnB1c2goXCJjXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9iamVjdCkge1xuICAgICAgICAgICAgcmVzb3VyY2VUeXBlcy5wdXNoKFwib1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb3VyY2VUeXBlcy5qb2luKFwiXCIpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFjY291bnRTQVNSZXNvdXJjZVR5cGVzLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLyoqXG4gKiBPTkxZIEFWQUlMQUJMRSBJTiBOT0RFLkpTIFJVTlRJTUUuXG4gKlxuICogVGhpcyBpcyBhIGhlbHBlciBjbGFzcyB0byBjb25zdHJ1Y3QgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzZXJ2aWNlcyBhY2Nlc3NpYmxlIGJ5IGFuIEFjY291bnRTQVMuIFNldHRpbmcgYSB2YWx1ZVxuICogdG8gdHJ1ZSBtZWFucyB0aGF0IGFueSBTQVMgd2hpY2ggdXNlcyB0aGVzZSBwZXJtaXNzaW9ucyB3aWxsIGdyYW50IGFjY2VzcyB0byB0aGF0IHNlcnZpY2UuIE9uY2UgYWxsIHRoZVxuICogdmFsdWVzIGFyZSBzZXQsIHRoaXMgc2hvdWxkIGJlIHNlcmlhbGl6ZWQgd2l0aCB0b1N0cmluZyBhbmQgc2V0IGFzIHRoZSBzZXJ2aWNlcyBmaWVsZCBvbiBhblxuICoge0BsaW5rIEFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXN9IG9iamVjdC4gSXQgaXMgcG9zc2libGUgdG8gY29uc3RydWN0IHRoZSBzZXJ2aWNlcyBzdHJpbmcgd2l0aG91dCB0aGlzIGNsYXNzLCBidXRcbiAqIHRoZSBvcmRlciBvZiB0aGUgc2VydmljZXMgaXMgcGFydGljdWxhciBhbmQgdGhpcyBjbGFzcyBndWFyYW50ZWVzIGNvcnJlY3RuZXNzLlxuICovXG5leHBvcnQgY2xhc3MgQWNjb3VudFNBU1NlcnZpY2VzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcm1pc3Npb24gdG8gYWNjZXNzIGJsb2IgcmVzb3VyY2VzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmJsb2IgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcm1pc3Npb24gdG8gYWNjZXNzIGZpbGUgcmVzb3VyY2VzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZpbGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcm1pc3Npb24gdG8gYWNjZXNzIHF1ZXVlIHJlc291cmNlcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5xdWV1ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbiB0byBhY2Nlc3MgdGFibGUgcmVzb3VyY2VzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRhYmxlID0gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4ge0BsaW5rIEFjY291bnRTQVNTZXJ2aWNlc30gZnJvbSB0aGUgc3BlY2lmaWVkIHNlcnZpY2VzIHN0cmluZy4gVGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhblxuICAgICAqIEVycm9yIGlmIGl0IGVuY291bnRlcnMgYSBjaGFyYWN0ZXIgdGhhdCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgdmFsaWQgc2VydmljZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZXJ2aWNlcyAtXG4gICAgICovXG4gICAgc3RhdGljIHBhcnNlKHNlcnZpY2VzKSB7XG4gICAgICAgIGNvbnN0IGFjY291bnRTQVNTZXJ2aWNlcyA9IG5ldyBBY2NvdW50U0FTU2VydmljZXMoKTtcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHNlcnZpY2VzKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiYlwiOlxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50U0FTU2VydmljZXMuYmxvYiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJmXCI6XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRTQVNTZXJ2aWNlcy5maWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInFcIjpcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudFNBU1NlcnZpY2VzLnF1ZXVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInRcIjpcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudFNBU1NlcnZpY2VzLnRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgc2VydmljZSBjaGFyYWN0ZXI6ICR7Y31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjb3VudFNBU1NlcnZpY2VzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gc2VydmljZXMgdG8gYSBzdHJpbmcuXG4gICAgICpcbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZXMgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuYmxvYikge1xuICAgICAgICAgICAgc2VydmljZXMucHVzaChcImJcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudGFibGUpIHtcbiAgICAgICAgICAgIHNlcnZpY2VzLnB1c2goXCJ0XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlKSB7XG4gICAgICAgICAgICBzZXJ2aWNlcy5wdXNoKFwicVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5maWxlKSB7XG4gICAgICAgICAgICBzZXJ2aWNlcy5wdXNoKFwiZlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VydmljZXMuam9pbihcIlwiKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BY2NvdW50U0FTU2VydmljZXMuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBBY2NvdW50U0FTUGVybWlzc2lvbnMgfSBmcm9tIFwiLi9BY2NvdW50U0FTUGVybWlzc2lvbnNcIjtcbmltcG9ydCB7IEFjY291bnRTQVNSZXNvdXJjZVR5cGVzIH0gZnJvbSBcIi4vQWNjb3VudFNBU1Jlc291cmNlVHlwZXNcIjtcbmltcG9ydCB7IEFjY291bnRTQVNTZXJ2aWNlcyB9IGZyb20gXCIuL0FjY291bnRTQVNTZXJ2aWNlc1wiO1xuaW1wb3J0IHsgaXBSYW5nZVRvU3RyaW5nIH0gZnJvbSBcIi4vU2FzSVBSYW5nZVwiO1xuaW1wb3J0IHsgU0FTUXVlcnlQYXJhbWV0ZXJzIH0gZnJvbSBcIi4vU0FTUXVlcnlQYXJhbWV0ZXJzXCI7XG5pbXBvcnQgeyBTRVJWSUNFX1ZFUlNJT04gfSBmcm9tIFwiLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB0cnVuY2F0ZWRJU084MDYxRGF0ZSB9IGZyb20gXCIuLi91dGlscy91dGlscy5jb21tb25cIjtcbi8qKlxuICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICpcbiAqIEdlbmVyYXRlcyBhIHtAbGluayBTQVNRdWVyeVBhcmFtZXRlcnN9IG9iamVjdCB3aGljaCBjb250YWlucyBhbGwgU0FTIHF1ZXJ5IHBhcmFtZXRlcnMgbmVlZGVkIHRvIG1ha2UgYW4gYWN0dWFsXG4gKiBSRVNUIHJlcXVlc3QuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvY29uc3RydWN0aW5nLWFuLWFjY291bnQtc2FzXG4gKlxuICogQHBhcmFtIGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMgLVxuICogQHBhcmFtIHNoYXJlZEtleUNyZWRlbnRpYWwgLVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBY2NvdW50U0FTUXVlcnlQYXJhbWV0ZXJzKGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMsIHNoYXJlZEtleUNyZWRlbnRpYWwpIHtcbiAgICBjb25zdCB2ZXJzaW9uID0gYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uXG4gICAgICAgID8gYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uXG4gICAgICAgIDogU0VSVklDRV9WRVJTSU9OO1xuICAgIGlmIChhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zICYmXG4gICAgICAgIGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMuc2V0SW1tdXRhYmlsaXR5UG9saWN5ICYmXG4gICAgICAgIHZlcnNpb24gPCBcIjIwMjAtMDgtMDRcIikge1xuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiJ3ZlcnNpb24nIG11c3QgYmUgPj0gJzIwMjAtMDgtMDQnIHdoZW4gcHJvdmlkZWQgJ2knIHBlcm1pc3Npb24uXCIpO1xuICAgIH1cbiAgICBpZiAoYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucyAmJlxuICAgICAgICBhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLmRlbGV0ZVZlcnNpb24gJiZcbiAgICAgICAgdmVyc2lvbiA8IFwiMjAxOS0xMC0xMFwiKSB7XG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCIndmVyc2lvbicgbXVzdCBiZSA+PSAnMjAxOS0xMC0xMCcgd2hlbiBwcm92aWRlZCAneCcgcGVybWlzc2lvbi5cIik7XG4gICAgfVxuICAgIGlmIChhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zICYmXG4gICAgICAgIGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMucGVybWFuZW50RGVsZXRlICYmXG4gICAgICAgIHZlcnNpb24gPCBcIjIwMTktMTAtMTBcIikge1xuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiJ3ZlcnNpb24nIG11c3QgYmUgPj0gJzIwMTktMTAtMTAnIHdoZW4gcHJvdmlkZWQgJ3knIHBlcm1pc3Npb24uXCIpO1xuICAgIH1cbiAgICBpZiAoYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucyAmJlxuICAgICAgICBhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLnRhZyAmJlxuICAgICAgICB2ZXJzaW9uIDwgXCIyMDE5LTEyLTEyXCIpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIid2ZXJzaW9uJyBtdXN0IGJlID49ICcyMDE5LTEyLTEyJyB3aGVuIHByb3ZpZGVkICd0JyBwZXJtaXNzaW9uLlwiKTtcbiAgICB9XG4gICAgaWYgKGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMgJiZcbiAgICAgICAgYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy5maWx0ZXIgJiZcbiAgICAgICAgdmVyc2lvbiA8IFwiMjAxOS0xMi0xMlwiKSB7XG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCIndmVyc2lvbicgbXVzdCBiZSA+PSAnMjAxOS0xMi0xMicgd2hlbiBwcm92aWRlZCAnZicgcGVybWlzc2lvbi5cIik7XG4gICAgfVxuICAgIGlmIChhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLmVuY3J5cHRpb25TY29wZSAmJiB2ZXJzaW9uIDwgXCIyMDIwLTEyLTA2XCIpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIid2ZXJzaW9uJyBtdXN0IGJlID49ICcyMDIwLTEyLTA2JyB3aGVuIHByb3ZpZGVkICdlbmNyeXB0aW9uU2NvcGUnIGluIFNBUy5cIik7XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZFBlcm1pc3Npb25zID0gQWNjb3VudFNBU1Blcm1pc3Npb25zLnBhcnNlKGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMudG9TdHJpbmcoKSk7XG4gICAgY29uc3QgcGFyc2VkU2VydmljZXMgPSBBY2NvdW50U0FTU2VydmljZXMucGFyc2UoYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5zZXJ2aWNlcykudG9TdHJpbmcoKTtcbiAgICBjb25zdCBwYXJzZWRSZXNvdXJjZVR5cGVzID0gQWNjb3VudFNBU1Jlc291cmNlVHlwZXMucGFyc2UoYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5yZXNvdXJjZVR5cGVzKS50b1N0cmluZygpO1xuICAgIGxldCBzdHJpbmdUb1NpZ247XG4gICAgaWYgKHZlcnNpb24gPj0gXCIyMDIwLTEyLTA2XCIpIHtcbiAgICAgICAgc3RyaW5nVG9TaWduID0gW1xuICAgICAgICAgICAgc2hhcmVkS2V5Q3JlZGVudGlhbC5hY2NvdW50TmFtZSxcbiAgICAgICAgICAgIHBhcnNlZFBlcm1pc3Npb25zLFxuICAgICAgICAgICAgcGFyc2VkU2VydmljZXMsXG4gICAgICAgICAgICBwYXJzZWRSZXNvdXJjZVR5cGVzLFxuICAgICAgICAgICAgYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPblxuICAgICAgICAgICAgICAgID8gdHJ1bmNhdGVkSVNPODA2MURhdGUoYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPbiwgZmFsc2UpXG4gICAgICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgICAgICAgdHJ1bmNhdGVkSVNPODA2MURhdGUoYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT24sIGZhbHNlKSxcbiAgICAgICAgICAgIGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSA/IGlwUmFuZ2VUb1N0cmluZyhhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UpIDogXCJcIixcbiAgICAgICAgICAgIGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wgPyBhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnByb3RvY29sIDogXCJcIixcbiAgICAgICAgICAgIHZlcnNpb24sXG4gICAgICAgICAgICBhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLmVuY3J5cHRpb25TY29wZSA/IGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMuZW5jcnlwdGlvblNjb3BlIDogXCJcIixcbiAgICAgICAgICAgIFwiXCIsIC8vIEFjY291bnQgU0FTIHJlcXVpcmVzIGFuIGFkZGl0aW9uYWwgbmV3bGluZSBjaGFyYWN0ZXJcbiAgICAgICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc3RyaW5nVG9TaWduID0gW1xuICAgICAgICAgICAgc2hhcmVkS2V5Q3JlZGVudGlhbC5hY2NvdW50TmFtZSxcbiAgICAgICAgICAgIHBhcnNlZFBlcm1pc3Npb25zLFxuICAgICAgICAgICAgcGFyc2VkU2VydmljZXMsXG4gICAgICAgICAgICBwYXJzZWRSZXNvdXJjZVR5cGVzLFxuICAgICAgICAgICAgYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPblxuICAgICAgICAgICAgICAgID8gdHJ1bmNhdGVkSVNPODA2MURhdGUoYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPbiwgZmFsc2UpXG4gICAgICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgICAgICAgdHJ1bmNhdGVkSVNPODA2MURhdGUoYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT24sIGZhbHNlKSxcbiAgICAgICAgICAgIGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSA/IGlwUmFuZ2VUb1N0cmluZyhhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UpIDogXCJcIixcbiAgICAgICAgICAgIGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wgPyBhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnByb3RvY29sIDogXCJcIixcbiAgICAgICAgICAgIHZlcnNpb24sXG4gICAgICAgICAgICBcIlwiLCAvLyBBY2NvdW50IFNBUyByZXF1aXJlcyBhbiBhZGRpdGlvbmFsIG5ld2xpbmUgY2hhcmFjdGVyXG4gICAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gc2hhcmVkS2V5Q3JlZGVudGlhbC5jb21wdXRlSE1BQ1NIQTI1NihzdHJpbmdUb1NpZ24pO1xuICAgIHJldHVybiBuZXcgU0FTUXVlcnlQYXJhbWV0ZXJzKHZlcnNpb24sIHNpZ25hdHVyZSwgcGFyc2VkUGVybWlzc2lvbnMudG9TdHJpbmcoKSwgcGFyc2VkU2VydmljZXMsIHBhcnNlZFJlc291cmNlVHlwZXMsIGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wsIGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT24sIGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uLCBhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5lbmNyeXB0aW9uU2NvcGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5qcy5tYXAiLCJpbXBvcnQgeyBfX2FzeW5jRGVsZWdhdG9yLCBfX2FzeW5jR2VuZXJhdG9yLCBfX2FzeW5jVmFsdWVzLCBfX2F3YWl0IH0gZnJvbSBcInRzbGliXCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IGlzVG9rZW5DcmVkZW50aWFsLCBpc05vZGUsIGdldERlZmF1bHRQcm94eVNldHRpbmdzLCB9IGZyb20gXCJAYXp1cmUvY29yZS1odHRwXCI7XG5pbXBvcnQgeyBTcGFuU3RhdHVzQ29kZSB9IGZyb20gXCJAYXp1cmUvY29yZS10cmFjaW5nXCI7XG5pbXBvcnQgeyBDb250YWluZXIsIFNlcnZpY2UgfSBmcm9tIFwiLi9nZW5lcmF0ZWQvc3JjL29wZXJhdGlvbnNcIjtcbmltcG9ydCB7IG5ld1BpcGVsaW5lLCBpc1BpcGVsaW5lTGlrZSB9IGZyb20gXCIuL1BpcGVsaW5lXCI7XG5pbXBvcnQgeyBDb250YWluZXJDbGllbnQsIH0gZnJvbSBcIi4vQ29udGFpbmVyQ2xpZW50XCI7XG5pbXBvcnQgeyBhcHBlbmRUb1VSTFBhdGgsIGFwcGVuZFRvVVJMUXVlcnksIGV4dHJhY3RDb25uZWN0aW9uU3RyaW5nUGFydHMsIHRvVGFncywgfSBmcm9tIFwiLi91dGlscy91dGlscy5jb21tb25cIjtcbmltcG9ydCB7IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsIH0gZnJvbSBcIi4vY3JlZGVudGlhbHMvU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxcIjtcbmltcG9ydCB7IEFub255bW91c0NyZWRlbnRpYWwgfSBmcm9tIFwiLi9jcmVkZW50aWFscy9Bbm9ueW1vdXNDcmVkZW50aWFsXCI7XG5pbXBvcnQgXCJAYXp1cmUvY29yZS1wYWdpbmdcIjtcbmltcG9ydCB7IHRydW5jYXRlZElTTzgwNjFEYXRlIH0gZnJvbSBcIi4vdXRpbHMvdXRpbHMuY29tbW9uXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlLCBjcmVhdGVTcGFuIH0gZnJvbSBcIi4vdXRpbHMvdHJhY2luZ1wiO1xuaW1wb3J0IHsgQmxvYkJhdGNoQ2xpZW50IH0gZnJvbSBcIi4vQmxvYkJhdGNoQ2xpZW50XCI7XG5pbXBvcnQgeyBTdG9yYWdlQ2xpZW50IH0gZnJvbSBcIi4vU3RvcmFnZUNsaWVudFwiO1xuaW1wb3J0IHsgQWNjb3VudFNBU1Blcm1pc3Npb25zIH0gZnJvbSBcIi4vc2FzL0FjY291bnRTQVNQZXJtaXNzaW9uc1wiO1xuaW1wb3J0IHsgZ2VuZXJhdGVBY2NvdW50U0FTUXVlcnlQYXJhbWV0ZXJzIH0gZnJvbSBcIi4vc2FzL0FjY291bnRTQVNTaWduYXR1cmVWYWx1ZXNcIjtcbmltcG9ydCB7IEFjY291bnRTQVNTZXJ2aWNlcyB9IGZyb20gXCIuL3Nhcy9BY2NvdW50U0FTU2VydmljZXNcIjtcbi8qKlxuICogQSBCbG9iU2VydmljZUNsaWVudCByZXByZXNlbnRzIGEgQ2xpZW50IHRvIHRoZSBBenVyZSBTdG9yYWdlIEJsb2Igc2VydmljZSBhbGxvd2luZyB5b3VcbiAqIHRvIG1hbmlwdWxhdGUgYmxvYiBjb250YWluZXJzLlxuICovXG5leHBvcnQgY2xhc3MgQmxvYlNlcnZpY2VDbGllbnQgZXh0ZW5kcyBTdG9yYWdlQ2xpZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih1cmwsIGNyZWRlbnRpYWxPclBpcGVsaW5lLCBcbiAgICAvLyBMZWdhY3ksIG5vIGZpeCBmb3IgZXNsaW50IGVycm9yIHdpdGhvdXQgYnJlYWtpbmcuIERpc2FibGUgaXQgZm9yIHRoaXMgaW50ZXJmYWNlLlxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYXp1cmUvYXp1cmUtc2RrL3RzLW5hbWluZy1vcHRpb25zKi9cbiAgICBvcHRpb25zKSB7XG4gICAgICAgIGxldCBwaXBlbGluZTtcbiAgICAgICAgaWYgKGlzUGlwZWxpbmVMaWtlKGNyZWRlbnRpYWxPclBpcGVsaW5lKSkge1xuICAgICAgICAgICAgcGlwZWxpbmUgPSBjcmVkZW50aWFsT3JQaXBlbGluZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoaXNOb2RlICYmIGNyZWRlbnRpYWxPclBpcGVsaW5lIGluc3RhbmNlb2YgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwpIHx8XG4gICAgICAgICAgICBjcmVkZW50aWFsT3JQaXBlbGluZSBpbnN0YW5jZW9mIEFub255bW91c0NyZWRlbnRpYWwgfHxcbiAgICAgICAgICAgIGlzVG9rZW5DcmVkZW50aWFsKGNyZWRlbnRpYWxPclBpcGVsaW5lKSkge1xuICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShjcmVkZW50aWFsT3JQaXBlbGluZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuIFVzZSBhbm9ueW1vdXMgY3JlZGVudGlhbFxuICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShuZXcgQW5vbnltb3VzQ3JlZGVudGlhbCgpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcih1cmwsIHBpcGVsaW5lKTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlQ29udGV4dCA9IG5ldyBTZXJ2aWNlKHRoaXMuc3RvcmFnZUNsaWVudENvbnRleHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQmxvYlNlcnZpY2VDbGllbnQgZnJvbSBjb25uZWN0aW9uIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb25uZWN0aW9uU3RyaW5nIC0gQWNjb3VudCBjb25uZWN0aW9uIHN0cmluZyBvciBhIFNBUyBjb25uZWN0aW9uIHN0cmluZyBvZiBhbiBBenVyZSBzdG9yYWdlIGFjY291bnQuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBOb3RlIC0gQWNjb3VudCBjb25uZWN0aW9uIHN0cmluZyBjYW4gb25seSBiZSB1c2VkIGluIE5PREUuSlMgcnVudGltZS4gXVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY291bnQgY29ubmVjdGlvbiBzdHJpbmcgZXhhbXBsZSAtXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYERlZmF1bHRFbmRwb2ludHNQcm90b2NvbD1odHRwcztBY2NvdW50TmFtZT1teWFjY291bnQ7QWNjb3VudEtleT1hY2NvdW50S2V5O0VuZHBvaW50U3VmZml4PWNvcmUud2luZG93cy5uZXRgXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FTIGNvbm5lY3Rpb24gc3RyaW5nIGV4YW1wbGUgLVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBCbG9iRW5kcG9pbnQ9aHR0cHM6Ly9teWFjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0LztRdWV1ZUVuZHBvaW50PWh0dHBzOi8vbXlhY2NvdW50LnF1ZXVlLmNvcmUud2luZG93cy5uZXQvO0ZpbGVFbmRwb2ludD1odHRwczovL215YWNjb3VudC5maWxlLmNvcmUud2luZG93cy5uZXQvO1RhYmxlRW5kcG9pbnQ9aHR0cHM6Ly9teWFjY291bnQudGFibGUuY29yZS53aW5kb3dzLm5ldC87U2hhcmVkQWNjZXNzU2lnbmF0dXJlPXNhc1N0cmluZ2BcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsLiBPcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgSFRUUCBwaXBlbGluZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUNvbm5lY3Rpb25TdHJpbmcoY29ubmVjdGlvblN0cmluZywgXG4gICAgLy8gTGVnYWN5LCBubyBmaXggZm9yIGVzbGludCBlcnJvciB3aXRob3V0IGJyZWFraW5nLiBEaXNhYmxlIGl0IGZvciB0aGlzIGludGVyZmFjZS5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGF6dXJlL2F6dXJlLXNkay90cy1uYW1pbmctb3B0aW9ucyovXG4gICAgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3QgZXh0cmFjdGVkQ3JlZHMgPSBleHRyYWN0Q29ubmVjdGlvblN0cmluZ1BhcnRzKGNvbm5lY3Rpb25TdHJpbmcpO1xuICAgICAgICBpZiAoZXh0cmFjdGVkQ3JlZHMua2luZCA9PT0gXCJBY2NvdW50Q29ublN0cmluZ1wiKSB7XG4gICAgICAgICAgICBpZiAoaXNOb2RlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkS2V5Q3JlZGVudGlhbCA9IG5ldyBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbChleHRyYWN0ZWRDcmVkcy5hY2NvdW50TmFtZSwgZXh0cmFjdGVkQ3JlZHMuYWNjb3VudEtleSk7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnByb3h5T3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByb3h5T3B0aW9ucyA9IGdldERlZmF1bHRQcm94eVNldHRpbmdzKGV4dHJhY3RlZENyZWRzLnByb3h5VXJpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShzaGFyZWRLZXlDcmVkZW50aWFsLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJsb2JTZXJ2aWNlQ2xpZW50KGV4dHJhY3RlZENyZWRzLnVybCwgcGlwZWxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWNjb3VudCBjb25uZWN0aW9uIHN0cmluZyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBOb2RlLmpzIGVudmlyb25tZW50XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4dHJhY3RlZENyZWRzLmtpbmQgPT09IFwiU0FTQ29ublN0cmluZ1wiKSB7XG4gICAgICAgICAgICBjb25zdCBwaXBlbGluZSA9IG5ld1BpcGVsaW5lKG5ldyBBbm9ueW1vdXNDcmVkZW50aWFsKCksIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBCbG9iU2VydmljZUNsaWVudChleHRyYWN0ZWRDcmVkcy51cmwgKyBcIj9cIiArIGV4dHJhY3RlZENyZWRzLmFjY291bnRTYXMsIHBpcGVsaW5lKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbm5lY3Rpb24gc3RyaW5nIG11c3QgYmUgZWl0aGVyIGFuIEFjY291bnQgY29ubmVjdGlvbiBzdHJpbmcgb3IgYSBTQVMgY29ubmVjdGlvbiBzdHJpbmdcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBDb250YWluZXJDbGllbnR9IG9iamVjdFxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRhaW5lck5hbWUgLSBBIGNvbnRhaW5lciBuYW1lXG4gICAgICogQHJldHVybnMgQSBuZXcgQ29udGFpbmVyQ2xpZW50IG9iamVjdCBmb3IgdGhlIGdpdmVuIGNvbnRhaW5lciBuYW1lLlxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2FnZTpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY29udGFpbmVyQ2xpZW50ID0gYmxvYlNlcnZpY2VDbGllbnQuZ2V0Q29udGFpbmVyQ2xpZW50KFwiPGNvbnRhaW5lciBuYW1lPlwiKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXRDb250YWluZXJDbGllbnQoY29udGFpbmVyTmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IENvbnRhaW5lckNsaWVudChhcHBlbmRUb1VSTFBhdGgodGhpcy51cmwsIGVuY29kZVVSSUNvbXBvbmVudChjb250YWluZXJOYW1lKSksIHRoaXMucGlwZWxpbmUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBCbG9iIGNvbnRhaW5lci4gQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvY3JlYXRlLWNvbnRhaW5lclxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRhaW5lck5hbWUgLSBOYW1lIG9mIHRoZSBjb250YWluZXIgdG8gY3JlYXRlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBjb25maWd1cmUgQ29udGFpbmVyIENyZWF0ZSBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgQ29udGFpbmVyIGNyZWF0aW9uIHJlc3BvbnNlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBjb250YWluZXIgY2xpZW50LlxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZUNvbnRhaW5lcihjb250YWluZXJOYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JTZXJ2aWNlQ2xpZW50LWNyZWF0ZUNvbnRhaW5lclwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckNsaWVudCA9IHRoaXMuZ2V0Q29udGFpbmVyQ2xpZW50KGNvbnRhaW5lck5hbWUpO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyQ3JlYXRlUmVzcG9uc2UgPSBhd2FpdCBjb250YWluZXJDbGllbnQuY3JlYXRlKHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyQ2xpZW50LFxuICAgICAgICAgICAgICAgIGNvbnRhaW5lckNyZWF0ZVJlc3BvbnNlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlcyBhIEJsb2IgY29udGFpbmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRhaW5lck5hbWUgLSBOYW1lIG9mIHRoZSBjb250YWluZXIgdG8gZGVsZXRlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBjb25maWd1cmUgQ29udGFpbmVyIERlbGV0ZSBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgQ29udGFpbmVyIGRlbGV0aW9uIHJlc3BvbnNlLlxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZUNvbnRhaW5lcihjb250YWluZXJOYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JTZXJ2aWNlQ2xpZW50LWRlbGV0ZUNvbnRhaW5lclwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckNsaWVudCA9IHRoaXMuZ2V0Q29udGFpbmVyQ2xpZW50KGNvbnRhaW5lck5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNvbnRhaW5lckNsaWVudC5kZWxldGUodXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlIGEgcHJldmlvdXNseSBkZWxldGVkIEJsb2IgY29udGFpbmVyLlxuICAgICAqIFRoaXMgQVBJIGlzIG9ubHkgZnVuY3Rpb25hbCBpZiBDb250YWluZXIgU29mdCBEZWxldGUgaXMgZW5hYmxlZCBmb3IgdGhlIHN0b3JhZ2UgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRhaW5lci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkZWxldGVkQ29udGFpbmVyTmFtZSAtIE5hbWUgb2YgdGhlIHByZXZpb3VzbHkgZGVsZXRlZCBjb250YWluZXIuXG4gICAgICogQHBhcmFtIGRlbGV0ZWRDb250YWluZXJWZXJzaW9uIC0gVmVyc2lvbiBvZiB0aGUgcHJldmlvdXNseSBkZWxldGVkIGNvbnRhaW5lciwgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgZGVsZXRlZCBjb250YWluZXIuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGNvbmZpZ3VyZSBDb250YWluZXIgUmVzdG9yZSBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgQ29udGFpbmVyIGRlbGV0aW9uIHJlc3BvbnNlLlxuICAgICAqL1xuICAgIGFzeW5jIHVuZGVsZXRlQ29udGFpbmVyKGRlbGV0ZWRDb250YWluZXJOYW1lLCBkZWxldGVkQ29udGFpbmVyVmVyc2lvbiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iU2VydmljZUNsaWVudC11bmRlbGV0ZUNvbnRhaW5lclwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckNsaWVudCA9IHRoaXMuZ2V0Q29udGFpbmVyQ2xpZW50KG9wdGlvbnMuZGVzdGluYXRpb25Db250YWluZXJOYW1lIHx8IGRlbGV0ZWRDb250YWluZXJOYW1lKTtcbiAgICAgICAgICAgIC8vIEhhY2sgdG8gYWNjZXNzIGEgcHJvdGVjdGVkIG1lbWJlci5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckNvbnRleHQgPSBuZXcgQ29udGFpbmVyKGNvbnRhaW5lckNsaWVudFtcInN0b3JhZ2VDbGllbnRDb250ZXh0XCJdKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclVuZGVsZXRlUmVzcG9uc2UgPSBhd2FpdCBjb250YWluZXJDb250ZXh0LnJlc3RvcmUoT2JqZWN0LmFzc2lnbih7IGRlbGV0ZWRDb250YWluZXJOYW1lLFxuICAgICAgICAgICAgICAgIGRlbGV0ZWRDb250YWluZXJWZXJzaW9uIH0sIHVwZGF0ZWRPcHRpb25zKSk7XG4gICAgICAgICAgICByZXR1cm4geyBjb250YWluZXJDbGllbnQsIGNvbnRhaW5lclVuZGVsZXRlUmVzcG9uc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVuYW1lIGFuIGV4aXN0aW5nIEJsb2IgQ29udGFpbmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNvdXJjZUNvbnRhaW5lck5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc291cmNlIGNvbnRhaW5lci5cbiAgICAgKiBAcGFyYW0gZGVzdGluYXRpb25Db250YWluZXJOYW1lIC0gVGhlIG5ldyBuYW1lIG9mIHRoZSBjb250YWluZXIuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGNvbmZpZ3VyZSBDb250YWluZXIgUmVuYW1lIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50ICovXG4gICAgLy8gQHRzLWlnbm9yZSBOZWVkIHRvIGhpZGUgdGhpcyBpbnRlcmZhY2UgZm9yIG5vdy4gTWFrZSBpdCBwdWJsaWMgYW5kIHR1cm4gb24gdGhlIGxpdmUgdGVzdHMgZm9yIGl0IHdoZW4gdGhlIHNlcnZpY2UgaXMgcmVhZHkuXG4gICAgYXN5bmMgcmVuYW1lQ29udGFpbmVyKHNvdXJjZUNvbnRhaW5lck5hbWUsIGRlc3RpbmF0aW9uQ29udGFpbmVyTmFtZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JTZXJ2aWNlQ2xpZW50LXJlbmFtZUNvbnRhaW5lclwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckNsaWVudCA9IHRoaXMuZ2V0Q29udGFpbmVyQ2xpZW50KGRlc3RpbmF0aW9uQ29udGFpbmVyTmFtZSk7XG4gICAgICAgICAgICAvLyBIYWNrIHRvIGFjY2VzcyBhIHByb3RlY3RlZCBtZW1iZXIuXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJDb250ZXh0ID0gbmV3IENvbnRhaW5lcihjb250YWluZXJDbGllbnRbXCJzdG9yYWdlQ2xpZW50Q29udGV4dFwiXSk7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJSZW5hbWVSZXNwb25zZSA9IGF3YWl0IGNvbnRhaW5lckNvbnRleHQucmVuYW1lKHNvdXJjZUNvbnRhaW5lck5hbWUsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdXBkYXRlZE9wdGlvbnMpLCB7IHNvdXJjZUxlYXNlSWQ6IChfYSA9IG9wdGlvbnMuc291cmNlQ29uZGl0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubGVhc2VJZCB9KSk7XG4gICAgICAgICAgICByZXR1cm4geyBjb250YWluZXJDbGllbnQsIGNvbnRhaW5lclJlbmFtZVJlc3BvbnNlIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHByb3BlcnRpZXMgb2YgYSBzdG9yYWdlIGFjY291bnTigJlzIEJsb2Igc2VydmljZSwgaW5jbHVkaW5nIHByb3BlcnRpZXNcbiAgICAgKiBmb3IgU3RvcmFnZSBBbmFseXRpY3MgYW5kIENPUlMgKENyb3NzLU9yaWdpbiBSZXNvdXJjZSBTaGFyaW5nKSBydWxlcy5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9nZXQtYmxvYi1zZXJ2aWNlLXByb3BlcnRpZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgU2VydmljZSBHZXQgUHJvcGVydGllcyBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIFNlcnZpY2UgR2V0IFByb3BlcnRpZXMgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFByb3BlcnRpZXMob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iU2VydmljZUNsaWVudC1nZXRQcm9wZXJ0aWVzXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VydmljZUNvbnRleHQuZ2V0UHJvcGVydGllcyhPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBwcm9wZXJ0aWVzIGZvciBhIHN0b3JhZ2UgYWNjb3VudOKAmXMgQmxvYiBzZXJ2aWNlIGVuZHBvaW50LCBpbmNsdWRpbmcgcHJvcGVydGllc1xuICAgICAqIGZvciBTdG9yYWdlIEFuYWx5dGljcywgQ09SUyAoQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcpIHJ1bGVzIGFuZCBzb2Z0IGRlbGV0ZSBzZXR0aW5ncy5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9zZXQtYmxvYi1zZXJ2aWNlLXByb3BlcnRpZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIC1cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIFNlcnZpY2UgU2V0IFByb3BlcnRpZXMgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHRoZSBTZXJ2aWNlIFNldCBQcm9wZXJ0aWVzIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBzZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYlNlcnZpY2VDbGllbnQtc2V0UHJvcGVydGllc1wiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlcnZpY2VDb250ZXh0LnNldFByb3BlcnRpZXMocHJvcGVydGllcywgT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyBzdGF0aXN0aWNzIHJlbGF0ZWQgdG8gcmVwbGljYXRpb24gZm9yIHRoZSBCbG9iIHNlcnZpY2UuIEl0IGlzIG9ubHlcbiAgICAgKiBhdmFpbGFibGUgb24gdGhlIHNlY29uZGFyeSBsb2NhdGlvbiBlbmRwb2ludCB3aGVuIHJlYWQtYWNjZXNzIGdlby1yZWR1bmRhbnRcbiAgICAgKiByZXBsaWNhdGlvbiBpcyBlbmFibGVkIGZvciB0aGUgc3RvcmFnZSBhY2NvdW50LlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2dldC1ibG9iLXNlcnZpY2Utc3RhdHNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgU2VydmljZSBHZXQgU3RhdGlzdGljcyBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIFNlcnZpY2UgR2V0IFN0YXRpc3RpY3Mgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFN0YXRpc3RpY3Mob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iU2VydmljZUNsaWVudC1nZXRTdGF0aXN0aWNzXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VydmljZUNvbnRleHQuZ2V0U3RhdGlzdGljcyhPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIEdldCBBY2NvdW50IEluZm9ybWF0aW9uIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBza3UgbmFtZSBhbmQgYWNjb3VudCBraW5kXG4gICAgICogZm9yIHRoZSBzcGVjaWZpZWQgYWNjb3VudC5cbiAgICAgKiBUaGUgR2V0IEFjY291bnQgSW5mb3JtYXRpb24gb3BlcmF0aW9uIGlzIGF2YWlsYWJsZSBvbiBzZXJ2aWNlIHZlcnNpb25zIGJlZ2lubmluZ1xuICAgICAqIHdpdGggdmVyc2lvbiAyMDE4LTAzLTI4LlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2dldC1hY2NvdW50LWluZm9ybWF0aW9uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIFNlcnZpY2UgR2V0IEFjY291bnQgSW5mbyBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIFNlcnZpY2UgR2V0IEFjY291bnQgSW5mbyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgZ2V0QWNjb3VudEluZm8ob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iU2VydmljZUNsaWVudC1nZXRBY2NvdW50SW5mb1wiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlcnZpY2VDb250ZXh0LmdldEFjY291bnRJbmZvKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgY29udGFpbmVycyB1bmRlciB0aGUgc3BlY2lmaWVkIGFjY291bnQuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvbGlzdC1jb250YWluZXJzMlxuICAgICAqXG4gICAgICogQHBhcmFtIG1hcmtlciAtIEEgc3RyaW5nIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgcG9ydGlvbiBvZlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpc3Qgb2YgY29udGFpbmVycyB0byBiZSByZXR1cm5lZCB3aXRoIHRoZSBuZXh0IGxpc3Rpbmcgb3BlcmF0aW9uLiBUaGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBjb250aW51YXRpb25Ub2tlbiB2YWx1ZSB3aXRoaW4gdGhlIHJlc3BvbnNlIGJvZHkgaWYgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBsaXN0aW5nIG9wZXJhdGlvbiBkaWQgbm90IHJldHVybiBhbGwgY29udGFpbmVycyByZW1haW5pbmcgdG8gYmUgbGlzdGVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBjdXJyZW50IHBhZ2UuIFRoZSBjb250aW51YXRpb25Ub2tlbiB2YWx1ZSBjYW4gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFya2VyIHBhcmFtZXRlciBpbiBhIHN1YnNlcXVlbnQgY2FsbCB0byByZXF1ZXN0IHRoZSBuZXh0IHBhZ2Ugb2YgbGlzdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuIFRoZSBtYXJrZXIgdmFsdWUgaXMgb3BhcXVlIHRvIHRoZSBjbGllbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBTZXJ2aWNlIExpc3QgQ29udGFpbmVyIFNlZ21lbnQgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHRoZSBTZXJ2aWNlIExpc3QgQ29udGFpbmVyIFNlZ21lbnQgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RDb250YWluZXJzU2VnbWVudChtYXJrZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYlNlcnZpY2VDbGllbnQtbGlzdENvbnRhaW5lcnNTZWdtZW50XCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VydmljZUNvbnRleHQubGlzdENvbnRhaW5lcnNTZWdtZW50KE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIG1hcmtlciB9LCBvcHRpb25zKSwgeyBpbmNsdWRlOiB0eXBlb2Ygb3B0aW9ucy5pbmNsdWRlID09PSBcInN0cmluZ1wiID8gW29wdGlvbnMuaW5jbHVkZV0gOiBvcHRpb25zLmluY2x1ZGUgfSksIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBGaWx0ZXIgQmxvYnMgb3BlcmF0aW9uIGVuYWJsZXMgY2FsbGVycyB0byBsaXN0IGJsb2JzIGFjcm9zcyBhbGwgY29udGFpbmVycyB3aG9zZSB0YWdzXG4gICAgICogbWF0Y2ggYSBnaXZlbiBzZWFyY2ggZXhwcmVzc2lvbi4gRmlsdGVyIGJsb2JzIHNlYXJjaGVzIGFjcm9zcyBhbGwgY29udGFpbmVycyB3aXRoaW4gYVxuICAgICAqIHN0b3JhZ2UgYWNjb3VudCBidXQgY2FuIGJlIHNjb3BlZCB3aXRoaW4gdGhlIGV4cHJlc3Npb24gdG8gYSBzaW5nbGUgY29udGFpbmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24gLSBUaGUgd2hlcmUgcGFyYW1ldGVyIGVuYWJsZXMgdGhlIGNhbGxlciB0byBxdWVyeSBibG9icyB3aG9zZSB0YWdzIG1hdGNoIGEgZ2l2ZW4gZXhwcmVzc2lvbi5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZ2l2ZW4gZXhwcmVzc2lvbiBtdXN0IGV2YWx1YXRlIHRvIHRydWUgZm9yIGEgYmxvYiB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzdWx0cy5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVbT0RhdGEgLSBBQk5GXSBmaWx0ZXIgc3ludGF4IHJ1bGUgZGVmaW5lcyB0aGUgZm9ybWFsIGdyYW1tYXIgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgd2hlcmUgcXVlcnkgcGFyYW1ldGVyO1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvd2V2ZXIsIG9ubHkgYSBzdWJzZXQgb2YgdGhlIE9EYXRhIGZpbHRlciBzeW50YXggaXMgc3VwcG9ydGVkIGluIHRoZSBCbG9iIHNlcnZpY2UuXG4gICAgICogQHBhcmFtIG1hcmtlciAtIEEgc3RyaW5nIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgcG9ydGlvbiBvZlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGlzdCBvZiBibG9icyB0byBiZSByZXR1cm5lZCB3aXRoIHRoZSBuZXh0IGxpc3Rpbmcgb3BlcmF0aW9uLiBUaGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uIHJldHVybnMgdGhlIGNvbnRpbnVhdGlvblRva2VuIHZhbHVlIHdpdGhpbiB0aGUgcmVzcG9uc2UgYm9keSBpZiB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGluZyBvcGVyYXRpb24gZGlkIG5vdCByZXR1cm4gYWxsIGJsb2JzIHJlbWFpbmluZyB0byBiZSBsaXN0ZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgY3VycmVudCBwYWdlLiBUaGUgY29udGludWF0aW9uVG9rZW4gdmFsdWUgY2FuIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFya2VyIHBhcmFtZXRlciBpbiBhIHN1YnNlcXVlbnQgY2FsbCB0byByZXF1ZXN0IHRoZSBuZXh0IHBhZ2Ugb2YgbGlzdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy4gVGhlIG1hcmtlciB2YWx1ZSBpcyBvcGFxdWUgdG8gdGhlIGNsaWVudC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gZmluZCBibG9icyBieSB0YWdzLlxuICAgICAqL1xuICAgIGFzeW5jIGZpbmRCbG9ic0J5VGFnc1NlZ21lbnQodGFnRmlsdGVyU3FsRXhwcmVzc2lvbiwgbWFya2VyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JTZXJ2aWNlQ2xpZW50LWZpbmRCbG9ic0J5VGFnc1NlZ21lbnRcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VydmljZUNvbnRleHQuZmlsdGVyQmxvYnMoT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCB3aGVyZTogdGFnRmlsdGVyU3FsRXhwcmVzc2lvbiwgbWFya2VyLCBtYXhQYWdlU2l6ZTogb3B0aW9ucy5tYXhQYWdlU2l6ZSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICAgICAgY29uc3Qgd3JhcHBlZFJlc3BvbnNlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNwb25zZSksIHsgX3Jlc3BvbnNlOiByZXNwb25zZS5fcmVzcG9uc2UsIGJsb2JzOiByZXNwb25zZS5ibG9icy5tYXAoKGJsb2IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGFnVmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKChfYSA9IGJsb2IudGFncykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmJsb2JUYWdTZXQubGVuZ3RoKSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFnVmFsdWUgPSBibG9iLnRhZ3MuYmxvYlRhZ1NldFswXS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBibG9iKSwgeyB0YWdzOiB0b1RhZ3MoYmxvYi50YWdzKSwgdGFnVmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgfSkgfSk7XG4gICAgICAgICAgICByZXR1cm4gd3JhcHBlZFJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvciBmb3IgU2VydmljZUZpbmRCbG9ic0J5VGFnc1NlZ21lbnRSZXNwb25zZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YWdGaWx0ZXJTcWxFeHByZXNzaW9uIC0gIFRoZSB3aGVyZSBwYXJhbWV0ZXIgZW5hYmxlcyB0aGUgY2FsbGVyIHRvIHF1ZXJ5IGJsb2JzIHdob3NlIHRhZ3MgbWF0Y2ggYSBnaXZlbiBleHByZXNzaW9uLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZ2l2ZW4gZXhwcmVzc2lvbiBtdXN0IGV2YWx1YXRlIHRvIHRydWUgZm9yIGEgYmxvYiB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzdWx0cy5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlW09EYXRhIC0gQUJORl0gZmlsdGVyIHN5bnRheCBydWxlIGRlZmluZXMgdGhlIGZvcm1hbCBncmFtbWFyIGZvciB0aGUgdmFsdWUgb2YgdGhlIHdoZXJlIHF1ZXJ5IHBhcmFtZXRlcjtcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG93ZXZlciwgb25seSBhIHN1YnNldCBvZiB0aGUgT0RhdGEgZmlsdGVyIHN5bnRheCBpcyBzdXBwb3J0ZWQgaW4gdGhlIEJsb2Igc2VydmljZS5cbiAgICAgKiBAcGFyYW0gbWFya2VyIC0gQSBzdHJpbmcgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSBwb3J0aW9uIG9mXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaXN0IG9mIGJsb2JzIHRvIGJlIHJldHVybmVkIHdpdGggdGhlIG5leHQgbGlzdGluZyBvcGVyYXRpb24uIFRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gcmV0dXJucyB0aGUgY29udGludWF0aW9uVG9rZW4gdmFsdWUgd2l0aGluIHRoZSByZXNwb25zZSBib2R5IGlmIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0aW5nIG9wZXJhdGlvbiBkaWQgbm90IHJldHVybiBhbGwgYmxvYnMgcmVtYWluaW5nIHRvIGJlIGxpc3RlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBjdXJyZW50IHBhZ2UuIFRoZSBjb250aW51YXRpb25Ub2tlbiB2YWx1ZSBjYW4gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXJrZXIgcGFyYW1ldGVyIGluIGEgc3Vic2VxdWVudCBjYWxsIHRvIHJlcXVlc3QgdGhlIG5leHQgcGFnZSBvZiBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLiBUaGUgbWFya2VyIHZhbHVlIGlzIG9wYXF1ZSB0byB0aGUgY2xpZW50LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBmaW5kIGJsb2JzIGJ5IHRhZ3MuXG4gICAgICovXG4gICAgZmluZEJsb2JzQnlUYWdzU2VnbWVudHModGFnRmlsdGVyU3FsRXhwcmVzc2lvbiwgbWFya2VyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogZmluZEJsb2JzQnlUYWdzU2VnbWVudHNfMSgpIHtcbiAgICAgICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgICAgIGlmICghIW1hcmtlciB8fCBtYXJrZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBfX2F3YWl0KHRoaXMuZmluZEJsb2JzQnlUYWdzU2VnbWVudCh0YWdGaWx0ZXJTcWxFeHByZXNzaW9uLCBtYXJrZXIsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYmxvYnMgPSByZXNwb25zZS5ibG9icyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgbWFya2VyID0gcmVzcG9uc2UuY29udGludWF0aW9uVG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHlpZWxkIF9fYXdhaXQocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH0gd2hpbGUgKG1hcmtlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvciBmb3IgYmxvYnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnRmlsdGVyU3FsRXhwcmVzc2lvbiAtICBUaGUgd2hlcmUgcGFyYW1ldGVyIGVuYWJsZXMgdGhlIGNhbGxlciB0byBxdWVyeSBibG9icyB3aG9zZSB0YWdzIG1hdGNoIGEgZ2l2ZW4gZXhwcmVzc2lvbi5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGdpdmVuIGV4cHJlc3Npb24gbXVzdCBldmFsdWF0ZSB0byB0cnVlIGZvciBhIGJsb2IgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3VsdHMuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZVtPRGF0YSAtIEFCTkZdIGZpbHRlciBzeW50YXggcnVsZSBkZWZpbmVzIHRoZSBmb3JtYWwgZ3JhbW1hciBmb3IgdGhlIHZhbHVlIG9mIHRoZSB3aGVyZSBxdWVyeSBwYXJhbWV0ZXI7XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvd2V2ZXIsIG9ubHkgYSBzdWJzZXQgb2YgdGhlIE9EYXRhIGZpbHRlciBzeW50YXggaXMgc3VwcG9ydGVkIGluIHRoZSBCbG9iIHNlcnZpY2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGZpbmRCbG9ic0J5VGFnc0l0ZW1zLlxuICAgICAqL1xuICAgIGZpbmRCbG9ic0J5VGFnc0l0ZW1zKHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBmaW5kQmxvYnNCeVRhZ3NJdGVtc18xKCkge1xuICAgICAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgICAgICBsZXQgbWFya2VyO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fYXN5bmNWYWx1ZXModGhpcy5maW5kQmxvYnNCeVRhZ3NTZWdtZW50cyh0YWdGaWx0ZXJTcWxFeHByZXNzaW9uLCBtYXJrZXIsIG9wdGlvbnMpKSwgX2M7IF9jID0geWllbGQgX19hd2FpdChfYi5uZXh0KCkpLCAhX2MuZG9uZTspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBfX2F3YWl0KHlpZWxkKiBfX2FzeW5jRGVsZWdhdG9yKF9fYXN5bmNWYWx1ZXMoc2VnbWVudC5ibG9icykpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIHlpZWxkIF9fYXdhaXQoX2EuY2FsbChfYikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFzeW5jIGl0ZXJhYmxlIGl0ZXJhdG9yIHRvIGZpbmQgYWxsIGJsb2JzIHdpdGggc3BlY2lmaWVkIHRhZ1xuICAgICAqIHVuZGVyIHRoZSBzcGVjaWZpZWQgYWNjb3VudC5cbiAgICAgKlxuICAgICAqIC5ieVBhZ2UoKSByZXR1cm5zIGFuIGFzeW5jIGl0ZXJhYmxlIGl0ZXJhdG9yIHRvIGxpc3QgdGhlIGJsb2JzIGluIHBhZ2VzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZ2V0LWJsb2Itc2VydmljZS1wcm9wZXJ0aWVzXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGBmb3IgYXdhaXRgIHN5bnRheDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGZvciBhd2FpdCAoY29uc3QgYmxvYiBvZiBibG9iU2VydmljZUNsaWVudC5maW5kQmxvYnNCeVRhZ3MoXCJ0YWdrZXk9J3RhZ3ZhbHVlJ1wiKSkge1xuICAgICAqICAgY29uc29sZS5sb2coYEJsb2IgJHtpKyt9OiAke2NvbnRhaW5lci5uYW1lfWApO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGl0ZXIubmV4dCgpYDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGNvbnN0IGl0ZXIgPSBibG9iU2VydmljZUNsaWVudC5maW5kQmxvYnNCeVRhZ3MoXCJ0YWdrZXk9J3RhZ3ZhbHVlJ1wiKTtcbiAgICAgKiBsZXQgYmxvYkl0ZW0gPSBhd2FpdCBpdGVyLm5leHQoKTtcbiAgICAgKiB3aGlsZSAoIWJsb2JJdGVtLmRvbmUpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBCbG9iICR7aSsrfTogJHtibG9iSXRlbS52YWx1ZS5uYW1lfWApO1xuICAgICAqICAgYmxvYkl0ZW0gPSBhd2FpdCBpdGVyLm5leHQoKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGBieVBhZ2UoKWA6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIHBhc3Npbmcgb3B0aW9uYWwgbWF4UGFnZVNpemUgaW4gdGhlIHBhZ2Ugc2V0dGluZ3NcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogZm9yIGF3YWl0IChjb25zdCByZXNwb25zZSBvZiBibG9iU2VydmljZUNsaWVudC5maW5kQmxvYnNCeVRhZ3MoXCJ0YWdrZXk9J3RhZ3ZhbHVlJ1wiKS5ieVBhZ2UoeyBtYXhQYWdlU2l6ZTogMjAgfSkpIHtcbiAgICAgKiAgIGlmIChyZXNwb25zZS5ibG9icykge1xuICAgICAqICAgICBmb3IgKGNvbnN0IGJsb2Igb2YgcmVzcG9uc2UuYmxvYnMpIHtcbiAgICAgKiAgICAgICBjb25zb2xlLmxvZyhgQmxvYiAke2krK306ICR7YmxvYi5uYW1lfWApO1xuICAgICAqICAgICB9XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBwYWdpbmcgd2l0aCBhIG1hcmtlcjpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGxldCBpdGVyYXRvciA9IGJsb2JTZXJ2aWNlQ2xpZW50LmZpbmRCbG9ic0J5VGFncyhcInRhZ2tleT0ndGFndmFsdWUnXCIpLmJ5UGFnZSh7IG1heFBhZ2VTaXplOiAyIH0pO1xuICAgICAqIGxldCByZXNwb25zZSA9IChhd2FpdCBpdGVyYXRvci5uZXh0KCkpLnZhbHVlO1xuICAgICAqXG4gICAgICogLy8gUHJpbnRzIDIgYmxvYiBuYW1lc1xuICAgICAqIGlmIChyZXNwb25zZS5ibG9icykge1xuICAgICAqICAgZm9yIChjb25zdCBibG9iIG9mIHJlc3BvbnNlLmJsb2JzKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBCbG9iICR7aSsrfTogJHtibG9iLm5hbWV9YCk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gR2V0cyBuZXh0IG1hcmtlclxuICAgICAqIGxldCBtYXJrZXIgPSByZXNwb25zZS5jb250aW51YXRpb25Ub2tlbjtcbiAgICAgKiAvLyBQYXNzaW5nIG5leHQgbWFya2VyIGFzIGNvbnRpbnVhdGlvblRva2VuXG4gICAgICogaXRlcmF0b3IgPSBibG9iU2VydmljZUNsaWVudFxuICAgICAqICAgLmZpbmRCbG9ic0J5VGFncyhcInRhZ2tleT0ndGFndmFsdWUnXCIpXG4gICAgICogICAuYnlQYWdlKHsgY29udGludWF0aW9uVG9rZW46IG1hcmtlciwgbWF4UGFnZVNpemU6IDEwIH0pO1xuICAgICAqIHJlc3BvbnNlID0gKGF3YWl0IGl0ZXJhdG9yLm5leHQoKSkudmFsdWU7XG4gICAgICpcbiAgICAgKiAvLyBQcmludHMgYmxvYiBuYW1lc1xuICAgICAqIGlmIChyZXNwb25zZS5ibG9icykge1xuICAgICAqICAgZm9yIChjb25zdCBibG9iIG9mIHJlc3BvbnNlLmJsb2JzKSB7XG4gICAgICogICAgICBjb25zb2xlLmxvZyhgQmxvYiAke2krK306ICR7YmxvYi5uYW1lfWApO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YWdGaWx0ZXJTcWxFeHByZXNzaW9uIC0gIFRoZSB3aGVyZSBwYXJhbWV0ZXIgZW5hYmxlcyB0aGUgY2FsbGVyIHRvIHF1ZXJ5IGJsb2JzIHdob3NlIHRhZ3MgbWF0Y2ggYSBnaXZlbiBleHByZXNzaW9uLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZ2l2ZW4gZXhwcmVzc2lvbiBtdXN0IGV2YWx1YXRlIHRvIHRydWUgZm9yIGEgYmxvYiB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzdWx0cy5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlW09EYXRhIC0gQUJORl0gZmlsdGVyIHN5bnRheCBydWxlIGRlZmluZXMgdGhlIGZvcm1hbCBncmFtbWFyIGZvciB0aGUgdmFsdWUgb2YgdGhlIHdoZXJlIHF1ZXJ5IHBhcmFtZXRlcjtcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG93ZXZlciwgb25seSBhIHN1YnNldCBvZiB0aGUgT0RhdGEgZmlsdGVyIHN5bnRheCBpcyBzdXBwb3J0ZWQgaW4gdGhlIEJsb2Igc2VydmljZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gZmluZCBibG9icyBieSB0YWdzLlxuICAgICAqL1xuICAgIGZpbmRCbG9ic0J5VGFncyh0YWdGaWx0ZXJTcWxFeHByZXNzaW9uLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgLy8gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRvIGl0ZXJhdGUgb3ZlciBibG9ic1xuICAgICAgICBjb25zdCBsaXN0U2VnbWVudE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaXRlciA9IHRoaXMuZmluZEJsb2JzQnlUYWdzSXRlbXModGFnRmlsdGVyU3FsRXhwcmVzc2lvbiwgbGlzdFNlZ21lbnRPcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIG5leHQgbWV0aG9kLCBwYXJ0IG9mIHRoZSBpdGVyYXRpb24gcHJvdG9jb2xcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgbmV4dCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlci5uZXh0KCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUaGUgY29ubmVjdGlvbiB0byB0aGUgYXN5bmMgaXRlcmF0b3IsIHBhcnQgb2YgdGhlIGl0ZXJhdGlvbiBwcm90b2NvbFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogUmV0dXJuIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvciB0aGF0IHdvcmtzIGEgcGFnZSBhdCBhIHRpbWVcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgYnlQYWdlOiAoc2V0dGluZ3MgPSB7fSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRCbG9ic0J5VGFnc1NlZ21lbnRzKHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24sIHNldHRpbmdzLmNvbnRpbnVhdGlvblRva2VuLCBPYmplY3QuYXNzaWduKHsgbWF4UGFnZVNpemU6IHNldHRpbmdzLm1heFBhZ2VTaXplIH0sIGxpc3RTZWdtZW50T3B0aW9ucykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgZm9yIFNlcnZpY2VMaXN0Q29udGFpbmVyc1NlZ21lbnRSZXNwb25zZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBtYXJrZXIgLSBBIHN0cmluZyB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHBvcnRpb24gb2ZcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaXN0IG9mIGNvbnRhaW5lcnMgdG8gYmUgcmV0dXJuZWQgd2l0aCB0aGUgbmV4dCBsaXN0aW5nIG9wZXJhdGlvbi4gVGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gcmV0dXJucyB0aGUgY29udGludWF0aW9uVG9rZW4gdmFsdWUgd2l0aGluIHRoZSByZXNwb25zZSBib2R5IGlmIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGluZyBvcGVyYXRpb24gZGlkIG5vdCByZXR1cm4gYWxsIGNvbnRhaW5lcnMgcmVtYWluaW5nIHRvIGJlIGxpc3RlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgY3VycmVudCBwYWdlLiBUaGUgY29udGludWF0aW9uVG9rZW4gdmFsdWUgY2FuIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hcmtlciBwYXJhbWV0ZXIgaW4gYSBzdWJzZXF1ZW50IGNhbGwgdG8gcmVxdWVzdCB0aGUgbmV4dCBwYWdlIG9mIGxpc3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLiBUaGUgbWFya2VyIHZhbHVlIGlzIG9wYXF1ZSB0byB0aGUgY2xpZW50LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBsaXN0IGNvbnRhaW5lcnMgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGxpc3RTZWdtZW50cyhtYXJrZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBsaXN0U2VnbWVudHNfMSgpIHtcbiAgICAgICAgICAgIGxldCBsaXN0Q29udGFpbmVyc1NlZ21lbnRSZXNwb25zZTtcbiAgICAgICAgICAgIGlmICghIW1hcmtlciB8fCBtYXJrZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdENvbnRhaW5lcnNTZWdtZW50UmVzcG9uc2UgPSB5aWVsZCBfX2F3YWl0KHRoaXMubGlzdENvbnRhaW5lcnNTZWdtZW50KG1hcmtlciwgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICBsaXN0Q29udGFpbmVyc1NlZ21lbnRSZXNwb25zZS5jb250YWluZXJJdGVtcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0Q29udGFpbmVyc1NlZ21lbnRSZXNwb25zZS5jb250YWluZXJJdGVtcyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgbWFya2VyID0gbGlzdENvbnRhaW5lcnNTZWdtZW50UmVzcG9uc2UuY29udGludWF0aW9uVG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHlpZWxkIF9fYXdhaXQoeWllbGQgX19hd2FpdChsaXN0Q29udGFpbmVyc1NlZ21lbnRSZXNwb25zZSkpO1xuICAgICAgICAgICAgICAgIH0gd2hpbGUgKG1hcmtlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvciBmb3IgQ29udGFpbmVyIEl0ZW1zXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gbGlzdCBjb250YWluZXJzIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBsaXN0SXRlbXMob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIGxpc3RJdGVtc18xKCkge1xuICAgICAgICAgICAgdmFyIGVfMiwgX2E7XG4gICAgICAgICAgICBsZXQgbWFya2VyO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fYXN5bmNWYWx1ZXModGhpcy5saXN0U2VnbWVudHMobWFya2VyLCBvcHRpb25zKSksIF9jOyBfYyA9IHlpZWxkIF9fYXdhaXQoX2IubmV4dCgpKSwgIV9jLmRvbmU7KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgX19hd2FpdCh5aWVsZCogX19hc3luY0RlbGVnYXRvcihfX2FzeW5jVmFsdWVzKHNlZ21lbnQuY29udGFpbmVySXRlbXMpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfMl8xKSB7IGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07IH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSB5aWVsZCBfX2F3YWl0KF9hLmNhbGwoX2IpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhc3luYyBpdGVyYWJsZSBpdGVyYXRvciB0byBsaXN0IGFsbCB0aGUgY29udGFpbmVyc1xuICAgICAqIHVuZGVyIHRoZSBzcGVjaWZpZWQgYWNjb3VudC5cbiAgICAgKlxuICAgICAqIC5ieVBhZ2UoKSByZXR1cm5zIGFuIGFzeW5jIGl0ZXJhYmxlIGl0ZXJhdG9yIHRvIGxpc3QgdGhlIGNvbnRhaW5lcnMgaW4gcGFnZXMuXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGBmb3IgYXdhaXRgIHN5bnRheDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGZvciBhd2FpdCAoY29uc3QgY29udGFpbmVyIG9mIGJsb2JTZXJ2aWNlQ2xpZW50Lmxpc3RDb250YWluZXJzKCkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBDb250YWluZXIgJHtpKyt9OiAke2NvbnRhaW5lci5uYW1lfWApO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGl0ZXIubmV4dCgpYDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGNvbnN0IGl0ZXIgPSBibG9iU2VydmljZUNsaWVudC5saXN0Q29udGFpbmVycygpO1xuICAgICAqIGxldCBjb250YWluZXJJdGVtID0gYXdhaXQgaXRlci5uZXh0KCk7XG4gICAgICogd2hpbGUgKCFjb250YWluZXJJdGVtLmRvbmUpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBDb250YWluZXIgJHtpKyt9OiAke2NvbnRhaW5lckl0ZW0udmFsdWUubmFtZX1gKTtcbiAgICAgKiAgIGNvbnRhaW5lckl0ZW0gPSBhd2FpdCBpdGVyLm5leHQoKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGBieVBhZ2UoKWA6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIHBhc3Npbmcgb3B0aW9uYWwgbWF4UGFnZVNpemUgaW4gdGhlIHBhZ2Ugc2V0dGluZ3NcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogZm9yIGF3YWl0IChjb25zdCByZXNwb25zZSBvZiBibG9iU2VydmljZUNsaWVudC5saXN0Q29udGFpbmVycygpLmJ5UGFnZSh7IG1heFBhZ2VTaXplOiAyMCB9KSkge1xuICAgICAqICAgaWYgKHJlc3BvbnNlLmNvbnRhaW5lckl0ZW1zKSB7XG4gICAgICogICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIHJlc3BvbnNlLmNvbnRhaW5lckl0ZW1zKSB7XG4gICAgICogICAgICAgY29uc29sZS5sb2coYENvbnRhaW5lciAke2krK306ICR7Y29udGFpbmVyLm5hbWV9YCk7XG4gICAgICogICAgIH1cbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIHBhZ2luZyB3aXRoIGEgbWFya2VyOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogbGV0IGl0ZXJhdG9yID0gYmxvYlNlcnZpY2VDbGllbnQubGlzdENvbnRhaW5lcnMoKS5ieVBhZ2UoeyBtYXhQYWdlU2l6ZTogMiB9KTtcbiAgICAgKiBsZXQgcmVzcG9uc2UgPSAoYXdhaXQgaXRlcmF0b3IubmV4dCgpKS52YWx1ZTtcbiAgICAgKlxuICAgICAqIC8vIFByaW50cyAyIGNvbnRhaW5lciBuYW1lc1xuICAgICAqIGlmIChyZXNwb25zZS5jb250YWluZXJJdGVtcykge1xuICAgICAqICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgcmVzcG9uc2UuY29udGFpbmVySXRlbXMpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coYENvbnRhaW5lciAke2krK306ICR7Y29udGFpbmVyLm5hbWV9YCk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gR2V0cyBuZXh0IG1hcmtlclxuICAgICAqIGxldCBtYXJrZXIgPSByZXNwb25zZS5jb250aW51YXRpb25Ub2tlbjtcbiAgICAgKiAvLyBQYXNzaW5nIG5leHQgbWFya2VyIGFzIGNvbnRpbnVhdGlvblRva2VuXG4gICAgICogaXRlcmF0b3IgPSBibG9iU2VydmljZUNsaWVudFxuICAgICAqICAgLmxpc3RDb250YWluZXJzKClcbiAgICAgKiAgIC5ieVBhZ2UoeyBjb250aW51YXRpb25Ub2tlbjogbWFya2VyLCBtYXhQYWdlU2l6ZTogMTAgfSk7XG4gICAgICogcmVzcG9uc2UgPSAoYXdhaXQgaXRlcmF0b3IubmV4dCgpKS52YWx1ZTtcbiAgICAgKlxuICAgICAqIC8vIFByaW50cyAxMCBjb250YWluZXIgbmFtZXNcbiAgICAgKiBpZiAocmVzcG9uc2UuY29udGFpbmVySXRlbXMpIHtcbiAgICAgKiAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIHJlc3BvbnNlLmNvbnRhaW5lckl0ZW1zKSB7XG4gICAgICogICAgICBjb25zb2xlLmxvZyhgQ29udGFpbmVyICR7aSsrfTogJHtjb250YWluZXIubmFtZX1gKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gbGlzdCBjb250YWluZXJzLlxuICAgICAqIEByZXR1cm5zIEFuIGFzeW5jSXRlcmFibGVJdGVyYXRvciB0aGF0IHN1cHBvcnRzIHBhZ2luZy5cbiAgICAgKi9cbiAgICBsaXN0Q29udGFpbmVycyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKG9wdGlvbnMucHJlZml4ID09PSBcIlwiKSB7XG4gICAgICAgICAgICBvcHRpb25zLnByZWZpeCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmNsdWRlID0gW107XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVEZWxldGVkKSB7XG4gICAgICAgICAgICBpbmNsdWRlLnB1c2goXCJkZWxldGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVNZXRhZGF0YSkge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwibWV0YWRhdGFcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZVN5c3RlbSkge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwic3lzdGVtXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFzeW5jSXRlcmFibGVJdGVyYXRvciB0byBpdGVyYXRlIG92ZXIgY29udGFpbmVyc1xuICAgICAgICBjb25zdCBsaXN0U2VnbWVudE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCAoaW5jbHVkZS5sZW5ndGggPiAwID8geyBpbmNsdWRlIH0gOiB7fSkpO1xuICAgICAgICBjb25zdCBpdGVyID0gdGhpcy5saXN0SXRlbXMobGlzdFNlZ21lbnRPcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIG5leHQgbWV0aG9kLCBwYXJ0IG9mIHRoZSBpdGVyYXRpb24gcHJvdG9jb2xcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgbmV4dCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlci5uZXh0KCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUaGUgY29ubmVjdGlvbiB0byB0aGUgYXN5bmMgaXRlcmF0b3IsIHBhcnQgb2YgdGhlIGl0ZXJhdGlvbiBwcm90b2NvbFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogUmV0dXJuIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvciB0aGF0IHdvcmtzIGEgcGFnZSBhdCBhIHRpbWVcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgYnlQYWdlOiAoc2V0dGluZ3MgPSB7fSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxpc3RTZWdtZW50cyhzZXR0aW5ncy5jb250aW51YXRpb25Ub2tlbiwgT2JqZWN0LmFzc2lnbih7IG1heFBhZ2VTaXplOiBzZXR0aW5ncy5tYXhQYWdlU2l6ZSB9LCBsaXN0U2VnbWVudE9wdGlvbnMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9OTFkgQVZBSUxBQkxFIFdIRU4gVVNJTkcgQkVBUkVSIFRPS0VOIEFVVEhFTlRJQ0FUSU9OIChUb2tlbkNyZWRlbnRpYWwpLlxuICAgICAqXG4gICAgICogUmV0cmlldmVzIGEgdXNlciBkZWxlZ2F0aW9uIGtleSBmb3IgdGhlIEJsb2Igc2VydmljZS4gVGhpcyBpcyBvbmx5IGEgdmFsaWQgb3BlcmF0aW9uIHdoZW4gdXNpbmdcbiAgICAgKiBiZWFyZXIgdG9rZW4gYXV0aGVudGljYXRpb24uXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9nZXQtdXNlci1kZWxlZ2F0aW9uLWtleVxuICAgICAqXG4gICAgICogQHBhcmFtIHN0YXJ0c09uIC0gICAgICBUaGUgc3RhcnQgdGltZSBmb3IgdGhlIHVzZXIgZGVsZWdhdGlvbiBTQVMuIE11c3QgYmUgd2l0aGluIDcgZGF5cyBvZiB0aGUgY3VycmVudCB0aW1lXG4gICAgICogQHBhcmFtIGV4cGlyZXNPbiAtICAgICBUaGUgZW5kIHRpbWUgZm9yIHRoZSB1c2VyIGRlbGVnYXRpb24gU0FTLiBNdXN0IGJlIHdpdGhpbiA3IGRheXMgb2YgdGhlIGN1cnJlbnQgdGltZVxuICAgICAqL1xuICAgIGFzeW5jIGdldFVzZXJEZWxlZ2F0aW9uS2V5KHN0YXJ0c09uLCBleHBpcmVzT24sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYlNlcnZpY2VDbGllbnQtZ2V0VXNlckRlbGVnYXRpb25LZXlcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VydmljZUNvbnRleHQuZ2V0VXNlckRlbGVnYXRpb25LZXkoe1xuICAgICAgICAgICAgICAgIHN0YXJ0c09uOiB0cnVuY2F0ZWRJU084MDYxRGF0ZShzdGFydHNPbiwgZmFsc2UpLFxuICAgICAgICAgICAgICAgIGV4cGlyZXNPbjogdHJ1bmNhdGVkSVNPODA2MURhdGUoZXhwaXJlc09uLCBmYWxzZSksXG4gICAgICAgICAgICB9LCBPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJEZWxlZ2F0aW9uS2V5ID0ge1xuICAgICAgICAgICAgICAgIHNpZ25lZE9iamVjdElkOiByZXNwb25zZS5zaWduZWRPYmplY3RJZCxcbiAgICAgICAgICAgICAgICBzaWduZWRUZW5hbnRJZDogcmVzcG9uc2Uuc2lnbmVkVGVuYW50SWQsXG4gICAgICAgICAgICAgICAgc2lnbmVkU3RhcnRzT246IG5ldyBEYXRlKHJlc3BvbnNlLnNpZ25lZFN0YXJ0c09uKSxcbiAgICAgICAgICAgICAgICBzaWduZWRFeHBpcmVzT246IG5ldyBEYXRlKHJlc3BvbnNlLnNpZ25lZEV4cGlyZXNPbiksXG4gICAgICAgICAgICAgICAgc2lnbmVkU2VydmljZTogcmVzcG9uc2Uuc2lnbmVkU2VydmljZSxcbiAgICAgICAgICAgICAgICBzaWduZWRWZXJzaW9uOiByZXNwb25zZS5zaWduZWRWZXJzaW9uLFxuICAgICAgICAgICAgICAgIHZhbHVlOiByZXNwb25zZS52YWx1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCByZXMgPSBPYmplY3QuYXNzaWduKHsgX3Jlc3BvbnNlOiByZXNwb25zZS5fcmVzcG9uc2UsIHJlcXVlc3RJZDogcmVzcG9uc2UucmVxdWVzdElkLCBjbGllbnRSZXF1ZXN0SWQ6IHJlc3BvbnNlLmNsaWVudFJlcXVlc3RJZCwgdmVyc2lvbjogcmVzcG9uc2UudmVyc2lvbiwgZGF0ZTogcmVzcG9uc2UuZGF0ZSwgZXJyb3JDb2RlOiByZXNwb25zZS5lcnJvckNvZGUgfSwgdXNlckRlbGVnYXRpb25LZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEJsb2JCYXRjaENsaWVudCBvYmplY3QgdG8gY29uZHVjdCBiYXRjaCBvcGVyYXRpb25zLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvYmxvYi1iYXRjaFxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBuZXcgQmxvYkJhdGNoQ2xpZW50IG9iamVjdCBmb3IgdGhpcyBzZXJ2aWNlLlxuICAgICAqL1xuICAgIGdldEJsb2JCYXRjaENsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iQmF0Y2hDbGllbnQodGhpcy51cmwsIHRoaXMucGlwZWxpbmUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPbmx5IGF2YWlsYWJsZSBmb3IgQmxvYlNlcnZpY2VDbGllbnQgY29uc3RydWN0ZWQgd2l0aCBhIHNoYXJlZCBrZXkgY3JlZGVudGlhbC5cbiAgICAgKlxuICAgICAqIEdlbmVyYXRlcyBhIEJsb2IgYWNjb3VudCBTaGFyZWQgQWNjZXNzIFNpZ25hdHVyZSAoU0FTKSBVUkkgYmFzZWQgb24gdGhlIGNsaWVudCBwcm9wZXJ0aWVzXG4gICAgICogYW5kIHBhcmFtZXRlcnMgcGFzc2VkIGluLiBUaGUgU0FTIGlzIHNpZ25lZCBieSB0aGUgc2hhcmVkIGtleSBjcmVkZW50aWFsIG9mIHRoZSBjbGllbnQuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9jcmVhdGUtYWNjb3VudC1zYXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBleHBpcmVzT24gLSBPcHRpb25hbC4gVGhlIHRpbWUgYXQgd2hpY2ggdGhlIHNoYXJlZCBhY2Nlc3Mgc2lnbmF0dXJlIGJlY29tZXMgaW52YWxpZC4gRGVmYXVsdCB0byBhbiBob3VyIGxhdGVyIGlmIG5vdCBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0gcGVybWlzc2lvbnMgLSBTcGVjaWZpZXMgdGhlIGxpc3Qgb2YgcGVybWlzc2lvbnMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBTQVMuXG4gICAgICogQHBhcmFtIHJlc291cmNlVHlwZXMgLSBTcGVjaWZpZXMgdGhlIHJlc291cmNlIHR5cGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2hhcmVkIGFjY2VzcyBzaWduYXR1cmUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm5zIEFuIGFjY291bnQgU0FTIFVSSSBjb25zaXN0aW5nIG9mIHRoZSBVUkkgdG8gdGhlIHJlc291cmNlIHJlcHJlc2VudGVkIGJ5IHRoaXMgY2xpZW50LCBmb2xsb3dlZCBieSB0aGUgZ2VuZXJhdGVkIFNBUyB0b2tlbi5cbiAgICAgKi9cbiAgICBnZW5lcmF0ZUFjY291bnRTYXNVcmwoZXhwaXJlc09uLCBwZXJtaXNzaW9ucyA9IEFjY291bnRTQVNQZXJtaXNzaW9ucy5wYXJzZShcInJcIiksIHJlc291cmNlVHlwZXMgPSBcInNjb1wiLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCEodGhpcy5jcmVkZW50aWFsIGluc3RhbmNlb2YgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwpKSB7XG4gICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiQ2FuIG9ubHkgZ2VuZXJhdGUgdGhlIGFjY291bnQgU0FTIHdoZW4gdGhlIGNsaWVudCBpcyBpbml0aWFsaXplZCB3aXRoIGEgc2hhcmVkIGtleSBjcmVkZW50aWFsXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChleHBpcmVzT24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIGV4cGlyZXNPbiA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyAzNjAwICogMTAwMCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2FzID0gZ2VuZXJhdGVBY2NvdW50U0FTUXVlcnlQYXJhbWV0ZXJzKE9iamVjdC5hc3NpZ24oeyBwZXJtaXNzaW9ucyxcbiAgICAgICAgICAgIGV4cGlyZXNPbixcbiAgICAgICAgICAgIHJlc291cmNlVHlwZXMsIHNlcnZpY2VzOiBBY2NvdW50U0FTU2VydmljZXMucGFyc2UoXCJiXCIpLnRvU3RyaW5nKCkgfSwgb3B0aW9ucyksIHRoaXMuY3JlZGVudGlhbCkudG9TdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIGFwcGVuZFRvVVJMUXVlcnkodGhpcy51cmwsIHNhcyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmxvYlNlcnZpY2VDbGllbnQuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4vKiogS25vd24gdmFsdWVzIG9mIHtAbGluayBFbmNyeXB0aW9uQWxnb3JpdGhtVHlwZX0gdGhhdCB0aGUgc2VydmljZSBhY2NlcHRzLiAqL1xuZXhwb3J0IHZhciBLbm93bkVuY3J5cHRpb25BbGdvcml0aG1UeXBlO1xuKGZ1bmN0aW9uIChLbm93bkVuY3J5cHRpb25BbGdvcml0aG1UeXBlKSB7XG4gICAgS25vd25FbmNyeXB0aW9uQWxnb3JpdGhtVHlwZVtcIkFFUzI1NlwiXSA9IFwiQUVTMjU2XCI7XG59KShLbm93bkVuY3J5cHRpb25BbGdvcml0aG1UeXBlIHx8IChLbm93bkVuY3J5cHRpb25BbGdvcml0aG1UeXBlID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdlbmVyYXRlZE1vZGVscy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IFJlc3RFcnJvciB9IGZyb20gXCJAYXp1cmUvY29yZS1odHRwXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9CbG9iU2VydmljZUNsaWVudFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ2xpZW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ29udGFpbmVyQ2xpZW50XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9CbG9iTGVhc2VDbGllbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Nhcy9BY2NvdW50U0FTUGVybWlzc2lvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Nhcy9BY2NvdW50U0FTUmVzb3VyY2VUeXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2FzL0FjY291bnRTQVNTZXJ2aWNlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2FzL0FjY291bnRTQVNTaWduYXR1cmVWYWx1ZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0Jsb2JCYXRjaFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQmxvYkJhdGNoQ2xpZW50XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9CYXRjaFJlc3BvbnNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zYXMvQmxvYlNBU1Blcm1pc3Npb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zYXMvQmxvYlNBU1NpZ25hdHVyZVZhbHVlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vU3RvcmFnZUJyb3dzZXJQb2xpY3lGYWN0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zYXMvQ29udGFpbmVyU0FTUGVybWlzc2lvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NyZWRlbnRpYWxzL0Fub255bW91c0NyZWRlbnRpYWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NyZWRlbnRpYWxzL0NyZWRlbnRpYWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NyZWRlbnRpYWxzL1N0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsXCI7XG5leHBvcnQgeyBCbG9ja0Jsb2JUaWVyLCBQcmVtaXVtUGFnZUJsb2JUaWVyLCBTdG9yYWdlQmxvYkF1ZGllbmNlLCBnZXRCbG9iU2VydmljZUFjY291bnRBdWRpZW5jZSwgfSBmcm9tIFwiLi9tb2RlbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1BpcGVsaW5lXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9wb2xpY2llcy9Bbm9ueW1vdXNDcmVkZW50aWFsUG9saWN5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9wb2xpY2llcy9DcmVkZW50aWFsUG9saWN5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9TdG9yYWdlUmV0cnlQb2xpY3lGYWN0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9wb2xpY2llcy9TdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbFBvbGljeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2FzL1NBU1F1ZXJ5UGFyYW1ldGVyc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZ2VuZXJhdGVkTW9kZWxzXCI7XG5leHBvcnQgeyBSZXN0RXJyb3IgfTtcbmV4cG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuL2xvZ1wiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5234\n')},6808:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n Octokit: () => (/* binding */ Octokit)\n});\n\n// EXTERNAL MODULE: ./node_modules/universal-user-agent/dist-web/index.js\nvar dist_web = __webpack_require__(350);\n// EXTERNAL MODULE: ./node_modules/before-after-hook/index.js\nvar before_after_hook = __webpack_require__(5186);\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/util/lowercase-keys.js\nfunction lowercaseKeys(object) {\n if (!object) {\n return {};\n }\n return Object.keys(object).reduce((newObj, key) => {\n newObj[key.toLowerCase()] = object[key];\n return newObj;\n }, {});\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/util/is-plain-object.js\nfunction isPlainObject(value) {\n if (typeof value !== "object" || value === null)\n return false;\n if (Object.prototype.toString.call(value) !== "[object Object]")\n return false;\n const proto = Object.getPrototypeOf(value);\n if (proto === null)\n return true;\n const Ctor = Object.prototype.hasOwnProperty.call(proto, "constructor") && proto.constructor;\n return typeof Ctor === "function" && Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value);\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/util/merge-deep.js\n\nfunction mergeDeep(defaults, options) {\n const result = Object.assign({}, defaults);\n Object.keys(options).forEach((key) => {\n if (isPlainObject(options[key])) {\n if (!(key in defaults))\n Object.assign(result, { [key]: options[key] });\n else\n result[key] = mergeDeep(defaults[key], options[key]);\n } else {\n Object.assign(result, { [key]: options[key] });\n }\n });\n return result;\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/util/remove-undefined-properties.js\nfunction removeUndefinedProperties(obj) {\n for (const key in obj) {\n if (obj[key] === void 0) {\n delete obj[key];\n }\n }\n return obj;\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/merge.js\n\n\n\nfunction merge(defaults, route, options) {\n if (typeof route === "string") {\n let [method, url] = route.split(" ");\n options = Object.assign(url ? { method, url } : { url: method }, options);\n } else {\n options = Object.assign({}, route);\n }\n options.headers = lowercaseKeys(options.headers);\n removeUndefinedProperties(options);\n removeUndefinedProperties(options.headers);\n const mergedOptions = mergeDeep(defaults || {}, options);\n if (options.url === "/graphql") {\n if (defaults && defaults.mediaType.previews?.length) {\n mergedOptions.mediaType.previews = defaults.mediaType.previews.filter(\n (preview) => !mergedOptions.mediaType.previews.includes(preview)\n ).concat(mergedOptions.mediaType.previews);\n }\n mergedOptions.mediaType.previews = (mergedOptions.mediaType.previews || []).map((preview) => preview.replace(/-preview/, ""));\n }\n return mergedOptions;\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/util/add-query-parameters.js\nfunction addQueryParameters(url, parameters) {\n const separator = /\\?/.test(url) ? "&" : "?";\n const names = Object.keys(parameters);\n if (names.length === 0) {\n return url;\n }\n return url + separator + names.map((name) => {\n if (name === "q") {\n return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+");\n }\n return `${name}=${encodeURIComponent(parameters[name])}`;\n }).join("&");\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/util/extract-url-variable-names.js\nconst urlVariableRegex = /\\{[^}]+\\}/g;\nfunction removeNonChars(variableName) {\n return variableName.replace(/^\\W+|\\W+$/g, "").split(/,/);\n}\nfunction extractUrlVariableNames(url) {\n const matches = url.match(urlVariableRegex);\n if (!matches) {\n return [];\n }\n return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []);\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/util/omit.js\nfunction omit(object, keysToOmit) {\n const result = { __proto__: null };\n for (const key of Object.keys(object)) {\n if (keysToOmit.indexOf(key) === -1) {\n result[key] = object[key];\n }\n }\n return result;\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/util/url-template.js\nfunction encodeReserved(str) {\n return str.split(/(%[0-9A-Fa-f]{2})/g).map(function(part) {\n if (!/%[0-9A-Fa-f]/.test(part)) {\n part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]");\n }\n return part;\n }).join("");\n}\nfunction encodeUnreserved(str) {\n return encodeURIComponent(str).replace(/[!\'()*]/g, function(c) {\n return "%" + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\nfunction encodeValue(operator, value, key) {\n value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value);\n if (key) {\n return encodeUnreserved(key) + "=" + value;\n } else {\n return value;\n }\n}\nfunction isDefined(value) {\n return value !== void 0 && value !== null;\n}\nfunction isKeyOperator(operator) {\n return operator === ";" || operator === "&" || operator === "?";\n}\nfunction getValues(context, operator, key, modifier) {\n var value = context[key], result = [];\n if (isDefined(value) && value !== "") {\n if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {\n value = value.toString();\n if (modifier && modifier !== "*") {\n value = value.substring(0, parseInt(modifier, 10));\n }\n result.push(\n encodeValue(operator, value, isKeyOperator(operator) ? key : "")\n );\n } else {\n if (modifier === "*") {\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function(value2) {\n result.push(\n encodeValue(operator, value2, isKeyOperator(operator) ? key : "")\n );\n });\n } else {\n Object.keys(value).forEach(function(k) {\n if (isDefined(value[k])) {\n result.push(encodeValue(operator, value[k], k));\n }\n });\n }\n } else {\n const tmp = [];\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function(value2) {\n tmp.push(encodeValue(operator, value2));\n });\n } else {\n Object.keys(value).forEach(function(k) {\n if (isDefined(value[k])) {\n tmp.push(encodeUnreserved(k));\n tmp.push(encodeValue(operator, value[k].toString()));\n }\n });\n }\n if (isKeyOperator(operator)) {\n result.push(encodeUnreserved(key) + "=" + tmp.join(","));\n } else if (tmp.length !== 0) {\n result.push(tmp.join(","));\n }\n }\n }\n } else {\n if (operator === ";") {\n if (isDefined(value)) {\n result.push(encodeUnreserved(key));\n }\n } else if (value === "" && (operator === "&" || operator === "?")) {\n result.push(encodeUnreserved(key) + "=");\n } else if (value === "") {\n result.push("");\n }\n }\n return result;\n}\nfunction parseUrl(template) {\n return {\n expand: expand.bind(null, template)\n };\n}\nfunction expand(template, context) {\n var operators = ["+", "#", ".", "/", ";", "?", "&"];\n template = template.replace(\n /\\{([^\\{\\}]+)\\}|([^\\{\\}]+)/g,\n function(_, expression, literal) {\n if (expression) {\n let operator = "";\n const values = [];\n if (operators.indexOf(expression.charAt(0)) !== -1) {\n operator = expression.charAt(0);\n expression = expression.substr(1);\n }\n expression.split(/,/g).forEach(function(variable) {\n var tmp = /([^:\\*]*)(?::(\\d+)|(\\*))?/.exec(variable);\n values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));\n });\n if (operator && operator !== "+") {\n var separator = ",";\n if (operator === "?") {\n separator = "&";\n } else if (operator !== "#") {\n separator = operator;\n }\n return (values.length !== 0 ? operator : "") + values.join(separator);\n } else {\n return values.join(",");\n }\n } else {\n return encodeReserved(literal);\n }\n }\n );\n if (template === "/") {\n return template;\n } else {\n return template.replace(/\\/$/, "");\n }\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/parse.js\n\n\n\n\nfunction parse(options) {\n let method = options.method.toUpperCase();\n let url = (options.url || "/").replace(/:([a-z]\\w+)/g, "{$1}");\n let headers = Object.assign({}, options.headers);\n let body;\n let parameters = omit(options, [\n "method",\n "baseUrl",\n "url",\n "headers",\n "request",\n "mediaType"\n ]);\n const urlVariableNames = extractUrlVariableNames(url);\n url = parseUrl(url).expand(parameters);\n if (!/^http/.test(url)) {\n url = options.baseUrl + url;\n }\n const omittedParameters = Object.keys(options).filter((option) => urlVariableNames.includes(option)).concat("baseUrl");\n const remainingParameters = omit(parameters, omittedParameters);\n const isBinaryRequest = /application\\/octet-stream/i.test(headers.accept);\n if (!isBinaryRequest) {\n if (options.mediaType.format) {\n headers.accept = headers.accept.split(/,/).map(\n (format) => format.replace(\n /application\\/vnd(\\.\\w+)(\\.v3)?(\\.\\w+)?(\\+json)?$/,\n `application/vnd$1$2.${options.mediaType.format}`\n )\n ).join(",");\n }\n if (url.endsWith("/graphql")) {\n if (options.mediaType.previews?.length) {\n const previewsFromAcceptHeader = headers.accept.match(/[\\w-]+(?=-preview)/g) || [];\n headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map((preview) => {\n const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json";\n return `application/vnd.github.${preview}-preview${format}`;\n }).join(",");\n }\n }\n }\n if (["GET", "HEAD"].includes(method)) {\n url = addQueryParameters(url, remainingParameters);\n } else {\n if ("data" in remainingParameters) {\n body = remainingParameters.data;\n } else {\n if (Object.keys(remainingParameters).length) {\n body = remainingParameters;\n }\n }\n }\n if (!headers["content-type"] && typeof body !== "undefined") {\n headers["content-type"] = "application/json; charset=utf-8";\n }\n if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") {\n body = "";\n }\n return Object.assign(\n { method, url, headers },\n typeof body !== "undefined" ? { body } : null,\n options.request ? { request: options.request } : null\n );\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/endpoint-with-defaults.js\n\n\n\nfunction endpointWithDefaults(defaults, route, options) {\n return parse(merge(defaults, route, options));\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/with-defaults.js\n\n\n\nfunction withDefaults(oldDefaults, newDefaults) {\n const DEFAULTS = merge(oldDefaults, newDefaults);\n const endpoint = endpointWithDefaults.bind(null, DEFAULTS);\n return Object.assign(endpoint, {\n DEFAULTS,\n defaults: withDefaults.bind(null, DEFAULTS),\n merge: merge.bind(null, DEFAULTS),\n parse: parse\n });\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/version.js\nconst VERSION = "9.0.4";\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/defaults.js\n\n\nconst userAgent = `octokit-endpoint.js/${VERSION} ${(0,dist_web/* getUserAgent */.i)()}`;\nconst DEFAULTS = {\n method: "GET",\n baseUrl: "https://api.github.com",\n headers: {\n accept: "application/vnd.github.v3+json",\n "user-agent": userAgent\n },\n mediaType: {\n format: ""\n }\n};\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/index.js\n\n\nconst endpoint = withDefaults(null, DEFAULTS);\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/request/dist-src/version.js\nconst version_VERSION = "8.1.6";\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/request/dist-src/is-plain-object.js\nfunction is_plain_object_isPlainObject(value) {\n if (typeof value !== "object" || value === null)\n return false;\n if (Object.prototype.toString.call(value) !== "[object Object]")\n return false;\n const proto = Object.getPrototypeOf(value);\n if (proto === null)\n return true;\n const Ctor = Object.prototype.hasOwnProperty.call(proto, "constructor") && proto.constructor;\n return typeof Ctor === "function" && Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value);\n}\n\n\n// EXTERNAL MODULE: ./node_modules/deprecation/dist-web/index.js\nvar deprecation_dist_web = __webpack_require__(2327);\n// EXTERNAL MODULE: ./node_modules/once/once.js\nvar once = __webpack_require__(778);\nvar once_default = /*#__PURE__*/__webpack_require__.n(once);\n;// CONCATENATED MODULE: ./node_modules/@octokit/request-error/dist-src/index.js\n\n\nconst logOnceCode = once_default()((deprecation) => console.warn(deprecation));\nconst logOnceHeaders = once_default()((deprecation) => console.warn(deprecation));\nclass RequestError extends Error {\n constructor(message, statusCode, options) {\n super(message);\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n this.name = "HttpError";\n this.status = statusCode;\n let headers;\n if ("headers" in options && typeof options.headers !== "undefined") {\n headers = options.headers;\n }\n if ("response" in options) {\n this.response = options.response;\n headers = options.response.headers;\n }\n const requestCopy = Object.assign({}, options.request);\n if (options.request.headers.authorization) {\n requestCopy.headers = Object.assign({}, options.request.headers, {\n authorization: options.request.headers.authorization.replace(\n / .*$/,\n " [REDACTED]"\n )\n });\n }\n requestCopy.url = requestCopy.url.replace(/\\bclient_secret=\\w+/g, "client_secret=[REDACTED]").replace(/\\baccess_token=\\w+/g, "access_token=[REDACTED]");\n this.request = requestCopy;\n Object.defineProperty(this, "code", {\n get() {\n logOnceCode(\n new deprecation_dist_web/* Deprecation */.$(\n "[@octokit/request-error] `error.code` is deprecated, use `error.status`."\n )\n );\n return statusCode;\n }\n });\n Object.defineProperty(this, "headers", {\n get() {\n logOnceHeaders(\n new deprecation_dist_web/* Deprecation */.$(\n "[@octokit/request-error] `error.headers` is deprecated, use `error.response.headers`."\n )\n );\n return headers || {};\n }\n });\n }\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/request/dist-src/get-buffer-response.js\nfunction getBufferResponse(response) {\n return response.arrayBuffer();\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/request/dist-src/fetch-wrapper.js\n\n\n\nfunction fetchWrapper(requestOptions) {\n const log = requestOptions.request && requestOptions.request.log ? requestOptions.request.log : console;\n const parseSuccessResponseBody = requestOptions.request?.parseSuccessResponseBody !== false;\n if (is_plain_object_isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body)) {\n requestOptions.body = JSON.stringify(requestOptions.body);\n }\n let headers = {};\n let status;\n let url;\n let { fetch } = globalThis;\n if (requestOptions.request?.fetch) {\n fetch = requestOptions.request.fetch;\n }\n if (!fetch) {\n throw new Error(\n "fetch is not set. Please pass a fetch implementation as new Octokit({ request: { fetch }}). Learn more at https://github.com/octokit/octokit.js/#fetch-missing"\n );\n }\n return fetch(requestOptions.url, {\n method: requestOptions.method,\n body: requestOptions.body,\n headers: requestOptions.headers,\n signal: requestOptions.request?.signal,\n // duplex must be set if request.body is ReadableStream or Async Iterables.\n // See https://fetch.spec.whatwg.org/#dom-requestinit-duplex.\n ...requestOptions.body && { duplex: "half" }\n }).then(async (response) => {\n url = response.url;\n status = response.status;\n for (const keyAndValue of response.headers) {\n headers[keyAndValue[0]] = keyAndValue[1];\n }\n if ("deprecation" in headers) {\n const matches = headers.link && headers.link.match(/<([^>]+)>; rel="deprecation"/);\n const deprecationLink = matches && matches.pop();\n log.warn(\n `[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${headers.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}`\n );\n }\n if (status === 204 || status === 205) {\n return;\n }\n if (requestOptions.method === "HEAD") {\n if (status < 400) {\n return;\n }\n throw new RequestError(response.statusText, status, {\n response: {\n url,\n status,\n headers,\n data: void 0\n },\n request: requestOptions\n });\n }\n if (status === 304) {\n throw new RequestError("Not modified", status, {\n response: {\n url,\n status,\n headers,\n data: await getResponseData(response)\n },\n request: requestOptions\n });\n }\n if (status >= 400) {\n const data = await getResponseData(response);\n const error = new RequestError(toErrorMessage(data), status, {\n response: {\n url,\n status,\n headers,\n data\n },\n request: requestOptions\n });\n throw error;\n }\n return parseSuccessResponseBody ? await getResponseData(response) : response.body;\n }).then((data) => {\n return {\n status,\n url,\n headers,\n data\n };\n }).catch((error) => {\n if (error instanceof RequestError)\n throw error;\n else if (error.name === "AbortError")\n throw error;\n let message = error.message;\n if (error.name === "TypeError" && "cause" in error) {\n if (error.cause instanceof Error) {\n message = error.cause.message;\n } else if (typeof error.cause === "string") {\n message = error.cause;\n }\n }\n throw new RequestError(message, 500, {\n request: requestOptions\n });\n });\n}\nasync function getResponseData(response) {\n const contentType = response.headers.get("content-type");\n if (/application\\/json/.test(contentType)) {\n return response.json().catch(() => response.text()).catch(() => "");\n }\n if (!contentType || /^text\\/|charset=utf-8$/.test(contentType)) {\n return response.text();\n }\n return getBufferResponse(response);\n}\nfunction toErrorMessage(data) {\n if (typeof data === "string")\n return data;\n if ("message" in data) {\n if (Array.isArray(data.errors)) {\n return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}`;\n }\n return data.message;\n }\n return `Unknown error: ${JSON.stringify(data)}`;\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/request/dist-src/with-defaults.js\n\nfunction with_defaults_withDefaults(oldEndpoint, newDefaults) {\n const endpoint = oldEndpoint.defaults(newDefaults);\n const newApi = function(route, parameters) {\n const endpointOptions = endpoint.merge(route, parameters);\n if (!endpointOptions.request || !endpointOptions.request.hook) {\n return fetchWrapper(endpoint.parse(endpointOptions));\n }\n const request = (route2, parameters2) => {\n return fetchWrapper(\n endpoint.parse(endpoint.merge(route2, parameters2))\n );\n };\n Object.assign(request, {\n endpoint,\n defaults: with_defaults_withDefaults.bind(null, endpoint)\n });\n return endpointOptions.request.hook(request, endpointOptions);\n };\n return Object.assign(newApi, {\n endpoint,\n defaults: with_defaults_withDefaults.bind(null, endpoint)\n });\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/request/dist-src/index.js\n\n\n\n\nconst request = with_defaults_withDefaults(endpoint, {\n headers: {\n "user-agent": `octokit-request.js/${version_VERSION} ${(0,dist_web/* getUserAgent */.i)()}`\n }\n});\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/graphql/dist-web/index.js\n// pkg/dist-src/index.js\n\n\n\n// pkg/dist-src/version.js\nvar dist_web_VERSION = "7.0.2";\n\n// pkg/dist-src/with-defaults.js\n\n\n// pkg/dist-src/graphql.js\n\n\n// pkg/dist-src/error.js\nfunction _buildMessageForResponseErrors(data) {\n return `Request failed due to following response errors:\n` + data.errors.map((e) => ` - ${e.message}`).join("\\n");\n}\nvar GraphqlResponseError = class extends Error {\n constructor(request2, headers, response) {\n super(_buildMessageForResponseErrors(response));\n this.request = request2;\n this.headers = headers;\n this.response = response;\n this.name = "GraphqlResponseError";\n this.errors = response.errors;\n this.data = response.data;\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n};\n\n// pkg/dist-src/graphql.js\nvar NON_VARIABLE_OPTIONS = [\n "method",\n "baseUrl",\n "url",\n "headers",\n "request",\n "query",\n "mediaType"\n];\nvar FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"];\nvar GHES_V3_SUFFIX_REGEX = /\\/api\\/v3\\/?$/;\nfunction graphql(request2, query, options) {\n if (options) {\n if (typeof query === "string" && "query" in options) {\n return Promise.reject(\n new Error(`[@octokit/graphql] "query" cannot be used as variable name`)\n );\n }\n for (const key in options) {\n if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key))\n continue;\n return Promise.reject(\n new Error(\n `[@octokit/graphql] "${key}" cannot be used as variable name`\n )\n );\n }\n }\n const parsedOptions = typeof query === "string" ? Object.assign({ query }, options) : query;\n const requestOptions = Object.keys(\n parsedOptions\n ).reduce((result, key) => {\n if (NON_VARIABLE_OPTIONS.includes(key)) {\n result[key] = parsedOptions[key];\n return result;\n }\n if (!result.variables) {\n result.variables = {};\n }\n result.variables[key] = parsedOptions[key];\n return result;\n }, {});\n const baseUrl = parsedOptions.baseUrl || request2.endpoint.DEFAULTS.baseUrl;\n if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) {\n requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql");\n }\n return request2(requestOptions).then((response) => {\n if (response.data.errors) {\n const headers = {};\n for (const key of Object.keys(response.headers)) {\n headers[key] = response.headers[key];\n }\n throw new GraphqlResponseError(\n requestOptions,\n headers,\n response.data\n );\n }\n return response.data.data;\n });\n}\n\n// pkg/dist-src/with-defaults.js\nfunction dist_web_withDefaults(request2, newDefaults) {\n const newRequest = request2.defaults(newDefaults);\n const newApi = (query, options) => {\n return graphql(newRequest, query, options);\n };\n return Object.assign(newApi, {\n defaults: dist_web_withDefaults.bind(null, newRequest),\n endpoint: newRequest.endpoint\n });\n}\n\n// pkg/dist-src/index.js\nvar graphql2 = dist_web_withDefaults(request, {\n headers: {\n "user-agent": `octokit-graphql.js/${dist_web_VERSION} ${(0,dist_web/* getUserAgent */.i)()}`\n },\n method: "POST",\n url: "/graphql"\n});\nfunction withCustomRequest(customRequest) {\n return dist_web_withDefaults(customRequest, {\n method: "POST",\n url: "/graphql"\n });\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/auth-token/dist-src/auth.js\nconst REGEX_IS_INSTALLATION_LEGACY = /^v1\\./;\nconst REGEX_IS_INSTALLATION = /^ghs_/;\nconst REGEX_IS_USER_TO_SERVER = /^ghu_/;\nasync function auth(token) {\n const isApp = token.split(/\\./).length === 3;\n const isInstallation = REGEX_IS_INSTALLATION_LEGACY.test(token) || REGEX_IS_INSTALLATION.test(token);\n const isUserToServer = REGEX_IS_USER_TO_SERVER.test(token);\n const tokenType = isApp ? "app" : isInstallation ? "installation" : isUserToServer ? "user-to-server" : "oauth";\n return {\n type: "token",\n token,\n tokenType\n };\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/auth-token/dist-src/with-authorization-prefix.js\nfunction withAuthorizationPrefix(token) {\n if (token.split(/\\./).length === 3) {\n return `bearer ${token}`;\n }\n return `token ${token}`;\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/auth-token/dist-src/hook.js\n\nasync function hook(token, request, route, parameters) {\n const endpoint = request.endpoint.merge(\n route,\n parameters\n );\n endpoint.headers.authorization = withAuthorizationPrefix(token);\n return request(endpoint);\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/auth-token/dist-src/index.js\n\n\nconst createTokenAuth = function createTokenAuth2(token) {\n if (!token) {\n throw new Error("[@octokit/auth-token] No token passed to createTokenAuth");\n }\n if (typeof token !== "string") {\n throw new Error(\n "[@octokit/auth-token] Token passed to createTokenAuth is not a string"\n );\n }\n token = token.replace(/^(token|bearer) +/i, "");\n return Object.assign(auth.bind(null, token), {\n hook: hook.bind(null, token)\n });\n};\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/core/dist-web/index.js\n// pkg/dist-src/index.js\n\n\n\n\n\n\n// pkg/dist-src/version.js\nvar core_dist_web_VERSION = "5.1.0";\n\n// pkg/dist-src/index.js\nvar noop = () => {\n};\nvar consoleWarn = console.warn.bind(console);\nvar consoleError = console.error.bind(console);\nvar userAgentTrail = `octokit-core.js/${core_dist_web_VERSION} ${(0,dist_web/* getUserAgent */.i)()}`;\nvar Octokit = class {\n static {\n this.VERSION = core_dist_web_VERSION;\n }\n static defaults(defaults) {\n const OctokitWithDefaults = class extends this {\n constructor(...args) {\n const options = args[0] || {};\n if (typeof defaults === "function") {\n super(defaults(options));\n return;\n }\n super(\n Object.assign(\n {},\n defaults,\n options,\n options.userAgent && defaults.userAgent ? {\n userAgent: `${options.userAgent} ${defaults.userAgent}`\n } : null\n )\n );\n }\n };\n return OctokitWithDefaults;\n }\n static {\n this.plugins = [];\n }\n /**\n * Attach a plugin (or many) to your Octokit instance.\n *\n * @example\n * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...)\n */\n static plugin(...newPlugins) {\n const currentPlugins = this.plugins;\n const NewOctokit = class extends this {\n static {\n this.plugins = currentPlugins.concat(\n newPlugins.filter((plugin) => !currentPlugins.includes(plugin))\n );\n }\n };\n return NewOctokit;\n }\n constructor(options = {}) {\n const hook = new before_after_hook.Collection();\n const requestDefaults = {\n baseUrl: request.endpoint.DEFAULTS.baseUrl,\n headers: {},\n request: Object.assign({}, options.request, {\n // @ts-ignore internal usage only, no need to type\n hook: hook.bind(null, "request")\n }),\n mediaType: {\n previews: [],\n format: ""\n }\n };\n requestDefaults.headers["user-agent"] = options.userAgent ? `${options.userAgent} ${userAgentTrail}` : userAgentTrail;\n if (options.baseUrl) {\n requestDefaults.baseUrl = options.baseUrl;\n }\n if (options.previews) {\n requestDefaults.mediaType.previews = options.previews;\n }\n if (options.timeZone) {\n requestDefaults.headers["time-zone"] = options.timeZone;\n }\n this.request = request.defaults(requestDefaults);\n this.graphql = withCustomRequest(this.request).defaults(requestDefaults);\n this.log = Object.assign(\n {\n debug: noop,\n info: noop,\n warn: consoleWarn,\n error: consoleError\n },\n options.log\n );\n this.hook = hook;\n if (!options.authStrategy) {\n if (!options.auth) {\n this.auth = async () => ({\n type: "unauthenticated"\n });\n } else {\n const auth = createTokenAuth(options.auth);\n hook.wrap("request", auth.hook);\n this.auth = auth;\n }\n } else {\n const { authStrategy, ...otherOptions } = options;\n const auth = authStrategy(\n Object.assign(\n {\n request: this.request,\n log: this.log,\n // we pass the current octokit instance as well as its constructor options\n // to allow for authentication strategies that return a new octokit instance\n // that shares the same internal state as the current one. The original\n // requirement for this was the "event-octokit" authentication strategy\n // of https://github.com/probot/octokit-auth-probot.\n octokit: this,\n octokitOptions: otherOptions\n },\n options.auth\n )\n );\n hook.wrap("request", auth.hook);\n this.auth = auth;\n }\n const classConstructor = this.constructor;\n for (let i = 0; i < classConstructor.plugins.length; ++i) {\n Object.assign(this, classConstructor.plugins[i](this, options));\n }\n }\n};\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IscUNBQXFDO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBR0UiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy91dGlsL2xvd2VyY2FzZS1rZXlzLmpzP2ZlYzYiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC1zcmMvdXRpbC9pcy1wbGFpbi1vYmplY3QuanM/OTI0MyIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy91dGlsL21lcmdlLWRlZXAuanM/M2RhZCIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy91dGlsL3JlbW92ZS11bmRlZmluZWQtcHJvcGVydGllcy5qcz8xNWU0Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2VuZHBvaW50L2Rpc3Qtc3JjL21lcmdlLmpzP2ZhNzYiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC1zcmMvdXRpbC9hZGQtcXVlcnktcGFyYW1ldGVycy5qcz9hZWRmIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2VuZHBvaW50L2Rpc3Qtc3JjL3V0aWwvZXh0cmFjdC11cmwtdmFyaWFibGUtbmFtZXMuanM/Y2QxMiIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy91dGlsL29taXQuanM/YWRlOCIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy91dGlsL3VybC10ZW1wbGF0ZS5qcz9lMmU4Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2VuZHBvaW50L2Rpc3Qtc3JjL3BhcnNlLmpzPzliZjUiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC1zcmMvZW5kcG9pbnQtd2l0aC1kZWZhdWx0cy5qcz8wMDEyIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2VuZHBvaW50L2Rpc3Qtc3JjL3dpdGgtZGVmYXVsdHMuanM/ZDMxNiIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy92ZXJzaW9uLmpzPzZhYTYiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC1zcmMvZGVmYXVsdHMuanM/OTM2NCIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy9pbmRleC5qcz9hNjUwIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3JlcXVlc3QvZGlzdC1zcmMvdmVyc2lvbi5qcz84YWI5Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3JlcXVlc3QvZGlzdC1zcmMvaXMtcGxhaW4tb2JqZWN0LmpzP2NlNjAiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvcmVxdWVzdC1lcnJvci9kaXN0LXNyYy9pbmRleC5qcz83ODliIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3JlcXVlc3QvZGlzdC1zcmMvZ2V0LWJ1ZmZlci1yZXNwb25zZS5qcz8zNzgyIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3JlcXVlc3QvZGlzdC1zcmMvZmV0Y2gtd3JhcHBlci5qcz8xODkxIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3JlcXVlc3QvZGlzdC1zcmMvd2l0aC1kZWZhdWx0cy5qcz8zZDgzIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3JlcXVlc3QvZGlzdC1zcmMvaW5kZXguanM/YTNhNSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9ncmFwaHFsL2Rpc3Qtd2ViL2luZGV4LmpzP2UwOWEiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvYXV0aC10b2tlbi9kaXN0LXNyYy9hdXRoLmpzPzYzY2EiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvYXV0aC10b2tlbi9kaXN0LXNyYy93aXRoLWF1dGhvcml6YXRpb24tcHJlZml4LmpzP2M2MDgiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvYXV0aC10b2tlbi9kaXN0LXNyYy9ob29rLmpzP2I0MWEiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvYXV0aC10b2tlbi9kaXN0LXNyYy9pbmRleC5qcz84MjBiIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2NvcmUvZGlzdC13ZWIvaW5kZXguanM/OWJlYyJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBsb3dlcmNhc2VLZXlzKG9iamVjdCkge1xuICBpZiAoIW9iamVjdCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KS5yZWR1Y2UoKG5ld09iaiwga2V5KSA9PiB7XG4gICAgbmV3T2JqW2tleS50b0xvd2VyQ2FzZSgpXSA9IG9iamVjdFtrZXldO1xuICAgIHJldHVybiBuZXdPYmo7XG4gIH0sIHt9KTtcbn1cbmV4cG9ydCB7XG4gIGxvd2VyY2FzZUtleXNcbn07XG4iLCJmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSAhPT0gXCJbb2JqZWN0IE9iamVjdF1cIilcbiAgICByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgaWYgKHByb3RvID09PSBudWxsKVxuICAgIHJldHVybiB0cnVlO1xuICBjb25zdCBDdG9yID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCBcImNvbnN0cnVjdG9yXCIpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gdHlwZW9mIEN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJiBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbChDdG9yKSA9PT0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwodmFsdWUpO1xufVxuZXhwb3J0IHtcbiAgaXNQbGFpbk9iamVjdFxufTtcbiIsImltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tIFwiLi9pcy1wbGFpbi1vYmplY3RcIjtcbmZ1bmN0aW9uIG1lcmdlRGVlcChkZWZhdWx0cywgb3B0aW9ucykge1xuICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0cyk7XG4gIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGlmIChpc1BsYWluT2JqZWN0KG9wdGlvbnNba2V5XSkpIHtcbiAgICAgIGlmICghKGtleSBpbiBkZWZhdWx0cykpXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCB7IFtrZXldOiBvcHRpb25zW2tleV0gfSk7XG4gICAgICBlbHNlXG4gICAgICAgIHJlc3VsdFtrZXldID0gbWVyZ2VEZWVwKGRlZmF1bHRzW2tleV0sIG9wdGlvbnNba2V5XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCB7IFtrZXldOiBvcHRpb25zW2tleV0gfSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCB7XG4gIG1lcmdlRGVlcFxufTtcbiIsImZ1bmN0aW9uIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXMob2JqKSB7XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGlmIChvYmpba2V5XSA9PT0gdm9pZCAwKSB7XG4gICAgICBkZWxldGUgb2JqW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG5leHBvcnQge1xuICByZW1vdmVVbmRlZmluZWRQcm9wZXJ0aWVzXG59O1xuIiwiaW1wb3J0IHsgbG93ZXJjYXNlS2V5cyB9IGZyb20gXCIuL3V0aWwvbG93ZXJjYXNlLWtleXNcIjtcbmltcG9ydCB7IG1lcmdlRGVlcCB9IGZyb20gXCIuL3V0aWwvbWVyZ2UtZGVlcFwiO1xuaW1wb3J0IHsgcmVtb3ZlVW5kZWZpbmVkUHJvcGVydGllcyB9IGZyb20gXCIuL3V0aWwvcmVtb3ZlLXVuZGVmaW5lZC1wcm9wZXJ0aWVzXCI7XG5mdW5jdGlvbiBtZXJnZShkZWZhdWx0cywgcm91dGUsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiByb3V0ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGxldCBbbWV0aG9kLCB1cmxdID0gcm91dGUuc3BsaXQoXCIgXCIpO1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHVybCA/IHsgbWV0aG9kLCB1cmwgfSA6IHsgdXJsOiBtZXRob2QgfSwgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHJvdXRlKTtcbiAgfVxuICBvcHRpb25zLmhlYWRlcnMgPSBsb3dlcmNhc2VLZXlzKG9wdGlvbnMuaGVhZGVycyk7XG4gIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXMob3B0aW9ucyk7XG4gIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXMob3B0aW9ucy5oZWFkZXJzKTtcbiAgY29uc3QgbWVyZ2VkT3B0aW9ucyA9IG1lcmdlRGVlcChkZWZhdWx0cyB8fCB7fSwgb3B0aW9ucyk7XG4gIGlmIChvcHRpb25zLnVybCA9PT0gXCIvZ3JhcGhxbFwiKSB7XG4gICAgaWYgKGRlZmF1bHRzICYmIGRlZmF1bHRzLm1lZGlhVHlwZS5wcmV2aWV3cz8ubGVuZ3RoKSB7XG4gICAgICBtZXJnZWRPcHRpb25zLm1lZGlhVHlwZS5wcmV2aWV3cyA9IGRlZmF1bHRzLm1lZGlhVHlwZS5wcmV2aWV3cy5maWx0ZXIoXG4gICAgICAgIChwcmV2aWV3KSA9PiAhbWVyZ2VkT3B0aW9ucy5tZWRpYVR5cGUucHJldmlld3MuaW5jbHVkZXMocHJldmlldylcbiAgICAgICkuY29uY2F0KG1lcmdlZE9wdGlvbnMubWVkaWFUeXBlLnByZXZpZXdzKTtcbiAgICB9XG4gICAgbWVyZ2VkT3B0aW9ucy5tZWRpYVR5cGUucHJldmlld3MgPSAobWVyZ2VkT3B0aW9ucy5tZWRpYVR5cGUucHJldmlld3MgfHwgW10pLm1hcCgocHJldmlldykgPT4gcHJldmlldy5yZXBsYWNlKC8tcHJldmlldy8sIFwiXCIpKTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkT3B0aW9ucztcbn1cbmV4cG9ydCB7XG4gIG1lcmdlXG59O1xuIiwiZnVuY3Rpb24gYWRkUXVlcnlQYXJhbWV0ZXJzKHVybCwgcGFyYW1ldGVycykge1xuICBjb25zdCBzZXBhcmF0b3IgPSAvXFw/Ly50ZXN0KHVybCkgPyBcIiZcIiA6IFwiP1wiO1xuICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpO1xuICBpZiAobmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICByZXR1cm4gdXJsICsgc2VwYXJhdG9yICsgbmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgaWYgKG5hbWUgPT09IFwicVwiKSB7XG4gICAgICByZXR1cm4gXCJxPVwiICsgcGFyYW1ldGVycy5xLnNwbGl0KFwiK1wiKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiK1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIGAke25hbWV9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtZXRlcnNbbmFtZV0pfWA7XG4gIH0pLmpvaW4oXCImXCIpO1xufVxuZXhwb3J0IHtcbiAgYWRkUXVlcnlQYXJhbWV0ZXJzXG59O1xuIiwiY29uc3QgdXJsVmFyaWFibGVSZWdleCA9IC9cXHtbXn1dK1xcfS9nO1xuZnVuY3Rpb24gcmVtb3ZlTm9uQ2hhcnModmFyaWFibGVOYW1lKSB7XG4gIHJldHVybiB2YXJpYWJsZU5hbWUucmVwbGFjZSgvXlxcVyt8XFxXKyQvZywgXCJcIikuc3BsaXQoLywvKTtcbn1cbmZ1bmN0aW9uIGV4dHJhY3RVcmxWYXJpYWJsZU5hbWVzKHVybCkge1xuICBjb25zdCBtYXRjaGVzID0gdXJsLm1hdGNoKHVybFZhcmlhYmxlUmVnZXgpO1xuICBpZiAoIW1hdGNoZXMpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIG1hdGNoZXMubWFwKHJlbW92ZU5vbkNoYXJzKS5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpLCBbXSk7XG59XG5leHBvcnQge1xuICBleHRyYWN0VXJsVmFyaWFibGVOYW1lc1xufTtcbiIsImZ1bmN0aW9uIG9taXQob2JqZWN0LCBrZXlzVG9PbWl0KSB7XG4gIGNvbnN0IHJlc3VsdCA9IHsgX19wcm90b19fOiBudWxsIH07XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iamVjdCkpIHtcbiAgICBpZiAoa2V5c1RvT21pdC5pbmRleE9mKGtleSkgPT09IC0xKSB7XG4gICAgICByZXN1bHRba2V5XSA9IG9iamVjdFtrZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IHtcbiAgb21pdFxufTtcbiIsImZ1bmN0aW9uIGVuY29kZVJlc2VydmVkKHN0cikge1xuICByZXR1cm4gc3RyLnNwbGl0KC8oJVswLTlBLUZhLWZdezJ9KS9nKS5tYXAoZnVuY3Rpb24ocGFydCkge1xuICAgIGlmICghLyVbMC05QS1GYS1mXS8udGVzdChwYXJ0KSkge1xuICAgICAgcGFydCA9IGVuY29kZVVSSShwYXJ0KS5yZXBsYWNlKC8lNUIvZywgXCJbXCIpLnJlcGxhY2UoLyU1RC9nLCBcIl1cIik7XG4gICAgfVxuICAgIHJldHVybiBwYXJ0O1xuICB9KS5qb2luKFwiXCIpO1xufVxuZnVuY3Rpb24gZW5jb2RlVW5yZXNlcnZlZChzdHIpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoL1shJygpKl0vZywgZnVuY3Rpb24oYykge1xuICAgIHJldHVybiBcIiVcIiArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBlbmNvZGVWYWx1ZShvcGVyYXRvciwgdmFsdWUsIGtleSkge1xuICB2YWx1ZSA9IG9wZXJhdG9yID09PSBcIitcIiB8fCBvcGVyYXRvciA9PT0gXCIjXCIgPyBlbmNvZGVSZXNlcnZlZCh2YWx1ZSkgOiBlbmNvZGVVbnJlc2VydmVkKHZhbHVlKTtcbiAgaWYgKGtleSkge1xuICAgIHJldHVybiBlbmNvZGVVbnJlc2VydmVkKGtleSkgKyBcIj1cIiArIHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gaXNEZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdm9pZCAwICYmIHZhbHVlICE9PSBudWxsO1xufVxuZnVuY3Rpb24gaXNLZXlPcGVyYXRvcihvcGVyYXRvcikge1xuICByZXR1cm4gb3BlcmF0b3IgPT09IFwiO1wiIHx8IG9wZXJhdG9yID09PSBcIiZcIiB8fCBvcGVyYXRvciA9PT0gXCI/XCI7XG59XG5mdW5jdGlvbiBnZXRWYWx1ZXMoY29udGV4dCwgb3BlcmF0b3IsIGtleSwgbW9kaWZpZXIpIHtcbiAgdmFyIHZhbHVlID0gY29udGV4dFtrZXldLCByZXN1bHQgPSBbXTtcbiAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkgJiYgdmFsdWUgIT09IFwiXCIpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICBpZiAobW9kaWZpZXIgJiYgbW9kaWZpZXIgIT09IFwiKlwiKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHBhcnNlSW50KG1vZGlmaWVyLCAxMCkpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgIGVuY29kZVZhbHVlKG9wZXJhdG9yLCB2YWx1ZSwgaXNLZXlPcGVyYXRvcihvcGVyYXRvcikgPyBrZXkgOiBcIlwiKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG1vZGlmaWVyID09PSBcIipcIikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZS5maWx0ZXIoaXNEZWZpbmVkKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlMikge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgICAgIGVuY29kZVZhbHVlKG9wZXJhdG9yLCB2YWx1ZTIsIGlzS2V5T3BlcmF0b3Iob3BlcmF0b3IpID8ga2V5IDogXCJcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmZvckVhY2goZnVuY3Rpb24oaykge1xuICAgICAgICAgICAgaWYgKGlzRGVmaW5lZCh2YWx1ZVtrXSkpIHtcbiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZW5jb2RlVmFsdWUob3BlcmF0b3IsIHZhbHVlW2tdLCBrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRtcCA9IFtdO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZS5maWx0ZXIoaXNEZWZpbmVkKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlMikge1xuICAgICAgICAgICAgdG1wLnB1c2goZW5jb2RlVmFsdWUob3BlcmF0b3IsIHZhbHVlMikpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5mb3JFYWNoKGZ1bmN0aW9uKGspIHtcbiAgICAgICAgICAgIGlmIChpc0RlZmluZWQodmFsdWVba10pKSB7XG4gICAgICAgICAgICAgIHRtcC5wdXNoKGVuY29kZVVucmVzZXJ2ZWQoaykpO1xuICAgICAgICAgICAgICB0bXAucHVzaChlbmNvZGVWYWx1ZShvcGVyYXRvciwgdmFsdWVba10udG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0tleU9wZXJhdG9yKG9wZXJhdG9yKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGVuY29kZVVucmVzZXJ2ZWQoa2V5KSArIFwiPVwiICsgdG1wLmpvaW4oXCIsXCIpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0bXAubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godG1wLmpvaW4oXCIsXCIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAob3BlcmF0b3IgPT09IFwiO1wiKSB7XG4gICAgICBpZiAoaXNEZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICByZXN1bHQucHVzaChlbmNvZGVVbnJlc2VydmVkKGtleSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IFwiXCIgJiYgKG9wZXJhdG9yID09PSBcIiZcIiB8fCBvcGVyYXRvciA9PT0gXCI/XCIpKSB7XG4gICAgICByZXN1bHQucHVzaChlbmNvZGVVbnJlc2VydmVkKGtleSkgKyBcIj1cIik7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgcmVzdWx0LnB1c2goXCJcIik7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBwYXJzZVVybCh0ZW1wbGF0ZSkge1xuICByZXR1cm4ge1xuICAgIGV4cGFuZDogZXhwYW5kLmJpbmQobnVsbCwgdGVtcGxhdGUpXG4gIH07XG59XG5mdW5jdGlvbiBleHBhbmQodGVtcGxhdGUsIGNvbnRleHQpIHtcbiAgdmFyIG9wZXJhdG9ycyA9IFtcIitcIiwgXCIjXCIsIFwiLlwiLCBcIi9cIiwgXCI7XCIsIFwiP1wiLCBcIiZcIl07XG4gIHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZShcbiAgICAvXFx7KFteXFx7XFx9XSspXFx9fChbXlxce1xcfV0rKS9nLFxuICAgIGZ1bmN0aW9uKF8sIGV4cHJlc3Npb24sIGxpdGVyYWwpIHtcbiAgICAgIGlmIChleHByZXNzaW9uKSB7XG4gICAgICAgIGxldCBvcGVyYXRvciA9IFwiXCI7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgICAgICBpZiAob3BlcmF0b3JzLmluZGV4T2YoZXhwcmVzc2lvbi5jaGFyQXQoMCkpICE9PSAtMSkge1xuICAgICAgICAgIG9wZXJhdG9yID0gZXhwcmVzc2lvbi5jaGFyQXQoMCk7XG4gICAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uc3Vic3RyKDEpO1xuICAgICAgICB9XG4gICAgICAgIGV4cHJlc3Npb24uc3BsaXQoLywvZykuZm9yRWFjaChmdW5jdGlvbih2YXJpYWJsZSkge1xuICAgICAgICAgIHZhciB0bXAgPSAvKFteOlxcKl0qKSg/OjooXFxkKyl8KFxcKikpPy8uZXhlYyh2YXJpYWJsZSk7XG4gICAgICAgICAgdmFsdWVzLnB1c2goZ2V0VmFsdWVzKGNvbnRleHQsIG9wZXJhdG9yLCB0bXBbMV0sIHRtcFsyXSB8fCB0bXBbM10pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChvcGVyYXRvciAmJiBvcGVyYXRvciAhPT0gXCIrXCIpIHtcbiAgICAgICAgICB2YXIgc2VwYXJhdG9yID0gXCIsXCI7XG4gICAgICAgICAgaWYgKG9wZXJhdG9yID09PSBcIj9cIikge1xuICAgICAgICAgICAgc2VwYXJhdG9yID0gXCImXCI7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvciAhPT0gXCIjXCIpIHtcbiAgICAgICAgICAgIHNlcGFyYXRvciA9IG9wZXJhdG9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gKHZhbHVlcy5sZW5ndGggIT09IDAgPyBvcGVyYXRvciA6IFwiXCIpICsgdmFsdWVzLmpvaW4oc2VwYXJhdG9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWVzLmpvaW4oXCIsXCIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZW5jb2RlUmVzZXJ2ZWQobGl0ZXJhbCk7XG4gICAgICB9XG4gICAgfVxuICApO1xuICBpZiAodGVtcGxhdGUgPT09IFwiL1wiKSB7XG4gICAgcmV0dXJuIHRlbXBsYXRlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKC9cXC8kLywgXCJcIik7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIHBhcnNlVXJsXG59O1xuIiwiaW1wb3J0IHsgYWRkUXVlcnlQYXJhbWV0ZXJzIH0gZnJvbSBcIi4vdXRpbC9hZGQtcXVlcnktcGFyYW1ldGVyc1wiO1xuaW1wb3J0IHsgZXh0cmFjdFVybFZhcmlhYmxlTmFtZXMgfSBmcm9tIFwiLi91dGlsL2V4dHJhY3QtdXJsLXZhcmlhYmxlLW5hbWVzXCI7XG5pbXBvcnQgeyBvbWl0IH0gZnJvbSBcIi4vdXRpbC9vbWl0XCI7XG5pbXBvcnQgeyBwYXJzZVVybCB9IGZyb20gXCIuL3V0aWwvdXJsLXRlbXBsYXRlXCI7XG5mdW5jdGlvbiBwYXJzZShvcHRpb25zKSB7XG4gIGxldCBtZXRob2QgPSBvcHRpb25zLm1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICBsZXQgdXJsID0gKG9wdGlvbnMudXJsIHx8IFwiL1wiKS5yZXBsYWNlKC86KFthLXpdXFx3KykvZywgXCJ7JDF9XCIpO1xuICBsZXQgaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuaGVhZGVycyk7XG4gIGxldCBib2R5O1xuICBsZXQgcGFyYW1ldGVycyA9IG9taXQob3B0aW9ucywgW1xuICAgIFwibWV0aG9kXCIsXG4gICAgXCJiYXNlVXJsXCIsXG4gICAgXCJ1cmxcIixcbiAgICBcImhlYWRlcnNcIixcbiAgICBcInJlcXVlc3RcIixcbiAgICBcIm1lZGlhVHlwZVwiXG4gIF0pO1xuICBjb25zdCB1cmxWYXJpYWJsZU5hbWVzID0gZXh0cmFjdFVybFZhcmlhYmxlTmFtZXModXJsKTtcbiAgdXJsID0gcGFyc2VVcmwodXJsKS5leHBhbmQocGFyYW1ldGVycyk7XG4gIGlmICghL15odHRwLy50ZXN0KHVybCkpIHtcbiAgICB1cmwgPSBvcHRpb25zLmJhc2VVcmwgKyB1cmw7XG4gIH1cbiAgY29uc3Qgb21pdHRlZFBhcmFtZXRlcnMgPSBPYmplY3Qua2V5cyhvcHRpb25zKS5maWx0ZXIoKG9wdGlvbikgPT4gdXJsVmFyaWFibGVOYW1lcy5pbmNsdWRlcyhvcHRpb24pKS5jb25jYXQoXCJiYXNlVXJsXCIpO1xuICBjb25zdCByZW1haW5pbmdQYXJhbWV0ZXJzID0gb21pdChwYXJhbWV0ZXJzLCBvbWl0dGVkUGFyYW1ldGVycyk7XG4gIGNvbnN0IGlzQmluYXJ5UmVxdWVzdCA9IC9hcHBsaWNhdGlvblxcL29jdGV0LXN0cmVhbS9pLnRlc3QoaGVhZGVycy5hY2NlcHQpO1xuICBpZiAoIWlzQmluYXJ5UmVxdWVzdCkge1xuICAgIGlmIChvcHRpb25zLm1lZGlhVHlwZS5mb3JtYXQpIHtcbiAgICAgIGhlYWRlcnMuYWNjZXB0ID0gaGVhZGVycy5hY2NlcHQuc3BsaXQoLywvKS5tYXAoXG4gICAgICAgIChmb3JtYXQpID0+IGZvcm1hdC5yZXBsYWNlKFxuICAgICAgICAgIC9hcHBsaWNhdGlvblxcL3ZuZChcXC5cXHcrKShcXC52Myk/KFxcLlxcdyspPyhcXCtqc29uKT8kLyxcbiAgICAgICAgICBgYXBwbGljYXRpb24vdm5kJDEkMi4ke29wdGlvbnMubWVkaWFUeXBlLmZvcm1hdH1gXG4gICAgICAgIClcbiAgICAgICkuam9pbihcIixcIik7XG4gICAgfVxuICAgIGlmICh1cmwuZW5kc1dpdGgoXCIvZ3JhcGhxbFwiKSkge1xuICAgICAgaWYgKG9wdGlvbnMubWVkaWFUeXBlLnByZXZpZXdzPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcHJldmlld3NGcm9tQWNjZXB0SGVhZGVyID0gaGVhZGVycy5hY2NlcHQubWF0Y2goL1tcXHctXSsoPz0tcHJldmlldykvZykgfHwgW107XG4gICAgICAgIGhlYWRlcnMuYWNjZXB0ID0gcHJldmlld3NGcm9tQWNjZXB0SGVhZGVyLmNvbmNhdChvcHRpb25zLm1lZGlhVHlwZS5wcmV2aWV3cykubWFwKChwcmV2aWV3KSA9PiB7XG4gICAgICAgICAgY29uc3QgZm9ybWF0ID0gb3B0aW9ucy5tZWRpYVR5cGUuZm9ybWF0ID8gYC4ke29wdGlvbnMubWVkaWFUeXBlLmZvcm1hdH1gIDogXCIranNvblwiO1xuICAgICAgICAgIHJldHVybiBgYXBwbGljYXRpb24vdm5kLmdpdGh1Yi4ke3ByZXZpZXd9LXByZXZpZXcke2Zvcm1hdH1gO1xuICAgICAgICB9KS5qb2luKFwiLFwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKFtcIkdFVFwiLCBcIkhFQURcIl0uaW5jbHVkZXMobWV0aG9kKSkge1xuICAgIHVybCA9IGFkZFF1ZXJ5UGFyYW1ldGVycyh1cmwsIHJlbWFpbmluZ1BhcmFtZXRlcnMpO1xuICB9IGVsc2Uge1xuICAgIGlmIChcImRhdGFcIiBpbiByZW1haW5pbmdQYXJhbWV0ZXJzKSB7XG4gICAgICBib2R5ID0gcmVtYWluaW5nUGFyYW1ldGVycy5kYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMocmVtYWluaW5nUGFyYW1ldGVycykubGVuZ3RoKSB7XG4gICAgICAgIGJvZHkgPSByZW1haW5pbmdQYXJhbWV0ZXJzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoIWhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0gJiYgdHlwZW9mIGJvZHkgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBoZWFkZXJzW1wiY29udGVudC10eXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCI7XG4gIH1cbiAgaWYgKFtcIlBBVENIXCIsIFwiUFVUXCJdLmluY2x1ZGVzKG1ldGhvZCkgJiYgdHlwZW9mIGJvZHkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBib2R5ID0gXCJcIjtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmFzc2lnbihcbiAgICB7IG1ldGhvZCwgdXJsLCBoZWFkZXJzIH0sXG4gICAgdHlwZW9mIGJvZHkgIT09IFwidW5kZWZpbmVkXCIgPyB7IGJvZHkgfSA6IG51bGwsXG4gICAgb3B0aW9ucy5yZXF1ZXN0ID8geyByZXF1ZXN0OiBvcHRpb25zLnJlcXVlc3QgfSA6IG51bGxcbiAgKTtcbn1cbmV4cG9ydCB7XG4gIHBhcnNlXG59O1xuIiwiaW1wb3J0IHsgREVGQVVMVFMgfSBmcm9tIFwiLi9kZWZhdWx0c1wiO1xuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tIFwiLi9tZXJnZVwiO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tIFwiLi9wYXJzZVwiO1xuZnVuY3Rpb24gZW5kcG9pbnRXaXRoRGVmYXVsdHMoZGVmYXVsdHMsIHJvdXRlLCBvcHRpb25zKSB7XG4gIHJldHVybiBwYXJzZShtZXJnZShkZWZhdWx0cywgcm91dGUsIG9wdGlvbnMpKTtcbn1cbmV4cG9ydCB7XG4gIGVuZHBvaW50V2l0aERlZmF1bHRzXG59O1xuIiwiaW1wb3J0IHsgZW5kcG9pbnRXaXRoRGVmYXVsdHMgfSBmcm9tIFwiLi9lbmRwb2ludC13aXRoLWRlZmF1bHRzXCI7XG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gXCIuL21lcmdlXCI7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gXCIuL3BhcnNlXCI7XG5mdW5jdGlvbiB3aXRoRGVmYXVsdHMob2xkRGVmYXVsdHMsIG5ld0RlZmF1bHRzKSB7XG4gIGNvbnN0IERFRkFVTFRTID0gbWVyZ2Uob2xkRGVmYXVsdHMsIG5ld0RlZmF1bHRzKTtcbiAgY29uc3QgZW5kcG9pbnQgPSBlbmRwb2ludFdpdGhEZWZhdWx0cy5iaW5kKG51bGwsIERFRkFVTFRTKTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZW5kcG9pbnQsIHtcbiAgICBERUZBVUxUUyxcbiAgICBkZWZhdWx0czogd2l0aERlZmF1bHRzLmJpbmQobnVsbCwgREVGQVVMVFMpLFxuICAgIG1lcmdlOiBtZXJnZS5iaW5kKG51bGwsIERFRkFVTFRTKSxcbiAgICBwYXJzZVxuICB9KTtcbn1cbmV4cG9ydCB7XG4gIHdpdGhEZWZhdWx0c1xufTtcbiIsImNvbnN0IFZFUlNJT04gPSBcIjkuMC40XCI7XG5leHBvcnQge1xuICBWRVJTSU9OXG59O1xuIiwiaW1wb3J0IHsgZ2V0VXNlckFnZW50IH0gZnJvbSBcInVuaXZlcnNhbC11c2VyLWFnZW50XCI7XG5pbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSBcIi4vdmVyc2lvblwiO1xuY29uc3QgdXNlckFnZW50ID0gYG9jdG9raXQtZW5kcG9pbnQuanMvJHtWRVJTSU9OfSAke2dldFVzZXJBZ2VudCgpfWA7XG5jb25zdCBERUZBVUxUUyA9IHtcbiAgbWV0aG9kOiBcIkdFVFwiLFxuICBiYXNlVXJsOiBcImh0dHBzOi8vYXBpLmdpdGh1Yi5jb21cIixcbiAgaGVhZGVyczoge1xuICAgIGFjY2VwdDogXCJhcHBsaWNhdGlvbi92bmQuZ2l0aHViLnYzK2pzb25cIixcbiAgICBcInVzZXItYWdlbnRcIjogdXNlckFnZW50XG4gIH0sXG4gIG1lZGlhVHlwZToge1xuICAgIGZvcm1hdDogXCJcIlxuICB9XG59O1xuZXhwb3J0IHtcbiAgREVGQVVMVFNcbn07XG4iLCJpbXBvcnQgeyB3aXRoRGVmYXVsdHMgfSBmcm9tIFwiLi93aXRoLWRlZmF1bHRzXCI7XG5pbXBvcnQgeyBERUZBVUxUUyB9IGZyb20gXCIuL2RlZmF1bHRzXCI7XG5jb25zdCBlbmRwb2ludCA9IHdpdGhEZWZhdWx0cyhudWxsLCBERUZBVUxUUyk7XG5leHBvcnQge1xuICBlbmRwb2ludFxufTtcbiIsImNvbnN0IFZFUlNJT04gPSBcIjguMS42XCI7XG5leHBvcnQge1xuICBWRVJTSU9OXG59O1xuIiwiZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgIT09IFwiW29iamVjdCBPYmplY3RdXCIpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIGlmIChwcm90byA9PT0gbnVsbClcbiAgICByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgQ3RvciA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgXCJjb25zdHJ1Y3RvclwiKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgcmV0dXJuIHR5cGVvZiBDdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgQ3RvciBpbnN0YW5jZW9mIEN0b3IgJiYgRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwoQ3RvcikgPT09IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsKHZhbHVlKTtcbn1cbmV4cG9ydCB7XG4gIGlzUGxhaW5PYmplY3Rcbn07XG4iLCJpbXBvcnQgeyBEZXByZWNhdGlvbiB9IGZyb20gXCJkZXByZWNhdGlvblwiO1xuaW1wb3J0IG9uY2UgZnJvbSBcIm9uY2VcIjtcbmNvbnN0IGxvZ09uY2VDb2RlID0gb25jZSgoZGVwcmVjYXRpb24pID0+IGNvbnNvbGUud2FybihkZXByZWNhdGlvbikpO1xuY29uc3QgbG9nT25jZUhlYWRlcnMgPSBvbmNlKChkZXByZWNhdGlvbikgPT4gY29uc29sZS53YXJuKGRlcHJlY2F0aW9uKSk7XG5jbGFzcyBSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXR1c0NvZGUsIG9wdGlvbnMpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgIH1cbiAgICB0aGlzLm5hbWUgPSBcIkh0dHBFcnJvclwiO1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzQ29kZTtcbiAgICBsZXQgaGVhZGVycztcbiAgICBpZiAoXCJoZWFkZXJzXCIgaW4gb3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5oZWFkZXJzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBoZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzO1xuICAgIH1cbiAgICBpZiAoXCJyZXNwb25zZVwiIGluIG9wdGlvbnMpIHtcbiAgICAgIHRoaXMucmVzcG9uc2UgPSBvcHRpb25zLnJlc3BvbnNlO1xuICAgICAgaGVhZGVycyA9IG9wdGlvbnMucmVzcG9uc2UuaGVhZGVycztcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdENvcHkgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLnJlcXVlc3QpO1xuICAgIGlmIChvcHRpb25zLnJlcXVlc3QuaGVhZGVycy5hdXRob3JpemF0aW9uKSB7XG4gICAgICByZXF1ZXN0Q29weS5oZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMsIHtcbiAgICAgICAgYXV0aG9yaXphdGlvbjogb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMuYXV0aG9yaXphdGlvbi5yZXBsYWNlKFxuICAgICAgICAgIC8gLiokLyxcbiAgICAgICAgICBcIiBbUkVEQUNURURdXCJcbiAgICAgICAgKVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJlcXVlc3RDb3B5LnVybCA9IHJlcXVlc3RDb3B5LnVybC5yZXBsYWNlKC9cXGJjbGllbnRfc2VjcmV0PVxcdysvZywgXCJjbGllbnRfc2VjcmV0PVtSRURBQ1RFRF1cIikucmVwbGFjZSgvXFxiYWNjZXNzX3Rva2VuPVxcdysvZywgXCJhY2Nlc3NfdG9rZW49W1JFREFDVEVEXVwiKTtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0Q29weTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjb2RlXCIsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgbG9nT25jZUNvZGUoXG4gICAgICAgICAgbmV3IERlcHJlY2F0aW9uKFxuICAgICAgICAgICAgXCJbQG9jdG9raXQvcmVxdWVzdC1lcnJvcl0gYGVycm9yLmNvZGVgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgZXJyb3Iuc3RhdHVzYC5cIlxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHN0YXR1c0NvZGU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiaGVhZGVyc1wiLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIGxvZ09uY2VIZWFkZXJzKFxuICAgICAgICAgIG5ldyBEZXByZWNhdGlvbihcbiAgICAgICAgICAgIFwiW0BvY3Rva2l0L3JlcXVlc3QtZXJyb3JdIGBlcnJvci5oZWFkZXJzYCBpcyBkZXByZWNhdGVkLCB1c2UgYGVycm9yLnJlc3BvbnNlLmhlYWRlcnNgLlwiXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gaGVhZGVycyB8fCB7fTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgUmVxdWVzdEVycm9yXG59O1xuIiwiZnVuY3Rpb24gZ2V0QnVmZmVyUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgcmV0dXJuIHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XG59XG5leHBvcnQge1xuICBnZXRCdWZmZXJSZXNwb25zZSBhcyBkZWZhdWx0XG59O1xuIiwiaW1wb3J0IHsgaXNQbGFpbk9iamVjdCB9IGZyb20gXCIuL2lzLXBsYWluLW9iamVjdFwiO1xuaW1wb3J0IHsgUmVxdWVzdEVycm9yIH0gZnJvbSBcIkBvY3Rva2l0L3JlcXVlc3QtZXJyb3JcIjtcbmltcG9ydCBnZXRCdWZmZXIgZnJvbSBcIi4vZ2V0LWJ1ZmZlci1yZXNwb25zZVwiO1xuZnVuY3Rpb24gZmV0Y2hXcmFwcGVyKHJlcXVlc3RPcHRpb25zKSB7XG4gIGNvbnN0IGxvZyA9IHJlcXVlc3RPcHRpb25zLnJlcXVlc3QgJiYgcmVxdWVzdE9wdGlvbnMucmVxdWVzdC5sb2cgPyByZXF1ZXN0T3B0aW9ucy5yZXF1ZXN0LmxvZyA6IGNvbnNvbGU7XG4gIGNvbnN0IHBhcnNlU3VjY2Vzc1Jlc3BvbnNlQm9keSA9IHJlcXVlc3RPcHRpb25zLnJlcXVlc3Q/LnBhcnNlU3VjY2Vzc1Jlc3BvbnNlQm9keSAhPT0gZmFsc2U7XG4gIGlmIChpc1BsYWluT2JqZWN0KHJlcXVlc3RPcHRpb25zLmJvZHkpIHx8IEFycmF5LmlzQXJyYXkocmVxdWVzdE9wdGlvbnMuYm9keSkpIHtcbiAgICByZXF1ZXN0T3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocmVxdWVzdE9wdGlvbnMuYm9keSk7XG4gIH1cbiAgbGV0IGhlYWRlcnMgPSB7fTtcbiAgbGV0IHN0YXR1cztcbiAgbGV0IHVybDtcbiAgbGV0IHsgZmV0Y2ggfSA9IGdsb2JhbFRoaXM7XG4gIGlmIChyZXF1ZXN0T3B0aW9ucy5yZXF1ZXN0Py5mZXRjaCkge1xuICAgIGZldGNoID0gcmVxdWVzdE9wdGlvbnMucmVxdWVzdC5mZXRjaDtcbiAgfVxuICBpZiAoIWZldGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJmZXRjaCBpcyBub3Qgc2V0LiBQbGVhc2UgcGFzcyBhIGZldGNoIGltcGxlbWVudGF0aW9uIGFzIG5ldyBPY3Rva2l0KHsgcmVxdWVzdDogeyBmZXRjaCB9fSkuIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9naXRodWIuY29tL29jdG9raXQvb2N0b2tpdC5qcy8jZmV0Y2gtbWlzc2luZ1wiXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZmV0Y2gocmVxdWVzdE9wdGlvbnMudXJsLCB7XG4gICAgbWV0aG9kOiByZXF1ZXN0T3B0aW9ucy5tZXRob2QsXG4gICAgYm9keTogcmVxdWVzdE9wdGlvbnMuYm9keSxcbiAgICBoZWFkZXJzOiByZXF1ZXN0T3B0aW9ucy5oZWFkZXJzLFxuICAgIHNpZ25hbDogcmVxdWVzdE9wdGlvbnMucmVxdWVzdD8uc2lnbmFsLFxuICAgIC8vIGR1cGxleCBtdXN0IGJlIHNldCBpZiByZXF1ZXN0LmJvZHkgaXMgUmVhZGFibGVTdHJlYW0gb3IgQXN5bmMgSXRlcmFibGVzLlxuICAgIC8vIFNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLXJlcXVlc3Rpbml0LWR1cGxleC5cbiAgICAuLi5yZXF1ZXN0T3B0aW9ucy5ib2R5ICYmIHsgZHVwbGV4OiBcImhhbGZcIiB9XG4gIH0pLnRoZW4oYXN5bmMgKHJlc3BvbnNlKSA9PiB7XG4gICAgdXJsID0gcmVzcG9uc2UudXJsO1xuICAgIHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICBmb3IgKGNvbnN0IGtleUFuZFZhbHVlIG9mIHJlc3BvbnNlLmhlYWRlcnMpIHtcbiAgICAgIGhlYWRlcnNba2V5QW5kVmFsdWVbMF1dID0ga2V5QW5kVmFsdWVbMV07XG4gICAgfVxuICAgIGlmIChcImRlcHJlY2F0aW9uXCIgaW4gaGVhZGVycykge1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGhlYWRlcnMubGluayAmJiBoZWFkZXJzLmxpbmsubWF0Y2goLzwoW14+XSspPjsgcmVsPVwiZGVwcmVjYXRpb25cIi8pO1xuICAgICAgY29uc3QgZGVwcmVjYXRpb25MaW5rID0gbWF0Y2hlcyAmJiBtYXRjaGVzLnBvcCgpO1xuICAgICAgbG9nLndhcm4oXG4gICAgICAgIGBbQG9jdG9raXQvcmVxdWVzdF0gXCIke3JlcXVlc3RPcHRpb25zLm1ldGhvZH0gJHtyZXF1ZXN0T3B0aW9ucy51cmx9XCIgaXMgZGVwcmVjYXRlZC4gSXQgaXMgc2NoZWR1bGVkIHRvIGJlIHJlbW92ZWQgb24gJHtoZWFkZXJzLnN1bnNldH0ke2RlcHJlY2F0aW9uTGluayA/IGAuIFNlZSAke2RlcHJlY2F0aW9uTGlua31gIDogXCJcIn1gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSAyMDQgfHwgc3RhdHVzID09PSAyMDUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJlcXVlc3RPcHRpb25zLm1ldGhvZCA9PT0gXCJIRUFEXCIpIHtcbiAgICAgIGlmIChzdGF0dXMgPCA0MDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFJlcXVlc3RFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0LCBzdGF0dXMsIHtcbiAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgZGF0YTogdm9pZCAwXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RPcHRpb25zXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gMzA0KSB7XG4gICAgICB0aHJvdyBuZXcgUmVxdWVzdEVycm9yKFwiTm90IG1vZGlmaWVkXCIsIHN0YXR1cywge1xuICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgIHVybCxcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICBkYXRhOiBhd2FpdCBnZXRSZXNwb25zZURhdGEocmVzcG9uc2UpXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RPcHRpb25zXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRSZXNwb25zZURhdGEocmVzcG9uc2UpO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgUmVxdWVzdEVycm9yKHRvRXJyb3JNZXNzYWdlKGRhdGEpLCBzdGF0dXMsIHtcbiAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0OiByZXF1ZXN0T3B0aW9uc1xuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlU3VjY2Vzc1Jlc3BvbnNlQm9keSA/IGF3YWl0IGdldFJlc3BvbnNlRGF0YShyZXNwb25zZSkgOiByZXNwb25zZS5ib2R5O1xuICB9KS50aGVuKChkYXRhKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1cyxcbiAgICAgIHVybCxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBkYXRhXG4gICAgfTtcbiAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgUmVxdWVzdEVycm9yKVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgZWxzZSBpZiAoZXJyb3IubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICBsZXQgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgaWYgKGVycm9yLm5hbWUgPT09IFwiVHlwZUVycm9yXCIgJiYgXCJjYXVzZVwiIGluIGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IuY2F1c2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBtZXNzYWdlID0gZXJyb3IuY2F1c2UubWVzc2FnZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVycm9yLmNhdXNlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBlcnJvci5jYXVzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IFJlcXVlc3RFcnJvcihtZXNzYWdlLCA1MDAsIHtcbiAgICAgIHJlcXVlc3Q6IHJlcXVlc3RPcHRpb25zXG4gICAgfSk7XG4gIH0pO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVzcG9uc2VEYXRhKHJlc3BvbnNlKSB7XG4gIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIik7XG4gIGlmICgvYXBwbGljYXRpb25cXC9qc29uLy50ZXN0KGNvbnRlbnRUeXBlKSkge1xuICAgIHJldHVybiByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gcmVzcG9uc2UudGV4dCgpKS5jYXRjaCgoKSA9PiBcIlwiKTtcbiAgfVxuICBpZiAoIWNvbnRlbnRUeXBlIHx8IC9edGV4dFxcL3xjaGFyc2V0PXV0Zi04JC8udGVzdChjb250ZW50VHlwZSkpIHtcbiAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xuICB9XG4gIHJldHVybiBnZXRCdWZmZXIocmVzcG9uc2UpO1xufVxuZnVuY3Rpb24gdG9FcnJvck1lc3NhZ2UoZGF0YSkge1xuICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpXG4gICAgcmV0dXJuIGRhdGE7XG4gIGlmIChcIm1lc3NhZ2VcIiBpbiBkYXRhKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YS5lcnJvcnMpKSB7XG4gICAgICByZXR1cm4gYCR7ZGF0YS5tZXNzYWdlfTogJHtkYXRhLmVycm9ycy5tYXAoSlNPTi5zdHJpbmdpZnkpLmpvaW4oXCIsIFwiKX1gO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YS5tZXNzYWdlO1xuICB9XG4gIHJldHVybiBgVW5rbm93biBlcnJvcjogJHtKU09OLnN0cmluZ2lmeShkYXRhKX1gO1xufVxuZXhwb3J0IHtcbiAgZmV0Y2hXcmFwcGVyIGFzIGRlZmF1bHRcbn07XG4iLCJpbXBvcnQgZmV0Y2hXcmFwcGVyIGZyb20gXCIuL2ZldGNoLXdyYXBwZXJcIjtcbmZ1bmN0aW9uIHdpdGhEZWZhdWx0cyhvbGRFbmRwb2ludCwgbmV3RGVmYXVsdHMpIHtcbiAgY29uc3QgZW5kcG9pbnQgPSBvbGRFbmRwb2ludC5kZWZhdWx0cyhuZXdEZWZhdWx0cyk7XG4gIGNvbnN0IG5ld0FwaSA9IGZ1bmN0aW9uKHJvdXRlLCBwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgZW5kcG9pbnRPcHRpb25zID0gZW5kcG9pbnQubWVyZ2Uocm91dGUsIHBhcmFtZXRlcnMpO1xuICAgIGlmICghZW5kcG9pbnRPcHRpb25zLnJlcXVlc3QgfHwgIWVuZHBvaW50T3B0aW9ucy5yZXF1ZXN0Lmhvb2spIHtcbiAgICAgIHJldHVybiBmZXRjaFdyYXBwZXIoZW5kcG9pbnQucGFyc2UoZW5kcG9pbnRPcHRpb25zKSk7XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3QgPSAocm91dGUyLCBwYXJhbWV0ZXJzMikgPT4ge1xuICAgICAgcmV0dXJuIGZldGNoV3JhcHBlcihcbiAgICAgICAgZW5kcG9pbnQucGFyc2UoZW5kcG9pbnQubWVyZ2Uocm91dGUyLCBwYXJhbWV0ZXJzMikpXG4gICAgICApO1xuICAgIH07XG4gICAgT2JqZWN0LmFzc2lnbihyZXF1ZXN0LCB7XG4gICAgICBlbmRwb2ludCxcbiAgICAgIGRlZmF1bHRzOiB3aXRoRGVmYXVsdHMuYmluZChudWxsLCBlbmRwb2ludClcbiAgICB9KTtcbiAgICByZXR1cm4gZW5kcG9pbnRPcHRpb25zLnJlcXVlc3QuaG9vayhyZXF1ZXN0LCBlbmRwb2ludE9wdGlvbnMpO1xuICB9O1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXdBcGksIHtcbiAgICBlbmRwb2ludCxcbiAgICBkZWZhdWx0czogd2l0aERlZmF1bHRzLmJpbmQobnVsbCwgZW5kcG9pbnQpXG4gIH0pO1xufVxuZXhwb3J0IHtcbiAgd2l0aERlZmF1bHRzIGFzIGRlZmF1bHRcbn07XG4iLCJpbXBvcnQgeyBlbmRwb2ludCB9IGZyb20gXCJAb2N0b2tpdC9lbmRwb2ludFwiO1xuaW1wb3J0IHsgZ2V0VXNlckFnZW50IH0gZnJvbSBcInVuaXZlcnNhbC11c2VyLWFnZW50XCI7XG5pbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSBcIi4vdmVyc2lvblwiO1xuaW1wb3J0IHdpdGhEZWZhdWx0cyBmcm9tIFwiLi93aXRoLWRlZmF1bHRzXCI7XG5jb25zdCByZXF1ZXN0ID0gd2l0aERlZmF1bHRzKGVuZHBvaW50LCB7XG4gIGhlYWRlcnM6IHtcbiAgICBcInVzZXItYWdlbnRcIjogYG9jdG9raXQtcmVxdWVzdC5qcy8ke1ZFUlNJT059ICR7Z2V0VXNlckFnZW50KCl9YFxuICB9XG59KTtcbmV4cG9ydCB7XG4gIHJlcXVlc3Rcbn07XG4iLCIvLyBwa2cvZGlzdC1zcmMvaW5kZXguanNcbmltcG9ydCB7IHJlcXVlc3QgfSBmcm9tIFwiQG9jdG9raXQvcmVxdWVzdFwiO1xuaW1wb3J0IHsgZ2V0VXNlckFnZW50IH0gZnJvbSBcInVuaXZlcnNhbC11c2VyLWFnZW50XCI7XG5cbi8vIHBrZy9kaXN0LXNyYy92ZXJzaW9uLmpzXG52YXIgVkVSU0lPTiA9IFwiNy4wLjJcIjtcblxuLy8gcGtnL2Rpc3Qtc3JjL3dpdGgtZGVmYXVsdHMuanNcbmltcG9ydCB7IHJlcXVlc3QgYXMgUmVxdWVzdDIgfSBmcm9tIFwiQG9jdG9raXQvcmVxdWVzdFwiO1xuXG4vLyBwa2cvZGlzdC1zcmMvZ3JhcGhxbC5qc1xuaW1wb3J0IHsgcmVxdWVzdCBhcyBSZXF1ZXN0IH0gZnJvbSBcIkBvY3Rva2l0L3JlcXVlc3RcIjtcblxuLy8gcGtnL2Rpc3Qtc3JjL2Vycm9yLmpzXG5mdW5jdGlvbiBfYnVpbGRNZXNzYWdlRm9yUmVzcG9uc2VFcnJvcnMoZGF0YSkge1xuICByZXR1cm4gYFJlcXVlc3QgZmFpbGVkIGR1ZSB0byBmb2xsb3dpbmcgcmVzcG9uc2UgZXJyb3JzOlxuYCArIGRhdGEuZXJyb3JzLm1hcCgoZSkgPT4gYCAtICR7ZS5tZXNzYWdlfWApLmpvaW4oXCJcXG5cIik7XG59XG52YXIgR3JhcGhxbFJlc3BvbnNlRXJyb3IgPSBjbGFzcyBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocmVxdWVzdDIsIGhlYWRlcnMsIHJlc3BvbnNlKSB7XG4gICAgc3VwZXIoX2J1aWxkTWVzc2FnZUZvclJlc3BvbnNlRXJyb3JzKHJlc3BvbnNlKSk7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDI7XG4gICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycztcbiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgdGhpcy5uYW1lID0gXCJHcmFwaHFsUmVzcG9uc2VFcnJvclwiO1xuICAgIHRoaXMuZXJyb3JzID0gcmVzcG9uc2UuZXJyb3JzO1xuICAgIHRoaXMuZGF0YSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIHBrZy9kaXN0LXNyYy9ncmFwaHFsLmpzXG52YXIgTk9OX1ZBUklBQkxFX09QVElPTlMgPSBbXG4gIFwibWV0aG9kXCIsXG4gIFwiYmFzZVVybFwiLFxuICBcInVybFwiLFxuICBcImhlYWRlcnNcIixcbiAgXCJyZXF1ZXN0XCIsXG4gIFwicXVlcnlcIixcbiAgXCJtZWRpYVR5cGVcIlxuXTtcbnZhciBGT1JCSURERU5fVkFSSUFCTEVfT1BUSU9OUyA9IFtcInF1ZXJ5XCIsIFwibWV0aG9kXCIsIFwidXJsXCJdO1xudmFyIEdIRVNfVjNfU1VGRklYX1JFR0VYID0gL1xcL2FwaVxcL3YzXFwvPyQvO1xuZnVuY3Rpb24gZ3JhcGhxbChyZXF1ZXN0MiwgcXVlcnksIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHF1ZXJ5ID09PSBcInN0cmluZ1wiICYmIFwicXVlcnlcIiBpbiBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihgW0BvY3Rva2l0L2dyYXBocWxdIFwicXVlcnlcIiBjYW5ub3QgYmUgdXNlZCBhcyB2YXJpYWJsZSBuYW1lYClcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMpIHtcbiAgICAgIGlmICghRk9SQklEREVOX1ZBUklBQkxFX09QVElPTlMuaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgY29udGludWU7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgW0BvY3Rva2l0L2dyYXBocWxdIFwiJHtrZXl9XCIgY2Fubm90IGJlIHVzZWQgYXMgdmFyaWFibGUgbmFtZWBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgcGFyc2VkT3B0aW9ucyA9IHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIiA/IE9iamVjdC5hc3NpZ24oeyBxdWVyeSB9LCBvcHRpb25zKSA6IHF1ZXJ5O1xuICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IE9iamVjdC5rZXlzKFxuICAgIHBhcnNlZE9wdGlvbnNcbiAgKS5yZWR1Y2UoKHJlc3VsdCwga2V5KSA9PiB7XG4gICAgaWYgKE5PTl9WQVJJQUJMRV9PUFRJT05TLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gcGFyc2VkT3B0aW9uc1trZXldO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKCFyZXN1bHQudmFyaWFibGVzKSB7XG4gICAgICByZXN1bHQudmFyaWFibGVzID0ge307XG4gICAgfVxuICAgIHJlc3VsdC52YXJpYWJsZXNba2V5XSA9IHBhcnNlZE9wdGlvbnNba2V5XTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCB7fSk7XG4gIGNvbnN0IGJhc2VVcmwgPSBwYXJzZWRPcHRpb25zLmJhc2VVcmwgfHwgcmVxdWVzdDIuZW5kcG9pbnQuREVGQVVMVFMuYmFzZVVybDtcbiAgaWYgKEdIRVNfVjNfU1VGRklYX1JFR0VYLnRlc3QoYmFzZVVybCkpIHtcbiAgICByZXF1ZXN0T3B0aW9ucy51cmwgPSBiYXNlVXJsLnJlcGxhY2UoR0hFU19WM19TVUZGSVhfUkVHRVgsIFwiL2FwaS9ncmFwaHFsXCIpO1xuICB9XG4gIHJldHVybiByZXF1ZXN0MihyZXF1ZXN0T3B0aW9ucykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICBpZiAocmVzcG9uc2UuZGF0YS5lcnJvcnMpIHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3BvbnNlLmhlYWRlcnMpKSB7XG4gICAgICAgIGhlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnNba2V5XTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBHcmFwaHFsUmVzcG9uc2VFcnJvcihcbiAgICAgICAgcmVxdWVzdE9wdGlvbnMsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHJlc3BvbnNlLmRhdGFcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZS5kYXRhLmRhdGE7XG4gIH0pO1xufVxuXG4vLyBwa2cvZGlzdC1zcmMvd2l0aC1kZWZhdWx0cy5qc1xuZnVuY3Rpb24gd2l0aERlZmF1bHRzKHJlcXVlc3QyLCBuZXdEZWZhdWx0cykge1xuICBjb25zdCBuZXdSZXF1ZXN0ID0gcmVxdWVzdDIuZGVmYXVsdHMobmV3RGVmYXVsdHMpO1xuICBjb25zdCBuZXdBcGkgPSAocXVlcnksIG9wdGlvbnMpID0+IHtcbiAgICByZXR1cm4gZ3JhcGhxbChuZXdSZXF1ZXN0LCBxdWVyeSwgb3B0aW9ucyk7XG4gIH07XG4gIHJldHVybiBPYmplY3QuYXNzaWduKG5ld0FwaSwge1xuICAgIGRlZmF1bHRzOiB3aXRoRGVmYXVsdHMuYmluZChudWxsLCBuZXdSZXF1ZXN0KSxcbiAgICBlbmRwb2ludDogbmV3UmVxdWVzdC5lbmRwb2ludFxuICB9KTtcbn1cblxuLy8gcGtnL2Rpc3Qtc3JjL2luZGV4LmpzXG52YXIgZ3JhcGhxbDIgPSB3aXRoRGVmYXVsdHMocmVxdWVzdCwge1xuICBoZWFkZXJzOiB7XG4gICAgXCJ1c2VyLWFnZW50XCI6IGBvY3Rva2l0LWdyYXBocWwuanMvJHtWRVJTSU9OfSAke2dldFVzZXJBZ2VudCgpfWBcbiAgfSxcbiAgbWV0aG9kOiBcIlBPU1RcIixcbiAgdXJsOiBcIi9ncmFwaHFsXCJcbn0pO1xuZnVuY3Rpb24gd2l0aEN1c3RvbVJlcXVlc3QoY3VzdG9tUmVxdWVzdCkge1xuICByZXR1cm4gd2l0aERlZmF1bHRzKGN1c3RvbVJlcXVlc3QsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIHVybDogXCIvZ3JhcGhxbFwiXG4gIH0pO1xufVxuZXhwb3J0IHtcbiAgR3JhcGhxbFJlc3BvbnNlRXJyb3IsXG4gIGdyYXBocWwyIGFzIGdyYXBocWwsXG4gIHdpdGhDdXN0b21SZXF1ZXN0XG59O1xuIiwiY29uc3QgUkVHRVhfSVNfSU5TVEFMTEFUSU9OX0xFR0FDWSA9IC9edjFcXC4vO1xuY29uc3QgUkVHRVhfSVNfSU5TVEFMTEFUSU9OID0gL15naHNfLztcbmNvbnN0IFJFR0VYX0lTX1VTRVJfVE9fU0VSVkVSID0gL15naHVfLztcbmFzeW5jIGZ1bmN0aW9uIGF1dGgodG9rZW4pIHtcbiAgY29uc3QgaXNBcHAgPSB0b2tlbi5zcGxpdCgvXFwuLykubGVuZ3RoID09PSAzO1xuICBjb25zdCBpc0luc3RhbGxhdGlvbiA9IFJFR0VYX0lTX0lOU1RBTExBVElPTl9MRUdBQ1kudGVzdCh0b2tlbikgfHwgUkVHRVhfSVNfSU5TVEFMTEFUSU9OLnRlc3QodG9rZW4pO1xuICBjb25zdCBpc1VzZXJUb1NlcnZlciA9IFJFR0VYX0lTX1VTRVJfVE9fU0VSVkVSLnRlc3QodG9rZW4pO1xuICBjb25zdCB0b2tlblR5cGUgPSBpc0FwcCA/IFwiYXBwXCIgOiBpc0luc3RhbGxhdGlvbiA/IFwiaW5zdGFsbGF0aW9uXCIgOiBpc1VzZXJUb1NlcnZlciA/IFwidXNlci10by1zZXJ2ZXJcIiA6IFwib2F1dGhcIjtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcInRva2VuXCIsXG4gICAgdG9rZW4sXG4gICAgdG9rZW5UeXBlXG4gIH07XG59XG5leHBvcnQge1xuICBhdXRoXG59O1xuIiwiZnVuY3Rpb24gd2l0aEF1dGhvcml6YXRpb25QcmVmaXgodG9rZW4pIHtcbiAgaWYgKHRva2VuLnNwbGl0KC9cXC4vKS5sZW5ndGggPT09IDMpIHtcbiAgICByZXR1cm4gYGJlYXJlciAke3Rva2VufWA7XG4gIH1cbiAgcmV0dXJuIGB0b2tlbiAke3Rva2VufWA7XG59XG5leHBvcnQge1xuICB3aXRoQXV0aG9yaXphdGlvblByZWZpeFxufTtcbiIsImltcG9ydCB7IHdpdGhBdXRob3JpemF0aW9uUHJlZml4IH0gZnJvbSBcIi4vd2l0aC1hdXRob3JpemF0aW9uLXByZWZpeFwiO1xuYXN5bmMgZnVuY3Rpb24gaG9vayh0b2tlbiwgcmVxdWVzdCwgcm91dGUsIHBhcmFtZXRlcnMpIHtcbiAgY29uc3QgZW5kcG9pbnQgPSByZXF1ZXN0LmVuZHBvaW50Lm1lcmdlKFxuICAgIHJvdXRlLFxuICAgIHBhcmFtZXRlcnNcbiAgKTtcbiAgZW5kcG9pbnQuaGVhZGVycy5hdXRob3JpemF0aW9uID0gd2l0aEF1dGhvcml6YXRpb25QcmVmaXgodG9rZW4pO1xuICByZXR1cm4gcmVxdWVzdChlbmRwb2ludCk7XG59XG5leHBvcnQge1xuICBob29rXG59O1xuIiwiaW1wb3J0IHsgYXV0aCB9IGZyb20gXCIuL2F1dGhcIjtcbmltcG9ydCB7IGhvb2sgfSBmcm9tIFwiLi9ob29rXCI7XG5jb25zdCBjcmVhdGVUb2tlbkF1dGggPSBmdW5jdGlvbiBjcmVhdGVUb2tlbkF1dGgyKHRva2VuKSB7XG4gIGlmICghdG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJbQG9jdG9raXQvYXV0aC10b2tlbl0gTm8gdG9rZW4gcGFzc2VkIHRvIGNyZWF0ZVRva2VuQXV0aFwiKTtcbiAgfVxuICBpZiAodHlwZW9mIHRva2VuICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJbQG9jdG9raXQvYXV0aC10b2tlbl0gVG9rZW4gcGFzc2VkIHRvIGNyZWF0ZVRva2VuQXV0aCBpcyBub3QgYSBzdHJpbmdcIlxuICAgICk7XG4gIH1cbiAgdG9rZW4gPSB0b2tlbi5yZXBsYWNlKC9eKHRva2VufGJlYXJlcikgKy9pLCBcIlwiKTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYXV0aC5iaW5kKG51bGwsIHRva2VuKSwge1xuICAgIGhvb2s6IGhvb2suYmluZChudWxsLCB0b2tlbilcbiAgfSk7XG59O1xuZXhwb3J0IHtcbiAgY3JlYXRlVG9rZW5BdXRoXG59O1xuIiwiLy8gcGtnL2Rpc3Qtc3JjL2luZGV4LmpzXG5pbXBvcnQgeyBnZXRVc2VyQWdlbnQgfSBmcm9tIFwidW5pdmVyc2FsLXVzZXItYWdlbnRcIjtcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tIFwiYmVmb3JlLWFmdGVyLWhvb2tcIjtcbmltcG9ydCB7IHJlcXVlc3QgfSBmcm9tIFwiQG9jdG9raXQvcmVxdWVzdFwiO1xuaW1wb3J0IHsgZ3JhcGhxbCwgd2l0aEN1c3RvbVJlcXVlc3QgfSBmcm9tIFwiQG9jdG9raXQvZ3JhcGhxbFwiO1xuaW1wb3J0IHsgY3JlYXRlVG9rZW5BdXRoIH0gZnJvbSBcIkBvY3Rva2l0L2F1dGgtdG9rZW5cIjtcblxuLy8gcGtnL2Rpc3Qtc3JjL3ZlcnNpb24uanNcbnZhciBWRVJTSU9OID0gXCI1LjEuMFwiO1xuXG4vLyBwa2cvZGlzdC1zcmMvaW5kZXguanNcbnZhciBub29wID0gKCkgPT4ge1xufTtcbnZhciBjb25zb2xlV2FybiA9IGNvbnNvbGUud2Fybi5iaW5kKGNvbnNvbGUpO1xudmFyIGNvbnNvbGVFcnJvciA9IGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtcbnZhciB1c2VyQWdlbnRUcmFpbCA9IGBvY3Rva2l0LWNvcmUuanMvJHtWRVJTSU9OfSAke2dldFVzZXJBZ2VudCgpfWA7XG52YXIgT2N0b2tpdCA9IGNsYXNzIHtcbiAgc3RhdGljIHtcbiAgICB0aGlzLlZFUlNJT04gPSBWRVJTSU9OO1xuICB9XG4gIHN0YXRpYyBkZWZhdWx0cyhkZWZhdWx0cykge1xuICAgIGNvbnN0IE9jdG9raXRXaXRoRGVmYXVsdHMgPSBjbGFzcyBleHRlbmRzIHRoaXMge1xuICAgICAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gYXJnc1swXSB8fCB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBkZWZhdWx0cyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgc3VwZXIoZGVmYXVsdHMob3B0aW9ucykpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcihcbiAgICAgICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBkZWZhdWx0cyxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBvcHRpb25zLnVzZXJBZ2VudCAmJiBkZWZhdWx0cy51c2VyQWdlbnQgPyB7XG4gICAgICAgICAgICAgIHVzZXJBZ2VudDogYCR7b3B0aW9ucy51c2VyQWdlbnR9ICR7ZGVmYXVsdHMudXNlckFnZW50fWBcbiAgICAgICAgICAgIH0gOiBudWxsXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIE9jdG9raXRXaXRoRGVmYXVsdHM7XG4gIH1cbiAgc3RhdGljIHtcbiAgICB0aGlzLnBsdWdpbnMgPSBbXTtcbiAgfVxuICAvKipcbiAgICogQXR0YWNoIGEgcGx1Z2luIChvciBtYW55KSB0byB5b3VyIE9jdG9raXQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IEFQSSA9IE9jdG9raXQucGx1Z2luKHBsdWdpbjEsIHBsdWdpbjIsIHBsdWdpbjMsIC4uLilcbiAgICovXG4gIHN0YXRpYyBwbHVnaW4oLi4ubmV3UGx1Z2lucykge1xuICAgIGNvbnN0IGN1cnJlbnRQbHVnaW5zID0gdGhpcy5wbHVnaW5zO1xuICAgIGNvbnN0IE5ld09jdG9raXQgPSBjbGFzcyBleHRlbmRzIHRoaXMge1xuICAgICAgc3RhdGljIHtcbiAgICAgICAgdGhpcy5wbHVnaW5zID0gY3VycmVudFBsdWdpbnMuY29uY2F0KFxuICAgICAgICAgIG5ld1BsdWdpbnMuZmlsdGVyKChwbHVnaW4pID0+ICFjdXJyZW50UGx1Z2lucy5pbmNsdWRlcyhwbHVnaW4pKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIE5ld09jdG9raXQ7XG4gIH1cbiAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgaG9vayA9IG5ldyBDb2xsZWN0aW9uKCk7XG4gICAgY29uc3QgcmVxdWVzdERlZmF1bHRzID0ge1xuICAgICAgYmFzZVVybDogcmVxdWVzdC5lbmRwb2ludC5ERUZBVUxUUy5iYXNlVXJsLFxuICAgICAgaGVhZGVyczoge30sXG4gICAgICByZXF1ZXN0OiBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLnJlcXVlc3QsIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBpbnRlcm5hbCB1c2FnZSBvbmx5LCBubyBuZWVkIHRvIHR5cGVcbiAgICAgICAgaG9vazogaG9vay5iaW5kKG51bGwsIFwicmVxdWVzdFwiKVxuICAgICAgfSksXG4gICAgICBtZWRpYVR5cGU6IHtcbiAgICAgICAgcHJldmlld3M6IFtdLFxuICAgICAgICBmb3JtYXQ6IFwiXCJcbiAgICAgIH1cbiAgICB9O1xuICAgIHJlcXVlc3REZWZhdWx0cy5oZWFkZXJzW1widXNlci1hZ2VudFwiXSA9IG9wdGlvbnMudXNlckFnZW50ID8gYCR7b3B0aW9ucy51c2VyQWdlbnR9ICR7dXNlckFnZW50VHJhaWx9YCA6IHVzZXJBZ2VudFRyYWlsO1xuICAgIGlmIChvcHRpb25zLmJhc2VVcmwpIHtcbiAgICAgIHJlcXVlc3REZWZhdWx0cy5iYXNlVXJsID0gb3B0aW9ucy5iYXNlVXJsO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5wcmV2aWV3cykge1xuICAgICAgcmVxdWVzdERlZmF1bHRzLm1lZGlhVHlwZS5wcmV2aWV3cyA9IG9wdGlvbnMucHJldmlld3M7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRpbWVab25lKSB7XG4gICAgICByZXF1ZXN0RGVmYXVsdHMuaGVhZGVyc1tcInRpbWUtem9uZVwiXSA9IG9wdGlvbnMudGltZVpvbmU7XG4gICAgfVxuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3QuZGVmYXVsdHMocmVxdWVzdERlZmF1bHRzKTtcbiAgICB0aGlzLmdyYXBocWwgPSB3aXRoQ3VzdG9tUmVxdWVzdCh0aGlzLnJlcXVlc3QpLmRlZmF1bHRzKHJlcXVlc3REZWZhdWx0cyk7XG4gICAgdGhpcy5sb2cgPSBPYmplY3QuYXNzaWduKFxuICAgICAge1xuICAgICAgICBkZWJ1Zzogbm9vcCxcbiAgICAgICAgaW5mbzogbm9vcCxcbiAgICAgICAgd2FybjogY29uc29sZVdhcm4sXG4gICAgICAgIGVycm9yOiBjb25zb2xlRXJyb3JcbiAgICAgIH0sXG4gICAgICBvcHRpb25zLmxvZ1xuICAgICk7XG4gICAgdGhpcy5ob29rID0gaG9vaztcbiAgICBpZiAoIW9wdGlvbnMuYXV0aFN0cmF0ZWd5KSB7XG4gICAgICBpZiAoIW9wdGlvbnMuYXV0aCkge1xuICAgICAgICB0aGlzLmF1dGggPSBhc3luYyAoKSA9PiAoe1xuICAgICAgICAgIHR5cGU6IFwidW5hdXRoZW50aWNhdGVkXCJcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBhdXRoID0gY3JlYXRlVG9rZW5BdXRoKG9wdGlvbnMuYXV0aCk7XG4gICAgICAgIGhvb2sud3JhcChcInJlcXVlc3RcIiwgYXV0aC5ob29rKTtcbiAgICAgICAgdGhpcy5hdXRoID0gYXV0aDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgeyBhdXRoU3RyYXRlZ3ksIC4uLm90aGVyT3B0aW9ucyB9ID0gb3B0aW9ucztcbiAgICAgIGNvbnN0IGF1dGggPSBhdXRoU3RyYXRlZ3koXG4gICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuICAgICAgICAgICAgbG9nOiB0aGlzLmxvZyxcbiAgICAgICAgICAgIC8vIHdlIHBhc3MgdGhlIGN1cnJlbnQgb2N0b2tpdCBpbnN0YW5jZSBhcyB3ZWxsIGFzIGl0cyBjb25zdHJ1Y3RvciBvcHRpb25zXG4gICAgICAgICAgICAvLyB0byBhbGxvdyBmb3IgYXV0aGVudGljYXRpb24gc3RyYXRlZ2llcyB0aGF0IHJldHVybiBhIG5ldyBvY3Rva2l0IGluc3RhbmNlXG4gICAgICAgICAgICAvLyB0aGF0IHNoYXJlcyB0aGUgc2FtZSBpbnRlcm5hbCBzdGF0ZSBhcyB0aGUgY3VycmVudCBvbmUuIFRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgLy8gcmVxdWlyZW1lbnQgZm9yIHRoaXMgd2FzIHRoZSBcImV2ZW50LW9jdG9raXRcIiBhdXRoZW50aWNhdGlvbiBzdHJhdGVneVxuICAgICAgICAgICAgLy8gb2YgaHR0cHM6Ly9naXRodWIuY29tL3Byb2JvdC9vY3Rva2l0LWF1dGgtcHJvYm90LlxuICAgICAgICAgICAgb2N0b2tpdDogdGhpcyxcbiAgICAgICAgICAgIG9jdG9raXRPcHRpb25zOiBvdGhlck9wdGlvbnNcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9wdGlvbnMuYXV0aFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgaG9vay53cmFwKFwicmVxdWVzdFwiLCBhdXRoLmhvb2spO1xuICAgICAgdGhpcy5hdXRoID0gYXV0aDtcbiAgICB9XG4gICAgY29uc3QgY2xhc3NDb25zdHJ1Y3RvciA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGFzc0NvbnN0cnVjdG9yLnBsdWdpbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgY2xhc3NDb25zdHJ1Y3Rvci5wbHVnaW5zW2ldKHRoaXMsIG9wdGlvbnMpKTtcbiAgICB9XG4gIH1cbn07XG5leHBvcnQge1xuICBPY3Rva2l0XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6808\n')},5745:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ composePaginateRest: () => (/* binding */ composePaginateRest),\n/* harmony export */ isPaginatingEndpoint: () => (/* binding */ isPaginatingEndpoint),\n/* harmony export */ paginateRest: () => (/* binding */ paginateRest),\n/* harmony export */ paginatingEndpoints: () => (/* binding */ paginatingEndpoints)\n/* harmony export */ });\n// pkg/dist-src/version.js\nvar VERSION = "9.1.5";\n\n// pkg/dist-src/normalize-paginated-list-response.js\nfunction normalizePaginatedListResponse(response) {\n if (!response.data) {\n return {\n ...response,\n data: []\n };\n }\n const responseNeedsNormalization = "total_count" in response.data && !("url" in response.data);\n if (!responseNeedsNormalization)\n return response;\n const incompleteResults = response.data.incomplete_results;\n const repositorySelection = response.data.repository_selection;\n const totalCount = response.data.total_count;\n delete response.data.incomplete_results;\n delete response.data.repository_selection;\n delete response.data.total_count;\n const namespaceKey = Object.keys(response.data)[0];\n const data = response.data[namespaceKey];\n response.data = data;\n if (typeof incompleteResults !== "undefined") {\n response.data.incomplete_results = incompleteResults;\n }\n if (typeof repositorySelection !== "undefined") {\n response.data.repository_selection = repositorySelection;\n }\n response.data.total_count = totalCount;\n return response;\n}\n\n// pkg/dist-src/iterator.js\nfunction iterator(octokit, route, parameters) {\n const options = typeof route === "function" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters);\n const requestMethod = typeof route === "function" ? route : octokit.request;\n const method = options.method;\n const headers = options.headers;\n let url = options.url;\n return {\n [Symbol.asyncIterator]: () => ({\n async next() {\n if (!url)\n return { done: true };\n try {\n const response = await requestMethod({ method, url, headers });\n const normalizedResponse = normalizePaginatedListResponse(response);\n url = ((normalizedResponse.headers.link || "").match(\n /<([^>]+)>;\\s*rel="next"/\n ) || [])[1];\n return { value: normalizedResponse };\n } catch (error) {\n if (error.status !== 409)\n throw error;\n url = "";\n return {\n value: {\n status: 200,\n headers: {},\n data: []\n }\n };\n }\n }\n })\n };\n}\n\n// pkg/dist-src/paginate.js\nfunction paginate(octokit, route, parameters, mapFn) {\n if (typeof parameters === "function") {\n mapFn = parameters;\n parameters = void 0;\n }\n return gather(\n octokit,\n [],\n iterator(octokit, route, parameters)[Symbol.asyncIterator](),\n mapFn\n );\n}\nfunction gather(octokit, results, iterator2, mapFn) {\n return iterator2.next().then((result) => {\n if (result.done) {\n return results;\n }\n let earlyExit = false;\n function done() {\n earlyExit = true;\n }\n results = results.concat(\n mapFn ? mapFn(result.value, done) : result.value.data\n );\n if (earlyExit) {\n return results;\n }\n return gather(octokit, results, iterator2, mapFn);\n });\n}\n\n// pkg/dist-src/compose-paginate.js\nvar composePaginateRest = Object.assign(paginate, {\n iterator\n});\n\n// pkg/dist-src/generated/paginating-endpoints.js\nvar paginatingEndpoints = [\n "GET /advisories",\n "GET /app/hook/deliveries",\n "GET /app/installation-requests",\n "GET /app/installations",\n "GET /assignments/{assignment_id}/accepted_assignments",\n "GET /classrooms",\n "GET /classrooms/{classroom_id}/assignments",\n "GET /enterprises/{enterprise}/dependabot/alerts",\n "GET /enterprises/{enterprise}/secret-scanning/alerts",\n "GET /events",\n "GET /gists",\n "GET /gists/public",\n "GET /gists/starred",\n "GET /gists/{gist_id}/comments",\n "GET /gists/{gist_id}/commits",\n "GET /gists/{gist_id}/forks",\n "GET /installation/repositories",\n "GET /issues",\n "GET /licenses",\n "GET /marketplace_listing/plans",\n "GET /marketplace_listing/plans/{plan_id}/accounts",\n "GET /marketplace_listing/stubbed/plans",\n "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts",\n "GET /networks/{owner}/{repo}/events",\n "GET /notifications",\n "GET /organizations",\n "GET /orgs/{org}/actions/cache/usage-by-repository",\n "GET /orgs/{org}/actions/permissions/repositories",\n "GET /orgs/{org}/actions/runners",\n "GET /orgs/{org}/actions/secrets",\n "GET /orgs/{org}/actions/secrets/{secret_name}/repositories",\n "GET /orgs/{org}/actions/variables",\n "GET /orgs/{org}/actions/variables/{name}/repositories",\n "GET /orgs/{org}/blocks",\n "GET /orgs/{org}/code-scanning/alerts",\n "GET /orgs/{org}/codespaces",\n "GET /orgs/{org}/codespaces/secrets",\n "GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories",\n "GET /orgs/{org}/copilot/billing/seats",\n "GET /orgs/{org}/dependabot/alerts",\n "GET /orgs/{org}/dependabot/secrets",\n "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories",\n "GET /orgs/{org}/events",\n "GET /orgs/{org}/failed_invitations",\n "GET /orgs/{org}/hooks",\n "GET /orgs/{org}/hooks/{hook_id}/deliveries",\n "GET /orgs/{org}/installations",\n "GET /orgs/{org}/invitations",\n "GET /orgs/{org}/invitations/{invitation_id}/teams",\n "GET /orgs/{org}/issues",\n "GET /orgs/{org}/members",\n "GET /orgs/{org}/members/{username}/codespaces",\n "GET /orgs/{org}/migrations",\n "GET /orgs/{org}/migrations/{migration_id}/repositories",\n "GET /orgs/{org}/outside_collaborators",\n "GET /orgs/{org}/packages",\n "GET /orgs/{org}/packages/{package_type}/{package_name}/versions",\n "GET /orgs/{org}/personal-access-token-requests",\n "GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories",\n "GET /orgs/{org}/personal-access-tokens",\n "GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories",\n "GET /orgs/{org}/projects",\n "GET /orgs/{org}/properties/values",\n "GET /orgs/{org}/public_members",\n "GET /orgs/{org}/repos",\n "GET /orgs/{org}/rulesets",\n "GET /orgs/{org}/rulesets/rule-suites",\n "GET /orgs/{org}/secret-scanning/alerts",\n "GET /orgs/{org}/security-advisories",\n "GET /orgs/{org}/teams",\n "GET /orgs/{org}/teams/{team_slug}/discussions",\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments",\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions",\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions",\n "GET /orgs/{org}/teams/{team_slug}/invitations",\n "GET /orgs/{org}/teams/{team_slug}/members",\n "GET /orgs/{org}/teams/{team_slug}/projects",\n "GET /orgs/{org}/teams/{team_slug}/repos",\n "GET /orgs/{org}/teams/{team_slug}/teams",\n "GET /projects/columns/{column_id}/cards",\n "GET /projects/{project_id}/collaborators",\n "GET /projects/{project_id}/columns",\n "GET /repos/{owner}/{repo}/actions/artifacts",\n "GET /repos/{owner}/{repo}/actions/caches",\n "GET /repos/{owner}/{repo}/actions/organization-secrets",\n "GET /repos/{owner}/{repo}/actions/organization-variables",\n "GET /repos/{owner}/{repo}/actions/runners",\n "GET /repos/{owner}/{repo}/actions/runs",\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts",\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs",\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs",\n "GET /repos/{owner}/{repo}/actions/secrets",\n "GET /repos/{owner}/{repo}/actions/variables",\n "GET /repos/{owner}/{repo}/actions/workflows",\n "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs",\n "GET /repos/{owner}/{repo}/activity",\n "GET /repos/{owner}/{repo}/assignees",\n "GET /repos/{owner}/{repo}/branches",\n "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations",\n "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs",\n "GET /repos/{owner}/{repo}/code-scanning/alerts",\n "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances",\n "GET /repos/{owner}/{repo}/code-scanning/analyses",\n "GET /repos/{owner}/{repo}/codespaces",\n "GET /repos/{owner}/{repo}/codespaces/devcontainers",\n "GET /repos/{owner}/{repo}/codespaces/secrets",\n "GET /repos/{owner}/{repo}/collaborators",\n "GET /repos/{owner}/{repo}/comments",\n "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions",\n "GET /repos/{owner}/{repo}/commits",\n "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments",\n "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls",\n "GET /repos/{owner}/{repo}/commits/{ref}/check-runs",\n "GET /repos/{owner}/{repo}/commits/{ref}/check-suites",\n "GET /repos/{owner}/{repo}/commits/{ref}/status",\n "GET /repos/{owner}/{repo}/commits/{ref}/statuses",\n "GET /repos/{owner}/{repo}/contributors",\n "GET /repos/{owner}/{repo}/dependabot/alerts",\n "GET /repos/{owner}/{repo}/dependabot/secrets",\n "GET /repos/{owner}/{repo}/deployments",\n "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses",\n "GET /repos/{owner}/{repo}/environments",\n "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies",\n "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps",\n "GET /repos/{owner}/{repo}/events",\n "GET /repos/{owner}/{repo}/forks",\n "GET /repos/{owner}/{repo}/hooks",\n "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries",\n "GET /repos/{owner}/{repo}/invitations",\n "GET /repos/{owner}/{repo}/issues",\n "GET /repos/{owner}/{repo}/issues/comments",\n "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions",\n "GET /repos/{owner}/{repo}/issues/events",\n "GET /repos/{owner}/{repo}/issues/{issue_number}/comments",\n "GET /repos/{owner}/{repo}/issues/{issue_number}/events",\n "GET /repos/{owner}/{repo}/issues/{issue_number}/labels",\n "GET /repos/{owner}/{repo}/issues/{issue_number}/reactions",\n "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline",\n "GET /repos/{owner}/{repo}/keys",\n "GET /repos/{owner}/{repo}/labels",\n "GET /repos/{owner}/{repo}/milestones",\n "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels",\n "GET /repos/{owner}/{repo}/notifications",\n "GET /repos/{owner}/{repo}/pages/builds",\n "GET /repos/{owner}/{repo}/projects",\n "GET /repos/{owner}/{repo}/pulls",\n "GET /repos/{owner}/{repo}/pulls/comments",\n "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/commits",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/files",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments",\n "GET /repos/{owner}/{repo}/releases",\n "GET /repos/{owner}/{repo}/releases/{release_id}/assets",\n "GET /repos/{owner}/{repo}/releases/{release_id}/reactions",\n "GET /repos/{owner}/{repo}/rules/branches/{branch}",\n "GET /repos/{owner}/{repo}/rulesets",\n "GET /repos/{owner}/{repo}/rulesets/rule-suites",\n "GET /repos/{owner}/{repo}/secret-scanning/alerts",\n "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations",\n "GET /repos/{owner}/{repo}/security-advisories",\n "GET /repos/{owner}/{repo}/stargazers",\n "GET /repos/{owner}/{repo}/subscribers",\n "GET /repos/{owner}/{repo}/tags",\n "GET /repos/{owner}/{repo}/teams",\n "GET /repos/{owner}/{repo}/topics",\n "GET /repositories",\n "GET /repositories/{repository_id}/environments/{environment_name}/secrets",\n "GET /repositories/{repository_id}/environments/{environment_name}/variables",\n "GET /search/code",\n "GET /search/commits",\n "GET /search/issues",\n "GET /search/labels",\n "GET /search/repositories",\n "GET /search/topics",\n "GET /search/users",\n "GET /teams/{team_id}/discussions",\n "GET /teams/{team_id}/discussions/{discussion_number}/comments",\n "GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions",\n "GET /teams/{team_id}/discussions/{discussion_number}/reactions",\n "GET /teams/{team_id}/invitations",\n "GET /teams/{team_id}/members",\n "GET /teams/{team_id}/projects",\n "GET /teams/{team_id}/repos",\n "GET /teams/{team_id}/teams",\n "GET /user/blocks",\n "GET /user/codespaces",\n "GET /user/codespaces/secrets",\n "GET /user/emails",\n "GET /user/followers",\n "GET /user/following",\n "GET /user/gpg_keys",\n "GET /user/installations",\n "GET /user/installations/{installation_id}/repositories",\n "GET /user/issues",\n "GET /user/keys",\n "GET /user/marketplace_purchases",\n "GET /user/marketplace_purchases/stubbed",\n "GET /user/memberships/orgs",\n "GET /user/migrations",\n "GET /user/migrations/{migration_id}/repositories",\n "GET /user/orgs",\n "GET /user/packages",\n "GET /user/packages/{package_type}/{package_name}/versions",\n "GET /user/public_emails",\n "GET /user/repos",\n "GET /user/repository_invitations",\n "GET /user/social_accounts",\n "GET /user/ssh_signing_keys",\n "GET /user/starred",\n "GET /user/subscriptions",\n "GET /user/teams",\n "GET /users",\n "GET /users/{username}/events",\n "GET /users/{username}/events/orgs/{org}",\n "GET /users/{username}/events/public",\n "GET /users/{username}/followers",\n "GET /users/{username}/following",\n "GET /users/{username}/gists",\n "GET /users/{username}/gpg_keys",\n "GET /users/{username}/keys",\n "GET /users/{username}/orgs",\n "GET /users/{username}/packages",\n "GET /users/{username}/projects",\n "GET /users/{username}/received_events",\n "GET /users/{username}/received_events/public",\n "GET /users/{username}/repos",\n "GET /users/{username}/social_accounts",\n "GET /users/{username}/ssh_signing_keys",\n "GET /users/{username}/starred",\n "GET /users/{username}/subscriptions"\n];\n\n// pkg/dist-src/paginating-endpoints.js\nfunction isPaginatingEndpoint(arg) {\n if (typeof arg === "string") {\n return paginatingEndpoints.includes(arg);\n } else {\n return false;\n }\n}\n\n// pkg/dist-src/index.js\nfunction paginateRest(octokit) {\n return {\n paginate: Object.assign(paginate.bind(null, octokit), {\n iterator: iterator.bind(null, octokit)\n })\n };\n}\npaginateRest.VERSION = VERSION;\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q3hCLGVBQWUsU0FBUztBQUN4QixlQUFlLFNBQVM7QUFDeEIsZUFBZSxTQUFTO0FBQ3hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQU1FIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvcGx1Z2luLXBhZ2luYXRlLXJlc3QvZGlzdC13ZWIvaW5kZXguanM/ZjcwYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwa2cvZGlzdC1zcmMvdmVyc2lvbi5qc1xudmFyIFZFUlNJT04gPSBcIjkuMS41XCI7XG5cbi8vIHBrZy9kaXN0LXNyYy9ub3JtYWxpemUtcGFnaW5hdGVkLWxpc3QtcmVzcG9uc2UuanNcbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhZ2luYXRlZExpc3RSZXNwb25zZShyZXNwb25zZSkge1xuICBpZiAoIXJlc3BvbnNlLmRhdGEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzcG9uc2UsXG4gICAgICBkYXRhOiBbXVxuICAgIH07XG4gIH1cbiAgY29uc3QgcmVzcG9uc2VOZWVkc05vcm1hbGl6YXRpb24gPSBcInRvdGFsX2NvdW50XCIgaW4gcmVzcG9uc2UuZGF0YSAmJiAhKFwidXJsXCIgaW4gcmVzcG9uc2UuZGF0YSk7XG4gIGlmICghcmVzcG9uc2VOZWVkc05vcm1hbGl6YXRpb24pXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICBjb25zdCBpbmNvbXBsZXRlUmVzdWx0cyA9IHJlc3BvbnNlLmRhdGEuaW5jb21wbGV0ZV9yZXN1bHRzO1xuICBjb25zdCByZXBvc2l0b3J5U2VsZWN0aW9uID0gcmVzcG9uc2UuZGF0YS5yZXBvc2l0b3J5X3NlbGVjdGlvbjtcbiAgY29uc3QgdG90YWxDb3VudCA9IHJlc3BvbnNlLmRhdGEudG90YWxfY291bnQ7XG4gIGRlbGV0ZSByZXNwb25zZS5kYXRhLmluY29tcGxldGVfcmVzdWx0cztcbiAgZGVsZXRlIHJlc3BvbnNlLmRhdGEucmVwb3NpdG9yeV9zZWxlY3Rpb247XG4gIGRlbGV0ZSByZXNwb25zZS5kYXRhLnRvdGFsX2NvdW50O1xuICBjb25zdCBuYW1lc3BhY2VLZXkgPSBPYmplY3Qua2V5cyhyZXNwb25zZS5kYXRhKVswXTtcbiAgY29uc3QgZGF0YSA9IHJlc3BvbnNlLmRhdGFbbmFtZXNwYWNlS2V5XTtcbiAgcmVzcG9uc2UuZGF0YSA9IGRhdGE7XG4gIGlmICh0eXBlb2YgaW5jb21wbGV0ZVJlc3VsdHMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXNwb25zZS5kYXRhLmluY29tcGxldGVfcmVzdWx0cyA9IGluY29tcGxldGVSZXN1bHRzO1xuICB9XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVNlbGVjdGlvbiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJlc3BvbnNlLmRhdGEucmVwb3NpdG9yeV9zZWxlY3Rpb24gPSByZXBvc2l0b3J5U2VsZWN0aW9uO1xuICB9XG4gIHJlc3BvbnNlLmRhdGEudG90YWxfY291bnQgPSB0b3RhbENvdW50O1xuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8vIHBrZy9kaXN0LXNyYy9pdGVyYXRvci5qc1xuZnVuY3Rpb24gaXRlcmF0b3Iob2N0b2tpdCwgcm91dGUsIHBhcmFtZXRlcnMpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHR5cGVvZiByb3V0ZSA9PT0gXCJmdW5jdGlvblwiID8gcm91dGUuZW5kcG9pbnQocGFyYW1ldGVycykgOiBvY3Rva2l0LnJlcXVlc3QuZW5kcG9pbnQocm91dGUsIHBhcmFtZXRlcnMpO1xuICBjb25zdCByZXF1ZXN0TWV0aG9kID0gdHlwZW9mIHJvdXRlID09PSBcImZ1bmN0aW9uXCIgPyByb3V0ZSA6IG9jdG9raXQucmVxdWVzdDtcbiAgY29uc3QgbWV0aG9kID0gb3B0aW9ucy5tZXRob2Q7XG4gIGNvbnN0IGhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnM7XG4gIGxldCB1cmwgPSBvcHRpb25zLnVybDtcbiAgcmV0dXJuIHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiAoe1xuICAgICAgYXN5bmMgbmV4dCgpIHtcbiAgICAgICAgaWYgKCF1cmwpXG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdE1ldGhvZCh7IG1ldGhvZCwgdXJsLCBoZWFkZXJzIH0pO1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXNwb25zZSA9IG5vcm1hbGl6ZVBhZ2luYXRlZExpc3RSZXNwb25zZShyZXNwb25zZSk7XG4gICAgICAgICAgdXJsID0gKChub3JtYWxpemVkUmVzcG9uc2UuaGVhZGVycy5saW5rIHx8IFwiXCIpLm1hdGNoKFxuICAgICAgICAgICAgLzwoW14+XSspPjtcXHMqcmVsPVwibmV4dFwiL1xuICAgICAgICAgICkgfHwgW10pWzFdO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBub3JtYWxpemVkUmVzcG9uc2UgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzICE9PSA0MDkpXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB1cmwgPSBcIlwiO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgICAgICAgIGRhdGE6IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH07XG59XG5cbi8vIHBrZy9kaXN0LXNyYy9wYWdpbmF0ZS5qc1xuZnVuY3Rpb24gcGFnaW5hdGUob2N0b2tpdCwgcm91dGUsIHBhcmFtZXRlcnMsIG1hcEZuKSB7XG4gIGlmICh0eXBlb2YgcGFyYW1ldGVycyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbWFwRm4gPSBwYXJhbWV0ZXJzO1xuICAgIHBhcmFtZXRlcnMgPSB2b2lkIDA7XG4gIH1cbiAgcmV0dXJuIGdhdGhlcihcbiAgICBvY3Rva2l0LFxuICAgIFtdLFxuICAgIGl0ZXJhdG9yKG9jdG9raXQsIHJvdXRlLCBwYXJhbWV0ZXJzKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSxcbiAgICBtYXBGblxuICApO1xufVxuZnVuY3Rpb24gZ2F0aGVyKG9jdG9raXQsIHJlc3VsdHMsIGl0ZXJhdG9yMiwgbWFwRm4pIHtcbiAgcmV0dXJuIGl0ZXJhdG9yMi5uZXh0KCkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG4gICAgbGV0IGVhcmx5RXhpdCA9IGZhbHNlO1xuICAgIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgICBlYXJseUV4aXQgPSB0cnVlO1xuICAgIH1cbiAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQoXG4gICAgICBtYXBGbiA/IG1hcEZuKHJlc3VsdC52YWx1ZSwgZG9uZSkgOiByZXN1bHQudmFsdWUuZGF0YVxuICAgICk7XG4gICAgaWYgKGVhcmx5RXhpdCkge1xuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuICAgIHJldHVybiBnYXRoZXIob2N0b2tpdCwgcmVzdWx0cywgaXRlcmF0b3IyLCBtYXBGbik7XG4gIH0pO1xufVxuXG4vLyBwa2cvZGlzdC1zcmMvY29tcG9zZS1wYWdpbmF0ZS5qc1xudmFyIGNvbXBvc2VQYWdpbmF0ZVJlc3QgPSBPYmplY3QuYXNzaWduKHBhZ2luYXRlLCB7XG4gIGl0ZXJhdG9yXG59KTtcblxuLy8gcGtnL2Rpc3Qtc3JjL2dlbmVyYXRlZC9wYWdpbmF0aW5nLWVuZHBvaW50cy5qc1xudmFyIHBhZ2luYXRpbmdFbmRwb2ludHMgPSBbXG4gIFwiR0VUIC9hZHZpc29yaWVzXCIsXG4gIFwiR0VUIC9hcHAvaG9vay9kZWxpdmVyaWVzXCIsXG4gIFwiR0VUIC9hcHAvaW5zdGFsbGF0aW9uLXJlcXVlc3RzXCIsXG4gIFwiR0VUIC9hcHAvaW5zdGFsbGF0aW9uc1wiLFxuICBcIkdFVCAvYXNzaWdubWVudHMve2Fzc2lnbm1lbnRfaWR9L2FjY2VwdGVkX2Fzc2lnbm1lbnRzXCIsXG4gIFwiR0VUIC9jbGFzc3Jvb21zXCIsXG4gIFwiR0VUIC9jbGFzc3Jvb21zL3tjbGFzc3Jvb21faWR9L2Fzc2lnbm1lbnRzXCIsXG4gIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vZGVwZW5kYWJvdC9hbGVydHNcIixcbiAgXCJHRVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9zZWNyZXQtc2Nhbm5pbmcvYWxlcnRzXCIsXG4gIFwiR0VUIC9ldmVudHNcIixcbiAgXCJHRVQgL2dpc3RzXCIsXG4gIFwiR0VUIC9naXN0cy9wdWJsaWNcIixcbiAgXCJHRVQgL2dpc3RzL3N0YXJyZWRcIixcbiAgXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS9jb21tZW50c1wiLFxuICBcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L2NvbW1pdHNcIixcbiAgXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS9mb3Jrc1wiLFxuICBcIkdFVCAvaW5zdGFsbGF0aW9uL3JlcG9zaXRvcmllc1wiLFxuICBcIkdFVCAvaXNzdWVzXCIsXG4gIFwiR0VUIC9saWNlbnNlc1wiLFxuICBcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9wbGFuc1wiLFxuICBcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9wbGFucy97cGxhbl9pZH0vYWNjb3VudHNcIixcbiAgXCJHRVQgL21hcmtldHBsYWNlX2xpc3Rpbmcvc3R1YmJlZC9wbGFuc1wiLFxuICBcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9zdHViYmVkL3BsYW5zL3twbGFuX2lkfS9hY2NvdW50c1wiLFxuICBcIkdFVCAvbmV0d29ya3Mve293bmVyfS97cmVwb30vZXZlbnRzXCIsXG4gIFwiR0VUIC9ub3RpZmljYXRpb25zXCIsXG4gIFwiR0VUIC9vcmdhbml6YXRpb25zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvY2FjaGUvdXNhZ2UtYnktcmVwb3NpdG9yeVwiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zL3JlcG9zaXRvcmllc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9zZWNyZXRzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX0vcmVwb3NpdG9yaWVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2Jsb2Nrc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9jb2RlLXNjYW5uaW5nL2FsZXJ0c1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0c1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vY29waWxvdC9iaWxsaW5nL3NlYXRzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3QvYWxlcnRzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0c1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9kZXBlbmRhYm90L3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vZXZlbnRzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2ZhaWxlZF9pbnZpdGF0aW9uc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9ob29rc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9pbnN0YWxsYXRpb25zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2ludml0YXRpb25zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfS90ZWFtc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9pc3N1ZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vbWVtYmVyc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX0vY29kZXNwYWNlc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9taWdyYXRpb25zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vcmVwb3NpdG9yaWVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L291dHNpZGVfY29sbGFib3JhdG9yc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9wYWNrYWdlc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9uc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9wZXJzb25hbC1hY2Nlc3MtdG9rZW4tcmVxdWVzdHNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2VuLXJlcXVlc3RzL3twYXRfcmVxdWVzdF9pZH0vcmVwb3NpdG9yaWVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3BlcnNvbmFsLWFjY2Vzcy10b2tlbnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2Vucy97cGF0X2lkfS9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcHJvamVjdHNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcHJvcGVydGllcy92YWx1ZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcHVibGljX21lbWJlcnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcmVwb3NcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcnVsZXNldHNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcnVsZXNldHMvcnVsZS1zdWl0ZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9zZWN1cml0eS1hZHZpc29yaWVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50cy97Y29tbWVudF9udW1iZXJ9L3JlYWN0aW9uc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L3JlYWN0aW9uc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9pbnZpdGF0aW9uc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9tZW1iZXJzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3Byb2plY3RzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3JlcG9zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3RlYW1zXCIsXG4gIFwiR0VUIC9wcm9qZWN0cy9jb2x1bW5zL3tjb2x1bW5faWR9L2NhcmRzXCIsXG4gIFwiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sbGFib3JhdG9yc1wiLFxuICBcIkdFVCAvcHJvamVjdHMve3Byb2plY3RfaWR9L2NvbHVtbnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvYXJ0aWZhY3RzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2NhY2hlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9vcmdhbml6YXRpb24tc2VjcmV0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9vcmdhbml6YXRpb24tdmFyaWFibGVzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVuc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2FydGlmYWN0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2F0dGVtcHRzL3thdHRlbXB0X251bWJlcn0vam9ic1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2pvYnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy92YXJpYWJsZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93cy97d29ya2Zsb3dfaWR9L3J1bnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGl2aXR5XCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hc3NpZ25lZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1ydW5zL3tjaGVja19ydW5faWR9L2Fubm90YXRpb25zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1zdWl0ZXMve2NoZWNrX3N1aXRlX2lkfS9jaGVjay1ydW5zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FsZXJ0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn0vaW5zdGFuY2VzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FuYWx5c2VzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL2RldmNvbnRhaW5lcnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvc2VjcmV0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29sbGFib3JhdG9yc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZWFjdGlvbnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve2NvbW1pdF9zaGF9L2NvbW1lbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tjb21taXRfc2hhfS9wdWxsc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9jaGVjay1ydW5zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9L2NoZWNrLXN1aXRlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9zdGF0dXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vc3RhdHVzZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbnRyaWJ1dG9yc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9hbGVydHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3Qvc2VjcmV0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50X2lkfS9zdGF0dXNlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L2RlcGxveW1lbnQtYnJhbmNoLXBvbGljaWVzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L2RlcGxveW1lbnRfcHJvdGVjdGlvbl9ydWxlcy9hcHBzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ldmVudHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ZvcmtzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9L2RlbGl2ZXJpZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludml0YXRpb25zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZWFjdGlvbnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9ldmVudHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9jb21tZW50c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2V2ZW50c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2xhYmVsc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L3JlYWN0aW9uc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L3RpbWVsaW5lXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9rZXlzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L21pbGVzdG9uZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L21pbGVzdG9uZXMve21pbGVzdG9uZV9udW1iZXJ9L2xhYmVsc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbm90aWZpY2F0aW9uc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvYnVpbGRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wcm9qZWN0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL2NvbW1lbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1lbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1pdHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vZmlsZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzL3tyZXZpZXdfaWR9L2NvbW1lbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9L2Fzc2V0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9L3JlYWN0aW9uc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXMvYnJhbmNoZXMve2JyYW5jaH1cIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy9ydWxlLXN1aXRlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0cy97YWxlcnRfbnVtYmVyfS9sb2NhdGlvbnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3VyaXR5LWFkdmlzb3JpZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N0YXJnYXplcnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N1YnNjcmliZXJzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90YWdzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90ZWFtc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdG9waWNzXCIsXG4gIFwiR0VUIC9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzXCIsXG4gIFwiR0VUIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vdmFyaWFibGVzXCIsXG4gIFwiR0VUIC9zZWFyY2gvY29kZVwiLFxuICBcIkdFVCAvc2VhcmNoL2NvbW1pdHNcIixcbiAgXCJHRVQgL3NlYXJjaC9pc3N1ZXNcIixcbiAgXCJHRVQgL3NlYXJjaC9sYWJlbHNcIixcbiAgXCJHRVQgL3NlYXJjaC9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL3NlYXJjaC90b3BpY3NcIixcbiAgXCJHRVQgL3NlYXJjaC91c2Vyc1wiLFxuICBcIkdFVCAvdGVhbXMve3RlYW1faWR9L2Rpc2N1c3Npb25zXCIsXG4gIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50c1wiLFxuICBcIkdFVCAvdGVhbXMve3RlYW1faWR9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfS9yZWFjdGlvbnNcIixcbiAgXCJHRVQgL3RlYW1zL3t0ZWFtX2lkfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L3JlYWN0aW9uc1wiLFxuICBcIkdFVCAvdGVhbXMve3RlYW1faWR9L2ludml0YXRpb25zXCIsXG4gIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vbWVtYmVyc1wiLFxuICBcIkdFVCAvdGVhbXMve3RlYW1faWR9L3Byb2plY3RzXCIsXG4gIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vcmVwb3NcIixcbiAgXCJHRVQgL3RlYW1zL3t0ZWFtX2lkfS90ZWFtc1wiLFxuICBcIkdFVCAvdXNlci9ibG9ja3NcIixcbiAgXCJHRVQgL3VzZXIvY29kZXNwYWNlc1wiLFxuICBcIkdFVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHNcIixcbiAgXCJHRVQgL3VzZXIvZW1haWxzXCIsXG4gIFwiR0VUIC91c2VyL2ZvbGxvd2Vyc1wiLFxuICBcIkdFVCAvdXNlci9mb2xsb3dpbmdcIixcbiAgXCJHRVQgL3VzZXIvZ3BnX2tleXNcIixcbiAgXCJHRVQgL3VzZXIvaW5zdGFsbGF0aW9uc1wiLFxuICBcIkdFVCAvdXNlci9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L3JlcG9zaXRvcmllc1wiLFxuICBcIkdFVCAvdXNlci9pc3N1ZXNcIixcbiAgXCJHRVQgL3VzZXIva2V5c1wiLFxuICBcIkdFVCAvdXNlci9tYXJrZXRwbGFjZV9wdXJjaGFzZXNcIixcbiAgXCJHRVQgL3VzZXIvbWFya2V0cGxhY2VfcHVyY2hhc2VzL3N0dWJiZWRcIixcbiAgXCJHRVQgL3VzZXIvbWVtYmVyc2hpcHMvb3Jnc1wiLFxuICBcIkdFVCAvdXNlci9taWdyYXRpb25zXCIsXG4gIFwiR0VUIC91c2VyL21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vcmVwb3NpdG9yaWVzXCIsXG4gIFwiR0VUIC91c2VyL29yZ3NcIixcbiAgXCJHRVQgL3VzZXIvcGFja2FnZXNcIixcbiAgXCJHRVQgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnNcIixcbiAgXCJHRVQgL3VzZXIvcHVibGljX2VtYWlsc1wiLFxuICBcIkdFVCAvdXNlci9yZXBvc1wiLFxuICBcIkdFVCAvdXNlci9yZXBvc2l0b3J5X2ludml0YXRpb25zXCIsXG4gIFwiR0VUIC91c2VyL3NvY2lhbF9hY2NvdW50c1wiLFxuICBcIkdFVCAvdXNlci9zc2hfc2lnbmluZ19rZXlzXCIsXG4gIFwiR0VUIC91c2VyL3N0YXJyZWRcIixcbiAgXCJHRVQgL3VzZXIvc3Vic2NyaXB0aW9uc1wiLFxuICBcIkdFVCAvdXNlci90ZWFtc1wiLFxuICBcIkdFVCAvdXNlcnNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZXZlbnRzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2V2ZW50cy9vcmdzL3tvcmd9XCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2V2ZW50cy9wdWJsaWNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZm9sbG93ZXJzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2ZvbGxvd2luZ1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9naXN0c1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ncGdfa2V5c1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9rZXlzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L29yZ3NcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcHJvamVjdHNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVjZWl2ZWRfZXZlbnRzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3JlY2VpdmVkX2V2ZW50cy9wdWJsaWNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVwb3NcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc29jaWFsX2FjY291bnRzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3NzaF9zaWduaW5nX2tleXNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc3RhcnJlZFwiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9zdWJzY3JpcHRpb25zXCJcbl07XG5cbi8vIHBrZy9kaXN0LXNyYy9wYWdpbmF0aW5nLWVuZHBvaW50cy5qc1xuZnVuY3Rpb24gaXNQYWdpbmF0aW5nRW5kcG9pbnQoYXJnKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHBhZ2luYXRpbmdFbmRwb2ludHMuaW5jbHVkZXMoYXJnKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLy8gcGtnL2Rpc3Qtc3JjL2luZGV4LmpzXG5mdW5jdGlvbiBwYWdpbmF0ZVJlc3Qob2N0b2tpdCkge1xuICByZXR1cm4ge1xuICAgIHBhZ2luYXRlOiBPYmplY3QuYXNzaWduKHBhZ2luYXRlLmJpbmQobnVsbCwgb2N0b2tpdCksIHtcbiAgICAgIGl0ZXJhdG9yOiBpdGVyYXRvci5iaW5kKG51bGwsIG9jdG9raXQpXG4gICAgfSlcbiAgfTtcbn1cbnBhZ2luYXRlUmVzdC5WRVJTSU9OID0gVkVSU0lPTjtcbmV4cG9ydCB7XG4gIGNvbXBvc2VQYWdpbmF0ZVJlc3QsXG4gIGlzUGFnaW5hdGluZ0VuZHBvaW50LFxuICBwYWdpbmF0ZVJlc3QsXG4gIHBhZ2luYXRpbmdFbmRwb2ludHNcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5745\n')},9083:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ requestLog: () => (/* binding */ requestLog)\n/* harmony export */ });\nconst VERSION = "1.0.4";\n\n/**\n * @param octokit Octokit instance\n * @param options Options passed to Octokit constructor\n */\nfunction requestLog(octokit) {\n octokit.hook.wrap("request", (request, options) => {\n octokit.log.debug("request", options);\n const start = Date.now();\n const requestOptions = octokit.request.endpoint.parse(options);\n const path = requestOptions.url.replace(options.baseUrl, "");\n return request(options)\n .then((response) => {\n octokit.log.info(`${requestOptions.method} ${path} - ${response.status} in ${Date.now() - start}ms`);\n return response;\n })\n .catch((error) => {\n octokit.log.info(`${requestOptions.method} ${path} - ${error.status} in ${Date.now() - start}ms`);\n throw error;\n });\n });\n}\nrequestLog.VERSION = VERSION;\n\n\n//# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTA4My5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLHVCQUF1QixFQUFFLE1BQU0sSUFBSSxpQkFBaUIsS0FBSyxtQkFBbUI7QUFDNUc7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxnQ0FBZ0MsdUJBQXVCLEVBQUUsTUFBTSxJQUFJLGNBQWMsS0FBSyxtQkFBbUI7QUFDekc7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7O0FBRXNCO0FBQ3RCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvcGx1Z2luLXJlcXVlc3QtbG9nL2Rpc3Qtd2ViL2luZGV4LmpzPzEzZWUiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgVkVSU0lPTiA9IFwiMS4wLjRcIjtcblxuLyoqXG4gKiBAcGFyYW0gb2N0b2tpdCBPY3Rva2l0IGluc3RhbmNlXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHBhc3NlZCB0byBPY3Rva2l0IGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIHJlcXVlc3RMb2cob2N0b2tpdCkge1xuICAgIG9jdG9raXQuaG9vay53cmFwKFwicmVxdWVzdFwiLCAocmVxdWVzdCwgb3B0aW9ucykgPT4ge1xuICAgICAgICBvY3Rva2l0LmxvZy5kZWJ1ZyhcInJlcXVlc3RcIiwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSBvY3Rva2l0LnJlcXVlc3QuZW5kcG9pbnQucGFyc2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHBhdGggPSByZXF1ZXN0T3B0aW9ucy51cmwucmVwbGFjZShvcHRpb25zLmJhc2VVcmwsIFwiXCIpO1xuICAgICAgICByZXR1cm4gcmVxdWVzdChvcHRpb25zKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBvY3Rva2l0LmxvZy5pbmZvKGAke3JlcXVlc3RPcHRpb25zLm1ldGhvZH0gJHtwYXRofSAtICR7cmVzcG9uc2Uuc3RhdHVzfSBpbiAke0RhdGUubm93KCkgLSBzdGFydH1tc2ApO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgb2N0b2tpdC5sb2cuaW5mbyhgJHtyZXF1ZXN0T3B0aW9ucy5tZXRob2R9ICR7cGF0aH0gLSAke2Vycm9yLnN0YXR1c30gaW4gJHtEYXRlLm5vdygpIC0gc3RhcnR9bXNgKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbnJlcXVlc3RMb2cuVkVSU0lPTiA9IFZFUlNJT047XG5cbmV4cG9ydCB7IHJlcXVlc3RMb2cgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9083\n')},3927:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n legacyRestEndpointMethods: () => (/* binding */ legacyRestEndpointMethods),\n restEndpointMethods: () => (/* binding */ restEndpointMethods)\n});\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/plugin-rest-endpoint-methods/dist-src/version.js\nconst VERSION = "10.2.0";\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/plugin-rest-endpoint-methods/dist-src/generated/endpoints.js\nconst Endpoints = {\n actions: {\n addCustomLabelsToSelfHostedRunnerForOrg: [\n "POST /orgs/{org}/actions/runners/{runner_id}/labels"\n ],\n addCustomLabelsToSelfHostedRunnerForRepo: [\n "POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"\n ],\n addSelectedRepoToOrgSecret: [\n "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"\n ],\n addSelectedRepoToOrgVariable: [\n "PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id}"\n ],\n approveWorkflowRun: [\n "POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve"\n ],\n cancelWorkflowRun: [\n "POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel"\n ],\n createEnvironmentVariable: [\n "POST /repositories/{repository_id}/environments/{environment_name}/variables"\n ],\n createOrUpdateEnvironmentSecret: [\n "PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"\n ],\n createOrUpdateOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}"],\n createOrUpdateRepoSecret: [\n "PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}"\n ],\n createOrgVariable: ["POST /orgs/{org}/actions/variables"],\n createRegistrationTokenForOrg: [\n "POST /orgs/{org}/actions/runners/registration-token"\n ],\n createRegistrationTokenForRepo: [\n "POST /repos/{owner}/{repo}/actions/runners/registration-token"\n ],\n createRemoveTokenForOrg: ["POST /orgs/{org}/actions/runners/remove-token"],\n createRemoveTokenForRepo: [\n "POST /repos/{owner}/{repo}/actions/runners/remove-token"\n ],\n createRepoVariable: ["POST /repos/{owner}/{repo}/actions/variables"],\n createWorkflowDispatch: [\n "POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches"\n ],\n deleteActionsCacheById: [\n "DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}"\n ],\n deleteActionsCacheByKey: [\n "DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}"\n ],\n deleteArtifact: [\n "DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"\n ],\n deleteEnvironmentSecret: [\n "DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"\n ],\n deleteEnvironmentVariable: [\n "DELETE /repositories/{repository_id}/environments/{environment_name}/variables/{name}"\n ],\n deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"],\n deleteOrgVariable: ["DELETE /orgs/{org}/actions/variables/{name}"],\n deleteRepoSecret: [\n "DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}"\n ],\n deleteRepoVariable: [\n "DELETE /repos/{owner}/{repo}/actions/variables/{name}"\n ],\n deleteSelfHostedRunnerFromOrg: [\n "DELETE /orgs/{org}/actions/runners/{runner_id}"\n ],\n deleteSelfHostedRunnerFromRepo: [\n "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}"\n ],\n deleteWorkflowRun: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"],\n deleteWorkflowRunLogs: [\n "DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs"\n ],\n disableSelectedRepositoryGithubActionsOrganization: [\n "DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}"\n ],\n disableWorkflow: [\n "PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable"\n ],\n downloadArtifact: [\n "GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}"\n ],\n downloadJobLogsForWorkflowRun: [\n "GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs"\n ],\n downloadWorkflowRunAttemptLogs: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs"\n ],\n downloadWorkflowRunLogs: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs"\n ],\n enableSelectedRepositoryGithubActionsOrganization: [\n "PUT /orgs/{org}/actions/permissions/repositories/{repository_id}"\n ],\n enableWorkflow: [\n "PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable"\n ],\n forceCancelWorkflowRun: [\n "POST /repos/{owner}/{repo}/actions/runs/{run_id}/force-cancel"\n ],\n generateRunnerJitconfigForOrg: [\n "POST /orgs/{org}/actions/runners/generate-jitconfig"\n ],\n generateRunnerJitconfigForRepo: [\n "POST /repos/{owner}/{repo}/actions/runners/generate-jitconfig"\n ],\n getActionsCacheList: ["GET /repos/{owner}/{repo}/actions/caches"],\n getActionsCacheUsage: ["GET /repos/{owner}/{repo}/actions/cache/usage"],\n getActionsCacheUsageByRepoForOrg: [\n "GET /orgs/{org}/actions/cache/usage-by-repository"\n ],\n getActionsCacheUsageForOrg: ["GET /orgs/{org}/actions/cache/usage"],\n getAllowedActionsOrganization: [\n "GET /orgs/{org}/actions/permissions/selected-actions"\n ],\n getAllowedActionsRepository: [\n "GET /repos/{owner}/{repo}/actions/permissions/selected-actions"\n ],\n getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"],\n getEnvironmentPublicKey: [\n "GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key"\n ],\n getEnvironmentSecret: [\n "GET /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"\n ],\n getEnvironmentVariable: [\n "GET /repositories/{repository_id}/environments/{environment_name}/variables/{name}"\n ],\n getGithubActionsDefaultWorkflowPermissionsOrganization: [\n "GET /orgs/{org}/actions/permissions/workflow"\n ],\n getGithubActionsDefaultWorkflowPermissionsRepository: [\n "GET /repos/{owner}/{repo}/actions/permissions/workflow"\n ],\n getGithubActionsPermissionsOrganization: [\n "GET /orgs/{org}/actions/permissions"\n ],\n getGithubActionsPermissionsRepository: [\n "GET /repos/{owner}/{repo}/actions/permissions"\n ],\n getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"],\n getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"],\n getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"],\n getOrgVariable: ["GET /orgs/{org}/actions/variables/{name}"],\n getPendingDeploymentsForRun: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"\n ],\n getRepoPermissions: [\n "GET /repos/{owner}/{repo}/actions/permissions",\n {},\n { renamed: ["actions", "getGithubActionsPermissionsRepository"] }\n ],\n getRepoPublicKey: ["GET /repos/{owner}/{repo}/actions/secrets/public-key"],\n getRepoSecret: ["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"],\n getRepoVariable: ["GET /repos/{owner}/{repo}/actions/variables/{name}"],\n getReviewsForRun: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals"\n ],\n getSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}"],\n getSelfHostedRunnerForRepo: [\n "GET /repos/{owner}/{repo}/actions/runners/{runner_id}"\n ],\n getWorkflow: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"],\n getWorkflowAccessToRepository: [\n "GET /repos/{owner}/{repo}/actions/permissions/access"\n ],\n getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"],\n getWorkflowRunAttempt: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}"\n ],\n getWorkflowRunUsage: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing"\n ],\n getWorkflowUsage: [\n "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing"\n ],\n listArtifactsForRepo: ["GET /repos/{owner}/{repo}/actions/artifacts"],\n listEnvironmentSecrets: [\n "GET /repositories/{repository_id}/environments/{environment_name}/secrets"\n ],\n listEnvironmentVariables: [\n "GET /repositories/{repository_id}/environments/{environment_name}/variables"\n ],\n listJobsForWorkflowRun: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs"\n ],\n listJobsForWorkflowRunAttempt: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs"\n ],\n listLabelsForSelfHostedRunnerForOrg: [\n "GET /orgs/{org}/actions/runners/{runner_id}/labels"\n ],\n listLabelsForSelfHostedRunnerForRepo: [\n "GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"\n ],\n listOrgSecrets: ["GET /orgs/{org}/actions/secrets"],\n listOrgVariables: ["GET /orgs/{org}/actions/variables"],\n listRepoOrganizationSecrets: [\n "GET /repos/{owner}/{repo}/actions/organization-secrets"\n ],\n listRepoOrganizationVariables: [\n "GET /repos/{owner}/{repo}/actions/organization-variables"\n ],\n listRepoSecrets: ["GET /repos/{owner}/{repo}/actions/secrets"],\n listRepoVariables: ["GET /repos/{owner}/{repo}/actions/variables"],\n listRepoWorkflows: ["GET /repos/{owner}/{repo}/actions/workflows"],\n listRunnerApplicationsForOrg: ["GET /orgs/{org}/actions/runners/downloads"],\n listRunnerApplicationsForRepo: [\n "GET /repos/{owner}/{repo}/actions/runners/downloads"\n ],\n listSelectedReposForOrgSecret: [\n "GET /orgs/{org}/actions/secrets/{secret_name}/repositories"\n ],\n listSelectedReposForOrgVariable: [\n "GET /orgs/{org}/actions/variables/{name}/repositories"\n ],\n listSelectedRepositoriesEnabledGithubActionsOrganization: [\n "GET /orgs/{org}/actions/permissions/repositories"\n ],\n listSelfHostedRunnersForOrg: ["GET /orgs/{org}/actions/runners"],\n listSelfHostedRunnersForRepo: ["GET /repos/{owner}/{repo}/actions/runners"],\n listWorkflowRunArtifacts: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts"\n ],\n listWorkflowRuns: [\n "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs"\n ],\n listWorkflowRunsForRepo: ["GET /repos/{owner}/{repo}/actions/runs"],\n reRunJobForWorkflowRun: [\n "POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun"\n ],\n reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"],\n reRunWorkflowFailedJobs: [\n "POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs"\n ],\n removeAllCustomLabelsFromSelfHostedRunnerForOrg: [\n "DELETE /orgs/{org}/actions/runners/{runner_id}/labels"\n ],\n removeAllCustomLabelsFromSelfHostedRunnerForRepo: [\n "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"\n ],\n removeCustomLabelFromSelfHostedRunnerForOrg: [\n "DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}"\n ],\n removeCustomLabelFromSelfHostedRunnerForRepo: [\n "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}"\n ],\n removeSelectedRepoFromOrgSecret: [\n "DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"\n ],\n removeSelectedRepoFromOrgVariable: [\n "DELETE /orgs/{org}/actions/variables/{name}/repositories/{repository_id}"\n ],\n reviewCustomGatesForRun: [\n "POST /repos/{owner}/{repo}/actions/runs/{run_id}/deployment_protection_rule"\n ],\n reviewPendingDeploymentsForRun: [\n "POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"\n ],\n setAllowedActionsOrganization: [\n "PUT /orgs/{org}/actions/permissions/selected-actions"\n ],\n setAllowedActionsRepository: [\n "PUT /repos/{owner}/{repo}/actions/permissions/selected-actions"\n ],\n setCustomLabelsForSelfHostedRunnerForOrg: [\n "PUT /orgs/{org}/actions/runners/{runner_id}/labels"\n ],\n setCustomLabelsForSelfHostedRunnerForRepo: [\n "PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"\n ],\n setGithubActionsDefaultWorkflowPermissionsOrganization: [\n "PUT /orgs/{org}/actions/permissions/workflow"\n ],\n setGithubActionsDefaultWorkflowPermissionsRepository: [\n "PUT /repos/{owner}/{repo}/actions/permissions/workflow"\n ],\n setGithubActionsPermissionsOrganization: [\n "PUT /orgs/{org}/actions/permissions"\n ],\n setGithubActionsPermissionsRepository: [\n "PUT /repos/{owner}/{repo}/actions/permissions"\n ],\n setSelectedReposForOrgSecret: [\n "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories"\n ],\n setSelectedReposForOrgVariable: [\n "PUT /orgs/{org}/actions/variables/{name}/repositories"\n ],\n setSelectedRepositoriesEnabledGithubActionsOrganization: [\n "PUT /orgs/{org}/actions/permissions/repositories"\n ],\n setWorkflowAccessToRepository: [\n "PUT /repos/{owner}/{repo}/actions/permissions/access"\n ],\n updateEnvironmentVariable: [\n "PATCH /repositories/{repository_id}/environments/{environment_name}/variables/{name}"\n ],\n updateOrgVariable: ["PATCH /orgs/{org}/actions/variables/{name}"],\n updateRepoVariable: [\n "PATCH /repos/{owner}/{repo}/actions/variables/{name}"\n ]\n },\n activity: {\n checkRepoIsStarredByAuthenticatedUser: ["GET /user/starred/{owner}/{repo}"],\n deleteRepoSubscription: ["DELETE /repos/{owner}/{repo}/subscription"],\n deleteThreadSubscription: [\n "DELETE /notifications/threads/{thread_id}/subscription"\n ],\n getFeeds: ["GET /feeds"],\n getRepoSubscription: ["GET /repos/{owner}/{repo}/subscription"],\n getThread: ["GET /notifications/threads/{thread_id}"],\n getThreadSubscriptionForAuthenticatedUser: [\n "GET /notifications/threads/{thread_id}/subscription"\n ],\n listEventsForAuthenticatedUser: ["GET /users/{username}/events"],\n listNotificationsForAuthenticatedUser: ["GET /notifications"],\n listOrgEventsForAuthenticatedUser: [\n "GET /users/{username}/events/orgs/{org}"\n ],\n listPublicEvents: ["GET /events"],\n listPublicEventsForRepoNetwork: ["GET /networks/{owner}/{repo}/events"],\n listPublicEventsForUser: ["GET /users/{username}/events/public"],\n listPublicOrgEvents: ["GET /orgs/{org}/events"],\n listReceivedEventsForUser: ["GET /users/{username}/received_events"],\n listReceivedPublicEventsForUser: [\n "GET /users/{username}/received_events/public"\n ],\n listRepoEvents: ["GET /repos/{owner}/{repo}/events"],\n listRepoNotificationsForAuthenticatedUser: [\n "GET /repos/{owner}/{repo}/notifications"\n ],\n listReposStarredByAuthenticatedUser: ["GET /user/starred"],\n listReposStarredByUser: ["GET /users/{username}/starred"],\n listReposWatchedByUser: ["GET /users/{username}/subscriptions"],\n listStargazersForRepo: ["GET /repos/{owner}/{repo}/stargazers"],\n listWatchedReposForAuthenticatedUser: ["GET /user/subscriptions"],\n listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"],\n markNotificationsAsRead: ["PUT /notifications"],\n markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"],\n markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"],\n setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"],\n setThreadSubscription: [\n "PUT /notifications/threads/{thread_id}/subscription"\n ],\n starRepoForAuthenticatedUser: ["PUT /user/starred/{owner}/{repo}"],\n unstarRepoForAuthenticatedUser: ["DELETE /user/starred/{owner}/{repo}"]\n },\n apps: {\n addRepoToInstallation: [\n "PUT /user/installations/{installation_id}/repositories/{repository_id}",\n {},\n { renamed: ["apps", "addRepoToInstallationForAuthenticatedUser"] }\n ],\n addRepoToInstallationForAuthenticatedUser: [\n "PUT /user/installations/{installation_id}/repositories/{repository_id}"\n ],\n checkToken: ["POST /applications/{client_id}/token"],\n createFromManifest: ["POST /app-manifests/{code}/conversions"],\n createInstallationAccessToken: [\n "POST /app/installations/{installation_id}/access_tokens"\n ],\n deleteAuthorization: ["DELETE /applications/{client_id}/grant"],\n deleteInstallation: ["DELETE /app/installations/{installation_id}"],\n deleteToken: ["DELETE /applications/{client_id}/token"],\n getAuthenticated: ["GET /app"],\n getBySlug: ["GET /apps/{app_slug}"],\n getInstallation: ["GET /app/installations/{installation_id}"],\n getOrgInstallation: ["GET /orgs/{org}/installation"],\n getRepoInstallation: ["GET /repos/{owner}/{repo}/installation"],\n getSubscriptionPlanForAccount: [\n "GET /marketplace_listing/accounts/{account_id}"\n ],\n getSubscriptionPlanForAccountStubbed: [\n "GET /marketplace_listing/stubbed/accounts/{account_id}"\n ],\n getUserInstallation: ["GET /users/{username}/installation"],\n getWebhookConfigForApp: ["GET /app/hook/config"],\n getWebhookDelivery: ["GET /app/hook/deliveries/{delivery_id}"],\n listAccountsForPlan: ["GET /marketplace_listing/plans/{plan_id}/accounts"],\n listAccountsForPlanStubbed: [\n "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts"\n ],\n listInstallationReposForAuthenticatedUser: [\n "GET /user/installations/{installation_id}/repositories"\n ],\n listInstallationRequestsForAuthenticatedApp: [\n "GET /app/installation-requests"\n ],\n listInstallations: ["GET /app/installations"],\n listInstallationsForAuthenticatedUser: ["GET /user/installations"],\n listPlans: ["GET /marketplace_listing/plans"],\n listPlansStubbed: ["GET /marketplace_listing/stubbed/plans"],\n listReposAccessibleToInstallation: ["GET /installation/repositories"],\n listSubscriptionsForAuthenticatedUser: ["GET /user/marketplace_purchases"],\n listSubscriptionsForAuthenticatedUserStubbed: [\n "GET /user/marketplace_purchases/stubbed"\n ],\n listWebhookDeliveries: ["GET /app/hook/deliveries"],\n redeliverWebhookDelivery: [\n "POST /app/hook/deliveries/{delivery_id}/attempts"\n ],\n removeRepoFromInstallation: [\n "DELETE /user/installations/{installation_id}/repositories/{repository_id}",\n {},\n { renamed: ["apps", "removeRepoFromInstallationForAuthenticatedUser"] }\n ],\n removeRepoFromInstallationForAuthenticatedUser: [\n "DELETE /user/installations/{installation_id}/repositories/{repository_id}"\n ],\n resetToken: ["PATCH /applications/{client_id}/token"],\n revokeInstallationAccessToken: ["DELETE /installation/token"],\n scopeToken: ["POST /applications/{client_id}/token/scoped"],\n suspendInstallation: ["PUT /app/installations/{installation_id}/suspended"],\n unsuspendInstallation: [\n "DELETE /app/installations/{installation_id}/suspended"\n ],\n updateWebhookConfigForApp: ["PATCH /app/hook/config"]\n },\n billing: {\n getGithubActionsBillingOrg: ["GET /orgs/{org}/settings/billing/actions"],\n getGithubActionsBillingUser: [\n "GET /users/{username}/settings/billing/actions"\n ],\n getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"],\n getGithubPackagesBillingUser: [\n "GET /users/{username}/settings/billing/packages"\n ],\n getSharedStorageBillingOrg: [\n "GET /orgs/{org}/settings/billing/shared-storage"\n ],\n getSharedStorageBillingUser: [\n "GET /users/{username}/settings/billing/shared-storage"\n ]\n },\n checks: {\n create: ["POST /repos/{owner}/{repo}/check-runs"],\n createSuite: ["POST /repos/{owner}/{repo}/check-suites"],\n get: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}"],\n getSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}"],\n listAnnotations: [\n "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations"\n ],\n listForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-runs"],\n listForSuite: [\n "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs"\n ],\n listSuitesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-suites"],\n rerequestRun: [\n "POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest"\n ],\n rerequestSuite: [\n "POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest"\n ],\n setSuitesPreferences: [\n "PATCH /repos/{owner}/{repo}/check-suites/preferences"\n ],\n update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"]\n },\n codeScanning: {\n deleteAnalysis: [\n "DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}"\n ],\n getAlert: [\n "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}",\n {},\n { renamedParameters: { alert_id: "alert_number" } }\n ],\n getAnalysis: [\n "GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}"\n ],\n getCodeqlDatabase: [\n "GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}"\n ],\n getDefaultSetup: ["GET /repos/{owner}/{repo}/code-scanning/default-setup"],\n getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"],\n listAlertInstances: [\n "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances"\n ],\n listAlertsForOrg: ["GET /orgs/{org}/code-scanning/alerts"],\n listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"],\n listAlertsInstances: [\n "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances",\n {},\n { renamed: ["codeScanning", "listAlertInstances"] }\n ],\n listCodeqlDatabases: [\n "GET /repos/{owner}/{repo}/code-scanning/codeql/databases"\n ],\n listRecentAnalyses: ["GET /repos/{owner}/{repo}/code-scanning/analyses"],\n updateAlert: [\n "PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}"\n ],\n updateDefaultSetup: [\n "PATCH /repos/{owner}/{repo}/code-scanning/default-setup"\n ],\n uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"]\n },\n codesOfConduct: {\n getAllCodesOfConduct: ["GET /codes_of_conduct"],\n getConductCode: ["GET /codes_of_conduct/{key}"]\n },\n codespaces: {\n addRepositoryForSecretForAuthenticatedUser: [\n "PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"\n ],\n addSelectedRepoToOrgSecret: [\n "PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}"\n ],\n checkPermissionsForDevcontainer: [\n "GET /repos/{owner}/{repo}/codespaces/permissions_check"\n ],\n codespaceMachinesForAuthenticatedUser: [\n "GET /user/codespaces/{codespace_name}/machines"\n ],\n createForAuthenticatedUser: ["POST /user/codespaces"],\n createOrUpdateOrgSecret: [\n "PUT /orgs/{org}/codespaces/secrets/{secret_name}"\n ],\n createOrUpdateRepoSecret: [\n "PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"\n ],\n createOrUpdateSecretForAuthenticatedUser: [\n "PUT /user/codespaces/secrets/{secret_name}"\n ],\n createWithPrForAuthenticatedUser: [\n "POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces"\n ],\n createWithRepoForAuthenticatedUser: [\n "POST /repos/{owner}/{repo}/codespaces"\n ],\n deleteForAuthenticatedUser: ["DELETE /user/codespaces/{codespace_name}"],\n deleteFromOrganization: [\n "DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}"\n ],\n deleteOrgSecret: ["DELETE /orgs/{org}/codespaces/secrets/{secret_name}"],\n deleteRepoSecret: [\n "DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"\n ],\n deleteSecretForAuthenticatedUser: [\n "DELETE /user/codespaces/secrets/{secret_name}"\n ],\n exportForAuthenticatedUser: [\n "POST /user/codespaces/{codespace_name}/exports"\n ],\n getCodespacesForUserInOrg: [\n "GET /orgs/{org}/members/{username}/codespaces"\n ],\n getExportDetailsForAuthenticatedUser: [\n "GET /user/codespaces/{codespace_name}/exports/{export_id}"\n ],\n getForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}"],\n getOrgPublicKey: ["GET /orgs/{org}/codespaces/secrets/public-key"],\n getOrgSecret: ["GET /orgs/{org}/codespaces/secrets/{secret_name}"],\n getPublicKeyForAuthenticatedUser: [\n "GET /user/codespaces/secrets/public-key"\n ],\n getRepoPublicKey: [\n "GET /repos/{owner}/{repo}/codespaces/secrets/public-key"\n ],\n getRepoSecret: [\n "GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"\n ],\n getSecretForAuthenticatedUser: [\n "GET /user/codespaces/secrets/{secret_name}"\n ],\n listDevcontainersInRepositoryForAuthenticatedUser: [\n "GET /repos/{owner}/{repo}/codespaces/devcontainers"\n ],\n listForAuthenticatedUser: ["GET /user/codespaces"],\n listInOrganization: [\n "GET /orgs/{org}/codespaces",\n {},\n { renamedParameters: { org_id: "org" } }\n ],\n listInRepositoryForAuthenticatedUser: [\n "GET /repos/{owner}/{repo}/codespaces"\n ],\n listOrgSecrets: ["GET /orgs/{org}/codespaces/secrets"],\n listRepoSecrets: ["GET /repos/{owner}/{repo}/codespaces/secrets"],\n listRepositoriesForSecretForAuthenticatedUser: [\n "GET /user/codespaces/secrets/{secret_name}/repositories"\n ],\n listSecretsForAuthenticatedUser: ["GET /user/codespaces/secrets"],\n listSelectedReposForOrgSecret: [\n "GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories"\n ],\n preFlightWithRepoForAuthenticatedUser: [\n "GET /repos/{owner}/{repo}/codespaces/new"\n ],\n publishForAuthenticatedUser: [\n "POST /user/codespaces/{codespace_name}/publish"\n ],\n removeRepositoryForSecretForAuthenticatedUser: [\n "DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"\n ],\n removeSelectedRepoFromOrgSecret: [\n "DELETE /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}"\n ],\n repoMachinesForAuthenticatedUser: [\n "GET /repos/{owner}/{repo}/codespaces/machines"\n ],\n setRepositoriesForSecretForAuthenticatedUser: [\n "PUT /user/codespaces/secrets/{secret_name}/repositories"\n ],\n setSelectedReposForOrgSecret: [\n "PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories"\n ],\n startForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/start"],\n stopForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/stop"],\n stopInOrganization: [\n "POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop"\n ],\n updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"]\n },\n copilot: {\n addCopilotForBusinessSeatsForTeams: [\n "POST /orgs/{org}/copilot/billing/selected_teams"\n ],\n addCopilotForBusinessSeatsForUsers: [\n "POST /orgs/{org}/copilot/billing/selected_users"\n ],\n cancelCopilotSeatAssignmentForTeams: [\n "DELETE /orgs/{org}/copilot/billing/selected_teams"\n ],\n cancelCopilotSeatAssignmentForUsers: [\n "DELETE /orgs/{org}/copilot/billing/selected_users"\n ],\n getCopilotOrganizationDetails: ["GET /orgs/{org}/copilot/billing"],\n getCopilotSeatDetailsForUser: [\n "GET /orgs/{org}/members/{username}/copilot"\n ],\n listCopilotSeats: ["GET /orgs/{org}/copilot/billing/seats"]\n },\n dependabot: {\n addSelectedRepoToOrgSecret: [\n "PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"\n ],\n createOrUpdateOrgSecret: [\n "PUT /orgs/{org}/dependabot/secrets/{secret_name}"\n ],\n createOrUpdateRepoSecret: [\n "PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"\n ],\n deleteOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"],\n deleteRepoSecret: [\n "DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"\n ],\n getAlert: ["GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"],\n getOrgPublicKey: ["GET /orgs/{org}/dependabot/secrets/public-key"],\n getOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}"],\n getRepoPublicKey: [\n "GET /repos/{owner}/{repo}/dependabot/secrets/public-key"\n ],\n getRepoSecret: [\n "GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"\n ],\n listAlertsForEnterprise: [\n "GET /enterprises/{enterprise}/dependabot/alerts"\n ],\n listAlertsForOrg: ["GET /orgs/{org}/dependabot/alerts"],\n listAlertsForRepo: ["GET /repos/{owner}/{repo}/dependabot/alerts"],\n listOrgSecrets: ["GET /orgs/{org}/dependabot/secrets"],\n listRepoSecrets: ["GET /repos/{owner}/{repo}/dependabot/secrets"],\n listSelectedReposForOrgSecret: [\n "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories"\n ],\n removeSelectedRepoFromOrgSecret: [\n "DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"\n ],\n setSelectedReposForOrgSecret: [\n "PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories"\n ],\n updateAlert: [\n "PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"\n ]\n },\n dependencyGraph: {\n createRepositorySnapshot: [\n "POST /repos/{owner}/{repo}/dependency-graph/snapshots"\n ],\n diffRange: [\n "GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}"\n ],\n exportSbom: ["GET /repos/{owner}/{repo}/dependency-graph/sbom"]\n },\n emojis: { get: ["GET /emojis"] },\n gists: {\n checkIsStarred: ["GET /gists/{gist_id}/star"],\n create: ["POST /gists"],\n createComment: ["POST /gists/{gist_id}/comments"],\n delete: ["DELETE /gists/{gist_id}"],\n deleteComment: ["DELETE /gists/{gist_id}/comments/{comment_id}"],\n fork: ["POST /gists/{gist_id}/forks"],\n get: ["GET /gists/{gist_id}"],\n getComment: ["GET /gists/{gist_id}/comments/{comment_id}"],\n getRevision: ["GET /gists/{gist_id}/{sha}"],\n list: ["GET /gists"],\n listComments: ["GET /gists/{gist_id}/comments"],\n listCommits: ["GET /gists/{gist_id}/commits"],\n listForUser: ["GET /users/{username}/gists"],\n listForks: ["GET /gists/{gist_id}/forks"],\n listPublic: ["GET /gists/public"],\n listStarred: ["GET /gists/starred"],\n star: ["PUT /gists/{gist_id}/star"],\n unstar: ["DELETE /gists/{gist_id}/star"],\n update: ["PATCH /gists/{gist_id}"],\n updateComment: ["PATCH /gists/{gist_id}/comments/{comment_id}"]\n },\n git: {\n createBlob: ["POST /repos/{owner}/{repo}/git/blobs"],\n createCommit: ["POST /repos/{owner}/{repo}/git/commits"],\n createRef: ["POST /repos/{owner}/{repo}/git/refs"],\n createTag: ["POST /repos/{owner}/{repo}/git/tags"],\n createTree: ["POST /repos/{owner}/{repo}/git/trees"],\n deleteRef: ["DELETE /repos/{owner}/{repo}/git/refs/{ref}"],\n getBlob: ["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"],\n getCommit: ["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"],\n getRef: ["GET /repos/{owner}/{repo}/git/ref/{ref}"],\n getTag: ["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"],\n getTree: ["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"],\n listMatchingRefs: ["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"],\n updateRef: ["PATCH /repos/{owner}/{repo}/git/refs/{ref}"]\n },\n gitignore: {\n getAllTemplates: ["GET /gitignore/templates"],\n getTemplate: ["GET /gitignore/templates/{name}"]\n },\n interactions: {\n getRestrictionsForAuthenticatedUser: ["GET /user/interaction-limits"],\n getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits"],\n getRestrictionsForRepo: ["GET /repos/{owner}/{repo}/interaction-limits"],\n getRestrictionsForYourPublicRepos: [\n "GET /user/interaction-limits",\n {},\n { renamed: ["interactions", "getRestrictionsForAuthenticatedUser"] }\n ],\n removeRestrictionsForAuthenticatedUser: ["DELETE /user/interaction-limits"],\n removeRestrictionsForOrg: ["DELETE /orgs/{org}/interaction-limits"],\n removeRestrictionsForRepo: [\n "DELETE /repos/{owner}/{repo}/interaction-limits"\n ],\n removeRestrictionsForYourPublicRepos: [\n "DELETE /user/interaction-limits",\n {},\n { renamed: ["interactions", "removeRestrictionsForAuthenticatedUser"] }\n ],\n setRestrictionsForAuthenticatedUser: ["PUT /user/interaction-limits"],\n setRestrictionsForOrg: ["PUT /orgs/{org}/interaction-limits"],\n setRestrictionsForRepo: ["PUT /repos/{owner}/{repo}/interaction-limits"],\n setRestrictionsForYourPublicRepos: [\n "PUT /user/interaction-limits",\n {},\n { renamed: ["interactions", "setRestrictionsForAuthenticatedUser"] }\n ]\n },\n issues: {\n addAssignees: [\n "POST /repos/{owner}/{repo}/issues/{issue_number}/assignees"\n ],\n addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"],\n checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"],\n checkUserCanBeAssignedToIssue: [\n "GET /repos/{owner}/{repo}/issues/{issue_number}/assignees/{assignee}"\n ],\n create: ["POST /repos/{owner}/{repo}/issues"],\n createComment: [\n "POST /repos/{owner}/{repo}/issues/{issue_number}/comments"\n ],\n createLabel: ["POST /repos/{owner}/{repo}/labels"],\n createMilestone: ["POST /repos/{owner}/{repo}/milestones"],\n deleteComment: [\n "DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}"\n ],\n deleteLabel: ["DELETE /repos/{owner}/{repo}/labels/{name}"],\n deleteMilestone: [\n "DELETE /repos/{owner}/{repo}/milestones/{milestone_number}"\n ],\n get: ["GET /repos/{owner}/{repo}/issues/{issue_number}"],\n getComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"],\n getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"],\n getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"],\n getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"],\n list: ["GET /issues"],\n listAssignees: ["GET /repos/{owner}/{repo}/assignees"],\n listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"],\n listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"],\n listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"],\n listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"],\n listEventsForTimeline: [\n "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline"\n ],\n listForAuthenticatedUser: ["GET /user/issues"],\n listForOrg: ["GET /orgs/{org}/issues"],\n listForRepo: ["GET /repos/{owner}/{repo}/issues"],\n listLabelsForMilestone: [\n "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels"\n ],\n listLabelsForRepo: ["GET /repos/{owner}/{repo}/labels"],\n listLabelsOnIssue: [\n "GET /repos/{owner}/{repo}/issues/{issue_number}/labels"\n ],\n listMilestones: ["GET /repos/{owner}/{repo}/milestones"],\n lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"],\n removeAllLabels: [\n "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels"\n ],\n removeAssignees: [\n "DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees"\n ],\n removeLabel: [\n "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}"\n ],\n setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"],\n unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"],\n update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"],\n updateComment: ["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"],\n updateLabel: ["PATCH /repos/{owner}/{repo}/labels/{name}"],\n updateMilestone: [\n "PATCH /repos/{owner}/{repo}/milestones/{milestone_number}"\n ]\n },\n licenses: {\n get: ["GET /licenses/{license}"],\n getAllCommonlyUsed: ["GET /licenses"],\n getForRepo: ["GET /repos/{owner}/{repo}/license"]\n },\n markdown: {\n render: ["POST /markdown"],\n renderRaw: [\n "POST /markdown/raw",\n { headers: { "content-type": "text/plain; charset=utf-8" } }\n ]\n },\n meta: {\n get: ["GET /meta"],\n getAllVersions: ["GET /versions"],\n getOctocat: ["GET /octocat"],\n getZen: ["GET /zen"],\n root: ["GET /"]\n },\n migrations: {\n cancelImport: [\n "DELETE /repos/{owner}/{repo}/import",\n {},\n {\n deprecated: "octokit.rest.migrations.cancelImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#cancel-an-import"\n }\n ],\n deleteArchiveForAuthenticatedUser: [\n "DELETE /user/migrations/{migration_id}/archive"\n ],\n deleteArchiveForOrg: [\n "DELETE /orgs/{org}/migrations/{migration_id}/archive"\n ],\n downloadArchiveForOrg: [\n "GET /orgs/{org}/migrations/{migration_id}/archive"\n ],\n getArchiveForAuthenticatedUser: [\n "GET /user/migrations/{migration_id}/archive"\n ],\n getCommitAuthors: [\n "GET /repos/{owner}/{repo}/import/authors",\n {},\n {\n deprecated: "octokit.rest.migrations.getCommitAuthors() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-commit-authors"\n }\n ],\n getImportStatus: [\n "GET /repos/{owner}/{repo}/import",\n {},\n {\n deprecated: "octokit.rest.migrations.getImportStatus() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-an-import-status"\n }\n ],\n getLargeFiles: [\n "GET /repos/{owner}/{repo}/import/large_files",\n {},\n {\n deprecated: "octokit.rest.migrations.getLargeFiles() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-large-files"\n }\n ],\n getStatusForAuthenticatedUser: ["GET /user/migrations/{migration_id}"],\n getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}"],\n listForAuthenticatedUser: ["GET /user/migrations"],\n listForOrg: ["GET /orgs/{org}/migrations"],\n listReposForAuthenticatedUser: [\n "GET /user/migrations/{migration_id}/repositories"\n ],\n listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories"],\n listReposForUser: [\n "GET /user/migrations/{migration_id}/repositories",\n {},\n { renamed: ["migrations", "listReposForAuthenticatedUser"] }\n ],\n mapCommitAuthor: [\n "PATCH /repos/{owner}/{repo}/import/authors/{author_id}",\n {},\n {\n deprecated: "octokit.rest.migrations.mapCommitAuthor() is deprecated, see https://docs.github.com/rest/migrations/source-imports#map-a-commit-author"\n }\n ],\n setLfsPreference: [\n "PATCH /repos/{owner}/{repo}/import/lfs",\n {},\n {\n deprecated: "octokit.rest.migrations.setLfsPreference() is deprecated, see https://docs.github.com/rest/migrations/source-imports#update-git-lfs-preference"\n }\n ],\n startForAuthenticatedUser: ["POST /user/migrations"],\n startForOrg: ["POST /orgs/{org}/migrations"],\n startImport: [\n "PUT /repos/{owner}/{repo}/import",\n {},\n {\n deprecated: "octokit.rest.migrations.startImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#start-an-import"\n }\n ],\n unlockRepoForAuthenticatedUser: [\n "DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock"\n ],\n unlockRepoForOrg: [\n "DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock"\n ],\n updateImport: [\n "PATCH /repos/{owner}/{repo}/import",\n {},\n {\n deprecated: "octokit.rest.migrations.updateImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#update-an-import"\n }\n ]\n },\n orgs: {\n addSecurityManagerTeam: [\n "PUT /orgs/{org}/security-managers/teams/{team_slug}"\n ],\n blockUser: ["PUT /orgs/{org}/blocks/{username}"],\n cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"],\n checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"],\n checkMembershipForUser: ["GET /orgs/{org}/members/{username}"],\n checkPublicMembershipForUser: ["GET /orgs/{org}/public_members/{username}"],\n convertMemberToOutsideCollaborator: [\n "PUT /orgs/{org}/outside_collaborators/{username}"\n ],\n createInvitation: ["POST /orgs/{org}/invitations"],\n createOrUpdateCustomProperties: ["PATCH /orgs/{org}/properties/schema"],\n createOrUpdateCustomPropertiesValuesForRepos: [\n "PATCH /orgs/{org}/properties/values"\n ],\n createOrUpdateCustomProperty: [\n "PUT /orgs/{org}/properties/schema/{custom_property_name}"\n ],\n createWebhook: ["POST /orgs/{org}/hooks"],\n delete: ["DELETE /orgs/{org}"],\n deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"],\n enableOrDisableSecurityProductOnAllOrgRepos: [\n "POST /orgs/{org}/{security_product}/{enablement}"\n ],\n get: ["GET /orgs/{org}"],\n getAllCustomProperties: ["GET /orgs/{org}/properties/schema"],\n getCustomProperty: [\n "GET /orgs/{org}/properties/schema/{custom_property_name}"\n ],\n getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"],\n getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"],\n getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"],\n getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"],\n getWebhookDelivery: [\n "GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}"\n ],\n list: ["GET /organizations"],\n listAppInstallations: ["GET /orgs/{org}/installations"],\n listBlockedUsers: ["GET /orgs/{org}/blocks"],\n listCustomPropertiesValuesForRepos: ["GET /orgs/{org}/properties/values"],\n listFailedInvitations: ["GET /orgs/{org}/failed_invitations"],\n listForAuthenticatedUser: ["GET /user/orgs"],\n listForUser: ["GET /users/{username}/orgs"],\n listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"],\n listMembers: ["GET /orgs/{org}/members"],\n listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"],\n listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"],\n listPatGrantRepositories: [\n "GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories"\n ],\n listPatGrantRequestRepositories: [\n "GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories"\n ],\n listPatGrantRequests: ["GET /orgs/{org}/personal-access-token-requests"],\n listPatGrants: ["GET /orgs/{org}/personal-access-tokens"],\n listPendingInvitations: ["GET /orgs/{org}/invitations"],\n listPublicMembers: ["GET /orgs/{org}/public_members"],\n listSecurityManagerTeams: ["GET /orgs/{org}/security-managers"],\n listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"],\n listWebhooks: ["GET /orgs/{org}/hooks"],\n pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"],\n redeliverWebhookDelivery: [\n "POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"\n ],\n removeCustomProperty: [\n "DELETE /orgs/{org}/properties/schema/{custom_property_name}"\n ],\n removeMember: ["DELETE /orgs/{org}/members/{username}"],\n removeMembershipForUser: ["DELETE /orgs/{org}/memberships/{username}"],\n removeOutsideCollaborator: [\n "DELETE /orgs/{org}/outside_collaborators/{username}"\n ],\n removePublicMembershipForAuthenticatedUser: [\n "DELETE /orgs/{org}/public_members/{username}"\n ],\n removeSecurityManagerTeam: [\n "DELETE /orgs/{org}/security-managers/teams/{team_slug}"\n ],\n reviewPatGrantRequest: [\n "POST /orgs/{org}/personal-access-token-requests/{pat_request_id}"\n ],\n reviewPatGrantRequestsInBulk: [\n "POST /orgs/{org}/personal-access-token-requests"\n ],\n setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"],\n setPublicMembershipForAuthenticatedUser: [\n "PUT /orgs/{org}/public_members/{username}"\n ],\n unblockUser: ["DELETE /orgs/{org}/blocks/{username}"],\n update: ["PATCH /orgs/{org}"],\n updateMembershipForAuthenticatedUser: [\n "PATCH /user/memberships/orgs/{org}"\n ],\n updatePatAccess: ["POST /orgs/{org}/personal-access-tokens/{pat_id}"],\n updatePatAccesses: ["POST /orgs/{org}/personal-access-tokens"],\n updateWebhook: ["PATCH /orgs/{org}/hooks/{hook_id}"],\n updateWebhookConfigForOrg: ["PATCH /orgs/{org}/hooks/{hook_id}/config"]\n },\n packages: {\n deletePackageForAuthenticatedUser: [\n "DELETE /user/packages/{package_type}/{package_name}"\n ],\n deletePackageForOrg: [\n "DELETE /orgs/{org}/packages/{package_type}/{package_name}"\n ],\n deletePackageForUser: [\n "DELETE /users/{username}/packages/{package_type}/{package_name}"\n ],\n deletePackageVersionForAuthenticatedUser: [\n "DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}"\n ],\n deletePackageVersionForOrg: [\n "DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"\n ],\n deletePackageVersionForUser: [\n "DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"\n ],\n getAllPackageVersionsForAPackageOwnedByAnOrg: [\n "GET /orgs/{org}/packages/{package_type}/{package_name}/versions",\n {},\n { renamed: ["packages", "getAllPackageVersionsForPackageOwnedByOrg"] }\n ],\n getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: [\n "GET /user/packages/{package_type}/{package_name}/versions",\n {},\n {\n renamed: [\n "packages",\n "getAllPackageVersionsForPackageOwnedByAuthenticatedUser"\n ]\n }\n ],\n getAllPackageVersionsForPackageOwnedByAuthenticatedUser: [\n "GET /user/packages/{package_type}/{package_name}/versions"\n ],\n getAllPackageVersionsForPackageOwnedByOrg: [\n "GET /orgs/{org}/packages/{package_type}/{package_name}/versions"\n ],\n getAllPackageVersionsForPackageOwnedByUser: [\n "GET /users/{username}/packages/{package_type}/{package_name}/versions"\n ],\n getPackageForAuthenticatedUser: [\n "GET /user/packages/{package_type}/{package_name}"\n ],\n getPackageForOrganization: [\n "GET /orgs/{org}/packages/{package_type}/{package_name}"\n ],\n getPackageForUser: [\n "GET /users/{username}/packages/{package_type}/{package_name}"\n ],\n getPackageVersionForAuthenticatedUser: [\n "GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}"\n ],\n getPackageVersionForOrganization: [\n "GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"\n ],\n getPackageVersionForUser: [\n "GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"\n ],\n listDockerMigrationConflictingPackagesForAuthenticatedUser: [\n "GET /user/docker/conflicts"\n ],\n listDockerMigrationConflictingPackagesForOrganization: [\n "GET /orgs/{org}/docker/conflicts"\n ],\n listDockerMigrationConflictingPackagesForUser: [\n "GET /users/{username}/docker/conflicts"\n ],\n listPackagesForAuthenticatedUser: ["GET /user/packages"],\n listPackagesForOrganization: ["GET /orgs/{org}/packages"],\n listPackagesForUser: ["GET /users/{username}/packages"],\n restorePackageForAuthenticatedUser: [\n "POST /user/packages/{package_type}/{package_name}/restore{?token}"\n ],\n restorePackageForOrg: [\n "POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}"\n ],\n restorePackageForUser: [\n "POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}"\n ],\n restorePackageVersionForAuthenticatedUser: [\n "POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"\n ],\n restorePackageVersionForOrg: [\n "POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"\n ],\n restorePackageVersionForUser: [\n "POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"\n ]\n },\n projects: {\n addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}"],\n createCard: ["POST /projects/columns/{column_id}/cards"],\n createColumn: ["POST /projects/{project_id}/columns"],\n createForAuthenticatedUser: ["POST /user/projects"],\n createForOrg: ["POST /orgs/{org}/projects"],\n createForRepo: ["POST /repos/{owner}/{repo}/projects"],\n delete: ["DELETE /projects/{project_id}"],\n deleteCard: ["DELETE /projects/columns/cards/{card_id}"],\n deleteColumn: ["DELETE /projects/columns/{column_id}"],\n get: ["GET /projects/{project_id}"],\n getCard: ["GET /projects/columns/cards/{card_id}"],\n getColumn: ["GET /projects/columns/{column_id}"],\n getPermissionForUser: [\n "GET /projects/{project_id}/collaborators/{username}/permission"\n ],\n listCards: ["GET /projects/columns/{column_id}/cards"],\n listCollaborators: ["GET /projects/{project_id}/collaborators"],\n listColumns: ["GET /projects/{project_id}/columns"],\n listForOrg: ["GET /orgs/{org}/projects"],\n listForRepo: ["GET /repos/{owner}/{repo}/projects"],\n listForUser: ["GET /users/{username}/projects"],\n moveCard: ["POST /projects/columns/cards/{card_id}/moves"],\n moveColumn: ["POST /projects/columns/{column_id}/moves"],\n removeCollaborator: [\n "DELETE /projects/{project_id}/collaborators/{username}"\n ],\n update: ["PATCH /projects/{project_id}"],\n updateCard: ["PATCH /projects/columns/cards/{card_id}"],\n updateColumn: ["PATCH /projects/columns/{column_id}"]\n },\n pulls: {\n checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"],\n create: ["POST /repos/{owner}/{repo}/pulls"],\n createReplyForReviewComment: [\n "POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies"\n ],\n createReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"],\n createReviewComment: [\n "POST /repos/{owner}/{repo}/pulls/{pull_number}/comments"\n ],\n deletePendingReview: [\n "DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"\n ],\n deleteReviewComment: [\n "DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}"\n ],\n dismissReview: [\n "PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals"\n ],\n get: ["GET /repos/{owner}/{repo}/pulls/{pull_number}"],\n getReview: [\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"\n ],\n getReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"],\n list: ["GET /repos/{owner}/{repo}/pulls"],\n listCommentsForReview: [\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments"\n ],\n listCommits: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"],\n listFiles: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"],\n listRequestedReviewers: [\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"\n ],\n listReviewComments: [\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments"\n ],\n listReviewCommentsForRepo: ["GET /repos/{owner}/{repo}/pulls/comments"],\n listReviews: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"],\n merge: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"],\n removeRequestedReviewers: [\n "DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"\n ],\n requestReviewers: [\n "POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"\n ],\n submitReview: [\n "POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events"\n ],\n update: ["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"],\n updateBranch: [\n "PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch"\n ],\n updateReview: [\n "PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"\n ],\n updateReviewComment: [\n "PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}"\n ]\n },\n rateLimit: { get: ["GET /rate_limit"] },\n reactions: {\n createForCommitComment: [\n "POST /repos/{owner}/{repo}/comments/{comment_id}/reactions"\n ],\n createForIssue: [\n "POST /repos/{owner}/{repo}/issues/{issue_number}/reactions"\n ],\n createForIssueComment: [\n "POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"\n ],\n createForPullRequestReviewComment: [\n "POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"\n ],\n createForRelease: [\n "POST /repos/{owner}/{repo}/releases/{release_id}/reactions"\n ],\n createForTeamDiscussionCommentInOrg: [\n "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"\n ],\n createForTeamDiscussionInOrg: [\n "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"\n ],\n deleteForCommitComment: [\n "DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}"\n ],\n deleteForIssue: [\n "DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}"\n ],\n deleteForIssueComment: [\n "DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}"\n ],\n deleteForPullRequestComment: [\n "DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}"\n ],\n deleteForRelease: [\n "DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}"\n ],\n deleteForTeamDiscussion: [\n "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}"\n ],\n deleteForTeamDiscussionComment: [\n "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}"\n ],\n listForCommitComment: [\n "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions"\n ],\n listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"],\n listForIssueComment: [\n "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"\n ],\n listForPullRequestReviewComment: [\n "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"\n ],\n listForRelease: [\n "GET /repos/{owner}/{repo}/releases/{release_id}/reactions"\n ],\n listForTeamDiscussionCommentInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"\n ],\n listForTeamDiscussionInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"\n ]\n },\n repos: {\n acceptInvitation: [\n "PATCH /user/repository_invitations/{invitation_id}",\n {},\n { renamed: ["repos", "acceptInvitationForAuthenticatedUser"] }\n ],\n acceptInvitationForAuthenticatedUser: [\n "PATCH /user/repository_invitations/{invitation_id}"\n ],\n addAppAccessRestrictions: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",\n {},\n { mapToData: "apps" }\n ],\n addCollaborator: ["PUT /repos/{owner}/{repo}/collaborators/{username}"],\n addStatusCheckContexts: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",\n {},\n { mapToData: "contexts" }\n ],\n addTeamAccessRestrictions: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",\n {},\n { mapToData: "teams" }\n ],\n addUserAccessRestrictions: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",\n {},\n { mapToData: "users" }\n ],\n checkAutomatedSecurityFixes: [\n "GET /repos/{owner}/{repo}/automated-security-fixes"\n ],\n checkCollaborator: ["GET /repos/{owner}/{repo}/collaborators/{username}"],\n checkVulnerabilityAlerts: [\n "GET /repos/{owner}/{repo}/vulnerability-alerts"\n ],\n codeownersErrors: ["GET /repos/{owner}/{repo}/codeowners/errors"],\n compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"],\n compareCommitsWithBasehead: [\n "GET /repos/{owner}/{repo}/compare/{basehead}"\n ],\n createAutolink: ["POST /repos/{owner}/{repo}/autolinks"],\n createCommitComment: [\n "POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"\n ],\n createCommitSignatureProtection: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"\n ],\n createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"],\n createDeployKey: ["POST /repos/{owner}/{repo}/keys"],\n createDeployment: ["POST /repos/{owner}/{repo}/deployments"],\n createDeploymentBranchPolicy: [\n "POST /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies"\n ],\n createDeploymentProtectionRule: [\n "POST /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules"\n ],\n createDeploymentStatus: [\n "POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"\n ],\n createDispatchEvent: ["POST /repos/{owner}/{repo}/dispatches"],\n createForAuthenticatedUser: ["POST /user/repos"],\n createFork: ["POST /repos/{owner}/{repo}/forks"],\n createInOrg: ["POST /orgs/{org}/repos"],\n createOrUpdateEnvironment: [\n "PUT /repos/{owner}/{repo}/environments/{environment_name}"\n ],\n createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"],\n createOrgRuleset: ["POST /orgs/{org}/rulesets"],\n createPagesDeployment: ["POST /repos/{owner}/{repo}/pages/deployment"],\n createPagesSite: ["POST /repos/{owner}/{repo}/pages"],\n createRelease: ["POST /repos/{owner}/{repo}/releases"],\n createRepoRuleset: ["POST /repos/{owner}/{repo}/rulesets"],\n createTagProtection: ["POST /repos/{owner}/{repo}/tags/protection"],\n createUsingTemplate: [\n "POST /repos/{template_owner}/{template_repo}/generate"\n ],\n createWebhook: ["POST /repos/{owner}/{repo}/hooks"],\n declineInvitation: [\n "DELETE /user/repository_invitations/{invitation_id}",\n {},\n { renamed: ["repos", "declineInvitationForAuthenticatedUser"] }\n ],\n declineInvitationForAuthenticatedUser: [\n "DELETE /user/repository_invitations/{invitation_id}"\n ],\n delete: ["DELETE /repos/{owner}/{repo}"],\n deleteAccessRestrictions: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"\n ],\n deleteAdminBranchProtection: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"\n ],\n deleteAnEnvironment: [\n "DELETE /repos/{owner}/{repo}/environments/{environment_name}"\n ],\n deleteAutolink: ["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"],\n deleteBranchProtection: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection"\n ],\n deleteCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}"],\n deleteCommitSignatureProtection: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"\n ],\n deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"],\n deleteDeployment: [\n "DELETE /repos/{owner}/{repo}/deployments/{deployment_id}"\n ],\n deleteDeploymentBranchPolicy: [\n "DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"\n ],\n deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"],\n deleteInvitation: [\n "DELETE /repos/{owner}/{repo}/invitations/{invitation_id}"\n ],\n deleteOrgRuleset: ["DELETE /orgs/{org}/rulesets/{ruleset_id}"],\n deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages"],\n deletePullRequestReviewProtection: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"\n ],\n deleteRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}"],\n deleteReleaseAsset: [\n "DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}"\n ],\n deleteRepoRuleset: ["DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id}"],\n deleteTagProtection: [\n "DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id}"\n ],\n deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"],\n disableAutomatedSecurityFixes: [\n "DELETE /repos/{owner}/{repo}/automated-security-fixes"\n ],\n disableDeploymentProtectionRule: [\n "DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}"\n ],\n disablePrivateVulnerabilityReporting: [\n "DELETE /repos/{owner}/{repo}/private-vulnerability-reporting"\n ],\n disableVulnerabilityAlerts: [\n "DELETE /repos/{owner}/{repo}/vulnerability-alerts"\n ],\n downloadArchive: [\n "GET /repos/{owner}/{repo}/zipball/{ref}",\n {},\n { renamed: ["repos", "downloadZipballArchive"] }\n ],\n downloadTarballArchive: ["GET /repos/{owner}/{repo}/tarball/{ref}"],\n downloadZipballArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}"],\n enableAutomatedSecurityFixes: [\n "PUT /repos/{owner}/{repo}/automated-security-fixes"\n ],\n enablePrivateVulnerabilityReporting: [\n "PUT /repos/{owner}/{repo}/private-vulnerability-reporting"\n ],\n enableVulnerabilityAlerts: [\n "PUT /repos/{owner}/{repo}/vulnerability-alerts"\n ],\n generateReleaseNotes: [\n "POST /repos/{owner}/{repo}/releases/generate-notes"\n ],\n get: ["GET /repos/{owner}/{repo}"],\n getAccessRestrictions: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"\n ],\n getAdminBranchProtection: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"\n ],\n getAllDeploymentProtectionRules: [\n "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules"\n ],\n getAllEnvironments: ["GET /repos/{owner}/{repo}/environments"],\n getAllStatusCheckContexts: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts"\n ],\n getAllTopics: ["GET /repos/{owner}/{repo}/topics"],\n getAppsWithAccessToProtectedBranch: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps"\n ],\n getAutolink: ["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"],\n getBranch: ["GET /repos/{owner}/{repo}/branches/{branch}"],\n getBranchProtection: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection"\n ],\n getBranchRules: ["GET /repos/{owner}/{repo}/rules/branches/{branch}"],\n getClones: ["GET /repos/{owner}/{repo}/traffic/clones"],\n getCodeFrequencyStats: ["GET /repos/{owner}/{repo}/stats/code_frequency"],\n getCollaboratorPermissionLevel: [\n "GET /repos/{owner}/{repo}/collaborators/{username}/permission"\n ],\n getCombinedStatusForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/status"],\n getCommit: ["GET /repos/{owner}/{repo}/commits/{ref}"],\n getCommitActivityStats: ["GET /repos/{owner}/{repo}/stats/commit_activity"],\n getCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}"],\n getCommitSignatureProtection: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"\n ],\n getCommunityProfileMetrics: ["GET /repos/{owner}/{repo}/community/profile"],\n getContent: ["GET /repos/{owner}/{repo}/contents/{path}"],\n getContributorsStats: ["GET /repos/{owner}/{repo}/stats/contributors"],\n getCustomDeploymentProtectionRule: [\n "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}"\n ],\n getCustomPropertiesValues: ["GET /repos/{owner}/{repo}/properties/values"],\n getDeployKey: ["GET /repos/{owner}/{repo}/keys/{key_id}"],\n getDeployment: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}"],\n getDeploymentBranchPolicy: [\n "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"\n ],\n getDeploymentStatus: [\n "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}"\n ],\n getEnvironment: [\n "GET /repos/{owner}/{repo}/environments/{environment_name}"\n ],\n getLatestPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/latest"],\n getLatestRelease: ["GET /repos/{owner}/{repo}/releases/latest"],\n getOrgRuleSuite: ["GET /orgs/{org}/rulesets/rule-suites/{rule_suite_id}"],\n getOrgRuleSuites: ["GET /orgs/{org}/rulesets/rule-suites"],\n getOrgRuleset: ["GET /orgs/{org}/rulesets/{ruleset_id}"],\n getOrgRulesets: ["GET /orgs/{org}/rulesets"],\n getPages: ["GET /repos/{owner}/{repo}/pages"],\n getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"],\n getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"],\n getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"],\n getPullRequestReviewProtection: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"\n ],\n getPunchCardStats: ["GET /repos/{owner}/{repo}/stats/punch_card"],\n getReadme: ["GET /repos/{owner}/{repo}/readme"],\n getReadmeInDirectory: ["GET /repos/{owner}/{repo}/readme/{dir}"],\n getRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}"],\n getReleaseAsset: ["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"],\n getReleaseByTag: ["GET /repos/{owner}/{repo}/releases/tags/{tag}"],\n getRepoRuleSuite: [\n "GET /repos/{owner}/{repo}/rulesets/rule-suites/{rule_suite_id}"\n ],\n getRepoRuleSuites: ["GET /repos/{owner}/{repo}/rulesets/rule-suites"],\n getRepoRuleset: ["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}"],\n getRepoRulesets: ["GET /repos/{owner}/{repo}/rulesets"],\n getStatusChecksProtection: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"\n ],\n getTeamsWithAccessToProtectedBranch: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams"\n ],\n getTopPaths: ["GET /repos/{owner}/{repo}/traffic/popular/paths"],\n getTopReferrers: ["GET /repos/{owner}/{repo}/traffic/popular/referrers"],\n getUsersWithAccessToProtectedBranch: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users"\n ],\n getViews: ["GET /repos/{owner}/{repo}/traffic/views"],\n getWebhook: ["GET /repos/{owner}/{repo}/hooks/{hook_id}"],\n getWebhookConfigForRepo: [\n "GET /repos/{owner}/{repo}/hooks/{hook_id}/config"\n ],\n getWebhookDelivery: [\n "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}"\n ],\n listActivities: ["GET /repos/{owner}/{repo}/activity"],\n listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"],\n listBranches: ["GET /repos/{owner}/{repo}/branches"],\n listBranchesForHeadCommit: [\n "GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head"\n ],\n listCollaborators: ["GET /repos/{owner}/{repo}/collaborators"],\n listCommentsForCommit: [\n "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments"\n ],\n listCommitCommentsForRepo: ["GET /repos/{owner}/{repo}/comments"],\n listCommitStatusesForRef: [\n "GET /repos/{owner}/{repo}/commits/{ref}/statuses"\n ],\n listCommits: ["GET /repos/{owner}/{repo}/commits"],\n listContributors: ["GET /repos/{owner}/{repo}/contributors"],\n listCustomDeploymentRuleIntegrations: [\n "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps"\n ],\n listDeployKeys: ["GET /repos/{owner}/{repo}/keys"],\n listDeploymentBranchPolicies: [\n "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies"\n ],\n listDeploymentStatuses: [\n "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"\n ],\n listDeployments: ["GET /repos/{owner}/{repo}/deployments"],\n listForAuthenticatedUser: ["GET /user/repos"],\n listForOrg: ["GET /orgs/{org}/repos"],\n listForUser: ["GET /users/{username}/repos"],\n listForks: ["GET /repos/{owner}/{repo}/forks"],\n listInvitations: ["GET /repos/{owner}/{repo}/invitations"],\n listInvitationsForAuthenticatedUser: ["GET /user/repository_invitations"],\n listLanguages: ["GET /repos/{owner}/{repo}/languages"],\n listPagesBuilds: ["GET /repos/{owner}/{repo}/pages/builds"],\n listPublic: ["GET /repositories"],\n listPullRequestsAssociatedWithCommit: [\n "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls"\n ],\n listReleaseAssets: [\n "GET /repos/{owner}/{repo}/releases/{release_id}/assets"\n ],\n listReleases: ["GET /repos/{owner}/{repo}/releases"],\n listTagProtection: ["GET /repos/{owner}/{repo}/tags/protection"],\n listTags: ["GET /repos/{owner}/{repo}/tags"],\n listTeams: ["GET /repos/{owner}/{repo}/teams"],\n listWebhookDeliveries: [\n "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries"\n ],\n listWebhooks: ["GET /repos/{owner}/{repo}/hooks"],\n merge: ["POST /repos/{owner}/{repo}/merges"],\n mergeUpstream: ["POST /repos/{owner}/{repo}/merge-upstream"],\n pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"],\n redeliverWebhookDelivery: [\n "POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"\n ],\n removeAppAccessRestrictions: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",\n {},\n { mapToData: "apps" }\n ],\n removeCollaborator: [\n "DELETE /repos/{owner}/{repo}/collaborators/{username}"\n ],\n removeStatusCheckContexts: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",\n {},\n { mapToData: "contexts" }\n ],\n removeStatusCheckProtection: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"\n ],\n removeTeamAccessRestrictions: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",\n {},\n { mapToData: "teams" }\n ],\n removeUserAccessRestrictions: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",\n {},\n { mapToData: "users" }\n ],\n renameBranch: ["POST /repos/{owner}/{repo}/branches/{branch}/rename"],\n replaceAllTopics: ["PUT /repos/{owner}/{repo}/topics"],\n requestPagesBuild: ["POST /repos/{owner}/{repo}/pages/builds"],\n setAdminBranchProtection: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"\n ],\n setAppAccessRestrictions: [\n "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",\n {},\n { mapToData: "apps" }\n ],\n setStatusCheckContexts: [\n "PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",\n {},\n { mapToData: "contexts" }\n ],\n setTeamAccessRestrictions: [\n "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",\n {},\n { mapToData: "teams" }\n ],\n setUserAccessRestrictions: [\n "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",\n {},\n { mapToData: "users" }\n ],\n testPushWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"],\n transfer: ["POST /repos/{owner}/{repo}/transfer"],\n update: ["PATCH /repos/{owner}/{repo}"],\n updateBranchProtection: [\n "PUT /repos/{owner}/{repo}/branches/{branch}/protection"\n ],\n updateCommitComment: ["PATCH /repos/{owner}/{repo}/comments/{comment_id}"],\n updateDeploymentBranchPolicy: [\n "PUT /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"\n ],\n updateInformationAboutPagesSite: ["PUT /repos/{owner}/{repo}/pages"],\n updateInvitation: [\n "PATCH /repos/{owner}/{repo}/invitations/{invitation_id}"\n ],\n updateOrgRuleset: ["PUT /orgs/{org}/rulesets/{ruleset_id}"],\n updatePullRequestReviewProtection: [\n "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"\n ],\n updateRelease: ["PATCH /repos/{owner}/{repo}/releases/{release_id}"],\n updateReleaseAsset: [\n "PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}"\n ],\n updateRepoRuleset: ["PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}"],\n updateStatusCheckPotection: [\n "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks",\n {},\n { renamed: ["repos", "updateStatusCheckProtection"] }\n ],\n updateStatusCheckProtection: [\n "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"\n ],\n updateWebhook: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"],\n updateWebhookConfigForRepo: [\n "PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config"\n ],\n uploadReleaseAsset: [\n "POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}",\n { baseUrl: "https://uploads.github.com" }\n ]\n },\n search: {\n code: ["GET /search/code"],\n commits: ["GET /search/commits"],\n issuesAndPullRequests: ["GET /search/issues"],\n labels: ["GET /search/labels"],\n repos: ["GET /search/repositories"],\n topics: ["GET /search/topics"],\n users: ["GET /search/users"]\n },\n secretScanning: {\n getAlert: [\n "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"\n ],\n listAlertsForEnterprise: [\n "GET /enterprises/{enterprise}/secret-scanning/alerts"\n ],\n listAlertsForOrg: ["GET /orgs/{org}/secret-scanning/alerts"],\n listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"],\n listLocationsForAlert: [\n "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations"\n ],\n updateAlert: [\n "PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"\n ]\n },\n securityAdvisories: {\n createPrivateVulnerabilityReport: [\n "POST /repos/{owner}/{repo}/security-advisories/reports"\n ],\n createRepositoryAdvisory: [\n "POST /repos/{owner}/{repo}/security-advisories"\n ],\n createRepositoryAdvisoryCveRequest: [\n "POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/cve"\n ],\n getGlobalAdvisory: ["GET /advisories/{ghsa_id}"],\n getRepositoryAdvisory: [\n "GET /repos/{owner}/{repo}/security-advisories/{ghsa_id}"\n ],\n listGlobalAdvisories: ["GET /advisories"],\n listOrgRepositoryAdvisories: ["GET /orgs/{org}/security-advisories"],\n listRepositoryAdvisories: ["GET /repos/{owner}/{repo}/security-advisories"],\n updateRepositoryAdvisory: [\n "PATCH /repos/{owner}/{repo}/security-advisories/{ghsa_id}"\n ]\n },\n teams: {\n addOrUpdateMembershipForUserInOrg: [\n "PUT /orgs/{org}/teams/{team_slug}/memberships/{username}"\n ],\n addOrUpdateProjectPermissionsInOrg: [\n "PUT /orgs/{org}/teams/{team_slug}/projects/{project_id}"\n ],\n addOrUpdateRepoPermissionsInOrg: [\n "PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"\n ],\n checkPermissionsForProjectInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/projects/{project_id}"\n ],\n checkPermissionsForRepoInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"\n ],\n create: ["POST /orgs/{org}/teams"],\n createDiscussionCommentInOrg: [\n "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"\n ],\n createDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions"],\n deleteDiscussionCommentInOrg: [\n "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"\n ],\n deleteDiscussionInOrg: [\n "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"\n ],\n deleteInOrg: ["DELETE /orgs/{org}/teams/{team_slug}"],\n getByName: ["GET /orgs/{org}/teams/{team_slug}"],\n getDiscussionCommentInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"\n ],\n getDiscussionInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"\n ],\n getMembershipForUserInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/memberships/{username}"\n ],\n list: ["GET /orgs/{org}/teams"],\n listChildInOrg: ["GET /orgs/{org}/teams/{team_slug}/teams"],\n listDiscussionCommentsInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"\n ],\n listDiscussionsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions"],\n listForAuthenticatedUser: ["GET /user/teams"],\n listMembersInOrg: ["GET /orgs/{org}/teams/{team_slug}/members"],\n listPendingInvitationsInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/invitations"\n ],\n listProjectsInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects"],\n listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"],\n removeMembershipForUserInOrg: [\n "DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}"\n ],\n removeProjectInOrg: [\n "DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id}"\n ],\n removeRepoInOrg: [\n "DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"\n ],\n updateDiscussionCommentInOrg: [\n "PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"\n ],\n updateDiscussionInOrg: [\n "PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"\n ],\n updateInOrg: ["PATCH /orgs/{org}/teams/{team_slug}"]\n },\n users: {\n addEmailForAuthenticated: [\n "POST /user/emails",\n {},\n { renamed: ["users", "addEmailForAuthenticatedUser"] }\n ],\n addEmailForAuthenticatedUser: ["POST /user/emails"],\n addSocialAccountForAuthenticatedUser: ["POST /user/social_accounts"],\n block: ["PUT /user/blocks/{username}"],\n checkBlocked: ["GET /user/blocks/{username}"],\n checkFollowingForUser: ["GET /users/{username}/following/{target_user}"],\n checkPersonIsFollowedByAuthenticated: ["GET /user/following/{username}"],\n createGpgKeyForAuthenticated: [\n "POST /user/gpg_keys",\n {},\n { renamed: ["users", "createGpgKeyForAuthenticatedUser"] }\n ],\n createGpgKeyForAuthenticatedUser: ["POST /user/gpg_keys"],\n createPublicSshKeyForAuthenticated: [\n "POST /user/keys",\n {},\n { renamed: ["users", "createPublicSshKeyForAuthenticatedUser"] }\n ],\n createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"],\n createSshSigningKeyForAuthenticatedUser: ["POST /user/ssh_signing_keys"],\n deleteEmailForAuthenticated: [\n "DELETE /user/emails",\n {},\n { renamed: ["users", "deleteEmailForAuthenticatedUser"] }\n ],\n deleteEmailForAuthenticatedUser: ["DELETE /user/emails"],\n deleteGpgKeyForAuthenticated: [\n "DELETE /user/gpg_keys/{gpg_key_id}",\n {},\n { renamed: ["users", "deleteGpgKeyForAuthenticatedUser"] }\n ],\n deleteGpgKeyForAuthenticatedUser: ["DELETE /user/gpg_keys/{gpg_key_id}"],\n deletePublicSshKeyForAuthenticated: [\n "DELETE /user/keys/{key_id}",\n {},\n { renamed: ["users", "deletePublicSshKeyForAuthenticatedUser"] }\n ],\n deletePublicSshKeyForAuthenticatedUser: ["DELETE /user/keys/{key_id}"],\n deleteSocialAccountForAuthenticatedUser: ["DELETE /user/social_accounts"],\n deleteSshSigningKeyForAuthenticatedUser: [\n "DELETE /user/ssh_signing_keys/{ssh_signing_key_id}"\n ],\n follow: ["PUT /user/following/{username}"],\n getAuthenticated: ["GET /user"],\n getByUsername: ["GET /users/{username}"],\n getContextForUser: ["GET /users/{username}/hovercard"],\n getGpgKeyForAuthenticated: [\n "GET /user/gpg_keys/{gpg_key_id}",\n {},\n { renamed: ["users", "getGpgKeyForAuthenticatedUser"] }\n ],\n getGpgKeyForAuthenticatedUser: ["GET /user/gpg_keys/{gpg_key_id}"],\n getPublicSshKeyForAuthenticated: [\n "GET /user/keys/{key_id}",\n {},\n { renamed: ["users", "getPublicSshKeyForAuthenticatedUser"] }\n ],\n getPublicSshKeyForAuthenticatedUser: ["GET /user/keys/{key_id}"],\n getSshSigningKeyForAuthenticatedUser: [\n "GET /user/ssh_signing_keys/{ssh_signing_key_id}"\n ],\n list: ["GET /users"],\n listBlockedByAuthenticated: [\n "GET /user/blocks",\n {},\n { renamed: ["users", "listBlockedByAuthenticatedUser"] }\n ],\n listBlockedByAuthenticatedUser: ["GET /user/blocks"],\n listEmailsForAuthenticated: [\n "GET /user/emails",\n {},\n { renamed: ["users", "listEmailsForAuthenticatedUser"] }\n ],\n listEmailsForAuthenticatedUser: ["GET /user/emails"],\n listFollowedByAuthenticated: [\n "GET /user/following",\n {},\n { renamed: ["users", "listFollowedByAuthenticatedUser"] }\n ],\n listFollowedByAuthenticatedUser: ["GET /user/following"],\n listFollowersForAuthenticatedUser: ["GET /user/followers"],\n listFollowersForUser: ["GET /users/{username}/followers"],\n listFollowingForUser: ["GET /users/{username}/following"],\n listGpgKeysForAuthenticated: [\n "GET /user/gpg_keys",\n {},\n { renamed: ["users", "listGpgKeysForAuthenticatedUser"] }\n ],\n listGpgKeysForAuthenticatedUser: ["GET /user/gpg_keys"],\n listGpgKeysForUser: ["GET /users/{username}/gpg_keys"],\n listPublicEmailsForAuthenticated: [\n "GET /user/public_emails",\n {},\n { renamed: ["users", "listPublicEmailsForAuthenticatedUser"] }\n ],\n listPublicEmailsForAuthenticatedUser: ["GET /user/public_emails"],\n listPublicKeysForUser: ["GET /users/{username}/keys"],\n listPublicSshKeysForAuthenticated: [\n "GET /user/keys",\n {},\n { renamed: ["users", "listPublicSshKeysForAuthenticatedUser"] }\n ],\n listPublicSshKeysForAuthenticatedUser: ["GET /user/keys"],\n listSocialAccountsForAuthenticatedUser: ["GET /user/social_accounts"],\n listSocialAccountsForUser: ["GET /users/{username}/social_accounts"],\n listSshSigningKeysForAuthenticatedUser: ["GET /user/ssh_signing_keys"],\n listSshSigningKeysForUser: ["GET /users/{username}/ssh_signing_keys"],\n setPrimaryEmailVisibilityForAuthenticated: [\n "PATCH /user/email/visibility",\n {},\n { renamed: ["users", "setPrimaryEmailVisibilityForAuthenticatedUser"] }\n ],\n setPrimaryEmailVisibilityForAuthenticatedUser: [\n "PATCH /user/email/visibility"\n ],\n unblock: ["DELETE /user/blocks/{username}"],\n unfollow: ["DELETE /user/following/{username}"],\n updateAuthenticated: ["PATCH /user"]\n }\n};\nvar endpoints_default = Endpoints;\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/plugin-rest-endpoint-methods/dist-src/endpoints-to-methods.js\n\nconst endpointMethodsMap = /* @__PURE__ */ new Map();\nfor (const [scope, endpoints] of Object.entries(endpoints_default)) {\n for (const [methodName, endpoint] of Object.entries(endpoints)) {\n const [route, defaults, decorations] = endpoint;\n const [method, url] = route.split(/ /);\n const endpointDefaults = Object.assign(\n {\n method,\n url\n },\n defaults\n );\n if (!endpointMethodsMap.has(scope)) {\n endpointMethodsMap.set(scope, /* @__PURE__ */ new Map());\n }\n endpointMethodsMap.get(scope).set(methodName, {\n scope,\n methodName,\n endpointDefaults,\n decorations\n });\n }\n}\nconst handler = {\n has({ scope }, methodName) {\n return endpointMethodsMap.get(scope).has(methodName);\n },\n getOwnPropertyDescriptor(target, methodName) {\n return {\n value: this.get(target, methodName),\n // ensures method is in the cache\n configurable: true,\n writable: true,\n enumerable: true\n };\n },\n defineProperty(target, methodName, descriptor) {\n Object.defineProperty(target.cache, methodName, descriptor);\n return true;\n },\n deleteProperty(target, methodName) {\n delete target.cache[methodName];\n return true;\n },\n ownKeys({ scope }) {\n return [...endpointMethodsMap.get(scope).keys()];\n },\n set(target, methodName, value) {\n return target.cache[methodName] = value;\n },\n get({ octokit, scope, cache }, methodName) {\n if (cache[methodName]) {\n return cache[methodName];\n }\n const method = endpointMethodsMap.get(scope).get(methodName);\n if (!method) {\n return void 0;\n }\n const { endpointDefaults, decorations } = method;\n if (decorations) {\n cache[methodName] = decorate(\n octokit,\n scope,\n methodName,\n endpointDefaults,\n decorations\n );\n } else {\n cache[methodName] = octokit.request.defaults(endpointDefaults);\n }\n return cache[methodName];\n }\n};\nfunction endpointsToMethods(octokit) {\n const newMethods = {};\n for (const scope of endpointMethodsMap.keys()) {\n newMethods[scope] = new Proxy({ octokit, scope, cache: {} }, handler);\n }\n return newMethods;\n}\nfunction decorate(octokit, scope, methodName, defaults, decorations) {\n const requestWithDefaults = octokit.request.defaults(defaults);\n function withDecorations(...args) {\n let options = requestWithDefaults.endpoint.merge(...args);\n if (decorations.mapToData) {\n options = Object.assign({}, options, {\n data: options[decorations.mapToData],\n [decorations.mapToData]: void 0\n });\n return requestWithDefaults(options);\n }\n if (decorations.renamed) {\n const [newScope, newMethodName] = decorations.renamed;\n octokit.log.warn(\n `octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()`\n );\n }\n if (decorations.deprecated) {\n octokit.log.warn(decorations.deprecated);\n }\n if (decorations.renamedParameters) {\n const options2 = requestWithDefaults.endpoint.merge(...args);\n for (const [name, alias] of Object.entries(\n decorations.renamedParameters\n )) {\n if (name in options2) {\n octokit.log.warn(\n `"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead`\n );\n if (!(alias in options2)) {\n options2[alias] = options2[name];\n }\n delete options2[name];\n }\n }\n return requestWithDefaults(options2);\n }\n return requestWithDefaults(...args);\n }\n return Object.assign(withDecorations, requestWithDefaults);\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/plugin-rest-endpoint-methods/dist-src/index.js\n\n\nfunction restEndpointMethods(octokit) {\n const api = endpointsToMethods(octokit);\n return {\n rest: api\n };\n}\nrestEndpointMethods.VERSION = VERSION;\nfunction legacyRestEndpointMethods(octokit) {\n const api = endpointsToMethods(octokit);\n return {\n ...api,\n rest: api\n };\n}\nlegacyRestEndpointMethods.VERSION = VERSION;\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QU0sR0FBRyxXQUFXLGlDQUFpQyxTQUFTLEdBQUcsY0FBYztBQUNsRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsS0FBSyx5Q0FBeUMsTUFBTSxHQUFHLFdBQVcsWUFBWSxNQUFNO0FBQ3BHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0U7OztBQzVIcUM7QUFDd0I7QUFDL0Q7QUFDQSxjQUFjLGtCQUFrQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixPQUFPO0FBQ3JDO0FBQ0EsY0FBYyxrQkFBa0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxPQUFPO0FBSXpDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvcGx1Z2luLXJlc3QtZW5kcG9pbnQtbWV0aG9kcy9kaXN0LXNyYy92ZXJzaW9uLmpzPzljYTYiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvcGx1Z2luLXJlc3QtZW5kcG9pbnQtbWV0aG9kcy9kaXN0LXNyYy9nZW5lcmF0ZWQvZW5kcG9pbnRzLmpzPzk0NDIiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvcGx1Z2luLXJlc3QtZW5kcG9pbnQtbWV0aG9kcy9kaXN0LXNyYy9lbmRwb2ludHMtdG8tbWV0aG9kcy5qcz80NTY4Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3BsdWdpbi1yZXN0LWVuZHBvaW50LW1ldGhvZHMvZGlzdC1zcmMvaW5kZXguanM/YWEzNiJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBWRVJTSU9OID0gXCIxMC4yLjBcIjtcbmV4cG9ydCB7XG4gIFZFUlNJT05cbn07XG4iLCJjb25zdCBFbmRwb2ludHMgPSB7XG4gIGFjdGlvbnM6IHtcbiAgICBhZGRDdXN0b21MYWJlbHNUb1NlbGZIb3N0ZWRSdW5uZXJGb3JPcmc6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCJcbiAgICBdLFxuICAgIGFkZEN1c3RvbUxhYmVsc1RvU2VsZkhvc3RlZFJ1bm5lckZvclJlcG86IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiXG4gICAgXSxcbiAgICBhZGRTZWxlY3RlZFJlcG9Ub09yZ1NlY3JldDogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICBhZGRTZWxlY3RlZFJlcG9Ub09yZ1ZhcmlhYmxlOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICBhcHByb3ZlV29ya2Zsb3dSdW46IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2FwcHJvdmVcIlxuICAgIF0sXG4gICAgY2FuY2VsV29ya2Zsb3dSdW46IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2NhbmNlbFwiXG4gICAgXSxcbiAgICBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS92YXJpYWJsZXNcIlxuICAgIF0sXG4gICAgY3JlYXRlT3JVcGRhdGVFbnZpcm9ubWVudFNlY3JldDogW1xuICAgICAgXCJQVVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgY3JlYXRlT3JVcGRhdGVPcmdTZWNyZXQ6IFtcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXSxcbiAgICBjcmVhdGVPclVwZGF0ZVJlcG9TZWNyZXQ6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXG4gICAgXSxcbiAgICBjcmVhdGVPcmdWYXJpYWJsZTogW1wiUE9TVCAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlc1wiXSxcbiAgICBjcmVhdGVSZWdpc3RyYXRpb25Ub2tlbkZvck9yZzogW1xuICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy9yZWdpc3RyYXRpb24tdG9rZW5cIlxuICAgIF0sXG4gICAgY3JlYXRlUmVnaXN0cmF0aW9uVG9rZW5Gb3JSZXBvOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy9yZWdpc3RyYXRpb24tdG9rZW5cIlxuICAgIF0sXG4gICAgY3JlYXRlUmVtb3ZlVG9rZW5Gb3JPcmc6IFtcIlBPU1QgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL3JlbW92ZS10b2tlblwiXSxcbiAgICBjcmVhdGVSZW1vdmVUb2tlbkZvclJlcG86IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3JlbW92ZS10b2tlblwiXG4gICAgXSxcbiAgICBjcmVhdGVSZXBvVmFyaWFibGU6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvdmFyaWFibGVzXCJdLFxuICAgIGNyZWF0ZVdvcmtmbG93RGlzcGF0Y2g6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9kaXNwYXRjaGVzXCJcbiAgICBdLFxuICAgIGRlbGV0ZUFjdGlvbnNDYWNoZUJ5SWQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2NhY2hlcy97Y2FjaGVfaWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUFjdGlvbnNDYWNoZUJ5S2V5OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9jYWNoZXN7P2tleSxyZWZ9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUFydGlmYWN0OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9hcnRpZmFjdHMve2FydGlmYWN0X2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVFbnZpcm9ubWVudFNlY3JldDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlRW52aXJvbm1lbnRWYXJpYWJsZTogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS92YXJpYWJsZXMve25hbWV9XCJcbiAgICBdLFxuICAgIGRlbGV0ZU9yZ1NlY3JldDogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGRlbGV0ZU9yZ1ZhcmlhYmxlOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vYWN0aW9ucy92YXJpYWJsZXMve25hbWV9XCJdLFxuICAgIGRlbGV0ZVJlcG9TZWNyZXQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXG4gICAgXSxcbiAgICBkZWxldGVSZXBvVmFyaWFibGU6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlU2VsZkhvc3RlZFJ1bm5lckZyb21Pcmc6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVTZWxmSG9zdGVkUnVubmVyRnJvbVJlcG86IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlV29ya2Zsb3dSdW46IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9XCJdLFxuICAgIGRlbGV0ZVdvcmtmbG93UnVuTG9nczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9sb2dzXCJcbiAgICBdLFxuICAgIGRpc2FibGVTZWxlY3RlZFJlcG9zaXRvcnlHaXRodWJBY3Rpb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgZGlzYWJsZVdvcmtmbG93OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9kaXNhYmxlXCJcbiAgICBdLFxuICAgIGRvd25sb2FkQXJ0aWZhY3Q6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2FydGlmYWN0cy97YXJ0aWZhY3RfaWR9L3thcmNoaXZlX2Zvcm1hdH1cIlxuICAgIF0sXG4gICAgZG93bmxvYWRKb2JMb2dzRm9yV29ya2Zsb3dSdW46IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2pvYnMve2pvYl9pZH0vbG9nc1wiXG4gICAgXSxcbiAgICBkb3dubG9hZFdvcmtmbG93UnVuQXR0ZW1wdExvZ3M6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vYXR0ZW1wdHMve2F0dGVtcHRfbnVtYmVyfS9sb2dzXCJcbiAgICBdLFxuICAgIGRvd25sb2FkV29ya2Zsb3dSdW5Mb2dzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2xvZ3NcIlxuICAgIF0sXG4gICAgZW5hYmxlU2VsZWN0ZWRSZXBvc2l0b3J5R2l0aHViQWN0aW9uc09yZ2FuaXphdGlvbjogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIGVuYWJsZVdvcmtmbG93OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9lbmFibGVcIlxuICAgIF0sXG4gICAgZm9yY2VDYW5jZWxXb3JrZmxvd1J1bjogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vZm9yY2UtY2FuY2VsXCJcbiAgICBdLFxuICAgIGdlbmVyYXRlUnVubmVySml0Y29uZmlnRm9yT3JnOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL2dlbmVyYXRlLWppdGNvbmZpZ1wiXG4gICAgXSxcbiAgICBnZW5lcmF0ZVJ1bm5lckppdGNvbmZpZ0ZvclJlcG86IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL2dlbmVyYXRlLWppdGNvbmZpZ1wiXG4gICAgXSxcbiAgICBnZXRBY3Rpb25zQ2FjaGVMaXN0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvY2FjaGVzXCJdLFxuICAgIGdldEFjdGlvbnNDYWNoZVVzYWdlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvY2FjaGUvdXNhZ2VcIl0sXG4gICAgZ2V0QWN0aW9uc0NhY2hlVXNhZ2VCeVJlcG9Gb3JPcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvY2FjaGUvdXNhZ2UtYnktcmVwb3NpdG9yeVwiXG4gICAgXSxcbiAgICBnZXRBY3Rpb25zQ2FjaGVVc2FnZUZvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvY2FjaGUvdXNhZ2VcIl0sXG4gICAgZ2V0QWxsb3dlZEFjdGlvbnNPcmdhbml6YXRpb246IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvc2VsZWN0ZWQtYWN0aW9uc1wiXG4gICAgXSxcbiAgICBnZXRBbGxvd2VkQWN0aW9uc1JlcG9zaXRvcnk6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zL3NlbGVjdGVkLWFjdGlvbnNcIlxuICAgIF0sXG4gICAgZ2V0QXJ0aWZhY3Q6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9hcnRpZmFjdHMve2FydGlmYWN0X2lkfVwiXSxcbiAgICBnZXRFbnZpcm9ubWVudFB1YmxpY0tleTogW1xuICAgICAgXCJHRVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzL3B1YmxpYy1rZXlcIlxuICAgIF0sXG4gICAgZ2V0RW52aXJvbm1lbnRTZWNyZXQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGdldEVudmlyb25tZW50VmFyaWFibGU6IFtcbiAgICAgIFwiR0VUIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vdmFyaWFibGVzL3tuYW1lfVwiXG4gICAgXSxcbiAgICBnZXRHaXRodWJBY3Rpb25zRGVmYXVsdFdvcmtmbG93UGVybWlzc2lvbnNPcmdhbml6YXRpb246IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvd29ya2Zsb3dcIlxuICAgIF0sXG4gICAgZ2V0R2l0aHViQWN0aW9uc0RlZmF1bHRXb3JrZmxvd1Blcm1pc3Npb25zUmVwb3NpdG9yeTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnMvd29ya2Zsb3dcIlxuICAgIF0sXG4gICAgZ2V0R2l0aHViQWN0aW9uc1Blcm1pc3Npb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zXCJcbiAgICBdLFxuICAgIGdldEdpdGh1YkFjdGlvbnNQZXJtaXNzaW9uc1JlcG9zaXRvcnk6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zXCJcbiAgICBdLFxuICAgIGdldEpvYkZvcldvcmtmbG93UnVuOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvam9icy97am9iX2lkfVwiXSxcbiAgICBnZXRPcmdQdWJsaWNLZXk6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleVwiXSxcbiAgICBnZXRPcmdTZWNyZXQ6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXSxcbiAgICBnZXRPcmdWYXJpYWJsZTogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvdmFyaWFibGVzL3tuYW1lfVwiXSxcbiAgICBnZXRQZW5kaW5nRGVwbG95bWVudHNGb3JSdW46IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vcGVuZGluZ19kZXBsb3ltZW50c1wiXG4gICAgXSxcbiAgICBnZXRSZXBvUGVybWlzc2lvbnM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1wiYWN0aW9uc1wiLCBcImdldEdpdGh1YkFjdGlvbnNQZXJtaXNzaW9uc1JlcG9zaXRvcnlcIl0gfVxuICAgIF0sXG4gICAgZ2V0UmVwb1B1YmxpY0tleTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleVwiXSxcbiAgICBnZXRSZXBvU2VjcmV0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGdldFJlcG9WYXJpYWJsZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX1cIl0sXG4gICAgZ2V0UmV2aWV3c0ZvclJ1bjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hcHByb3ZhbHNcIlxuICAgIF0sXG4gICAgZ2V0U2VsZkhvc3RlZFJ1bm5lckZvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfVwiXSxcbiAgICBnZXRTZWxmSG9zdGVkUnVubmVyRm9yUmVwbzogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfVwiXG4gICAgXSxcbiAgICBnZXRXb3JrZmxvdzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93cy97d29ya2Zsb3dfaWR9XCJdLFxuICAgIGdldFdvcmtmbG93QWNjZXNzVG9SZXBvc2l0b3J5OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9wZXJtaXNzaW9ucy9hY2Nlc3NcIlxuICAgIF0sXG4gICAgZ2V0V29ya2Zsb3dSdW46IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9XCJdLFxuICAgIGdldFdvcmtmbG93UnVuQXR0ZW1wdDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hdHRlbXB0cy97YXR0ZW1wdF9udW1iZXJ9XCJcbiAgICBdLFxuICAgIGdldFdvcmtmbG93UnVuVXNhZ2U6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vdGltaW5nXCJcbiAgICBdLFxuICAgIGdldFdvcmtmbG93VXNhZ2U6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93cy97d29ya2Zsb3dfaWR9L3RpbWluZ1wiXG4gICAgXSxcbiAgICBsaXN0QXJ0aWZhY3RzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2FydGlmYWN0c1wiXSxcbiAgICBsaXN0RW52aXJvbm1lbnRTZWNyZXRzOiBbXG4gICAgICBcIkdFVCAvcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L3NlY3JldHNcIlxuICAgIF0sXG4gICAgbGlzdEVudmlyb25tZW50VmFyaWFibGVzOiBbXG4gICAgICBcIkdFVCAvcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L3ZhcmlhYmxlc1wiXG4gICAgXSxcbiAgICBsaXN0Sm9ic0ZvcldvcmtmbG93UnVuOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2pvYnNcIlxuICAgIF0sXG4gICAgbGlzdEpvYnNGb3JXb3JrZmxvd1J1bkF0dGVtcHQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vYXR0ZW1wdHMve2F0dGVtcHRfbnVtYmVyfS9qb2JzXCJcbiAgICBdLFxuICAgIGxpc3RMYWJlbHNGb3JTZWxmSG9zdGVkUnVubmVyRm9yT3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCJcbiAgICBdLFxuICAgIGxpc3RMYWJlbHNGb3JTZWxmSG9zdGVkUnVubmVyRm9yUmVwbzogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIlxuICAgIF0sXG4gICAgbGlzdE9yZ1NlY3JldHM6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHNcIl0sXG4gICAgbGlzdE9yZ1ZhcmlhYmxlczogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvdmFyaWFibGVzXCJdLFxuICAgIGxpc3RSZXBvT3JnYW5pemF0aW9uU2VjcmV0czogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvb3JnYW5pemF0aW9uLXNlY3JldHNcIlxuICAgIF0sXG4gICAgbGlzdFJlcG9Pcmdhbml6YXRpb25WYXJpYWJsZXM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL29yZ2FuaXphdGlvbi12YXJpYWJsZXNcIlxuICAgIF0sXG4gICAgbGlzdFJlcG9TZWNyZXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0c1wiXSxcbiAgICBsaXN0UmVwb1ZhcmlhYmxlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3ZhcmlhYmxlc1wiXSxcbiAgICBsaXN0UmVwb1dvcmtmbG93czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93c1wiXSxcbiAgICBsaXN0UnVubmVyQXBwbGljYXRpb25zRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL2Rvd25sb2Fkc1wiXSxcbiAgICBsaXN0UnVubmVyQXBwbGljYXRpb25zRm9yUmVwbzogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy9kb3dubG9hZHNcIlxuICAgIF0sXG4gICAgbGlzdFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBsaXN0U2VsZWN0ZWRSZXBvc0Zvck9yZ1ZhcmlhYmxlOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX0vcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIGxpc3RTZWxlY3RlZFJlcG9zaXRvcmllc0VuYWJsZWRHaXRodWJBY3Rpb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zL3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBsaXN0U2VsZkhvc3RlZFJ1bm5lcnNGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnNcIl0sXG4gICAgbGlzdFNlbGZIb3N0ZWRSdW5uZXJzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnNcIl0sXG4gICAgbGlzdFdvcmtmbG93UnVuQXJ0aWZhY3RzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2FydGlmYWN0c1wiXG4gICAgXSxcbiAgICBsaXN0V29ya2Zsb3dSdW5zOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9ydW5zXCJcbiAgICBdLFxuICAgIGxpc3RXb3JrZmxvd1J1bnNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVuc1wiXSxcbiAgICByZVJ1bkpvYkZvcldvcmtmbG93UnVuOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvam9icy97am9iX2lkfS9yZXJ1blwiXG4gICAgXSxcbiAgICByZVJ1bldvcmtmbG93OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vcmVydW5cIl0sXG4gICAgcmVSdW5Xb3JrZmxvd0ZhaWxlZEpvYnM6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L3JlcnVuLWZhaWxlZC1qb2JzXCJcbiAgICBdLFxuICAgIHJlbW92ZUFsbEN1c3RvbUxhYmVsc0Zyb21TZWxmSG9zdGVkUnVubmVyRm9yT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCJcbiAgICBdLFxuICAgIHJlbW92ZUFsbEN1c3RvbUxhYmVsc0Zyb21TZWxmSG9zdGVkUnVubmVyRm9yUmVwbzogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIlxuICAgIF0sXG4gICAgcmVtb3ZlQ3VzdG9tTGFiZWxGcm9tU2VsZkhvc3RlZFJ1bm5lckZvck9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVscy97bmFtZX1cIlxuICAgIF0sXG4gICAgcmVtb3ZlQ3VzdG9tTGFiZWxGcm9tU2VsZkhvc3RlZFJ1bm5lckZvclJlcG86IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzL3tuYW1lfVwiXG4gICAgXSxcbiAgICByZW1vdmVTZWxlY3RlZFJlcG9Gcm9tT3JnU2VjcmV0OiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIHJlbW92ZVNlbGVjdGVkUmVwb0Zyb21PcmdWYXJpYWJsZTogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vYWN0aW9ucy92YXJpYWJsZXMve25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgcmV2aWV3Q3VzdG9tR2F0ZXNGb3JSdW46IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2RlcGxveW1lbnRfcHJvdGVjdGlvbl9ydWxlXCJcbiAgICBdLFxuICAgIHJldmlld1BlbmRpbmdEZXBsb3ltZW50c0ZvclJ1bjogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vcGVuZGluZ19kZXBsb3ltZW50c1wiXG4gICAgXSxcbiAgICBzZXRBbGxvd2VkQWN0aW9uc09yZ2FuaXphdGlvbjogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9zZWxlY3RlZC1hY3Rpb25zXCJcbiAgICBdLFxuICAgIHNldEFsbG93ZWRBY3Rpb25zUmVwb3NpdG9yeTogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnMvc2VsZWN0ZWQtYWN0aW9uc1wiXG4gICAgXSxcbiAgICBzZXRDdXN0b21MYWJlbHNGb3JTZWxmSG9zdGVkUnVubmVyRm9yT3JnOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCJcbiAgICBdLFxuICAgIHNldEN1c3RvbUxhYmVsc0ZvclNlbGZIb3N0ZWRSdW5uZXJGb3JSZXBvOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiXG4gICAgXSxcbiAgICBzZXRHaXRodWJBY3Rpb25zRGVmYXVsdFdvcmtmbG93UGVybWlzc2lvbnNPcmdhbml6YXRpb246IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvd29ya2Zsb3dcIlxuICAgIF0sXG4gICAgc2V0R2l0aHViQWN0aW9uc0RlZmF1bHRXb3JrZmxvd1Blcm1pc3Npb25zUmVwb3NpdG9yeTogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnMvd29ya2Zsb3dcIlxuICAgIF0sXG4gICAgc2V0R2l0aHViQWN0aW9uc1Blcm1pc3Npb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zXCJcbiAgICBdLFxuICAgIHNldEdpdGh1YkFjdGlvbnNQZXJtaXNzaW9uc1JlcG9zaXRvcnk6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zXCJcbiAgICBdLFxuICAgIHNldFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBzZXRTZWxlY3RlZFJlcG9zRm9yT3JnVmFyaWFibGU6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvdmFyaWFibGVzL3tuYW1lfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgc2V0U2VsZWN0ZWRSZXBvc2l0b3JpZXNFbmFibGVkR2l0aHViQWN0aW9uc09yZ2FuaXphdGlvbjogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgc2V0V29ya2Zsb3dBY2Nlc3NUb1JlcG9zaXRvcnk6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zL2FjY2Vzc1wiXG4gICAgXSxcbiAgICB1cGRhdGVFbnZpcm9ubWVudFZhcmlhYmxlOiBbXG4gICAgICBcIlBBVENIIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vdmFyaWFibGVzL3tuYW1lfVwiXG4gICAgXSxcbiAgICB1cGRhdGVPcmdWYXJpYWJsZTogW1wiUEFUQ0ggL29yZ3Mve29yZ30vYWN0aW9ucy92YXJpYWJsZXMve25hbWV9XCJdLFxuICAgIHVwZGF0ZVJlcG9WYXJpYWJsZTogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy92YXJpYWJsZXMve25hbWV9XCJcbiAgICBdXG4gIH0sXG4gIGFjdGl2aXR5OiB7XG4gICAgY2hlY2tSZXBvSXNTdGFycmVkQnlBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3N0YXJyZWQve293bmVyfS97cmVwb31cIl0sXG4gICAgZGVsZXRlUmVwb1N1YnNjcmlwdGlvbjogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdWJzY3JpcHRpb25cIl0sXG4gICAgZGVsZXRlVGhyZWFkU3Vic2NyaXB0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvbm90aWZpY2F0aW9ucy90aHJlYWRzL3t0aHJlYWRfaWR9L3N1YnNjcmlwdGlvblwiXG4gICAgXSxcbiAgICBnZXRGZWVkczogW1wiR0VUIC9mZWVkc1wiXSxcbiAgICBnZXRSZXBvU3Vic2NyaXB0aW9uOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N1YnNjcmlwdGlvblwiXSxcbiAgICBnZXRUaHJlYWQ6IFtcIkdFVCAvbm90aWZpY2F0aW9ucy90aHJlYWRzL3t0aHJlYWRfaWR9XCJdLFxuICAgIGdldFRocmVhZFN1YnNjcmlwdGlvbkZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvbm90aWZpY2F0aW9ucy90aHJlYWRzL3t0aHJlYWRfaWR9L3N1YnNjcmlwdGlvblwiXG4gICAgXSxcbiAgICBsaXN0RXZlbnRzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ldmVudHNcIl0sXG4gICAgbGlzdE5vdGlmaWNhdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC9ub3RpZmljYXRpb25zXCJdLFxuICAgIGxpc3RPcmdFdmVudHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZXZlbnRzL29yZ3Mve29yZ31cIlxuICAgIF0sXG4gICAgbGlzdFB1YmxpY0V2ZW50czogW1wiR0VUIC9ldmVudHNcIl0sXG4gICAgbGlzdFB1YmxpY0V2ZW50c0ZvclJlcG9OZXR3b3JrOiBbXCJHRVQgL25ldHdvcmtzL3tvd25lcn0ve3JlcG99L2V2ZW50c1wiXSxcbiAgICBsaXN0UHVibGljRXZlbnRzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2V2ZW50cy9wdWJsaWNcIl0sXG4gICAgbGlzdFB1YmxpY09yZ0V2ZW50czogW1wiR0VUIC9vcmdzL3tvcmd9L2V2ZW50c1wiXSxcbiAgICBsaXN0UmVjZWl2ZWRFdmVudHNGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVjZWl2ZWRfZXZlbnRzXCJdLFxuICAgIGxpc3RSZWNlaXZlZFB1YmxpY0V2ZW50c0ZvclVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3JlY2VpdmVkX2V2ZW50cy9wdWJsaWNcIlxuICAgIF0sXG4gICAgbGlzdFJlcG9FdmVudHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZXZlbnRzXCJdLFxuICAgIGxpc3RSZXBvTm90aWZpY2F0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbm90aWZpY2F0aW9uc1wiXG4gICAgXSxcbiAgICBsaXN0UmVwb3NTdGFycmVkQnlBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3N0YXJyZWRcIl0sXG4gICAgbGlzdFJlcG9zU3RhcnJlZEJ5VXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3N0YXJyZWRcIl0sXG4gICAgbGlzdFJlcG9zV2F0Y2hlZEJ5VXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3N1YnNjcmlwdGlvbnNcIl0sXG4gICAgbGlzdFN0YXJnYXplcnNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N0YXJnYXplcnNcIl0sXG4gICAgbGlzdFdhdGNoZWRSZXBvc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvc3Vic2NyaXB0aW9uc1wiXSxcbiAgICBsaXN0V2F0Y2hlcnNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N1YnNjcmliZXJzXCJdLFxuICAgIG1hcmtOb3RpZmljYXRpb25zQXNSZWFkOiBbXCJQVVQgL25vdGlmaWNhdGlvbnNcIl0sXG4gICAgbWFya1JlcG9Ob3RpZmljYXRpb25zQXNSZWFkOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L25vdGlmaWNhdGlvbnNcIl0sXG4gICAgbWFya1RocmVhZEFzUmVhZDogW1wiUEFUQ0ggL25vdGlmaWNhdGlvbnMvdGhyZWFkcy97dGhyZWFkX2lkfVwiXSxcbiAgICBzZXRSZXBvU3Vic2NyaXB0aW9uOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N1YnNjcmlwdGlvblwiXSxcbiAgICBzZXRUaHJlYWRTdWJzY3JpcHRpb246IFtcbiAgICAgIFwiUFVUIC9ub3RpZmljYXRpb25zL3RocmVhZHMve3RocmVhZF9pZH0vc3Vic2NyaXB0aW9uXCJcbiAgICBdLFxuICAgIHN0YXJSZXBvRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBVVCAvdXNlci9zdGFycmVkL3tvd25lcn0ve3JlcG99XCJdLFxuICAgIHVuc3RhclJlcG9Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL3N0YXJyZWQve293bmVyfS97cmVwb31cIl1cbiAgfSxcbiAgYXBwczoge1xuICAgIGFkZFJlcG9Ub0luc3RhbGxhdGlvbjogW1xuICAgICAgXCJQVVQgL3VzZXIvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1wiYXBwc1wiLCBcImFkZFJlcG9Ub0luc3RhbGxhdGlvbkZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGFkZFJlcG9Ub0luc3RhbGxhdGlvbkZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBVVCAvdXNlci9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgY2hlY2tUb2tlbjogW1wiUE9TVCAvYXBwbGljYXRpb25zL3tjbGllbnRfaWR9L3Rva2VuXCJdLFxuICAgIGNyZWF0ZUZyb21NYW5pZmVzdDogW1wiUE9TVCAvYXBwLW1hbmlmZXN0cy97Y29kZX0vY29udmVyc2lvbnNcIl0sXG4gICAgY3JlYXRlSW5zdGFsbGF0aW9uQWNjZXNzVG9rZW46IFtcbiAgICAgIFwiUE9TVCAvYXBwL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vYWNjZXNzX3Rva2Vuc1wiXG4gICAgXSxcbiAgICBkZWxldGVBdXRob3JpemF0aW9uOiBbXCJERUxFVEUgL2FwcGxpY2F0aW9ucy97Y2xpZW50X2lkfS9ncmFudFwiXSxcbiAgICBkZWxldGVJbnN0YWxsYXRpb246IFtcIkRFTEVURSAvYXBwL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH1cIl0sXG4gICAgZGVsZXRlVG9rZW46IFtcIkRFTEVURSAvYXBwbGljYXRpb25zL3tjbGllbnRfaWR9L3Rva2VuXCJdLFxuICAgIGdldEF1dGhlbnRpY2F0ZWQ6IFtcIkdFVCAvYXBwXCJdLFxuICAgIGdldEJ5U2x1ZzogW1wiR0VUIC9hcHBzL3thcHBfc2x1Z31cIl0sXG4gICAgZ2V0SW5zdGFsbGF0aW9uOiBbXCJHRVQgL2FwcC9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9XCJdLFxuICAgIGdldE9yZ0luc3RhbGxhdGlvbjogW1wiR0VUIC9vcmdzL3tvcmd9L2luc3RhbGxhdGlvblwiXSxcbiAgICBnZXRSZXBvSW5zdGFsbGF0aW9uOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2luc3RhbGxhdGlvblwiXSxcbiAgICBnZXRTdWJzY3JpcHRpb25QbGFuRm9yQWNjb3VudDogW1xuICAgICAgXCJHRVQgL21hcmtldHBsYWNlX2xpc3RpbmcvYWNjb3VudHMve2FjY291bnRfaWR9XCJcbiAgICBdLFxuICAgIGdldFN1YnNjcmlwdGlvblBsYW5Gb3JBY2NvdW50U3R1YmJlZDogW1xuICAgICAgXCJHRVQgL21hcmtldHBsYWNlX2xpc3Rpbmcvc3R1YmJlZC9hY2NvdW50cy97YWNjb3VudF9pZH1cIlxuICAgIF0sXG4gICAgZ2V0VXNlckluc3RhbGxhdGlvbjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2luc3RhbGxhdGlvblwiXSxcbiAgICBnZXRXZWJob29rQ29uZmlnRm9yQXBwOiBbXCJHRVQgL2FwcC9ob29rL2NvbmZpZ1wiXSxcbiAgICBnZXRXZWJob29rRGVsaXZlcnk6IFtcIkdFVCAvYXBwL2hvb2svZGVsaXZlcmllcy97ZGVsaXZlcnlfaWR9XCJdLFxuICAgIGxpc3RBY2NvdW50c0ZvclBsYW46IFtcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9wbGFucy97cGxhbl9pZH0vYWNjb3VudHNcIl0sXG4gICAgbGlzdEFjY291bnRzRm9yUGxhblN0dWJiZWQ6IFtcbiAgICAgIFwiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3N0dWJiZWQvcGxhbnMve3BsYW5faWR9L2FjY291bnRzXCJcbiAgICBdLFxuICAgIGxpc3RJbnN0YWxsYXRpb25SZXBvc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBsaXN0SW5zdGFsbGF0aW9uUmVxdWVzdHNGb3JBdXRoZW50aWNhdGVkQXBwOiBbXG4gICAgICBcIkdFVCAvYXBwL2luc3RhbGxhdGlvbi1yZXF1ZXN0c1wiXG4gICAgXSxcbiAgICBsaXN0SW5zdGFsbGF0aW9uczogW1wiR0VUIC9hcHAvaW5zdGFsbGF0aW9uc1wiXSxcbiAgICBsaXN0SW5zdGFsbGF0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvaW5zdGFsbGF0aW9uc1wiXSxcbiAgICBsaXN0UGxhbnM6IFtcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9wbGFuc1wiXSxcbiAgICBsaXN0UGxhbnNTdHViYmVkOiBbXCJHRVQgL21hcmtldHBsYWNlX2xpc3Rpbmcvc3R1YmJlZC9wbGFuc1wiXSxcbiAgICBsaXN0UmVwb3NBY2Nlc3NpYmxlVG9JbnN0YWxsYXRpb246IFtcIkdFVCAvaW5zdGFsbGF0aW9uL3JlcG9zaXRvcmllc1wiXSxcbiAgICBsaXN0U3Vic2NyaXB0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvbWFya2V0cGxhY2VfcHVyY2hhc2VzXCJdLFxuICAgIGxpc3RTdWJzY3JpcHRpb25zRm9yQXV0aGVudGljYXRlZFVzZXJTdHViYmVkOiBbXG4gICAgICBcIkdFVCAvdXNlci9tYXJrZXRwbGFjZV9wdXJjaGFzZXMvc3R1YmJlZFwiXG4gICAgXSxcbiAgICBsaXN0V2ViaG9va0RlbGl2ZXJpZXM6IFtcIkdFVCAvYXBwL2hvb2svZGVsaXZlcmllc1wiXSxcbiAgICByZWRlbGl2ZXJXZWJob29rRGVsaXZlcnk6IFtcbiAgICAgIFwiUE9TVCAvYXBwL2hvb2svZGVsaXZlcmllcy97ZGVsaXZlcnlfaWR9L2F0dGVtcHRzXCJcbiAgICBdLFxuICAgIHJlbW92ZVJlcG9Gcm9tSW5zdGFsbGF0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJhcHBzXCIsIFwicmVtb3ZlUmVwb0Zyb21JbnN0YWxsYXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICByZW1vdmVSZXBvRnJvbUluc3RhbGxhdGlvbkZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgcmVzZXRUb2tlbjogW1wiUEFUQ0ggL2FwcGxpY2F0aW9ucy97Y2xpZW50X2lkfS90b2tlblwiXSxcbiAgICByZXZva2VJbnN0YWxsYXRpb25BY2Nlc3NUb2tlbjogW1wiREVMRVRFIC9pbnN0YWxsYXRpb24vdG9rZW5cIl0sXG4gICAgc2NvcGVUb2tlbjogW1wiUE9TVCAvYXBwbGljYXRpb25zL3tjbGllbnRfaWR9L3Rva2VuL3Njb3BlZFwiXSxcbiAgICBzdXNwZW5kSW5zdGFsbGF0aW9uOiBbXCJQVVQgL2FwcC9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L3N1c3BlbmRlZFwiXSxcbiAgICB1bnN1c3BlbmRJbnN0YWxsYXRpb246IFtcbiAgICAgIFwiREVMRVRFIC9hcHAvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9zdXNwZW5kZWRcIlxuICAgIF0sXG4gICAgdXBkYXRlV2ViaG9va0NvbmZpZ0ZvckFwcDogW1wiUEFUQ0ggL2FwcC9ob29rL2NvbmZpZ1wiXVxuICB9LFxuICBiaWxsaW5nOiB7XG4gICAgZ2V0R2l0aHViQWN0aW9uc0JpbGxpbmdPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9zZXR0aW5ncy9iaWxsaW5nL2FjdGlvbnNcIl0sXG4gICAgZ2V0R2l0aHViQWN0aW9uc0JpbGxpbmdVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9zZXR0aW5ncy9iaWxsaW5nL2FjdGlvbnNcIlxuICAgIF0sXG4gICAgZ2V0R2l0aHViUGFja2FnZXNCaWxsaW5nT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vc2V0dGluZ3MvYmlsbGluZy9wYWNrYWdlc1wiXSxcbiAgICBnZXRHaXRodWJQYWNrYWdlc0JpbGxpbmdVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9zZXR0aW5ncy9iaWxsaW5nL3BhY2thZ2VzXCJcbiAgICBdLFxuICAgIGdldFNoYXJlZFN0b3JhZ2VCaWxsaW5nT3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9zZXR0aW5ncy9iaWxsaW5nL3NoYXJlZC1zdG9yYWdlXCJcbiAgICBdLFxuICAgIGdldFNoYXJlZFN0b3JhZ2VCaWxsaW5nVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc2V0dGluZ3MvYmlsbGluZy9zaGFyZWQtc3RvcmFnZVwiXG4gICAgXVxuICB9LFxuICBjaGVja3M6IHtcbiAgICBjcmVhdGU6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXJ1bnNcIl0sXG4gICAgY3JlYXRlU3VpdGU6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXN1aXRlc1wiXSxcbiAgICBnZXQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stcnVucy97Y2hlY2tfcnVuX2lkfVwiXSxcbiAgICBnZXRTdWl0ZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1zdWl0ZXMve2NoZWNrX3N1aXRlX2lkfVwiXSxcbiAgICBsaXN0QW5ub3RhdGlvbnM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1ydW5zL3tjaGVja19ydW5faWR9L2Fubm90YXRpb25zXCJcbiAgICBdLFxuICAgIGxpc3RGb3JSZWY6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9jaGVjay1ydW5zXCJdLFxuICAgIGxpc3RGb3JTdWl0ZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXN1aXRlcy97Y2hlY2tfc3VpdGVfaWR9L2NoZWNrLXJ1bnNcIlxuICAgIF0sXG4gICAgbGlzdFN1aXRlc0ZvclJlZjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9L2NoZWNrLXN1aXRlc1wiXSxcbiAgICByZXJlcXVlc3RSdW46IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stcnVucy97Y2hlY2tfcnVuX2lkfS9yZXJlcXVlc3RcIlxuICAgIF0sXG4gICAgcmVyZXF1ZXN0U3VpdGU6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stc3VpdGVzL3tjaGVja19zdWl0ZV9pZH0vcmVyZXF1ZXN0XCJcbiAgICBdLFxuICAgIHNldFN1aXRlc1ByZWZlcmVuY2VzOiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1zdWl0ZXMvcHJlZmVyZW5jZXNcIlxuICAgIF0sXG4gICAgdXBkYXRlOiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stcnVucy97Y2hlY2tfcnVuX2lkfVwiXVxuICB9LFxuICBjb2RlU2Nhbm5pbmc6IHtcbiAgICBkZWxldGVBbmFseXNpczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYW5hbHlzZXMve2FuYWx5c2lzX2lkfXs/Y29uZmlybV9kZWxldGV9XCJcbiAgICBdLFxuICAgIGdldEFsZXJ0OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn1cIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkUGFyYW1ldGVyczogeyBhbGVydF9pZDogXCJhbGVydF9udW1iZXJcIiB9IH1cbiAgICBdLFxuICAgIGdldEFuYWx5c2lzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbmFseXNlcy97YW5hbHlzaXNfaWR9XCJcbiAgICBdLFxuICAgIGdldENvZGVxbERhdGFiYXNlOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9jb2RlcWwvZGF0YWJhc2VzL3tsYW5ndWFnZX1cIlxuICAgIF0sXG4gICAgZ2V0RGVmYXVsdFNldHVwOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvZGVmYXVsdC1zZXR1cFwiXSxcbiAgICBnZXRTYXJpZjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL3Nhcmlmcy97c2FyaWZfaWR9XCJdLFxuICAgIGxpc3RBbGVydEluc3RhbmNlczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYWxlcnRzL3thbGVydF9udW1iZXJ9L2luc3RhbmNlc1wiXG4gICAgXSxcbiAgICBsaXN0QWxlcnRzRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vY29kZS1zY2FubmluZy9hbGVydHNcIl0sXG4gICAgbGlzdEFsZXJ0c0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHNcIl0sXG4gICAgbGlzdEFsZXJ0c0luc3RhbmNlczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYWxlcnRzL3thbGVydF9udW1iZXJ9L2luc3RhbmNlc1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcImNvZGVTY2FubmluZ1wiLCBcImxpc3RBbGVydEluc3RhbmNlc1wiXSB9XG4gICAgXSxcbiAgICBsaXN0Q29kZXFsRGF0YWJhc2VzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9jb2RlcWwvZGF0YWJhc2VzXCJcbiAgICBdLFxuICAgIGxpc3RSZWNlbnRBbmFseXNlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FuYWx5c2VzXCJdLFxuICAgIHVwZGF0ZUFsZXJ0OiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FsZXJ0cy97YWxlcnRfbnVtYmVyfVwiXG4gICAgXSxcbiAgICB1cGRhdGVEZWZhdWx0U2V0dXA6IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvZGVmYXVsdC1zZXR1cFwiXG4gICAgXSxcbiAgICB1cGxvYWRTYXJpZjogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9zYXJpZnNcIl1cbiAgfSxcbiAgY29kZXNPZkNvbmR1Y3Q6IHtcbiAgICBnZXRBbGxDb2Rlc09mQ29uZHVjdDogW1wiR0VUIC9jb2Rlc19vZl9jb25kdWN0XCJdLFxuICAgIGdldENvbmR1Y3RDb2RlOiBbXCJHRVQgL2NvZGVzX29mX2NvbmR1Y3Qve2tleX1cIl1cbiAgfSxcbiAgY29kZXNwYWNlczoge1xuICAgIGFkZFJlcG9zaXRvcnlGb3JTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQVVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICBhZGRTZWxlY3RlZFJlcG9Ub09yZ1NlY3JldDogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICBjaGVja1Blcm1pc3Npb25zRm9yRGV2Y29udGFpbmVyOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9wZXJtaXNzaW9uc19jaGVja1wiXG4gICAgXSxcbiAgICBjb2Rlc3BhY2VNYWNoaW5lc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX0vbWFjaGluZXNcIlxuICAgIF0sXG4gICAgY3JlYXRlRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBPU1QgL3VzZXIvY29kZXNwYWNlc1wiXSxcbiAgICBjcmVhdGVPclVwZGF0ZU9yZ1NlY3JldDogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgY3JlYXRlT3JVcGRhdGVSZXBvU2VjcmV0OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgY3JlYXRlT3JVcGRhdGVTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQVVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgY3JlYXRlV2l0aFByRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9jb2Rlc3BhY2VzXCJcbiAgICBdLFxuICAgIGNyZWF0ZVdpdGhSZXBvRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlc1wiXG4gICAgXSxcbiAgICBkZWxldGVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfVwiXSxcbiAgICBkZWxldGVGcm9tT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX0vY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9XCJcbiAgICBdLFxuICAgIGRlbGV0ZU9yZ1NlY3JldDogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGRlbGV0ZVJlcG9TZWNyZXQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXG4gICAgXSxcbiAgICBkZWxldGVTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgZXhwb3J0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiUE9TVCAvdXNlci9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX0vZXhwb3J0c1wiXG4gICAgXSxcbiAgICBnZXRDb2Rlc3BhY2VzRm9yVXNlckluT3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX0vY29kZXNwYWNlc1wiXG4gICAgXSxcbiAgICBnZXRFeHBvcnREZXRhaWxzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfS9leHBvcnRzL3tleHBvcnRfaWR9XCJcbiAgICBdLFxuICAgIGdldEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9XCJdLFxuICAgIGdldE9yZ1B1YmxpY0tleTogW1wiR0VUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0cy9wdWJsaWMta2V5XCJdLFxuICAgIGdldE9yZ1NlY3JldDogW1wiR0VUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGdldFB1YmxpY0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHMvcHVibGljLWtleVwiXG4gICAgXSxcbiAgICBnZXRSZXBvUHVibGljS2V5OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9zZWNyZXRzL3B1YmxpYy1rZXlcIlxuICAgIF0sXG4gICAgZ2V0UmVwb1NlY3JldDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGdldFNlY3JldEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXG4gICAgXSxcbiAgICBsaXN0RGV2Y29udGFpbmVyc0luUmVwb3NpdG9yeUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9kZXZjb250YWluZXJzXCJcbiAgICBdLFxuICAgIGxpc3RGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2NvZGVzcGFjZXNcIl0sXG4gICAgbGlzdEluT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZFBhcmFtZXRlcnM6IHsgb3JnX2lkOiBcIm9yZ1wiIH0gfVxuICAgIF0sXG4gICAgbGlzdEluUmVwb3NpdG9yeUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlc1wiXG4gICAgXSxcbiAgICBsaXN0T3JnU2VjcmV0czogW1wiR0VUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0c1wiXSxcbiAgICBsaXN0UmVwb1NlY3JldHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9zZWNyZXRzXCJdLFxuICAgIGxpc3RSZXBvc2l0b3JpZXNGb3JTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIGxpc3RTZWNyZXRzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHNcIl0sXG4gICAgbGlzdFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBwcmVGbGlnaHRXaXRoUmVwb0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9uZXdcIlxuICAgIF0sXG4gICAgcHVibGlzaEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBPU1QgL3VzZXIvY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9L3B1Ymxpc2hcIlxuICAgIF0sXG4gICAgcmVtb3ZlUmVwb3NpdG9yeUZvclNlY3JldEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIHJlbW92ZVNlbGVjdGVkUmVwb0Zyb21PcmdTZWNyZXQ6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgcmVwb01hY2hpbmVzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL21hY2hpbmVzXCJcbiAgICBdLFxuICAgIHNldFJlcG9zaXRvcmllc0ZvclNlY3JldEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBVVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgc2V0U2VsZWN0ZWRSZXBvc0Zvck9yZ1NlY3JldDogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIHN0YXJ0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBPU1QgL3VzZXIvY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9L3N0YXJ0XCJdLFxuICAgIHN0b3BGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX0vc3RvcFwiXSxcbiAgICBzdG9wSW5Pcmdhbml6YXRpb246IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX0vY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9L3N0b3BcIlxuICAgIF0sXG4gICAgdXBkYXRlRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBBVENIIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfVwiXVxuICB9LFxuICBjb3BpbG90OiB7XG4gICAgYWRkQ29waWxvdEZvckJ1c2luZXNzU2VhdHNGb3JUZWFtczogW1xuICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L2NvcGlsb3QvYmlsbGluZy9zZWxlY3RlZF90ZWFtc1wiXG4gICAgXSxcbiAgICBhZGRDb3BpbG90Rm9yQnVzaW5lc3NTZWF0c0ZvclVzZXJzOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vY29waWxvdC9iaWxsaW5nL3NlbGVjdGVkX3VzZXJzXCJcbiAgICBdLFxuICAgIGNhbmNlbENvcGlsb3RTZWF0QXNzaWdubWVudEZvclRlYW1zOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9jb3BpbG90L2JpbGxpbmcvc2VsZWN0ZWRfdGVhbXNcIlxuICAgIF0sXG4gICAgY2FuY2VsQ29waWxvdFNlYXRBc3NpZ25tZW50Rm9yVXNlcnM6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2NvcGlsb3QvYmlsbGluZy9zZWxlY3RlZF91c2Vyc1wiXG4gICAgXSxcbiAgICBnZXRDb3BpbG90T3JnYW5pemF0aW9uRGV0YWlsczogW1wiR0VUIC9vcmdzL3tvcmd9L2NvcGlsb3QvYmlsbGluZ1wiXSxcbiAgICBnZXRDb3BpbG90U2VhdERldGFpbHNGb3JVc2VyOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX0vY29waWxvdFwiXG4gICAgXSxcbiAgICBsaXN0Q29waWxvdFNlYXRzOiBbXCJHRVQgL29yZ3Mve29yZ30vY29waWxvdC9iaWxsaW5nL3NlYXRzXCJdXG4gIH0sXG4gIGRlcGVuZGFib3Q6IHtcbiAgICBhZGRTZWxlY3RlZFJlcG9Ub09yZ1NlY3JldDogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICBjcmVhdGVPclVwZGF0ZU9yZ1NlY3JldDogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgY3JlYXRlT3JVcGRhdGVSZXBvU2VjcmV0OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlT3JnU2VjcmV0OiBbXCJERUxFVEUgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIl0sXG4gICAgZGVsZXRlUmVwb1NlY3JldDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGdldEFsZXJ0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3QvYWxlcnRzL3thbGVydF9udW1iZXJ9XCJdLFxuICAgIGdldE9yZ1B1YmxpY0tleTogW1wiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy9wdWJsaWMta2V5XCJdLFxuICAgIGdldE9yZ1NlY3JldDogW1wiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGdldFJlcG9QdWJsaWNLZXk6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBlbmRhYm90L3NlY3JldHMvcHVibGljLWtleVwiXG4gICAgXSxcbiAgICBnZXRSZXBvU2VjcmV0OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgbGlzdEFsZXJ0c0ZvckVudGVycHJpc2U6IFtcbiAgICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vZGVwZW5kYWJvdC9hbGVydHNcIlxuICAgIF0sXG4gICAgbGlzdEFsZXJ0c0Zvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3QvYWxlcnRzXCJdLFxuICAgIGxpc3RBbGVydHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3QvYWxlcnRzXCJdLFxuICAgIGxpc3RPcmdTZWNyZXRzOiBbXCJHRVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzXCJdLFxuICAgIGxpc3RSZXBvU2VjcmV0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBlbmRhYm90L3NlY3JldHNcIl0sXG4gICAgbGlzdFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICByZW1vdmVTZWxlY3RlZFJlcG9Gcm9tT3JnU2VjcmV0OiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9kZXBlbmRhYm90L3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIHNldFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICB1cGRhdGVBbGVydDogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9hbGVydHMve2FsZXJ0X251bWJlcn1cIlxuICAgIF1cbiAgfSxcbiAgZGVwZW5kZW5jeUdyYXBoOiB7XG4gICAgY3JlYXRlUmVwb3NpdG9yeVNuYXBzaG90OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGVuY3ktZ3JhcGgvc25hcHNob3RzXCJcbiAgICBdLFxuICAgIGRpZmZSYW5nZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGVuY3ktZ3JhcGgvY29tcGFyZS97YmFzZWhlYWR9XCJcbiAgICBdLFxuICAgIGV4cG9ydFNib206IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kZW5jeS1ncmFwaC9zYm9tXCJdXG4gIH0sXG4gIGVtb2ppczogeyBnZXQ6IFtcIkdFVCAvZW1vamlzXCJdIH0sXG4gIGdpc3RzOiB7XG4gICAgY2hlY2tJc1N0YXJyZWQ6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L3N0YXJcIl0sXG4gICAgY3JlYXRlOiBbXCJQT1NUIC9naXN0c1wiXSxcbiAgICBjcmVhdGVDb21tZW50OiBbXCJQT1NUIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHNcIl0sXG4gICAgZGVsZXRlOiBbXCJERUxFVEUgL2dpc3RzL3tnaXN0X2lkfVwiXSxcbiAgICBkZWxldGVDb21tZW50OiBbXCJERUxFVEUgL2dpc3RzL3tnaXN0X2lkfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgZm9yazogW1wiUE9TVCAvZ2lzdHMve2dpc3RfaWR9L2ZvcmtzXCJdLFxuICAgIGdldDogW1wiR0VUIC9naXN0cy97Z2lzdF9pZH1cIl0sXG4gICAgZ2V0Q29tbWVudDogW1wiR0VUIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHMve2NvbW1lbnRfaWR9XCJdLFxuICAgIGdldFJldmlzaW9uOiBbXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS97c2hhfVwiXSxcbiAgICBsaXN0OiBbXCJHRVQgL2dpc3RzXCJdLFxuICAgIGxpc3RDb21tZW50czogW1wiR0VUIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHNcIl0sXG4gICAgbGlzdENvbW1pdHM6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L2NvbW1pdHNcIl0sXG4gICAgbGlzdEZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9naXN0c1wiXSxcbiAgICBsaXN0Rm9ya3M6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L2ZvcmtzXCJdLFxuICAgIGxpc3RQdWJsaWM6IFtcIkdFVCAvZ2lzdHMvcHVibGljXCJdLFxuICAgIGxpc3RTdGFycmVkOiBbXCJHRVQgL2dpc3RzL3N0YXJyZWRcIl0sXG4gICAgc3RhcjogW1wiUFVUIC9naXN0cy97Z2lzdF9pZH0vc3RhclwiXSxcbiAgICB1bnN0YXI6IFtcIkRFTEVURSAvZ2lzdHMve2dpc3RfaWR9L3N0YXJcIl0sXG4gICAgdXBkYXRlOiBbXCJQQVRDSCAvZ2lzdHMve2dpc3RfaWR9XCJdLFxuICAgIHVwZGF0ZUNvbW1lbnQ6IFtcIlBBVENIIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHMve2NvbW1lbnRfaWR9XCJdXG4gIH0sXG4gIGdpdDoge1xuICAgIGNyZWF0ZUJsb2I6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9ibG9ic1wiXSxcbiAgICBjcmVhdGVDb21taXQ6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9jb21taXRzXCJdLFxuICAgIGNyZWF0ZVJlZjogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3JlZnNcIl0sXG4gICAgY3JlYXRlVGFnOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvdGFnc1wiXSxcbiAgICBjcmVhdGVUcmVlOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvdHJlZXNcIl0sXG4gICAgZGVsZXRlUmVmOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9yZWZzL3tyZWZ9XCJdLFxuICAgIGdldEJsb2I6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L2Jsb2JzL3tmaWxlX3NoYX1cIl0sXG4gICAgZ2V0Q29tbWl0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9jb21taXRzL3tjb21taXRfc2hhfVwiXSxcbiAgICBnZXRSZWY6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3JlZi97cmVmfVwiXSxcbiAgICBnZXRUYWc6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3RhZ3Mve3RhZ19zaGF9XCJdLFxuICAgIGdldFRyZWU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3RyZWVzL3t0cmVlX3NoYX1cIl0sXG4gICAgbGlzdE1hdGNoaW5nUmVmczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvbWF0Y2hpbmctcmVmcy97cmVmfVwiXSxcbiAgICB1cGRhdGVSZWY6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvcmVmcy97cmVmfVwiXVxuICB9LFxuICBnaXRpZ25vcmU6IHtcbiAgICBnZXRBbGxUZW1wbGF0ZXM6IFtcIkdFVCAvZ2l0aWdub3JlL3RlbXBsYXRlc1wiXSxcbiAgICBnZXRUZW1wbGF0ZTogW1wiR0VUIC9naXRpZ25vcmUvdGVtcGxhdGVzL3tuYW1lfVwiXVxuICB9LFxuICBpbnRlcmFjdGlvbnM6IHtcbiAgICBnZXRSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICBnZXRSZXN0cmljdGlvbnNGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgZ2V0UmVzdHJpY3Rpb25zRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgZ2V0UmVzdHJpY3Rpb25zRm9yWW91clB1YmxpY1JlcG9zOiBbXG4gICAgICBcIkdFVCAvdXNlci9pbnRlcmFjdGlvbi1saW1pdHNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJpbnRlcmFjdGlvbnNcIiwgXCJnZXRSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICByZW1vdmVSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICByZW1vdmVSZXN0cmljdGlvbnNGb3JPcmc6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgcmVtb3ZlUmVzdHJpY3Rpb25zRm9yUmVwbzogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludGVyYWN0aW9uLWxpbWl0c1wiXG4gICAgXSxcbiAgICByZW1vdmVSZXN0cmljdGlvbnNGb3JZb3VyUHVibGljUmVwb3M6IFtcbiAgICAgIFwiREVMRVRFIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcImludGVyYWN0aW9uc1wiLCBcInJlbW92ZVJlc3RyaWN0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIHNldFJlc3RyaWN0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQVVQgL3VzZXIvaW50ZXJhY3Rpb24tbGltaXRzXCJdLFxuICAgIHNldFJlc3RyaWN0aW9uc0Zvck9yZzogW1wiUFVUIC9vcmdzL3tvcmd9L2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICBzZXRSZXN0cmljdGlvbnNGb3JSZXBvOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICBzZXRSZXN0cmljdGlvbnNGb3JZb3VyUHVibGljUmVwb3M6IFtcbiAgICAgIFwiUFVUIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcImludGVyYWN0aW9uc1wiLCBcInNldFJlc3RyaWN0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdXG4gIH0sXG4gIGlzc3Vlczoge1xuICAgIGFkZEFzc2lnbmVlczogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vYXNzaWduZWVzXCJcbiAgICBdLFxuICAgIGFkZExhYmVsczogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2xhYmVsc1wiXSxcbiAgICBjaGVja1VzZXJDYW5CZUFzc2lnbmVkOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Fzc2lnbmVlcy97YXNzaWduZWV9XCJdLFxuICAgIGNoZWNrVXNlckNhbkJlQXNzaWduZWRUb0lzc3VlOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2Fzc2lnbmVlcy97YXNzaWduZWV9XCJcbiAgICBdLFxuICAgIGNyZWF0ZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzXCJdLFxuICAgIGNyZWF0ZUNvbW1lbnQ6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2NvbW1lbnRzXCJcbiAgICBdLFxuICAgIGNyZWF0ZUxhYmVsOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHNcIl0sXG4gICAgY3JlYXRlTWlsZXN0b25lOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9taWxlc3RvbmVzXCJdLFxuICAgIGRlbGV0ZUNvbW1lbnQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHMve2NvbW1lbnRfaWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUxhYmVsOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX1cIl0sXG4gICAgZGVsZXRlTWlsZXN0b25lOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lcy97bWlsZXN0b25lX251bWJlcn1cIlxuICAgIF0sXG4gICAgZ2V0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfVwiXSxcbiAgICBnZXRDb21tZW50OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgZ2V0RXZlbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2V2ZW50cy97ZXZlbnRfaWR9XCJdLFxuICAgIGdldExhYmVsOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX1cIl0sXG4gICAgZ2V0TWlsZXN0b25lOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L21pbGVzdG9uZXMve21pbGVzdG9uZV9udW1iZXJ9XCJdLFxuICAgIGxpc3Q6IFtcIkdFVCAvaXNzdWVzXCJdLFxuICAgIGxpc3RBc3NpZ25lZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXNzaWduZWVzXCJdLFxuICAgIGxpc3RDb21tZW50czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vY29tbWVudHNcIl0sXG4gICAgbGlzdENvbW1lbnRzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHNcIl0sXG4gICAgbGlzdEV2ZW50czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vZXZlbnRzXCJdLFxuICAgIGxpc3RFdmVudHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9ldmVudHNcIl0sXG4gICAgbGlzdEV2ZW50c0ZvclRpbWVsaW5lOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L3RpbWVsaW5lXCJcbiAgICBdLFxuICAgIGxpc3RGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2lzc3Vlc1wiXSxcbiAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vaXNzdWVzXCJdLFxuICAgIGxpc3RGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlc1wiXSxcbiAgICBsaXN0TGFiZWxzRm9yTWlsZXN0b25lOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lcy97bWlsZXN0b25lX251bWJlcn0vbGFiZWxzXCJcbiAgICBdLFxuICAgIGxpc3RMYWJlbHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVsc1wiXSxcbiAgICBsaXN0TGFiZWxzT25Jc3N1ZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHNcIlxuICAgIF0sXG4gICAgbGlzdE1pbGVzdG9uZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lc1wiXSxcbiAgICBsb2NrOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sb2NrXCJdLFxuICAgIHJlbW92ZUFsbExhYmVsczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHNcIlxuICAgIF0sXG4gICAgcmVtb3ZlQXNzaWduZWVzOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2Fzc2lnbmVlc1wiXG4gICAgXSxcbiAgICByZW1vdmVMYWJlbDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHMve25hbWV9XCJcbiAgICBdLFxuICAgIHNldExhYmVsczogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vbGFiZWxzXCJdLFxuICAgIHVubG9jazogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vbG9ja1wiXSxcbiAgICB1cGRhdGU6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn1cIl0sXG4gICAgdXBkYXRlQ29tbWVudDogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgdXBkYXRlTGFiZWw6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9XCJdLFxuICAgIHVwZGF0ZU1pbGVzdG9uZTogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lcy97bWlsZXN0b25lX251bWJlcn1cIlxuICAgIF1cbiAgfSxcbiAgbGljZW5zZXM6IHtcbiAgICBnZXQ6IFtcIkdFVCAvbGljZW5zZXMve2xpY2Vuc2V9XCJdLFxuICAgIGdldEFsbENvbW1vbmx5VXNlZDogW1wiR0VUIC9saWNlbnNlc1wiXSxcbiAgICBnZXRGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xpY2Vuc2VcIl1cbiAgfSxcbiAgbWFya2Rvd246IHtcbiAgICByZW5kZXI6IFtcIlBPU1QgL21hcmtkb3duXCJdLFxuICAgIHJlbmRlclJhdzogW1xuICAgICAgXCJQT1NUIC9tYXJrZG93bi9yYXdcIixcbiAgICAgIHsgaGVhZGVyczogeyBcImNvbnRlbnQtdHlwZVwiOiBcInRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIiB9IH1cbiAgICBdXG4gIH0sXG4gIG1ldGE6IHtcbiAgICBnZXQ6IFtcIkdFVCAvbWV0YVwiXSxcbiAgICBnZXRBbGxWZXJzaW9uczogW1wiR0VUIC92ZXJzaW9uc1wiXSxcbiAgICBnZXRPY3RvY2F0OiBbXCJHRVQgL29jdG9jYXRcIl0sXG4gICAgZ2V0WmVuOiBbXCJHRVQgL3plblwiXSxcbiAgICByb290OiBbXCJHRVQgL1wiXVxuICB9LFxuICBtaWdyYXRpb25zOiB7XG4gICAgY2FuY2VsSW1wb3J0OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0XCIsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgZGVwcmVjYXRlZDogXCJvY3Rva2l0LnJlc3QubWlncmF0aW9ucy5jYW5jZWxJbXBvcnQoKSBpcyBkZXByZWNhdGVkLCBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vcmVzdC9taWdyYXRpb25zL3NvdXJjZS1pbXBvcnRzI2NhbmNlbC1hbi1pbXBvcnRcIlxuICAgICAgfVxuICAgIF0sXG4gICAgZGVsZXRlQXJjaGl2ZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9L2FyY2hpdmVcIlxuICAgIF0sXG4gICAgZGVsZXRlQXJjaGl2ZUZvck9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9hcmNoaXZlXCJcbiAgICBdLFxuICAgIGRvd25sb2FkQXJjaGl2ZUZvck9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9hcmNoaXZlXCJcbiAgICBdLFxuICAgIGdldEFyY2hpdmVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9hcmNoaXZlXCJcbiAgICBdLFxuICAgIGdldENvbW1pdEF1dGhvcnM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnQvYXV0aG9yc1wiLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGRlcHJlY2F0ZWQ6IFwib2N0b2tpdC5yZXN0Lm1pZ3JhdGlvbnMuZ2V0Q29tbWl0QXV0aG9ycygpIGlzIGRlcHJlY2F0ZWQsIHNlZSBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9yZXN0L21pZ3JhdGlvbnMvc291cmNlLWltcG9ydHMjZ2V0LWNvbW1pdC1hdXRob3JzXCJcbiAgICAgIH1cbiAgICBdLFxuICAgIGdldEltcG9ydFN0YXR1czogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ltcG9ydFwiLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGRlcHJlY2F0ZWQ6IFwib2N0b2tpdC5yZXN0Lm1pZ3JhdGlvbnMuZ2V0SW1wb3J0U3RhdHVzKCkgaXMgZGVwcmVjYXRlZCwgc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL3Jlc3QvbWlncmF0aW9ucy9zb3VyY2UtaW1wb3J0cyNnZXQtYW4taW1wb3J0LXN0YXR1c1wiXG4gICAgICB9XG4gICAgXSxcbiAgICBnZXRMYXJnZUZpbGVzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0L2xhcmdlX2ZpbGVzXCIsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgZGVwcmVjYXRlZDogXCJvY3Rva2l0LnJlc3QubWlncmF0aW9ucy5nZXRMYXJnZUZpbGVzKCkgaXMgZGVwcmVjYXRlZCwgc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL3Jlc3QvbWlncmF0aW9ucy9zb3VyY2UtaW1wb3J0cyNnZXQtbGFyZ2UtZmlsZXNcIlxuICAgICAgfVxuICAgIF0sXG4gICAgZ2V0U3RhdHVzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9XCJdLFxuICAgIGdldFN0YXR1c0Zvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH1cIl0sXG4gICAgbGlzdEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvbWlncmF0aW9uc1wiXSxcbiAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9uc1wiXSxcbiAgICBsaXN0UmVwb3NGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgbGlzdFJlcG9zRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIl0sXG4gICAgbGlzdFJlcG9zRm9yVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJtaWdyYXRpb25zXCIsIFwibGlzdFJlcG9zRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgbWFwQ29tbWl0QXV0aG9yOiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnQvYXV0aG9ycy97YXV0aG9yX2lkfVwiLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGRlcHJlY2F0ZWQ6IFwib2N0b2tpdC5yZXN0Lm1pZ3JhdGlvbnMubWFwQ29tbWl0QXV0aG9yKCkgaXMgZGVwcmVjYXRlZCwgc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL3Jlc3QvbWlncmF0aW9ucy9zb3VyY2UtaW1wb3J0cyNtYXAtYS1jb21taXQtYXV0aG9yXCJcbiAgICAgIH1cbiAgICBdLFxuICAgIHNldExmc1ByZWZlcmVuY2U6IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2ltcG9ydC9sZnNcIixcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBkZXByZWNhdGVkOiBcIm9jdG9raXQucmVzdC5taWdyYXRpb25zLnNldExmc1ByZWZlcmVuY2UoKSBpcyBkZXByZWNhdGVkLCBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vcmVzdC9taWdyYXRpb25zL3NvdXJjZS1pbXBvcnRzI3VwZGF0ZS1naXQtbGZzLXByZWZlcmVuY2VcIlxuICAgICAgfVxuICAgIF0sXG4gICAgc3RhcnRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9taWdyYXRpb25zXCJdLFxuICAgIHN0YXJ0Rm9yT3JnOiBbXCJQT1NUIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnNcIl0sXG4gICAgc3RhcnRJbXBvcnQ6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnRcIixcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBkZXByZWNhdGVkOiBcIm9jdG9raXQucmVzdC5taWdyYXRpb25zLnN0YXJ0SW1wb3J0KCkgaXMgZGVwcmVjYXRlZCwgc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL3Jlc3QvbWlncmF0aW9ucy9zb3VyY2UtaW1wb3J0cyNzdGFydC1hbi1pbXBvcnRcIlxuICAgICAgfVxuICAgIF0sXG4gICAgdW5sb2NrUmVwb0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9L3JlcG9zL3tyZXBvX25hbWV9L2xvY2tcIlxuICAgIF0sXG4gICAgdW5sb2NrUmVwb0Zvck9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvcy97cmVwb19uYW1lfS9sb2NrXCJcbiAgICBdLFxuICAgIHVwZGF0ZUltcG9ydDogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0XCIsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgZGVwcmVjYXRlZDogXCJvY3Rva2l0LnJlc3QubWlncmF0aW9ucy51cGRhdGVJbXBvcnQoKSBpcyBkZXByZWNhdGVkLCBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vcmVzdC9taWdyYXRpb25zL3NvdXJjZS1pbXBvcnRzI3VwZGF0ZS1hbi1pbXBvcnRcIlxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAgb3Jnczoge1xuICAgIGFkZFNlY3VyaXR5TWFuYWdlclRlYW06IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L3NlY3VyaXR5LW1hbmFnZXJzL3RlYW1zL3t0ZWFtX3NsdWd9XCJcbiAgICBdLFxuICAgIGJsb2NrVXNlcjogW1wiUFVUIC9vcmdzL3tvcmd9L2Jsb2Nrcy97dXNlcm5hbWV9XCJdLFxuICAgIGNhbmNlbEludml0YXRpb246IFtcIkRFTEVURSAvb3Jncy97b3JnfS9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIl0sXG4gICAgY2hlY2tCbG9ja2VkVXNlcjogW1wiR0VUIC9vcmdzL3tvcmd9L2Jsb2Nrcy97dXNlcm5hbWV9XCJdLFxuICAgIGNoZWNrTWVtYmVyc2hpcEZvclVzZXI6IFtcIkdFVCAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX1cIl0sXG4gICAgY2hlY2tQdWJsaWNNZW1iZXJzaGlwRm9yVXNlcjogW1wiR0VUIC9vcmdzL3tvcmd9L3B1YmxpY19tZW1iZXJzL3t1c2VybmFtZX1cIl0sXG4gICAgY29udmVydE1lbWJlclRvT3V0c2lkZUNvbGxhYm9yYXRvcjogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vb3V0c2lkZV9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX1cIlxuICAgIF0sXG4gICAgY3JlYXRlSW52aXRhdGlvbjogW1wiUE9TVCAvb3Jncy97b3JnfS9pbnZpdGF0aW9uc1wiXSxcbiAgICBjcmVhdGVPclVwZGF0ZUN1c3RvbVByb3BlcnRpZXM6IFtcIlBBVENIIC9vcmdzL3tvcmd9L3Byb3BlcnRpZXMvc2NoZW1hXCJdLFxuICAgIGNyZWF0ZU9yVXBkYXRlQ3VzdG9tUHJvcGVydGllc1ZhbHVlc0ZvclJlcG9zOiBbXG4gICAgICBcIlBBVENIIC9vcmdzL3tvcmd9L3Byb3BlcnRpZXMvdmFsdWVzXCJcbiAgICBdLFxuICAgIGNyZWF0ZU9yVXBkYXRlQ3VzdG9tUHJvcGVydHk6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L3Byb3BlcnRpZXMvc2NoZW1hL3tjdXN0b21fcHJvcGVydHlfbmFtZX1cIlxuICAgIF0sXG4gICAgY3JlYXRlV2ViaG9vazogW1wiUE9TVCAvb3Jncy97b3JnfS9ob29rc1wiXSxcbiAgICBkZWxldGU6IFtcIkRFTEVURSAvb3Jncy97b3JnfVwiXSxcbiAgICBkZWxldGVXZWJob29rOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgIGVuYWJsZU9yRGlzYWJsZVNlY3VyaXR5UHJvZHVjdE9uQWxsT3JnUmVwb3M6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS97c2VjdXJpdHlfcHJvZHVjdH0ve2VuYWJsZW1lbnR9XCJcbiAgICBdLFxuICAgIGdldDogW1wiR0VUIC9vcmdzL3tvcmd9XCJdLFxuICAgIGdldEFsbEN1c3RvbVByb3BlcnRpZXM6IFtcIkdFVCAvb3Jncy97b3JnfS9wcm9wZXJ0aWVzL3NjaGVtYVwiXSxcbiAgICBnZXRDdXN0b21Qcm9wZXJ0eTogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vcHJvcGVydGllcy9zY2hlbWEve2N1c3RvbV9wcm9wZXJ0eV9uYW1lfVwiXG4gICAgXSxcbiAgICBnZXRNZW1iZXJzaGlwRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9tZW1iZXJzaGlwcy9vcmdzL3tvcmd9XCJdLFxuICAgIGdldE1lbWJlcnNoaXBGb3JVc2VyOiBbXCJHRVQgL29yZ3Mve29yZ30vbWVtYmVyc2hpcHMve3VzZXJuYW1lfVwiXSxcbiAgICBnZXRXZWJob29rOiBbXCJHRVQgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgIGdldFdlYmhvb2tDb25maWdGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vY29uZmlnXCJdLFxuICAgIGdldFdlYmhvb2tEZWxpdmVyeTogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L2RlbGl2ZXJpZXMve2RlbGl2ZXJ5X2lkfVwiXG4gICAgXSxcbiAgICBsaXN0OiBbXCJHRVQgL29yZ2FuaXphdGlvbnNcIl0sXG4gICAgbGlzdEFwcEluc3RhbGxhdGlvbnM6IFtcIkdFVCAvb3Jncy97b3JnfS9pbnN0YWxsYXRpb25zXCJdLFxuICAgIGxpc3RCbG9ja2VkVXNlcnM6IFtcIkdFVCAvb3Jncy97b3JnfS9ibG9ja3NcIl0sXG4gICAgbGlzdEN1c3RvbVByb3BlcnRpZXNWYWx1ZXNGb3JSZXBvczogW1wiR0VUIC9vcmdzL3tvcmd9L3Byb3BlcnRpZXMvdmFsdWVzXCJdLFxuICAgIGxpc3RGYWlsZWRJbnZpdGF0aW9uczogW1wiR0VUIC9vcmdzL3tvcmd9L2ZhaWxlZF9pbnZpdGF0aW9uc1wiXSxcbiAgICBsaXN0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9vcmdzXCJdLFxuICAgIGxpc3RGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vb3Jnc1wiXSxcbiAgICBsaXN0SW52aXRhdGlvblRlYW1zOiBbXCJHRVQgL29yZ3Mve29yZ30vaW52aXRhdGlvbnMve2ludml0YXRpb25faWR9L3RlYW1zXCJdLFxuICAgIGxpc3RNZW1iZXJzOiBbXCJHRVQgL29yZ3Mve29yZ30vbWVtYmVyc1wiXSxcbiAgICBsaXN0TWVtYmVyc2hpcHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL21lbWJlcnNoaXBzL29yZ3NcIl0sXG4gICAgbGlzdE91dHNpZGVDb2xsYWJvcmF0b3JzOiBbXCJHRVQgL29yZ3Mve29yZ30vb3V0c2lkZV9jb2xsYWJvcmF0b3JzXCJdLFxuICAgIGxpc3RQYXRHcmFudFJlcG9zaXRvcmllczogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2Vucy97cGF0X2lkfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgbGlzdFBhdEdyYW50UmVxdWVzdFJlcG9zaXRvcmllczogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2VuLXJlcXVlc3RzL3twYXRfcmVxdWVzdF9pZH0vcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIGxpc3RQYXRHcmFudFJlcXVlc3RzOiBbXCJHRVQgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2VuLXJlcXVlc3RzXCJdLFxuICAgIGxpc3RQYXRHcmFudHM6IFtcIkdFVCAvb3Jncy97b3JnfS9wZXJzb25hbC1hY2Nlc3MtdG9rZW5zXCJdLFxuICAgIGxpc3RQZW5kaW5nSW52aXRhdGlvbnM6IFtcIkdFVCAvb3Jncy97b3JnfS9pbnZpdGF0aW9uc1wiXSxcbiAgICBsaXN0UHVibGljTWVtYmVyczogW1wiR0VUIC9vcmdzL3tvcmd9L3B1YmxpY19tZW1iZXJzXCJdLFxuICAgIGxpc3RTZWN1cml0eU1hbmFnZXJUZWFtczogW1wiR0VUIC9vcmdzL3tvcmd9L3NlY3VyaXR5LW1hbmFnZXJzXCJdLFxuICAgIGxpc3RXZWJob29rRGVsaXZlcmllczogW1wiR0VUIC9vcmdzL3tvcmd9L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzXCJdLFxuICAgIGxpc3RXZWJob29rczogW1wiR0VUIC9vcmdzL3tvcmd9L2hvb2tzXCJdLFxuICAgIHBpbmdXZWJob29rOiBbXCJQT1NUIC9vcmdzL3tvcmd9L2hvb2tzL3tob29rX2lkfS9waW5nc1wiXSxcbiAgICByZWRlbGl2ZXJXZWJob29rRGVsaXZlcnk6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllcy97ZGVsaXZlcnlfaWR9L2F0dGVtcHRzXCJcbiAgICBdLFxuICAgIHJlbW92ZUN1c3RvbVByb3BlcnR5OiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9wcm9wZXJ0aWVzL3NjaGVtYS97Y3VzdG9tX3Byb3BlcnR5X25hbWV9XCJcbiAgICBdLFxuICAgIHJlbW92ZU1lbWJlcjogW1wiREVMRVRFIC9vcmdzL3tvcmd9L21lbWJlcnMve3VzZXJuYW1lfVwiXSxcbiAgICByZW1vdmVNZW1iZXJzaGlwRm9yVXNlcjogW1wiREVMRVRFIC9vcmdzL3tvcmd9L21lbWJlcnNoaXBzL3t1c2VybmFtZX1cIl0sXG4gICAgcmVtb3ZlT3V0c2lkZUNvbGxhYm9yYXRvcjogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vb3V0c2lkZV9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX1cIlxuICAgIF0sXG4gICAgcmVtb3ZlUHVibGljTWVtYmVyc2hpcEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9wdWJsaWNfbWVtYmVycy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIHJlbW92ZVNlY3VyaXR5TWFuYWdlclRlYW06IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L3NlY3VyaXR5LW1hbmFnZXJzL3RlYW1zL3t0ZWFtX3NsdWd9XCJcbiAgICBdLFxuICAgIHJldmlld1BhdEdyYW50UmVxdWVzdDogW1xuICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L3BlcnNvbmFsLWFjY2Vzcy10b2tlbi1yZXF1ZXN0cy97cGF0X3JlcXVlc3RfaWR9XCJcbiAgICBdLFxuICAgIHJldmlld1BhdEdyYW50UmVxdWVzdHNJbkJ1bGs6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS9wZXJzb25hbC1hY2Nlc3MtdG9rZW4tcmVxdWVzdHNcIlxuICAgIF0sXG4gICAgc2V0TWVtYmVyc2hpcEZvclVzZXI6IFtcIlBVVCAvb3Jncy97b3JnfS9tZW1iZXJzaGlwcy97dXNlcm5hbWV9XCJdLFxuICAgIHNldFB1YmxpY01lbWJlcnNoaXBGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vcHVibGljX21lbWJlcnMve3VzZXJuYW1lfVwiXG4gICAgXSxcbiAgICB1bmJsb2NrVXNlcjogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2Jsb2Nrcy97dXNlcm5hbWV9XCJdLFxuICAgIHVwZGF0ZTogW1wiUEFUQ0ggL29yZ3Mve29yZ31cIl0sXG4gICAgdXBkYXRlTWVtYmVyc2hpcEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBBVENIIC91c2VyL21lbWJlcnNoaXBzL29yZ3Mve29yZ31cIlxuICAgIF0sXG4gICAgdXBkYXRlUGF0QWNjZXNzOiBbXCJQT1NUIC9vcmdzL3tvcmd9L3BlcnNvbmFsLWFjY2Vzcy10b2tlbnMve3BhdF9pZH1cIl0sXG4gICAgdXBkYXRlUGF0QWNjZXNzZXM6IFtcIlBPU1QgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2Vuc1wiXSxcbiAgICB1cGRhdGVXZWJob29rOiBbXCJQQVRDSCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH1cIl0sXG4gICAgdXBkYXRlV2ViaG9va0NvbmZpZ0Zvck9yZzogW1wiUEFUQ0ggL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L2NvbmZpZ1wiXVxuICB9LFxuICBwYWNrYWdlczoge1xuICAgIGRlbGV0ZVBhY2thZ2VGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlUGFja2FnZUZvck9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlUGFja2FnZUZvclVzZXI6IFtcbiAgICAgIFwiREVMRVRFIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9XCJcbiAgICBdLFxuICAgIGRlbGV0ZVBhY2thZ2VWZXJzaW9uRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiREVMRVRFIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZVBhY2thZ2VWZXJzaW9uRm9yT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVQYWNrYWdlVmVyc2lvbkZvclVzZXI6IFtcbiAgICAgIFwiREVMRVRFIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9XCJcbiAgICBdLFxuICAgIGdldEFsbFBhY2thZ2VWZXJzaW9uc0ZvckFQYWNrYWdlT3duZWRCeUFuT3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9uc1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInBhY2thZ2VzXCIsIFwiZ2V0QWxsUGFja2FnZVZlcnNpb25zRm9yUGFja2FnZU93bmVkQnlPcmdcIl0gfVxuICAgIF0sXG4gICAgZ2V0QWxsUGFja2FnZVZlcnNpb25zRm9yQVBhY2thZ2VPd25lZEJ5VGhlQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zXCIsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcmVuYW1lZDogW1xuICAgICAgICAgIFwicGFja2FnZXNcIixcbiAgICAgICAgICBcImdldEFsbFBhY2thZ2VWZXJzaW9uc0ZvclBhY2thZ2VPd25lZEJ5QXV0aGVudGljYXRlZFVzZXJcIlxuICAgICAgICBdXG4gICAgICB9XG4gICAgXSxcbiAgICBnZXRBbGxQYWNrYWdlVmVyc2lvbnNGb3JQYWNrYWdlT3duZWRCeUF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9uc1wiXG4gICAgXSxcbiAgICBnZXRBbGxQYWNrYWdlVmVyc2lvbnNGb3JQYWNrYWdlT3duZWRCeU9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnNcIlxuICAgIF0sXG4gICAgZ2V0QWxsUGFja2FnZVZlcnNpb25zRm9yUGFja2FnZU93bmVkQnlVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9uc1wiXG4gICAgXSxcbiAgICBnZXRQYWNrYWdlRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9XCJcbiAgICBdLFxuICAgIGdldFBhY2thZ2VGb3JPcmdhbml6YXRpb246IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9XCJcbiAgICBdLFxuICAgIGdldFBhY2thZ2VGb3JVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfVwiXG4gICAgXSxcbiAgICBnZXRQYWNrYWdlVmVyc2lvbkZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfVwiXG4gICAgXSxcbiAgICBnZXRQYWNrYWdlVmVyc2lvbkZvck9yZ2FuaXphdGlvbjogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH1cIlxuICAgIF0sXG4gICAgZ2V0UGFja2FnZVZlcnNpb25Gb3JVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfVwiXG4gICAgXSxcbiAgICBsaXN0RG9ja2VyTWlncmF0aW9uQ29uZmxpY3RpbmdQYWNrYWdlc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9kb2NrZXIvY29uZmxpY3RzXCJcbiAgICBdLFxuICAgIGxpc3REb2NrZXJNaWdyYXRpb25Db25mbGljdGluZ1BhY2thZ2VzRm9yT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9kb2NrZXIvY29uZmxpY3RzXCJcbiAgICBdLFxuICAgIGxpc3REb2NrZXJNaWdyYXRpb25Db25mbGljdGluZ1BhY2thZ2VzRm9yVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZG9ja2VyL2NvbmZsaWN0c1wiXG4gICAgXSxcbiAgICBsaXN0UGFja2FnZXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3BhY2thZ2VzXCJdLFxuICAgIGxpc3RQYWNrYWdlc0Zvck9yZ2FuaXphdGlvbjogW1wiR0VUIC9vcmdzL3tvcmd9L3BhY2thZ2VzXCJdLFxuICAgIGxpc3RQYWNrYWdlc0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlc1wiXSxcbiAgICByZXN0b3JlUGFja2FnZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBPU1QgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vcmVzdG9yZXs/dG9rZW59XCJcbiAgICBdLFxuICAgIHJlc3RvcmVQYWNrYWdlRm9yT3JnOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vcmVzdG9yZXs/dG9rZW59XCJcbiAgICBdLFxuICAgIHJlc3RvcmVQYWNrYWdlRm9yVXNlcjogW1xuICAgICAgXCJQT1NUIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3Jlc3RvcmV7P3Rva2VufVwiXG4gICAgXSxcbiAgICByZXN0b3JlUGFja2FnZVZlcnNpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQT1NUIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9L3Jlc3RvcmVcIlxuICAgIF0sXG4gICAgcmVzdG9yZVBhY2thZ2VWZXJzaW9uRm9yT3JnOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH0vcmVzdG9yZVwiXG4gICAgXSxcbiAgICByZXN0b3JlUGFja2FnZVZlcnNpb25Gb3JVc2VyOiBbXG4gICAgICBcIlBPU1QgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH0vcmVzdG9yZVwiXG4gICAgXVxuICB9LFxuICBwcm9qZWN0czoge1xuICAgIGFkZENvbGxhYm9yYXRvcjogW1wiUFVUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sbGFib3JhdG9ycy97dXNlcm5hbWV9XCJdLFxuICAgIGNyZWF0ZUNhcmQ6IFtcIlBPU1QgL3Byb2plY3RzL2NvbHVtbnMve2NvbHVtbl9pZH0vY2FyZHNcIl0sXG4gICAgY3JlYXRlQ29sdW1uOiBbXCJQT1NUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sdW1uc1wiXSxcbiAgICBjcmVhdGVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9wcm9qZWN0c1wiXSxcbiAgICBjcmVhdGVGb3JPcmc6IFtcIlBPU1QgL29yZ3Mve29yZ30vcHJvamVjdHNcIl0sXG4gICAgY3JlYXRlRm9yUmVwbzogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHJvamVjdHNcIl0sXG4gICAgZGVsZXRlOiBbXCJERUxFVEUgL3Byb2plY3RzL3twcm9qZWN0X2lkfVwiXSxcbiAgICBkZWxldGVDYXJkOiBbXCJERUxFVEUgL3Byb2plY3RzL2NvbHVtbnMvY2FyZHMve2NhcmRfaWR9XCJdLFxuICAgIGRlbGV0ZUNvbHVtbjogW1wiREVMRVRFIC9wcm9qZWN0cy9jb2x1bW5zL3tjb2x1bW5faWR9XCJdLFxuICAgIGdldDogW1wiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH1cIl0sXG4gICAgZ2V0Q2FyZDogW1wiR0VUIC9wcm9qZWN0cy9jb2x1bW5zL2NhcmRzL3tjYXJkX2lkfVwiXSxcbiAgICBnZXRDb2x1bW46IFtcIkdFVCAvcHJvamVjdHMvY29sdW1ucy97Y29sdW1uX2lkfVwiXSxcbiAgICBnZXRQZXJtaXNzaW9uRm9yVXNlcjogW1xuICAgICAgXCJHRVQgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX0vcGVybWlzc2lvblwiXG4gICAgXSxcbiAgICBsaXN0Q2FyZHM6IFtcIkdFVCAvcHJvamVjdHMvY29sdW1ucy97Y29sdW1uX2lkfS9jYXJkc1wiXSxcbiAgICBsaXN0Q29sbGFib3JhdG9yczogW1wiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sbGFib3JhdG9yc1wiXSxcbiAgICBsaXN0Q29sdW1uczogW1wiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sdW1uc1wiXSxcbiAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vcHJvamVjdHNcIl0sXG4gICAgbGlzdEZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHJvamVjdHNcIl0sXG4gICAgbGlzdEZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wcm9qZWN0c1wiXSxcbiAgICBtb3ZlQ2FyZDogW1wiUE9TVCAvcHJvamVjdHMvY29sdW1ucy9jYXJkcy97Y2FyZF9pZH0vbW92ZXNcIl0sXG4gICAgbW92ZUNvbHVtbjogW1wiUE9TVCAvcHJvamVjdHMvY29sdW1ucy97Y29sdW1uX2lkfS9tb3Zlc1wiXSxcbiAgICByZW1vdmVDb2xsYWJvcmF0b3I6IFtcbiAgICAgIFwiREVMRVRFIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sbGFib3JhdG9ycy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIHVwZGF0ZTogW1wiUEFUQ0ggL3Byb2plY3RzL3twcm9qZWN0X2lkfVwiXSxcbiAgICB1cGRhdGVDYXJkOiBbXCJQQVRDSCAvcHJvamVjdHMvY29sdW1ucy9jYXJkcy97Y2FyZF9pZH1cIl0sXG4gICAgdXBkYXRlQ29sdW1uOiBbXCJQQVRDSCAvcHJvamVjdHMvY29sdW1ucy97Y29sdW1uX2lkfVwiXVxuICB9LFxuICBwdWxsczoge1xuICAgIGNoZWNrSWZNZXJnZWQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9tZXJnZVwiXSxcbiAgICBjcmVhdGU6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzXCJdLFxuICAgIGNyZWF0ZVJlcGx5Rm9yUmV2aWV3Q29tbWVudDogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZXBsaWVzXCJcbiAgICBdLFxuICAgIGNyZWF0ZVJldmlldzogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzXCJdLFxuICAgIGNyZWF0ZVJldmlld0NvbW1lbnQ6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9jb21tZW50c1wiXG4gICAgXSxcbiAgICBkZWxldGVQZW5kaW5nUmV2aWV3OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzL3tyZXZpZXdfaWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZVJldmlld0NvbW1lbnQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50cy97Y29tbWVudF9pZH1cIlxuICAgIF0sXG4gICAgZGlzbWlzc1JldmlldzogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3cy97cmV2aWV3X2lkfS9kaXNtaXNzYWxzXCJcbiAgICBdLFxuICAgIGdldDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9XCJdLFxuICAgIGdldFJldmlldzogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3cy97cmV2aWV3X2lkfVwiXG4gICAgXSxcbiAgICBnZXRSZXZpZXdDb21tZW50OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXSxcbiAgICBsaXN0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzXCJdLFxuICAgIGxpc3RDb21tZW50c0ZvclJldmlldzogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3cy97cmV2aWV3X2lkfS9jb21tZW50c1wiXG4gICAgXSxcbiAgICBsaXN0Q29tbWl0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1pdHNcIl0sXG4gICAgbGlzdEZpbGVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vZmlsZXNcIl0sXG4gICAgbGlzdFJlcXVlc3RlZFJldmlld2VyczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmVxdWVzdGVkX3Jldmlld2Vyc1wiXG4gICAgXSxcbiAgICBsaXN0UmV2aWV3Q29tbWVudHM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1lbnRzXCJcbiAgICBdLFxuICAgIGxpc3RSZXZpZXdDb21tZW50c0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHNcIl0sXG4gICAgbGlzdFJldmlld3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzXCJdLFxuICAgIG1lcmdlOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vbWVyZ2VcIl0sXG4gICAgcmVtb3ZlUmVxdWVzdGVkUmV2aWV3ZXJzOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXF1ZXN0ZWRfcmV2aWV3ZXJzXCJcbiAgICBdLFxuICAgIHJlcXVlc3RSZXZpZXdlcnM6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXF1ZXN0ZWRfcmV2aWV3ZXJzXCJcbiAgICBdLFxuICAgIHN1Ym1pdFJldmlldzogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3Mve3Jldmlld19pZH0vZXZlbnRzXCJcbiAgICBdLFxuICAgIHVwZGF0ZTogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn1cIl0sXG4gICAgdXBkYXRlQnJhbmNoOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS91cGRhdGUtYnJhbmNoXCJcbiAgICBdLFxuICAgIHVwZGF0ZVJldmlldzogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3cy97cmV2aWV3X2lkfVwiXG4gICAgXSxcbiAgICB1cGRhdGVSZXZpZXdDb21tZW50OiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50cy97Y29tbWVudF9pZH1cIlxuICAgIF1cbiAgfSxcbiAgcmF0ZUxpbWl0OiB7IGdldDogW1wiR0VUIC9yYXRlX2xpbWl0XCJdIH0sXG4gIHJlYWN0aW9uczoge1xuICAgIGNyZWF0ZUZvckNvbW1pdENvbW1lbnQ6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBjcmVhdGVGb3JJc3N1ZTogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGNyZWF0ZUZvcklzc3VlQ29tbWVudDogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBjcmVhdGVGb3JQdWxsUmVxdWVzdFJldmlld0NvbW1lbnQ6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBjcmVhdGVGb3JSZWxlYXNlOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9yZWFjdGlvbnNcIlxuICAgIF0sXG4gICAgY3JlYXRlRm9yVGVhbURpc2N1c3Npb25Db21tZW50SW5Pcmc6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGNyZWF0ZUZvclRlYW1EaXNjdXNzaW9uSW5Pcmc6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBkZWxldGVGb3JDb21taXRDb21tZW50OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9ucy97cmVhY3Rpb25faWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUZvcklzc3VlOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L3JlYWN0aW9ucy97cmVhY3Rpb25faWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUZvcklzc3VlQ29tbWVudDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlRm9yUHVsbFJlcXVlc3RDb21tZW50OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9ucy97cmVhY3Rpb25faWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUZvclJlbGVhc2U6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlRm9yVGVhbURpc2N1c3Npb246IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlRm9yVGVhbURpc2N1c3Npb25Db21tZW50OiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgbGlzdEZvckNvbW1pdENvbW1lbnQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGxpc3RGb3JJc3N1ZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vcmVhY3Rpb25zXCJdLFxuICAgIGxpc3RGb3JJc3N1ZUNvbW1lbnQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBsaXN0Rm9yUHVsbFJlcXVlc3RSZXZpZXdDb21tZW50OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBsaXN0Rm9yUmVsZWFzZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9yZWFjdGlvbnNcIlxuICAgIF0sXG4gICAgbGlzdEZvclRlYW1EaXNjdXNzaW9uQ29tbWVudEluT3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGxpc3RGb3JUZWFtRGlzY3Vzc2lvbkluT3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L3JlYWN0aW9uc1wiXG4gICAgXVxuICB9LFxuICByZXBvczoge1xuICAgIGFjY2VwdEludml0YXRpb246IFtcbiAgICAgIFwiUEFUQ0ggL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJyZXBvc1wiLCBcImFjY2VwdEludml0YXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBhY2NlcHRJbnZpdGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiUEFUQ0ggL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgYWRkQXBwQWNjZXNzUmVzdHJpY3Rpb25zOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL2FwcHNcIixcbiAgICAgIHt9LFxuICAgICAgeyBtYXBUb0RhdGE6IFwiYXBwc1wiIH1cbiAgICBdLFxuICAgIGFkZENvbGxhYm9yYXRvcjogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX1cIl0sXG4gICAgYWRkU3RhdHVzQ2hlY2tDb250ZXh0czogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3N0YXR1c19jaGVja3MvY29udGV4dHNcIixcbiAgICAgIHt9LFxuICAgICAgeyBtYXBUb0RhdGE6IFwiY29udGV4dHNcIiB9XG4gICAgXSxcbiAgICBhZGRUZWFtQWNjZXNzUmVzdHJpY3Rpb25zOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3RlYW1zXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcInRlYW1zXCIgfVxuICAgIF0sXG4gICAgYWRkVXNlckFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy91c2Vyc1wiLFxuICAgICAge30sXG4gICAgICB7IG1hcFRvRGF0YTogXCJ1c2Vyc1wiIH1cbiAgICBdLFxuICAgIGNoZWNrQXV0b21hdGVkU2VjdXJpdHlGaXhlczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2F1dG9tYXRlZC1zZWN1cml0eS1maXhlc1wiXG4gICAgXSxcbiAgICBjaGVja0NvbGxhYm9yYXRvcjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX1cIl0sXG4gICAgY2hlY2tWdWxuZXJhYmlsaXR5QWxlcnRzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdnVsbmVyYWJpbGl0eS1hbGVydHNcIlxuICAgIF0sXG4gICAgY29kZW93bmVyc0Vycm9yczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlb3duZXJzL2Vycm9yc1wiXSxcbiAgICBjb21wYXJlQ29tbWl0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21wYXJlL3tiYXNlfS4uLntoZWFkfVwiXSxcbiAgICBjb21wYXJlQ29tbWl0c1dpdGhCYXNlaGVhZDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbXBhcmUve2Jhc2VoZWFkfVwiXG4gICAgXSxcbiAgICBjcmVhdGVBdXRvbGluazogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXV0b2xpbmtzXCJdLFxuICAgIGNyZWF0ZUNvbW1pdENvbW1lbnQ6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97Y29tbWl0X3NoYX0vY29tbWVudHNcIlxuICAgIF0sXG4gICAgY3JlYXRlQ29tbWl0U2lnbmF0dXJlUHJvdGVjdGlvbjogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3NpZ25hdHVyZXNcIlxuICAgIF0sXG4gICAgY3JlYXRlQ29tbWl0U3RhdHVzOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGF0dXNlcy97c2hhfVwiXSxcbiAgICBjcmVhdGVEZXBsb3lLZXk6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2tleXNcIl0sXG4gICAgY3JlYXRlRGVwbG95bWVudDogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHNcIl0sXG4gICAgY3JlYXRlRGVwbG95bWVudEJyYW5jaFBvbGljeTogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L2RlcGxveW1lbnQtYnJhbmNoLXBvbGljaWVzXCJcbiAgICBdLFxuICAgIGNyZWF0ZURlcGxveW1lbnRQcm90ZWN0aW9uUnVsZTogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L2RlcGxveW1lbnRfcHJvdGVjdGlvbl9ydWxlc1wiXG4gICAgXSxcbiAgICBjcmVhdGVEZXBsb3ltZW50U3RhdHVzOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50X2lkfS9zdGF0dXNlc1wiXG4gICAgXSxcbiAgICBjcmVhdGVEaXNwYXRjaEV2ZW50OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kaXNwYXRjaGVzXCJdLFxuICAgIGNyZWF0ZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL3JlcG9zXCJdLFxuICAgIGNyZWF0ZUZvcms6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ZvcmtzXCJdLFxuICAgIGNyZWF0ZUluT3JnOiBbXCJQT1NUIC9vcmdzL3tvcmd9L3JlcG9zXCJdLFxuICAgIGNyZWF0ZU9yVXBkYXRlRW52aXJvbm1lbnQ6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9XCJcbiAgICBdLFxuICAgIGNyZWF0ZU9yVXBkYXRlRmlsZUNvbnRlbnRzOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbnRlbnRzL3twYXRofVwiXSxcbiAgICBjcmVhdGVPcmdSdWxlc2V0OiBbXCJQT1NUIC9vcmdzL3tvcmd9L3J1bGVzZXRzXCJdLFxuICAgIGNyZWF0ZVBhZ2VzRGVwbG95bWVudDogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvZGVwbG95bWVudFwiXSxcbiAgICBjcmVhdGVQYWdlc1NpdGU6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzXCJdLFxuICAgIGNyZWF0ZVJlbGVhc2U6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzXCJdLFxuICAgIGNyZWF0ZVJlcG9SdWxlc2V0OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0c1wiXSxcbiAgICBjcmVhdGVUYWdQcm90ZWN0aW9uOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90YWdzL3Byb3RlY3Rpb25cIl0sXG4gICAgY3JlYXRlVXNpbmdUZW1wbGF0ZTogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97dGVtcGxhdGVfb3duZXJ9L3t0ZW1wbGF0ZV9yZXBvfS9nZW5lcmF0ZVwiXG4gICAgXSxcbiAgICBjcmVhdGVXZWJob29rOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rc1wiXSxcbiAgICBkZWNsaW5lSW52aXRhdGlvbjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJyZXBvc1wiLCBcImRlY2xpbmVJbnZpdGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgZGVjbGluZUludml0YXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99XCJdLFxuICAgIGRlbGV0ZUFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zXCJcbiAgICBdLFxuICAgIGRlbGV0ZUFkbWluQnJhbmNoUHJvdGVjdGlvbjogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vZW5mb3JjZV9hZG1pbnNcIlxuICAgIF0sXG4gICAgZGVsZXRlQW5FbnZpcm9ubWVudDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlQXV0b2xpbms6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYXV0b2xpbmtzL3thdXRvbGlua19pZH1cIl0sXG4gICAgZGVsZXRlQnJhbmNoUHJvdGVjdGlvbjogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb25cIlxuICAgIF0sXG4gICAgZGVsZXRlQ29tbWl0Q29tbWVudDogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgZGVsZXRlQ29tbWl0U2lnbmF0dXJlUHJvdGVjdGlvbjogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc2lnbmF0dXJlc1wiXG4gICAgXSxcbiAgICBkZWxldGVEZXBsb3lLZXk6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30va2V5cy97a2V5X2lkfVwiXSxcbiAgICBkZWxldGVEZXBsb3ltZW50OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHMve2RlcGxveW1lbnRfaWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZURlcGxveW1lbnRCcmFuY2hQb2xpY3k6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L2RlcGxveW1lbnQtYnJhbmNoLXBvbGljaWVzL3ticmFuY2hfcG9saWN5X2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVGaWxlOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbnRlbnRzL3twYXRofVwiXSxcbiAgICBkZWxldGVJbnZpdGF0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaW52aXRhdGlvbnMve2ludml0YXRpb25faWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZU9yZ1J1bGVzZXQ6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9ydWxlc2V0cy97cnVsZXNldF9pZH1cIl0sXG4gICAgZGVsZXRlUGFnZXNTaXRlOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzXCJdLFxuICAgIGRlbGV0ZVB1bGxSZXF1ZXN0UmV2aWV3UHJvdGVjdGlvbjogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfcHVsbF9yZXF1ZXN0X3Jldmlld3NcIlxuICAgIF0sXG4gICAgZGVsZXRlUmVsZWFzZTogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH1cIl0sXG4gICAgZGVsZXRlUmVsZWFzZUFzc2V0OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvYXNzZXRzL3thc3NldF9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlUmVwb1J1bGVzZXQ6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMve3J1bGVzZXRfaWR9XCJdLFxuICAgIGRlbGV0ZVRhZ1Byb3RlY3Rpb246IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90YWdzL3Byb3RlY3Rpb24ve3RhZ19wcm90ZWN0aW9uX2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVXZWJob29rOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfVwiXSxcbiAgICBkaXNhYmxlQXV0b21hdGVkU2VjdXJpdHlGaXhlczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2F1dG9tYXRlZC1zZWN1cml0eS1maXhlc1wiXG4gICAgXSxcbiAgICBkaXNhYmxlRGVwbG95bWVudFByb3RlY3Rpb25SdWxlOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9kZXBsb3ltZW50X3Byb3RlY3Rpb25fcnVsZXMve3Byb3RlY3Rpb25fcnVsZV9pZH1cIlxuICAgIF0sXG4gICAgZGlzYWJsZVByaXZhdGVWdWxuZXJhYmlsaXR5UmVwb3J0aW5nOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcHJpdmF0ZS12dWxuZXJhYmlsaXR5LXJlcG9ydGluZ1wiXG4gICAgXSxcbiAgICBkaXNhYmxlVnVsbmVyYWJpbGl0eUFsZXJ0czogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3Z1bG5lcmFiaWxpdHktYWxlcnRzXCJcbiAgICBdLFxuICAgIGRvd25sb2FkQXJjaGl2ZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3ppcGJhbGwve3JlZn1cIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJyZXBvc1wiLCBcImRvd25sb2FkWmlwYmFsbEFyY2hpdmVcIl0gfVxuICAgIF0sXG4gICAgZG93bmxvYWRUYXJiYWxsQXJjaGl2ZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90YXJiYWxsL3tyZWZ9XCJdLFxuICAgIGRvd25sb2FkWmlwYmFsbEFyY2hpdmU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vemlwYmFsbC97cmVmfVwiXSxcbiAgICBlbmFibGVBdXRvbWF0ZWRTZWN1cml0eUZpeGVzOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXV0b21hdGVkLXNlY3VyaXR5LWZpeGVzXCJcbiAgICBdLFxuICAgIGVuYWJsZVByaXZhdGVWdWxuZXJhYmlsaXR5UmVwb3J0aW5nOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHJpdmF0ZS12dWxuZXJhYmlsaXR5LXJlcG9ydGluZ1wiXG4gICAgXSxcbiAgICBlbmFibGVWdWxuZXJhYmlsaXR5QWxlcnRzOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vdnVsbmVyYWJpbGl0eS1hbGVydHNcIlxuICAgIF0sXG4gICAgZ2VuZXJhdGVSZWxlYXNlTm90ZXM6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvZ2VuZXJhdGUtbm90ZXNcIlxuICAgIF0sXG4gICAgZ2V0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99XCJdLFxuICAgIGdldEFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zXCJcbiAgICBdLFxuICAgIGdldEFkbWluQnJhbmNoUHJvdGVjdGlvbjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vZW5mb3JjZV9hZG1pbnNcIlxuICAgIF0sXG4gICAgZ2V0QWxsRGVwbG95bWVudFByb3RlY3Rpb25SdWxlczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudF9wcm90ZWN0aW9uX3J1bGVzXCJcbiAgICBdLFxuICAgIGdldEFsbEVudmlyb25tZW50czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHNcIl0sXG4gICAgZ2V0QWxsU3RhdHVzQ2hlY2tDb250ZXh0czogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc3RhdHVzX2NoZWNrcy9jb250ZXh0c1wiXG4gICAgXSxcbiAgICBnZXRBbGxUb3BpY3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdG9waWNzXCJdLFxuICAgIGdldEFwcHNXaXRoQWNjZXNzVG9Qcm90ZWN0ZWRCcmFuY2g6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy9hcHBzXCJcbiAgICBdLFxuICAgIGdldEF1dG9saW5rOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2F1dG9saW5rcy97YXV0b2xpbmtfaWR9XCJdLFxuICAgIGdldEJyYW5jaDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofVwiXSxcbiAgICBnZXRCcmFuY2hQcm90ZWN0aW9uOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvblwiXG4gICAgXSxcbiAgICBnZXRCcmFuY2hSdWxlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlcy9icmFuY2hlcy97YnJhbmNofVwiXSxcbiAgICBnZXRDbG9uZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdHJhZmZpYy9jbG9uZXNcIl0sXG4gICAgZ2V0Q29kZUZyZXF1ZW5jeVN0YXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N0YXRzL2NvZGVfZnJlcXVlbmN5XCJdLFxuICAgIGdldENvbGxhYm9yYXRvclBlcm1pc3Npb25MZXZlbDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfS9wZXJtaXNzaW9uXCJcbiAgICBdLFxuICAgIGdldENvbWJpbmVkU3RhdHVzRm9yUmVmOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vc3RhdHVzXCJdLFxuICAgIGdldENvbW1pdDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9XCJdLFxuICAgIGdldENvbW1pdEFjdGl2aXR5U3RhdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3RhdHMvY29tbWl0X2FjdGl2aXR5XCJdLFxuICAgIGdldENvbW1pdENvbW1lbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHMve2NvbW1lbnRfaWR9XCJdLFxuICAgIGdldENvbW1pdFNpZ25hdHVyZVByb3RlY3Rpb246IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3NpZ25hdHVyZXNcIlxuICAgIF0sXG4gICAgZ2V0Q29tbXVuaXR5UHJvZmlsZU1ldHJpY3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbXVuaXR5L3Byb2ZpbGVcIl0sXG4gICAgZ2V0Q29udGVudDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb250ZW50cy97cGF0aH1cIl0sXG4gICAgZ2V0Q29udHJpYnV0b3JzU3RhdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3RhdHMvY29udHJpYnV0b3JzXCJdLFxuICAgIGdldEN1c3RvbURlcGxveW1lbnRQcm90ZWN0aW9uUnVsZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudF9wcm90ZWN0aW9uX3J1bGVzL3twcm90ZWN0aW9uX3J1bGVfaWR9XCJcbiAgICBdLFxuICAgIGdldEN1c3RvbVByb3BlcnRpZXNWYWx1ZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHJvcGVydGllcy92YWx1ZXNcIl0sXG4gICAgZ2V0RGVwbG95S2V5OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2tleXMve2tleV9pZH1cIl0sXG4gICAgZ2V0RGVwbG95bWVudDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50cy97ZGVwbG95bWVudF9pZH1cIl0sXG4gICAgZ2V0RGVwbG95bWVudEJyYW5jaFBvbGljeTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudC1icmFuY2gtcG9saWNpZXMve2JyYW5jaF9wb2xpY3lfaWR9XCJcbiAgICBdLFxuICAgIGdldERlcGxveW1lbnRTdGF0dXM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50cy97ZGVwbG95bWVudF9pZH0vc3RhdHVzZXMve3N0YXR1c19pZH1cIlxuICAgIF0sXG4gICAgZ2V0RW52aXJvbm1lbnQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9XCJcbiAgICBdLFxuICAgIGdldExhdGVzdFBhZ2VzQnVpbGQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvYnVpbGRzL2xhdGVzdFwiXSxcbiAgICBnZXRMYXRlc3RSZWxlYXNlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL2xhdGVzdFwiXSxcbiAgICBnZXRPcmdSdWxlU3VpdGU6IFtcIkdFVCAvb3Jncy97b3JnfS9ydWxlc2V0cy9ydWxlLXN1aXRlcy97cnVsZV9zdWl0ZV9pZH1cIl0sXG4gICAgZ2V0T3JnUnVsZVN1aXRlczogW1wiR0VUIC9vcmdzL3tvcmd9L3J1bGVzZXRzL3J1bGUtc3VpdGVzXCJdLFxuICAgIGdldE9yZ1J1bGVzZXQ6IFtcIkdFVCAvb3Jncy97b3JnfS9ydWxlc2V0cy97cnVsZXNldF9pZH1cIl0sXG4gICAgZ2V0T3JnUnVsZXNldHM6IFtcIkdFVCAvb3Jncy97b3JnfS9ydWxlc2V0c1wiXSxcbiAgICBnZXRQYWdlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wYWdlc1wiXSxcbiAgICBnZXRQYWdlc0J1aWxkOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzL2J1aWxkcy97YnVpbGRfaWR9XCJdLFxuICAgIGdldFBhZ2VzSGVhbHRoQ2hlY2s6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvaGVhbHRoXCJdLFxuICAgIGdldFBhcnRpY2lwYXRpb25TdGF0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGF0cy9wYXJ0aWNpcGF0aW9uXCJdLFxuICAgIGdldFB1bGxSZXF1ZXN0UmV2aWV3UHJvdGVjdGlvbjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfcHVsbF9yZXF1ZXN0X3Jldmlld3NcIlxuICAgIF0sXG4gICAgZ2V0UHVuY2hDYXJkU3RhdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3RhdHMvcHVuY2hfY2FyZFwiXSxcbiAgICBnZXRSZWFkbWU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVhZG1lXCJdLFxuICAgIGdldFJlYWRtZUluRGlyZWN0b3J5OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlYWRtZS97ZGlyfVwiXSxcbiAgICBnZXRSZWxlYXNlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfVwiXSxcbiAgICBnZXRSZWxlYXNlQXNzZXQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvYXNzZXRzL3thc3NldF9pZH1cIl0sXG4gICAgZ2V0UmVsZWFzZUJ5VGFnOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3RhZ3Mve3RhZ31cIl0sXG4gICAgZ2V0UmVwb1J1bGVTdWl0ZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzL3J1bGUtc3VpdGVzL3tydWxlX3N1aXRlX2lkfVwiXG4gICAgXSxcbiAgICBnZXRSZXBvUnVsZVN1aXRlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy9ydWxlLXN1aXRlc1wiXSxcbiAgICBnZXRSZXBvUnVsZXNldDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy97cnVsZXNldF9pZH1cIl0sXG4gICAgZ2V0UmVwb1J1bGVzZXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzXCJdLFxuICAgIGdldFN0YXR1c0NoZWNrc1Byb3RlY3Rpb246IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3N0YXR1c19jaGVja3NcIlxuICAgIF0sXG4gICAgZ2V0VGVhbXNXaXRoQWNjZXNzVG9Qcm90ZWN0ZWRCcmFuY2g6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy90ZWFtc1wiXG4gICAgXSxcbiAgICBnZXRUb3BQYXRoczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90cmFmZmljL3BvcHVsYXIvcGF0aHNcIl0sXG4gICAgZ2V0VG9wUmVmZXJyZXJzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RyYWZmaWMvcG9wdWxhci9yZWZlcnJlcnNcIl0sXG4gICAgZ2V0VXNlcnNXaXRoQWNjZXNzVG9Qcm90ZWN0ZWRCcmFuY2g6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy91c2Vyc1wiXG4gICAgXSxcbiAgICBnZXRWaWV3czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90cmFmZmljL3ZpZXdzXCJdLFxuICAgIGdldFdlYmhvb2s6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgIGdldFdlYmhvb2tDb25maWdGb3JSZXBvOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9L2NvbmZpZ1wiXG4gICAgXSxcbiAgICBnZXRXZWJob29rRGVsaXZlcnk6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllcy97ZGVsaXZlcnlfaWR9XCJcbiAgICBdLFxuICAgIGxpc3RBY3Rpdml0aWVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGl2aXR5XCJdLFxuICAgIGxpc3RBdXRvbGlua3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXV0b2xpbmtzXCJdLFxuICAgIGxpc3RCcmFuY2hlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlc1wiXSxcbiAgICBsaXN0QnJhbmNoZXNGb3JIZWFkQ29tbWl0OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97Y29tbWl0X3NoYX0vYnJhbmNoZXMtd2hlcmUtaGVhZFwiXG4gICAgXSxcbiAgICBsaXN0Q29sbGFib3JhdG9yczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2xsYWJvcmF0b3JzXCJdLFxuICAgIGxpc3RDb21tZW50c0ZvckNvbW1pdDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve2NvbW1pdF9zaGF9L2NvbW1lbnRzXCJcbiAgICBdLFxuICAgIGxpc3RDb21taXRDb21tZW50c0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHNcIl0sXG4gICAgbGlzdENvbW1pdFN0YXR1c2VzRm9yUmVmOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9zdGF0dXNlc1wiXG4gICAgXSxcbiAgICBsaXN0Q29tbWl0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzXCJdLFxuICAgIGxpc3RDb250cmlidXRvcnM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29udHJpYnV0b3JzXCJdLFxuICAgIGxpc3RDdXN0b21EZXBsb3ltZW50UnVsZUludGVncmF0aW9uczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudF9wcm90ZWN0aW9uX3J1bGVzL2FwcHNcIlxuICAgIF0sXG4gICAgbGlzdERlcGxveUtleXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30va2V5c1wiXSxcbiAgICBsaXN0RGVwbG95bWVudEJyYW5jaFBvbGljaWVzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9kZXBsb3ltZW50LWJyYW5jaC1wb2xpY2llc1wiXG4gICAgXSxcbiAgICBsaXN0RGVwbG95bWVudFN0YXR1c2VzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHMve2RlcGxveW1lbnRfaWR9L3N0YXR1c2VzXCJcbiAgICBdLFxuICAgIGxpc3REZXBsb3ltZW50czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50c1wiXSxcbiAgICBsaXN0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9yZXBvc1wiXSxcbiAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vcmVwb3NcIl0sXG4gICAgbGlzdEZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9yZXBvc1wiXSxcbiAgICBsaXN0Rm9ya3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZm9ya3NcIl0sXG4gICAgbGlzdEludml0YXRpb25zOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludml0YXRpb25zXCJdLFxuICAgIGxpc3RJbnZpdGF0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9uc1wiXSxcbiAgICBsaXN0TGFuZ3VhZ2VzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhbmd1YWdlc1wiXSxcbiAgICBsaXN0UGFnZXNCdWlsZHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvYnVpbGRzXCJdLFxuICAgIGxpc3RQdWJsaWM6IFtcIkdFVCAvcmVwb3NpdG9yaWVzXCJdLFxuICAgIGxpc3RQdWxsUmVxdWVzdHNBc3NvY2lhdGVkV2l0aENvbW1pdDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve2NvbW1pdF9zaGF9L3B1bGxzXCJcbiAgICBdLFxuICAgIGxpc3RSZWxlYXNlQXNzZXRzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9L2Fzc2V0c1wiXG4gICAgXSxcbiAgICBsaXN0UmVsZWFzZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXNcIl0sXG4gICAgbGlzdFRhZ1Byb3RlY3Rpb246IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdGFncy9wcm90ZWN0aW9uXCJdLFxuICAgIGxpc3RUYWdzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RhZ3NcIl0sXG4gICAgbGlzdFRlYW1zOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RlYW1zXCJdLFxuICAgIGxpc3RXZWJob29rRGVsaXZlcmllczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzXCJcbiAgICBdLFxuICAgIGxpc3RXZWJob29rczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rc1wiXSxcbiAgICBtZXJnZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWVyZ2VzXCJdLFxuICAgIG1lcmdlVXBzdHJlYW06IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L21lcmdlLXVwc3RyZWFtXCJdLFxuICAgIHBpbmdXZWJob29rOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vcGluZ3NcIl0sXG4gICAgcmVkZWxpdmVyV2ViaG9va0RlbGl2ZXJ5OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzL3tkZWxpdmVyeV9pZH0vYXR0ZW1wdHNcIlxuICAgIF0sXG4gICAgcmVtb3ZlQXBwQWNjZXNzUmVzdHJpY3Rpb25zOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvYXBwc1wiLFxuICAgICAge30sXG4gICAgICB7IG1hcFRvRGF0YTogXCJhcHBzXCIgfVxuICAgIF0sXG4gICAgcmVtb3ZlQ29sbGFib3JhdG9yOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vY29sbGFib3JhdG9ycy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIHJlbW92ZVN0YXR1c0NoZWNrQ29udGV4dHM6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3N0YXR1c19jaGVja3MvY29udGV4dHNcIixcbiAgICAgIHt9LFxuICAgICAgeyBtYXBUb0RhdGE6IFwiY29udGV4dHNcIiB9XG4gICAgXSxcbiAgICByZW1vdmVTdGF0dXNDaGVja1Byb3RlY3Rpb246IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3N0YXR1c19jaGVja3NcIlxuICAgIF0sXG4gICAgcmVtb3ZlVGVhbUFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3RlYW1zXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcInRlYW1zXCIgfVxuICAgIF0sXG4gICAgcmVtb3ZlVXNlckFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3VzZXJzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcInVzZXJzXCIgfVxuICAgIF0sXG4gICAgcmVuYW1lQnJhbmNoOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9yZW5hbWVcIl0sXG4gICAgcmVwbGFjZUFsbFRvcGljczogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90b3BpY3NcIl0sXG4gICAgcmVxdWVzdFBhZ2VzQnVpbGQ6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzL2J1aWxkc1wiXSxcbiAgICBzZXRBZG1pbkJyYW5jaFByb3RlY3Rpb246IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9lbmZvcmNlX2FkbWluc1wiXG4gICAgXSxcbiAgICBzZXRBcHBBY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy9hcHBzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcImFwcHNcIiB9XG4gICAgXSxcbiAgICBzZXRTdGF0dXNDaGVja0NvbnRleHRzOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzL2NvbnRleHRzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcImNvbnRleHRzXCIgfVxuICAgIF0sXG4gICAgc2V0VGVhbUFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3RlYW1zXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcInRlYW1zXCIgfVxuICAgIF0sXG4gICAgc2V0VXNlckFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3VzZXJzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcInVzZXJzXCIgfVxuICAgIF0sXG4gICAgdGVzdFB1c2hXZWJob29rOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vdGVzdHNcIl0sXG4gICAgdHJhbnNmZXI6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RyYW5zZmVyXCJdLFxuICAgIHVwZGF0ZTogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99XCJdLFxuICAgIHVwZGF0ZUJyYW5jaFByb3RlY3Rpb246IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uXCJcbiAgICBdLFxuICAgIHVwZGF0ZUNvbW1pdENvbW1lbnQ6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgdXBkYXRlRGVwbG95bWVudEJyYW5jaFBvbGljeTogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudC1icmFuY2gtcG9saWNpZXMve2JyYW5jaF9wb2xpY3lfaWR9XCJcbiAgICBdLFxuICAgIHVwZGF0ZUluZm9ybWF0aW9uQWJvdXRQYWdlc1NpdGU6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXNcIl0sXG4gICAgdXBkYXRlSW52aXRhdGlvbjogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vaW52aXRhdGlvbnMve2ludml0YXRpb25faWR9XCJcbiAgICBdLFxuICAgIHVwZGF0ZU9yZ1J1bGVzZXQ6IFtcIlBVVCAvb3Jncy97b3JnfS9ydWxlc2V0cy97cnVsZXNldF9pZH1cIl0sXG4gICAgdXBkYXRlUHVsbFJlcXVlc3RSZXZpZXdQcm90ZWN0aW9uOiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3B1bGxfcmVxdWVzdF9yZXZpZXdzXCJcbiAgICBdLFxuICAgIHVwZGF0ZVJlbGVhc2U6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH1cIl0sXG4gICAgdXBkYXRlUmVsZWFzZUFzc2V0OiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy9hc3NldHMve2Fzc2V0X2lkfVwiXG4gICAgXSxcbiAgICB1cGRhdGVSZXBvUnVsZXNldDogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy97cnVsZXNldF9pZH1cIl0sXG4gICAgdXBkYXRlU3RhdHVzQ2hlY2tQb3RlY3Rpb246IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc3RhdHVzX2NoZWNrc1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInJlcG9zXCIsIFwidXBkYXRlU3RhdHVzQ2hlY2tQcm90ZWN0aW9uXCJdIH1cbiAgICBdLFxuICAgIHVwZGF0ZVN0YXR1c0NoZWNrUHJvdGVjdGlvbjogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzXCJcbiAgICBdLFxuICAgIHVwZGF0ZVdlYmhvb2s6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH1cIl0sXG4gICAgdXBkYXRlV2ViaG9va0NvbmZpZ0ZvclJlcG86IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS9jb25maWdcIlxuICAgIF0sXG4gICAgdXBsb2FkUmVsZWFzZUFzc2V0OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9hc3NldHN7P25hbWUsbGFiZWx9XCIsXG4gICAgICB7IGJhc2VVcmw6IFwiaHR0cHM6Ly91cGxvYWRzLmdpdGh1Yi5jb21cIiB9XG4gICAgXVxuICB9LFxuICBzZWFyY2g6IHtcbiAgICBjb2RlOiBbXCJHRVQgL3NlYXJjaC9jb2RlXCJdLFxuICAgIGNvbW1pdHM6IFtcIkdFVCAvc2VhcmNoL2NvbW1pdHNcIl0sXG4gICAgaXNzdWVzQW5kUHVsbFJlcXVlc3RzOiBbXCJHRVQgL3NlYXJjaC9pc3N1ZXNcIl0sXG4gICAgbGFiZWxzOiBbXCJHRVQgL3NlYXJjaC9sYWJlbHNcIl0sXG4gICAgcmVwb3M6IFtcIkdFVCAvc2VhcmNoL3JlcG9zaXRvcmllc1wiXSxcbiAgICB0b3BpY3M6IFtcIkdFVCAvc2VhcmNoL3RvcGljc1wiXSxcbiAgICB1c2VyczogW1wiR0VUIC9zZWFyY2gvdXNlcnNcIl1cbiAgfSxcbiAgc2VjcmV0U2Nhbm5pbmc6IHtcbiAgICBnZXRBbGVydDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3JldC1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn1cIlxuICAgIF0sXG4gICAgbGlzdEFsZXJ0c0ZvckVudGVycHJpc2U6IFtcbiAgICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiXG4gICAgXSxcbiAgICBsaXN0QWxlcnRzRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiXSxcbiAgICBsaXN0QWxlcnRzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWNyZXQtc2Nhbm5pbmcvYWxlcnRzXCJdLFxuICAgIGxpc3RMb2NhdGlvbnNGb3JBbGVydDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3JldC1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn0vbG9jYXRpb25zXCJcbiAgICBdLFxuICAgIHVwZGF0ZUFsZXJ0OiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWNyZXQtc2Nhbm5pbmcvYWxlcnRzL3thbGVydF9udW1iZXJ9XCJcbiAgICBdXG4gIH0sXG4gIHNlY3VyaXR5QWR2aXNvcmllczoge1xuICAgIGNyZWF0ZVByaXZhdGVWdWxuZXJhYmlsaXR5UmVwb3J0OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3VyaXR5LWFkdmlzb3JpZXMvcmVwb3J0c1wiXG4gICAgXSxcbiAgICBjcmVhdGVSZXBvc2l0b3J5QWR2aXNvcnk6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjdXJpdHktYWR2aXNvcmllc1wiXG4gICAgXSxcbiAgICBjcmVhdGVSZXBvc2l0b3J5QWR2aXNvcnlDdmVSZXF1ZXN0OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3VyaXR5LWFkdmlzb3JpZXMve2doc2FfaWR9L2N2ZVwiXG4gICAgXSxcbiAgICBnZXRHbG9iYWxBZHZpc29yeTogW1wiR0VUIC9hZHZpc29yaWVzL3tnaHNhX2lkfVwiXSxcbiAgICBnZXRSZXBvc2l0b3J5QWR2aXNvcnk6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWN1cml0eS1hZHZpc29yaWVzL3tnaHNhX2lkfVwiXG4gICAgXSxcbiAgICBsaXN0R2xvYmFsQWR2aXNvcmllczogW1wiR0VUIC9hZHZpc29yaWVzXCJdLFxuICAgIGxpc3RPcmdSZXBvc2l0b3J5QWR2aXNvcmllczogW1wiR0VUIC9vcmdzL3tvcmd9L3NlY3VyaXR5LWFkdmlzb3JpZXNcIl0sXG4gICAgbGlzdFJlcG9zaXRvcnlBZHZpc29yaWVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3VyaXR5LWFkdmlzb3JpZXNcIl0sXG4gICAgdXBkYXRlUmVwb3NpdG9yeUFkdmlzb3J5OiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWN1cml0eS1hZHZpc29yaWVzL3tnaHNhX2lkfVwiXG4gICAgXVxuICB9LFxuICB0ZWFtczoge1xuICAgIGFkZE9yVXBkYXRlTWVtYmVyc2hpcEZvclVzZXJJbk9yZzogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vbWVtYmVyc2hpcHMve3VzZXJuYW1lfVwiXG4gICAgXSxcbiAgICBhZGRPclVwZGF0ZVByb2plY3RQZXJtaXNzaW9uc0luT3JnOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9wcm9qZWN0cy97cHJvamVjdF9pZH1cIlxuICAgIF0sXG4gICAgYWRkT3JVcGRhdGVSZXBvUGVybWlzc2lvbnNJbk9yZzogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcmVwb3Mve293bmVyfS97cmVwb31cIlxuICAgIF0sXG4gICAgY2hlY2tQZXJtaXNzaW9uc0ZvclByb2plY3RJbk9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcHJvamVjdHMve3Byb2plY3RfaWR9XCJcbiAgICBdLFxuICAgIGNoZWNrUGVybWlzc2lvbnNGb3JSZXBvSW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3JlcG9zL3tvd25lcn0ve3JlcG99XCJcbiAgICBdLFxuICAgIGNyZWF0ZTogW1wiUE9TVCAvb3Jncy97b3JnfS90ZWFtc1wiXSxcbiAgICBjcmVhdGVEaXNjdXNzaW9uQ29tbWVudEluT3JnOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50c1wiXG4gICAgXSxcbiAgICBjcmVhdGVEaXNjdXNzaW9uSW5Pcmc6IFtcIlBPU1QgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnNcIl0sXG4gICAgZGVsZXRlRGlzY3Vzc2lvbkNvbW1lbnRJbk9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50cy97Y29tbWVudF9udW1iZXJ9XCJcbiAgICBdLFxuICAgIGRlbGV0ZURpc2N1c3Npb25Jbk9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfVwiXG4gICAgXSxcbiAgICBkZWxldGVJbk9yZzogW1wiREVMRVRFIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9XCJdLFxuICAgIGdldEJ5TmFtZTogW1wiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9XCJdLFxuICAgIGdldERpc2N1c3Npb25Db21tZW50SW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfVwiXG4gICAgXSxcbiAgICBnZXREaXNjdXNzaW9uSW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn1cIlxuICAgIF0sXG4gICAgZ2V0TWVtYmVyc2hpcEZvclVzZXJJbk9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vbWVtYmVyc2hpcHMve3VzZXJuYW1lfVwiXG4gICAgXSxcbiAgICBsaXN0OiBbXCJHRVQgL29yZ3Mve29yZ30vdGVhbXNcIl0sXG4gICAgbGlzdENoaWxkSW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS90ZWFtc1wiXSxcbiAgICBsaXN0RGlzY3Vzc2lvbkNvbW1lbnRzSW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHNcIlxuICAgIF0sXG4gICAgbGlzdERpc2N1c3Npb25zSW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9uc1wiXSxcbiAgICBsaXN0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci90ZWFtc1wiXSxcbiAgICBsaXN0TWVtYmVyc0luT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vbWVtYmVyc1wiXSxcbiAgICBsaXN0UGVuZGluZ0ludml0YXRpb25zSW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2ludml0YXRpb25zXCJcbiAgICBdLFxuICAgIGxpc3RQcm9qZWN0c0luT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcHJvamVjdHNcIl0sXG4gICAgbGlzdFJlcG9zSW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9yZXBvc1wiXSxcbiAgICByZW1vdmVNZW1iZXJzaGlwRm9yVXNlckluT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9tZW1iZXJzaGlwcy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIHJlbW92ZVByb2plY3RJbk9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcHJvamVjdHMve3Byb2plY3RfaWR9XCJcbiAgICBdLFxuICAgIHJlbW92ZVJlcG9Jbk9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcmVwb3Mve293bmVyfS97cmVwb31cIlxuICAgIF0sXG4gICAgdXBkYXRlRGlzY3Vzc2lvbkNvbW1lbnRJbk9yZzogW1xuICAgICAgXCJQQVRDSCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn1cIlxuICAgIF0sXG4gICAgdXBkYXRlRGlzY3Vzc2lvbkluT3JnOiBbXG4gICAgICBcIlBBVENIIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn1cIlxuICAgIF0sXG4gICAgdXBkYXRlSW5Pcmc6IFtcIlBBVENIIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9XCJdXG4gIH0sXG4gIHVzZXJzOiB7XG4gICAgYWRkRW1haWxGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICBcIlBPU1QgL3VzZXIvZW1haWxzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJhZGRFbWFpbEZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGFkZEVtYWlsRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBPU1QgL3VzZXIvZW1haWxzXCJdLFxuICAgIGFkZFNvY2lhbEFjY291bnRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9zb2NpYWxfYWNjb3VudHNcIl0sXG4gICAgYmxvY2s6IFtcIlBVVCAvdXNlci9ibG9ja3Mve3VzZXJuYW1lfVwiXSxcbiAgICBjaGVja0Jsb2NrZWQ6IFtcIkdFVCAvdXNlci9ibG9ja3Mve3VzZXJuYW1lfVwiXSxcbiAgICBjaGVja0ZvbGxvd2luZ0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9mb2xsb3dpbmcve3RhcmdldF91c2VyfVwiXSxcbiAgICBjaGVja1BlcnNvbklzRm9sbG93ZWRCeUF1dGhlbnRpY2F0ZWQ6IFtcIkdFVCAvdXNlci9mb2xsb3dpbmcve3VzZXJuYW1lfVwiXSxcbiAgICBjcmVhdGVHcGdLZXlGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICBcIlBPU1QgL3VzZXIvZ3BnX2tleXNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImNyZWF0ZUdwZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGNyZWF0ZUdwZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL2dwZ19rZXlzXCJdLFxuICAgIGNyZWF0ZVB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiUE9TVCAvdXNlci9rZXlzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJjcmVhdGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBjcmVhdGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9rZXlzXCJdLFxuICAgIGNyZWF0ZVNzaFNpZ25pbmdLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9zc2hfc2lnbmluZ19rZXlzXCJdLFxuICAgIGRlbGV0ZUVtYWlsRm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvZW1haWxzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJkZWxldGVFbWFpbEZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGRlbGV0ZUVtYWlsRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkRFTEVURSAvdXNlci9lbWFpbHNcIl0sXG4gICAgZGVsZXRlR3BnS2V5Rm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvZ3BnX2tleXMve2dwZ19rZXlfaWR9XCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJkZWxldGVHcGdLZXlGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBkZWxldGVHcGdLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL2dwZ19rZXlzL3tncGdfa2V5X2lkfVwiXSxcbiAgICBkZWxldGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9rZXlzL3trZXlfaWR9XCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJkZWxldGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBkZWxldGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL2tleXMve2tleV9pZH1cIl0sXG4gICAgZGVsZXRlU29jaWFsQWNjb3VudEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIvc29jaWFsX2FjY291bnRzXCJdLFxuICAgIGRlbGV0ZVNzaFNpZ25pbmdLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvc3NoX3NpZ25pbmdfa2V5cy97c3NoX3NpZ25pbmdfa2V5X2lkfVwiXG4gICAgXSxcbiAgICBmb2xsb3c6IFtcIlBVVCAvdXNlci9mb2xsb3dpbmcve3VzZXJuYW1lfVwiXSxcbiAgICBnZXRBdXRoZW50aWNhdGVkOiBbXCJHRVQgL3VzZXJcIl0sXG4gICAgZ2V0QnlVc2VybmFtZTogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9XCJdLFxuICAgIGdldENvbnRleHRGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vaG92ZXJjYXJkXCJdLFxuICAgIGdldEdwZ0tleUZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiR0VUIC91c2VyL2dwZ19rZXlzL3tncGdfa2V5X2lkfVwiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwiZ2V0R3BnS2V5Rm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgZ2V0R3BnS2V5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9ncGdfa2V5cy97Z3BnX2tleV9pZH1cIl0sXG4gICAgZ2V0UHVibGljU3NoS2V5Rm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJHRVQgL3VzZXIva2V5cy97a2V5X2lkfVwiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwiZ2V0UHVibGljU3NoS2V5Rm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgZ2V0UHVibGljU3NoS2V5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9rZXlzL3trZXlfaWR9XCJdLFxuICAgIGdldFNzaFNpZ25pbmdLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvc3NoX3NpZ25pbmdfa2V5cy97c3NoX3NpZ25pbmdfa2V5X2lkfVwiXG4gICAgXSxcbiAgICBsaXN0OiBbXCJHRVQgL3VzZXJzXCJdLFxuICAgIGxpc3RCbG9ja2VkQnlBdXRoZW50aWNhdGVkOiBbXG4gICAgICBcIkdFVCAvdXNlci9ibG9ja3NcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImxpc3RCbG9ja2VkQnlBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBsaXN0QmxvY2tlZEJ5QXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9ibG9ja3NcIl0sXG4gICAgbGlzdEVtYWlsc0ZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiR0VUIC91c2VyL2VtYWlsc1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwibGlzdEVtYWlsc0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGxpc3RFbWFpbHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2VtYWlsc1wiXSxcbiAgICBsaXN0Rm9sbG93ZWRCeUF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiR0VUIC91c2VyL2ZvbGxvd2luZ1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwibGlzdEZvbGxvd2VkQnlBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBsaXN0Rm9sbG93ZWRCeUF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvZm9sbG93aW5nXCJdLFxuICAgIGxpc3RGb2xsb3dlcnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2ZvbGxvd2Vyc1wiXSxcbiAgICBsaXN0Rm9sbG93ZXJzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2ZvbGxvd2Vyc1wiXSxcbiAgICBsaXN0Rm9sbG93aW5nRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2ZvbGxvd2luZ1wiXSxcbiAgICBsaXN0R3BnS2V5c0ZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiR0VUIC91c2VyL2dwZ19rZXlzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJsaXN0R3BnS2V5c0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGxpc3RHcGdLZXlzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9ncGdfa2V5c1wiXSxcbiAgICBsaXN0R3BnS2V5c0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ncGdfa2V5c1wiXSxcbiAgICBsaXN0UHVibGljRW1haWxzRm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJHRVQgL3VzZXIvcHVibGljX2VtYWlsc1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwibGlzdFB1YmxpY0VtYWlsc0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGxpc3RQdWJsaWNFbWFpbHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3B1YmxpY19lbWFpbHNcIl0sXG4gICAgbGlzdFB1YmxpY0tleXNGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0va2V5c1wiXSxcbiAgICBsaXN0UHVibGljU3NoS2V5c0ZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiR0VUIC91c2VyL2tleXNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImxpc3RQdWJsaWNTc2hLZXlzRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgbGlzdFB1YmxpY1NzaEtleXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2tleXNcIl0sXG4gICAgbGlzdFNvY2lhbEFjY291bnRzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9zb2NpYWxfYWNjb3VudHNcIl0sXG4gICAgbGlzdFNvY2lhbEFjY291bnRzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3NvY2lhbF9hY2NvdW50c1wiXSxcbiAgICBsaXN0U3NoU2lnbmluZ0tleXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3NzaF9zaWduaW5nX2tleXNcIl0sXG4gICAgbGlzdFNzaFNpZ25pbmdLZXlzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3NzaF9zaWduaW5nX2tleXNcIl0sXG4gICAgc2V0UHJpbWFyeUVtYWlsVmlzaWJpbGl0eUZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiUEFUQ0ggL3VzZXIvZW1haWwvdmlzaWJpbGl0eVwiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwic2V0UHJpbWFyeUVtYWlsVmlzaWJpbGl0eUZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIHNldFByaW1hcnlFbWFpbFZpc2liaWxpdHlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQQVRDSCAvdXNlci9lbWFpbC92aXNpYmlsaXR5XCJcbiAgICBdLFxuICAgIHVuYmxvY2s6IFtcIkRFTEVURSAvdXNlci9ibG9ja3Mve3VzZXJuYW1lfVwiXSxcbiAgICB1bmZvbGxvdzogW1wiREVMRVRFIC91c2VyL2ZvbGxvd2luZy97dXNlcm5hbWV9XCJdLFxuICAgIHVwZGF0ZUF1dGhlbnRpY2F0ZWQ6IFtcIlBBVENIIC91c2VyXCJdXG4gIH1cbn07XG52YXIgZW5kcG9pbnRzX2RlZmF1bHQgPSBFbmRwb2ludHM7XG5leHBvcnQge1xuICBlbmRwb2ludHNfZGVmYXVsdCBhcyBkZWZhdWx0XG59O1xuIiwiaW1wb3J0IEVORFBPSU5UUyBmcm9tIFwiLi9nZW5lcmF0ZWQvZW5kcG9pbnRzLmpzXCI7XG5jb25zdCBlbmRwb2ludE1ldGhvZHNNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuZm9yIChjb25zdCBbc2NvcGUsIGVuZHBvaW50c10gb2YgT2JqZWN0LmVudHJpZXMoRU5EUE9JTlRTKSkge1xuICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBlbmRwb2ludF0gb2YgT2JqZWN0LmVudHJpZXMoZW5kcG9pbnRzKSkge1xuICAgIGNvbnN0IFtyb3V0ZSwgZGVmYXVsdHMsIGRlY29yYXRpb25zXSA9IGVuZHBvaW50O1xuICAgIGNvbnN0IFttZXRob2QsIHVybF0gPSByb3V0ZS5zcGxpdCgvIC8pO1xuICAgIGNvbnN0IGVuZHBvaW50RGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKFxuICAgICAge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIHVybFxuICAgICAgfSxcbiAgICAgIGRlZmF1bHRzXG4gICAgKTtcbiAgICBpZiAoIWVuZHBvaW50TWV0aG9kc01hcC5oYXMoc2NvcGUpKSB7XG4gICAgICBlbmRwb2ludE1ldGhvZHNNYXAuc2V0KHNjb3BlLCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKTtcbiAgICB9XG4gICAgZW5kcG9pbnRNZXRob2RzTWFwLmdldChzY29wZSkuc2V0KG1ldGhvZE5hbWUsIHtcbiAgICAgIHNjb3BlLFxuICAgICAgbWV0aG9kTmFtZSxcbiAgICAgIGVuZHBvaW50RGVmYXVsdHMsXG4gICAgICBkZWNvcmF0aW9uc1xuICAgIH0pO1xuICB9XG59XG5jb25zdCBoYW5kbGVyID0ge1xuICBoYXMoeyBzY29wZSB9LCBtZXRob2ROYW1lKSB7XG4gICAgcmV0dXJuIGVuZHBvaW50TWV0aG9kc01hcC5nZXQoc2NvcGUpLmhhcyhtZXRob2ROYW1lKTtcbiAgfSxcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgbWV0aG9kTmFtZSkge1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogdGhpcy5nZXQodGFyZ2V0LCBtZXRob2ROYW1lKSxcbiAgICAgIC8vIGVuc3VyZXMgbWV0aG9kIGlzIGluIHRoZSBjYWNoZVxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgfTtcbiAgfSxcbiAgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBtZXRob2ROYW1lLCBkZXNjcmlwdG9yKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldC5jYWNoZSwgbWV0aG9kTmFtZSwgZGVzY3JpcHRvcik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwgbWV0aG9kTmFtZSkge1xuICAgIGRlbGV0ZSB0YXJnZXQuY2FjaGVbbWV0aG9kTmFtZV07XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIG93bktleXMoeyBzY29wZSB9KSB7XG4gICAgcmV0dXJuIFsuLi5lbmRwb2ludE1ldGhvZHNNYXAuZ2V0KHNjb3BlKS5rZXlzKCldO1xuICB9LFxuICBzZXQodGFyZ2V0LCBtZXRob2ROYW1lLCB2YWx1ZSkge1xuICAgIHJldHVybiB0YXJnZXQuY2FjaGVbbWV0aG9kTmFtZV0gPSB2YWx1ZTtcbiAgfSxcbiAgZ2V0KHsgb2N0b2tpdCwgc2NvcGUsIGNhY2hlIH0sIG1ldGhvZE5hbWUpIHtcbiAgICBpZiAoY2FjaGVbbWV0aG9kTmFtZV0pIHtcbiAgICAgIHJldHVybiBjYWNoZVttZXRob2ROYW1lXTtcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kID0gZW5kcG9pbnRNZXRob2RzTWFwLmdldChzY29wZSkuZ2V0KG1ldGhvZE5hbWUpO1xuICAgIGlmICghbWV0aG9kKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICBjb25zdCB7IGVuZHBvaW50RGVmYXVsdHMsIGRlY29yYXRpb25zIH0gPSBtZXRob2Q7XG4gICAgaWYgKGRlY29yYXRpb25zKSB7XG4gICAgICBjYWNoZVttZXRob2ROYW1lXSA9IGRlY29yYXRlKFxuICAgICAgICBvY3Rva2l0LFxuICAgICAgICBzY29wZSxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgZW5kcG9pbnREZWZhdWx0cyxcbiAgICAgICAgZGVjb3JhdGlvbnNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhY2hlW21ldGhvZE5hbWVdID0gb2N0b2tpdC5yZXF1ZXN0LmRlZmF1bHRzKGVuZHBvaW50RGVmYXVsdHMpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVbbWV0aG9kTmFtZV07XG4gIH1cbn07XG5mdW5jdGlvbiBlbmRwb2ludHNUb01ldGhvZHMob2N0b2tpdCkge1xuICBjb25zdCBuZXdNZXRob2RzID0ge307XG4gIGZvciAoY29uc3Qgc2NvcGUgb2YgZW5kcG9pbnRNZXRob2RzTWFwLmtleXMoKSkge1xuICAgIG5ld01ldGhvZHNbc2NvcGVdID0gbmV3IFByb3h5KHsgb2N0b2tpdCwgc2NvcGUsIGNhY2hlOiB7fSB9LCBoYW5kbGVyKTtcbiAgfVxuICByZXR1cm4gbmV3TWV0aG9kcztcbn1cbmZ1bmN0aW9uIGRlY29yYXRlKG9jdG9raXQsIHNjb3BlLCBtZXRob2ROYW1lLCBkZWZhdWx0cywgZGVjb3JhdGlvbnMpIHtcbiAgY29uc3QgcmVxdWVzdFdpdGhEZWZhdWx0cyA9IG9jdG9raXQucmVxdWVzdC5kZWZhdWx0cyhkZWZhdWx0cyk7XG4gIGZ1bmN0aW9uIHdpdGhEZWNvcmF0aW9ucyguLi5hcmdzKSB7XG4gICAgbGV0IG9wdGlvbnMgPSByZXF1ZXN0V2l0aERlZmF1bHRzLmVuZHBvaW50Lm1lcmdlKC4uLmFyZ3MpO1xuICAgIGlmIChkZWNvcmF0aW9ucy5tYXBUb0RhdGEpIHtcbiAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7XG4gICAgICAgIGRhdGE6IG9wdGlvbnNbZGVjb3JhdGlvbnMubWFwVG9EYXRhXSxcbiAgICAgICAgW2RlY29yYXRpb25zLm1hcFRvRGF0YV06IHZvaWQgMFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVxdWVzdFdpdGhEZWZhdWx0cyhvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKGRlY29yYXRpb25zLnJlbmFtZWQpIHtcbiAgICAgIGNvbnN0IFtuZXdTY29wZSwgbmV3TWV0aG9kTmFtZV0gPSBkZWNvcmF0aW9ucy5yZW5hbWVkO1xuICAgICAgb2N0b2tpdC5sb2cud2FybihcbiAgICAgICAgYG9jdG9raXQuJHtzY29wZX0uJHttZXRob2ROYW1lfSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gb2N0b2tpdC4ke25ld1Njb3BlfS4ke25ld01ldGhvZE5hbWV9KClgXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZGVjb3JhdGlvbnMuZGVwcmVjYXRlZCkge1xuICAgICAgb2N0b2tpdC5sb2cud2FybihkZWNvcmF0aW9ucy5kZXByZWNhdGVkKTtcbiAgICB9XG4gICAgaWYgKGRlY29yYXRpb25zLnJlbmFtZWRQYXJhbWV0ZXJzKSB7XG4gICAgICBjb25zdCBvcHRpb25zMiA9IHJlcXVlc3RXaXRoRGVmYXVsdHMuZW5kcG9pbnQubWVyZ2UoLi4uYXJncyk7XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBhbGlhc10gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgIGRlY29yYXRpb25zLnJlbmFtZWRQYXJhbWV0ZXJzXG4gICAgICApKSB7XG4gICAgICAgIGlmIChuYW1lIGluIG9wdGlvbnMyKSB7XG4gICAgICAgICAgb2N0b2tpdC5sb2cud2FybihcbiAgICAgICAgICAgIGBcIiR7bmFtZX1cIiBwYXJhbWV0ZXIgaXMgZGVwcmVjYXRlZCBmb3IgXCJvY3Rva2l0LiR7c2NvcGV9LiR7bWV0aG9kTmFtZX0oKVwiLiBVc2UgXCIke2FsaWFzfVwiIGluc3RlYWRgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIShhbGlhcyBpbiBvcHRpb25zMikpIHtcbiAgICAgICAgICAgIG9wdGlvbnMyW2FsaWFzXSA9IG9wdGlvbnMyW25hbWVdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgb3B0aW9uczJbbmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXF1ZXN0V2l0aERlZmF1bHRzKG9wdGlvbnMyKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcXVlc3RXaXRoRGVmYXVsdHMoLi4uYXJncyk7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24od2l0aERlY29yYXRpb25zLCByZXF1ZXN0V2l0aERlZmF1bHRzKTtcbn1cbmV4cG9ydCB7XG4gIGVuZHBvaW50c1RvTWV0aG9kc1xufTtcbiIsImltcG9ydCB7IFZFUlNJT04gfSBmcm9tIFwiLi92ZXJzaW9uLmpzXCI7XG5pbXBvcnQgeyBlbmRwb2ludHNUb01ldGhvZHMgfSBmcm9tIFwiLi9lbmRwb2ludHMtdG8tbWV0aG9kcy5qc1wiO1xuZnVuY3Rpb24gcmVzdEVuZHBvaW50TWV0aG9kcyhvY3Rva2l0KSB7XG4gIGNvbnN0IGFwaSA9IGVuZHBvaW50c1RvTWV0aG9kcyhvY3Rva2l0KTtcbiAgcmV0dXJuIHtcbiAgICByZXN0OiBhcGlcbiAgfTtcbn1cbnJlc3RFbmRwb2ludE1ldGhvZHMuVkVSU0lPTiA9IFZFUlNJT047XG5mdW5jdGlvbiBsZWdhY3lSZXN0RW5kcG9pbnRNZXRob2RzKG9jdG9raXQpIHtcbiAgY29uc3QgYXBpID0gZW5kcG9pbnRzVG9NZXRob2RzKG9jdG9raXQpO1xuICByZXR1cm4ge1xuICAgIC4uLmFwaSxcbiAgICByZXN0OiBhcGlcbiAgfTtcbn1cbmxlZ2FjeVJlc3RFbmRwb2ludE1ldGhvZHMuVkVSU0lPTiA9IFZFUlNJT047XG5leHBvcnQge1xuICBsZWdhY3lSZXN0RW5kcG9pbnRNZXRob2RzLFxuICByZXN0RW5kcG9pbnRNZXRob2RzXG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3927\n')},6964:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VERSION: () => (/* binding */ VERSION),\n/* harmony export */ retry: () => (/* binding */ retry)\n/* harmony export */ });\n/* harmony import */ var bottleneck_light__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1209);\n/* harmony import */ var bottleneck_light__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(bottleneck_light__WEBPACK_IMPORTED_MODULE_0__);\n\n\n// @ts-ignore\nasync function errorRequest(octokit, state, error, options) {\n if (!error.request || !error.request.request) {\n // address https://github.com/octokit/plugin-retry.js/issues/8\n throw error;\n }\n // retry all >= 400 && not doNotRetry\n if (error.status >= 400 && !state.doNotRetry.includes(error.status)) {\n const retries = options.request.retries != null ? options.request.retries : state.retries;\n const retryAfter = Math.pow((options.request.retryCount || 0) + 1, 2);\n throw octokit.retry.retryRequest(error, retries, retryAfter);\n }\n // Maybe eventually there will be more cases here\n throw error;\n}\n\n// @ts-ignore\n// @ts-ignore\nasync function wrapRequest(state, request, options) {\n const limiter = new (bottleneck_light__WEBPACK_IMPORTED_MODULE_0___default())();\n // @ts-ignore\n limiter.on("failed", function (error, info) {\n const maxRetries = ~~error.request.request.retries;\n const after = ~~error.request.request.retryAfter;\n options.request.retryCount = info.retryCount + 1;\n if (maxRetries > info.retryCount) {\n // Returning a number instructs the limiter to retry\n // the request after that number of milliseconds have passed\n return after * state.retryAfterBaseValue;\n }\n });\n return limiter.schedule(request, options);\n}\n\nconst VERSION = "3.0.9";\nfunction retry(octokit, octokitOptions) {\n const state = Object.assign({\n enabled: true,\n retryAfterBaseValue: 1000,\n doNotRetry: [400, 401, 403, 404, 422],\n retries: 3,\n }, octokitOptions.retry);\n if (state.enabled) {\n octokit.hook.error("request", errorRequest.bind(null, octokit, state));\n octokit.hook.wrap("request", wrapRequest.bind(null, state));\n }\n return {\n retry: {\n retryRequest: (error, retries, retryAfter) => {\n error.request.request = Object.assign({}, error.request.request, {\n retries: retries,\n retryAfter: retryAfter,\n });\n return error;\n },\n },\n };\n}\nretry.VERSION = VERSION;\n\n\n//# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjk2NC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQTBDOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHlEQUFVO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUUwQjtBQUMxQiIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3BsdWdpbi1yZXRyeS9kaXN0LXdlYi9pbmRleC5qcz9kNWEwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCb3R0bGVuZWNrIGZyb20gJ2JvdHRsZW5lY2svbGlnaHQnO1xuXG4vLyBAdHMtaWdub3JlXG5hc3luYyBmdW5jdGlvbiBlcnJvclJlcXVlc3Qob2N0b2tpdCwgc3RhdGUsIGVycm9yLCBvcHRpb25zKSB7XG4gICAgaWYgKCFlcnJvci5yZXF1ZXN0IHx8ICFlcnJvci5yZXF1ZXN0LnJlcXVlc3QpIHtcbiAgICAgICAgLy8gYWRkcmVzcyBodHRwczovL2dpdGh1Yi5jb20vb2N0b2tpdC9wbHVnaW4tcmV0cnkuanMvaXNzdWVzLzhcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIC8vIHJldHJ5IGFsbCA+PSA0MDAgJiYgbm90IGRvTm90UmV0cnlcbiAgICBpZiAoZXJyb3Iuc3RhdHVzID49IDQwMCAmJiAhc3RhdGUuZG9Ob3RSZXRyeS5pbmNsdWRlcyhlcnJvci5zdGF0dXMpKSB7XG4gICAgICAgIGNvbnN0IHJldHJpZXMgPSBvcHRpb25zLnJlcXVlc3QucmV0cmllcyAhPSBudWxsID8gb3B0aW9ucy5yZXF1ZXN0LnJldHJpZXMgOiBzdGF0ZS5yZXRyaWVzO1xuICAgICAgICBjb25zdCByZXRyeUFmdGVyID0gTWF0aC5wb3coKG9wdGlvbnMucmVxdWVzdC5yZXRyeUNvdW50IHx8IDApICsgMSwgMik7XG4gICAgICAgIHRocm93IG9jdG9raXQucmV0cnkucmV0cnlSZXF1ZXN0KGVycm9yLCByZXRyaWVzLCByZXRyeUFmdGVyKTtcbiAgICB9XG4gICAgLy8gTWF5YmUgZXZlbnR1YWxseSB0aGVyZSB3aWxsIGJlIG1vcmUgY2FzZXMgaGVyZVxuICAgIHRocm93IGVycm9yO1xufVxuXG4vLyBAdHMtaWdub3JlXG4vLyBAdHMtaWdub3JlXG5hc3luYyBmdW5jdGlvbiB3cmFwUmVxdWVzdChzdGF0ZSwgcmVxdWVzdCwgb3B0aW9ucykge1xuICAgIGNvbnN0IGxpbWl0ZXIgPSBuZXcgQm90dGxlbmVjaygpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsaW1pdGVyLm9uKFwiZmFpbGVkXCIsIGZ1bmN0aW9uIChlcnJvciwgaW5mbykge1xuICAgICAgICBjb25zdCBtYXhSZXRyaWVzID0gfn5lcnJvci5yZXF1ZXN0LnJlcXVlc3QucmV0cmllcztcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSB+fmVycm9yLnJlcXVlc3QucmVxdWVzdC5yZXRyeUFmdGVyO1xuICAgICAgICBvcHRpb25zLnJlcXVlc3QucmV0cnlDb3VudCA9IGluZm8ucmV0cnlDb3VudCArIDE7XG4gICAgICAgIGlmIChtYXhSZXRyaWVzID4gaW5mby5yZXRyeUNvdW50KSB7XG4gICAgICAgICAgICAvLyBSZXR1cm5pbmcgYSBudW1iZXIgaW5zdHJ1Y3RzIHRoZSBsaW1pdGVyIHRvIHJldHJ5XG4gICAgICAgICAgICAvLyB0aGUgcmVxdWVzdCBhZnRlciB0aGF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgaGF2ZSBwYXNzZWRcbiAgICAgICAgICAgIHJldHVybiBhZnRlciAqIHN0YXRlLnJldHJ5QWZ0ZXJCYXNlVmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbGltaXRlci5zY2hlZHVsZShyZXF1ZXN0LCBvcHRpb25zKTtcbn1cblxuY29uc3QgVkVSU0lPTiA9IFwiMy4wLjlcIjtcbmZ1bmN0aW9uIHJldHJ5KG9jdG9raXQsIG9jdG9raXRPcHRpb25zKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgcmV0cnlBZnRlckJhc2VWYWx1ZTogMTAwMCxcbiAgICAgICAgZG9Ob3RSZXRyeTogWzQwMCwgNDAxLCA0MDMsIDQwNCwgNDIyXSxcbiAgICAgICAgcmV0cmllczogMyxcbiAgICB9LCBvY3Rva2l0T3B0aW9ucy5yZXRyeSk7XG4gICAgaWYgKHN0YXRlLmVuYWJsZWQpIHtcbiAgICAgICAgb2N0b2tpdC5ob29rLmVycm9yKFwicmVxdWVzdFwiLCBlcnJvclJlcXVlc3QuYmluZChudWxsLCBvY3Rva2l0LCBzdGF0ZSkpO1xuICAgICAgICBvY3Rva2l0Lmhvb2sud3JhcChcInJlcXVlc3RcIiwgd3JhcFJlcXVlc3QuYmluZChudWxsLCBzdGF0ZSkpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICByZXRyeToge1xuICAgICAgICAgICAgcmV0cnlSZXF1ZXN0OiAoZXJyb3IsIHJldHJpZXMsIHJldHJ5QWZ0ZXIpID0+IHtcbiAgICAgICAgICAgICAgICBlcnJvci5yZXF1ZXN0LnJlcXVlc3QgPSBPYmplY3QuYXNzaWduKHt9LCBlcnJvci5yZXF1ZXN0LnJlcXVlc3QsIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0cmllczogcmV0cmllcyxcbiAgICAgICAgICAgICAgICAgICAgcmV0cnlBZnRlcjogcmV0cnlBZnRlcixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH07XG59XG5yZXRyeS5WRVJTSU9OID0gVkVSU0lPTjtcblxuZXhwb3J0IHsgVkVSU0lPTiwgcmV0cnkgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6964\n')},906:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n ClientStreamingCall: () => (/* reexport */ ClientStreamingCall),\n Deferred: () => (/* reexport */ Deferred),\n DeferredState: () => (/* reexport */ DeferredState),\n DuplexStreamingCall: () => (/* reexport */ DuplexStreamingCall),\n RpcError: () => (/* reexport */ RpcError),\n RpcOutputStreamController: () => (/* reexport */ RpcOutputStreamController),\n ServerCallContextController: () => (/* reexport */ ServerCallContextController),\n ServerStreamingCall: () => (/* reexport */ ServerStreamingCall),\n ServiceType: () => (/* reexport */ ServiceType),\n TestTransport: () => (/* reexport */ TestTransport),\n UnaryCall: () => (/* reexport */ UnaryCall),\n mergeRpcOptions: () => (/* reexport */ mergeRpcOptions),\n readMethodOption: () => (/* reexport */ readMethodOption),\n readMethodOptions: () => (/* reexport */ readMethodOptions),\n readServiceOption: () => (/* reexport */ readServiceOption),\n stackClientStreamingInterceptors: () => (/* reexport */ stackClientStreamingInterceptors),\n stackDuplexStreamingInterceptors: () => (/* reexport */ stackDuplexStreamingInterceptors),\n stackIntercept: () => (/* reexport */ stackIntercept),\n stackServerStreamingInterceptors: () => (/* reexport */ stackServerStreamingInterceptors),\n stackUnaryInterceptors: () => (/* reexport */ stackUnaryInterceptors)\n});\n\n// EXTERNAL MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/lower-camel-case.js\nvar lower_camel_case = __webpack_require__(1212);\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/reflection-info.js\n\n/**\n * Turns PartialMethodInfo into MethodInfo.\n */\nfunction normalizeMethodInfo(method, service) {\n var _a, _b, _c;\n let m = method;\n m.service = service;\n m.localName = (_a = m.localName) !== null && _a !== void 0 ? _a : (0,lower_camel_case/* lowerCamelCase */.c)(m.name);\n // noinspection PointlessBooleanExpressionJS\n m.serverStreaming = !!m.serverStreaming;\n // noinspection PointlessBooleanExpressionJS\n m.clientStreaming = !!m.clientStreaming;\n m.options = (_b = m.options) !== null && _b !== void 0 ? _b : {};\n m.idempotency = (_c = m.idempotency) !== null && _c !== void 0 ? _c : undefined;\n return m;\n}\n/**\n * Read custom method options from a generated service client.\n *\n * @deprecated use readMethodOption()\n */\nfunction readMethodOptions(service, methodName, extensionName, extensionType) {\n var _a;\n const options = (_a = service.methods.find((m, i) => m.localName === methodName || i === methodName)) === null || _a === void 0 ? void 0 : _a.options;\n return options && options[extensionName] ? extensionType.fromJson(options[extensionName]) : undefined;\n}\nfunction readMethodOption(service, methodName, extensionName, extensionType) {\n var _a;\n const options = (_a = service.methods.find((m, i) => m.localName === methodName || i === methodName)) === null || _a === void 0 ? void 0 : _a.options;\n if (!options) {\n return undefined;\n }\n const optionVal = options[extensionName];\n if (optionVal === undefined) {\n return optionVal;\n }\n return extensionType ? extensionType.fromJson(optionVal) : optionVal;\n}\nfunction readServiceOption(service, extensionName, extensionType) {\n const options = service.options;\n if (!options) {\n return undefined;\n }\n const optionVal = options[extensionName];\n if (optionVal === undefined) {\n return optionVal;\n }\n return extensionType ? extensionType.fromJson(optionVal) : optionVal;\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/service-type.js\n\nclass ServiceType {\n constructor(typeName, methods, options) {\n this.typeName = typeName;\n this.methods = methods.map(i => normalizeMethodInfo(i, this));\n this.options = options !== null && options !== void 0 ? options : {};\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/rpc-error.js\n/**\n * An error that occurred while calling a RPC method.\n */\nclass RpcError extends Error {\n constructor(message, code = \'UNKNOWN\', meta) {\n super(message);\n this.name = \'RpcError\';\n // see https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#example\n Object.setPrototypeOf(this, new.target.prototype);\n this.code = code;\n this.meta = meta !== null && meta !== void 0 ? meta : {};\n }\n toString() {\n const l = [this.name + \': \' + this.message];\n if (this.code) {\n l.push(\'\');\n l.push(\'Code: \' + this.code);\n }\n if (this.serviceName && this.methodName) {\n l.push(\'Method: \' + this.serviceName + \'/\' + this.methodName);\n }\n let m = Object.entries(this.meta);\n if (m.length) {\n l.push(\'\');\n l.push(\'Meta:\');\n for (let [k, v] of m) {\n l.push(` ${k}: ${v}`);\n }\n }\n return l.join(\'\\n\');\n }\n}\n\n// EXTERNAL MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/json-format-contract.js\nvar json_format_contract = __webpack_require__(9557);\n// EXTERNAL MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/binary-format-contract.js\nvar binary_format_contract = __webpack_require__(299);\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/rpc-options.js\n\n/**\n * Merges custom RPC options with defaults. Returns a new instance and keeps\n * the "defaults" and the "options" unmodified.\n *\n * Merges `RpcMetadata` "meta", overwriting values from "defaults" with\n * values from "options". Does not append values to existing entries.\n *\n * Merges "jsonOptions", including "jsonOptions.typeRegistry", by creating\n * a new array that contains types from "options.jsonOptions.typeRegistry"\n * first, then types from "defaults.jsonOptions.typeRegistry".\n *\n * Merges "binaryOptions".\n *\n * Merges "interceptors" by creating a new array that contains interceptors\n * from "defaults" first, then interceptors from "options".\n *\n * Works with objects that extend `RpcOptions`, but only if the added\n * properties are of type Date, primitive like string, boolean, or Array\n * of primitives. If you have other property types, you have to merge them\n * yourself.\n */\nfunction mergeRpcOptions(defaults, options) {\n if (!options)\n return defaults;\n let o = {};\n copy(defaults, o);\n copy(options, o);\n for (let key of Object.keys(options)) {\n let val = options[key];\n switch (key) {\n case "jsonOptions":\n o.jsonOptions = (0,json_format_contract/* mergeJsonOptions */.N3)(defaults.jsonOptions, o.jsonOptions);\n break;\n case "binaryOptions":\n o.binaryOptions = (0,binary_format_contract/* mergeBinaryOptions */.TA)(defaults.binaryOptions, o.binaryOptions);\n break;\n case "meta":\n o.meta = {};\n copy(defaults.meta, o.meta);\n copy(options.meta, o.meta);\n break;\n case "interceptors":\n o.interceptors = defaults.interceptors ? defaults.interceptors.concat(val) : val.concat();\n break;\n }\n }\n return o;\n}\nfunction copy(a, into) {\n if (!a)\n return;\n let c = into;\n for (let [k, v] of Object.entries(a)) {\n if (v instanceof Date)\n c[k] = new Date(v.getTime());\n else if (Array.isArray(v))\n c[k] = v.concat();\n else\n c[k] = v;\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/deferred.js\nvar DeferredState;\n(function (DeferredState) {\n DeferredState[DeferredState["PENDING"] = 0] = "PENDING";\n DeferredState[DeferredState["REJECTED"] = 1] = "REJECTED";\n DeferredState[DeferredState["RESOLVED"] = 2] = "RESOLVED";\n})(DeferredState || (DeferredState = {}));\n/**\n * A deferred promise. This is a "controller" for a promise, which lets you\n * pass a promise around and reject or resolve it from the outside.\n *\n * Warning: This class is to be used with care. Using it can make code very\n * difficult to read. It is intended for use in library code that exposes\n * promises, not for regular business logic.\n */\nclass Deferred {\n /**\n * @param preventUnhandledRejectionWarning - prevents the warning\n * "Unhandled Promise rejection" by adding a noop rejection handler.\n * Working with calls returned from the runtime-rpc package in an\n * async function usually means awaiting one call property after\n * the other. This means that the "status" is not being awaited when\n * an earlier await for the "headers" is rejected. This causes the\n * "unhandled promise reject" warning. A more correct behaviour for\n * calls might be to become aware whether at least one of the\n * promises is handled and swallow the rejection warning for the\n * others.\n */\n constructor(preventUnhandledRejectionWarning = true) {\n this._state = DeferredState.PENDING;\n this._promise = new Promise((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n if (preventUnhandledRejectionWarning) {\n this._promise.catch(_ => { });\n }\n }\n /**\n * Get the current state of the promise.\n */\n get state() {\n return this._state;\n }\n /**\n * Get the deferred promise.\n */\n get promise() {\n return this._promise;\n }\n /**\n * Resolve the promise. Throws if the promise is already resolved or rejected.\n */\n resolve(value) {\n if (this.state !== DeferredState.PENDING)\n throw new Error(`cannot resolve ${DeferredState[this.state].toLowerCase()}`);\n this._resolve(value);\n this._state = DeferredState.RESOLVED;\n }\n /**\n * Reject the promise. Throws if the promise is already resolved or rejected.\n */\n reject(reason) {\n if (this.state !== DeferredState.PENDING)\n throw new Error(`cannot reject ${DeferredState[this.state].toLowerCase()}`);\n this._reject(reason);\n this._state = DeferredState.REJECTED;\n }\n /**\n * Resolve the promise. Ignore if not pending.\n */\n resolvePending(val) {\n if (this._state === DeferredState.PENDING)\n this.resolve(val);\n }\n /**\n * Reject the promise. Ignore if not pending.\n */\n rejectPending(reason) {\n if (this._state === DeferredState.PENDING)\n this.reject(reason);\n }\n}\n\n// EXTERNAL MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/assert.js\nvar assert = __webpack_require__(9920);\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/rpc-output-stream.js\n\n\n/**\n * A `RpcOutputStream` that you control.\n */\nclass RpcOutputStreamController {\n constructor() {\n this._lis = {\n nxt: [],\n msg: [],\n err: [],\n cmp: [],\n };\n this._closed = false;\n }\n // --- RpcOutputStream callback API\n onNext(callback) {\n return this.addLis(callback, this._lis.nxt);\n }\n onMessage(callback) {\n return this.addLis(callback, this._lis.msg);\n }\n onError(callback) {\n return this.addLis(callback, this._lis.err);\n }\n onComplete(callback) {\n return this.addLis(callback, this._lis.cmp);\n }\n addLis(callback, list) {\n list.push(callback);\n return () => {\n let i = list.indexOf(callback);\n if (i >= 0)\n list.splice(i, 1);\n };\n }\n // remove all listeners\n clearLis() {\n for (let l of Object.values(this._lis))\n l.splice(0, l.length);\n }\n // --- Controller API\n /**\n * Is this stream already closed by a completion or error?\n */\n get closed() {\n return this._closed !== false;\n }\n /**\n * Emit message, close with error, or close successfully, but only one\n * at a time.\n * Can be used to wrap a stream by using the other stream\'s `onNext`.\n */\n notifyNext(message, error, complete) {\n (0,assert/* assert */.hu)((message ? 1 : 0) + (error ? 1 : 0) + (complete ? 1 : 0) <= 1, \'only one emission at a time\');\n if (message)\n this.notifyMessage(message);\n if (error)\n this.notifyError(error);\n if (complete)\n this.notifyComplete();\n }\n /**\n * Emits a new message. Throws if stream is closed.\n *\n * Triggers onNext and onMessage callbacks.\n */\n notifyMessage(message) {\n (0,assert/* assert */.hu)(!this.closed, \'stream is closed\');\n this.pushIt({ value: message, done: false });\n this._lis.msg.forEach(l => l(message));\n this._lis.nxt.forEach(l => l(message, undefined, false));\n }\n /**\n * Closes the stream with an error. Throws if stream is closed.\n *\n * Triggers onNext and onError callbacks.\n */\n notifyError(error) {\n (0,assert/* assert */.hu)(!this.closed, \'stream is closed\');\n this._closed = error;\n this.pushIt(error);\n this._lis.err.forEach(l => l(error));\n this._lis.nxt.forEach(l => l(undefined, error, false));\n this.clearLis();\n }\n /**\n * Closes the stream successfully. Throws if stream is closed.\n *\n * Triggers onNext and onComplete callbacks.\n */\n notifyComplete() {\n (0,assert/* assert */.hu)(!this.closed, \'stream is closed\');\n this._closed = true;\n this.pushIt({ value: null, done: true });\n this._lis.cmp.forEach(l => l());\n this._lis.nxt.forEach(l => l(undefined, undefined, true));\n this.clearLis();\n }\n /**\n * Creates an async iterator (that can be used with `for await {...}`)\n * to consume the stream.\n *\n * Some things to note:\n * - If an error occurs, the `for await` will throw it.\n * - If an error occurred before the `for await` was started, `for await`\n * will re-throw it.\n * - If the stream is already complete, the `for await` will be empty.\n * - If your `for await` consumes slower than the stream produces,\n * for example because you are relaying messages in a slow operation,\n * messages are queued.\n */\n [Symbol.asyncIterator]() {\n // init the iterator state, enabling pushIt()\n if (!this._itState) {\n this._itState = { q: [] };\n }\n // if we are closed, we are definitely not receiving any more messages.\n // but we can\'t let the iterator get stuck. we want to either:\n // a) finish the new iterator immediately, because we are completed\n // b) reject the new iterator, because we errored\n if (this._closed === true)\n this.pushIt({ value: null, done: true });\n else if (this._closed !== false)\n this.pushIt(this._closed);\n // the async iterator\n return {\n next: () => {\n let state = this._itState;\n (0,assert/* assert */.hu)(state, "bad state"); // if we don\'t have a state here, code is broken\n // there should be no pending result.\n // did the consumer call next() before we resolved our previous result promise?\n (0,assert/* assert */.hu)(!state.p, "iterator contract broken");\n // did we produce faster than the iterator consumed?\n // return the oldest result from the queue.\n let first = state.q.shift();\n if (first)\n return ("value" in first) ? Promise.resolve(first) : Promise.reject(first);\n // we have no result ATM, but we promise one.\n // as soon as we have a result, we must resolve promise.\n state.p = new Deferred();\n return state.p.promise;\n },\n };\n }\n // "push" a new iterator result.\n // this either resolves a pending promise, or enqueues the result.\n pushIt(result) {\n let state = this._itState;\n if (!state)\n return;\n // is the consumer waiting for us?\n if (state.p) {\n // yes, consumer is waiting for this promise.\n const p = state.p;\n (0,assert/* assert */.hu)(p.state == DeferredState.PENDING, "iterator contract broken");\n // resolve the promise\n ("value" in result) ? p.resolve(result) : p.reject(result);\n // must cleanup, otherwise iterator.next() would pick it up again.\n delete state.p;\n }\n else {\n // we are producing faster than the iterator consumes.\n // push result onto queue.\n state.q.push(result);\n }\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/unary-call.js\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n/**\n * A unary RPC call. Unary means there is exactly one input message and\n * exactly one output message unless an error occurred.\n */\nclass UnaryCall {\n constructor(method, requestHeaders, request, headers, response, status, trailers) {\n this.method = method;\n this.requestHeaders = requestHeaders;\n this.request = request;\n this.headers = headers;\n this.response = response;\n this.status = status;\n this.trailers = trailers;\n }\n /**\n * If you are only interested in the final outcome of this call,\n * you can await it to receive a `FinishedUnaryCall`.\n */\n then(onfulfilled, onrejected) {\n return this.promiseFinished().then(value => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, reason => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason));\n }\n promiseFinished() {\n return __awaiter(this, void 0, void 0, function* () {\n let [headers, response, status, trailers] = yield Promise.all([this.headers, this.response, this.status, this.trailers]);\n return {\n method: this.method,\n requestHeaders: this.requestHeaders,\n request: this.request,\n headers,\n response,\n status,\n trailers\n };\n });\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/server-streaming-call.js\nvar server_streaming_call_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n/**\n * A server streaming RPC call. The client provides exactly one input message\n * but the server may respond with 0, 1, or more messages.\n */\nclass ServerStreamingCall {\n constructor(method, requestHeaders, request, headers, response, status, trailers) {\n this.method = method;\n this.requestHeaders = requestHeaders;\n this.request = request;\n this.headers = headers;\n this.responses = response;\n this.status = status;\n this.trailers = trailers;\n }\n /**\n * Instead of awaiting the response status and trailers, you can\n * just as well await this call itself to receive the server outcome.\n * You should first setup some listeners to the `request` to\n * see the actual messages the server replied with.\n */\n then(onfulfilled, onrejected) {\n return this.promiseFinished().then(value => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, reason => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason));\n }\n promiseFinished() {\n return server_streaming_call_awaiter(this, void 0, void 0, function* () {\n let [headers, status, trailers] = yield Promise.all([this.headers, this.status, this.trailers]);\n return {\n method: this.method,\n requestHeaders: this.requestHeaders,\n request: this.request,\n headers,\n status,\n trailers,\n };\n });\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/client-streaming-call.js\nvar client_streaming_call_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n/**\n * A client streaming RPC call. This means that the clients sends 0, 1, or\n * more messages to the server, and the server replies with exactly one\n * message.\n */\nclass ClientStreamingCall {\n constructor(method, requestHeaders, request, headers, response, status, trailers) {\n this.method = method;\n this.requestHeaders = requestHeaders;\n this.requests = request;\n this.headers = headers;\n this.response = response;\n this.status = status;\n this.trailers = trailers;\n }\n /**\n * Instead of awaiting the response status and trailers, you can\n * just as well await this call itself to receive the server outcome.\n * Note that it may still be valid to send more request messages.\n */\n then(onfulfilled, onrejected) {\n return this.promiseFinished().then(value => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, reason => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason));\n }\n promiseFinished() {\n return client_streaming_call_awaiter(this, void 0, void 0, function* () {\n let [headers, response, status, trailers] = yield Promise.all([this.headers, this.response, this.status, this.trailers]);\n return {\n method: this.method,\n requestHeaders: this.requestHeaders,\n headers,\n response,\n status,\n trailers\n };\n });\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/duplex-streaming-call.js\nvar duplex_streaming_call_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n/**\n * A duplex streaming RPC call. This means that the clients sends an\n * arbitrary amount of messages to the server, while at the same time,\n * the server sends an arbitrary amount of messages to the client.\n */\nclass DuplexStreamingCall {\n constructor(method, requestHeaders, request, headers, response, status, trailers) {\n this.method = method;\n this.requestHeaders = requestHeaders;\n this.requests = request;\n this.headers = headers;\n this.responses = response;\n this.status = status;\n this.trailers = trailers;\n }\n /**\n * Instead of awaiting the response status and trailers, you can\n * just as well await this call itself to receive the server outcome.\n * Note that it may still be valid to send more request messages.\n */\n then(onfulfilled, onrejected) {\n return this.promiseFinished().then(value => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, reason => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason));\n }\n promiseFinished() {\n return duplex_streaming_call_awaiter(this, void 0, void 0, function* () {\n let [headers, status, trailers] = yield Promise.all([this.headers, this.status, this.trailers]);\n return {\n method: this.method,\n requestHeaders: this.requestHeaders,\n headers,\n status,\n trailers,\n };\n });\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/test-transport.js\nvar test_transport_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n/**\n * Transport for testing.\n */\nclass TestTransport {\n /**\n * Initialize with mock data. Omitted fields have default value.\n */\n constructor(data) {\n /**\n * Suppress warning / error about uncaught rejections of\n * "status" and "trailers".\n */\n this.suppressUncaughtRejections = true;\n this.headerDelay = 10;\n this.responseDelay = 50;\n this.betweenResponseDelay = 10;\n this.afterResponseDelay = 10;\n this.data = data !== null && data !== void 0 ? data : {};\n }\n /**\n * Sent message(s) during the last operation.\n */\n get sentMessages() {\n if (this.lastInput instanceof TestInputStream) {\n return this.lastInput.sent;\n }\n else if (typeof this.lastInput == "object") {\n return [this.lastInput.single];\n }\n return [];\n }\n /**\n * Sending message(s) completed?\n */\n get sendComplete() {\n if (this.lastInput instanceof TestInputStream) {\n return this.lastInput.completed;\n }\n else if (typeof this.lastInput == "object") {\n return true;\n }\n return false;\n }\n // Creates a promise for response headers from the mock data.\n promiseHeaders() {\n var _a;\n const headers = (_a = this.data.headers) !== null && _a !== void 0 ? _a : TestTransport.defaultHeaders;\n return headers instanceof RpcError\n ? Promise.reject(headers)\n : Promise.resolve(headers);\n }\n // Creates a promise for a single, valid, message from the mock data.\n promiseSingleResponse(method) {\n if (this.data.response instanceof RpcError) {\n return Promise.reject(this.data.response);\n }\n let r;\n if (Array.isArray(this.data.response)) {\n (0,assert/* assert */.hu)(this.data.response.length > 0);\n r = this.data.response[0];\n }\n else if (this.data.response !== undefined) {\n r = this.data.response;\n }\n else {\n r = method.O.create();\n }\n (0,assert/* assert */.hu)(method.O.is(r));\n return Promise.resolve(r);\n }\n /**\n * Pushes response messages from the mock data to the output stream.\n * If an error response, status or trailers are mocked, the stream is\n * closed with the respective error.\n * Otherwise, stream is completed successfully.\n *\n * The returned promise resolves when the stream is closed. It should\n * not reject. If it does, code is broken.\n */\n streamResponses(method, stream, abort) {\n return test_transport_awaiter(this, void 0, void 0, function* () {\n // normalize "data.response" into an array of valid output messages\n const messages = [];\n if (this.data.response === undefined) {\n messages.push(method.O.create());\n }\n else if (Array.isArray(this.data.response)) {\n for (let msg of this.data.response) {\n (0,assert/* assert */.hu)(method.O.is(msg));\n messages.push(msg);\n }\n }\n else if (!(this.data.response instanceof RpcError)) {\n (0,assert/* assert */.hu)(method.O.is(this.data.response));\n messages.push(this.data.response);\n }\n // start the stream with an initial delay.\n // if the request is cancelled, notify() error and exit.\n try {\n yield delay(this.responseDelay, abort)(undefined);\n }\n catch (error) {\n stream.notifyError(error);\n return;\n }\n // if error response was mocked, notify() error (stream is now closed with error) and exit.\n if (this.data.response instanceof RpcError) {\n stream.notifyError(this.data.response);\n return;\n }\n // regular response messages were mocked. notify() them.\n for (let msg of messages) {\n stream.notifyMessage(msg);\n // add a short delay between responses\n // if the request is cancelled, notify() error and exit.\n try {\n yield delay(this.betweenResponseDelay, abort)(undefined);\n }\n catch (error) {\n stream.notifyError(error);\n return;\n }\n }\n // error status was mocked, notify() error (stream is now closed with error) and exit.\n if (this.data.status instanceof RpcError) {\n stream.notifyError(this.data.status);\n return;\n }\n // error trailers were mocked, notify() error (stream is now closed with error) and exit.\n if (this.data.trailers instanceof RpcError) {\n stream.notifyError(this.data.trailers);\n return;\n }\n // stream completed successfully\n stream.notifyComplete();\n });\n }\n // Creates a promise for response status from the mock data.\n promiseStatus() {\n var _a;\n const status = (_a = this.data.status) !== null && _a !== void 0 ? _a : TestTransport.defaultStatus;\n return status instanceof RpcError\n ? Promise.reject(status)\n : Promise.resolve(status);\n }\n // Creates a promise for response trailers from the mock data.\n promiseTrailers() {\n var _a;\n const trailers = (_a = this.data.trailers) !== null && _a !== void 0 ? _a : TestTransport.defaultTrailers;\n return trailers instanceof RpcError\n ? Promise.reject(trailers)\n : Promise.resolve(trailers);\n }\n maybeSuppressUncaught(...promise) {\n if (this.suppressUncaughtRejections) {\n for (let p of promise) {\n p.catch(() => {\n });\n }\n }\n }\n mergeOptions(options) {\n return mergeRpcOptions({}, options);\n }\n unary(method, input, options) {\n var _a;\n const requestHeaders = (_a = options.meta) !== null && _a !== void 0 ? _a : {}, headersPromise = this.promiseHeaders()\n .then(delay(this.headerDelay, options.abort)), responsePromise = headersPromise\n .catch(_ => {\n })\n .then(delay(this.responseDelay, options.abort))\n .then(_ => this.promiseSingleResponse(method)), statusPromise = responsePromise\n .catch(_ => {\n })\n .then(delay(this.afterResponseDelay, options.abort))\n .then(_ => this.promiseStatus()), trailersPromise = responsePromise\n .catch(_ => {\n })\n .then(delay(this.afterResponseDelay, options.abort))\n .then(_ => this.promiseTrailers());\n this.maybeSuppressUncaught(statusPromise, trailersPromise);\n this.lastInput = { single: input };\n return new UnaryCall(method, requestHeaders, input, headersPromise, responsePromise, statusPromise, trailersPromise);\n }\n serverStreaming(method, input, options) {\n var _a;\n const requestHeaders = (_a = options.meta) !== null && _a !== void 0 ? _a : {}, headersPromise = this.promiseHeaders()\n .then(delay(this.headerDelay, options.abort)), outputStream = new RpcOutputStreamController(), responseStreamClosedPromise = headersPromise\n .then(delay(this.responseDelay, options.abort))\n .catch(() => {\n })\n .then(() => this.streamResponses(method, outputStream, options.abort))\n .then(delay(this.afterResponseDelay, options.abort)), statusPromise = responseStreamClosedPromise\n .then(() => this.promiseStatus()), trailersPromise = responseStreamClosedPromise\n .then(() => this.promiseTrailers());\n this.maybeSuppressUncaught(statusPromise, trailersPromise);\n this.lastInput = { single: input };\n return new ServerStreamingCall(method, requestHeaders, input, headersPromise, outputStream, statusPromise, trailersPromise);\n }\n clientStreaming(method, options) {\n var _a;\n const requestHeaders = (_a = options.meta) !== null && _a !== void 0 ? _a : {}, headersPromise = this.promiseHeaders()\n .then(delay(this.headerDelay, options.abort)), responsePromise = headersPromise\n .catch(_ => {\n })\n .then(delay(this.responseDelay, options.abort))\n .then(_ => this.promiseSingleResponse(method)), statusPromise = responsePromise\n .catch(_ => {\n })\n .then(delay(this.afterResponseDelay, options.abort))\n .then(_ => this.promiseStatus()), trailersPromise = responsePromise\n .catch(_ => {\n })\n .then(delay(this.afterResponseDelay, options.abort))\n .then(_ => this.promiseTrailers());\n this.maybeSuppressUncaught(statusPromise, trailersPromise);\n this.lastInput = new TestInputStream(this.data, options.abort);\n return new ClientStreamingCall(method, requestHeaders, this.lastInput, headersPromise, responsePromise, statusPromise, trailersPromise);\n }\n duplex(method, options) {\n var _a;\n const requestHeaders = (_a = options.meta) !== null && _a !== void 0 ? _a : {}, headersPromise = this.promiseHeaders()\n .then(delay(this.headerDelay, options.abort)), outputStream = new RpcOutputStreamController(), responseStreamClosedPromise = headersPromise\n .then(delay(this.responseDelay, options.abort))\n .catch(() => {\n })\n .then(() => this.streamResponses(method, outputStream, options.abort))\n .then(delay(this.afterResponseDelay, options.abort)), statusPromise = responseStreamClosedPromise\n .then(() => this.promiseStatus()), trailersPromise = responseStreamClosedPromise\n .then(() => this.promiseTrailers());\n this.maybeSuppressUncaught(statusPromise, trailersPromise);\n this.lastInput = new TestInputStream(this.data, options.abort);\n return new DuplexStreamingCall(method, requestHeaders, this.lastInput, headersPromise, outputStream, statusPromise, trailersPromise);\n }\n}\nTestTransport.defaultHeaders = {\n responseHeader: "test"\n};\nTestTransport.defaultStatus = {\n code: "OK", detail: "all good"\n};\nTestTransport.defaultTrailers = {\n responseTrailer: "test"\n};\nfunction delay(ms, abort) {\n return (v) => new Promise((resolve, reject) => {\n if (abort === null || abort === void 0 ? void 0 : abort.aborted) {\n reject(new RpcError("user cancel", "CANCELLED"));\n }\n else {\n const id = setTimeout(() => resolve(v), ms);\n if (abort) {\n abort.addEventListener("abort", ev => {\n clearTimeout(id);\n reject(new RpcError("user cancel", "CANCELLED"));\n });\n }\n }\n });\n}\nclass TestInputStream {\n constructor(data, abort) {\n this._completed = false;\n this._sent = [];\n this.data = data;\n this.abort = abort;\n }\n get sent() {\n return this._sent;\n }\n get completed() {\n return this._completed;\n }\n send(message) {\n if (this.data.inputMessage instanceof RpcError) {\n return Promise.reject(this.data.inputMessage);\n }\n const delayMs = this.data.inputMessage === undefined\n ? 10\n : this.data.inputMessage;\n return Promise.resolve(undefined)\n .then(() => {\n this._sent.push(message);\n })\n .then(delay(delayMs, this.abort));\n }\n complete() {\n if (this.data.inputComplete instanceof RpcError) {\n return Promise.reject(this.data.inputComplete);\n }\n const delayMs = this.data.inputComplete === undefined\n ? 10\n : this.data.inputComplete;\n return Promise.resolve(undefined)\n .then(() => {\n this._completed = true;\n })\n .then(delay(delayMs, this.abort));\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/rpc-interceptor.js\n\n/**\n * Creates a "stack" of of all interceptors specified in the given `RpcOptions`.\n * Used by generated client implementations.\n * @internal\n */\nfunction stackIntercept(kind, transport, method, options, input) {\n var _a, _b, _c, _d;\n if (kind == "unary") {\n let tail = (mtd, inp, opt) => transport.unary(mtd, inp, opt);\n for (const curr of ((_a = options.interceptors) !== null && _a !== void 0 ? _a : []).filter(i => i.interceptUnary).reverse()) {\n const next = tail;\n tail = (mtd, inp, opt) => curr.interceptUnary(next, mtd, inp, opt);\n }\n return tail(method, input, options);\n }\n if (kind == "serverStreaming") {\n let tail = (mtd, inp, opt) => transport.serverStreaming(mtd, inp, opt);\n for (const curr of ((_b = options.interceptors) !== null && _b !== void 0 ? _b : []).filter(i => i.interceptServerStreaming).reverse()) {\n const next = tail;\n tail = (mtd, inp, opt) => curr.interceptServerStreaming(next, mtd, inp, opt);\n }\n return tail(method, input, options);\n }\n if (kind == "clientStreaming") {\n let tail = (mtd, opt) => transport.clientStreaming(mtd, opt);\n for (const curr of ((_c = options.interceptors) !== null && _c !== void 0 ? _c : []).filter(i => i.interceptClientStreaming).reverse()) {\n const next = tail;\n tail = (mtd, opt) => curr.interceptClientStreaming(next, mtd, opt);\n }\n return tail(method, options);\n }\n if (kind == "duplex") {\n let tail = (mtd, opt) => transport.duplex(mtd, opt);\n for (const curr of ((_d = options.interceptors) !== null && _d !== void 0 ? _d : []).filter(i => i.interceptDuplex).reverse()) {\n const next = tail;\n tail = (mtd, opt) => curr.interceptDuplex(next, mtd, opt);\n }\n return tail(method, options);\n }\n (0,assert/* assertNever */.vE)(kind);\n}\n/**\n * @deprecated replaced by `stackIntercept()`, still here to support older generated code\n */\nfunction stackUnaryInterceptors(transport, method, input, options) {\n return stackIntercept("unary", transport, method, options, input);\n}\n/**\n * @deprecated replaced by `stackIntercept()`, still here to support older generated code\n */\nfunction stackServerStreamingInterceptors(transport, method, input, options) {\n return stackIntercept("serverStreaming", transport, method, options, input);\n}\n/**\n * @deprecated replaced by `stackIntercept()`, still here to support older generated code\n */\nfunction stackClientStreamingInterceptors(transport, method, options) {\n return stackIntercept("clientStreaming", transport, method, options);\n}\n/**\n * @deprecated replaced by `stackIntercept()`, still here to support older generated code\n */\nfunction stackDuplexStreamingInterceptors(transport, method, options) {\n return stackIntercept("duplex", transport, method, options);\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/server-call-context.js\nclass ServerCallContextController {\n constructor(method, headers, deadline, sendResponseHeadersFn, defaultStatus = { code: \'OK\', detail: \'\' }) {\n this._cancelled = false;\n this._listeners = [];\n this.method = method;\n this.headers = headers;\n this.deadline = deadline;\n this.trailers = {};\n this._sendRH = sendResponseHeadersFn;\n this.status = defaultStatus;\n }\n /**\n * Set the call cancelled.\n *\n * Invokes all callbacks registered with onCancel() and\n * sets `cancelled = true`.\n */\n notifyCancelled() {\n if (!this._cancelled) {\n this._cancelled = true;\n for (let l of this._listeners) {\n l();\n }\n }\n }\n /**\n * Send response headers.\n */\n sendResponseHeaders(data) {\n this._sendRH(data);\n }\n /**\n * Is the call cancelled?\n *\n * When the client closes the connection before the server\n * is done, the call is cancelled.\n *\n * If you want to cancel a request on the server, throw a\n * RpcError with the CANCELLED status code.\n */\n get cancelled() {\n return this._cancelled;\n }\n /**\n * Add a callback for cancellation.\n */\n onCancel(callback) {\n const l = this._listeners;\n l.push(callback);\n return () => {\n let i = l.indexOf(callback);\n if (i >= 0)\n l.splice(i, 1);\n };\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/index.js\n// Public API of the rpc runtime.\n// Note: we do not use `export * from ...` to help tree shakers,\n// webpack verbose output hints that this should be useful\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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TztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7OztBQ2pFTztBQUNQLG9GQUFvRix3QkFBd0I7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN2REE7QUFDQTtBQUNBO0FBQzZDO0FBQzhDO0FBQ3BEO0FBQ1M7QUFDZ0I7QUFDZjtBQUNJO0FBQ1M7QUFDQTtBQUNBO0FBQ3JCO0FBQ3dJO0FBQzdHIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUtcnBjL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLWluZm8uanM/MmM4OSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS1ycGMvYnVpbGQvZXMyMDE1L3NlcnZpY2UtdHlwZS5qcz9mYzYyIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lLXJwYy9idWlsZC9lczIwMTUvcnBjLWVycm9yLmpzPzk4ZTQiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUtcnBjL2J1aWxkL2VzMjAxNS9ycGMtb3B0aW9ucy5qcz8xZmEyIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lLXJwYy9idWlsZC9lczIwMTUvZGVmZXJyZWQuanM/MjQ4MyIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS1ycGMvYnVpbGQvZXMyMDE1L3JwYy1vdXRwdXQtc3RyZWFtLmpzPzBmZDgiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUtcnBjL2J1aWxkL2VzMjAxNS91bmFyeS1jYWxsLmpzPzI0ODMiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUtcnBjL2J1aWxkL2VzMjAxNS9zZXJ2ZXItc3RyZWFtaW5nLWNhbGwuanM/MzQzNiIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS1ycGMvYnVpbGQvZXMyMDE1L2NsaWVudC1zdHJlYW1pbmctY2FsbC5qcz8wM2QyIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lLXJwYy9idWlsZC9lczIwMTUvZHVwbGV4LXN0cmVhbWluZy1jYWxsLmpzPzhjZWYiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUtcnBjL2J1aWxkL2VzMjAxNS90ZXN0LXRyYW5zcG9ydC5qcz84NjdlIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lLXJwYy9idWlsZC9lczIwMTUvcnBjLWludGVyY2VwdG9yLmpzP2Q4ODMiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUtcnBjL2J1aWxkL2VzMjAxNS9zZXJ2ZXItY2FsbC1jb250ZXh0LmpzP2Y1YzciLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUtcnBjL2J1aWxkL2VzMjAxNS9pbmRleC5qcz9iZDkzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGxvd2VyQ2FtZWxDYXNlIH0gZnJvbSBcIkBwcm90b2J1Zi10cy9ydW50aW1lXCI7XG4vKipcbiAqIFR1cm5zIFBhcnRpYWxNZXRob2RJbmZvIGludG8gTWV0aG9kSW5mby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU1ldGhvZEluZm8obWV0aG9kLCBzZXJ2aWNlKSB7XG4gICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgbGV0IG0gPSBtZXRob2Q7XG4gICAgbS5zZXJ2aWNlID0gc2VydmljZTtcbiAgICBtLmxvY2FsTmFtZSA9IChfYSA9IG0ubG9jYWxOYW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBsb3dlckNhbWVsQ2FzZShtLm5hbWUpO1xuICAgIC8vIG5vaW5zcGVjdGlvbiBQb2ludGxlc3NCb29sZWFuRXhwcmVzc2lvbkpTXG4gICAgbS5zZXJ2ZXJTdHJlYW1pbmcgPSAhIW0uc2VydmVyU3RyZWFtaW5nO1xuICAgIC8vIG5vaW5zcGVjdGlvbiBQb2ludGxlc3NCb29sZWFuRXhwcmVzc2lvbkpTXG4gICAgbS5jbGllbnRTdHJlYW1pbmcgPSAhIW0uY2xpZW50U3RyZWFtaW5nO1xuICAgIG0ub3B0aW9ucyA9IChfYiA9IG0ub3B0aW9ucykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDoge307XG4gICAgbS5pZGVtcG90ZW5jeSA9IChfYyA9IG0uaWRlbXBvdGVuY3kpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbTtcbn1cbi8qKlxuICogUmVhZCBjdXN0b20gbWV0aG9kIG9wdGlvbnMgZnJvbSBhIGdlbmVyYXRlZCBzZXJ2aWNlIGNsaWVudC5cbiAqXG4gKiBAZGVwcmVjYXRlZCB1c2UgcmVhZE1ldGhvZE9wdGlvbigpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkTWV0aG9kT3B0aW9ucyhzZXJ2aWNlLCBtZXRob2ROYW1lLCBleHRlbnNpb25OYW1lLCBleHRlbnNpb25UeXBlKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IG9wdGlvbnMgPSAoX2EgPSBzZXJ2aWNlLm1ldGhvZHMuZmluZCgobSwgaSkgPT4gbS5sb2NhbE5hbWUgPT09IG1ldGhvZE5hbWUgfHwgaSA9PT0gbWV0aG9kTmFtZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vcHRpb25zO1xuICAgIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnNbZXh0ZW5zaW9uTmFtZV0gPyBleHRlbnNpb25UeXBlLmZyb21Kc29uKG9wdGlvbnNbZXh0ZW5zaW9uTmFtZV0pIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRNZXRob2RPcHRpb24oc2VydmljZSwgbWV0aG9kTmFtZSwgZXh0ZW5zaW9uTmFtZSwgZXh0ZW5zaW9uVHlwZSkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBvcHRpb25zID0gKF9hID0gc2VydmljZS5tZXRob2RzLmZpbmQoKG0sIGkpID0+IG0ubG9jYWxOYW1lID09PSBtZXRob2ROYW1lIHx8IGkgPT09IG1ldGhvZE5hbWUpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub3B0aW9ucztcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9uVmFsID0gb3B0aW9uc1tleHRlbnNpb25OYW1lXTtcbiAgICBpZiAob3B0aW9uVmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvblZhbDtcbiAgICB9XG4gICAgcmV0dXJuIGV4dGVuc2lvblR5cGUgPyBleHRlbnNpb25UeXBlLmZyb21Kc29uKG9wdGlvblZhbCkgOiBvcHRpb25WYWw7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVhZFNlcnZpY2VPcHRpb24oc2VydmljZSwgZXh0ZW5zaW9uTmFtZSwgZXh0ZW5zaW9uVHlwZSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBzZXJ2aWNlLm9wdGlvbnM7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvblZhbCA9IG9wdGlvbnNbZXh0ZW5zaW9uTmFtZV07XG4gICAgaWYgKG9wdGlvblZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25WYWw7XG4gICAgfVxuICAgIHJldHVybiBleHRlbnNpb25UeXBlID8gZXh0ZW5zaW9uVHlwZS5mcm9tSnNvbihvcHRpb25WYWwpIDogb3B0aW9uVmFsO1xufVxuIiwiaW1wb3J0IHsgbm9ybWFsaXplTWV0aG9kSW5mbyB9IGZyb20gXCIuL3JlZmxlY3Rpb24taW5mb1wiO1xuZXhwb3J0IGNsYXNzIFNlcnZpY2VUeXBlIHtcbiAgICBjb25zdHJ1Y3Rvcih0eXBlTmFtZSwgbWV0aG9kcywgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnR5cGVOYW1lID0gdHlwZU5hbWU7XG4gICAgICAgIHRoaXMubWV0aG9kcyA9IG1ldGhvZHMubWFwKGkgPT4gbm9ybWFsaXplTWV0aG9kSW5mbyhpLCB0aGlzKSk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwID8gb3B0aW9ucyA6IHt9O1xuICAgIH1cbn1cbiIsIi8qKlxuICogQW4gZXJyb3IgdGhhdCBvY2N1cnJlZCB3aGlsZSBjYWxsaW5nIGEgUlBDIG1ldGhvZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFJwY0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIGNvZGUgPSAnVU5LTk9XTicsIG1ldGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdScGNFcnJvcic7XG4gICAgICAgIC8vIHNlZSBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9yZWxlYXNlLW5vdGVzL3R5cGVzY3JpcHQtMi0yLmh0bWwjZXhhbXBsZVxuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgbmV3LnRhcmdldC5wcm90b3R5cGUpO1xuICAgICAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgICAgICB0aGlzLm1ldGEgPSBtZXRhICE9PSBudWxsICYmIG1ldGEgIT09IHZvaWQgMCA/IG1ldGEgOiB7fTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGNvbnN0IGwgPSBbdGhpcy5uYW1lICsgJzogJyArIHRoaXMubWVzc2FnZV07XG4gICAgICAgIGlmICh0aGlzLmNvZGUpIHtcbiAgICAgICAgICAgIGwucHVzaCgnJyk7XG4gICAgICAgICAgICBsLnB1c2goJ0NvZGU6ICcgKyB0aGlzLmNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNlcnZpY2VOYW1lICYmIHRoaXMubWV0aG9kTmFtZSkge1xuICAgICAgICAgICAgbC5wdXNoKCdNZXRob2Q6ICcgKyB0aGlzLnNlcnZpY2VOYW1lICsgJy8nICsgdGhpcy5tZXRob2ROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbSA9IE9iamVjdC5lbnRyaWVzKHRoaXMubWV0YSk7XG4gICAgICAgIGlmIChtLmxlbmd0aCkge1xuICAgICAgICAgICAgbC5wdXNoKCcnKTtcbiAgICAgICAgICAgIGwucHVzaCgnTWV0YTonKTtcbiAgICAgICAgICAgIGZvciAobGV0IFtrLCB2XSBvZiBtKSB7XG4gICAgICAgICAgICAgICAgbC5wdXNoKGAgICR7a306ICR7dn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbC5qb2luKCdcXG4nKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBtZXJnZUJpbmFyeU9wdGlvbnMsIG1lcmdlSnNvbk9wdGlvbnMgfSBmcm9tIFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIjtcbi8qKlxuICogTWVyZ2VzIGN1c3RvbSBSUEMgb3B0aW9ucyB3aXRoIGRlZmF1bHRzLiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIGFuZCBrZWVwc1xuICogdGhlIFwiZGVmYXVsdHNcIiBhbmQgdGhlIFwib3B0aW9uc1wiIHVubW9kaWZpZWQuXG4gKlxuICogTWVyZ2VzIGBScGNNZXRhZGF0YWAgXCJtZXRhXCIsIG92ZXJ3cml0aW5nIHZhbHVlcyBmcm9tIFwiZGVmYXVsdHNcIiB3aXRoXG4gKiB2YWx1ZXMgZnJvbSBcIm9wdGlvbnNcIi4gRG9lcyBub3QgYXBwZW5kIHZhbHVlcyB0byBleGlzdGluZyBlbnRyaWVzLlxuICpcbiAqIE1lcmdlcyBcImpzb25PcHRpb25zXCIsIGluY2x1ZGluZyBcImpzb25PcHRpb25zLnR5cGVSZWdpc3RyeVwiLCBieSBjcmVhdGluZ1xuICogYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0eXBlcyBmcm9tIFwib3B0aW9ucy5qc29uT3B0aW9ucy50eXBlUmVnaXN0cnlcIlxuICogZmlyc3QsIHRoZW4gdHlwZXMgZnJvbSBcImRlZmF1bHRzLmpzb25PcHRpb25zLnR5cGVSZWdpc3RyeVwiLlxuICpcbiAqIE1lcmdlcyBcImJpbmFyeU9wdGlvbnNcIi5cbiAqXG4gKiBNZXJnZXMgXCJpbnRlcmNlcHRvcnNcIiBieSBjcmVhdGluZyBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIGludGVyY2VwdG9yc1xuICogZnJvbSBcImRlZmF1bHRzXCIgZmlyc3QsIHRoZW4gaW50ZXJjZXB0b3JzIGZyb20gXCJvcHRpb25zXCIuXG4gKlxuICogV29ya3Mgd2l0aCBvYmplY3RzIHRoYXQgZXh0ZW5kIGBScGNPcHRpb25zYCwgYnV0IG9ubHkgaWYgdGhlIGFkZGVkXG4gKiBwcm9wZXJ0aWVzIGFyZSBvZiB0eXBlIERhdGUsIHByaW1pdGl2ZSBsaWtlIHN0cmluZywgYm9vbGVhbiwgb3IgQXJyYXlcbiAqIG9mIHByaW1pdGl2ZXMuIElmIHlvdSBoYXZlIG90aGVyIHByb3BlcnR5IHR5cGVzLCB5b3UgaGF2ZSB0byBtZXJnZSB0aGVtXG4gKiB5b3Vyc2VsZi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUnBjT3B0aW9ucyhkZWZhdWx0cywgb3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgIGxldCBvID0ge307XG4gICAgY29weShkZWZhdWx0cywgbyk7XG4gICAgY29weShvcHRpb25zLCBvKTtcbiAgICBmb3IgKGxldCBrZXkgb2YgT2JqZWN0LmtleXMob3B0aW9ucykpIHtcbiAgICAgICAgbGV0IHZhbCA9IG9wdGlvbnNba2V5XTtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJqc29uT3B0aW9uc1wiOlxuICAgICAgICAgICAgICAgIG8uanNvbk9wdGlvbnMgPSBtZXJnZUpzb25PcHRpb25zKGRlZmF1bHRzLmpzb25PcHRpb25zLCBvLmpzb25PcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJiaW5hcnlPcHRpb25zXCI6XG4gICAgICAgICAgICAgICAgby5iaW5hcnlPcHRpb25zID0gbWVyZ2VCaW5hcnlPcHRpb25zKGRlZmF1bHRzLmJpbmFyeU9wdGlvbnMsIG8uYmluYXJ5T3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibWV0YVwiOlxuICAgICAgICAgICAgICAgIG8ubWV0YSA9IHt9O1xuICAgICAgICAgICAgICAgIGNvcHkoZGVmYXVsdHMubWV0YSwgby5tZXRhKTtcbiAgICAgICAgICAgICAgICBjb3B5KG9wdGlvbnMubWV0YSwgby5tZXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJpbnRlcmNlcHRvcnNcIjpcbiAgICAgICAgICAgICAgICBvLmludGVyY2VwdG9ycyA9IGRlZmF1bHRzLmludGVyY2VwdG9ycyA/IGRlZmF1bHRzLmludGVyY2VwdG9ycy5jb25jYXQodmFsKSA6IHZhbC5jb25jYXQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbztcbn1cbmZ1bmN0aW9uIGNvcHkoYSwgaW50bykge1xuICAgIGlmICghYSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBjID0gaW50bztcbiAgICBmb3IgKGxldCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoYSkpIHtcbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBEYXRlKVxuICAgICAgICAgICAgY1trXSA9IG5ldyBEYXRlKHYuZ2V0VGltZSgpKTtcbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2KSlcbiAgICAgICAgICAgIGNba10gPSB2LmNvbmNhdCgpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjW2tdID0gdjtcbiAgICB9XG59XG4iLCJleHBvcnQgdmFyIERlZmVycmVkU3RhdGU7XG4oZnVuY3Rpb24gKERlZmVycmVkU3RhdGUpIHtcbiAgICBEZWZlcnJlZFN0YXRlW0RlZmVycmVkU3RhdGVbXCJQRU5ESU5HXCJdID0gMF0gPSBcIlBFTkRJTkdcIjtcbiAgICBEZWZlcnJlZFN0YXRlW0RlZmVycmVkU3RhdGVbXCJSRUpFQ1RFRFwiXSA9IDFdID0gXCJSRUpFQ1RFRFwiO1xuICAgIERlZmVycmVkU3RhdGVbRGVmZXJyZWRTdGF0ZVtcIlJFU09MVkVEXCJdID0gMl0gPSBcIlJFU09MVkVEXCI7XG59KShEZWZlcnJlZFN0YXRlIHx8IChEZWZlcnJlZFN0YXRlID0ge30pKTtcbi8qKlxuICogQSBkZWZlcnJlZCBwcm9taXNlLiBUaGlzIGlzIGEgXCJjb250cm9sbGVyXCIgZm9yIGEgcHJvbWlzZSwgd2hpY2ggbGV0cyB5b3VcbiAqIHBhc3MgYSBwcm9taXNlIGFyb3VuZCBhbmQgcmVqZWN0IG9yIHJlc29sdmUgaXQgZnJvbSB0aGUgb3V0c2lkZS5cbiAqXG4gKiBXYXJuaW5nOiBUaGlzIGNsYXNzIGlzIHRvIGJlIHVzZWQgd2l0aCBjYXJlLiBVc2luZyBpdCBjYW4gbWFrZSBjb2RlIHZlcnlcbiAqIGRpZmZpY3VsdCB0byByZWFkLiBJdCBpcyBpbnRlbmRlZCBmb3IgdXNlIGluIGxpYnJhcnkgY29kZSB0aGF0IGV4cG9zZXNcbiAqIHByb21pc2VzLCBub3QgZm9yIHJlZ3VsYXIgYnVzaW5lc3MgbG9naWMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHByZXZlbnRVbmhhbmRsZWRSZWplY3Rpb25XYXJuaW5nIC0gcHJldmVudHMgdGhlIHdhcm5pbmdcbiAgICAgKiBcIlVuaGFuZGxlZCBQcm9taXNlIHJlamVjdGlvblwiIGJ5IGFkZGluZyBhIG5vb3AgcmVqZWN0aW9uIGhhbmRsZXIuXG4gICAgICogV29ya2luZyB3aXRoIGNhbGxzIHJldHVybmVkIGZyb20gdGhlIHJ1bnRpbWUtcnBjIHBhY2thZ2UgaW4gYW5cbiAgICAgKiBhc3luYyBmdW5jdGlvbiB1c3VhbGx5IG1lYW5zIGF3YWl0aW5nIG9uZSBjYWxsIHByb3BlcnR5IGFmdGVyXG4gICAgICogdGhlIG90aGVyLiBUaGlzIG1lYW5zIHRoYXQgdGhlIFwic3RhdHVzXCIgaXMgbm90IGJlaW5nIGF3YWl0ZWQgd2hlblxuICAgICAqIGFuIGVhcmxpZXIgYXdhaXQgZm9yIHRoZSBcImhlYWRlcnNcIiBpcyByZWplY3RlZC4gVGhpcyBjYXVzZXMgdGhlXG4gICAgICogXCJ1bmhhbmRsZWQgcHJvbWlzZSByZWplY3RcIiB3YXJuaW5nLiBBIG1vcmUgY29ycmVjdCBiZWhhdmlvdXIgZm9yXG4gICAgICogY2FsbHMgbWlnaHQgYmUgdG8gYmVjb21lIGF3YXJlIHdoZXRoZXIgYXQgbGVhc3Qgb25lIG9mIHRoZVxuICAgICAqIHByb21pc2VzIGlzIGhhbmRsZWQgYW5kIHN3YWxsb3cgdGhlIHJlamVjdGlvbiB3YXJuaW5nIGZvciB0aGVcbiAgICAgKiBvdGhlcnMuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJldmVudFVuaGFuZGxlZFJlamVjdGlvbldhcm5pbmcgPSB0cnVlKSB7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gRGVmZXJyZWRTdGF0ZS5QRU5ESU5HO1xuICAgICAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICB0aGlzLl9yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocHJldmVudFVuaGFuZGxlZFJlamVjdGlvbldhcm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuX3Byb21pc2UuY2F0Y2goXyA9PiB7IH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcHJvbWlzZS5cbiAgICAgKi9cbiAgICBnZXQgc3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBkZWZlcnJlZCBwcm9taXNlLlxuICAgICAqL1xuICAgIGdldCBwcm9taXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvbWlzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSB0aGUgcHJvbWlzZS4gVGhyb3dzIGlmIHRoZSBwcm9taXNlIGlzIGFscmVhZHkgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQuXG4gICAgICovXG4gICAgcmVzb2x2ZSh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gRGVmZXJyZWRTdGF0ZS5QRU5ESU5HKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgcmVzb2x2ZSAke0RlZmVycmVkU3RhdGVbdGhpcy5zdGF0ZV0udG9Mb3dlckNhc2UoKX1gKTtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gRGVmZXJyZWRTdGF0ZS5SRVNPTFZFRDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVqZWN0IHRoZSBwcm9taXNlLiBUaHJvd3MgaWYgdGhlIHByb21pc2UgaXMgYWxyZWFkeSByZXNvbHZlZCBvciByZWplY3RlZC5cbiAgICAgKi9cbiAgICByZWplY3QocmVhc29uKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBEZWZlcnJlZFN0YXRlLlBFTkRJTkcpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCByZWplY3QgJHtEZWZlcnJlZFN0YXRlW3RoaXMuc3RhdGVdLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICAgIHRoaXMuX3JlamVjdChyZWFzb24pO1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IERlZmVycmVkU3RhdGUuUkVKRUNURUQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgdGhlIHByb21pc2UuIElnbm9yZSBpZiBub3QgcGVuZGluZy5cbiAgICAgKi9cbiAgICByZXNvbHZlUGVuZGluZyh2YWwpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSBEZWZlcnJlZFN0YXRlLlBFTkRJTkcpXG4gICAgICAgICAgICB0aGlzLnJlc29sdmUodmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVqZWN0IHRoZSBwcm9taXNlLiBJZ25vcmUgaWYgbm90IHBlbmRpbmcuXG4gICAgICovXG4gICAgcmVqZWN0UGVuZGluZyhyZWFzb24pIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSBEZWZlcnJlZFN0YXRlLlBFTkRJTkcpXG4gICAgICAgICAgICB0aGlzLnJlamVjdChyZWFzb24pO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IERlZmVycmVkLCBEZWZlcnJlZFN0YXRlIH0gZnJvbSBcIi4vZGVmZXJyZWRcIjtcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gXCJAcHJvdG9idWYtdHMvcnVudGltZVwiO1xuLyoqXG4gKiBBIGBScGNPdXRwdXRTdHJlYW1gIHRoYXQgeW91IGNvbnRyb2wuXG4gKi9cbmV4cG9ydCBjbGFzcyBScGNPdXRwdXRTdHJlYW1Db250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fbGlzID0ge1xuICAgICAgICAgICAgbnh0OiBbXSxcbiAgICAgICAgICAgIG1zZzogW10sXG4gICAgICAgICAgICBlcnI6IFtdLFxuICAgICAgICAgICAgY21wOiBbXSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fY2xvc2VkID0gZmFsc2U7XG4gICAgfVxuICAgIC8vIC0tLSBScGNPdXRwdXRTdHJlYW0gY2FsbGJhY2sgQVBJXG4gICAgb25OZXh0KGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZExpcyhjYWxsYmFjaywgdGhpcy5fbGlzLm54dCk7XG4gICAgfVxuICAgIG9uTWVzc2FnZShjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRMaXMoY2FsbGJhY2ssIHRoaXMuX2xpcy5tc2cpO1xuICAgIH1cbiAgICBvbkVycm9yKGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZExpcyhjYWxsYmFjaywgdGhpcy5fbGlzLmVycik7XG4gICAgfVxuICAgIG9uQ29tcGxldGUoY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkTGlzKGNhbGxiYWNrLCB0aGlzLl9saXMuY21wKTtcbiAgICB9XG4gICAgYWRkTGlzKGNhbGxiYWNrLCBsaXN0KSB7XG4gICAgICAgIGxpc3QucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IGxpc3QuaW5kZXhPZihjYWxsYmFjayk7XG4gICAgICAgICAgICBpZiAoaSA+PSAwKVxuICAgICAgICAgICAgICAgIGxpc3Quc3BsaWNlKGksIDEpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyByZW1vdmUgYWxsIGxpc3RlbmVyc1xuICAgIGNsZWFyTGlzKCkge1xuICAgICAgICBmb3IgKGxldCBsIG9mIE9iamVjdC52YWx1ZXModGhpcy5fbGlzKSlcbiAgICAgICAgICAgIGwuc3BsaWNlKDAsIGwubGVuZ3RoKTtcbiAgICB9XG4gICAgLy8gLS0tIENvbnRyb2xsZXIgQVBJXG4gICAgLyoqXG4gICAgICogSXMgdGhpcyBzdHJlYW0gYWxyZWFkeSBjbG9zZWQgYnkgYSBjb21wbGV0aW9uIG9yIGVycm9yP1xuICAgICAqL1xuICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbG9zZWQgIT09IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbWl0IG1lc3NhZ2UsIGNsb3NlIHdpdGggZXJyb3IsIG9yIGNsb3NlIHN1Y2Nlc3NmdWxseSwgYnV0IG9ubHkgb25lXG4gICAgICogYXQgYSB0aW1lLlxuICAgICAqIENhbiBiZSB1c2VkIHRvIHdyYXAgYSBzdHJlYW0gYnkgdXNpbmcgdGhlIG90aGVyIHN0cmVhbSdzIGBvbk5leHRgLlxuICAgICAqL1xuICAgIG5vdGlmeU5leHQobWVzc2FnZSwgZXJyb3IsIGNvbXBsZXRlKSB7XG4gICAgICAgIGFzc2VydCgobWVzc2FnZSA/IDEgOiAwKSArIChlcnJvciA/IDEgOiAwKSArIChjb21wbGV0ZSA/IDEgOiAwKSA8PSAxLCAnb25seSBvbmUgZW1pc3Npb24gYXQgYSB0aW1lJyk7XG4gICAgICAgIGlmIChtZXNzYWdlKVxuICAgICAgICAgICAgdGhpcy5ub3RpZnlNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgICBpZiAoZXJyb3IpXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUVycm9yKGVycm9yKTtcbiAgICAgICAgaWYgKGNvbXBsZXRlKVxuICAgICAgICAgICAgdGhpcy5ub3RpZnlDb21wbGV0ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbWl0cyBhIG5ldyBtZXNzYWdlLiBUaHJvd3MgaWYgc3RyZWFtIGlzIGNsb3NlZC5cbiAgICAgKlxuICAgICAqIFRyaWdnZXJzIG9uTmV4dCBhbmQgb25NZXNzYWdlIGNhbGxiYWNrcy5cbiAgICAgKi9cbiAgICBub3RpZnlNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLmNsb3NlZCwgJ3N0cmVhbSBpcyBjbG9zZWQnKTtcbiAgICAgICAgdGhpcy5wdXNoSXQoeyB2YWx1ZTogbWVzc2FnZSwgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgIHRoaXMuX2xpcy5tc2cuZm9yRWFjaChsID0+IGwobWVzc2FnZSkpO1xuICAgICAgICB0aGlzLl9saXMubnh0LmZvckVhY2gobCA9PiBsKG1lc3NhZ2UsIHVuZGVmaW5lZCwgZmFsc2UpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBzdHJlYW0gd2l0aCBhbiBlcnJvci4gVGhyb3dzIGlmIHN0cmVhbSBpcyBjbG9zZWQuXG4gICAgICpcbiAgICAgKiBUcmlnZ2VycyBvbk5leHQgYW5kIG9uRXJyb3IgY2FsbGJhY2tzLlxuICAgICAqL1xuICAgIG5vdGlmeUVycm9yKGVycm9yKSB7XG4gICAgICAgIGFzc2VydCghdGhpcy5jbG9zZWQsICdzdHJlYW0gaXMgY2xvc2VkJyk7XG4gICAgICAgIHRoaXMuX2Nsb3NlZCA9IGVycm9yO1xuICAgICAgICB0aGlzLnB1c2hJdChlcnJvcik7XG4gICAgICAgIHRoaXMuX2xpcy5lcnIuZm9yRWFjaChsID0+IGwoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5fbGlzLm54dC5mb3JFYWNoKGwgPT4gbCh1bmRlZmluZWQsIGVycm9yLCBmYWxzZSkpO1xuICAgICAgICB0aGlzLmNsZWFyTGlzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgc3RyZWFtIHN1Y2Nlc3NmdWxseS4gVGhyb3dzIGlmIHN0cmVhbSBpcyBjbG9zZWQuXG4gICAgICpcbiAgICAgKiBUcmlnZ2VycyBvbk5leHQgYW5kIG9uQ29tcGxldGUgY2FsbGJhY2tzLlxuICAgICAqL1xuICAgIG5vdGlmeUNvbXBsZXRlKCkge1xuICAgICAgICBhc3NlcnQoIXRoaXMuY2xvc2VkLCAnc3RyZWFtIGlzIGNsb3NlZCcpO1xuICAgICAgICB0aGlzLl9jbG9zZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnB1c2hJdCh7IHZhbHVlOiBudWxsLCBkb25lOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLl9saXMuY21wLmZvckVhY2gobCA9PiBsKCkpO1xuICAgICAgICB0aGlzLl9saXMubnh0LmZvckVhY2gobCA9PiBsKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cnVlKSk7XG4gICAgICAgIHRoaXMuY2xlYXJMaXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhc3luYyBpdGVyYXRvciAodGhhdCBjYW4gYmUgdXNlZCB3aXRoIGBmb3IgYXdhaXQgey4uLn1gKVxuICAgICAqIHRvIGNvbnN1bWUgdGhlIHN0cmVhbS5cbiAgICAgKlxuICAgICAqIFNvbWUgdGhpbmdzIHRvIG5vdGU6XG4gICAgICogLSBJZiBhbiBlcnJvciBvY2N1cnMsIHRoZSBgZm9yIGF3YWl0YCB3aWxsIHRocm93IGl0LlxuICAgICAqIC0gSWYgYW4gZXJyb3Igb2NjdXJyZWQgYmVmb3JlIHRoZSBgZm9yIGF3YWl0YCB3YXMgc3RhcnRlZCwgYGZvciBhd2FpdGBcbiAgICAgKiAgIHdpbGwgcmUtdGhyb3cgaXQuXG4gICAgICogLSBJZiB0aGUgc3RyZWFtIGlzIGFscmVhZHkgY29tcGxldGUsIHRoZSBgZm9yIGF3YWl0YCB3aWxsIGJlIGVtcHR5LlxuICAgICAqIC0gSWYgeW91ciBgZm9yIGF3YWl0YCBjb25zdW1lcyBzbG93ZXIgdGhhbiB0aGUgc3RyZWFtIHByb2R1Y2VzLFxuICAgICAqICAgZm9yIGV4YW1wbGUgYmVjYXVzZSB5b3UgYXJlIHJlbGF5aW5nIG1lc3NhZ2VzIGluIGEgc2xvdyBvcGVyYXRpb24sXG4gICAgICogICBtZXNzYWdlcyBhcmUgcXVldWVkLlxuICAgICAqL1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgIC8vIGluaXQgdGhlIGl0ZXJhdG9yIHN0YXRlLCBlbmFibGluZyBwdXNoSXQoKVxuICAgICAgICBpZiAoIXRoaXMuX2l0U3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2l0U3RhdGUgPSB7IHE6IFtdIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgd2UgYXJlIGNsb3NlZCwgd2UgYXJlIGRlZmluaXRlbHkgbm90IHJlY2VpdmluZyBhbnkgbW9yZSBtZXNzYWdlcy5cbiAgICAgICAgLy8gYnV0IHdlIGNhbid0IGxldCB0aGUgaXRlcmF0b3IgZ2V0IHN0dWNrLiB3ZSB3YW50IHRvIGVpdGhlcjpcbiAgICAgICAgLy8gYSkgZmluaXNoIHRoZSBuZXcgaXRlcmF0b3IgaW1tZWRpYXRlbHksIGJlY2F1c2Ugd2UgYXJlIGNvbXBsZXRlZFxuICAgICAgICAvLyBiKSByZWplY3QgdGhlIG5ldyBpdGVyYXRvciwgYmVjYXVzZSB3ZSBlcnJvcmVkXG4gICAgICAgIGlmICh0aGlzLl9jbG9zZWQgPT09IHRydWUpXG4gICAgICAgICAgICB0aGlzLnB1c2hJdCh7IHZhbHVlOiBudWxsLCBkb25lOiB0cnVlIH0pO1xuICAgICAgICBlbHNlIGlmICh0aGlzLl9jbG9zZWQgIT09IGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5wdXNoSXQodGhpcy5fY2xvc2VkKTtcbiAgICAgICAgLy8gdGhlIGFzeW5jIGl0ZXJhdG9yXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5faXRTdGF0ZTtcbiAgICAgICAgICAgICAgICBhc3NlcnQoc3RhdGUsIFwiYmFkIHN0YXRlXCIpOyAvLyBpZiB3ZSBkb24ndCBoYXZlIGEgc3RhdGUgaGVyZSwgY29kZSBpcyBicm9rZW5cbiAgICAgICAgICAgICAgICAvLyB0aGVyZSBzaG91bGQgYmUgbm8gcGVuZGluZyByZXN1bHQuXG4gICAgICAgICAgICAgICAgLy8gZGlkIHRoZSBjb25zdW1lciBjYWxsIG5leHQoKSBiZWZvcmUgd2UgcmVzb2x2ZWQgb3VyIHByZXZpb3VzIHJlc3VsdCBwcm9taXNlP1xuICAgICAgICAgICAgICAgIGFzc2VydCghc3RhdGUucCwgXCJpdGVyYXRvciBjb250cmFjdCBicm9rZW5cIik7XG4gICAgICAgICAgICAgICAgLy8gZGlkIHdlIHByb2R1Y2UgZmFzdGVyIHRoYW4gdGhlIGl0ZXJhdG9yIGNvbnN1bWVkP1xuICAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGUgb2xkZXN0IHJlc3VsdCBmcm9tIHRoZSBxdWV1ZS5cbiAgICAgICAgICAgICAgICBsZXQgZmlyc3QgPSBzdGF0ZS5xLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFwidmFsdWVcIiBpbiBmaXJzdCkgPyBQcm9taXNlLnJlc29sdmUoZmlyc3QpIDogUHJvbWlzZS5yZWplY3QoZmlyc3QpO1xuICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgbm8gcmVzdWx0IEFUTSwgYnV0IHdlIHByb21pc2Ugb25lLlxuICAgICAgICAgICAgICAgIC8vIGFzIHNvb24gYXMgd2UgaGF2ZSBhIHJlc3VsdCwgd2UgbXVzdCByZXNvbHZlIHByb21pc2UuXG4gICAgICAgICAgICAgICAgc3RhdGUucCA9IG5ldyBEZWZlcnJlZCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS5wLnByb21pc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyBcInB1c2hcIiBhIG5ldyBpdGVyYXRvciByZXN1bHQuXG4gICAgLy8gdGhpcyBlaXRoZXIgcmVzb2x2ZXMgYSBwZW5kaW5nIHByb21pc2UsIG9yIGVucXVldWVzIHRoZSByZXN1bHQuXG4gICAgcHVzaEl0KHJlc3VsdCkge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLl9pdFN0YXRlO1xuICAgICAgICBpZiAoIXN0YXRlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAvLyBpcyB0aGUgY29uc3VtZXIgd2FpdGluZyBmb3IgdXM/XG4gICAgICAgIGlmIChzdGF0ZS5wKSB7XG4gICAgICAgICAgICAvLyB5ZXMsIGNvbnN1bWVyIGlzIHdhaXRpbmcgZm9yIHRoaXMgcHJvbWlzZS5cbiAgICAgICAgICAgIGNvbnN0IHAgPSBzdGF0ZS5wO1xuICAgICAgICAgICAgYXNzZXJ0KHAuc3RhdGUgPT0gRGVmZXJyZWRTdGF0ZS5QRU5ESU5HLCBcIml0ZXJhdG9yIGNvbnRyYWN0IGJyb2tlblwiKTtcbiAgICAgICAgICAgIC8vIHJlc29sdmUgdGhlIHByb21pc2VcbiAgICAgICAgICAgIChcInZhbHVlXCIgaW4gcmVzdWx0KSA/IHAucmVzb2x2ZShyZXN1bHQpIDogcC5yZWplY3QocmVzdWx0KTtcbiAgICAgICAgICAgIC8vIG11c3QgY2xlYW51cCwgb3RoZXJ3aXNlIGl0ZXJhdG9yLm5leHQoKSB3b3VsZCBwaWNrIGl0IHVwIGFnYWluLlxuICAgICAgICAgICAgZGVsZXRlIHN0YXRlLnA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyB3ZSBhcmUgcHJvZHVjaW5nIGZhc3RlciB0aGFuIHRoZSBpdGVyYXRvciBjb25zdW1lcy5cbiAgICAgICAgICAgIC8vIHB1c2ggcmVzdWx0IG9udG8gcXVldWUuXG4gICAgICAgICAgICBzdGF0ZS5xLnB1c2gocmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuLyoqXG4gKiBBIHVuYXJ5IFJQQyBjYWxsLiBVbmFyeSBtZWFucyB0aGVyZSBpcyBleGFjdGx5IG9uZSBpbnB1dCBtZXNzYWdlIGFuZFxuICogZXhhY3RseSBvbmUgb3V0cHV0IG1lc3NhZ2UgdW5sZXNzIGFuIGVycm9yIG9jY3VycmVkLlxuICovXG5leHBvcnQgY2xhc3MgVW5hcnlDYWxsIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIHJlcXVlc3RIZWFkZXJzLCByZXF1ZXN0LCBoZWFkZXJzLCByZXNwb25zZSwgc3RhdHVzLCB0cmFpbGVycykge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgdGhpcy5yZXF1ZXN0SGVhZGVycyA9IHJlcXVlc3RIZWFkZXJzO1xuICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzO1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICB0aGlzLnRyYWlsZXJzID0gdHJhaWxlcnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHlvdSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBmaW5hbCBvdXRjb21lIG9mIHRoaXMgY2FsbCxcbiAgICAgKiB5b3UgY2FuIGF3YWl0IGl0IHRvIHJlY2VpdmUgYSBgRmluaXNoZWRVbmFyeUNhbGxgLlxuICAgICAqL1xuICAgIHRoZW4ob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZUZpbmlzaGVkKCkudGhlbih2YWx1ZSA9PiBvbmZ1bGZpbGxlZCA/IFByb21pc2UucmVzb2x2ZShvbmZ1bGZpbGxlZCh2YWx1ZSkpIDogdmFsdWUsIHJlYXNvbiA9PiBvbnJlamVjdGVkID8gUHJvbWlzZS5yZXNvbHZlKG9ucmVqZWN0ZWQocmVhc29uKSkgOiBQcm9taXNlLnJlamVjdChyZWFzb24pKTtcbiAgICB9XG4gICAgcHJvbWlzZUZpbmlzaGVkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgbGV0IFtoZWFkZXJzLCByZXNwb25zZSwgc3RhdHVzLCB0cmFpbGVyc10gPSB5aWVsZCBQcm9taXNlLmFsbChbdGhpcy5oZWFkZXJzLCB0aGlzLnJlc3BvbnNlLCB0aGlzLnN0YXR1cywgdGhpcy50cmFpbGVyc10pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHRoaXMubWV0aG9kLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzOiB0aGlzLnJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHRoaXMucmVxdWVzdCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgICAgICB0cmFpbGVyc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG4vKipcbiAqIEEgc2VydmVyIHN0cmVhbWluZyBSUEMgY2FsbC4gVGhlIGNsaWVudCBwcm92aWRlcyBleGFjdGx5IG9uZSBpbnB1dCBtZXNzYWdlXG4gKiBidXQgdGhlIHNlcnZlciBtYXkgcmVzcG9uZCB3aXRoIDAsIDEsIG9yIG1vcmUgbWVzc2FnZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2ZXJTdHJlYW1pbmdDYWxsIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIHJlcXVlc3RIZWFkZXJzLCByZXF1ZXN0LCBoZWFkZXJzLCByZXNwb25zZSwgc3RhdHVzLCB0cmFpbGVycykge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgdGhpcy5yZXF1ZXN0SGVhZGVycyA9IHJlcXVlc3RIZWFkZXJzO1xuICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzO1xuICAgICAgICB0aGlzLnJlc3BvbnNlcyA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgdGhpcy50cmFpbGVycyA9IHRyYWlsZXJzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnN0ZWFkIG9mIGF3YWl0aW5nIHRoZSByZXNwb25zZSBzdGF0dXMgYW5kIHRyYWlsZXJzLCB5b3UgY2FuXG4gICAgICoganVzdCBhcyB3ZWxsIGF3YWl0IHRoaXMgY2FsbCBpdHNlbGYgdG8gcmVjZWl2ZSB0aGUgc2VydmVyIG91dGNvbWUuXG4gICAgICogWW91IHNob3VsZCBmaXJzdCBzZXR1cCBzb21lIGxpc3RlbmVycyB0byB0aGUgYHJlcXVlc3RgIHRvXG4gICAgICogc2VlIHRoZSBhY3R1YWwgbWVzc2FnZXMgdGhlIHNlcnZlciByZXBsaWVkIHdpdGguXG4gICAgICovXG4gICAgdGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlRmluaXNoZWQoKS50aGVuKHZhbHVlID0+IG9uZnVsZmlsbGVkID8gUHJvbWlzZS5yZXNvbHZlKG9uZnVsZmlsbGVkKHZhbHVlKSkgOiB2YWx1ZSwgcmVhc29uID0+IG9ucmVqZWN0ZWQgPyBQcm9taXNlLnJlc29sdmUob25yZWplY3RlZChyZWFzb24pKSA6IFByb21pc2UucmVqZWN0KHJlYXNvbikpO1xuICAgIH1cbiAgICBwcm9taXNlRmluaXNoZWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgW2hlYWRlcnMsIHN0YXR1cywgdHJhaWxlcnNdID0geWllbGQgUHJvbWlzZS5hbGwoW3RoaXMuaGVhZGVycywgdGhpcy5zdGF0dXMsIHRoaXMudHJhaWxlcnNdKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiB0aGlzLm1ldGhvZCxcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyczogdGhpcy5yZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgICAgICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3QsXG4gICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgdHJhaWxlcnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbi8qKlxuICogQSBjbGllbnQgc3RyZWFtaW5nIFJQQyBjYWxsLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGNsaWVudHMgc2VuZHMgMCwgMSwgb3JcbiAqIG1vcmUgbWVzc2FnZXMgdG8gdGhlIHNlcnZlciwgYW5kIHRoZSBzZXJ2ZXIgcmVwbGllcyB3aXRoIGV4YWN0bHkgb25lXG4gKiBtZXNzYWdlLlxuICovXG5leHBvcnQgY2xhc3MgQ2xpZW50U3RyZWFtaW5nQ2FsbCB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kLCByZXF1ZXN0SGVhZGVycywgcmVxdWVzdCwgaGVhZGVycywgcmVzcG9uc2UsIHN0YXR1cywgdHJhaWxlcnMpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgIHRoaXMucmVxdWVzdEhlYWRlcnMgPSByZXF1ZXN0SGVhZGVycztcbiAgICAgICAgdGhpcy5yZXF1ZXN0cyA9IHJlcXVlc3Q7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIHRoaXMudHJhaWxlcnMgPSB0cmFpbGVycztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zdGVhZCBvZiBhd2FpdGluZyB0aGUgcmVzcG9uc2Ugc3RhdHVzIGFuZCB0cmFpbGVycywgeW91IGNhblxuICAgICAqIGp1c3QgYXMgd2VsbCBhd2FpdCB0aGlzIGNhbGwgaXRzZWxmIHRvIHJlY2VpdmUgdGhlIHNlcnZlciBvdXRjb21lLlxuICAgICAqIE5vdGUgdGhhdCBpdCBtYXkgc3RpbGwgYmUgdmFsaWQgdG8gc2VuZCBtb3JlIHJlcXVlc3QgbWVzc2FnZXMuXG4gICAgICovXG4gICAgdGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlRmluaXNoZWQoKS50aGVuKHZhbHVlID0+IG9uZnVsZmlsbGVkID8gUHJvbWlzZS5yZXNvbHZlKG9uZnVsZmlsbGVkKHZhbHVlKSkgOiB2YWx1ZSwgcmVhc29uID0+IG9ucmVqZWN0ZWQgPyBQcm9taXNlLnJlc29sdmUob25yZWplY3RlZChyZWFzb24pKSA6IFByb21pc2UucmVqZWN0KHJlYXNvbikpO1xuICAgIH1cbiAgICBwcm9taXNlRmluaXNoZWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgW2hlYWRlcnMsIHJlc3BvbnNlLCBzdGF0dXMsIHRyYWlsZXJzXSA9IHlpZWxkIFByb21pc2UuYWxsKFt0aGlzLmhlYWRlcnMsIHRoaXMucmVzcG9uc2UsIHRoaXMuc3RhdHVzLCB0aGlzLnRyYWlsZXJzXSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogdGhpcy5tZXRob2QsXG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnM6IHRoaXMucmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgdHJhaWxlcnNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuLyoqXG4gKiBBIGR1cGxleCBzdHJlYW1pbmcgUlBDIGNhbGwuIFRoaXMgbWVhbnMgdGhhdCB0aGUgY2xpZW50cyBzZW5kcyBhblxuICogYXJiaXRyYXJ5IGFtb3VudCBvZiBtZXNzYWdlcyB0byB0aGUgc2VydmVyLCB3aGlsZSBhdCB0aGUgc2FtZSB0aW1lLFxuICogdGhlIHNlcnZlciBzZW5kcyBhbiBhcmJpdHJhcnkgYW1vdW50IG9mIG1lc3NhZ2VzIHRvIHRoZSBjbGllbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEdXBsZXhTdHJlYW1pbmdDYWxsIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIHJlcXVlc3RIZWFkZXJzLCByZXF1ZXN0LCBoZWFkZXJzLCByZXNwb25zZSwgc3RhdHVzLCB0cmFpbGVycykge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgdGhpcy5yZXF1ZXN0SGVhZGVycyA9IHJlcXVlc3RIZWFkZXJzO1xuICAgICAgICB0aGlzLnJlcXVlc3RzID0gcmVxdWVzdDtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgICAgdGhpcy5yZXNwb25zZXMgPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIHRoaXMudHJhaWxlcnMgPSB0cmFpbGVycztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zdGVhZCBvZiBhd2FpdGluZyB0aGUgcmVzcG9uc2Ugc3RhdHVzIGFuZCB0cmFpbGVycywgeW91IGNhblxuICAgICAqIGp1c3QgYXMgd2VsbCBhd2FpdCB0aGlzIGNhbGwgaXRzZWxmIHRvIHJlY2VpdmUgdGhlIHNlcnZlciBvdXRjb21lLlxuICAgICAqIE5vdGUgdGhhdCBpdCBtYXkgc3RpbGwgYmUgdmFsaWQgdG8gc2VuZCBtb3JlIHJlcXVlc3QgbWVzc2FnZXMuXG4gICAgICovXG4gICAgdGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlRmluaXNoZWQoKS50aGVuKHZhbHVlID0+IG9uZnVsZmlsbGVkID8gUHJvbWlzZS5yZXNvbHZlKG9uZnVsZmlsbGVkKHZhbHVlKSkgOiB2YWx1ZSwgcmVhc29uID0+IG9ucmVqZWN0ZWQgPyBQcm9taXNlLnJlc29sdmUob25yZWplY3RlZChyZWFzb24pKSA6IFByb21pc2UucmVqZWN0KHJlYXNvbikpO1xuICAgIH1cbiAgICBwcm9taXNlRmluaXNoZWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgW2hlYWRlcnMsIHN0YXR1cywgdHJhaWxlcnNdID0geWllbGQgUHJvbWlzZS5hbGwoW3RoaXMuaGVhZGVycywgdGhpcy5zdGF0dXMsIHRoaXMudHJhaWxlcnNdKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiB0aGlzLm1ldGhvZCxcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyczogdGhpcy5yZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgICAgICB0cmFpbGVycyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgUnBjRXJyb3IgfSBmcm9tIFwiLi9ycGMtZXJyb3JcIjtcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gXCJAcHJvdG9idWYtdHMvcnVudGltZVwiO1xuaW1wb3J0IHsgUnBjT3V0cHV0U3RyZWFtQ29udHJvbGxlciB9IGZyb20gXCIuL3JwYy1vdXRwdXQtc3RyZWFtXCI7XG5pbXBvcnQgeyBtZXJnZVJwY09wdGlvbnMgfSBmcm9tIFwiLi9ycGMtb3B0aW9uc1wiO1xuaW1wb3J0IHsgVW5hcnlDYWxsIH0gZnJvbSBcIi4vdW5hcnktY2FsbFwiO1xuaW1wb3J0IHsgU2VydmVyU3RyZWFtaW5nQ2FsbCB9IGZyb20gXCIuL3NlcnZlci1zdHJlYW1pbmctY2FsbFwiO1xuaW1wb3J0IHsgQ2xpZW50U3RyZWFtaW5nQ2FsbCB9IGZyb20gXCIuL2NsaWVudC1zdHJlYW1pbmctY2FsbFwiO1xuaW1wb3J0IHsgRHVwbGV4U3RyZWFtaW5nQ2FsbCB9IGZyb20gXCIuL2R1cGxleC1zdHJlYW1pbmctY2FsbFwiO1xuLyoqXG4gKiBUcmFuc3BvcnQgZm9yIHRlc3RpbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBUZXN0VHJhbnNwb3J0IHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHdpdGggbW9jayBkYXRhLiBPbWl0dGVkIGZpZWxkcyBoYXZlIGRlZmF1bHQgdmFsdWUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogU3VwcHJlc3Mgd2FybmluZyAvIGVycm9yIGFib3V0IHVuY2F1Z2h0IHJlamVjdGlvbnMgb2ZcbiAgICAgICAgICogXCJzdGF0dXNcIiBhbmQgXCJ0cmFpbGVyc1wiLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zdXBwcmVzc1VuY2F1Z2h0UmVqZWN0aW9ucyA9IHRydWU7XG4gICAgICAgIHRoaXMuaGVhZGVyRGVsYXkgPSAxMDtcbiAgICAgICAgdGhpcy5yZXNwb25zZURlbGF5ID0gNTA7XG4gICAgICAgIHRoaXMuYmV0d2VlblJlc3BvbnNlRGVsYXkgPSAxMDtcbiAgICAgICAgdGhpcy5hZnRlclJlc3BvbnNlRGVsYXkgPSAxMDtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YSAhPT0gbnVsbCAmJiBkYXRhICE9PSB2b2lkIDAgPyBkYXRhIDoge307XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbnQgbWVzc2FnZShzKSBkdXJpbmcgdGhlIGxhc3Qgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGdldCBzZW50TWVzc2FnZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmxhc3RJbnB1dCBpbnN0YW5jZW9mIFRlc3RJbnB1dFN0cmVhbSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFzdElucHV0LnNlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHRoaXMubGFzdElucHV0ID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBbdGhpcy5sYXN0SW5wdXQuc2luZ2xlXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRpbmcgbWVzc2FnZShzKSBjb21wbGV0ZWQ/XG4gICAgICovXG4gICAgZ2V0IHNlbmRDb21wbGV0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMubGFzdElucHV0IGluc3RhbmNlb2YgVGVzdElucHV0U3RyZWFtKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sYXN0SW5wdXQuY29tcGxldGVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLmxhc3RJbnB1dCA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIENyZWF0ZXMgYSBwcm9taXNlIGZvciByZXNwb25zZSBoZWFkZXJzIGZyb20gdGhlIG1vY2sgZGF0YS5cbiAgICBwcm9taXNlSGVhZGVycygpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0gKF9hID0gdGhpcy5kYXRhLmhlYWRlcnMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFRlc3RUcmFuc3BvcnQuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIHJldHVybiBoZWFkZXJzIGluc3RhbmNlb2YgUnBjRXJyb3JcbiAgICAgICAgICAgID8gUHJvbWlzZS5yZWplY3QoaGVhZGVycylcbiAgICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKGhlYWRlcnMpO1xuICAgIH1cbiAgICAvLyBDcmVhdGVzIGEgcHJvbWlzZSBmb3IgYSBzaW5nbGUsIHZhbGlkLCBtZXNzYWdlIGZyb20gdGhlIG1vY2sgZGF0YS5cbiAgICBwcm9taXNlU2luZ2xlUmVzcG9uc2UobWV0aG9kKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGEucmVzcG9uc2UgaW5zdGFuY2VvZiBScGNFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHRoaXMuZGF0YS5yZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHI7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZGF0YS5yZXNwb25zZSkpIHtcbiAgICAgICAgICAgIGFzc2VydCh0aGlzLmRhdGEucmVzcG9uc2UubGVuZ3RoID4gMCk7XG4gICAgICAgICAgICByID0gdGhpcy5kYXRhLnJlc3BvbnNlWzBdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZGF0YS5yZXNwb25zZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByID0gdGhpcy5kYXRhLnJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgciA9IG1ldGhvZC5PLmNyZWF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChtZXRob2QuTy5pcyhyKSk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFB1c2hlcyByZXNwb25zZSBtZXNzYWdlcyBmcm9tIHRoZSBtb2NrIGRhdGEgdG8gdGhlIG91dHB1dCBzdHJlYW0uXG4gICAgICogSWYgYW4gZXJyb3IgcmVzcG9uc2UsIHN0YXR1cyBvciB0cmFpbGVycyBhcmUgbW9ja2VkLCB0aGUgc3RyZWFtIGlzXG4gICAgICogY2xvc2VkIHdpdGggdGhlIHJlc3BlY3RpdmUgZXJyb3IuXG4gICAgICogT3RoZXJ3aXNlLCBzdHJlYW0gaXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIHJlc29sdmVzIHdoZW4gdGhlIHN0cmVhbSBpcyBjbG9zZWQuIEl0IHNob3VsZFxuICAgICAqIG5vdCByZWplY3QuIElmIGl0IGRvZXMsIGNvZGUgaXMgYnJva2VuLlxuICAgICAqL1xuICAgIHN0cmVhbVJlc3BvbnNlcyhtZXRob2QsIHN0cmVhbSwgYWJvcnQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSBcImRhdGEucmVzcG9uc2VcIiBpbnRvIGFuIGFycmF5IG9mIHZhbGlkIG91dHB1dCBtZXNzYWdlc1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEucmVzcG9uc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2gobWV0aG9kLk8uY3JlYXRlKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEucmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbXNnIG9mIHRoaXMuZGF0YS5yZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBhc3NlcnQobWV0aG9kLk8uaXMobXNnKSk7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2gobXNnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghKHRoaXMuZGF0YS5yZXNwb25zZSBpbnN0YW5jZW9mIFJwY0Vycm9yKSkge1xuICAgICAgICAgICAgICAgIGFzc2VydChtZXRob2QuTy5pcyh0aGlzLmRhdGEucmVzcG9uc2UpKTtcbiAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKHRoaXMuZGF0YS5yZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBzdGFydCB0aGUgc3RyZWFtIHdpdGggYW4gaW5pdGlhbCBkZWxheS5cbiAgICAgICAgICAgIC8vIGlmIHRoZSByZXF1ZXN0IGlzIGNhbmNlbGxlZCwgbm90aWZ5KCkgZXJyb3IgYW5kIGV4aXQuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGRlbGF5KHRoaXMucmVzcG9uc2VEZWxheSwgYWJvcnQpKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBzdHJlYW0ubm90aWZ5RXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIGVycm9yIHJlc3BvbnNlIHdhcyBtb2NrZWQsIG5vdGlmeSgpIGVycm9yIChzdHJlYW0gaXMgbm93IGNsb3NlZCB3aXRoIGVycm9yKSBhbmQgZXhpdC5cbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEucmVzcG9uc2UgaW5zdGFuY2VvZiBScGNFcnJvcikge1xuICAgICAgICAgICAgICAgIHN0cmVhbS5ub3RpZnlFcnJvcih0aGlzLmRhdGEucmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJlZ3VsYXIgcmVzcG9uc2UgbWVzc2FnZXMgd2VyZSBtb2NrZWQuIG5vdGlmeSgpIHRoZW0uXG4gICAgICAgICAgICBmb3IgKGxldCBtc2cgb2YgbWVzc2FnZXMpIHtcbiAgICAgICAgICAgICAgICBzdHJlYW0ubm90aWZ5TWVzc2FnZShtc2cpO1xuICAgICAgICAgICAgICAgIC8vIGFkZCBhIHNob3J0IGRlbGF5IGJldHdlZW4gcmVzcG9uc2VzXG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHJlcXVlc3QgaXMgY2FuY2VsbGVkLCBub3RpZnkoKSBlcnJvciBhbmQgZXhpdC5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBkZWxheSh0aGlzLmJldHdlZW5SZXNwb25zZURlbGF5LCBhYm9ydCkodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5ub3RpZnlFcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlcnJvciBzdGF0dXMgd2FzIG1vY2tlZCwgbm90aWZ5KCkgZXJyb3IgKHN0cmVhbSBpcyBub3cgY2xvc2VkIHdpdGggZXJyb3IpIGFuZCBleGl0LlxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5zdGF0dXMgaW5zdGFuY2VvZiBScGNFcnJvcikge1xuICAgICAgICAgICAgICAgIHN0cmVhbS5ub3RpZnlFcnJvcih0aGlzLmRhdGEuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlcnJvciB0cmFpbGVycyB3ZXJlIG1vY2tlZCwgbm90aWZ5KCkgZXJyb3IgKHN0cmVhbSBpcyBub3cgY2xvc2VkIHdpdGggZXJyb3IpIGFuZCBleGl0LlxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS50cmFpbGVycyBpbnN0YW5jZW9mIFJwY0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtLm5vdGlmeUVycm9yKHRoaXMuZGF0YS50cmFpbGVycyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gc3RyZWFtIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgICAgIHN0cmVhbS5ub3RpZnlDb21wbGV0ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gQ3JlYXRlcyBhIHByb21pc2UgZm9yIHJlc3BvbnNlIHN0YXR1cyBmcm9tIHRoZSBtb2NrIGRhdGEuXG4gICAgcHJvbWlzZVN0YXR1cygpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBzdGF0dXMgPSAoX2EgPSB0aGlzLmRhdGEuc3RhdHVzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBUZXN0VHJhbnNwb3J0LmRlZmF1bHRTdGF0dXM7XG4gICAgICAgIHJldHVybiBzdGF0dXMgaW5zdGFuY2VvZiBScGNFcnJvclxuICAgICAgICAgICAgPyBQcm9taXNlLnJlamVjdChzdGF0dXMpXG4gICAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZShzdGF0dXMpO1xuICAgIH1cbiAgICAvLyBDcmVhdGVzIGEgcHJvbWlzZSBmb3IgcmVzcG9uc2UgdHJhaWxlcnMgZnJvbSB0aGUgbW9jayBkYXRhLlxuICAgIHByb21pc2VUcmFpbGVycygpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCB0cmFpbGVycyA9IChfYSA9IHRoaXMuZGF0YS50cmFpbGVycykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogVGVzdFRyYW5zcG9ydC5kZWZhdWx0VHJhaWxlcnM7XG4gICAgICAgIHJldHVybiB0cmFpbGVycyBpbnN0YW5jZW9mIFJwY0Vycm9yXG4gICAgICAgICAgICA/IFByb21pc2UucmVqZWN0KHRyYWlsZXJzKVxuICAgICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUodHJhaWxlcnMpO1xuICAgIH1cbiAgICBtYXliZVN1cHByZXNzVW5jYXVnaHQoLi4ucHJvbWlzZSkge1xuICAgICAgICBpZiAodGhpcy5zdXBwcmVzc1VuY2F1Z2h0UmVqZWN0aW9ucykge1xuICAgICAgICAgICAgZm9yIChsZXQgcCBvZiBwcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbWVyZ2VPcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG1lcmdlUnBjT3B0aW9ucyh7fSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHVuYXJ5KG1ldGhvZCwgaW5wdXQsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCByZXF1ZXN0SGVhZGVycyA9IChfYSA9IG9wdGlvbnMubWV0YSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge30sIGhlYWRlcnNQcm9taXNlID0gdGhpcy5wcm9taXNlSGVhZGVycygpXG4gICAgICAgICAgICAudGhlbihkZWxheSh0aGlzLmhlYWRlckRlbGF5LCBvcHRpb25zLmFib3J0KSksIHJlc3BvbnNlUHJvbWlzZSA9IGhlYWRlcnNQcm9taXNlXG4gICAgICAgICAgICAuY2F0Y2goXyA9PiB7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihkZWxheSh0aGlzLnJlc3BvbnNlRGVsYXksIG9wdGlvbnMuYWJvcnQpKVxuICAgICAgICAgICAgLnRoZW4oXyA9PiB0aGlzLnByb21pc2VTaW5nbGVSZXNwb25zZShtZXRob2QpKSwgc3RhdHVzUHJvbWlzZSA9IHJlc3BvbnNlUHJvbWlzZVxuICAgICAgICAgICAgLmNhdGNoKF8gPT4ge1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oZGVsYXkodGhpcy5hZnRlclJlc3BvbnNlRGVsYXksIG9wdGlvbnMuYWJvcnQpKVxuICAgICAgICAgICAgLnRoZW4oXyA9PiB0aGlzLnByb21pc2VTdGF0dXMoKSksIHRyYWlsZXJzUHJvbWlzZSA9IHJlc3BvbnNlUHJvbWlzZVxuICAgICAgICAgICAgLmNhdGNoKF8gPT4ge1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oZGVsYXkodGhpcy5hZnRlclJlc3BvbnNlRGVsYXksIG9wdGlvbnMuYWJvcnQpKVxuICAgICAgICAgICAgLnRoZW4oXyA9PiB0aGlzLnByb21pc2VUcmFpbGVycygpKTtcbiAgICAgICAgdGhpcy5tYXliZVN1cHByZXNzVW5jYXVnaHQoc3RhdHVzUHJvbWlzZSwgdHJhaWxlcnNQcm9taXNlKTtcbiAgICAgICAgdGhpcy5sYXN0SW5wdXQgPSB7IHNpbmdsZTogaW5wdXQgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmFyeUNhbGwobWV0aG9kLCByZXF1ZXN0SGVhZGVycywgaW5wdXQsIGhlYWRlcnNQcm9taXNlLCByZXNwb25zZVByb21pc2UsIHN0YXR1c1Byb21pc2UsIHRyYWlsZXJzUHJvbWlzZSk7XG4gICAgfVxuICAgIHNlcnZlclN0cmVhbWluZyhtZXRob2QsIGlucHV0LCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgcmVxdWVzdEhlYWRlcnMgPSAoX2EgPSBvcHRpb25zLm1ldGEpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHt9LCBoZWFkZXJzUHJvbWlzZSA9IHRoaXMucHJvbWlzZUhlYWRlcnMoKVxuICAgICAgICAgICAgLnRoZW4oZGVsYXkodGhpcy5oZWFkZXJEZWxheSwgb3B0aW9ucy5hYm9ydCkpLCBvdXRwdXRTdHJlYW0gPSBuZXcgUnBjT3V0cHV0U3RyZWFtQ29udHJvbGxlcigpLCByZXNwb25zZVN0cmVhbUNsb3NlZFByb21pc2UgPSBoZWFkZXJzUHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oZGVsYXkodGhpcy5yZXNwb25zZURlbGF5LCBvcHRpb25zLmFib3J0KSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnN0cmVhbVJlc3BvbnNlcyhtZXRob2QsIG91dHB1dFN0cmVhbSwgb3B0aW9ucy5hYm9ydCkpXG4gICAgICAgICAgICAudGhlbihkZWxheSh0aGlzLmFmdGVyUmVzcG9uc2VEZWxheSwgb3B0aW9ucy5hYm9ydCkpLCBzdGF0dXNQcm9taXNlID0gcmVzcG9uc2VTdHJlYW1DbG9zZWRQcm9taXNlXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnByb21pc2VTdGF0dXMoKSksIHRyYWlsZXJzUHJvbWlzZSA9IHJlc3BvbnNlU3RyZWFtQ2xvc2VkUHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5wcm9taXNlVHJhaWxlcnMoKSk7XG4gICAgICAgIHRoaXMubWF5YmVTdXBwcmVzc1VuY2F1Z2h0KHN0YXR1c1Byb21pc2UsIHRyYWlsZXJzUHJvbWlzZSk7XG4gICAgICAgIHRoaXMubGFzdElucHV0ID0geyBzaW5nbGU6IGlucHV0IH07XG4gICAgICAgIHJldHVybiBuZXcgU2VydmVyU3RyZWFtaW5nQ2FsbChtZXRob2QsIHJlcXVlc3RIZWFkZXJzLCBpbnB1dCwgaGVhZGVyc1Byb21pc2UsIG91dHB1dFN0cmVhbSwgc3RhdHVzUHJvbWlzZSwgdHJhaWxlcnNQcm9taXNlKTtcbiAgICB9XG4gICAgY2xpZW50U3RyZWFtaW5nKG1ldGhvZCwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzID0gKF9hID0gb3B0aW9ucy5tZXRhKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB7fSwgaGVhZGVyc1Byb21pc2UgPSB0aGlzLnByb21pc2VIZWFkZXJzKClcbiAgICAgICAgICAgIC50aGVuKGRlbGF5KHRoaXMuaGVhZGVyRGVsYXksIG9wdGlvbnMuYWJvcnQpKSwgcmVzcG9uc2VQcm9taXNlID0gaGVhZGVyc1Byb21pc2VcbiAgICAgICAgICAgIC5jYXRjaChfID0+IHtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGRlbGF5KHRoaXMucmVzcG9uc2VEZWxheSwgb3B0aW9ucy5hYm9ydCkpXG4gICAgICAgICAgICAudGhlbihfID0+IHRoaXMucHJvbWlzZVNpbmdsZVJlc3BvbnNlKG1ldGhvZCkpLCBzdGF0dXNQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlXG4gICAgICAgICAgICAuY2F0Y2goXyA9PiB7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihkZWxheSh0aGlzLmFmdGVyUmVzcG9uc2VEZWxheSwgb3B0aW9ucy5hYm9ydCkpXG4gICAgICAgICAgICAudGhlbihfID0+IHRoaXMucHJvbWlzZVN0YXR1cygpKSwgdHJhaWxlcnNQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlXG4gICAgICAgICAgICAuY2F0Y2goXyA9PiB7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihkZWxheSh0aGlzLmFmdGVyUmVzcG9uc2VEZWxheSwgb3B0aW9ucy5hYm9ydCkpXG4gICAgICAgICAgICAudGhlbihfID0+IHRoaXMucHJvbWlzZVRyYWlsZXJzKCkpO1xuICAgICAgICB0aGlzLm1heWJlU3VwcHJlc3NVbmNhdWdodChzdGF0dXNQcm9taXNlLCB0cmFpbGVyc1Byb21pc2UpO1xuICAgICAgICB0aGlzLmxhc3RJbnB1dCA9IG5ldyBUZXN0SW5wdXRTdHJlYW0odGhpcy5kYXRhLCBvcHRpb25zLmFib3J0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBDbGllbnRTdHJlYW1pbmdDYWxsKG1ldGhvZCwgcmVxdWVzdEhlYWRlcnMsIHRoaXMubGFzdElucHV0LCBoZWFkZXJzUHJvbWlzZSwgcmVzcG9uc2VQcm9taXNlLCBzdGF0dXNQcm9taXNlLCB0cmFpbGVyc1Byb21pc2UpO1xuICAgIH1cbiAgICBkdXBsZXgobWV0aG9kLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgcmVxdWVzdEhlYWRlcnMgPSAoX2EgPSBvcHRpb25zLm1ldGEpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHt9LCBoZWFkZXJzUHJvbWlzZSA9IHRoaXMucHJvbWlzZUhlYWRlcnMoKVxuICAgICAgICAgICAgLnRoZW4oZGVsYXkodGhpcy5oZWFkZXJEZWxheSwgb3B0aW9ucy5hYm9ydCkpLCBvdXRwdXRTdHJlYW0gPSBuZXcgUnBjT3V0cHV0U3RyZWFtQ29udHJvbGxlcigpLCByZXNwb25zZVN0cmVhbUNsb3NlZFByb21pc2UgPSBoZWFkZXJzUHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oZGVsYXkodGhpcy5yZXNwb25zZURlbGF5LCBvcHRpb25zLmFib3J0KSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnN0cmVhbVJlc3BvbnNlcyhtZXRob2QsIG91dHB1dFN0cmVhbSwgb3B0aW9ucy5hYm9ydCkpXG4gICAgICAgICAgICAudGhlbihkZWxheSh0aGlzLmFmdGVyUmVzcG9uc2VEZWxheSwgb3B0aW9ucy5hYm9ydCkpLCBzdGF0dXNQcm9taXNlID0gcmVzcG9uc2VTdHJlYW1DbG9zZWRQcm9taXNlXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnByb21pc2VTdGF0dXMoKSksIHRyYWlsZXJzUHJvbWlzZSA9IHJlc3BvbnNlU3RyZWFtQ2xvc2VkUHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5wcm9taXNlVHJhaWxlcnMoKSk7XG4gICAgICAgIHRoaXMubWF5YmVTdXBwcmVzc1VuY2F1Z2h0KHN0YXR1c1Byb21pc2UsIHRyYWlsZXJzUHJvbWlzZSk7XG4gICAgICAgIHRoaXMubGFzdElucHV0ID0gbmV3IFRlc3RJbnB1dFN0cmVhbSh0aGlzLmRhdGEsIG9wdGlvbnMuYWJvcnQpO1xuICAgICAgICByZXR1cm4gbmV3IER1cGxleFN0cmVhbWluZ0NhbGwobWV0aG9kLCByZXF1ZXN0SGVhZGVycywgdGhpcy5sYXN0SW5wdXQsIGhlYWRlcnNQcm9taXNlLCBvdXRwdXRTdHJlYW0sIHN0YXR1c1Byb21pc2UsIHRyYWlsZXJzUHJvbWlzZSk7XG4gICAgfVxufVxuVGVzdFRyYW5zcG9ydC5kZWZhdWx0SGVhZGVycyA9IHtcbiAgICByZXNwb25zZUhlYWRlcjogXCJ0ZXN0XCJcbn07XG5UZXN0VHJhbnNwb3J0LmRlZmF1bHRTdGF0dXMgPSB7XG4gICAgY29kZTogXCJPS1wiLCBkZXRhaWw6IFwiYWxsIGdvb2RcIlxufTtcblRlc3RUcmFuc3BvcnQuZGVmYXVsdFRyYWlsZXJzID0ge1xuICAgIHJlc3BvbnNlVHJhaWxlcjogXCJ0ZXN0XCJcbn07XG5mdW5jdGlvbiBkZWxheShtcywgYWJvcnQpIHtcbiAgICByZXR1cm4gKHYpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYgKGFib3J0ID09PSBudWxsIHx8IGFib3J0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhYm9ydC5hYm9ydGVkKSB7XG4gICAgICAgICAgICByZWplY3QobmV3IFJwY0Vycm9yKFwidXNlciBjYW5jZWxcIiwgXCJDQU5DRUxMRURcIikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUodiksIG1zKTtcbiAgICAgICAgICAgIGlmIChhYm9ydCkge1xuICAgICAgICAgICAgICAgIGFib3J0LmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBldiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChpZCk7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgUnBjRXJyb3IoXCJ1c2VyIGNhbmNlbFwiLCBcIkNBTkNFTExFRFwiKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmNsYXNzIFRlc3RJbnB1dFN0cmVhbSB7XG4gICAgY29uc3RydWN0b3IoZGF0YSwgYWJvcnQpIHtcbiAgICAgICAgdGhpcy5fY29tcGxldGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3NlbnQgPSBbXTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5hYm9ydCA9IGFib3J0O1xuICAgIH1cbiAgICBnZXQgc2VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbnQ7XG4gICAgfVxuICAgIGdldCBjb21wbGV0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21wbGV0ZWQ7XG4gICAgfVxuICAgIHNlbmQobWVzc2FnZSkge1xuICAgICAgICBpZiAodGhpcy5kYXRhLmlucHV0TWVzc2FnZSBpbnN0YW5jZW9mIFJwY0Vycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QodGhpcy5kYXRhLmlucHV0TWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVsYXlNcyA9IHRoaXMuZGF0YS5pbnB1dE1lc3NhZ2UgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyAxMFxuICAgICAgICAgICAgOiB0aGlzLmRhdGEuaW5wdXRNZXNzYWdlO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3NlbnQucHVzaChtZXNzYWdlKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGRlbGF5KGRlbGF5TXMsIHRoaXMuYWJvcnQpKTtcbiAgICB9XG4gICAgY29tcGxldGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGEuaW5wdXRDb21wbGV0ZSBpbnN0YW5jZW9mIFJwY0Vycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QodGhpcy5kYXRhLmlucHV0Q29tcGxldGUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlbGF5TXMgPSB0aGlzLmRhdGEuaW5wdXRDb21wbGV0ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IDEwXG4gICAgICAgICAgICA6IHRoaXMuZGF0YS5pbnB1dENvbXBsZXRlO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2NvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihkZWxheShkZWxheU1zLCB0aGlzLmFib3J0KSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgYXNzZXJ0TmV2ZXIgfSBmcm9tIFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIjtcbi8qKlxuICogQ3JlYXRlcyBhIFwic3RhY2tcIiBvZiBvZiBhbGwgaW50ZXJjZXB0b3JzIHNwZWNpZmllZCBpbiB0aGUgZ2l2ZW4gYFJwY09wdGlvbnNgLlxuICogVXNlZCBieSBnZW5lcmF0ZWQgY2xpZW50IGltcGxlbWVudGF0aW9ucy5cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhY2tJbnRlcmNlcHQoa2luZCwgdHJhbnNwb3J0LCBtZXRob2QsIG9wdGlvbnMsIGlucHV0KSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIGlmIChraW5kID09IFwidW5hcnlcIikge1xuICAgICAgICBsZXQgdGFpbCA9IChtdGQsIGlucCwgb3B0KSA9PiB0cmFuc3BvcnQudW5hcnkobXRkLCBpbnAsIG9wdCk7XG4gICAgICAgIGZvciAoY29uc3QgY3VyciBvZiAoKF9hID0gb3B0aW9ucy5pbnRlcmNlcHRvcnMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdKS5maWx0ZXIoaSA9PiBpLmludGVyY2VwdFVuYXJ5KS5yZXZlcnNlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSB0YWlsO1xuICAgICAgICAgICAgdGFpbCA9IChtdGQsIGlucCwgb3B0KSA9PiBjdXJyLmludGVyY2VwdFVuYXJ5KG5leHQsIG10ZCwgaW5wLCBvcHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YWlsKG1ldGhvZCwgaW5wdXQsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoa2luZCA9PSBcInNlcnZlclN0cmVhbWluZ1wiKSB7XG4gICAgICAgIGxldCB0YWlsID0gKG10ZCwgaW5wLCBvcHQpID0+IHRyYW5zcG9ydC5zZXJ2ZXJTdHJlYW1pbmcobXRkLCBpbnAsIG9wdCk7XG4gICAgICAgIGZvciAoY29uc3QgY3VyciBvZiAoKF9iID0gb3B0aW9ucy5pbnRlcmNlcHRvcnMpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFtdKS5maWx0ZXIoaSA9PiBpLmludGVyY2VwdFNlcnZlclN0cmVhbWluZykucmV2ZXJzZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gdGFpbDtcbiAgICAgICAgICAgIHRhaWwgPSAobXRkLCBpbnAsIG9wdCkgPT4gY3Vyci5pbnRlcmNlcHRTZXJ2ZXJTdHJlYW1pbmcobmV4dCwgbXRkLCBpbnAsIG9wdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhaWwobWV0aG9kLCBpbnB1dCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmIChraW5kID09IFwiY2xpZW50U3RyZWFtaW5nXCIpIHtcbiAgICAgICAgbGV0IHRhaWwgPSAobXRkLCBvcHQpID0+IHRyYW5zcG9ydC5jbGllbnRTdHJlYW1pbmcobXRkLCBvcHQpO1xuICAgICAgICBmb3IgKGNvbnN0IGN1cnIgb2YgKChfYyA9IG9wdGlvbnMuaW50ZXJjZXB0b3JzKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBbXSkuZmlsdGVyKGkgPT4gaS5pbnRlcmNlcHRDbGllbnRTdHJlYW1pbmcpLnJldmVyc2UoKSkge1xuICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRhaWw7XG4gICAgICAgICAgICB0YWlsID0gKG10ZCwgb3B0KSA9PiBjdXJyLmludGVyY2VwdENsaWVudFN0cmVhbWluZyhuZXh0LCBtdGQsIG9wdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhaWwobWV0aG9kLCBvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKGtpbmQgPT0gXCJkdXBsZXhcIikge1xuICAgICAgICBsZXQgdGFpbCA9IChtdGQsIG9wdCkgPT4gdHJhbnNwb3J0LmR1cGxleChtdGQsIG9wdCk7XG4gICAgICAgIGZvciAoY29uc3QgY3VyciBvZiAoKF9kID0gb3B0aW9ucy5pbnRlcmNlcHRvcnMpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IFtdKS5maWx0ZXIoaSA9PiBpLmludGVyY2VwdER1cGxleCkucmV2ZXJzZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gdGFpbDtcbiAgICAgICAgICAgIHRhaWwgPSAobXRkLCBvcHQpID0+IGN1cnIuaW50ZXJjZXB0RHVwbGV4KG5leHQsIG10ZCwgb3B0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFpbChtZXRob2QsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBhc3NlcnROZXZlcihraW5kKTtcbn1cbi8qKlxuICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkgYHN0YWNrSW50ZXJjZXB0KClgLCBzdGlsbCBoZXJlIHRvIHN1cHBvcnQgb2xkZXIgZ2VuZXJhdGVkIGNvZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YWNrVW5hcnlJbnRlcmNlcHRvcnModHJhbnNwb3J0LCBtZXRob2QsIGlucHV0LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHN0YWNrSW50ZXJjZXB0KFwidW5hcnlcIiwgdHJhbnNwb3J0LCBtZXRob2QsIG9wdGlvbnMsIGlucHV0KTtcbn1cbi8qKlxuICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkgYHN0YWNrSW50ZXJjZXB0KClgLCBzdGlsbCBoZXJlIHRvIHN1cHBvcnQgb2xkZXIgZ2VuZXJhdGVkIGNvZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YWNrU2VydmVyU3RyZWFtaW5nSW50ZXJjZXB0b3JzKHRyYW5zcG9ydCwgbWV0aG9kLCBpbnB1dCwgb3B0aW9ucykge1xuICAgIHJldHVybiBzdGFja0ludGVyY2VwdChcInNlcnZlclN0cmVhbWluZ1wiLCB0cmFuc3BvcnQsIG1ldGhvZCwgb3B0aW9ucywgaW5wdXQpO1xufVxuLyoqXG4gKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSBgc3RhY2tJbnRlcmNlcHQoKWAsIHN0aWxsIGhlcmUgdG8gc3VwcG9ydCBvbGRlciBnZW5lcmF0ZWQgY29kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhY2tDbGllbnRTdHJlYW1pbmdJbnRlcmNlcHRvcnModHJhbnNwb3J0LCBtZXRob2QsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gc3RhY2tJbnRlcmNlcHQoXCJjbGllbnRTdHJlYW1pbmdcIiwgdHJhbnNwb3J0LCBtZXRob2QsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSBgc3RhY2tJbnRlcmNlcHQoKWAsIHN0aWxsIGhlcmUgdG8gc3VwcG9ydCBvbGRlciBnZW5lcmF0ZWQgY29kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhY2tEdXBsZXhTdHJlYW1pbmdJbnRlcmNlcHRvcnModHJhbnNwb3J0LCBtZXRob2QsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gc3RhY2tJbnRlcmNlcHQoXCJkdXBsZXhcIiwgdHJhbnNwb3J0LCBtZXRob2QsIG9wdGlvbnMpO1xufVxuIiwiZXhwb3J0IGNsYXNzIFNlcnZlckNhbGxDb250ZXh0Q29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kLCBoZWFkZXJzLCBkZWFkbGluZSwgc2VuZFJlc3BvbnNlSGVhZGVyc0ZuLCBkZWZhdWx0U3RhdHVzID0geyBjb2RlOiAnT0snLCBkZXRhaWw6ICcnIH0pIHtcbiAgICAgICAgdGhpcy5fY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IFtdO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgICAgdGhpcy5kZWFkbGluZSA9IGRlYWRsaW5lO1xuICAgICAgICB0aGlzLnRyYWlsZXJzID0ge307XG4gICAgICAgIHRoaXMuX3NlbmRSSCA9IHNlbmRSZXNwb25zZUhlYWRlcnNGbjtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBkZWZhdWx0U3RhdHVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGNhbGwgY2FuY2VsbGVkLlxuICAgICAqXG4gICAgICogSW52b2tlcyBhbGwgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgd2l0aCBvbkNhbmNlbCgpIGFuZFxuICAgICAqIHNldHMgYGNhbmNlbGxlZCA9IHRydWVgLlxuICAgICAqL1xuICAgIG5vdGlmeUNhbmNlbGxlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKGxldCBsIG9mIHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHJlc3BvbnNlIGhlYWRlcnMuXG4gICAgICovXG4gICAgc2VuZFJlc3BvbnNlSGVhZGVycyhkYXRhKSB7XG4gICAgICAgIHRoaXMuX3NlbmRSSChkYXRhKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXMgdGhlIGNhbGwgY2FuY2VsbGVkP1xuICAgICAqXG4gICAgICogV2hlbiB0aGUgY2xpZW50IGNsb3NlcyB0aGUgY29ubmVjdGlvbiBiZWZvcmUgdGhlIHNlcnZlclxuICAgICAqIGlzIGRvbmUsIHRoZSBjYWxsIGlzIGNhbmNlbGxlZC5cbiAgICAgKlxuICAgICAqIElmIHlvdSB3YW50IHRvIGNhbmNlbCBhIHJlcXVlc3Qgb24gdGhlIHNlcnZlciwgdGhyb3cgYVxuICAgICAqIFJwY0Vycm9yIHdpdGggdGhlIENBTkNFTExFRCBzdGF0dXMgY29kZS5cbiAgICAgKi9cbiAgICBnZXQgY2FuY2VsbGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FuY2VsbGVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSBjYWxsYmFjayBmb3IgY2FuY2VsbGF0aW9uLlxuICAgICAqL1xuICAgIG9uQ2FuY2VsKGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGwgPSB0aGlzLl9saXN0ZW5lcnM7XG4gICAgICAgIGwucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IGwuaW5kZXhPZihjYWxsYmFjayk7XG4gICAgICAgICAgICBpZiAoaSA+PSAwKVxuICAgICAgICAgICAgICAgIGwuc3BsaWNlKGksIDEpO1xuICAgICAgICB9O1xuICAgIH1cbn1cbiIsIi8vIFB1YmxpYyBBUEkgb2YgdGhlIHJwYyBydW50aW1lLlxuLy8gTm90ZTogd2UgZG8gbm90IHVzZSBgZXhwb3J0ICogZnJvbSAuLi5gIHRvIGhlbHAgdHJlZSBzaGFrZXJzLFxuLy8gd2VicGFjayB2ZXJib3NlIG91dHB1dCBoaW50cyB0aGF0IHRoaXMgc2hvdWxkIGJlIHVzZWZ1bFxuZXhwb3J0IHsgU2VydmljZVR5cGUgfSBmcm9tICcuL3NlcnZpY2UtdHlwZSc7XG5leHBvcnQgeyByZWFkTWV0aG9kT3B0aW9ucywgcmVhZE1ldGhvZE9wdGlvbiwgcmVhZFNlcnZpY2VPcHRpb24gfSBmcm9tICcuL3JlZmxlY3Rpb24taW5mbyc7XG5leHBvcnQgeyBScGNFcnJvciB9IGZyb20gJy4vcnBjLWVycm9yJztcbmV4cG9ydCB7IG1lcmdlUnBjT3B0aW9ucyB9IGZyb20gJy4vcnBjLW9wdGlvbnMnO1xuZXhwb3J0IHsgUnBjT3V0cHV0U3RyZWFtQ29udHJvbGxlciB9IGZyb20gJy4vcnBjLW91dHB1dC1zdHJlYW0nO1xuZXhwb3J0IHsgVGVzdFRyYW5zcG9ydCB9IGZyb20gJy4vdGVzdC10cmFuc3BvcnQnO1xuZXhwb3J0IHsgRGVmZXJyZWQsIERlZmVycmVkU3RhdGUgfSBmcm9tICcuL2RlZmVycmVkJztcbmV4cG9ydCB7IER1cGxleFN0cmVhbWluZ0NhbGwgfSBmcm9tICcuL2R1cGxleC1zdHJlYW1pbmctY2FsbCc7XG5leHBvcnQgeyBDbGllbnRTdHJlYW1pbmdDYWxsIH0gZnJvbSAnLi9jbGllbnQtc3RyZWFtaW5nLWNhbGwnO1xuZXhwb3J0IHsgU2VydmVyU3RyZWFtaW5nQ2FsbCB9IGZyb20gJy4vc2VydmVyLXN0cmVhbWluZy1jYWxsJztcbmV4cG9ydCB7IFVuYXJ5Q2FsbCB9IGZyb20gJy4vdW5hcnktY2FsbCc7XG5leHBvcnQgeyBzdGFja0ludGVyY2VwdCwgc3RhY2tEdXBsZXhTdHJlYW1pbmdJbnRlcmNlcHRvcnMsIHN0YWNrQ2xpZW50U3RyZWFtaW5nSW50ZXJjZXB0b3JzLCBzdGFja1NlcnZlclN0cmVhbWluZ0ludGVyY2VwdG9ycywgc3RhY2tVbmFyeUludGVyY2VwdG9ycyB9IGZyb20gJy4vcnBjLWludGVyY2VwdG9yJztcbmV4cG9ydCB7IFNlcnZlckNhbGxDb250ZXh0Q29udHJvbGxlciB9IGZyb20gJy4vc2VydmVyLWNhbGwtY29udGV4dCc7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///906\n')},9920:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ E_: () => (/* binding */ assertFloat32),\n/* harmony export */ fp: () => (/* binding */ assertUInt32),\n/* harmony export */ hu: () => (/* binding */ assert),\n/* harmony export */ ug: () => (/* binding */ assertInt32),\n/* harmony export */ vE: () => (/* binding */ assertNever)\n/* harmony export */ });\n/**\n * assert that condition is true or throw error (with message)\n */\nfunction assert(condition, msg) {\n if (!condition) {\n throw new Error(msg);\n }\n}\n/**\n * assert that value cannot exist = type `never`. throw runtime error if it does.\n */\nfunction assertNever(value, msg) {\n throw new Error(msg !== null && msg !== void 0 ? msg : 'Unexpected object: ' + value);\n}\nconst FLOAT32_MAX = 3.4028234663852886e+38, FLOAT32_MIN = -3.4028234663852886e+38, UINT32_MAX = 0xFFFFFFFF, INT32_MAX = 0X7FFFFFFF, INT32_MIN = -0X80000000;\nfunction assertInt32(arg) {\n if (typeof arg !== \"number\")\n throw new Error('invalid int 32: ' + typeof arg);\n if (!Number.isInteger(arg) || arg > INT32_MAX || arg < INT32_MIN)\n throw new Error('invalid int 32: ' + arg);\n}\nfunction assertUInt32(arg) {\n if (typeof arg !== \"number\")\n throw new Error('invalid uint 32: ' + typeof arg);\n if (!Number.isInteger(arg) || arg > UINT32_MAX || arg < 0)\n throw new Error('invalid uint 32: ' + arg);\n}\nfunction assertFloat32(arg) {\n if (typeof arg !== \"number\")\n throw new Error('invalid float 32: ' + typeof arg);\n if (!Number.isFinite(arg))\n return;\n if (arg > FLOAT32_MAX || arg < FLOAT32_MIN)\n throw new Error('invalid float 32: ' + arg);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTkyMC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9hc3NlcnQuanM/MDNmYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGFzc2VydCB0aGF0IGNvbmRpdGlvbiBpcyB0cnVlIG9yIHRocm93IGVycm9yICh3aXRoIG1lc3NhZ2UpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLCBtc2cpIHtcbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICB9XG59XG4vKipcbiAqIGFzc2VydCB0aGF0IHZhbHVlIGNhbm5vdCBleGlzdCA9IHR5cGUgYG5ldmVyYC4gdGhyb3cgcnVudGltZSBlcnJvciBpZiBpdCBkb2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TmV2ZXIodmFsdWUsIG1zZykge1xuICAgIHRocm93IG5ldyBFcnJvcihtc2cgIT09IG51bGwgJiYgbXNnICE9PSB2b2lkIDAgPyBtc2cgOiAnVW5leHBlY3RlZCBvYmplY3Q6ICcgKyB2YWx1ZSk7XG59XG5jb25zdCBGTE9BVDMyX01BWCA9IDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIEZMT0FUMzJfTUlOID0gLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIFVJTlQzMl9NQVggPSAweEZGRkZGRkZGLCBJTlQzMl9NQVggPSAwWDdGRkZGRkZGLCBJTlQzMl9NSU4gPSAtMFg4MDAwMDAwMDtcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJbnQzMihhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gXCJudW1iZXJcIilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGludCAzMjogJyArIHR5cGVvZiBhcmcpO1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihhcmcpIHx8IGFyZyA+IElOVDMyX01BWCB8fCBhcmcgPCBJTlQzMl9NSU4pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbnQgMzI6ICcgKyBhcmcpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFVJbnQzMihhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gXCJudW1iZXJcIilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHVpbnQgMzI6ICcgKyB0eXBlb2YgYXJnKTtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYXJnKSB8fCBhcmcgPiBVSU5UMzJfTUFYIHx8IGFyZyA8IDApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB1aW50IDMyOiAnICsgYXJnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRGbG9hdDMyKGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSBcIm51bWJlclwiKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmxvYXQgMzI6ICcgKyB0eXBlb2YgYXJnKTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShhcmcpKVxuICAgICAgICByZXR1cm47XG4gICAgaWYgKGFyZyA+IEZMT0FUMzJfTUFYIHx8IGFyZyA8IEZMT0FUMzJfTUlOKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmxvYXQgMzI6ICcgKyBhcmcpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9920\n")},299:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TA: () => (/* binding */ mergeBinaryOptions),\n/* harmony export */ TD: () => (/* binding */ WireType),\n/* harmony export */ z: () => (/* binding */ UnknownFieldHandler)\n/* harmony export */ });\n/**\n * This handler implements the default behaviour for unknown fields.\n * When reading data, unknown fields are stored on the message, in a\n * symbol property.\n * When writing data, the symbol property is queried and unknown fields\n * are serialized into the output again.\n */\nvar UnknownFieldHandler;\n(function (UnknownFieldHandler) {\n /**\n * The symbol used to store unknown fields for a message.\n * The property must conform to `UnknownFieldContainer`.\n */\n UnknownFieldHandler.symbol = Symbol.for("protobuf-ts/unknown");\n /**\n * Store an unknown field during binary read directly on the message.\n * This method is compatible with `BinaryReadOptions.readUnknownField`.\n */\n UnknownFieldHandler.onRead = (typeName, message, fieldNo, wireType, data) => {\n let container = is(message) ? message[UnknownFieldHandler.symbol] : message[UnknownFieldHandler.symbol] = [];\n container.push({ no: fieldNo, wireType, data });\n };\n /**\n * Write unknown fields stored for the message to the writer.\n * This method is compatible with `BinaryWriteOptions.writeUnknownFields`.\n */\n UnknownFieldHandler.onWrite = (typeName, message, writer) => {\n for (let { no, wireType, data } of UnknownFieldHandler.list(message))\n writer.tag(no, wireType).raw(data);\n };\n /**\n * List unknown fields stored for the message.\n * Note that there may be multiples fields with the same number.\n */\n UnknownFieldHandler.list = (message, fieldNo) => {\n if (is(message)) {\n let all = message[UnknownFieldHandler.symbol];\n return fieldNo ? all.filter(uf => uf.no == fieldNo) : all;\n }\n return [];\n };\n /**\n * Returns the last unknown field by field number.\n */\n UnknownFieldHandler.last = (message, fieldNo) => UnknownFieldHandler.list(message, fieldNo).slice(-1)[0];\n const is = (message) => message && Array.isArray(message[UnknownFieldHandler.symbol]);\n})(UnknownFieldHandler || (UnknownFieldHandler = {}));\n/**\n * Merges binary write or read options. Later values override earlier values.\n */\nfunction mergeBinaryOptions(a, b) {\n return Object.assign(Object.assign({}, a), b);\n}\n/**\n * Protobuf binary format wire types.\n *\n * A wire type provides just enough information to find the length of the\n * following value.\n *\n * See https://developers.google.com/protocol-buffers/docs/encoding#structure\n */\nvar WireType;\n(function (WireType) {\n /**\n * Used for int32, int64, uint32, uint64, sint32, sint64, bool, enum\n */\n WireType[WireType["Varint"] = 0] = "Varint";\n /**\n * Used for fixed64, sfixed64, double.\n * Always 8 bytes with little-endian byte order.\n */\n WireType[WireType["Bit64"] = 1] = "Bit64";\n /**\n * Used for string, bytes, embedded messages, packed repeated fields\n *\n * Only repeated numeric types (types which use the varint, 32-bit,\n * or 64-bit wire types) can be packed. In proto3, such fields are\n * packed by default.\n */\n WireType[WireType["LengthDelimited"] = 2] = "LengthDelimited";\n /**\n * Used for groups\n * @deprecated\n */\n WireType[WireType["StartGroup"] = 3] = "StartGroup";\n /**\n * Used for groups\n * @deprecated\n */\n WireType[WireType["EndGroup"] = 4] = "EndGroup";\n /**\n * Used for fixed32, sfixed32, float.\n * Always 4 bytes with little-endian byte order.\n */\n WireType[WireType["Bit32"] = 5] = "Bit32";\n})(WireType || (WireType = {}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjk5LmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qiw2QkFBNkI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHFCQUFxQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGtEQUFrRDtBQUNuRDtBQUNBO0FBQ0E7QUFDTztBQUNQLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsNEJBQTRCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L2JpbmFyeS1mb3JtYXQtY29udHJhY3QuanM/ZGIxYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoaXMgaGFuZGxlciBpbXBsZW1lbnRzIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdW5rbm93biBmaWVsZHMuXG4gKiBXaGVuIHJlYWRpbmcgZGF0YSwgdW5rbm93biBmaWVsZHMgYXJlIHN0b3JlZCBvbiB0aGUgbWVzc2FnZSwgaW4gYVxuICogc3ltYm9sIHByb3BlcnR5LlxuICogV2hlbiB3cml0aW5nIGRhdGEsIHRoZSBzeW1ib2wgcHJvcGVydHkgaXMgcXVlcmllZCBhbmQgdW5rbm93biBmaWVsZHNcbiAqIGFyZSBzZXJpYWxpemVkIGludG8gdGhlIG91dHB1dCBhZ2Fpbi5cbiAqL1xuZXhwb3J0IHZhciBVbmtub3duRmllbGRIYW5kbGVyO1xuKGZ1bmN0aW9uIChVbmtub3duRmllbGRIYW5kbGVyKSB7XG4gICAgLyoqXG4gICAgICogVGhlIHN5bWJvbCB1c2VkIHRvIHN0b3JlIHVua25vd24gZmllbGRzIGZvciBhIG1lc3NhZ2UuXG4gICAgICogVGhlIHByb3BlcnR5IG11c3QgY29uZm9ybSB0byBgVW5rbm93bkZpZWxkQ29udGFpbmVyYC5cbiAgICAgKi9cbiAgICBVbmtub3duRmllbGRIYW5kbGVyLnN5bWJvbCA9IFN5bWJvbC5mb3IoXCJwcm90b2J1Zi10cy91bmtub3duXCIpO1xuICAgIC8qKlxuICAgICAqIFN0b3JlIGFuIHVua25vd24gZmllbGQgZHVyaW5nIGJpbmFyeSByZWFkIGRpcmVjdGx5IG9uIHRoZSBtZXNzYWdlLlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNvbXBhdGlibGUgd2l0aCBgQmluYXJ5UmVhZE9wdGlvbnMucmVhZFVua25vd25GaWVsZGAuXG4gICAgICovXG4gICAgVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgPSAodHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkYXRhKSA9PiB7XG4gICAgICAgIGxldCBjb250YWluZXIgPSBpcyhtZXNzYWdlKSA/IG1lc3NhZ2VbVW5rbm93bkZpZWxkSGFuZGxlci5zeW1ib2xdIDogbWVzc2FnZVtVbmtub3duRmllbGRIYW5kbGVyLnN5bWJvbF0gPSBbXTtcbiAgICAgICAgY29udGFpbmVyLnB1c2goeyBubzogZmllbGRObywgd2lyZVR5cGUsIGRhdGEgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBXcml0ZSB1bmtub3duIGZpZWxkcyBzdG9yZWQgZm9yIHRoZSBtZXNzYWdlIHRvIHRoZSB3cml0ZXIuXG4gICAgICogVGhpcyBtZXRob2QgaXMgY29tcGF0aWJsZSB3aXRoIGBCaW5hcnlXcml0ZU9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzYC5cbiAgICAgKi9cbiAgICBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgPSAodHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcikgPT4ge1xuICAgICAgICBmb3IgKGxldCB7IG5vLCB3aXJlVHlwZSwgZGF0YSB9IG9mIFVua25vd25GaWVsZEhhbmRsZXIubGlzdChtZXNzYWdlKSlcbiAgICAgICAgICAgIHdyaXRlci50YWcobm8sIHdpcmVUeXBlKS5yYXcoZGF0YSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMaXN0IHVua25vd24gZmllbGRzIHN0b3JlZCBmb3IgdGhlIG1lc3NhZ2UuXG4gICAgICogTm90ZSB0aGF0IHRoZXJlIG1heSBiZSBtdWx0aXBsZXMgZmllbGRzIHdpdGggdGhlIHNhbWUgbnVtYmVyLlxuICAgICAqL1xuICAgIFVua25vd25GaWVsZEhhbmRsZXIubGlzdCA9IChtZXNzYWdlLCBmaWVsZE5vKSA9PiB7XG4gICAgICAgIGlmIChpcyhtZXNzYWdlKSkge1xuICAgICAgICAgICAgbGV0IGFsbCA9IG1lc3NhZ2VbVW5rbm93bkZpZWxkSGFuZGxlci5zeW1ib2xdO1xuICAgICAgICAgICAgcmV0dXJuIGZpZWxkTm8gPyBhbGwuZmlsdGVyKHVmID0+IHVmLm5vID09IGZpZWxkTm8pIDogYWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxhc3QgdW5rbm93biBmaWVsZCBieSBmaWVsZCBudW1iZXIuXG4gICAgICovXG4gICAgVW5rbm93bkZpZWxkSGFuZGxlci5sYXN0ID0gKG1lc3NhZ2UsIGZpZWxkTm8pID0+IFVua25vd25GaWVsZEhhbmRsZXIubGlzdChtZXNzYWdlLCBmaWVsZE5vKS5zbGljZSgtMSlbMF07XG4gICAgY29uc3QgaXMgPSAobWVzc2FnZSkgPT4gbWVzc2FnZSAmJiBBcnJheS5pc0FycmF5KG1lc3NhZ2VbVW5rbm93bkZpZWxkSGFuZGxlci5zeW1ib2xdKTtcbn0pKFVua25vd25GaWVsZEhhbmRsZXIgfHwgKFVua25vd25GaWVsZEhhbmRsZXIgPSB7fSkpO1xuLyoqXG4gKiBNZXJnZXMgYmluYXJ5IHdyaXRlIG9yIHJlYWQgb3B0aW9ucy4gTGF0ZXIgdmFsdWVzIG92ZXJyaWRlIGVhcmxpZXIgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VCaW5hcnlPcHRpb25zKGEsIGIpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhKSwgYik7XG59XG4vKipcbiAqIFByb3RvYnVmIGJpbmFyeSBmb3JtYXQgd2lyZSB0eXBlcy5cbiAqXG4gKiBBIHdpcmUgdHlwZSBwcm92aWRlcyBqdXN0IGVub3VnaCBpbmZvcm1hdGlvbiB0byBmaW5kIHRoZSBsZW5ndGggb2YgdGhlXG4gKiBmb2xsb3dpbmcgdmFsdWUuXG4gKlxuICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9lbmNvZGluZyNzdHJ1Y3R1cmVcbiAqL1xuZXhwb3J0IHZhciBXaXJlVHlwZTtcbihmdW5jdGlvbiAoV2lyZVR5cGUpIHtcbiAgICAvKipcbiAgICAgKiBVc2VkIGZvciBpbnQzMiwgaW50NjQsIHVpbnQzMiwgdWludDY0LCBzaW50MzIsIHNpbnQ2NCwgYm9vbCwgZW51bVxuICAgICAqL1xuICAgIFdpcmVUeXBlW1dpcmVUeXBlW1wiVmFyaW50XCJdID0gMF0gPSBcIlZhcmludFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGZpeGVkNjQsIHNmaXhlZDY0LCBkb3VibGUuXG4gICAgICogQWx3YXlzIDggYnl0ZXMgd2l0aCBsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIuXG4gICAgICovXG4gICAgV2lyZVR5cGVbV2lyZVR5cGVbXCJCaXQ2NFwiXSA9IDFdID0gXCJCaXQ2NFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIHN0cmluZywgYnl0ZXMsIGVtYmVkZGVkIG1lc3NhZ2VzLCBwYWNrZWQgcmVwZWF0ZWQgZmllbGRzXG4gICAgICpcbiAgICAgKiBPbmx5IHJlcGVhdGVkIG51bWVyaWMgdHlwZXMgKHR5cGVzIHdoaWNoIHVzZSB0aGUgdmFyaW50LCAzMi1iaXQsXG4gICAgICogb3IgNjQtYml0IHdpcmUgdHlwZXMpIGNhbiBiZSBwYWNrZWQuIEluIHByb3RvMywgc3VjaCBmaWVsZHMgYXJlXG4gICAgICogcGFja2VkIGJ5IGRlZmF1bHQuXG4gICAgICovXG4gICAgV2lyZVR5cGVbV2lyZVR5cGVbXCJMZW5ndGhEZWxpbWl0ZWRcIl0gPSAyXSA9IFwiTGVuZ3RoRGVsaW1pdGVkXCI7XG4gICAgLyoqXG4gICAgICogVXNlZCBmb3IgZ3JvdXBzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBXaXJlVHlwZVtXaXJlVHlwZVtcIlN0YXJ0R3JvdXBcIl0gPSAzXSA9IFwiU3RhcnRHcm91cFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGdyb3Vwc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgV2lyZVR5cGVbV2lyZVR5cGVbXCJFbmRHcm91cFwiXSA9IDRdID0gXCJFbmRHcm91cFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGZpeGVkMzIsIHNmaXhlZDMyLCBmbG9hdC5cbiAgICAgKiBBbHdheXMgNCBieXRlcyB3aXRoIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlci5cbiAgICAgKi9cbiAgICBXaXJlVHlwZVtXaXJlVHlwZVtcIkJpdDMyXCJdID0gNV0gPSBcIkJpdDMyXCI7XG59KShXaXJlVHlwZSB8fCAoV2lyZVR5cGUgPSB7fSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///299\n')},9102:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n BinaryReader: () => (/* reexport */ BinaryReader),\n BinaryWriter: () => (/* reexport */ BinaryWriter),\n LongType: () => (/* reexport */ LongType),\n MESSAGE_TYPE: () => (/* reexport */ MESSAGE_TYPE),\n MessageType: () => (/* reexport */ MessageType),\n PbLong: () => (/* reexport */ PbLong),\n PbULong: () => (/* reexport */ PbULong),\n ReflectionBinaryReader: () => (/* reexport */ ReflectionBinaryReader),\n ReflectionBinaryWriter: () => (/* reexport */ ReflectionBinaryWriter),\n ReflectionJsonReader: () => (/* reexport */ ReflectionJsonReader),\n ReflectionJsonWriter: () => (/* reexport */ ReflectionJsonWriter),\n ReflectionTypeCheck: () => (/* reexport */ ReflectionTypeCheck),\n RepeatType: () => (/* reexport */ RepeatType),\n ScalarType: () => (/* reexport */ ScalarType),\n UnknownFieldHandler: () => (/* reexport */ binary_format_contract/* UnknownFieldHandler */.z),\n WireType: () => (/* reexport */ binary_format_contract/* WireType */.TD),\n assert: () => (/* reexport */ assert/* assert */.hu),\n assertFloat32: () => (/* reexport */ assert/* assertFloat32 */.E_),\n assertInt32: () => (/* reexport */ assert/* assertInt32 */.ug),\n assertNever: () => (/* reexport */ assert/* assertNever */.vE),\n assertUInt32: () => (/* reexport */ assert/* assertUInt32 */.fp),\n base64decode: () => (/* reexport */ base64decode),\n base64encode: () => (/* reexport */ base64encode),\n binaryReadOptions: () => (/* reexport */ binaryReadOptions),\n binaryWriteOptions: () => (/* reexport */ binaryWriteOptions),\n clearOneofValue: () => (/* reexport */ clearOneofValue),\n containsMessageType: () => (/* reexport */ containsMessageType),\n getOneofValue: () => (/* reexport */ getOneofValue),\n getSelectedOneofValue: () => (/* reexport */ getSelectedOneofValue),\n isEnumObject: () => (/* reexport */ isEnumObject),\n isJsonObject: () => (/* reexport */ isJsonObject),\n isOneofGroup: () => (/* reexport */ isOneofGroup),\n jsonReadOptions: () => (/* reexport */ json_format_contract/* jsonReadOptions */.jl),\n jsonWriteOptions: () => (/* reexport */ json_format_contract/* jsonWriteOptions */.P2),\n listEnumNames: () => (/* reexport */ listEnumNames),\n listEnumNumbers: () => (/* reexport */ listEnumNumbers),\n listEnumValues: () => (/* reexport */ listEnumValues),\n lowerCamelCase: () => (/* reexport */ lower_camel_case/* lowerCamelCase */.c),\n mergeBinaryOptions: () => (/* reexport */ binary_format_contract/* mergeBinaryOptions */.TA),\n mergeJsonOptions: () => (/* reexport */ json_format_contract/* mergeJsonOptions */.N3),\n normalizeFieldInfo: () => (/* reexport */ normalizeFieldInfo),\n readFieldOption: () => (/* reexport */ readFieldOption),\n readFieldOptions: () => (/* reexport */ readFieldOptions),\n readMessageOption: () => (/* reexport */ readMessageOption),\n reflectionCreate: () => (/* reexport */ reflectionCreate),\n reflectionEquals: () => (/* reexport */ reflectionEquals),\n reflectionMergePartial: () => (/* reexport */ reflectionMergePartial),\n reflectionScalarDefault: () => (/* reexport */ reflectionScalarDefault),\n setOneofValue: () => (/* reexport */ setOneofValue),\n typeofJsonValue: () => (/* reexport */ typeofJsonValue),\n utf8read: () => (/* reexport */ utf8read)\n});\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/json-typings.js\n/**\n * Get the type of a JSON value.\n * Distinguishes between array, null and object.\n */\nfunction typeofJsonValue(value) {\n let t = typeof value;\n if (t == "object") {\n if (Array.isArray(value))\n return "array";\n if (value === null)\n return "null";\n }\n return t;\n}\n/**\n * Is this a JSON object (instead of an array or null)?\n */\nfunction isJsonObject(value) {\n return value !== null && typeof value == "object" && !Array.isArray(value);\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/base64.js\n// lookup table from base64 character to byte\nlet encTable = \'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\'.split(\'\');\n// lookup table from base64 character *code* to byte because lookup by number is fast\nlet decTable = [];\nfor (let i = 0; i < encTable.length; i++)\n decTable[encTable[i].charCodeAt(0)] = i;\n// support base64url variants\ndecTable["-".charCodeAt(0)] = encTable.indexOf("+");\ndecTable["_".charCodeAt(0)] = encTable.indexOf("/");\n/**\n * Decodes a base64 string to a byte array.\n *\n * - ignores white-space, including line breaks and tabs\n * - allows inner padding (can decode concatenated base64 strings)\n * - does not require padding\n * - understands base64url encoding:\n * "-" instead of "+",\n * "_" instead of "/",\n * no padding\n */\nfunction base64decode(base64Str) {\n // estimate byte size, not accounting for inner padding and whitespace\n let es = base64Str.length * 3 / 4;\n // if (es % 3 !== 0)\n // throw new Error(\'invalid base64 string\');\n if (base64Str[base64Str.length - 2] == \'=\')\n es -= 2;\n else if (base64Str[base64Str.length - 1] == \'=\')\n es -= 1;\n let bytes = new Uint8Array(es), bytePos = 0, // position in byte array\n groupPos = 0, // position in base64 group\n b, // current byte\n p = 0 // previous byte\n ;\n for (let i = 0; i < base64Str.length; i++) {\n b = decTable[base64Str.charCodeAt(i)];\n if (b === undefined) {\n // noinspection FallThroughInSwitchStatementJS\n switch (base64Str[i]) {\n case \'=\':\n groupPos = 0; // reset state when padding found\n case \'\\n\':\n case \'\\r\':\n case \'\\t\':\n case \' \':\n continue; // skip white-space, and padding\n default:\n throw Error(`invalid base64 string.`);\n }\n }\n switch (groupPos) {\n case 0:\n p = b;\n groupPos = 1;\n break;\n case 1:\n bytes[bytePos++] = p << 2 | (b & 48) >> 4;\n p = b;\n groupPos = 2;\n break;\n case 2:\n bytes[bytePos++] = (p & 15) << 4 | (b & 60) >> 2;\n p = b;\n groupPos = 3;\n break;\n case 3:\n bytes[bytePos++] = (p & 3) << 6 | b;\n groupPos = 0;\n break;\n }\n }\n if (groupPos == 1)\n throw Error(`invalid base64 string.`);\n return bytes.subarray(0, bytePos);\n}\n/**\n * Encodes a byte array to a base64 string.\n * Adds padding at the end.\n * Does not insert newlines.\n */\nfunction base64encode(bytes) {\n let base64 = \'\', groupPos = 0, // position in base64 group\n b, // current byte\n p = 0; // carry over from previous byte\n for (let i = 0; i < bytes.length; i++) {\n b = bytes[i];\n switch (groupPos) {\n case 0:\n base64 += encTable[b >> 2];\n p = (b & 3) << 4;\n groupPos = 1;\n break;\n case 1:\n base64 += encTable[p | b >> 4];\n p = (b & 15) << 2;\n groupPos = 2;\n break;\n case 2:\n base64 += encTable[p | b >> 6];\n base64 += encTable[b & 63];\n groupPos = 0;\n break;\n }\n }\n // padding required?\n if (groupPos) {\n base64 += encTable[p];\n base64 += \'=\';\n if (groupPos == 1)\n base64 += \'=\';\n }\n return base64;\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/protobufjs-utf8.js\n// Copyright (c) 2016, Daniel Wirtz All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n// * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above copyright\n// notice, this list of conditions and the following disclaimer in the\n// documentation and/or other materials provided with the distribution.\n// * Neither the name of its author, nor the names of its contributors\n// may be used to endorse or promote products derived from this software\n// without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\nconst fromCharCodes = (chunk) => String.fromCharCode.apply(String, chunk);\n/**\n * @deprecated This function will no longer be exported with the next major\n * release, since protobuf-ts has switch to TextDecoder API. If you need this\n * function, please migrate to @protobufjs/utf8. For context, see\n * https://github.com/timostamm/protobuf-ts/issues/184\n *\n * Reads UTF8 bytes as a string.\n *\n * See [protobufjs / utf8](https://github.com/protobufjs/protobuf.js/blob/9893e35b854621cce64af4bf6be2cff4fb892796/lib/utf8/index.js#L40)\n *\n * Copyright (c) 2016, Daniel Wirtz\n */\nfunction utf8read(bytes) {\n if (bytes.length < 1)\n return "";\n let pos = 0, // position in bytes\n parts = [], chunk = [], i = 0, // char offset\n t; // temporary\n let len = bytes.length;\n while (pos < len) {\n t = bytes[pos++];\n if (t < 128)\n chunk[i++] = t;\n else if (t > 191 && t < 224)\n chunk[i++] = (t & 31) << 6 | bytes[pos++] & 63;\n else if (t > 239 && t < 365) {\n t = ((t & 7) << 18 | (bytes[pos++] & 63) << 12 | (bytes[pos++] & 63) << 6 | bytes[pos++] & 63) - 0x10000;\n chunk[i++] = 0xD800 + (t >> 10);\n chunk[i++] = 0xDC00 + (t & 1023);\n }\n else\n chunk[i++] = (t & 15) << 12 | (bytes[pos++] & 63) << 6 | bytes[pos++] & 63;\n if (i > 8191) {\n parts.push(fromCharCodes(chunk));\n i = 0;\n }\n }\n if (parts.length) {\n if (i)\n parts.push(fromCharCodes(chunk.slice(0, i)));\n return parts.join("");\n }\n return fromCharCodes(chunk.slice(0, i));\n}\n\n// EXTERNAL MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/binary-format-contract.js\nvar binary_format_contract = __webpack_require__(299);\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/goog-varint.js\n// Copyright 2008 Google Inc. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n// * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n// * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Code generated by the Protocol Buffer compiler is owned by the owner\n// of the input file used when generating it. This code is not\n// standalone and requires a support library to be linked with it. This\n// support library is itself covered by the above license.\n/**\n * Read a 64 bit varint as two JS numbers.\n *\n * Returns tuple:\n * [0]: low bits\n * [0]: high bits\n *\n * Copyright 2008 Google Inc. All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/buffer_decoder.js#L175\n */\nfunction varint64read() {\n let lowBits = 0;\n let highBits = 0;\n for (let shift = 0; shift < 28; shift += 7) {\n let b = this.buf[this.pos++];\n lowBits |= (b & 0x7F) << shift;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return [lowBits, highBits];\n }\n }\n let middleByte = this.buf[this.pos++];\n // last four bits of the first 32 bit number\n lowBits |= (middleByte & 0x0F) << 28;\n // 3 upper bits are part of the next 32 bit number\n highBits = (middleByte & 0x70) >> 4;\n if ((middleByte & 0x80) == 0) {\n this.assertBounds();\n return [lowBits, highBits];\n }\n for (let shift = 3; shift <= 31; shift += 7) {\n let b = this.buf[this.pos++];\n highBits |= (b & 0x7F) << shift;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return [lowBits, highBits];\n }\n }\n throw new Error(\'invalid varint\');\n}\n/**\n * Write a 64 bit varint, given as two JS numbers, to the given bytes array.\n *\n * Copyright 2008 Google Inc. All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/writer.js#L344\n */\nfunction varint64write(lo, hi, bytes) {\n for (let i = 0; i < 28; i = i + 7) {\n const shift = lo >>> i;\n const hasNext = !((shift >>> 7) == 0 && hi == 0);\n const byte = (hasNext ? shift | 0x80 : shift) & 0xFF;\n bytes.push(byte);\n if (!hasNext) {\n return;\n }\n }\n const splitBits = ((lo >>> 28) & 0x0F) | ((hi & 0x07) << 4);\n const hasMoreBits = !((hi >> 3) == 0);\n bytes.push((hasMoreBits ? splitBits | 0x80 : splitBits) & 0xFF);\n if (!hasMoreBits) {\n return;\n }\n for (let i = 3; i < 31; i = i + 7) {\n const shift = hi >>> i;\n const hasNext = !((shift >>> 7) == 0);\n const byte = (hasNext ? shift | 0x80 : shift) & 0xFF;\n bytes.push(byte);\n if (!hasNext) {\n return;\n }\n }\n bytes.push((hi >>> 31) & 0x01);\n}\n// constants for binary math\nconst TWO_PWR_32_DBL = (1 << 16) * (1 << 16);\n/**\n * Parse decimal string of 64 bit integer value as two JS numbers.\n *\n * Returns tuple:\n * [0]: minus sign?\n * [1]: low bits\n * [2]: high bits\n *\n * Copyright 2008 Google Inc.\n */\nfunction int64fromString(dec) {\n // Check for minus sign.\n let minus = dec[0] == \'-\';\n if (minus)\n dec = dec.slice(1);\n // Work 6 decimal digits at a time, acting like we\'re converting base 1e6\n // digits to binary. This is safe to do with floating point math because\n // Number.isSafeInteger(ALL_32_BITS * 1e6) == true.\n const base = 1e6;\n let lowBits = 0;\n let highBits = 0;\n function add1e6digit(begin, end) {\n // Note: Number(\'\') is 0.\n const digit1e6 = Number(dec.slice(begin, end));\n highBits *= base;\n lowBits = lowBits * base + digit1e6;\n // Carry bits from lowBits to highBits\n if (lowBits >= TWO_PWR_32_DBL) {\n highBits = highBits + ((lowBits / TWO_PWR_32_DBL) | 0);\n lowBits = lowBits % TWO_PWR_32_DBL;\n }\n }\n add1e6digit(-24, -18);\n add1e6digit(-18, -12);\n add1e6digit(-12, -6);\n add1e6digit(-6);\n return [minus, lowBits, highBits];\n}\n/**\n * Format 64 bit integer value (as two JS numbers) to decimal string.\n *\n * Copyright 2008 Google Inc.\n */\nfunction int64toString(bitsLow, bitsHigh) {\n // Skip the expensive conversion if the number is small enough to use the\n // built-in conversions.\n if ((bitsHigh >>> 0) <= 0x1FFFFF) {\n return \'\' + (TWO_PWR_32_DBL * bitsHigh + (bitsLow >>> 0));\n }\n // What this code is doing is essentially converting the input number from\n // base-2 to base-1e7, which allows us to represent the 64-bit range with\n // only 3 (very large) digits. Those digits are then trivial to convert to\n // a base-10 string.\n // The magic numbers used here are -\n // 2^24 = 16777216 = (1,6777216) in base-1e7.\n // 2^48 = 281474976710656 = (2,8147497,6710656) in base-1e7.\n // Split 32:32 representation into 16:24:24 representation so our\n // intermediate digits don\'t overflow.\n let low = bitsLow & 0xFFFFFF;\n let mid = (((bitsLow >>> 24) | (bitsHigh << 8)) >>> 0) & 0xFFFFFF;\n let high = (bitsHigh >> 16) & 0xFFFF;\n // Assemble our three base-1e7 digits, ignoring carries. The maximum\n // value in a digit at this step is representable as a 48-bit integer, which\n // can be stored in a 64-bit floating point number.\n let digitA = low + (mid * 6777216) + (high * 6710656);\n let digitB = mid + (high * 8147497);\n let digitC = (high * 2);\n // Apply carries from A to B and from B to C.\n let base = 10000000;\n if (digitA >= base) {\n digitB += Math.floor(digitA / base);\n digitA %= base;\n }\n if (digitB >= base) {\n digitC += Math.floor(digitB / base);\n digitB %= base;\n }\n // Convert base-1e7 digits to base-10, with optional leading zeroes.\n function decimalFrom1e7(digit1e7, needLeadingZeros) {\n let partial = digit1e7 ? String(digit1e7) : \'\';\n if (needLeadingZeros) {\n return \'0000000\'.slice(partial.length) + partial;\n }\n return partial;\n }\n return decimalFrom1e7(digitC, /*needLeadingZeros=*/ 0) +\n decimalFrom1e7(digitB, /*needLeadingZeros=*/ digitC) +\n // If the final 1e7 digit didn\'t need leading zeros, we would have\n // returned via the trivial code path at the top.\n decimalFrom1e7(digitA, /*needLeadingZeros=*/ 1);\n}\n/**\n * Write a 32 bit varint, signed or unsigned. Same as `varint64write(0, value, bytes)`\n *\n * Copyright 2008 Google Inc. All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf/blob/1b18833f4f2a2f681f4e4a25cdf3b0a43115ec26/js/binary/encoder.js#L144\n */\nfunction varint32write(value, bytes) {\n if (value >= 0) {\n // write value as varint 32\n while (value > 0x7f) {\n bytes.push((value & 0x7f) | 0x80);\n value = value >>> 7;\n }\n bytes.push(value);\n }\n else {\n for (let i = 0; i < 9; i++) {\n bytes.push(value & 127 | 128);\n value = value >> 7;\n }\n bytes.push(1);\n }\n}\n/**\n * Read an unsigned 32 bit varint.\n *\n * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/buffer_decoder.js#L220\n */\nfunction varint32read() {\n let b = this.buf[this.pos++];\n let result = b & 0x7F;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return result;\n }\n b = this.buf[this.pos++];\n result |= (b & 0x7F) << 7;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return result;\n }\n b = this.buf[this.pos++];\n result |= (b & 0x7F) << 14;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return result;\n }\n b = this.buf[this.pos++];\n result |= (b & 0x7F) << 21;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return result;\n }\n // Extract only last 4 bits\n b = this.buf[this.pos++];\n result |= (b & 0x0F) << 28;\n for (let readBytes = 5; ((b & 0x80) !== 0) && readBytes < 10; readBytes++)\n b = this.buf[this.pos++];\n if ((b & 0x80) != 0)\n throw new Error(\'invalid varint\');\n this.assertBounds();\n // Result can have 32 bits, convert it to unsigned\n return result >>> 0;\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/pb-long.js\n\nlet BI;\nfunction detectBi() {\n const dv = new DataView(new ArrayBuffer(8));\n const ok = globalThis.BigInt !== undefined\n && typeof dv.getBigInt64 === "function"\n && typeof dv.getBigUint64 === "function"\n && typeof dv.setBigInt64 === "function"\n && typeof dv.setBigUint64 === "function";\n BI = ok ? {\n MIN: BigInt("-9223372036854775808"),\n MAX: BigInt("9223372036854775807"),\n UMIN: BigInt("0"),\n UMAX: BigInt("18446744073709551615"),\n C: BigInt,\n V: dv,\n } : undefined;\n}\ndetectBi();\nfunction assertBi(bi) {\n if (!bi)\n throw new Error("BigInt unavailable, see https://github.com/timostamm/protobuf-ts/blob/v1.0.8/MANUAL.md#bigint-support");\n}\n// used to validate from(string) input (when bigint is unavailable)\nconst RE_DECIMAL_STR = /^-?[0-9]+$/;\n// constants for binary math\nconst pb_long_TWO_PWR_32_DBL = 0x100000000;\nconst HALF_2_PWR_32 = 0x080000000;\n// base class for PbLong and PbULong provides shared code\nclass SharedPbLong {\n /**\n * Create a new instance with the given bits.\n */\n constructor(lo, hi) {\n this.lo = lo | 0;\n this.hi = hi | 0;\n }\n /**\n * Is this instance equal to 0?\n */\n isZero() {\n return this.lo == 0 && this.hi == 0;\n }\n /**\n * Convert to a native number.\n */\n toNumber() {\n let result = this.hi * pb_long_TWO_PWR_32_DBL + (this.lo >>> 0);\n if (!Number.isSafeInteger(result))\n throw new Error("cannot convert to safe number");\n return result;\n }\n}\n/**\n * 64-bit unsigned integer as two 32-bit values.\n * Converts between `string`, `number` and `bigint` representations.\n */\nclass PbULong extends SharedPbLong {\n /**\n * Create instance from a `string`, `number` or `bigint`.\n */\n static from(value) {\n if (BI)\n // noinspection FallThroughInSwitchStatementJS\n switch (typeof value) {\n case "string":\n if (value == "0")\n return this.ZERO;\n if (value == "")\n throw new Error(\'string is no integer\');\n value = BI.C(value);\n case "number":\n if (value === 0)\n return this.ZERO;\n value = BI.C(value);\n case "bigint":\n if (!value)\n return this.ZERO;\n if (value < BI.UMIN)\n throw new Error(\'signed value for ulong\');\n if (value > BI.UMAX)\n throw new Error(\'ulong too large\');\n BI.V.setBigUint64(0, value, true);\n return new PbULong(BI.V.getInt32(0, true), BI.V.getInt32(4, true));\n }\n else\n switch (typeof value) {\n case "string":\n if (value == "0")\n return this.ZERO;\n value = value.trim();\n if (!RE_DECIMAL_STR.test(value))\n throw new Error(\'string is no integer\');\n let [minus, lo, hi] = int64fromString(value);\n if (minus)\n throw new Error(\'signed value for ulong\');\n return new PbULong(lo, hi);\n case "number":\n if (value == 0)\n return this.ZERO;\n if (!Number.isSafeInteger(value))\n throw new Error(\'number is no integer\');\n if (value < 0)\n throw new Error(\'signed value for ulong\');\n return new PbULong(value, value / pb_long_TWO_PWR_32_DBL);\n }\n throw new Error(\'unknown value \' + typeof value);\n }\n /**\n * Convert to decimal string.\n */\n toString() {\n return BI ? this.toBigInt().toString() : int64toString(this.lo, this.hi);\n }\n /**\n * Convert to native bigint.\n */\n toBigInt() {\n assertBi(BI);\n BI.V.setInt32(0, this.lo, true);\n BI.V.setInt32(4, this.hi, true);\n return BI.V.getBigUint64(0, true);\n }\n}\n/**\n * ulong 0 singleton.\n */\nPbULong.ZERO = new PbULong(0, 0);\n/**\n * 64-bit signed integer as two 32-bit values.\n * Converts between `string`, `number` and `bigint` representations.\n */\nclass PbLong extends SharedPbLong {\n /**\n * Create instance from a `string`, `number` or `bigint`.\n */\n static from(value) {\n if (BI)\n // noinspection FallThroughInSwitchStatementJS\n switch (typeof value) {\n case "string":\n if (value == "0")\n return this.ZERO;\n if (value == "")\n throw new Error(\'string is no integer\');\n value = BI.C(value);\n case "number":\n if (value === 0)\n return this.ZERO;\n value = BI.C(value);\n case "bigint":\n if (!value)\n return this.ZERO;\n if (value < BI.MIN)\n throw new Error(\'signed long too small\');\n if (value > BI.MAX)\n throw new Error(\'signed long too large\');\n BI.V.setBigInt64(0, value, true);\n return new PbLong(BI.V.getInt32(0, true), BI.V.getInt32(4, true));\n }\n else\n switch (typeof value) {\n case "string":\n if (value == "0")\n return this.ZERO;\n value = value.trim();\n if (!RE_DECIMAL_STR.test(value))\n throw new Error(\'string is no integer\');\n let [minus, lo, hi] = int64fromString(value);\n if (minus) {\n if (hi > HALF_2_PWR_32 || (hi == HALF_2_PWR_32 && lo != 0))\n throw new Error(\'signed long too small\');\n }\n else if (hi >= HALF_2_PWR_32)\n throw new Error(\'signed long too large\');\n let pbl = new PbLong(lo, hi);\n return minus ? pbl.negate() : pbl;\n case "number":\n if (value == 0)\n return this.ZERO;\n if (!Number.isSafeInteger(value))\n throw new Error(\'number is no integer\');\n return value > 0\n ? new PbLong(value, value / pb_long_TWO_PWR_32_DBL)\n : new PbLong(-value, -value / pb_long_TWO_PWR_32_DBL).negate();\n }\n throw new Error(\'unknown value \' + typeof value);\n }\n /**\n * Do we have a minus sign?\n */\n isNegative() {\n return (this.hi & HALF_2_PWR_32) !== 0;\n }\n /**\n * Negate two\'s complement.\n * Invert all the bits and add one to the result.\n */\n negate() {\n let hi = ~this.hi, lo = this.lo;\n if (lo)\n lo = ~lo + 1;\n else\n hi += 1;\n return new PbLong(lo, hi);\n }\n /**\n * Convert to decimal string.\n */\n toString() {\n if (BI)\n return this.toBigInt().toString();\n if (this.isNegative()) {\n let n = this.negate();\n return \'-\' + int64toString(n.lo, n.hi);\n }\n return int64toString(this.lo, this.hi);\n }\n /**\n * Convert to native bigint.\n */\n toBigInt() {\n assertBi(BI);\n BI.V.setInt32(0, this.lo, true);\n BI.V.setInt32(4, this.hi, true);\n return BI.V.getBigInt64(0, true);\n }\n}\n/**\n * long 0 singleton.\n */\nPbLong.ZERO = new PbLong(0, 0);\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/binary-reader.js\n\n\n\nconst defaultsRead = {\n readUnknownField: true,\n readerFactory: bytes => new BinaryReader(bytes),\n};\n/**\n * Make options for reading binary data form partial options.\n */\nfunction binaryReadOptions(options) {\n return options ? Object.assign(Object.assign({}, defaultsRead), options) : defaultsRead;\n}\nclass BinaryReader {\n constructor(buf, textDecoder) {\n this.varint64 = varint64read; // dirty cast for `this`\n /**\n * Read a `uint32` field, an unsigned 32 bit varint.\n */\n this.uint32 = varint32read; // dirty cast for `this` and access to protected `buf`\n this.buf = buf;\n this.len = buf.length;\n this.pos = 0;\n this.view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\n this.textDecoder = textDecoder !== null && textDecoder !== void 0 ? textDecoder : new TextDecoder("utf-8", {\n fatal: true,\n ignoreBOM: true,\n });\n }\n /**\n * Reads a tag - field number and wire type.\n */\n tag() {\n let tag = this.uint32(), fieldNo = tag >>> 3, wireType = tag & 7;\n if (fieldNo <= 0 || wireType < 0 || wireType > 5)\n throw new Error("illegal tag: field no " + fieldNo + " wire type " + wireType);\n return [fieldNo, wireType];\n }\n /**\n * Skip one element on the wire and return the skipped data.\n * Supports WireType.StartGroup since v2.0.0-alpha.23.\n */\n skip(wireType) {\n let start = this.pos;\n // noinspection FallThroughInSwitchStatementJS\n switch (wireType) {\n case binary_format_contract/* WireType */.TD.Varint:\n while (this.buf[this.pos++] & 0x80) {\n // ignore\n }\n break;\n case binary_format_contract/* WireType */.TD.Bit64:\n this.pos += 4;\n case binary_format_contract/* WireType */.TD.Bit32:\n this.pos += 4;\n break;\n case binary_format_contract/* WireType */.TD.LengthDelimited:\n let len = this.uint32();\n this.pos += len;\n break;\n case binary_format_contract/* WireType */.TD.StartGroup:\n // From descriptor.proto: Group type is deprecated, not supported in proto3.\n // But we must still be able to parse and treat as unknown.\n let t;\n while ((t = this.tag()[1]) !== binary_format_contract/* WireType */.TD.EndGroup) {\n this.skip(t);\n }\n break;\n default:\n throw new Error("cant skip wire type " + wireType);\n }\n this.assertBounds();\n return this.buf.subarray(start, this.pos);\n }\n /**\n * Throws error if position in byte array is out of range.\n */\n assertBounds() {\n if (this.pos > this.len)\n throw new RangeError("premature EOF");\n }\n /**\n * Read a `int32` field, a signed 32 bit varint.\n */\n int32() {\n return this.uint32() | 0;\n }\n /**\n * Read a `sint32` field, a signed, zigzag-encoded 32-bit varint.\n */\n sint32() {\n let zze = this.uint32();\n // decode zigzag\n return (zze >>> 1) ^ -(zze & 1);\n }\n /**\n * Read a `int64` field, a signed 64-bit varint.\n */\n int64() {\n return new PbLong(...this.varint64());\n }\n /**\n * Read a `uint64` field, an unsigned 64-bit varint.\n */\n uint64() {\n return new PbULong(...this.varint64());\n }\n /**\n * Read a `sint64` field, a signed, zig-zag-encoded 64-bit varint.\n */\n sint64() {\n let [lo, hi] = this.varint64();\n // decode zig zag\n let s = -(lo & 1);\n lo = ((lo >>> 1 | (hi & 1) << 31) ^ s);\n hi = (hi >>> 1 ^ s);\n return new PbLong(lo, hi);\n }\n /**\n * Read a `bool` field, a variant.\n */\n bool() {\n let [lo, hi] = this.varint64();\n return lo !== 0 || hi !== 0;\n }\n /**\n * Read a `fixed32` field, an unsigned, fixed-length 32-bit integer.\n */\n fixed32() {\n return this.view.getUint32((this.pos += 4) - 4, true);\n }\n /**\n * Read a `sfixed32` field, a signed, fixed-length 32-bit integer.\n */\n sfixed32() {\n return this.view.getInt32((this.pos += 4) - 4, true);\n }\n /**\n * Read a `fixed64` field, an unsigned, fixed-length 64 bit integer.\n */\n fixed64() {\n return new PbULong(this.sfixed32(), this.sfixed32());\n }\n /**\n * Read a `fixed64` field, a signed, fixed-length 64-bit integer.\n */\n sfixed64() {\n return new PbLong(this.sfixed32(), this.sfixed32());\n }\n /**\n * Read a `float` field, 32-bit floating point number.\n */\n float() {\n return this.view.getFloat32((this.pos += 4) - 4, true);\n }\n /**\n * Read a `double` field, a 64-bit floating point number.\n */\n double() {\n return this.view.getFloat64((this.pos += 8) - 8, true);\n }\n /**\n * Read a `bytes` field, length-delimited arbitrary data.\n */\n bytes() {\n let len = this.uint32();\n let start = this.pos;\n this.pos += len;\n this.assertBounds();\n return this.buf.subarray(start, start + len);\n }\n /**\n * Read a `string` field, length-delimited data converted to UTF-8 text.\n */\n string() {\n return this.textDecoder.decode(this.bytes());\n }\n}\n\n// EXTERNAL MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/assert.js\nvar assert = __webpack_require__(9920);\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/binary-writer.js\n\n\n\nconst defaultsWrite = {\n writeUnknownFields: true,\n writerFactory: () => new BinaryWriter(),\n};\n/**\n * Make options for writing binary data form partial options.\n */\nfunction binaryWriteOptions(options) {\n return options ? Object.assign(Object.assign({}, defaultsWrite), options) : defaultsWrite;\n}\nclass BinaryWriter {\n constructor(textEncoder) {\n /**\n * Previous fork states.\n */\n this.stack = [];\n this.textEncoder = textEncoder !== null && textEncoder !== void 0 ? textEncoder : new TextEncoder();\n this.chunks = [];\n this.buf = [];\n }\n /**\n * Return all bytes written and reset this writer.\n */\n finish() {\n this.chunks.push(new Uint8Array(this.buf)); // flush the buffer\n let len = 0;\n for (let i = 0; i < this.chunks.length; i++)\n len += this.chunks[i].length;\n let bytes = new Uint8Array(len);\n let offset = 0;\n for (let i = 0; i < this.chunks.length; i++) {\n bytes.set(this.chunks[i], offset);\n offset += this.chunks[i].length;\n }\n this.chunks = [];\n return bytes;\n }\n /**\n * Start a new fork for length-delimited data like a message\n * or a packed repeated field.\n *\n * Must be joined later with `join()`.\n */\n fork() {\n this.stack.push({ chunks: this.chunks, buf: this.buf });\n this.chunks = [];\n this.buf = [];\n return this;\n }\n /**\n * Join the last fork. Write its length and bytes, then\n * return to the previous state.\n */\n join() {\n // get chunk of fork\n let chunk = this.finish();\n // restore previous state\n let prev = this.stack.pop();\n if (!prev)\n throw new Error(\'invalid state, fork stack empty\');\n this.chunks = prev.chunks;\n this.buf = prev.buf;\n // write length of chunk as varint\n this.uint32(chunk.byteLength);\n return this.raw(chunk);\n }\n /**\n * Writes a tag (field number and wire type).\n *\n * Equivalent to `uint32( (fieldNo << 3 | type) >>> 0 )`.\n *\n * Generated code should compute the tag ahead of time and call `uint32()`.\n */\n tag(fieldNo, type) {\n return this.uint32((fieldNo << 3 | type) >>> 0);\n }\n /**\n * Write a chunk of raw bytes.\n */\n raw(chunk) {\n if (this.buf.length) {\n this.chunks.push(new Uint8Array(this.buf));\n this.buf = [];\n }\n this.chunks.push(chunk);\n return this;\n }\n /**\n * Write a `uint32` value, an unsigned 32 bit varint.\n */\n uint32(value) {\n (0,assert/* assertUInt32 */.fp)(value);\n // write value as varint 32, inlined for speed\n while (value > 0x7f) {\n this.buf.push((value & 0x7f) | 0x80);\n value = value >>> 7;\n }\n this.buf.push(value);\n return this;\n }\n /**\n * Write a `int32` value, a signed 32 bit varint.\n */\n int32(value) {\n (0,assert/* assertInt32 */.ug)(value);\n varint32write(value, this.buf);\n return this;\n }\n /**\n * Write a `bool` value, a variant.\n */\n bool(value) {\n this.buf.push(value ? 1 : 0);\n return this;\n }\n /**\n * Write a `bytes` value, length-delimited arbitrary data.\n */\n bytes(value) {\n this.uint32(value.byteLength); // write length of chunk as varint\n return this.raw(value);\n }\n /**\n * Write a `string` value, length-delimited data converted to UTF-8 text.\n */\n string(value) {\n let chunk = this.textEncoder.encode(value);\n this.uint32(chunk.byteLength); // write length of chunk as varint\n return this.raw(chunk);\n }\n /**\n * Write a `float` value, 32-bit floating point number.\n */\n float(value) {\n (0,assert/* assertFloat32 */.E_)(value);\n let chunk = new Uint8Array(4);\n new DataView(chunk.buffer).setFloat32(0, value, true);\n return this.raw(chunk);\n }\n /**\n * Write a `double` value, a 64-bit floating point number.\n */\n double(value) {\n let chunk = new Uint8Array(8);\n new DataView(chunk.buffer).setFloat64(0, value, true);\n return this.raw(chunk);\n }\n /**\n * Write a `fixed32` value, an unsigned, fixed-length 32-bit integer.\n */\n fixed32(value) {\n (0,assert/* assertUInt32 */.fp)(value);\n let chunk = new Uint8Array(4);\n new DataView(chunk.buffer).setUint32(0, value, true);\n return this.raw(chunk);\n }\n /**\n * Write a `sfixed32` value, a signed, fixed-length 32-bit integer.\n */\n sfixed32(value) {\n (0,assert/* assertInt32 */.ug)(value);\n let chunk = new Uint8Array(4);\n new DataView(chunk.buffer).setInt32(0, value, true);\n return this.raw(chunk);\n }\n /**\n * Write a `sint32` value, a signed, zigzag-encoded 32-bit varint.\n */\n sint32(value) {\n (0,assert/* assertInt32 */.ug)(value);\n // zigzag encode\n value = ((value << 1) ^ (value >> 31)) >>> 0;\n varint32write(value, this.buf);\n return this;\n }\n /**\n * Write a `fixed64` value, a signed, fixed-length 64-bit integer.\n */\n sfixed64(value) {\n let chunk = new Uint8Array(8);\n let view = new DataView(chunk.buffer);\n let long = PbLong.from(value);\n view.setInt32(0, long.lo, true);\n view.setInt32(4, long.hi, true);\n return this.raw(chunk);\n }\n /**\n * Write a `fixed64` value, an unsigned, fixed-length 64 bit integer.\n */\n fixed64(value) {\n let chunk = new Uint8Array(8);\n let view = new DataView(chunk.buffer);\n let long = PbULong.from(value);\n view.setInt32(0, long.lo, true);\n view.setInt32(4, long.hi, true);\n return this.raw(chunk);\n }\n /**\n * Write a `int64` value, a signed 64-bit varint.\n */\n int64(value) {\n let long = PbLong.from(value);\n varint64write(long.lo, long.hi, this.buf);\n return this;\n }\n /**\n * Write a `sint64` value, a signed, zig-zag-encoded 64-bit varint.\n */\n sint64(value) {\n let long = PbLong.from(value), \n // zigzag encode\n sign = long.hi >> 31, lo = (long.lo << 1) ^ sign, hi = ((long.hi << 1) | (long.lo >>> 31)) ^ sign;\n varint64write(lo, hi, this.buf);\n return this;\n }\n /**\n * Write a `uint64` value, an unsigned 64-bit varint.\n */\n uint64(value) {\n let long = PbULong.from(value);\n varint64write(long.lo, long.hi, this.buf);\n return this;\n }\n}\n\n// EXTERNAL MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/json-format-contract.js\nvar json_format_contract = __webpack_require__(9557);\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/message-type-contract.js\n/**\n * The symbol used as a key on message objects to store the message type.\n *\n * Note that this is an experimental feature - it is here to stay, but\n * implementation details may change without notice.\n */\nconst MESSAGE_TYPE = Symbol.for("protobuf-ts/message-type");\n\n// EXTERNAL MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/lower-camel-case.js\nvar lower_camel_case = __webpack_require__(1212);\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-info.js\n\n/**\n * Scalar value types. This is a subset of field types declared by protobuf\n * enum google.protobuf.FieldDescriptorProto.Type The types GROUP and MESSAGE\n * are omitted, but the numerical values are identical.\n */\nvar ScalarType;\n(function (ScalarType) {\n // 0 is reserved for errors.\n // Order is weird for historical reasons.\n ScalarType[ScalarType["DOUBLE"] = 1] = "DOUBLE";\n ScalarType[ScalarType["FLOAT"] = 2] = "FLOAT";\n // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if\n // negative values are likely.\n ScalarType[ScalarType["INT64"] = 3] = "INT64";\n ScalarType[ScalarType["UINT64"] = 4] = "UINT64";\n // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if\n // negative values are likely.\n ScalarType[ScalarType["INT32"] = 5] = "INT32";\n ScalarType[ScalarType["FIXED64"] = 6] = "FIXED64";\n ScalarType[ScalarType["FIXED32"] = 7] = "FIXED32";\n ScalarType[ScalarType["BOOL"] = 8] = "BOOL";\n ScalarType[ScalarType["STRING"] = 9] = "STRING";\n // Tag-delimited aggregate.\n // Group type is deprecated and not supported in proto3. However, Proto3\n // implementations should still be able to parse the group wire format and\n // treat group fields as unknown fields.\n // TYPE_GROUP = 10,\n // TYPE_MESSAGE = 11, // Length-delimited aggregate.\n // New in version 2.\n ScalarType[ScalarType["BYTES"] = 12] = "BYTES";\n ScalarType[ScalarType["UINT32"] = 13] = "UINT32";\n // TYPE_ENUM = 14,\n ScalarType[ScalarType["SFIXED32"] = 15] = "SFIXED32";\n ScalarType[ScalarType["SFIXED64"] = 16] = "SFIXED64";\n ScalarType[ScalarType["SINT32"] = 17] = "SINT32";\n ScalarType[ScalarType["SINT64"] = 18] = "SINT64";\n})(ScalarType || (ScalarType = {}));\n/**\n * JavaScript representation of 64 bit integral types. Equivalent to the\n * field option "jstype".\n *\n * By default, protobuf-ts represents 64 bit types as `bigint`.\n *\n * You can change the default behaviour by enabling the plugin parameter\n * `long_type_string`, which will represent 64 bit types as `string`.\n *\n * Alternatively, you can change the behaviour for individual fields\n * with the field option "jstype":\n *\n * ```protobuf\n * uint64 my_field = 1 [jstype = JS_STRING];\n * uint64 other_field = 2 [jstype = JS_NUMBER];\n * ```\n */\nvar LongType;\n(function (LongType) {\n /**\n * Use JavaScript `bigint`.\n *\n * Field option `[jstype = JS_NORMAL]`.\n */\n LongType[LongType["BIGINT"] = 0] = "BIGINT";\n /**\n * Use JavaScript `string`.\n *\n * Field option `[jstype = JS_STRING]`.\n */\n LongType[LongType["STRING"] = 1] = "STRING";\n /**\n * Use JavaScript `number`.\n *\n * Large values will loose precision.\n *\n * Field option `[jstype = JS_NUMBER]`.\n */\n LongType[LongType["NUMBER"] = 2] = "NUMBER";\n})(LongType || (LongType = {}));\n/**\n * Protobuf 2.1.0 introduced packed repeated fields.\n * Setting the field option `[packed = true]` enables packing.\n *\n * In proto3, all repeated fields are packed by default.\n * Setting the field option `[packed = false]` disables packing.\n *\n * Packed repeated fields are encoded with a single tag,\n * then a length-delimiter, then the element values.\n *\n * Unpacked repeated fields are encoded with a tag and\n * value for each element.\n *\n * `bytes` and `string` cannot be packed.\n */\nvar RepeatType;\n(function (RepeatType) {\n /**\n * The field is not repeated.\n */\n RepeatType[RepeatType["NO"] = 0] = "NO";\n /**\n * The field is repeated and should be packed.\n * Invalid for `bytes` and `string`, they cannot be packed.\n */\n RepeatType[RepeatType["PACKED"] = 1] = "PACKED";\n /**\n * The field is repeated but should not be packed.\n * The only valid repeat type for repeated `bytes` and `string`.\n */\n RepeatType[RepeatType["UNPACKED"] = 2] = "UNPACKED";\n})(RepeatType || (RepeatType = {}));\n/**\n * Turns PartialFieldInfo into FieldInfo.\n */\nfunction normalizeFieldInfo(field) {\n var _a, _b, _c, _d;\n field.localName = (_a = field.localName) !== null && _a !== void 0 ? _a : (0,lower_camel_case/* lowerCamelCase */.c)(field.name);\n field.jsonName = (_b = field.jsonName) !== null && _b !== void 0 ? _b : (0,lower_camel_case/* lowerCamelCase */.c)(field.name);\n field.repeat = (_c = field.repeat) !== null && _c !== void 0 ? _c : RepeatType.NO;\n field.opt = (_d = field.opt) !== null && _d !== void 0 ? _d : (field.repeat ? false : field.oneof ? false : field.kind == "message");\n return field;\n}\n/**\n * Read custom field options from a generated message type.\n *\n * @deprecated use readFieldOption()\n */\nfunction readFieldOptions(messageType, fieldName, extensionName, extensionType) {\n var _a;\n const options = (_a = messageType.fields.find((m, i) => m.localName == fieldName || i == fieldName)) === null || _a === void 0 ? void 0 : _a.options;\n return options && options[extensionName] ? extensionType.fromJson(options[extensionName]) : undefined;\n}\nfunction readFieldOption(messageType, fieldName, extensionName, extensionType) {\n var _a;\n const options = (_a = messageType.fields.find((m, i) => m.localName == fieldName || i == fieldName)) === null || _a === void 0 ? void 0 : _a.options;\n if (!options) {\n return undefined;\n }\n const optionVal = options[extensionName];\n if (optionVal === undefined) {\n return optionVal;\n }\n return extensionType ? extensionType.fromJson(optionVal) : optionVal;\n}\nfunction readMessageOption(messageType, extensionName, extensionType) {\n const options = messageType.options;\n const optionVal = options[extensionName];\n if (optionVal === undefined) {\n return optionVal;\n }\n return extensionType ? extensionType.fromJson(optionVal) : optionVal;\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/oneof.js\n/**\n * Is the given value a valid oneof group?\n *\n * We represent protobuf `oneof` as algebraic data types (ADT) in generated\n * code. But when working with messages of unknown type, the ADT does not\n * help us.\n *\n * This type guard checks if the given object adheres to the ADT rules, which\n * are as follows:\n *\n * 1) Must be an object.\n *\n * 2) Must have a "oneofKind" discriminator property.\n *\n * 3) If "oneofKind" is `undefined`, no member field is selected. The object\n * must not have any other properties.\n *\n * 4) If "oneofKind" is a `string`, the member field with this name is\n * selected.\n *\n * 5) If a member field is selected, the object must have a second property\n * with this name. The property must not be `undefined`.\n *\n * 6) No extra properties are allowed. The object has either one property\n * (no selection) or two properties (selection).\n *\n */\nfunction isOneofGroup(any) {\n if (typeof any != \'object\' || any === null || !any.hasOwnProperty(\'oneofKind\')) {\n return false;\n }\n switch (typeof any.oneofKind) {\n case "string":\n if (any[any.oneofKind] === undefined)\n return false;\n return Object.keys(any).length == 2;\n case "undefined":\n return Object.keys(any).length == 1;\n default:\n return false;\n }\n}\n/**\n * Returns the value of the given field in a oneof group.\n */\nfunction getOneofValue(oneof, kind) {\n return oneof[kind];\n}\nfunction setOneofValue(oneof, kind, value) {\n if (oneof.oneofKind !== undefined) {\n delete oneof[oneof.oneofKind];\n }\n oneof.oneofKind = kind;\n if (value !== undefined) {\n oneof[kind] = value;\n }\n}\nfunction setUnknownOneofValue(oneof, kind, value) {\n if (oneof.oneofKind !== undefined) {\n delete oneof[oneof.oneofKind];\n }\n oneof.oneofKind = kind;\n if (value !== undefined && kind !== undefined) {\n oneof[kind] = value;\n }\n}\n/**\n * Removes the selected field in a oneof group.\n *\n * Note that the recommended way to modify a oneof group is to set\n * a new object:\n *\n * ```ts\n * message.result = { oneofKind: undefined };\n * ```\n */\nfunction clearOneofValue(oneof) {\n if (oneof.oneofKind !== undefined) {\n delete oneof[oneof.oneofKind];\n }\n oneof.oneofKind = undefined;\n}\n/**\n * Returns the selected value of the given oneof group.\n *\n * Not that the recommended way to access a oneof group is to check\n * the "oneofKind" property and let TypeScript narrow down the union\n * type for you:\n *\n * ```ts\n * if (message.result.oneofKind === "error") {\n * message.result.error; // string\n * }\n * ```\n *\n * In the rare case you just need the value, and do not care about\n * which protobuf field is selected, you can use this function\n * for convenience.\n */\nfunction getSelectedOneofValue(oneof) {\n if (oneof.oneofKind === undefined) {\n return undefined;\n }\n return oneof[oneof.oneofKind];\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-type-check.js\n\n\n// noinspection JSMethodCanBeStatic\nclass ReflectionTypeCheck {\n constructor(info) {\n var _a;\n this.fields = (_a = info.fields) !== null && _a !== void 0 ? _a : [];\n }\n prepare() {\n if (this.data)\n return;\n const req = [], known = [], oneofs = [];\n for (let field of this.fields) {\n if (field.oneof) {\n if (!oneofs.includes(field.oneof)) {\n oneofs.push(field.oneof);\n req.push(field.oneof);\n known.push(field.oneof);\n }\n }\n else {\n known.push(field.localName);\n switch (field.kind) {\n case "scalar":\n case "enum":\n if (!field.opt || field.repeat)\n req.push(field.localName);\n break;\n case "message":\n if (field.repeat)\n req.push(field.localName);\n break;\n case "map":\n req.push(field.localName);\n break;\n }\n }\n }\n this.data = { req, known, oneofs: Object.values(oneofs) };\n }\n /**\n * Is the argument a valid message as specified by the\n * reflection information?\n *\n * Checks all field types recursively. The `depth`\n * specifies how deep into the structure the check will be.\n *\n * With a depth of 0, only the presence of fields\n * is checked.\n *\n * With a depth of 1 or more, the field types are checked.\n *\n * With a depth of 2 or more, the members of map, repeated\n * and message fields are checked.\n *\n * Message fields will be checked recursively with depth - 1.\n *\n * The number of map entries / repeated values being checked\n * is < depth.\n */\n is(message, depth, allowExcessProperties = false) {\n if (depth < 0)\n return true;\n if (message === null || message === undefined || typeof message != \'object\')\n return false;\n this.prepare();\n let keys = Object.keys(message), data = this.data;\n // if a required field is missing in arg, this cannot be a T\n if (keys.length < data.req.length || data.req.some(n => !keys.includes(n)))\n return false;\n if (!allowExcessProperties) {\n // if the arg contains a key we dont know, this is not a literal T\n if (keys.some(k => !data.known.includes(k)))\n return false;\n }\n // "With a depth of 0, only the presence and absence of fields is checked."\n // "With a depth of 1 or more, the field types are checked."\n if (depth < 1) {\n return true;\n }\n // check oneof group\n for (const name of data.oneofs) {\n const group = message[name];\n if (!isOneofGroup(group))\n return false;\n if (group.oneofKind === undefined)\n continue;\n const field = this.fields.find(f => f.localName === group.oneofKind);\n if (!field)\n return false; // we found no field, but have a kind, something is wrong\n if (!this.field(group[group.oneofKind], field, allowExcessProperties, depth))\n return false;\n }\n // check types\n for (const field of this.fields) {\n if (field.oneof !== undefined)\n continue;\n if (!this.field(message[field.localName], field, allowExcessProperties, depth))\n return false;\n }\n return true;\n }\n field(arg, field, allowExcessProperties, depth) {\n let repeated = field.repeat;\n switch (field.kind) {\n case "scalar":\n if (arg === undefined)\n return field.opt;\n if (repeated)\n return this.scalars(arg, field.T, depth, field.L);\n return this.scalar(arg, field.T, field.L);\n case "enum":\n if (arg === undefined)\n return field.opt;\n if (repeated)\n return this.scalars(arg, ScalarType.INT32, depth);\n return this.scalar(arg, ScalarType.INT32);\n case "message":\n if (arg === undefined)\n return true;\n if (repeated)\n return this.messages(arg, field.T(), allowExcessProperties, depth);\n return this.message(arg, field.T(), allowExcessProperties, depth);\n case "map":\n if (typeof arg != \'object\' || arg === null)\n return false;\n if (depth < 2)\n return true;\n if (!this.mapKeys(arg, field.K, depth))\n return false;\n switch (field.V.kind) {\n case "scalar":\n return this.scalars(Object.values(arg), field.V.T, depth, field.V.L);\n case "enum":\n return this.scalars(Object.values(arg), ScalarType.INT32, depth);\n case "message":\n return this.messages(Object.values(arg), field.V.T(), allowExcessProperties, depth);\n }\n break;\n }\n return true;\n }\n message(arg, type, allowExcessProperties, depth) {\n if (allowExcessProperties) {\n return type.isAssignable(arg, depth);\n }\n return type.is(arg, depth);\n }\n messages(arg, type, allowExcessProperties, depth) {\n if (!Array.isArray(arg))\n return false;\n if (depth < 2)\n return true;\n if (allowExcessProperties) {\n for (let i = 0; i < arg.length && i < depth; i++)\n if (!type.isAssignable(arg[i], depth - 1))\n return false;\n }\n else {\n for (let i = 0; i < arg.length && i < depth; i++)\n if (!type.is(arg[i], depth - 1))\n return false;\n }\n return true;\n }\n scalar(arg, type, longType) {\n let argType = typeof arg;\n switch (type) {\n case ScalarType.UINT64:\n case ScalarType.FIXED64:\n case ScalarType.INT64:\n case ScalarType.SFIXED64:\n case ScalarType.SINT64:\n switch (longType) {\n case LongType.BIGINT:\n return argType == "bigint";\n case LongType.NUMBER:\n return argType == "number" && !isNaN(arg);\n default:\n return argType == "string";\n }\n case ScalarType.BOOL:\n return argType == \'boolean\';\n case ScalarType.STRING:\n return argType == \'string\';\n case ScalarType.BYTES:\n return arg instanceof Uint8Array;\n case ScalarType.DOUBLE:\n case ScalarType.FLOAT:\n return argType == \'number\' && !isNaN(arg);\n default:\n // case ScalarType.UINT32:\n // case ScalarType.FIXED32:\n // case ScalarType.INT32:\n // case ScalarType.SINT32:\n // case ScalarType.SFIXED32:\n return argType == \'number\' && Number.isInteger(arg);\n }\n }\n scalars(arg, type, depth, longType) {\n if (!Array.isArray(arg))\n return false;\n if (depth < 2)\n return true;\n if (Array.isArray(arg))\n for (let i = 0; i < arg.length && i < depth; i++)\n if (!this.scalar(arg[i], type, longType))\n return false;\n return true;\n }\n mapKeys(map, type, depth) {\n let keys = Object.keys(map);\n switch (type) {\n case ScalarType.INT32:\n case ScalarType.FIXED32:\n case ScalarType.SFIXED32:\n case ScalarType.SINT32:\n case ScalarType.UINT32:\n return this.scalars(keys.slice(0, depth).map(k => parseInt(k)), type, depth);\n case ScalarType.BOOL:\n return this.scalars(keys.slice(0, depth).map(k => k == \'true\' ? true : k == \'false\' ? false : k), type, depth);\n default:\n return this.scalars(keys, type, depth, LongType.STRING);\n }\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-long-convert.js\n\n/**\n * Utility method to convert a PbLong or PbUlong to a JavaScript\n * representation during runtime.\n *\n * Works with generated field information, `undefined` is equivalent\n * to `STRING`.\n */\nfunction reflectionLongConvert(long, type) {\n switch (type) {\n case LongType.BIGINT:\n return long.toBigInt();\n case LongType.NUMBER:\n return long.toNumber();\n default:\n // case undefined:\n // case LongType.STRING:\n return long.toString();\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-json-reader.js\n\n\n\n\n\n\n/**\n * Reads proto3 messages in canonical JSON format using reflection information.\n *\n * https://developers.google.com/protocol-buffers/docs/proto3#json\n */\nclass ReflectionJsonReader {\n constructor(info) {\n this.info = info;\n }\n prepare() {\n var _a;\n if (this.fMap === undefined) {\n this.fMap = {};\n const fieldsInput = (_a = this.info.fields) !== null && _a !== void 0 ? _a : [];\n for (const field of fieldsInput) {\n this.fMap[field.name] = field;\n this.fMap[field.jsonName] = field;\n this.fMap[field.localName] = field;\n }\n }\n }\n // Cannot parse JSON for #.\n assert(condition, fieldName, jsonValue) {\n if (!condition) {\n let what = typeofJsonValue(jsonValue);\n if (what == "number" || what == "boolean")\n what = jsonValue.toString();\n throw new Error(`Cannot parse JSON ${what} for ${this.info.typeName}#${fieldName}`);\n }\n }\n /**\n * Reads a message from canonical JSON format into the target message.\n *\n * Repeated fields are appended. Map entries are added, overwriting\n * existing keys.\n *\n * If a message field is already present, it will be merged with the\n * new data.\n */\n read(input, message, options) {\n this.prepare();\n const oneofsHandled = [];\n for (const [jsonKey, jsonValue] of Object.entries(input)) {\n const field = this.fMap[jsonKey];\n if (!field) {\n if (!options.ignoreUnknownFields)\n throw new Error(`Found unknown field while reading ${this.info.typeName} from JSON format. JSON key: ${jsonKey}`);\n continue;\n }\n const localName = field.localName;\n // handle oneof ADT\n let target; // this will be the target for the field value, whether it is member of a oneof or not\n if (field.oneof) {\n if (jsonValue === null && (field.kind !== \'enum\' || field.T()[0] !== \'google.protobuf.NullValue\')) {\n continue;\n }\n // since json objects are unordered by specification, it is not possible to take the last of multiple oneofs\n if (oneofsHandled.includes(field.oneof))\n throw new Error(`Multiple members of the oneof group "${field.oneof}" of ${this.info.typeName} are present in JSON.`);\n oneofsHandled.push(field.oneof);\n target = message[field.oneof] = {\n oneofKind: localName\n };\n }\n else {\n target = message;\n }\n // we have handled oneof above. we just have read the value into `target`.\n if (field.kind == \'map\') {\n if (jsonValue === null) {\n continue;\n }\n // check input\n this.assert(isJsonObject(jsonValue), field.name, jsonValue);\n // our target to put map entries into\n const fieldObj = target[localName];\n // read entries\n for (const [jsonObjKey, jsonObjValue] of Object.entries(jsonValue)) {\n this.assert(jsonObjValue !== null, field.name + " map value", null);\n // read value\n let val;\n switch (field.V.kind) {\n case "message":\n val = field.V.T().internalJsonRead(jsonObjValue, options);\n break;\n case "enum":\n val = this.enum(field.V.T(), jsonObjValue, field.name, options.ignoreUnknownFields);\n if (val === false)\n continue;\n break;\n case "scalar":\n val = this.scalar(jsonObjValue, field.V.T, field.V.L, field.name);\n break;\n }\n this.assert(val !== undefined, field.name + " map value", jsonObjValue);\n // read key\n let key = jsonObjKey;\n if (field.K == ScalarType.BOOL)\n key = key == "true" ? true : key == "false" ? false : key;\n key = this.scalar(key, field.K, LongType.STRING, field.name).toString();\n fieldObj[key] = val;\n }\n }\n else if (field.repeat) {\n if (jsonValue === null)\n continue;\n // check input\n this.assert(Array.isArray(jsonValue), field.name, jsonValue);\n // our target to put array entries into\n const fieldArr = target[localName];\n // read array entries\n for (const jsonItem of jsonValue) {\n this.assert(jsonItem !== null, field.name, null);\n let val;\n switch (field.kind) {\n case "message":\n val = field.T().internalJsonRead(jsonItem, options);\n break;\n case "enum":\n val = this.enum(field.T(), jsonItem, field.name, options.ignoreUnknownFields);\n if (val === false)\n continue;\n break;\n case "scalar":\n val = this.scalar(jsonItem, field.T, field.L, field.name);\n break;\n }\n this.assert(val !== undefined, field.name, jsonValue);\n fieldArr.push(val);\n }\n }\n else {\n switch (field.kind) {\n case "message":\n if (jsonValue === null && field.T().typeName != \'google.protobuf.Value\') {\n this.assert(field.oneof === undefined, field.name + " (oneof member)", null);\n continue;\n }\n target[localName] = field.T().internalJsonRead(jsonValue, options, target[localName]);\n break;\n case "enum":\n let val = this.enum(field.T(), jsonValue, field.name, options.ignoreUnknownFields);\n if (val === false)\n continue;\n target[localName] = val;\n break;\n case "scalar":\n target[localName] = this.scalar(jsonValue, field.T, field.L, field.name);\n break;\n }\n }\n }\n }\n /**\n * Returns `false` for unrecognized string representations.\n *\n * google.protobuf.NullValue accepts only JSON `null` (or the old `"NULL_VALUE"`).\n */\n enum(type, json, fieldName, ignoreUnknownFields) {\n if (type[0] == \'google.protobuf.NullValue\')\n (0,assert/* assert */.hu)(json === null || json === "NULL_VALUE", `Unable to parse field ${this.info.typeName}#${fieldName}, enum ${type[0]} only accepts null.`);\n if (json === null)\n // we require 0 to be default value for all enums\n return 0;\n switch (typeof json) {\n case "number":\n (0,assert/* assert */.hu)(Number.isInteger(json), `Unable to parse field ${this.info.typeName}#${fieldName}, enum can only be integral number, got ${json}.`);\n return json;\n case "string":\n let localEnumName = json;\n if (type[2] && json.substring(0, type[2].length) === type[2])\n // lookup without the shared prefix\n localEnumName = json.substring(type[2].length);\n let enumNumber = type[1][localEnumName];\n if (typeof enumNumber === \'undefined\' && ignoreUnknownFields) {\n return false;\n }\n (0,assert/* assert */.hu)(typeof enumNumber == "number", `Unable to parse field ${this.info.typeName}#${fieldName}, enum ${type[0]} has no value for "${json}".`);\n return enumNumber;\n }\n (0,assert/* assert */.hu)(false, `Unable to parse field ${this.info.typeName}#${fieldName}, cannot parse enum value from ${typeof json}".`);\n }\n scalar(json, type, longType, fieldName) {\n let e;\n try {\n switch (type) {\n // float, double: JSON value will be a number or one of the special string values "NaN", "Infinity", and "-Infinity".\n // Either numbers or strings are accepted. Exponent notation is also accepted.\n case ScalarType.DOUBLE:\n case ScalarType.FLOAT:\n if (json === null)\n return .0;\n if (json === "NaN")\n return Number.NaN;\n if (json === "Infinity")\n return Number.POSITIVE_INFINITY;\n if (json === "-Infinity")\n return Number.NEGATIVE_INFINITY;\n if (json === "") {\n e = "empty string";\n break;\n }\n if (typeof json == "string" && json.trim().length !== json.length) {\n e = "extra whitespace";\n break;\n }\n if (typeof json != "string" && typeof json != "number") {\n break;\n }\n let float = Number(json);\n if (Number.isNaN(float)) {\n e = "not a number";\n break;\n }\n if (!Number.isFinite(float)) {\n // infinity and -infinity are handled by string representation above, so this is an error\n e = "too large or small";\n break;\n }\n if (type == ScalarType.FLOAT)\n (0,assert/* assertFloat32 */.E_)(float);\n return float;\n // int32, fixed32, uint32: JSON value will be a decimal number. Either numbers or strings are accepted.\n case ScalarType.INT32:\n case ScalarType.FIXED32:\n case ScalarType.SFIXED32:\n case ScalarType.SINT32:\n case ScalarType.UINT32:\n if (json === null)\n return 0;\n let int32;\n if (typeof json == "number")\n int32 = json;\n else if (json === "")\n e = "empty string";\n else if (typeof json == "string") {\n if (json.trim().length !== json.length)\n e = "extra whitespace";\n else\n int32 = Number(json);\n }\n if (int32 === undefined)\n break;\n if (type == ScalarType.UINT32)\n (0,assert/* assertUInt32 */.fp)(int32);\n else\n (0,assert/* assertInt32 */.ug)(int32);\n return int32;\n // int64, fixed64, uint64: JSON value will be a decimal string. Either numbers or strings are accepted.\n case ScalarType.INT64:\n case ScalarType.SFIXED64:\n case ScalarType.SINT64:\n if (json === null)\n return reflectionLongConvert(PbLong.ZERO, longType);\n if (typeof json != "number" && typeof json != "string")\n break;\n return reflectionLongConvert(PbLong.from(json), longType);\n case ScalarType.FIXED64:\n case ScalarType.UINT64:\n if (json === null)\n return reflectionLongConvert(PbULong.ZERO, longType);\n if (typeof json != "number" && typeof json != "string")\n break;\n return reflectionLongConvert(PbULong.from(json), longType);\n // bool:\n case ScalarType.BOOL:\n if (json === null)\n return false;\n if (typeof json !== "boolean")\n break;\n return json;\n // string:\n case ScalarType.STRING:\n if (json === null)\n return "";\n if (typeof json !== "string") {\n e = "extra whitespace";\n break;\n }\n try {\n encodeURIComponent(json);\n }\n catch (e) {\n e = "invalid UTF8";\n break;\n }\n return json;\n // bytes: JSON value will be the data encoded as a string using standard base64 encoding with paddings.\n // Either standard or URL-safe base64 encoding with/without paddings are accepted.\n case ScalarType.BYTES:\n if (json === null || json === "")\n return new Uint8Array(0);\n if (typeof json !== \'string\')\n break;\n return base64decode(json);\n }\n }\n catch (error) {\n e = error.message;\n }\n this.assert(false, fieldName + (e ? " - " + e : ""), json);\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-json-writer.js\n\n\n\n\n/**\n * Writes proto3 messages in canonical JSON format using reflection\n * information.\n *\n * https://developers.google.com/protocol-buffers/docs/proto3#json\n */\nclass ReflectionJsonWriter {\n constructor(info) {\n var _a;\n this.fields = (_a = info.fields) !== null && _a !== void 0 ? _a : [];\n }\n /**\n * Converts the message to a JSON object, based on the field descriptors.\n */\n write(message, options) {\n const json = {}, source = message;\n for (const field of this.fields) {\n // field is not part of a oneof, simply write as is\n if (!field.oneof) {\n let jsonValue = this.field(field, source[field.localName], options);\n if (jsonValue !== undefined)\n json[options.useProtoFieldName ? field.name : field.jsonName] = jsonValue;\n continue;\n }\n // field is part of a oneof\n const group = source[field.oneof];\n if (group.oneofKind !== field.localName)\n continue; // not selected, skip\n const opt = field.kind == \'scalar\' || field.kind == \'enum\'\n ? Object.assign(Object.assign({}, options), { emitDefaultValues: true }) : options;\n let jsonValue = this.field(field, group[field.localName], opt);\n (0,assert/* assert */.hu)(jsonValue !== undefined);\n json[options.useProtoFieldName ? field.name : field.jsonName] = jsonValue;\n }\n return json;\n }\n field(field, value, options) {\n let jsonValue = undefined;\n if (field.kind == \'map\') {\n (0,assert/* assert */.hu)(typeof value == "object" && value !== null);\n const jsonObj = {};\n switch (field.V.kind) {\n case "scalar":\n for (const [entryKey, entryValue] of Object.entries(value)) {\n const val = this.scalar(field.V.T, entryValue, field.name, false, true);\n (0,assert/* assert */.hu)(val !== undefined);\n jsonObj[entryKey.toString()] = val; // JSON standard allows only (double quoted) string as property key\n }\n break;\n case "message":\n const messageType = field.V.T();\n for (const [entryKey, entryValue] of Object.entries(value)) {\n const val = this.message(messageType, entryValue, field.name, options);\n (0,assert/* assert */.hu)(val !== undefined);\n jsonObj[entryKey.toString()] = val; // JSON standard allows only (double quoted) string as property key\n }\n break;\n case "enum":\n const enumInfo = field.V.T();\n for (const [entryKey, entryValue] of Object.entries(value)) {\n (0,assert/* assert */.hu)(entryValue === undefined || typeof entryValue == \'number\');\n const val = this.enum(enumInfo, entryValue, field.name, false, true, options.enumAsInteger);\n (0,assert/* assert */.hu)(val !== undefined);\n jsonObj[entryKey.toString()] = val; // JSON standard allows only (double quoted) string as property key\n }\n break;\n }\n if (options.emitDefaultValues || Object.keys(jsonObj).length > 0)\n jsonValue = jsonObj;\n }\n else if (field.repeat) {\n (0,assert/* assert */.hu)(Array.isArray(value));\n const jsonArr = [];\n switch (field.kind) {\n case "scalar":\n for (let i = 0; i < value.length; i++) {\n const val = this.scalar(field.T, value[i], field.name, field.opt, true);\n (0,assert/* assert */.hu)(val !== undefined);\n jsonArr.push(val);\n }\n break;\n case "enum":\n const enumInfo = field.T();\n for (let i = 0; i < value.length; i++) {\n (0,assert/* assert */.hu)(value[i] === undefined || typeof value[i] == \'number\');\n const val = this.enum(enumInfo, value[i], field.name, field.opt, true, options.enumAsInteger);\n (0,assert/* assert */.hu)(val !== undefined);\n jsonArr.push(val);\n }\n break;\n case "message":\n const messageType = field.T();\n for (let i = 0; i < value.length; i++) {\n const val = this.message(messageType, value[i], field.name, options);\n (0,assert/* assert */.hu)(val !== undefined);\n jsonArr.push(val);\n }\n break;\n }\n // add converted array to json output\n if (options.emitDefaultValues || jsonArr.length > 0 || options.emitDefaultValues)\n jsonValue = jsonArr;\n }\n else {\n switch (field.kind) {\n case "scalar":\n jsonValue = this.scalar(field.T, value, field.name, field.opt, options.emitDefaultValues);\n break;\n case "enum":\n jsonValue = this.enum(field.T(), value, field.name, field.opt, options.emitDefaultValues, options.enumAsInteger);\n break;\n case "message":\n jsonValue = this.message(field.T(), value, field.name, options);\n break;\n }\n }\n return jsonValue;\n }\n /**\n * Returns `null` as the default for google.protobuf.NullValue.\n */\n enum(type, value, fieldName, optional, emitDefaultValues, enumAsInteger) {\n if (type[0] == \'google.protobuf.NullValue\')\n return !emitDefaultValues && !optional ? undefined : null;\n if (value === undefined) {\n (0,assert/* assert */.hu)(optional);\n return undefined;\n }\n if (value === 0 && !emitDefaultValues && !optional)\n // we require 0 to be default value for all enums\n return undefined;\n (0,assert/* assert */.hu)(typeof value == \'number\');\n (0,assert/* assert */.hu)(Number.isInteger(value));\n if (enumAsInteger || !type[1].hasOwnProperty(value))\n // if we don\'t now the enum value, just return the number\n return value;\n if (type[2])\n // restore the dropped prefix\n return type[2] + type[1][value];\n return type[1][value];\n }\n message(type, value, fieldName, options) {\n if (value === undefined)\n return options.emitDefaultValues ? null : undefined;\n return type.internalJsonWrite(value, options);\n }\n scalar(type, value, fieldName, optional, emitDefaultValues) {\n if (value === undefined) {\n (0,assert/* assert */.hu)(optional);\n return undefined;\n }\n const ed = emitDefaultValues || optional;\n // noinspection FallThroughInSwitchStatementJS\n switch (type) {\n // int32, fixed32, uint32: JSON value will be a decimal number. Either numbers or strings are accepted.\n case ScalarType.INT32:\n case ScalarType.SFIXED32:\n case ScalarType.SINT32:\n if (value === 0)\n return ed ? 0 : undefined;\n (0,assert/* assertInt32 */.ug)(value);\n return value;\n case ScalarType.FIXED32:\n case ScalarType.UINT32:\n if (value === 0)\n return ed ? 0 : undefined;\n (0,assert/* assertUInt32 */.fp)(value);\n return value;\n // float, double: JSON value will be a number or one of the special string values "NaN", "Infinity", and "-Infinity".\n // Either numbers or strings are accepted. Exponent notation is also accepted.\n case ScalarType.FLOAT:\n (0,assert/* assertFloat32 */.E_)(value);\n case ScalarType.DOUBLE:\n if (value === 0)\n return ed ? 0 : undefined;\n (0,assert/* assert */.hu)(typeof value == \'number\');\n if (Number.isNaN(value))\n return \'NaN\';\n if (value === Number.POSITIVE_INFINITY)\n return \'Infinity\';\n if (value === Number.NEGATIVE_INFINITY)\n return \'-Infinity\';\n return value;\n // string:\n case ScalarType.STRING:\n if (value === "")\n return ed ? \'\' : undefined;\n (0,assert/* assert */.hu)(typeof value == \'string\');\n return value;\n // bool:\n case ScalarType.BOOL:\n if (value === false)\n return ed ? false : undefined;\n (0,assert/* assert */.hu)(typeof value == \'boolean\');\n return value;\n // JSON value will be a decimal string. Either numbers or strings are accepted.\n case ScalarType.UINT64:\n case ScalarType.FIXED64:\n (0,assert/* assert */.hu)(typeof value == \'number\' || typeof value == \'string\' || typeof value == \'bigint\');\n let ulong = PbULong.from(value);\n if (ulong.isZero() && !ed)\n return undefined;\n return ulong.toString();\n // JSON value will be a decimal string. Either numbers or strings are accepted.\n case ScalarType.INT64:\n case ScalarType.SFIXED64:\n case ScalarType.SINT64:\n (0,assert/* assert */.hu)(typeof value == \'number\' || typeof value == \'string\' || typeof value == \'bigint\');\n let long = PbLong.from(value);\n if (long.isZero() && !ed)\n return undefined;\n return long.toString();\n // bytes: JSON value will be the data encoded as a string using standard base64 encoding with paddings.\n // Either standard or URL-safe base64 encoding with/without paddings are accepted.\n case ScalarType.BYTES:\n (0,assert/* assert */.hu)(value instanceof Uint8Array);\n if (!value.byteLength)\n return ed ? "" : undefined;\n return base64encode(value);\n }\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-scalar-default.js\n\n\n\n/**\n * Creates the default value for a scalar type.\n */\nfunction reflectionScalarDefault(type, longType = LongType.STRING) {\n switch (type) {\n case ScalarType.BOOL:\n return false;\n case ScalarType.UINT64:\n case ScalarType.FIXED64:\n return reflectionLongConvert(PbULong.ZERO, longType);\n case ScalarType.INT64:\n case ScalarType.SFIXED64:\n case ScalarType.SINT64:\n return reflectionLongConvert(PbLong.ZERO, longType);\n case ScalarType.DOUBLE:\n case ScalarType.FLOAT:\n return 0.0;\n case ScalarType.BYTES:\n return new Uint8Array(0);\n case ScalarType.STRING:\n return "";\n default:\n // case ScalarType.INT32:\n // case ScalarType.UINT32:\n // case ScalarType.SINT32:\n // case ScalarType.FIXED32:\n // case ScalarType.SFIXED32:\n return 0;\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-binary-reader.js\n\n\n\n\n/**\n * Reads proto3 messages in binary format using reflection information.\n *\n * https://developers.google.com/protocol-buffers/docs/encoding\n */\nclass ReflectionBinaryReader {\n constructor(info) {\n this.info = info;\n }\n prepare() {\n var _a;\n if (!this.fieldNoToField) {\n const fieldsInput = (_a = this.info.fields) !== null && _a !== void 0 ? _a : [];\n this.fieldNoToField = new Map(fieldsInput.map(field => [field.no, field]));\n }\n }\n /**\n * Reads a message from binary format into the target message.\n *\n * Repeated fields are appended. Map entries are added, overwriting\n * existing keys.\n *\n * If a message field is already present, it will be merged with the\n * new data.\n */\n read(reader, message, options, length) {\n this.prepare();\n const end = length === undefined ? reader.len : reader.pos + length;\n while (reader.pos < end) {\n // read the tag and find the field\n const [fieldNo, wireType] = reader.tag(), field = this.fieldNoToField.get(fieldNo);\n if (!field) {\n let u = options.readUnknownField;\n if (u == "throw")\n throw new Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.info.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? binary_format_contract/* UnknownFieldHandler */.z.onRead : u)(this.info.typeName, message, fieldNo, wireType, d);\n continue;\n }\n // target object for the field we are reading\n let target = message, repeated = field.repeat, localName = field.localName;\n // if field is member of oneof ADT, use ADT as target\n if (field.oneof) {\n target = target[field.oneof];\n // if other oneof member selected, set new ADT\n if (target.oneofKind !== localName)\n target = message[field.oneof] = {\n oneofKind: localName\n };\n }\n // we have handled oneof above, we just have read the value into `target[localName]`\n switch (field.kind) {\n case "scalar":\n case "enum":\n let T = field.kind == "enum" ? ScalarType.INT32 : field.T;\n let L = field.kind == "scalar" ? field.L : undefined;\n if (repeated) {\n let arr = target[localName]; // safe to assume presence of array, oneof cannot contain repeated values\n if (wireType == binary_format_contract/* WireType */.TD.LengthDelimited && T != ScalarType.STRING && T != ScalarType.BYTES) {\n let e = reader.uint32() + reader.pos;\n while (reader.pos < e)\n arr.push(this.scalar(reader, T, L));\n }\n else\n arr.push(this.scalar(reader, T, L));\n }\n else\n target[localName] = this.scalar(reader, T, L);\n break;\n case "message":\n if (repeated) {\n let arr = target[localName]; // safe to assume presence of array, oneof cannot contain repeated values\n let msg = field.T().internalBinaryRead(reader, reader.uint32(), options);\n arr.push(msg);\n }\n else\n target[localName] = field.T().internalBinaryRead(reader, reader.uint32(), options, target[localName]);\n break;\n case "map":\n let [mapKey, mapVal] = this.mapEntry(field, reader, options);\n // safe to assume presence of map object, oneof cannot contain repeated values\n target[localName][mapKey] = mapVal;\n break;\n }\n }\n }\n /**\n * Read a map field, expecting key field = 1, value field = 2\n */\n mapEntry(field, reader, options) {\n let length = reader.uint32();\n let end = reader.pos + length;\n let key = undefined; // javascript only allows number or string for object properties\n let val = undefined;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case 1:\n if (field.K == ScalarType.BOOL)\n key = reader.bool().toString();\n else\n // long types are read as string, number types are okay as number\n key = this.scalar(reader, field.K, LongType.STRING);\n break;\n case 2:\n switch (field.V.kind) {\n case "scalar":\n val = this.scalar(reader, field.V.T, field.V.L);\n break;\n case "enum":\n val = reader.int32();\n break;\n case "message":\n val = field.V.T().internalBinaryRead(reader, reader.uint32(), options);\n break;\n }\n break;\n default:\n throw new Error(`Unknown field ${fieldNo} (wire type ${wireType}) in map entry for ${this.info.typeName}#${field.name}`);\n }\n }\n if (key === undefined) {\n let keyRaw = reflectionScalarDefault(field.K);\n key = field.K == ScalarType.BOOL ? keyRaw.toString() : keyRaw;\n }\n if (val === undefined)\n switch (field.V.kind) {\n case "scalar":\n val = reflectionScalarDefault(field.V.T, field.V.L);\n break;\n case "enum":\n val = 0;\n break;\n case "message":\n val = field.V.T().create();\n break;\n }\n return [key, val];\n }\n scalar(reader, type, longType) {\n switch (type) {\n case ScalarType.INT32:\n return reader.int32();\n case ScalarType.STRING:\n return reader.string();\n case ScalarType.BOOL:\n return reader.bool();\n case ScalarType.DOUBLE:\n return reader.double();\n case ScalarType.FLOAT:\n return reader.float();\n case ScalarType.INT64:\n return reflectionLongConvert(reader.int64(), longType);\n case ScalarType.UINT64:\n return reflectionLongConvert(reader.uint64(), longType);\n case ScalarType.FIXED64:\n return reflectionLongConvert(reader.fixed64(), longType);\n case ScalarType.FIXED32:\n return reader.fixed32();\n case ScalarType.BYTES:\n return reader.bytes();\n case ScalarType.UINT32:\n return reader.uint32();\n case ScalarType.SFIXED32:\n return reader.sfixed32();\n case ScalarType.SFIXED64:\n return reflectionLongConvert(reader.sfixed64(), longType);\n case ScalarType.SINT32:\n return reader.sint32();\n case ScalarType.SINT64:\n return reflectionLongConvert(reader.sint64(), longType);\n }\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-binary-writer.js\n\n\n\n\n/**\n * Writes proto3 messages in binary format using reflection information.\n *\n * https://developers.google.com/protocol-buffers/docs/encoding\n */\nclass ReflectionBinaryWriter {\n constructor(info) {\n this.info = info;\n }\n prepare() {\n if (!this.fields) {\n const fieldsInput = this.info.fields ? this.info.fields.concat() : [];\n this.fields = fieldsInput.sort((a, b) => a.no - b.no);\n }\n }\n /**\n * Writes the message to binary format.\n */\n write(message, writer, options) {\n this.prepare();\n for (const field of this.fields) {\n let value, // this will be our field value, whether it is member of a oneof or not\n emitDefault, // whether we emit the default value (only true for oneof members)\n repeated = field.repeat, localName = field.localName;\n // handle oneof ADT\n if (field.oneof) {\n const group = message[field.oneof];\n if (group.oneofKind !== localName)\n continue; // if field is not selected, skip\n value = group[localName];\n emitDefault = true;\n }\n else {\n value = message[localName];\n emitDefault = false;\n }\n // we have handled oneof above. we just have to honor `emitDefault`.\n switch (field.kind) {\n case "scalar":\n case "enum":\n let T = field.kind == "enum" ? ScalarType.INT32 : field.T;\n if (repeated) {\n (0,assert/* assert */.hu)(Array.isArray(value));\n if (repeated == RepeatType.PACKED)\n this.packed(writer, T, field.no, value);\n else\n for (const item of value)\n this.scalar(writer, T, field.no, item, true);\n }\n else if (value === undefined)\n (0,assert/* assert */.hu)(field.opt);\n else\n this.scalar(writer, T, field.no, value, emitDefault || field.opt);\n break;\n case "message":\n if (repeated) {\n (0,assert/* assert */.hu)(Array.isArray(value));\n for (const item of value)\n this.message(writer, options, field.T(), field.no, item);\n }\n else {\n this.message(writer, options, field.T(), field.no, value);\n }\n break;\n case "map":\n (0,assert/* assert */.hu)(typeof value == \'object\' && value !== null);\n for (const [key, val] of Object.entries(value))\n this.mapEntry(writer, options, field, key, val);\n break;\n }\n }\n let u = options.writeUnknownFields;\n if (u !== false)\n (u === true ? binary_format_contract/* UnknownFieldHandler */.z.onWrite : u)(this.info.typeName, message, writer);\n }\n mapEntry(writer, options, field, key, value) {\n writer.tag(field.no, binary_format_contract/* WireType */.TD.LengthDelimited);\n writer.fork();\n // javascript only allows number or string for object properties\n // we convert from our representation to the protobuf type\n let keyValue = key;\n switch (field.K) {\n case ScalarType.INT32:\n case ScalarType.FIXED32:\n case ScalarType.UINT32:\n case ScalarType.SFIXED32:\n case ScalarType.SINT32:\n keyValue = Number.parseInt(key);\n break;\n case ScalarType.BOOL:\n (0,assert/* assert */.hu)(key == \'true\' || key == \'false\');\n keyValue = key == \'true\';\n break;\n }\n // write key, expecting key field number = 1\n this.scalar(writer, field.K, 1, keyValue, true);\n // write value, expecting value field number = 2\n switch (field.V.kind) {\n case \'scalar\':\n this.scalar(writer, field.V.T, 2, value, true);\n break;\n case \'enum\':\n this.scalar(writer, ScalarType.INT32, 2, value, true);\n break;\n case \'message\':\n this.message(writer, options, field.V.T(), 2, value);\n break;\n }\n writer.join();\n }\n message(writer, options, handler, fieldNo, value) {\n if (value === undefined)\n return;\n handler.internalBinaryWrite(value, writer.tag(fieldNo, binary_format_contract/* WireType */.TD.LengthDelimited).fork(), options);\n writer.join();\n }\n /**\n * Write a single scalar value.\n */\n scalar(writer, type, fieldNo, value, emitDefault) {\n let [wireType, method, isDefault] = this.scalarInfo(type, value);\n if (!isDefault || emitDefault) {\n writer.tag(fieldNo, wireType);\n writer[method](value);\n }\n }\n /**\n * Write an array of scalar values in packed format.\n */\n packed(writer, type, fieldNo, value) {\n if (!value.length)\n return;\n (0,assert/* assert */.hu)(type !== ScalarType.BYTES && type !== ScalarType.STRING);\n // write tag\n writer.tag(fieldNo, binary_format_contract/* WireType */.TD.LengthDelimited);\n // begin length-delimited\n writer.fork();\n // write values without tags\n let [, method,] = this.scalarInfo(type);\n for (let i = 0; i < value.length; i++)\n writer[method](value[i]);\n // end length delimited\n writer.join();\n }\n /**\n * Get information for writing a scalar value.\n *\n * Returns tuple:\n * [0]: appropriate WireType\n * [1]: name of the appropriate method of IBinaryWriter\n * [2]: whether the given value is a default value\n *\n * If argument `value` is omitted, [2] is always false.\n */\n scalarInfo(type, value) {\n let t = binary_format_contract/* WireType */.TD.Varint;\n let m;\n let i = value === undefined;\n let d = value === 0;\n switch (type) {\n case ScalarType.INT32:\n m = "int32";\n break;\n case ScalarType.STRING:\n d = i || !value.length;\n t = binary_format_contract/* WireType */.TD.LengthDelimited;\n m = "string";\n break;\n case ScalarType.BOOL:\n d = value === false;\n m = "bool";\n break;\n case ScalarType.UINT32:\n m = "uint32";\n break;\n case ScalarType.DOUBLE:\n t = binary_format_contract/* WireType */.TD.Bit64;\n m = "double";\n break;\n case ScalarType.FLOAT:\n t = binary_format_contract/* WireType */.TD.Bit32;\n m = "float";\n break;\n case ScalarType.INT64:\n d = i || PbLong.from(value).isZero();\n m = "int64";\n break;\n case ScalarType.UINT64:\n d = i || PbULong.from(value).isZero();\n m = "uint64";\n break;\n case ScalarType.FIXED64:\n d = i || PbULong.from(value).isZero();\n t = binary_format_contract/* WireType */.TD.Bit64;\n m = "fixed64";\n break;\n case ScalarType.BYTES:\n d = i || !value.byteLength;\n t = binary_format_contract/* WireType */.TD.LengthDelimited;\n m = "bytes";\n break;\n case ScalarType.FIXED32:\n t = binary_format_contract/* WireType */.TD.Bit32;\n m = "fixed32";\n break;\n case ScalarType.SFIXED32:\n t = binary_format_contract/* WireType */.TD.Bit32;\n m = "sfixed32";\n break;\n case ScalarType.SFIXED64:\n d = i || PbLong.from(value).isZero();\n t = binary_format_contract/* WireType */.TD.Bit64;\n m = "sfixed64";\n break;\n case ScalarType.SINT32:\n m = "sint32";\n break;\n case ScalarType.SINT64:\n d = i || PbLong.from(value).isZero();\n m = "sint64";\n break;\n }\n return [t, m, i || d];\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-create.js\n\n\n/**\n * Creates an instance of the generic message, using the field\n * information.\n */\nfunction reflectionCreate(type) {\n /**\n * This ternary can be removed in the next major version.\n * The `Object.create()` code path utilizes a new `messagePrototype`\n * property on the `IMessageType` which has this same `MESSAGE_TYPE`\n * non-enumerable property on it. Doing it this way means that we only\n * pay the cost of `Object.defineProperty()` once per `IMessageType`\n * class of once per "instance". The falsy code path is only provided\n * for backwards compatibility in cases where the runtime library is\n * updated without also updating the generated code.\n */\n const msg = type.messagePrototype\n ? Object.create(type.messagePrototype)\n : Object.defineProperty({}, MESSAGE_TYPE, { value: type });\n for (let field of type.fields) {\n let name = field.localName;\n if (field.opt)\n continue;\n if (field.oneof)\n msg[field.oneof] = { oneofKind: undefined };\n else if (field.repeat)\n msg[name] = [];\n else\n switch (field.kind) {\n case "scalar":\n msg[name] = reflectionScalarDefault(field.T, field.L);\n break;\n case "enum":\n // we require 0 to be default value for all enums\n msg[name] = 0;\n break;\n case "map":\n msg[name] = {};\n break;\n }\n }\n return msg;\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-merge-partial.js\n/**\n * Copy partial data into the target message.\n *\n * If a singular scalar or enum field is present in the source, it\n * replaces the field in the target.\n *\n * If a singular message field is present in the source, it is merged\n * with the target field by calling mergePartial() of the responsible\n * message type.\n *\n * If a repeated field is present in the source, its values replace\n * all values in the target array, removing extraneous values.\n * Repeated message fields are copied, not merged.\n *\n * If a map field is present in the source, entries are added to the\n * target map, replacing entries with the same key. Entries that only\n * exist in the target remain. Entries with message values are copied,\n * not merged.\n *\n * Note that this function differs from protobuf merge semantics,\n * which appends repeated fields.\n */\nfunction reflectionMergePartial(info, target, source) {\n let fieldValue, // the field value we are working with\n input = source, output; // where we want our field value to go\n for (let field of info.fields) {\n let name = field.localName;\n if (field.oneof) {\n const group = input[field.oneof]; // this is the oneof`s group in the source\n if ((group === null || group === void 0 ? void 0 : group.oneofKind) == undefined) { // the user is free to omit\n continue; // we skip this field, and all other members too\n }\n fieldValue = group[name]; // our value comes from the the oneof group of the source\n output = target[field.oneof]; // and our output is the oneof group of the target\n output.oneofKind = group.oneofKind; // always update discriminator\n if (fieldValue == undefined) {\n delete output[name]; // remove any existing value\n continue; // skip further work on field\n }\n }\n else {\n fieldValue = input[name]; // we are using the source directly\n output = target; // we want our field value to go directly into the target\n if (fieldValue == undefined) {\n continue; // skip further work on field, existing value is used as is\n }\n }\n if (field.repeat)\n output[name].length = fieldValue.length; // resize target array to match source array\n // now we just work with `fieldValue` and `output` to merge the value\n switch (field.kind) {\n case "scalar":\n case "enum":\n if (field.repeat)\n for (let i = 0; i < fieldValue.length; i++)\n output[name][i] = fieldValue[i]; // not a reference type\n else\n output[name] = fieldValue; // not a reference type\n break;\n case "message":\n let T = field.T();\n if (field.repeat)\n for (let i = 0; i < fieldValue.length; i++)\n output[name][i] = T.create(fieldValue[i]);\n else if (output[name] === undefined)\n output[name] = T.create(fieldValue); // nothing to merge with\n else\n T.mergePartial(output[name], fieldValue);\n break;\n case "map":\n // Map and repeated fields are simply overwritten, not appended or merged\n switch (field.V.kind) {\n case "scalar":\n case "enum":\n Object.assign(output[name], fieldValue); // elements are not reference types\n break;\n case "message":\n let T = field.V.T();\n for (let k of Object.keys(fieldValue))\n output[name][k] = T.create(fieldValue[k]);\n break;\n }\n break;\n }\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-equals.js\n\n/**\n * Determines whether two message of the same type have the same field values.\n * Checks for deep equality, traversing repeated fields, oneof groups, maps\n * and messages recursively.\n * Will also return true if both messages are `undefined`.\n */\nfunction reflectionEquals(info, a, b) {\n if (a === b)\n return true;\n if (!a || !b)\n return false;\n for (let field of info.fields) {\n let localName = field.localName;\n let val_a = field.oneof ? a[field.oneof][localName] : a[localName];\n let val_b = field.oneof ? b[field.oneof][localName] : b[localName];\n switch (field.kind) {\n case "enum":\n case "scalar":\n let t = field.kind == "enum" ? ScalarType.INT32 : field.T;\n if (!(field.repeat\n ? repeatedPrimitiveEq(t, val_a, val_b)\n : primitiveEq(t, val_a, val_b)))\n return false;\n break;\n case "map":\n if (!(field.V.kind == "message"\n ? repeatedMsgEq(field.V.T(), objectValues(val_a), objectValues(val_b))\n : repeatedPrimitiveEq(field.V.kind == "enum" ? ScalarType.INT32 : field.V.T, objectValues(val_a), objectValues(val_b))))\n return false;\n break;\n case "message":\n let T = field.T();\n if (!(field.repeat\n ? repeatedMsgEq(T, val_a, val_b)\n : T.equals(val_a, val_b)))\n return false;\n break;\n }\n }\n return true;\n}\nconst objectValues = Object.values;\nfunction primitiveEq(type, a, b) {\n if (a === b)\n return true;\n if (type !== ScalarType.BYTES)\n return false;\n let ba = a;\n let bb = b;\n if (ba.length !== bb.length)\n return false;\n for (let i = 0; i < ba.length; i++)\n if (ba[i] != bb[i])\n return false;\n return true;\n}\nfunction repeatedPrimitiveEq(type, a, b) {\n if (a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++)\n if (!primitiveEq(type, a[i], b[i]))\n return false;\n return true;\n}\nfunction repeatedMsgEq(type, a, b) {\n if (a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++)\n if (!type.equals(a[i], b[i]))\n return false;\n return true;\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/message-type.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * This standard message type provides reflection-based\n * operations to work with a message.\n */\nclass MessageType {\n constructor(name, fields, options) {\n this.defaultCheckDepth = 16;\n this.typeName = name;\n this.fields = fields.map(normalizeFieldInfo);\n this.options = options !== null && options !== void 0 ? options : {};\n this.messagePrototype = Object.defineProperty({}, MESSAGE_TYPE, { value: this });\n this.refTypeCheck = new ReflectionTypeCheck(this);\n this.refJsonReader = new ReflectionJsonReader(this);\n this.refJsonWriter = new ReflectionJsonWriter(this);\n this.refBinReader = new ReflectionBinaryReader(this);\n this.refBinWriter = new ReflectionBinaryWriter(this);\n }\n create(value) {\n let message = reflectionCreate(this);\n if (value !== undefined) {\n reflectionMergePartial(this, message, value);\n }\n return message;\n }\n /**\n * Clone the message.\n *\n * Unknown fields are discarded.\n */\n clone(message) {\n let copy = this.create();\n reflectionMergePartial(this, copy, message);\n return copy;\n }\n /**\n * Determines whether two message of the same type have the same field values.\n * Checks for deep equality, traversing repeated fields, oneof groups, maps\n * and messages recursively.\n * Will also return true if both messages are `undefined`.\n */\n equals(a, b) {\n return reflectionEquals(this, a, b);\n }\n /**\n * Is the given value assignable to our message type\n * and contains no [excess properties](https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks)?\n */\n is(arg, depth = this.defaultCheckDepth) {\n return this.refTypeCheck.is(arg, depth, false);\n }\n /**\n * Is the given value assignable to our message type,\n * regardless of [excess properties](https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks)?\n */\n isAssignable(arg, depth = this.defaultCheckDepth) {\n return this.refTypeCheck.is(arg, depth, true);\n }\n /**\n * Copy partial data into the target message.\n */\n mergePartial(target, source) {\n reflectionMergePartial(this, target, source);\n }\n /**\n * Create a new message from binary format.\n */\n fromBinary(data, options) {\n let opt = binaryReadOptions(options);\n return this.internalBinaryRead(opt.readerFactory(data), data.byteLength, opt);\n }\n /**\n * Read a new message from a JSON value.\n */\n fromJson(json, options) {\n return this.internalJsonRead(json, (0,json_format_contract/* jsonReadOptions */.jl)(options));\n }\n /**\n * Read a new message from a JSON string.\n * This is equivalent to `T.fromJson(JSON.parse(json))`.\n */\n fromJsonString(json, options) {\n let value = JSON.parse(json);\n return this.fromJson(value, options);\n }\n /**\n * Write the message to canonical JSON value.\n */\n toJson(message, options) {\n return this.internalJsonWrite(message, (0,json_format_contract/* jsonWriteOptions */.P2)(options));\n }\n /**\n * Convert the message to canonical JSON string.\n * This is equivalent to `JSON.stringify(T.toJson(t))`\n */\n toJsonString(message, options) {\n var _a;\n let value = this.toJson(message, options);\n return JSON.stringify(value, null, (_a = options === null || options === void 0 ? void 0 : options.prettySpaces) !== null && _a !== void 0 ? _a : 0);\n }\n /**\n * Write the message to binary format.\n */\n toBinary(message, options) {\n let opt = binaryWriteOptions(options);\n return this.internalBinaryWrite(message, opt.writerFactory(), opt).finish();\n }\n /**\n * This is an internal method. If you just want to read a message from\n * JSON, use `fromJson()` or `fromJsonString()`.\n *\n * Reads JSON value and merges the fields into the target\n * according to protobuf rules. If the target is omitted,\n * a new instance is created first.\n */\n internalJsonRead(json, options, target) {\n if (json !== null && typeof json == "object" && !Array.isArray(json)) {\n let message = target !== null && target !== void 0 ? target : this.create();\n this.refJsonReader.read(json, message, options);\n return message;\n }\n throw new Error(`Unable to parse message ${this.typeName} from JSON ${typeofJsonValue(json)}.`);\n }\n /**\n * This is an internal method. If you just want to write a message\n * to JSON, use `toJson()` or `toJsonString().\n *\n * Writes JSON value and returns it.\n */\n internalJsonWrite(message, options) {\n return this.refJsonWriter.write(message, options);\n }\n /**\n * This is an internal method. If you just want to write a message\n * in binary format, use `toBinary()`.\n *\n * Serializes the message in binary format and appends it to the given\n * writer. Returns passed writer.\n */\n internalBinaryWrite(message, writer, options) {\n this.refBinWriter.write(message, writer, options);\n return writer;\n }\n /**\n * This is an internal method. If you just want to read a message from\n * binary data, use `fromBinary()`.\n *\n * Reads data from binary format and merges the fields into\n * the target according to protobuf rules. If the target is\n * omitted, a new instance is created first.\n */\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create();\n this.refBinReader.read(reader, message, options, length);\n return message;\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-contains-message-type.js\n\n/**\n * Check if the provided object is a proto message.\n *\n * Note that this is an experimental feature - it is here to stay, but\n * implementation details may change without notice.\n */\nfunction containsMessageType(msg) {\n return msg[MESSAGE_TYPE] != null;\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/enum-object.js\n/**\n * Is this a lookup object generated by Typescript, for a Typescript enum\n * generated by protobuf-ts?\n *\n * - No `const enum` (enum must not be inlined, we need reverse mapping).\n * - No string enum (we need int32 for protobuf).\n * - Must have a value for 0 (otherwise, we would need to support custom default values).\n */\nfunction isEnumObject(arg) {\n if (typeof arg != \'object\' || arg === null) {\n return false;\n }\n if (!arg.hasOwnProperty(0)) {\n return false;\n }\n for (let k of Object.keys(arg)) {\n let num = parseInt(k);\n if (!Number.isNaN(num)) {\n // is there a name for the number?\n let nam = arg[num];\n if (nam === undefined)\n return false;\n // does the name resolve back to the number?\n if (arg[nam] !== num)\n return false;\n }\n else {\n // is there a number for the name?\n let num = arg[k];\n if (num === undefined)\n return false;\n // is it a string enum?\n if (typeof num !== \'number\')\n return false;\n // do we know the number?\n if (arg[num] === undefined)\n return false;\n }\n }\n return true;\n}\n/**\n * Lists all values of a Typescript enum, as an array of objects with a "name"\n * property and a "number" property.\n *\n * Note that it is possible that a number appears more than once, because it is\n * possible to have aliases in an enum.\n *\n * Throws if the enum does not adhere to the rules of enums generated by\n * protobuf-ts. See `isEnumObject()`.\n */\nfunction listEnumValues(enumObject) {\n if (!isEnumObject(enumObject))\n throw new Error("not a typescript enum object");\n let values = [];\n for (let [name, number] of Object.entries(enumObject))\n if (typeof number == "number")\n values.push({ name, number });\n return values;\n}\n/**\n * Lists the names of a Typescript enum.\n *\n * Throws if the enum does not adhere to the rules of enums generated by\n * protobuf-ts. See `isEnumObject()`.\n */\nfunction listEnumNames(enumObject) {\n return listEnumValues(enumObject).map(val => val.name);\n}\n/**\n * Lists the numbers of a Typescript enum.\n *\n * Throws if the enum does not adhere to the rules of enums generated by\n * protobuf-ts. See `isEnumObject()`.\n */\nfunction listEnumNumbers(enumObject) {\n return listEnumValues(enumObject)\n .map(val => val.number)\n .filter((num, index, arr) => arr.indexOf(num) == index);\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/index.js\n// Public API of the protobuf-ts runtime.\n// Note: we do not use `export * from ...` to help tree shakers,\n// webpack verbose output hints that this should be useful\n// Convenience JSON typings and corresponding type guards\n\n// Base 64 encoding\n\n// UTF8 encoding\n\n// Binary format contracts, options for reading and writing, for example\n\n// Standard IBinaryReader implementation\n\n// Standard IBinaryWriter implementation\n\n// Int64 and UInt64 implementations required for the binary format\n\n// JSON format contracts, options for reading and writing, for example\n\n// Message type contract\n\n// Message type implementation via reflection\n\n// Reflection info, generated by the plugin, exposed to the user, used by reflection ops\n\n// Message operations via reflection\n\n\n\n\n\n\n\n\n\n\n// Oneof helpers\n\n// Enum object type guard and reflection util, may be interesting to the user.\n\n// lowerCamelCase() is exported for plugin, rpc-runtime and other rpc packages\n\n// assertion functions are exported for plugin, may also be useful to user\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTEwMi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7OztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixxQkFBcUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBLFdBQVc7QUFDWCxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTREO0FBQzVELHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQ7QUFDNUQscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0Esd0JBQXdCLFlBQVk7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsYUFBYTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1Asb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixPQUFPO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixzQ0FBc0M7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hRK0Q7QUFDL0Q7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3RKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4R3lEO0FBQ2xCO0FBQ3ZDO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsY0FBYztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTs7O0FDL0VBO0FBQ0E7QUFDQTtBQUNBO0FBQytEO0FBQy9EO0FBQ3NEO0FBQ3REO0FBQzZDO0FBQzdDO0FBQzhGO0FBQzlGO0FBQ2tFO0FBQ2xFO0FBQ21FO0FBQ25FO0FBQzRDO0FBQzVDO0FBQzZGO0FBQzdGO0FBQ3VEO0FBQ3ZEO0FBQzZDO0FBQzdDO0FBQytJO0FBQy9JO0FBQzhEO0FBQ1A7QUFDZTtBQUNGO0FBQ2I7QUFDYTtBQUNBO0FBQ0o7QUFDQTtBQUNTO0FBQ3pFO0FBQzZHO0FBQzdHO0FBQzZGO0FBQzdGO0FBQ29EO0FBQ3BEO0FBQ3lGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L2pzb24tdHlwaW5ncy5qcz8yYmRiIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9iYXNlNjQuanM/YTZlNSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvcHJvdG9idWZqcy11dGY4LmpzPzAwNWQiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L2dvb2ctdmFyaW50LmpzPzIzNDUiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L3BiLWxvbmcuanM/YzhiOSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvYmluYXJ5LXJlYWRlci5qcz81NDYwIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9iaW5hcnktd3JpdGVyLmpzPzRkMTQiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L21lc3NhZ2UtdHlwZS1jb250cmFjdC5qcz80Y2RkIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLWluZm8uanM/NWM4ZSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvb25lb2YuanM/N2EzYiIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvcmVmbGVjdGlvbi10eXBlLWNoZWNrLmpzP2M5OGQiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L3JlZmxlY3Rpb24tbG9uZy1jb252ZXJ0LmpzPzNmNDEiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L3JlZmxlY3Rpb24tanNvbi1yZWFkZXIuanM/MzFmYSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvcmVmbGVjdGlvbi1qc29uLXdyaXRlci5qcz82ZGI4Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLXNjYWxhci1kZWZhdWx0LmpzP2RhZGMiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L3JlZmxlY3Rpb24tYmluYXJ5LXJlYWRlci5qcz81YTBlIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLWJpbmFyeS13cml0ZXIuanM/NWY1NyIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvcmVmbGVjdGlvbi1jcmVhdGUuanM/NTgxNSIsIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvcmVmbGVjdGlvbi1tZXJnZS1wYXJ0aWFsLmpzPzllOGQiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L3JlZmxlY3Rpb24tZXF1YWxzLmpzP2NkNzUiLCJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L21lc3NhZ2UtdHlwZS5qcz9jODE5Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLWNvbnRhaW5zLW1lc3NhZ2UtdHlwZS5qcz9mODQ3Iiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9lbnVtLW9iamVjdC5qcz80MjgyIiwid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9pbmRleC5qcz8zY2ZkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2V0IHRoZSB0eXBlIG9mIGEgSlNPTiB2YWx1ZS5cbiAqIERpc3Rpbmd1aXNoZXMgYmV0d2VlbiBhcnJheSwgbnVsbCBhbmQgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZW9mSnNvblZhbHVlKHZhbHVlKSB7XG4gICAgbGV0IHQgPSB0eXBlb2YgdmFsdWU7XG4gICAgaWYgKHQgPT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgICAgICByZXR1cm4gXCJhcnJheVwiO1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgfVxuICAgIHJldHVybiB0O1xufVxuLyoqXG4gKiBJcyB0aGlzIGEgSlNPTiBvYmplY3QgKGluc3RlYWQgb2YgYW4gYXJyYXkgb3IgbnVsbCk/XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0pzb25PYmplY3QodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuIiwiLy8gbG9va3VwIHRhYmxlIGZyb20gYmFzZTY0IGNoYXJhY3RlciB0byBieXRlXG5sZXQgZW5jVGFibGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLycuc3BsaXQoJycpO1xuLy8gbG9va3VwIHRhYmxlIGZyb20gYmFzZTY0IGNoYXJhY3RlciAqY29kZSogdG8gYnl0ZSBiZWNhdXNlIGxvb2t1cCBieSBudW1iZXIgaXMgZmFzdFxubGV0IGRlY1RhYmxlID0gW107XG5mb3IgKGxldCBpID0gMDsgaSA8IGVuY1RhYmxlLmxlbmd0aDsgaSsrKVxuICAgIGRlY1RhYmxlW2VuY1RhYmxlW2ldLmNoYXJDb2RlQXQoMCldID0gaTtcbi8vIHN1cHBvcnQgYmFzZTY0dXJsIHZhcmlhbnRzXG5kZWNUYWJsZVtcIi1cIi5jaGFyQ29kZUF0KDApXSA9IGVuY1RhYmxlLmluZGV4T2YoXCIrXCIpO1xuZGVjVGFibGVbXCJfXCIuY2hhckNvZGVBdCgwKV0gPSBlbmNUYWJsZS5pbmRleE9mKFwiL1wiKTtcbi8qKlxuICogRGVjb2RlcyBhIGJhc2U2NCBzdHJpbmcgdG8gYSBieXRlIGFycmF5LlxuICpcbiAqIC0gaWdub3JlcyB3aGl0ZS1zcGFjZSwgaW5jbHVkaW5nIGxpbmUgYnJlYWtzIGFuZCB0YWJzXG4gKiAtIGFsbG93cyBpbm5lciBwYWRkaW5nIChjYW4gZGVjb2RlIGNvbmNhdGVuYXRlZCBiYXNlNjQgc3RyaW5ncylcbiAqIC0gZG9lcyBub3QgcmVxdWlyZSBwYWRkaW5nXG4gKiAtIHVuZGVyc3RhbmRzIGJhc2U2NHVybCBlbmNvZGluZzpcbiAqICAgXCItXCIgaW5zdGVhZCBvZiBcIitcIixcbiAqICAgXCJfXCIgaW5zdGVhZCBvZiBcIi9cIixcbiAqICAgbm8gcGFkZGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0ZGVjb2RlKGJhc2U2NFN0cikge1xuICAgIC8vIGVzdGltYXRlIGJ5dGUgc2l6ZSwgbm90IGFjY291bnRpbmcgZm9yIGlubmVyIHBhZGRpbmcgYW5kIHdoaXRlc3BhY2VcbiAgICBsZXQgZXMgPSBiYXNlNjRTdHIubGVuZ3RoICogMyAvIDQ7XG4gICAgLy8gaWYgKGVzICUgMyAhPT0gMClcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYmFzZTY0IHN0cmluZycpO1xuICAgIGlmIChiYXNlNjRTdHJbYmFzZTY0U3RyLmxlbmd0aCAtIDJdID09ICc9JylcbiAgICAgICAgZXMgLT0gMjtcbiAgICBlbHNlIGlmIChiYXNlNjRTdHJbYmFzZTY0U3RyLmxlbmd0aCAtIDFdID09ICc9JylcbiAgICAgICAgZXMgLT0gMTtcbiAgICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheShlcyksIGJ5dGVQb3MgPSAwLCAvLyBwb3NpdGlvbiBpbiBieXRlIGFycmF5XG4gICAgZ3JvdXBQb3MgPSAwLCAvLyBwb3NpdGlvbiBpbiBiYXNlNjQgZ3JvdXBcbiAgICBiLCAvLyBjdXJyZW50IGJ5dGVcbiAgICBwID0gMCAvLyBwcmV2aW91cyBieXRlXG4gICAgO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmFzZTY0U3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGIgPSBkZWNUYWJsZVtiYXNlNjRTdHIuY2hhckNvZGVBdChpKV07XG4gICAgICAgIGlmIChiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIG5vaW5zcGVjdGlvbiBGYWxsVGhyb3VnaEluU3dpdGNoU3RhdGVtZW50SlNcbiAgICAgICAgICAgIHN3aXRjaCAoYmFzZTY0U3RyW2ldKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnPSc6XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwUG9zID0gMDsgLy8gcmVzZXQgc3RhdGUgd2hlbiBwYWRkaW5nIGZvdW5kXG4gICAgICAgICAgICAgICAgY2FzZSAnXFxuJzpcbiAgICAgICAgICAgICAgICBjYXNlICdcXHInOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1xcdCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIHdoaXRlLXNwYWNlLCBhbmQgcGFkZGluZ1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBpbnZhbGlkIGJhc2U2NCBzdHJpbmcuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChncm91cFBvcykge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHAgPSBiO1xuICAgICAgICAgICAgICAgIGdyb3VwUG9zID0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBieXRlc1tieXRlUG9zKytdID0gcCA8PCAyIHwgKGIgJiA0OCkgPj4gNDtcbiAgICAgICAgICAgICAgICBwID0gYjtcbiAgICAgICAgICAgICAgICBncm91cFBvcyA9IDI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgYnl0ZXNbYnl0ZVBvcysrXSA9IChwICYgMTUpIDw8IDQgfCAoYiAmIDYwKSA+PiAyO1xuICAgICAgICAgICAgICAgIHAgPSBiO1xuICAgICAgICAgICAgICAgIGdyb3VwUG9zID0gMztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICBieXRlc1tieXRlUG9zKytdID0gKHAgJiAzKSA8PCA2IHwgYjtcbiAgICAgICAgICAgICAgICBncm91cFBvcyA9IDA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGdyb3VwUG9zID09IDEpXG4gICAgICAgIHRocm93IEVycm9yKGBpbnZhbGlkIGJhc2U2NCBzdHJpbmcuYCk7XG4gICAgcmV0dXJuIGJ5dGVzLnN1YmFycmF5KDAsIGJ5dGVQb3MpO1xufVxuLyoqXG4gKiBFbmNvZGVzIGEgYnl0ZSBhcnJheSB0byBhIGJhc2U2NCBzdHJpbmcuXG4gKiBBZGRzIHBhZGRpbmcgYXQgdGhlIGVuZC5cbiAqIERvZXMgbm90IGluc2VydCBuZXdsaW5lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NGVuY29kZShieXRlcykge1xuICAgIGxldCBiYXNlNjQgPSAnJywgZ3JvdXBQb3MgPSAwLCAvLyBwb3NpdGlvbiBpbiBiYXNlNjQgZ3JvdXBcbiAgICBiLCAvLyBjdXJyZW50IGJ5dGVcbiAgICBwID0gMDsgLy8gY2Fycnkgb3ZlciBmcm9tIHByZXZpb3VzIGJ5dGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGIgPSBieXRlc1tpXTtcbiAgICAgICAgc3dpdGNoIChncm91cFBvcykge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGJhc2U2NCArPSBlbmNUYWJsZVtiID4+IDJdO1xuICAgICAgICAgICAgICAgIHAgPSAoYiAmIDMpIDw8IDQ7XG4gICAgICAgICAgICAgICAgZ3JvdXBQb3MgPSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGJhc2U2NCArPSBlbmNUYWJsZVtwIHwgYiA+PiA0XTtcbiAgICAgICAgICAgICAgICBwID0gKGIgJiAxNSkgPDwgMjtcbiAgICAgICAgICAgICAgICBncm91cFBvcyA9IDI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgYmFzZTY0ICs9IGVuY1RhYmxlW3AgfCBiID4+IDZdO1xuICAgICAgICAgICAgICAgIGJhc2U2NCArPSBlbmNUYWJsZVtiICYgNjNdO1xuICAgICAgICAgICAgICAgIGdyb3VwUG9zID0gMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBwYWRkaW5nIHJlcXVpcmVkP1xuICAgIGlmIChncm91cFBvcykge1xuICAgICAgICBiYXNlNjQgKz0gZW5jVGFibGVbcF07XG4gICAgICAgIGJhc2U2NCArPSAnPSc7XG4gICAgICAgIGlmIChncm91cFBvcyA9PSAxKVxuICAgICAgICAgICAgYmFzZTY0ICs9ICc9JztcbiAgICB9XG4gICAgcmV0dXJuIGJhc2U2NDtcbn1cbiIsIi8vIENvcHlyaWdodCAoYykgMjAxNiwgRGFuaWVsIFdpcnR6ICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuLy8gbWV0OlxuLy9cbi8vICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbi8vICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuLy8gKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuLy8gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4vLyAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4vLyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgaXRzIGF1dGhvciwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4vLyAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuLy8gICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbi8vXG4vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4vLyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Jcbi8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbi8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Rcbi8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXG4vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Vcbi8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG5jb25zdCBmcm9tQ2hhckNvZGVzID0gKGNodW5rKSA9PiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY2h1bmspO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIHdpbGwgbm8gbG9uZ2VyIGJlIGV4cG9ydGVkIHdpdGggdGhlIG5leHQgbWFqb3JcbiAqIHJlbGVhc2UsIHNpbmNlIHByb3RvYnVmLXRzIGhhcyBzd2l0Y2ggdG8gVGV4dERlY29kZXIgQVBJLiBJZiB5b3UgbmVlZCB0aGlzXG4gKiBmdW5jdGlvbiwgcGxlYXNlIG1pZ3JhdGUgdG8gQHByb3RvYnVmanMvdXRmOC4gRm9yIGNvbnRleHQsIHNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL3RpbW9zdGFtbS9wcm90b2J1Zi10cy9pc3N1ZXMvMTg0XG4gKlxuICogUmVhZHMgVVRGOCBieXRlcyBhcyBhIHN0cmluZy5cbiAqXG4gKiBTZWUgW3Byb3RvYnVmanMgLyB1dGY4XShodHRwczovL2dpdGh1Yi5jb20vcHJvdG9idWZqcy9wcm90b2J1Zi5qcy9ibG9iLzk4OTNlMzViODU0NjIxY2NlNjRhZjRiZjZiZTJjZmY0ZmI4OTI3OTYvbGliL3V0ZjgvaW5kZXguanMjTDQwKVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNiwgRGFuaWVsIFdpcnR6XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1dGY4cmVhZChieXRlcykge1xuICAgIGlmIChieXRlcy5sZW5ndGggPCAxKVxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICBsZXQgcG9zID0gMCwgLy8gcG9zaXRpb24gaW4gYnl0ZXNcbiAgICBwYXJ0cyA9IFtdLCBjaHVuayA9IFtdLCBpID0gMCwgLy8gY2hhciBvZmZzZXRcbiAgICB0OyAvLyB0ZW1wb3JhcnlcbiAgICBsZXQgbGVuID0gYnl0ZXMubGVuZ3RoO1xuICAgIHdoaWxlIChwb3MgPCBsZW4pIHtcbiAgICAgICAgdCA9IGJ5dGVzW3BvcysrXTtcbiAgICAgICAgaWYgKHQgPCAxMjgpXG4gICAgICAgICAgICBjaHVua1tpKytdID0gdDtcbiAgICAgICAgZWxzZSBpZiAodCA+IDE5MSAmJiB0IDwgMjI0KVxuICAgICAgICAgICAgY2h1bmtbaSsrXSA9ICh0ICYgMzEpIDw8IDYgfCBieXRlc1twb3MrK10gJiA2MztcbiAgICAgICAgZWxzZSBpZiAodCA+IDIzOSAmJiB0IDwgMzY1KSB7XG4gICAgICAgICAgICB0ID0gKCh0ICYgNykgPDwgMTggfCAoYnl0ZXNbcG9zKytdICYgNjMpIDw8IDEyIHwgKGJ5dGVzW3BvcysrXSAmIDYzKSA8PCA2IHwgYnl0ZXNbcG9zKytdICYgNjMpIC0gMHgxMDAwMDtcbiAgICAgICAgICAgIGNodW5rW2krK10gPSAweEQ4MDAgKyAodCA+PiAxMCk7XG4gICAgICAgICAgICBjaHVua1tpKytdID0gMHhEQzAwICsgKHQgJiAxMDIzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjaHVua1tpKytdID0gKHQgJiAxNSkgPDwgMTIgfCAoYnl0ZXNbcG9zKytdICYgNjMpIDw8IDYgfCBieXRlc1twb3MrK10gJiA2MztcbiAgICAgICAgaWYgKGkgPiA4MTkxKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGZyb21DaGFyQ29kZXMoY2h1bmspKTtcbiAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGkpXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGZyb21DaGFyQ29kZXMoY2h1bmsuc2xpY2UoMCwgaSkpKTtcbiAgICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oXCJcIik7XG4gICAgfVxuICAgIHJldHVybiBmcm9tQ2hhckNvZGVzKGNodW5rLnNsaWNlKDAsIGkpKTtcbn1cbiIsIi8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuLy8gbWV0OlxuLy9cbi8vICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbi8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbi8vICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lclxuLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuLy8gZGlzdHJpYnV0aW9uLlxuLy8gKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbi8vXG4vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4vLyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Jcbi8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbi8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Rcbi8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXG4vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Vcbi8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4vL1xuLy8gQ29kZSBnZW5lcmF0ZWQgYnkgdGhlIFByb3RvY29sIEJ1ZmZlciBjb21waWxlciBpcyBvd25lZCBieSB0aGUgb3duZXJcbi8vIG9mIHRoZSBpbnB1dCBmaWxlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIGl0LiAgVGhpcyBjb2RlIGlzIG5vdFxuLy8gc3RhbmRhbG9uZSBhbmQgcmVxdWlyZXMgYSBzdXBwb3J0IGxpYnJhcnkgdG8gYmUgbGlua2VkIHdpdGggaXQuICBUaGlzXG4vLyBzdXBwb3J0IGxpYnJhcnkgaXMgaXRzZWxmIGNvdmVyZWQgYnkgdGhlIGFib3ZlIGxpY2Vuc2UuXG4vKipcbiAqIFJlYWQgYSA2NCBiaXQgdmFyaW50IGFzIHR3byBKUyBudW1iZXJzLlxuICpcbiAqIFJldHVybnMgdHVwbGU6XG4gKiBbMF06IGxvdyBiaXRzXG4gKiBbMF06IGhpZ2ggYml0c1xuICpcbiAqIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL2Jsb2IvOGE3MTkyN2Q3NGE0Y2UzNGVmZTJkODc2OWZkYTE5OGY1MmQyMGQxMi9qcy9leHBlcmltZW50YWwvcnVudGltZS9rZXJuZWwvYnVmZmVyX2RlY29kZXIuanMjTDE3NVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFyaW50NjRyZWFkKCkge1xuICAgIGxldCBsb3dCaXRzID0gMDtcbiAgICBsZXQgaGlnaEJpdHMgPSAwO1xuICAgIGZvciAobGV0IHNoaWZ0ID0gMDsgc2hpZnQgPCAyODsgc2hpZnQgKz0gNykge1xuICAgICAgICBsZXQgYiA9IHRoaXMuYnVmW3RoaXMucG9zKytdO1xuICAgICAgICBsb3dCaXRzIHw9IChiICYgMHg3RikgPDwgc2hpZnQ7XG4gICAgICAgIGlmICgoYiAmIDB4ODApID09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Qm91bmRzKCk7XG4gICAgICAgICAgICByZXR1cm4gW2xvd0JpdHMsIGhpZ2hCaXRzXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgbWlkZGxlQnl0ZSA9IHRoaXMuYnVmW3RoaXMucG9zKytdO1xuICAgIC8vIGxhc3QgZm91ciBiaXRzIG9mIHRoZSBmaXJzdCAzMiBiaXQgbnVtYmVyXG4gICAgbG93Qml0cyB8PSAobWlkZGxlQnl0ZSAmIDB4MEYpIDw8IDI4O1xuICAgIC8vIDMgdXBwZXIgYml0cyBhcmUgcGFydCBvZiB0aGUgbmV4dCAzMiBiaXQgbnVtYmVyXG4gICAgaGlnaEJpdHMgPSAobWlkZGxlQnl0ZSAmIDB4NzApID4+IDQ7XG4gICAgaWYgKChtaWRkbGVCeXRlICYgMHg4MCkgPT0gMCkge1xuICAgICAgICB0aGlzLmFzc2VydEJvdW5kcygpO1xuICAgICAgICByZXR1cm4gW2xvd0JpdHMsIGhpZ2hCaXRzXTtcbiAgICB9XG4gICAgZm9yIChsZXQgc2hpZnQgPSAzOyBzaGlmdCA8PSAzMTsgc2hpZnQgKz0gNykge1xuICAgICAgICBsZXQgYiA9IHRoaXMuYnVmW3RoaXMucG9zKytdO1xuICAgICAgICBoaWdoQml0cyB8PSAoYiAmIDB4N0YpIDw8IHNoaWZ0O1xuICAgICAgICBpZiAoKGIgJiAweDgwKSA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydEJvdW5kcygpO1xuICAgICAgICAgICAgcmV0dXJuIFtsb3dCaXRzLCBoaWdoQml0c107XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHZhcmludCcpO1xufVxuLyoqXG4gKiBXcml0ZSBhIDY0IGJpdCB2YXJpbnQsIGdpdmVuIGFzIHR3byBKUyBudW1iZXJzLCB0byB0aGUgZ2l2ZW4gYnl0ZXMgYXJyYXkuXG4gKlxuICogQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvYmxvYi84YTcxOTI3ZDc0YTRjZTM0ZWZlMmQ4NzY5ZmRhMTk4ZjUyZDIwZDEyL2pzL2V4cGVyaW1lbnRhbC9ydW50aW1lL2tlcm5lbC93cml0ZXIuanMjTDM0NFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFyaW50NjR3cml0ZShsbywgaGksIGJ5dGVzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyODsgaSA9IGkgKyA3KSB7XG4gICAgICAgIGNvbnN0IHNoaWZ0ID0gbG8gPj4+IGk7XG4gICAgICAgIGNvbnN0IGhhc05leHQgPSAhKChzaGlmdCA+Pj4gNykgPT0gMCAmJiBoaSA9PSAwKTtcbiAgICAgICAgY29uc3QgYnl0ZSA9IChoYXNOZXh0ID8gc2hpZnQgfCAweDgwIDogc2hpZnQpICYgMHhGRjtcbiAgICAgICAgYnl0ZXMucHVzaChieXRlKTtcbiAgICAgICAgaWYgKCFoYXNOZXh0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc3BsaXRCaXRzID0gKChsbyA+Pj4gMjgpICYgMHgwRikgfCAoKGhpICYgMHgwNykgPDwgNCk7XG4gICAgY29uc3QgaGFzTW9yZUJpdHMgPSAhKChoaSA+PiAzKSA9PSAwKTtcbiAgICBieXRlcy5wdXNoKChoYXNNb3JlQml0cyA/IHNwbGl0Qml0cyB8IDB4ODAgOiBzcGxpdEJpdHMpICYgMHhGRik7XG4gICAgaWYgKCFoYXNNb3JlQml0cykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAzOyBpIDwgMzE7IGkgPSBpICsgNykge1xuICAgICAgICBjb25zdCBzaGlmdCA9IGhpID4+PiBpO1xuICAgICAgICBjb25zdCBoYXNOZXh0ID0gISgoc2hpZnQgPj4+IDcpID09IDApO1xuICAgICAgICBjb25zdCBieXRlID0gKGhhc05leHQgPyBzaGlmdCB8IDB4ODAgOiBzaGlmdCkgJiAweEZGO1xuICAgICAgICBieXRlcy5wdXNoKGJ5dGUpO1xuICAgICAgICBpZiAoIWhhc05leHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBieXRlcy5wdXNoKChoaSA+Pj4gMzEpICYgMHgwMSk7XG59XG4vLyBjb25zdGFudHMgZm9yIGJpbmFyeSBtYXRoXG5jb25zdCBUV09fUFdSXzMyX0RCTCA9ICgxIDw8IDE2KSAqICgxIDw8IDE2KTtcbi8qKlxuICogUGFyc2UgZGVjaW1hbCBzdHJpbmcgb2YgNjQgYml0IGludGVnZXIgdmFsdWUgYXMgdHdvIEpTIG51bWJlcnMuXG4gKlxuICogUmV0dXJucyB0dXBsZTpcbiAqIFswXTogbWludXMgc2lnbj9cbiAqIFsxXTogbG93IGJpdHNcbiAqIFsyXTogaGlnaCBiaXRzXG4gKlxuICogQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludDY0ZnJvbVN0cmluZyhkZWMpIHtcbiAgICAvLyBDaGVjayBmb3IgbWludXMgc2lnbi5cbiAgICBsZXQgbWludXMgPSBkZWNbMF0gPT0gJy0nO1xuICAgIGlmIChtaW51cylcbiAgICAgICAgZGVjID0gZGVjLnNsaWNlKDEpO1xuICAgIC8vIFdvcmsgNiBkZWNpbWFsIGRpZ2l0cyBhdCBhIHRpbWUsIGFjdGluZyBsaWtlIHdlJ3JlIGNvbnZlcnRpbmcgYmFzZSAxZTZcbiAgICAvLyBkaWdpdHMgdG8gYmluYXJ5LiBUaGlzIGlzIHNhZmUgdG8gZG8gd2l0aCBmbG9hdGluZyBwb2ludCBtYXRoIGJlY2F1c2VcbiAgICAvLyBOdW1iZXIuaXNTYWZlSW50ZWdlcihBTExfMzJfQklUUyAqIDFlNikgPT0gdHJ1ZS5cbiAgICBjb25zdCBiYXNlID0gMWU2O1xuICAgIGxldCBsb3dCaXRzID0gMDtcbiAgICBsZXQgaGlnaEJpdHMgPSAwO1xuICAgIGZ1bmN0aW9uIGFkZDFlNmRpZ2l0KGJlZ2luLCBlbmQpIHtcbiAgICAgICAgLy8gTm90ZTogTnVtYmVyKCcnKSBpcyAwLlxuICAgICAgICBjb25zdCBkaWdpdDFlNiA9IE51bWJlcihkZWMuc2xpY2UoYmVnaW4sIGVuZCkpO1xuICAgICAgICBoaWdoQml0cyAqPSBiYXNlO1xuICAgICAgICBsb3dCaXRzID0gbG93Qml0cyAqIGJhc2UgKyBkaWdpdDFlNjtcbiAgICAgICAgLy8gQ2FycnkgYml0cyBmcm9tIGxvd0JpdHMgdG8gaGlnaEJpdHNcbiAgICAgICAgaWYgKGxvd0JpdHMgPj0gVFdPX1BXUl8zMl9EQkwpIHtcbiAgICAgICAgICAgIGhpZ2hCaXRzID0gaGlnaEJpdHMgKyAoKGxvd0JpdHMgLyBUV09fUFdSXzMyX0RCTCkgfCAwKTtcbiAgICAgICAgICAgIGxvd0JpdHMgPSBsb3dCaXRzICUgVFdPX1BXUl8zMl9EQkw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkMWU2ZGlnaXQoLTI0LCAtMTgpO1xuICAgIGFkZDFlNmRpZ2l0KC0xOCwgLTEyKTtcbiAgICBhZGQxZTZkaWdpdCgtMTIsIC02KTtcbiAgICBhZGQxZTZkaWdpdCgtNik7XG4gICAgcmV0dXJuIFttaW51cywgbG93Qml0cywgaGlnaEJpdHNdO1xufVxuLyoqXG4gKiBGb3JtYXQgNjQgYml0IGludGVnZXIgdmFsdWUgKGFzIHR3byBKUyBudW1iZXJzKSB0byBkZWNpbWFsIHN0cmluZy5cbiAqXG4gKiBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50NjR0b1N0cmluZyhiaXRzTG93LCBiaXRzSGlnaCkge1xuICAgIC8vIFNraXAgdGhlIGV4cGVuc2l2ZSBjb252ZXJzaW9uIGlmIHRoZSBudW1iZXIgaXMgc21hbGwgZW5vdWdoIHRvIHVzZSB0aGVcbiAgICAvLyBidWlsdC1pbiBjb252ZXJzaW9ucy5cbiAgICBpZiAoKGJpdHNIaWdoID4+PiAwKSA8PSAweDFGRkZGRikge1xuICAgICAgICByZXR1cm4gJycgKyAoVFdPX1BXUl8zMl9EQkwgKiBiaXRzSGlnaCArIChiaXRzTG93ID4+PiAwKSk7XG4gICAgfVxuICAgIC8vIFdoYXQgdGhpcyBjb2RlIGlzIGRvaW5nIGlzIGVzc2VudGlhbGx5IGNvbnZlcnRpbmcgdGhlIGlucHV0IG51bWJlciBmcm9tXG4gICAgLy8gYmFzZS0yIHRvIGJhc2UtMWU3LCB3aGljaCBhbGxvd3MgdXMgdG8gcmVwcmVzZW50IHRoZSA2NC1iaXQgcmFuZ2Ugd2l0aFxuICAgIC8vIG9ubHkgMyAodmVyeSBsYXJnZSkgZGlnaXRzLiBUaG9zZSBkaWdpdHMgYXJlIHRoZW4gdHJpdmlhbCB0byBjb252ZXJ0IHRvXG4gICAgLy8gYSBiYXNlLTEwIHN0cmluZy5cbiAgICAvLyBUaGUgbWFnaWMgbnVtYmVycyB1c2VkIGhlcmUgYXJlIC1cbiAgICAvLyAyXjI0ID0gMTY3NzcyMTYgPSAoMSw2Nzc3MjE2KSBpbiBiYXNlLTFlNy5cbiAgICAvLyAyXjQ4ID0gMjgxNDc0OTc2NzEwNjU2ID0gKDIsODE0NzQ5Nyw2NzEwNjU2KSBpbiBiYXNlLTFlNy5cbiAgICAvLyBTcGxpdCAzMjozMiByZXByZXNlbnRhdGlvbiBpbnRvIDE2OjI0OjI0IHJlcHJlc2VudGF0aW9uIHNvIG91clxuICAgIC8vIGludGVybWVkaWF0ZSBkaWdpdHMgZG9uJ3Qgb3ZlcmZsb3cuXG4gICAgbGV0IGxvdyA9IGJpdHNMb3cgJiAweEZGRkZGRjtcbiAgICBsZXQgbWlkID0gKCgoYml0c0xvdyA+Pj4gMjQpIHwgKGJpdHNIaWdoIDw8IDgpKSA+Pj4gMCkgJiAweEZGRkZGRjtcbiAgICBsZXQgaGlnaCA9IChiaXRzSGlnaCA+PiAxNikgJiAweEZGRkY7XG4gICAgLy8gQXNzZW1ibGUgb3VyIHRocmVlIGJhc2UtMWU3IGRpZ2l0cywgaWdub3JpbmcgY2Fycmllcy4gVGhlIG1heGltdW1cbiAgICAvLyB2YWx1ZSBpbiBhIGRpZ2l0IGF0IHRoaXMgc3RlcCBpcyByZXByZXNlbnRhYmxlIGFzIGEgNDgtYml0IGludGVnZXIsIHdoaWNoXG4gICAgLy8gY2FuIGJlIHN0b3JlZCBpbiBhIDY0LWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIuXG4gICAgbGV0IGRpZ2l0QSA9IGxvdyArIChtaWQgKiA2Nzc3MjE2KSArIChoaWdoICogNjcxMDY1Nik7XG4gICAgbGV0IGRpZ2l0QiA9IG1pZCArIChoaWdoICogODE0NzQ5Nyk7XG4gICAgbGV0IGRpZ2l0QyA9IChoaWdoICogMik7XG4gICAgLy8gQXBwbHkgY2FycmllcyBmcm9tIEEgdG8gQiBhbmQgZnJvbSBCIHRvIEMuXG4gICAgbGV0IGJhc2UgPSAxMDAwMDAwMDtcbiAgICBpZiAoZGlnaXRBID49IGJhc2UpIHtcbiAgICAgICAgZGlnaXRCICs9IE1hdGguZmxvb3IoZGlnaXRBIC8gYmFzZSk7XG4gICAgICAgIGRpZ2l0QSAlPSBiYXNlO1xuICAgIH1cbiAgICBpZiAoZGlnaXRCID49IGJhc2UpIHtcbiAgICAgICAgZGlnaXRDICs9IE1hdGguZmxvb3IoZGlnaXRCIC8gYmFzZSk7XG4gICAgICAgIGRpZ2l0QiAlPSBiYXNlO1xuICAgIH1cbiAgICAvLyBDb252ZXJ0IGJhc2UtMWU3IGRpZ2l0cyB0byBiYXNlLTEwLCB3aXRoIG9wdGlvbmFsIGxlYWRpbmcgemVyb2VzLlxuICAgIGZ1bmN0aW9uIGRlY2ltYWxGcm9tMWU3KGRpZ2l0MWU3LCBuZWVkTGVhZGluZ1plcm9zKSB7XG4gICAgICAgIGxldCBwYXJ0aWFsID0gZGlnaXQxZTcgPyBTdHJpbmcoZGlnaXQxZTcpIDogJyc7XG4gICAgICAgIGlmIChuZWVkTGVhZGluZ1plcm9zKSB7XG4gICAgICAgICAgICByZXR1cm4gJzAwMDAwMDAnLnNsaWNlKHBhcnRpYWwubGVuZ3RoKSArIHBhcnRpYWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnRpYWw7XG4gICAgfVxuICAgIHJldHVybiBkZWNpbWFsRnJvbTFlNyhkaWdpdEMsIC8qbmVlZExlYWRpbmdaZXJvcz0qLyAwKSArXG4gICAgICAgIGRlY2ltYWxGcm9tMWU3KGRpZ2l0QiwgLypuZWVkTGVhZGluZ1plcm9zPSovIGRpZ2l0QykgK1xuICAgICAgICAvLyBJZiB0aGUgZmluYWwgMWU3IGRpZ2l0IGRpZG4ndCBuZWVkIGxlYWRpbmcgemVyb3MsIHdlIHdvdWxkIGhhdmVcbiAgICAgICAgLy8gcmV0dXJuZWQgdmlhIHRoZSB0cml2aWFsIGNvZGUgcGF0aCBhdCB0aGUgdG9wLlxuICAgICAgICBkZWNpbWFsRnJvbTFlNyhkaWdpdEEsIC8qbmVlZExlYWRpbmdaZXJvcz0qLyAxKTtcbn1cbi8qKlxuICogV3JpdGUgYSAzMiBiaXQgdmFyaW50LCBzaWduZWQgb3IgdW5zaWduZWQuIFNhbWUgYXMgYHZhcmludDY0d3JpdGUoMCwgdmFsdWUsIGJ5dGVzKWBcbiAqXG4gKiBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Byb3RvY29sYnVmZmVycy9wcm90b2J1Zi9ibG9iLzFiMTg4MzNmNGYyYTJmNjgxZjRlNGEyNWNkZjNiMGE0MzExNWVjMjYvanMvYmluYXJ5L2VuY29kZXIuanMjTDE0NFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFyaW50MzJ3cml0ZSh2YWx1ZSwgYnl0ZXMpIHtcbiAgICBpZiAodmFsdWUgPj0gMCkge1xuICAgICAgICAvLyB3cml0ZSB2YWx1ZSBhcyB2YXJpbnQgMzJcbiAgICAgICAgd2hpbGUgKHZhbHVlID4gMHg3Zikge1xuICAgICAgICAgICAgYnl0ZXMucHVzaCgodmFsdWUgJiAweDdmKSB8IDB4ODApO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSA+Pj4gNztcbiAgICAgICAgfVxuICAgICAgICBieXRlcy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgOTsgaSsrKSB7XG4gICAgICAgICAgICBieXRlcy5wdXNoKHZhbHVlICYgMTI3IHwgMTI4KTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPj4gNztcbiAgICAgICAgfVxuICAgICAgICBieXRlcy5wdXNoKDEpO1xuICAgIH1cbn1cbi8qKlxuICogUmVhZCBhbiB1bnNpZ25lZCAzMiBiaXQgdmFyaW50LlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL2Jsb2IvOGE3MTkyN2Q3NGE0Y2UzNGVmZTJkODc2OWZkYTE5OGY1MmQyMGQxMi9qcy9leHBlcmltZW50YWwvcnVudGltZS9rZXJuZWwvYnVmZmVyX2RlY29kZXIuanMjTDIyMFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFyaW50MzJyZWFkKCkge1xuICAgIGxldCBiID0gdGhpcy5idWZbdGhpcy5wb3MrK107XG4gICAgbGV0IHJlc3VsdCA9IGIgJiAweDdGO1xuICAgIGlmICgoYiAmIDB4ODApID09IDApIHtcbiAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgYiA9IHRoaXMuYnVmW3RoaXMucG9zKytdO1xuICAgIHJlc3VsdCB8PSAoYiAmIDB4N0YpIDw8IDc7XG4gICAgaWYgKChiICYgMHg4MCkgPT0gMCkge1xuICAgICAgICB0aGlzLmFzc2VydEJvdW5kcygpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBiID0gdGhpcy5idWZbdGhpcy5wb3MrK107XG4gICAgcmVzdWx0IHw9IChiICYgMHg3RikgPDwgMTQ7XG4gICAgaWYgKChiICYgMHg4MCkgPT0gMCkge1xuICAgICAgICB0aGlzLmFzc2VydEJvdW5kcygpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBiID0gdGhpcy5idWZbdGhpcy5wb3MrK107XG4gICAgcmVzdWx0IHw9IChiICYgMHg3RikgPDwgMjE7XG4gICAgaWYgKChiICYgMHg4MCkgPT0gMCkge1xuICAgICAgICB0aGlzLmFzc2VydEJvdW5kcygpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBFeHRyYWN0IG9ubHkgbGFzdCA0IGJpdHNcbiAgICBiID0gdGhpcy5idWZbdGhpcy5wb3MrK107XG4gICAgcmVzdWx0IHw9IChiICYgMHgwRikgPDwgMjg7XG4gICAgZm9yIChsZXQgcmVhZEJ5dGVzID0gNTsgKChiICYgMHg4MCkgIT09IDApICYmIHJlYWRCeXRlcyA8IDEwOyByZWFkQnl0ZXMrKylcbiAgICAgICAgYiA9IHRoaXMuYnVmW3RoaXMucG9zKytdO1xuICAgIGlmICgoYiAmIDB4ODApICE9IDApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB2YXJpbnQnKTtcbiAgICB0aGlzLmFzc2VydEJvdW5kcygpO1xuICAgIC8vIFJlc3VsdCBjYW4gaGF2ZSAzMiBiaXRzLCBjb252ZXJ0IGl0IHRvIHVuc2lnbmVkXG4gICAgcmV0dXJuIHJlc3VsdCA+Pj4gMDtcbn1cbiIsImltcG9ydCB7IGludDY0ZnJvbVN0cmluZywgaW50NjR0b1N0cmluZyB9IGZyb20gXCIuL2dvb2ctdmFyaW50XCI7XG5sZXQgQkk7XG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0QmkoKSB7XG4gICAgY29uc3QgZHYgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDgpKTtcbiAgICBjb25zdCBvayA9IGdsb2JhbFRoaXMuQmlnSW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgJiYgdHlwZW9mIGR2LmdldEJpZ0ludDY0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgJiYgdHlwZW9mIGR2LmdldEJpZ1VpbnQ2NCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICYmIHR5cGVvZiBkdi5zZXRCaWdJbnQ2NCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICYmIHR5cGVvZiBkdi5zZXRCaWdVaW50NjQgPT09IFwiZnVuY3Rpb25cIjtcbiAgICBCSSA9IG9rID8ge1xuICAgICAgICBNSU46IEJpZ0ludChcIi05MjIzMzcyMDM2ODU0Nzc1ODA4XCIpLFxuICAgICAgICBNQVg6IEJpZ0ludChcIjkyMjMzNzIwMzY4NTQ3NzU4MDdcIiksXG4gICAgICAgIFVNSU46IEJpZ0ludChcIjBcIiksXG4gICAgICAgIFVNQVg6IEJpZ0ludChcIjE4NDQ2NzQ0MDczNzA5NTUxNjE1XCIpLFxuICAgICAgICBDOiBCaWdJbnQsXG4gICAgICAgIFY6IGR2LFxuICAgIH0gOiB1bmRlZmluZWQ7XG59XG5kZXRlY3RCaSgpO1xuZnVuY3Rpb24gYXNzZXJ0QmkoYmkpIHtcbiAgICBpZiAoIWJpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCaWdJbnQgdW5hdmFpbGFibGUsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGltb3N0YW1tL3Byb3RvYnVmLXRzL2Jsb2IvdjEuMC44L01BTlVBTC5tZCNiaWdpbnQtc3VwcG9ydFwiKTtcbn1cbi8vIHVzZWQgdG8gdmFsaWRhdGUgZnJvbShzdHJpbmcpIGlucHV0ICh3aGVuIGJpZ2ludCBpcyB1bmF2YWlsYWJsZSlcbmNvbnN0IFJFX0RFQ0lNQUxfU1RSID0gL14tP1swLTldKyQvO1xuLy8gY29uc3RhbnRzIGZvciBiaW5hcnkgbWF0aFxuY29uc3QgVFdPX1BXUl8zMl9EQkwgPSAweDEwMDAwMDAwMDtcbmNvbnN0IEhBTEZfMl9QV1JfMzIgPSAweDA4MDAwMDAwMDtcbi8vIGJhc2UgY2xhc3MgZm9yIFBiTG9uZyBhbmQgUGJVTG9uZyBwcm92aWRlcyBzaGFyZWQgY29kZVxuY2xhc3MgU2hhcmVkUGJMb25nIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gYml0cy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihsbywgaGkpIHtcbiAgICAgICAgdGhpcy5sbyA9IGxvIHwgMDtcbiAgICAgICAgdGhpcy5oaSA9IGhpIHwgMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXMgdGhpcyBpbnN0YW5jZSBlcXVhbCB0byAwP1xuICAgICAqL1xuICAgIGlzWmVybygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG8gPT0gMCAmJiB0aGlzLmhpID09IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgdG8gYSBuYXRpdmUgbnVtYmVyLlxuICAgICAqL1xuICAgIHRvTnVtYmVyKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5oaSAqIFRXT19QV1JfMzJfREJMICsgKHRoaXMubG8gPj4+IDApO1xuICAgICAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHJlc3VsdCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjYW5ub3QgY29udmVydCB0byBzYWZlIG51bWJlclwiKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vKipcbiAqIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGFzIHR3byAzMi1iaXQgdmFsdWVzLlxuICogQ29udmVydHMgYmV0d2VlbiBgc3RyaW5nYCwgYG51bWJlcmAgYW5kIGBiaWdpbnRgIHJlcHJlc2VudGF0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFBiVUxvbmcgZXh0ZW5kcyBTaGFyZWRQYkxvbmcge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBpbnN0YW5jZSBmcm9tIGEgYHN0cmluZ2AsIGBudW1iZXJgIG9yIGBiaWdpbnRgLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tKHZhbHVlKSB7XG4gICAgICAgIGlmIChCSSlcbiAgICAgICAgICAgIC8vIG5vaW5zcGVjdGlvbiBGYWxsVGhyb3VnaEluU3dpdGNoU3RhdGVtZW50SlNcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gXCIwXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aRVJPO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gXCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc3RyaW5nIGlzIG5vIGludGVnZXInKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBCSS5DKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpFUk87XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQkkuQyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgQkkuVU1JTilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbmVkIHZhbHVlIGZvciB1bG9uZycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPiBCSS5VTUFYKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bG9uZyB0b28gbGFyZ2UnKTtcbiAgICAgICAgICAgICAgICAgICAgQkkuVi5zZXRCaWdVaW50NjQoMCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBiVUxvbmcoQkkuVi5nZXRJbnQzMigwLCB0cnVlKSwgQkkuVi5nZXRJbnQzMig0LCB0cnVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gXCIwXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aRVJPO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFSRV9ERUNJTUFMX1NUUi50ZXN0KHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc3RyaW5nIGlzIG5vIGludGVnZXInKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IFttaW51cywgbG8sIGhpXSA9IGludDY0ZnJvbVN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtaW51cylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbmVkIHZhbHVlIGZvciB1bG9uZycpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBiVUxvbmcobG8sIGhpKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ251bWJlciBpcyBubyBpbnRlZ2VyJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDApXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25lZCB2YWx1ZSBmb3IgdWxvbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYlVMb25nKHZhbHVlLCB2YWx1ZSAvIFRXT19QV1JfMzJfREJMKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHZhbHVlICcgKyB0eXBlb2YgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHRvIGRlY2ltYWwgc3RyaW5nLlxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gQkkgPyB0aGlzLnRvQmlnSW50KCkudG9TdHJpbmcoKSA6IGludDY0dG9TdHJpbmcodGhpcy5sbywgdGhpcy5oaSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgdG8gbmF0aXZlIGJpZ2ludC5cbiAgICAgKi9cbiAgICB0b0JpZ0ludCgpIHtcbiAgICAgICAgYXNzZXJ0QmkoQkkpO1xuICAgICAgICBCSS5WLnNldEludDMyKDAsIHRoaXMubG8sIHRydWUpO1xuICAgICAgICBCSS5WLnNldEludDMyKDQsIHRoaXMuaGksIHRydWUpO1xuICAgICAgICByZXR1cm4gQkkuVi5nZXRCaWdVaW50NjQoMCwgdHJ1ZSk7XG4gICAgfVxufVxuLyoqXG4gKiB1bG9uZyAwIHNpbmdsZXRvbi5cbiAqL1xuUGJVTG9uZy5aRVJPID0gbmV3IFBiVUxvbmcoMCwgMCk7XG4vKipcbiAqIDY0LWJpdCBzaWduZWQgaW50ZWdlciBhcyB0d28gMzItYml0IHZhbHVlcy5cbiAqIENvbnZlcnRzIGJldHdlZW4gYHN0cmluZ2AsIGBudW1iZXJgIGFuZCBgYmlnaW50YCByZXByZXNlbnRhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYkxvbmcgZXh0ZW5kcyBTaGFyZWRQYkxvbmcge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBpbnN0YW5jZSBmcm9tIGEgYHN0cmluZ2AsIGBudW1iZXJgIG9yIGBiaWdpbnRgLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tKHZhbHVlKSB7XG4gICAgICAgIGlmIChCSSlcbiAgICAgICAgICAgIC8vIG5vaW5zcGVjdGlvbiBGYWxsVGhyb3VnaEluU3dpdGNoU3RhdGVtZW50SlNcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gXCIwXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aRVJPO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gXCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc3RyaW5nIGlzIG5vIGludGVnZXInKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBCSS5DKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpFUk87XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQkkuQyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgQkkuTUlOKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduZWQgbG9uZyB0b28gc21hbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID4gQkkuTUFYKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduZWQgbG9uZyB0b28gbGFyZ2UnKTtcbiAgICAgICAgICAgICAgICAgICAgQkkuVi5zZXRCaWdJbnQ2NCgwLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGJMb25nKEJJLlYuZ2V0SW50MzIoMCwgdHJ1ZSksIEJJLlYuZ2V0SW50MzIoNCwgdHJ1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IFwiMFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghUkVfREVDSU1BTF9TVFIudGVzdCh2YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0cmluZyBpcyBubyBpbnRlZ2VyJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBbbWludXMsIGxvLCBoaV0gPSBpbnQ2NGZyb21TdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWludXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaSA+IEhBTEZfMl9QV1JfMzIgfHwgKGhpID09IEhBTEZfMl9QV1JfMzIgJiYgbG8gIT0gMCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduZWQgbG9uZyB0b28gc21hbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChoaSA+PSBIQUxGXzJfUFdSXzMyKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduZWQgbG9uZyB0b28gbGFyZ2UnKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBibCA9IG5ldyBQYkxvbmcobG8sIGhpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1pbnVzID8gcGJsLm5lZ2F0ZSgpIDogcGJsO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aRVJPO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbnVtYmVyIGlzIG5vIGludGVnZXInKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgUGJMb25nKHZhbHVlLCB2YWx1ZSAvIFRXT19QV1JfMzJfREJMKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgUGJMb25nKC12YWx1ZSwgLXZhbHVlIC8gVFdPX1BXUl8zMl9EQkwpLm5lZ2F0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gdmFsdWUgJyArIHR5cGVvZiB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERvIHdlIGhhdmUgYSBtaW51cyBzaWduP1xuICAgICAqL1xuICAgIGlzTmVnYXRpdmUoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5oaSAmIEhBTEZfMl9QV1JfMzIpICE9PSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOZWdhdGUgdHdvJ3MgY29tcGxlbWVudC5cbiAgICAgKiBJbnZlcnQgYWxsIHRoZSBiaXRzIGFuZCBhZGQgb25lIHRvIHRoZSByZXN1bHQuXG4gICAgICovXG4gICAgbmVnYXRlKCkge1xuICAgICAgICBsZXQgaGkgPSB+dGhpcy5oaSwgbG8gPSB0aGlzLmxvO1xuICAgICAgICBpZiAobG8pXG4gICAgICAgICAgICBsbyA9IH5sbyArIDE7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGhpICs9IDE7XG4gICAgICAgIHJldHVybiBuZXcgUGJMb25nKGxvLCBoaSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgdG8gZGVjaW1hbCBzdHJpbmcuXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGlmIChCSSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvQmlnSW50KCkudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7XG4gICAgICAgICAgICBsZXQgbiA9IHRoaXMubmVnYXRlKCk7XG4gICAgICAgICAgICByZXR1cm4gJy0nICsgaW50NjR0b1N0cmluZyhuLmxvLCBuLmhpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW50NjR0b1N0cmluZyh0aGlzLmxvLCB0aGlzLmhpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCB0byBuYXRpdmUgYmlnaW50LlxuICAgICAqL1xuICAgIHRvQmlnSW50KCkge1xuICAgICAgICBhc3NlcnRCaShCSSk7XG4gICAgICAgIEJJLlYuc2V0SW50MzIoMCwgdGhpcy5sbywgdHJ1ZSk7XG4gICAgICAgIEJJLlYuc2V0SW50MzIoNCwgdGhpcy5oaSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBCSS5WLmdldEJpZ0ludDY0KDAsIHRydWUpO1xuICAgIH1cbn1cbi8qKlxuICogbG9uZyAwIHNpbmdsZXRvbi5cbiAqL1xuUGJMb25nLlpFUk8gPSBuZXcgUGJMb25nKDAsIDApO1xuIiwiaW1wb3J0IHsgV2lyZVR5cGUgfSBmcm9tIFwiLi9iaW5hcnktZm9ybWF0LWNvbnRyYWN0XCI7XG5pbXBvcnQgeyBQYkxvbmcsIFBiVUxvbmcgfSBmcm9tIFwiLi9wYi1sb25nXCI7XG5pbXBvcnQgeyB2YXJpbnQzMnJlYWQsIHZhcmludDY0cmVhZCB9IGZyb20gXCIuL2dvb2ctdmFyaW50XCI7XG5jb25zdCBkZWZhdWx0c1JlYWQgPSB7XG4gICAgcmVhZFVua25vd25GaWVsZDogdHJ1ZSxcbiAgICByZWFkZXJGYWN0b3J5OiBieXRlcyA9PiBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKSxcbn07XG4vKipcbiAqIE1ha2Ugb3B0aW9ucyBmb3IgcmVhZGluZyBiaW5hcnkgZGF0YSBmb3JtIHBhcnRpYWwgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeVJlYWRPcHRpb25zKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucyA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHNSZWFkKSwgb3B0aW9ucykgOiBkZWZhdWx0c1JlYWQ7XG59XG5leHBvcnQgY2xhc3MgQmluYXJ5UmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihidWYsIHRleHREZWNvZGVyKSB7XG4gICAgICAgIHRoaXMudmFyaW50NjQgPSB2YXJpbnQ2NHJlYWQ7IC8vIGRpcnR5IGNhc3QgZm9yIGB0aGlzYFxuICAgICAgICAvKipcbiAgICAgICAgICogUmVhZCBhIGB1aW50MzJgIGZpZWxkLCBhbiB1bnNpZ25lZCAzMiBiaXQgdmFyaW50LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51aW50MzIgPSB2YXJpbnQzMnJlYWQ7IC8vIGRpcnR5IGNhc3QgZm9yIGB0aGlzYCBhbmQgYWNjZXNzIHRvIHByb3RlY3RlZCBgYnVmYFxuICAgICAgICB0aGlzLmJ1ZiA9IGJ1ZjtcbiAgICAgICAgdGhpcy5sZW4gPSBidWYubGVuZ3RoO1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIHRoaXMudmlldyA9IG5ldyBEYXRhVmlldyhidWYuYnVmZmVyLCBidWYuYnl0ZU9mZnNldCwgYnVmLmJ5dGVMZW5ndGgpO1xuICAgICAgICB0aGlzLnRleHREZWNvZGVyID0gdGV4dERlY29kZXIgIT09IG51bGwgJiYgdGV4dERlY29kZXIgIT09IHZvaWQgMCA/IHRleHREZWNvZGVyIDogbmV3IFRleHREZWNvZGVyKFwidXRmLThcIiwge1xuICAgICAgICAgICAgZmF0YWw6IHRydWUsXG4gICAgICAgICAgICBpZ25vcmVCT006IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhIHRhZyAtIGZpZWxkIG51bWJlciBhbmQgd2lyZSB0eXBlLlxuICAgICAqL1xuICAgIHRhZygpIHtcbiAgICAgICAgbGV0IHRhZyA9IHRoaXMudWludDMyKCksIGZpZWxkTm8gPSB0YWcgPj4+IDMsIHdpcmVUeXBlID0gdGFnICYgNztcbiAgICAgICAgaWYgKGZpZWxkTm8gPD0gMCB8fCB3aXJlVHlwZSA8IDAgfHwgd2lyZVR5cGUgPiA1KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCB0YWc6IGZpZWxkIG5vIFwiICsgZmllbGRObyArIFwiIHdpcmUgdHlwZSBcIiArIHdpcmVUeXBlKTtcbiAgICAgICAgcmV0dXJuIFtmaWVsZE5vLCB3aXJlVHlwZV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNraXAgb25lIGVsZW1lbnQgb24gdGhlIHdpcmUgYW5kIHJldHVybiB0aGUgc2tpcHBlZCBkYXRhLlxuICAgICAqIFN1cHBvcnRzIFdpcmVUeXBlLlN0YXJ0R3JvdXAgc2luY2UgdjIuMC4wLWFscGhhLjIzLlxuICAgICAqL1xuICAgIHNraXAod2lyZVR5cGUpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBGYWxsVGhyb3VnaEluU3dpdGNoU3RhdGVtZW50SlNcbiAgICAgICAgc3dpdGNoICh3aXJlVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBXaXJlVHlwZS5WYXJpbnQ6XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuYnVmW3RoaXMucG9zKytdICYgMHg4MCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFdpcmVUeXBlLkJpdDY0OlxuICAgICAgICAgICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgICAgICBjYXNlIFdpcmVUeXBlLkJpdDMyOlxuICAgICAgICAgICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZDpcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gdGhpcy51aW50MzIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcyArPSBsZW47XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFdpcmVUeXBlLlN0YXJ0R3JvdXA6XG4gICAgICAgICAgICAgICAgLy8gRnJvbSBkZXNjcmlwdG9yLnByb3RvOiBHcm91cCB0eXBlIGlzIGRlcHJlY2F0ZWQsIG5vdCBzdXBwb3J0ZWQgaW4gcHJvdG8zLlxuICAgICAgICAgICAgICAgIC8vIEJ1dCB3ZSBtdXN0IHN0aWxsIGJlIGFibGUgdG8gcGFyc2UgYW5kIHRyZWF0IGFzIHVua25vd24uXG4gICAgICAgICAgICAgICAgbGV0IHQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCh0ID0gdGhpcy50YWcoKVsxXSkgIT09IFdpcmVUeXBlLkVuZEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcCh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNhbnQgc2tpcCB3aXJlIHR5cGUgXCIgKyB3aXJlVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmLnN1YmFycmF5KHN0YXJ0LCB0aGlzLnBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRocm93cyBlcnJvciBpZiBwb3NpdGlvbiBpbiBieXRlIGFycmF5IGlzIG91dCBvZiByYW5nZS5cbiAgICAgKi9cbiAgICBhc3NlcnRCb3VuZHMoKSB7XG4gICAgICAgIGlmICh0aGlzLnBvcyA+IHRoaXMubGVuKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJwcmVtYXR1cmUgRU9GXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYGludDMyYCBmaWVsZCwgYSBzaWduZWQgMzIgYml0IHZhcmludC5cbiAgICAgKi9cbiAgICBpbnQzMigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudWludDMyKCkgfCAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYHNpbnQzMmAgZmllbGQsIGEgc2lnbmVkLCB6aWd6YWctZW5jb2RlZCAzMi1iaXQgdmFyaW50LlxuICAgICAqL1xuICAgIHNpbnQzMigpIHtcbiAgICAgICAgbGV0IHp6ZSA9IHRoaXMudWludDMyKCk7XG4gICAgICAgIC8vIGRlY29kZSB6aWd6YWdcbiAgICAgICAgcmV0dXJuICh6emUgPj4+IDEpIF4gLSh6emUgJiAxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBpbnQ2NGAgZmllbGQsIGEgc2lnbmVkIDY0LWJpdCB2YXJpbnQuXG4gICAgICovXG4gICAgaW50NjQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGJMb25nKC4uLnRoaXMudmFyaW50NjQoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgdWludDY0YCBmaWVsZCwgYW4gdW5zaWduZWQgNjQtYml0IHZhcmludC5cbiAgICAgKi9cbiAgICB1aW50NjQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGJVTG9uZyguLi50aGlzLnZhcmludDY0KCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYHNpbnQ2NGAgZmllbGQsIGEgc2lnbmVkLCB6aWctemFnLWVuY29kZWQgNjQtYml0IHZhcmludC5cbiAgICAgKi9cbiAgICBzaW50NjQoKSB7XG4gICAgICAgIGxldCBbbG8sIGhpXSA9IHRoaXMudmFyaW50NjQoKTtcbiAgICAgICAgLy8gZGVjb2RlIHppZyB6YWdcbiAgICAgICAgbGV0IHMgPSAtKGxvICYgMSk7XG4gICAgICAgIGxvID0gKChsbyA+Pj4gMSB8IChoaSAmIDEpIDw8IDMxKSBeIHMpO1xuICAgICAgICBoaSA9IChoaSA+Pj4gMSBeIHMpO1xuICAgICAgICByZXR1cm4gbmV3IFBiTG9uZyhsbywgaGkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYGJvb2xgIGZpZWxkLCBhIHZhcmlhbnQuXG4gICAgICovXG4gICAgYm9vbCgpIHtcbiAgICAgICAgbGV0IFtsbywgaGldID0gdGhpcy52YXJpbnQ2NCgpO1xuICAgICAgICByZXR1cm4gbG8gIT09IDAgfHwgaGkgIT09IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgZml4ZWQzMmAgZmllbGQsIGFuIHVuc2lnbmVkLCBmaXhlZC1sZW5ndGggMzItYml0IGludGVnZXIuXG4gICAgICovXG4gICAgZml4ZWQzMigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRVaW50MzIoKHRoaXMucG9zICs9IDQpIC0gNCwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgc2ZpeGVkMzJgIGZpZWxkLCBhIHNpZ25lZCwgZml4ZWQtbGVuZ3RoIDMyLWJpdCBpbnRlZ2VyLlxuICAgICAqL1xuICAgIHNmaXhlZDMyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LmdldEludDMyKCh0aGlzLnBvcyArPSA0KSAtIDQsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYGZpeGVkNjRgIGZpZWxkLCBhbiB1bnNpZ25lZCwgZml4ZWQtbGVuZ3RoIDY0IGJpdCBpbnRlZ2VyLlxuICAgICAqL1xuICAgIGZpeGVkNjQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGJVTG9uZyh0aGlzLnNmaXhlZDMyKCksIHRoaXMuc2ZpeGVkMzIoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgZml4ZWQ2NGAgZmllbGQsIGEgc2lnbmVkLCBmaXhlZC1sZW5ndGggNjQtYml0IGludGVnZXIuXG4gICAgICovXG4gICAgc2ZpeGVkNjQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGJMb25nKHRoaXMuc2ZpeGVkMzIoKSwgdGhpcy5zZml4ZWQzMigpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBmbG9hdGAgZmllbGQsIDMyLWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIuXG4gICAgICovXG4gICAgZmxvYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0RmxvYXQzMigodGhpcy5wb3MgKz0gNCkgLSA0LCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBkb3VibGVgIGZpZWxkLCBhIDY0LWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIuXG4gICAgICovXG4gICAgZG91YmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LmdldEZsb2F0NjQoKHRoaXMucG9zICs9IDgpIC0gOCwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgYnl0ZXNgIGZpZWxkLCBsZW5ndGgtZGVsaW1pdGVkIGFyYml0cmFyeSBkYXRhLlxuICAgICAqL1xuICAgIGJ5dGVzKCkge1xuICAgICAgICBsZXQgbGVuID0gdGhpcy51aW50MzIoKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICAgIHRoaXMucG9zICs9IGxlbjtcbiAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgc3RyaW5nYCBmaWVsZCwgbGVuZ3RoLWRlbGltaXRlZCBkYXRhIGNvbnZlcnRlZCB0byBVVEYtOCB0ZXh0LlxuICAgICAqL1xuICAgIHN0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dERlY29kZXIuZGVjb2RlKHRoaXMuYnl0ZXMoKSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgUGJMb25nLCBQYlVMb25nIH0gZnJvbSBcIi4vcGItbG9uZ1wiO1xuaW1wb3J0IHsgdmFyaW50MzJ3cml0ZSwgdmFyaW50NjR3cml0ZSB9IGZyb20gXCIuL2dvb2ctdmFyaW50XCI7XG5pbXBvcnQgeyBhc3NlcnRGbG9hdDMyLCBhc3NlcnRJbnQzMiwgYXNzZXJ0VUludDMyIH0gZnJvbSBcIi4vYXNzZXJ0XCI7XG5jb25zdCBkZWZhdWx0c1dyaXRlID0ge1xuICAgIHdyaXRlVW5rbm93bkZpZWxkczogdHJ1ZSxcbiAgICB3cml0ZXJGYWN0b3J5OiAoKSA9PiBuZXcgQmluYXJ5V3JpdGVyKCksXG59O1xuLyoqXG4gKiBNYWtlIG9wdGlvbnMgZm9yIHdyaXRpbmcgYmluYXJ5IGRhdGEgZm9ybSBwYXJ0aWFsIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5hcnlXcml0ZU9wdGlvbnMob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0c1dyaXRlKSwgb3B0aW9ucykgOiBkZWZhdWx0c1dyaXRlO1xufVxuZXhwb3J0IGNsYXNzIEJpbmFyeVdyaXRlciB7XG4gICAgY29uc3RydWN0b3IodGV4dEVuY29kZXIpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFByZXZpb3VzIGZvcmsgc3RhdGVzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zdGFjayA9IFtdO1xuICAgICAgICB0aGlzLnRleHRFbmNvZGVyID0gdGV4dEVuY29kZXIgIT09IG51bGwgJiYgdGV4dEVuY29kZXIgIT09IHZvaWQgMCA/IHRleHRFbmNvZGVyIDogbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIHRoaXMuY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuYnVmID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbGwgYnl0ZXMgd3JpdHRlbiBhbmQgcmVzZXQgdGhpcyB3cml0ZXIuXG4gICAgICovXG4gICAgZmluaXNoKCkge1xuICAgICAgICB0aGlzLmNodW5rcy5wdXNoKG5ldyBVaW50OEFycmF5KHRoaXMuYnVmKSk7IC8vIGZsdXNoIHRoZSBidWZmZXJcbiAgICAgICAgbGV0IGxlbiA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaHVua3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBsZW4gKz0gdGhpcy5jaHVua3NbaV0ubGVuZ3RoO1xuICAgICAgICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheShsZW4pO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNodW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYnl0ZXMuc2V0KHRoaXMuY2h1bmtzW2ldLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHRoaXMuY2h1bmtzW2ldLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNodW5rcyA9IFtdO1xuICAgICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0IGEgbmV3IGZvcmsgZm9yIGxlbmd0aC1kZWxpbWl0ZWQgZGF0YSBsaWtlIGEgbWVzc2FnZVxuICAgICAqIG9yIGEgcGFja2VkIHJlcGVhdGVkIGZpZWxkLlxuICAgICAqXG4gICAgICogTXVzdCBiZSBqb2luZWQgbGF0ZXIgd2l0aCBgam9pbigpYC5cbiAgICAgKi9cbiAgICBmb3JrKCkge1xuICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBjaHVua3M6IHRoaXMuY2h1bmtzLCBidWY6IHRoaXMuYnVmIH0pO1xuICAgICAgICB0aGlzLmNodW5rcyA9IFtdO1xuICAgICAgICB0aGlzLmJ1ZiA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSm9pbiB0aGUgbGFzdCBmb3JrLiBXcml0ZSBpdHMgbGVuZ3RoIGFuZCBieXRlcywgdGhlblxuICAgICAqIHJldHVybiB0byB0aGUgcHJldmlvdXMgc3RhdGUuXG4gICAgICovXG4gICAgam9pbigpIHtcbiAgICAgICAgLy8gZ2V0IGNodW5rIG9mIGZvcmtcbiAgICAgICAgbGV0IGNodW5rID0gdGhpcy5maW5pc2goKTtcbiAgICAgICAgLy8gcmVzdG9yZSBwcmV2aW91cyBzdGF0ZVxuICAgICAgICBsZXQgcHJldiA9IHRoaXMuc3RhY2sucG9wKCk7XG4gICAgICAgIGlmICghcHJldilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzdGF0ZSwgZm9yayBzdGFjayBlbXB0eScpO1xuICAgICAgICB0aGlzLmNodW5rcyA9IHByZXYuY2h1bmtzO1xuICAgICAgICB0aGlzLmJ1ZiA9IHByZXYuYnVmO1xuICAgICAgICAvLyB3cml0ZSBsZW5ndGggb2YgY2h1bmsgYXMgdmFyaW50XG4gICAgICAgIHRoaXMudWludDMyKGNodW5rLmJ5dGVMZW5ndGgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yYXcoY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSB0YWcgKGZpZWxkIG51bWJlciBhbmQgd2lyZSB0eXBlKS5cbiAgICAgKlxuICAgICAqIEVxdWl2YWxlbnQgdG8gYHVpbnQzMiggKGZpZWxkTm8gPDwgMyB8IHR5cGUpID4+PiAwIClgLlxuICAgICAqXG4gICAgICogR2VuZXJhdGVkIGNvZGUgc2hvdWxkIGNvbXB1dGUgdGhlIHRhZyBhaGVhZCBvZiB0aW1lIGFuZCBjYWxsIGB1aW50MzIoKWAuXG4gICAgICovXG4gICAgdGFnKGZpZWxkTm8sIHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudWludDMyKChmaWVsZE5vIDw8IDMgfCB0eXBlKSA+Pj4gMCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgY2h1bmsgb2YgcmF3IGJ5dGVzLlxuICAgICAqL1xuICAgIHJhdyhjaHVuaykge1xuICAgICAgICBpZiAodGhpcy5idWYubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmNodW5rcy5wdXNoKG5ldyBVaW50OEFycmF5KHRoaXMuYnVmKSk7XG4gICAgICAgICAgICB0aGlzLmJ1ZiA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgdWludDMyYCB2YWx1ZSwgYW4gdW5zaWduZWQgMzIgYml0IHZhcmludC5cbiAgICAgKi9cbiAgICB1aW50MzIodmFsdWUpIHtcbiAgICAgICAgYXNzZXJ0VUludDMyKHZhbHVlKTtcbiAgICAgICAgLy8gd3JpdGUgdmFsdWUgYXMgdmFyaW50IDMyLCBpbmxpbmVkIGZvciBzcGVlZFxuICAgICAgICB3aGlsZSAodmFsdWUgPiAweDdmKSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi5wdXNoKCh2YWx1ZSAmIDB4N2YpIHwgMHg4MCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID4+PiA3O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmLnB1c2godmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgaW50MzJgIHZhbHVlLCBhIHNpZ25lZCAzMiBiaXQgdmFyaW50LlxuICAgICAqL1xuICAgIGludDMyKHZhbHVlKSB7XG4gICAgICAgIGFzc2VydEludDMyKHZhbHVlKTtcbiAgICAgICAgdmFyaW50MzJ3cml0ZSh2YWx1ZSwgdGhpcy5idWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgYm9vbGAgdmFsdWUsIGEgdmFyaWFudC5cbiAgICAgKi9cbiAgICBib29sKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuYnVmLnB1c2godmFsdWUgPyAxIDogMCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBieXRlc2AgdmFsdWUsIGxlbmd0aC1kZWxpbWl0ZWQgYXJiaXRyYXJ5IGRhdGEuXG4gICAgICovXG4gICAgYnl0ZXModmFsdWUpIHtcbiAgICAgICAgdGhpcy51aW50MzIodmFsdWUuYnl0ZUxlbmd0aCk7IC8vIHdyaXRlIGxlbmd0aCBvZiBjaHVuayBhcyB2YXJpbnRcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgc3RyaW5nYCB2YWx1ZSwgbGVuZ3RoLWRlbGltaXRlZCBkYXRhIGNvbnZlcnRlZCB0byBVVEYtOCB0ZXh0LlxuICAgICAqL1xuICAgIHN0cmluZyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2h1bmsgPSB0aGlzLnRleHRFbmNvZGVyLmVuY29kZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMudWludDMyKGNodW5rLmJ5dGVMZW5ndGgpOyAvLyB3cml0ZSBsZW5ndGggb2YgY2h1bmsgYXMgdmFyaW50XG4gICAgICAgIHJldHVybiB0aGlzLnJhdyhjaHVuayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgYGZsb2F0YCB2YWx1ZSwgMzItYml0IGZsb2F0aW5nIHBvaW50IG51bWJlci5cbiAgICAgKi9cbiAgICBmbG9hdCh2YWx1ZSkge1xuICAgICAgICBhc3NlcnRGbG9hdDMyKHZhbHVlKTtcbiAgICAgICAgbGV0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgICAgIG5ldyBEYXRhVmlldyhjaHVuay5idWZmZXIpLnNldEZsb2F0MzIoMCwgdmFsdWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5yYXcoY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBkb3VibGVgIHZhbHVlLCBhIDY0LWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIuXG4gICAgICovXG4gICAgZG91YmxlKHZhbHVlKSB7XG4gICAgICAgIGxldCBjaHVuayA9IG5ldyBVaW50OEFycmF5KDgpO1xuICAgICAgICBuZXcgRGF0YVZpZXcoY2h1bmsuYnVmZmVyKS5zZXRGbG9hdDY0KDAsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgZml4ZWQzMmAgdmFsdWUsIGFuIHVuc2lnbmVkLCBmaXhlZC1sZW5ndGggMzItYml0IGludGVnZXIuXG4gICAgICovXG4gICAgZml4ZWQzMih2YWx1ZSkge1xuICAgICAgICBhc3NlcnRVSW50MzIodmFsdWUpO1xuICAgICAgICBsZXQgY2h1bmsgPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgbmV3IERhdGFWaWV3KGNodW5rLmJ1ZmZlcikuc2V0VWludDMyKDAsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgc2ZpeGVkMzJgIHZhbHVlLCBhIHNpZ25lZCwgZml4ZWQtbGVuZ3RoIDMyLWJpdCBpbnRlZ2VyLlxuICAgICAqL1xuICAgIHNmaXhlZDMyKHZhbHVlKSB7XG4gICAgICAgIGFzc2VydEludDMyKHZhbHVlKTtcbiAgICAgICAgbGV0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgICAgIG5ldyBEYXRhVmlldyhjaHVuay5idWZmZXIpLnNldEludDMyKDAsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgc2ludDMyYCB2YWx1ZSwgYSBzaWduZWQsIHppZ3phZy1lbmNvZGVkIDMyLWJpdCB2YXJpbnQuXG4gICAgICovXG4gICAgc2ludDMyKHZhbHVlKSB7XG4gICAgICAgIGFzc2VydEludDMyKHZhbHVlKTtcbiAgICAgICAgLy8gemlnemFnIGVuY29kZVxuICAgICAgICB2YWx1ZSA9ICgodmFsdWUgPDwgMSkgXiAodmFsdWUgPj4gMzEpKSA+Pj4gMDtcbiAgICAgICAgdmFyaW50MzJ3cml0ZSh2YWx1ZSwgdGhpcy5idWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgZml4ZWQ2NGAgdmFsdWUsIGEgc2lnbmVkLCBmaXhlZC1sZW5ndGggNjQtYml0IGludGVnZXIuXG4gICAgICovXG4gICAgc2ZpeGVkNjQodmFsdWUpIHtcbiAgICAgICAgbGV0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoOCk7XG4gICAgICAgIGxldCB2aWV3ID0gbmV3IERhdGFWaWV3KGNodW5rLmJ1ZmZlcik7XG4gICAgICAgIGxldCBsb25nID0gUGJMb25nLmZyb20odmFsdWUpO1xuICAgICAgICB2aWV3LnNldEludDMyKDAsIGxvbmcubG8sIHRydWUpO1xuICAgICAgICB2aWV3LnNldEludDMyKDQsIGxvbmcuaGksIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5yYXcoY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBmaXhlZDY0YCB2YWx1ZSwgYW4gdW5zaWduZWQsIGZpeGVkLWxlbmd0aCA2NCBiaXQgaW50ZWdlci5cbiAgICAgKi9cbiAgICBmaXhlZDY0KHZhbHVlKSB7XG4gICAgICAgIGxldCBjaHVuayA9IG5ldyBVaW50OEFycmF5KDgpO1xuICAgICAgICBsZXQgdmlldyA9IG5ldyBEYXRhVmlldyhjaHVuay5idWZmZXIpO1xuICAgICAgICBsZXQgbG9uZyA9IFBiVUxvbmcuZnJvbSh2YWx1ZSk7XG4gICAgICAgIHZpZXcuc2V0SW50MzIoMCwgbG9uZy5sbywgdHJ1ZSk7XG4gICAgICAgIHZpZXcuc2V0SW50MzIoNCwgbG9uZy5oaSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJhdyhjaHVuayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgYGludDY0YCB2YWx1ZSwgYSBzaWduZWQgNjQtYml0IHZhcmludC5cbiAgICAgKi9cbiAgICBpbnQ2NCh2YWx1ZSkge1xuICAgICAgICBsZXQgbG9uZyA9IFBiTG9uZy5mcm9tKHZhbHVlKTtcbiAgICAgICAgdmFyaW50NjR3cml0ZShsb25nLmxvLCBsb25nLmhpLCB0aGlzLmJ1Zik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBzaW50NjRgIHZhbHVlLCBhIHNpZ25lZCwgemlnLXphZy1lbmNvZGVkIDY0LWJpdCB2YXJpbnQuXG4gICAgICovXG4gICAgc2ludDY0KHZhbHVlKSB7XG4gICAgICAgIGxldCBsb25nID0gUGJMb25nLmZyb20odmFsdWUpLCBcbiAgICAgICAgLy8gemlnemFnIGVuY29kZVxuICAgICAgICBzaWduID0gbG9uZy5oaSA+PiAzMSwgbG8gPSAobG9uZy5sbyA8PCAxKSBeIHNpZ24sIGhpID0gKChsb25nLmhpIDw8IDEpIHwgKGxvbmcubG8gPj4+IDMxKSkgXiBzaWduO1xuICAgICAgICB2YXJpbnQ2NHdyaXRlKGxvLCBoaSwgdGhpcy5idWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgdWludDY0YCB2YWx1ZSwgYW4gdW5zaWduZWQgNjQtYml0IHZhcmludC5cbiAgICAgKi9cbiAgICB1aW50NjQodmFsdWUpIHtcbiAgICAgICAgbGV0IGxvbmcgPSBQYlVMb25nLmZyb20odmFsdWUpO1xuICAgICAgICB2YXJpbnQ2NHdyaXRlKGxvbmcubG8sIGxvbmcuaGksIHRoaXMuYnVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuIiwiLyoqXG4gKiBUaGUgc3ltYm9sIHVzZWQgYXMgYSBrZXkgb24gbWVzc2FnZSBvYmplY3RzIHRvIHN0b3JlIHRoZSBtZXNzYWdlIHR5cGUuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgLSBpdCBpcyBoZXJlIHRvIHN0YXksIGJ1dFxuICogaW1wbGVtZW50YXRpb24gZGV0YWlscyBtYXkgY2hhbmdlIHdpdGhvdXQgbm90aWNlLlxuICovXG5leHBvcnQgY29uc3QgTUVTU0FHRV9UWVBFID0gU3ltYm9sLmZvcihcInByb3RvYnVmLXRzL21lc3NhZ2UtdHlwZVwiKTtcbiIsImltcG9ydCB7IGxvd2VyQ2FtZWxDYXNlIH0gZnJvbSBcIi4vbG93ZXItY2FtZWwtY2FzZVwiO1xuLyoqXG4gKiBTY2FsYXIgdmFsdWUgdHlwZXMuIFRoaXMgaXMgYSBzdWJzZXQgb2YgZmllbGQgdHlwZXMgZGVjbGFyZWQgYnkgcHJvdG9idWZcbiAqIGVudW0gZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUgVGhlIHR5cGVzIEdST1VQIGFuZCBNRVNTQUdFXG4gKiBhcmUgb21pdHRlZCwgYnV0IHRoZSBudW1lcmljYWwgdmFsdWVzIGFyZSBpZGVudGljYWwuXG4gKi9cbmV4cG9ydCB2YXIgU2NhbGFyVHlwZTtcbihmdW5jdGlvbiAoU2NhbGFyVHlwZSkge1xuICAgIC8vIDAgaXMgcmVzZXJ2ZWQgZm9yIGVycm9ycy5cbiAgICAvLyBPcmRlciBpcyB3ZWlyZCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLlxuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIkRPVUJMRVwiXSA9IDFdID0gXCJET1VCTEVcIjtcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJGTE9BVFwiXSA9IDJdID0gXCJGTE9BVFwiO1xuICAgIC8vIE5vdCBaaWdaYWcgZW5jb2RlZC4gIE5lZ2F0aXZlIG51bWJlcnMgdGFrZSAxMCBieXRlcy4gIFVzZSBUWVBFX1NJTlQ2NCBpZlxuICAgIC8vIG5lZ2F0aXZlIHZhbHVlcyBhcmUgbGlrZWx5LlxuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIklOVDY0XCJdID0gM10gPSBcIklOVDY0XCI7XG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiVUlOVDY0XCJdID0gNF0gPSBcIlVJTlQ2NFwiO1xuICAgIC8vIE5vdCBaaWdaYWcgZW5jb2RlZC4gIE5lZ2F0aXZlIG51bWJlcnMgdGFrZSAxMCBieXRlcy4gIFVzZSBUWVBFX1NJTlQzMiBpZlxuICAgIC8vIG5lZ2F0aXZlIHZhbHVlcyBhcmUgbGlrZWx5LlxuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIklOVDMyXCJdID0gNV0gPSBcIklOVDMyXCI7XG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiRklYRUQ2NFwiXSA9IDZdID0gXCJGSVhFRDY0XCI7XG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiRklYRUQzMlwiXSA9IDddID0gXCJGSVhFRDMyXCI7XG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiQk9PTFwiXSA9IDhdID0gXCJCT09MXCI7XG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiU1RSSU5HXCJdID0gOV0gPSBcIlNUUklOR1wiO1xuICAgIC8vIFRhZy1kZWxpbWl0ZWQgYWdncmVnYXRlLlxuICAgIC8vIEdyb3VwIHR5cGUgaXMgZGVwcmVjYXRlZCBhbmQgbm90IHN1cHBvcnRlZCBpbiBwcm90bzMuIEhvd2V2ZXIsIFByb3RvM1xuICAgIC8vIGltcGxlbWVudGF0aW9ucyBzaG91bGQgc3RpbGwgYmUgYWJsZSB0byBwYXJzZSB0aGUgZ3JvdXAgd2lyZSBmb3JtYXQgYW5kXG4gICAgLy8gdHJlYXQgZ3JvdXAgZmllbGRzIGFzIHVua25vd24gZmllbGRzLlxuICAgIC8vIFRZUEVfR1JPVVAgPSAxMCxcbiAgICAvLyBUWVBFX01FU1NBR0UgPSAxMSwgIC8vIExlbmd0aC1kZWxpbWl0ZWQgYWdncmVnYXRlLlxuICAgIC8vIE5ldyBpbiB2ZXJzaW9uIDIuXG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiQllURVNcIl0gPSAxMl0gPSBcIkJZVEVTXCI7XG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiVUlOVDMyXCJdID0gMTNdID0gXCJVSU5UMzJcIjtcbiAgICAvLyBUWVBFX0VOVU0gPSAxNCxcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJTRklYRUQzMlwiXSA9IDE1XSA9IFwiU0ZJWEVEMzJcIjtcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJTRklYRUQ2NFwiXSA9IDE2XSA9IFwiU0ZJWEVENjRcIjtcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJTSU5UMzJcIl0gPSAxN10gPSBcIlNJTlQzMlwiO1xuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIlNJTlQ2NFwiXSA9IDE4XSA9IFwiU0lOVDY0XCI7XG59KShTY2FsYXJUeXBlIHx8IChTY2FsYXJUeXBlID0ge30pKTtcbi8qKlxuICogSmF2YVNjcmlwdCByZXByZXNlbnRhdGlvbiBvZiA2NCBiaXQgaW50ZWdyYWwgdHlwZXMuIEVxdWl2YWxlbnQgdG8gdGhlXG4gKiBmaWVsZCBvcHRpb24gXCJqc3R5cGVcIi5cbiAqXG4gKiBCeSBkZWZhdWx0LCBwcm90b2J1Zi10cyByZXByZXNlbnRzIDY0IGJpdCB0eXBlcyBhcyBgYmlnaW50YC5cbiAqXG4gKiBZb3UgY2FuIGNoYW5nZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgYnkgZW5hYmxpbmcgdGhlIHBsdWdpbiBwYXJhbWV0ZXJcbiAqIGBsb25nX3R5cGVfc3RyaW5nYCwgd2hpY2ggd2lsbCByZXByZXNlbnQgNjQgYml0IHR5cGVzIGFzIGBzdHJpbmdgLlxuICpcbiAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gY2hhbmdlIHRoZSBiZWhhdmlvdXIgZm9yIGluZGl2aWR1YWwgZmllbGRzXG4gKiB3aXRoIHRoZSBmaWVsZCBvcHRpb24gXCJqc3R5cGVcIjpcbiAqXG4gKiBgYGBwcm90b2J1ZlxuICogdWludDY0IG15X2ZpZWxkID0gMSBbanN0eXBlID0gSlNfU1RSSU5HXTtcbiAqIHVpbnQ2NCBvdGhlcl9maWVsZCA9IDIgW2pzdHlwZSA9IEpTX05VTUJFUl07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHZhciBMb25nVHlwZTtcbihmdW5jdGlvbiAoTG9uZ1R5cGUpIHtcbiAgICAvKipcbiAgICAgKiBVc2UgSmF2YVNjcmlwdCBgYmlnaW50YC5cbiAgICAgKlxuICAgICAqIEZpZWxkIG9wdGlvbiBgW2pzdHlwZSA9IEpTX05PUk1BTF1gLlxuICAgICAqL1xuICAgIExvbmdUeXBlW0xvbmdUeXBlW1wiQklHSU5UXCJdID0gMF0gPSBcIkJJR0lOVFwiO1xuICAgIC8qKlxuICAgICAqIFVzZSBKYXZhU2NyaXB0IGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogRmllbGQgb3B0aW9uIGBbanN0eXBlID0gSlNfU1RSSU5HXWAuXG4gICAgICovXG4gICAgTG9uZ1R5cGVbTG9uZ1R5cGVbXCJTVFJJTkdcIl0gPSAxXSA9IFwiU1RSSU5HXCI7XG4gICAgLyoqXG4gICAgICogVXNlIEphdmFTY3JpcHQgYG51bWJlcmAuXG4gICAgICpcbiAgICAgKiBMYXJnZSB2YWx1ZXMgd2lsbCBsb29zZSBwcmVjaXNpb24uXG4gICAgICpcbiAgICAgKiBGaWVsZCBvcHRpb24gYFtqc3R5cGUgPSBKU19OVU1CRVJdYC5cbiAgICAgKi9cbiAgICBMb25nVHlwZVtMb25nVHlwZVtcIk5VTUJFUlwiXSA9IDJdID0gXCJOVU1CRVJcIjtcbn0pKExvbmdUeXBlIHx8IChMb25nVHlwZSA9IHt9KSk7XG4vKipcbiAqIFByb3RvYnVmIDIuMS4wIGludHJvZHVjZWQgcGFja2VkIHJlcGVhdGVkIGZpZWxkcy5cbiAqIFNldHRpbmcgdGhlIGZpZWxkIG9wdGlvbiBgW3BhY2tlZCA9IHRydWVdYCBlbmFibGVzIHBhY2tpbmcuXG4gKlxuICogSW4gcHJvdG8zLCBhbGwgcmVwZWF0ZWQgZmllbGRzIGFyZSBwYWNrZWQgYnkgZGVmYXVsdC5cbiAqIFNldHRpbmcgdGhlIGZpZWxkIG9wdGlvbiBgW3BhY2tlZCA9IGZhbHNlXWAgZGlzYWJsZXMgcGFja2luZy5cbiAqXG4gKiBQYWNrZWQgcmVwZWF0ZWQgZmllbGRzIGFyZSBlbmNvZGVkIHdpdGggYSBzaW5nbGUgdGFnLFxuICogdGhlbiBhIGxlbmd0aC1kZWxpbWl0ZXIsIHRoZW4gdGhlIGVsZW1lbnQgdmFsdWVzLlxuICpcbiAqIFVucGFja2VkIHJlcGVhdGVkIGZpZWxkcyBhcmUgZW5jb2RlZCB3aXRoIGEgdGFnIGFuZFxuICogdmFsdWUgZm9yIGVhY2ggZWxlbWVudC5cbiAqXG4gKiBgYnl0ZXNgIGFuZCBgc3RyaW5nYCBjYW5ub3QgYmUgcGFja2VkLlxuICovXG5leHBvcnQgdmFyIFJlcGVhdFR5cGU7XG4oZnVuY3Rpb24gKFJlcGVhdFR5cGUpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZmllbGQgaXMgbm90IHJlcGVhdGVkLlxuICAgICAqL1xuICAgIFJlcGVhdFR5cGVbUmVwZWF0VHlwZVtcIk5PXCJdID0gMF0gPSBcIk5PXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGZpZWxkIGlzIHJlcGVhdGVkIGFuZCBzaG91bGQgYmUgcGFja2VkLlxuICAgICAqIEludmFsaWQgZm9yIGBieXRlc2AgYW5kIGBzdHJpbmdgLCB0aGV5IGNhbm5vdCBiZSBwYWNrZWQuXG4gICAgICovXG4gICAgUmVwZWF0VHlwZVtSZXBlYXRUeXBlW1wiUEFDS0VEXCJdID0gMV0gPSBcIlBBQ0tFRFwiO1xuICAgIC8qKlxuICAgICAqIFRoZSBmaWVsZCBpcyByZXBlYXRlZCBidXQgc2hvdWxkIG5vdCBiZSBwYWNrZWQuXG4gICAgICogVGhlIG9ubHkgdmFsaWQgcmVwZWF0IHR5cGUgZm9yIHJlcGVhdGVkIGBieXRlc2AgYW5kIGBzdHJpbmdgLlxuICAgICAqL1xuICAgIFJlcGVhdFR5cGVbUmVwZWF0VHlwZVtcIlVOUEFDS0VEXCJdID0gMl0gPSBcIlVOUEFDS0VEXCI7XG59KShSZXBlYXRUeXBlIHx8IChSZXBlYXRUeXBlID0ge30pKTtcbi8qKlxuICogVHVybnMgUGFydGlhbEZpZWxkSW5mbyBpbnRvIEZpZWxkSW5mby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUZpZWxkSW5mbyhmaWVsZCkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICBmaWVsZC5sb2NhbE5hbWUgPSAoX2EgPSBmaWVsZC5sb2NhbE5hbWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGxvd2VyQ2FtZWxDYXNlKGZpZWxkLm5hbWUpO1xuICAgIGZpZWxkLmpzb25OYW1lID0gKF9iID0gZmllbGQuanNvbk5hbWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGxvd2VyQ2FtZWxDYXNlKGZpZWxkLm5hbWUpO1xuICAgIGZpZWxkLnJlcGVhdCA9IChfYyA9IGZpZWxkLnJlcGVhdCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogUmVwZWF0VHlwZS5OTztcbiAgICBmaWVsZC5vcHQgPSAoX2QgPSBmaWVsZC5vcHQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IChmaWVsZC5yZXBlYXQgPyBmYWxzZSA6IGZpZWxkLm9uZW9mID8gZmFsc2UgOiBmaWVsZC5raW5kID09IFwibWVzc2FnZVwiKTtcbiAgICByZXR1cm4gZmllbGQ7XG59XG4vKipcbiAqIFJlYWQgY3VzdG9tIGZpZWxkIG9wdGlvbnMgZnJvbSBhIGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUuXG4gKlxuICogQGRlcHJlY2F0ZWQgdXNlIHJlYWRGaWVsZE9wdGlvbigpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRmllbGRPcHRpb25zKG1lc3NhZ2VUeXBlLCBmaWVsZE5hbWUsIGV4dGVuc2lvbk5hbWUsIGV4dGVuc2lvblR5cGUpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3Qgb3B0aW9ucyA9IChfYSA9IG1lc3NhZ2VUeXBlLmZpZWxkcy5maW5kKChtLCBpKSA9PiBtLmxvY2FsTmFtZSA9PSBmaWVsZE5hbWUgfHwgaSA9PSBmaWVsZE5hbWUpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub3B0aW9ucztcbiAgICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zW2V4dGVuc2lvbk5hbWVdID8gZXh0ZW5zaW9uVHlwZS5mcm9tSnNvbihvcHRpb25zW2V4dGVuc2lvbk5hbWVdKSA6IHVuZGVmaW5lZDtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWFkRmllbGRPcHRpb24obWVzc2FnZVR5cGUsIGZpZWxkTmFtZSwgZXh0ZW5zaW9uTmFtZSwgZXh0ZW5zaW9uVHlwZSkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBvcHRpb25zID0gKF9hID0gbWVzc2FnZVR5cGUuZmllbGRzLmZpbmQoKG0sIGkpID0+IG0ubG9jYWxOYW1lID09IGZpZWxkTmFtZSB8fCBpID09IGZpZWxkTmFtZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vcHRpb25zO1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBvcHRpb25WYWwgPSBvcHRpb25zW2V4dGVuc2lvbk5hbWVdO1xuICAgIGlmIChvcHRpb25WYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gb3B0aW9uVmFsO1xuICAgIH1cbiAgICByZXR1cm4gZXh0ZW5zaW9uVHlwZSA/IGV4dGVuc2lvblR5cGUuZnJvbUpzb24ob3B0aW9uVmFsKSA6IG9wdGlvblZhbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWFkTWVzc2FnZU9wdGlvbihtZXNzYWdlVHlwZSwgZXh0ZW5zaW9uTmFtZSwgZXh0ZW5zaW9uVHlwZSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBtZXNzYWdlVHlwZS5vcHRpb25zO1xuICAgIGNvbnN0IG9wdGlvblZhbCA9IG9wdGlvbnNbZXh0ZW5zaW9uTmFtZV07XG4gICAgaWYgKG9wdGlvblZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25WYWw7XG4gICAgfVxuICAgIHJldHVybiBleHRlbnNpb25UeXBlID8gZXh0ZW5zaW9uVHlwZS5mcm9tSnNvbihvcHRpb25WYWwpIDogb3B0aW9uVmFsO1xufVxuIiwiLyoqXG4gKiBJcyB0aGUgZ2l2ZW4gdmFsdWUgYSB2YWxpZCBvbmVvZiBncm91cD9cbiAqXG4gKiBXZSByZXByZXNlbnQgcHJvdG9idWYgYG9uZW9mYCBhcyBhbGdlYnJhaWMgZGF0YSB0eXBlcyAoQURUKSBpbiBnZW5lcmF0ZWRcbiAqIGNvZGUuIEJ1dCB3aGVuIHdvcmtpbmcgd2l0aCBtZXNzYWdlcyBvZiB1bmtub3duIHR5cGUsIHRoZSBBRFQgZG9lcyBub3RcbiAqIGhlbHAgdXMuXG4gKlxuICogVGhpcyB0eXBlIGd1YXJkIGNoZWNrcyBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGFkaGVyZXMgdG8gdGhlIEFEVCBydWxlcywgd2hpY2hcbiAqIGFyZSBhcyBmb2xsb3dzOlxuICpcbiAqIDEpIE11c3QgYmUgYW4gb2JqZWN0LlxuICpcbiAqIDIpIE11c3QgaGF2ZSBhIFwib25lb2ZLaW5kXCIgZGlzY3JpbWluYXRvciBwcm9wZXJ0eS5cbiAqXG4gKiAzKSBJZiBcIm9uZW9mS2luZFwiIGlzIGB1bmRlZmluZWRgLCBubyBtZW1iZXIgZmllbGQgaXMgc2VsZWN0ZWQuIFRoZSBvYmplY3RcbiAqIG11c3Qgbm90IGhhdmUgYW55IG90aGVyIHByb3BlcnRpZXMuXG4gKlxuICogNCkgSWYgXCJvbmVvZktpbmRcIiBpcyBhIGBzdHJpbmdgLCB0aGUgbWVtYmVyIGZpZWxkIHdpdGggdGhpcyBuYW1lIGlzXG4gKiBzZWxlY3RlZC5cbiAqXG4gKiA1KSBJZiBhIG1lbWJlciBmaWVsZCBpcyBzZWxlY3RlZCwgdGhlIG9iamVjdCBtdXN0IGhhdmUgYSBzZWNvbmQgcHJvcGVydHlcbiAqIHdpdGggdGhpcyBuYW1lLiBUaGUgcHJvcGVydHkgbXVzdCBub3QgYmUgYHVuZGVmaW5lZGAuXG4gKlxuICogNikgTm8gZXh0cmEgcHJvcGVydGllcyBhcmUgYWxsb3dlZC4gVGhlIG9iamVjdCBoYXMgZWl0aGVyIG9uZSBwcm9wZXJ0eVxuICogKG5vIHNlbGVjdGlvbikgb3IgdHdvIHByb3BlcnRpZXMgKHNlbGVjdGlvbikuXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPbmVvZkdyb3VwKGFueSkge1xuICAgIGlmICh0eXBlb2YgYW55ICE9ICdvYmplY3QnIHx8IGFueSA9PT0gbnVsbCB8fCAhYW55Lmhhc093blByb3BlcnR5KCdvbmVvZktpbmQnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZW9mIGFueS5vbmVvZktpbmQpIHtcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgaWYgKGFueVthbnkub25lb2ZLaW5kXSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhhbnkpLmxlbmd0aCA9PSAyO1xuICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoYW55KS5sZW5ndGggPT0gMTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4vKipcbiAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZCBpbiBhIG9uZW9mIGdyb3VwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T25lb2ZWYWx1ZShvbmVvZiwga2luZCkge1xuICAgIHJldHVybiBvbmVvZltraW5kXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXRPbmVvZlZhbHVlKG9uZW9mLCBraW5kLCB2YWx1ZSkge1xuICAgIGlmIChvbmVvZi5vbmVvZktpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxldGUgb25lb2Zbb25lb2Yub25lb2ZLaW5kXTtcbiAgICB9XG4gICAgb25lb2Yub25lb2ZLaW5kID0ga2luZDtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvbmVvZltraW5kXSA9IHZhbHVlO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXRVbmtub3duT25lb2ZWYWx1ZShvbmVvZiwga2luZCwgdmFsdWUpIHtcbiAgICBpZiAob25lb2Yub25lb2ZLaW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVsZXRlIG9uZW9mW29uZW9mLm9uZW9mS2luZF07XG4gICAgfVxuICAgIG9uZW9mLm9uZW9mS2luZCA9IGtpbmQ7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYga2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9uZW9mW2tpbmRdID0gdmFsdWU7XG4gICAgfVxufVxuLyoqXG4gKiBSZW1vdmVzIHRoZSBzZWxlY3RlZCBmaWVsZCBpbiBhIG9uZW9mIGdyb3VwLlxuICpcbiAqIE5vdGUgdGhhdCB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIG1vZGlmeSBhIG9uZW9mIGdyb3VwIGlzIHRvIHNldFxuICogYSBuZXcgb2JqZWN0OlxuICpcbiAqIGBgYHRzXG4gKiBtZXNzYWdlLnJlc3VsdCA9IHsgb25lb2ZLaW5kOiB1bmRlZmluZWQgfTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJPbmVvZlZhbHVlKG9uZW9mKSB7XG4gICAgaWYgKG9uZW9mLm9uZW9mS2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlbGV0ZSBvbmVvZltvbmVvZi5vbmVvZktpbmRdO1xuICAgIH1cbiAgICBvbmVvZi5vbmVvZktpbmQgPSB1bmRlZmluZWQ7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIHNlbGVjdGVkIHZhbHVlIG9mIHRoZSBnaXZlbiBvbmVvZiBncm91cC5cbiAqXG4gKiBOb3QgdGhhdCB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIGFjY2VzcyBhIG9uZW9mIGdyb3VwIGlzIHRvIGNoZWNrXG4gKiB0aGUgXCJvbmVvZktpbmRcIiBwcm9wZXJ0eSBhbmQgbGV0IFR5cGVTY3JpcHQgbmFycm93IGRvd24gdGhlIHVuaW9uXG4gKiB0eXBlIGZvciB5b3U6XG4gKlxuICogYGBgdHNcbiAqIGlmIChtZXNzYWdlLnJlc3VsdC5vbmVvZktpbmQgPT09IFwiZXJyb3JcIikge1xuICogICBtZXNzYWdlLnJlc3VsdC5lcnJvcjsgLy8gc3RyaW5nXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBJbiB0aGUgcmFyZSBjYXNlIHlvdSBqdXN0IG5lZWQgdGhlIHZhbHVlLCBhbmQgZG8gbm90IGNhcmUgYWJvdXRcbiAqIHdoaWNoIHByb3RvYnVmIGZpZWxkIGlzIHNlbGVjdGVkLCB5b3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uXG4gKiBmb3IgY29udmVuaWVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3RlZE9uZW9mVmFsdWUob25lb2YpIHtcbiAgICBpZiAob25lb2Yub25lb2ZLaW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIG9uZW9mW29uZW9mLm9uZW9mS2luZF07XG59XG4iLCJpbXBvcnQgeyBMb25nVHlwZSwgU2NhbGFyVHlwZSB9IGZyb20gXCIuL3JlZmxlY3Rpb24taW5mb1wiO1xuaW1wb3J0IHsgaXNPbmVvZkdyb3VwIH0gZnJvbSBcIi4vb25lb2ZcIjtcbi8vIG5vaW5zcGVjdGlvbiBKU01ldGhvZENhbkJlU3RhdGljXG5leHBvcnQgY2xhc3MgUmVmbGVjdGlvblR5cGVDaGVjayB7XG4gICAgY29uc3RydWN0b3IoaW5mbykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuZmllbGRzID0gKF9hID0gaW5mby5maWVsZHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdO1xuICAgIH1cbiAgICBwcmVwYXJlKCkge1xuICAgICAgICBpZiAodGhpcy5kYXRhKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCByZXEgPSBbXSwga25vd24gPSBbXSwgb25lb2ZzID0gW107XG4gICAgICAgIGZvciAobGV0IGZpZWxkIG9mIHRoaXMuZmllbGRzKSB7XG4gICAgICAgICAgICBpZiAoZmllbGQub25lb2YpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW9uZW9mcy5pbmNsdWRlcyhmaWVsZC5vbmVvZikpIHtcbiAgICAgICAgICAgICAgICAgICAgb25lb2ZzLnB1c2goZmllbGQub25lb2YpO1xuICAgICAgICAgICAgICAgICAgICByZXEucHVzaChmaWVsZC5vbmVvZik7XG4gICAgICAgICAgICAgICAgICAgIGtub3duLnB1c2goZmllbGQub25lb2YpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGtub3duLnB1c2goZmllbGQubG9jYWxOYW1lKTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5vcHQgfHwgZmllbGQucmVwZWF0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5wdXNoKGZpZWxkLmxvY2FsTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5yZXBlYXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLnB1c2goZmllbGQubG9jYWxOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXEucHVzaChmaWVsZC5sb2NhbE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YSA9IHsgcmVxLCBrbm93biwgb25lb2ZzOiBPYmplY3QudmFsdWVzKG9uZW9mcykgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXMgdGhlIGFyZ3VtZW50IGEgdmFsaWQgbWVzc2FnZSBhcyBzcGVjaWZpZWQgYnkgdGhlXG4gICAgICogcmVmbGVjdGlvbiBpbmZvcm1hdGlvbj9cbiAgICAgKlxuICAgICAqIENoZWNrcyBhbGwgZmllbGQgdHlwZXMgcmVjdXJzaXZlbHkuIFRoZSBgZGVwdGhgXG4gICAgICogc3BlY2lmaWVzIGhvdyBkZWVwIGludG8gdGhlIHN0cnVjdHVyZSB0aGUgY2hlY2sgd2lsbCBiZS5cbiAgICAgKlxuICAgICAqIFdpdGggYSBkZXB0aCBvZiAwLCBvbmx5IHRoZSBwcmVzZW5jZSBvZiBmaWVsZHNcbiAgICAgKiBpcyBjaGVja2VkLlxuICAgICAqXG4gICAgICogV2l0aCBhIGRlcHRoIG9mIDEgb3IgbW9yZSwgdGhlIGZpZWxkIHR5cGVzIGFyZSBjaGVja2VkLlxuICAgICAqXG4gICAgICogV2l0aCBhIGRlcHRoIG9mIDIgb3IgbW9yZSwgdGhlIG1lbWJlcnMgb2YgbWFwLCByZXBlYXRlZFxuICAgICAqIGFuZCBtZXNzYWdlIGZpZWxkcyBhcmUgY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIE1lc3NhZ2UgZmllbGRzIHdpbGwgYmUgY2hlY2tlZCByZWN1cnNpdmVseSB3aXRoIGRlcHRoIC0gMS5cbiAgICAgKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbWFwIGVudHJpZXMgLyByZXBlYXRlZCB2YWx1ZXMgYmVpbmcgY2hlY2tlZFxuICAgICAqIGlzIDwgZGVwdGguXG4gICAgICovXG4gICAgaXMobWVzc2FnZSwgZGVwdGgsIGFsbG93RXhjZXNzUHJvcGVydGllcyA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChkZXB0aCA8IDApXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKG1lc3NhZ2UgPT09IG51bGwgfHwgbWVzc2FnZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXNzYWdlICE9ICdvYmplY3QnKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnByZXBhcmUoKTtcbiAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhtZXNzYWdlKSwgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICAgICAgLy8gaWYgYSByZXF1aXJlZCBmaWVsZCBpcyBtaXNzaW5nIGluIGFyZywgdGhpcyBjYW5ub3QgYmUgYSBUXG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCA8IGRhdGEucmVxLmxlbmd0aCB8fCBkYXRhLnJlcS5zb21lKG4gPT4gIWtleXMuaW5jbHVkZXMobikpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIWFsbG93RXhjZXNzUHJvcGVydGllcykge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGFyZyBjb250YWlucyBhIGtleSB3ZSBkb250IGtub3csIHRoaXMgaXMgbm90IGEgbGl0ZXJhbCBUXG4gICAgICAgICAgICBpZiAoa2V5cy5zb21lKGsgPT4gIWRhdGEua25vd24uaW5jbHVkZXMoaykpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBcIldpdGggYSBkZXB0aCBvZiAwLCBvbmx5IHRoZSBwcmVzZW5jZSBhbmQgYWJzZW5jZSBvZiBmaWVsZHMgaXMgY2hlY2tlZC5cIlxuICAgICAgICAvLyBcIldpdGggYSBkZXB0aCBvZiAxIG9yIG1vcmUsIHRoZSBmaWVsZCB0eXBlcyBhcmUgY2hlY2tlZC5cIlxuICAgICAgICBpZiAoZGVwdGggPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayBvbmVvZiBncm91cFxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgZGF0YS5vbmVvZnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gbWVzc2FnZVtuYW1lXTtcbiAgICAgICAgICAgIGlmICghaXNPbmVvZkdyb3VwKGdyb3VwKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoZ3JvdXAub25lb2ZLaW5kID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzLmZpbmQoZiA9PiBmLmxvY2FsTmFtZSA9PT0gZ3JvdXAub25lb2ZLaW5kKTtcbiAgICAgICAgICAgIGlmICghZmllbGQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyB3ZSBmb3VuZCBubyBmaWVsZCwgYnV0IGhhdmUgYSBraW5kLCBzb21ldGhpbmcgaXMgd3JvbmdcbiAgICAgICAgICAgIGlmICghdGhpcy5maWVsZChncm91cFtncm91cC5vbmVvZktpbmRdLCBmaWVsZCwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIHR5cGVzXG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5maWVsZHMpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZC5vbmVvZiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZpZWxkKG1lc3NhZ2VbZmllbGQubG9jYWxOYW1lXSwgZmllbGQsIGFsbG93RXhjZXNzUHJvcGVydGllcywgZGVwdGgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZmllbGQoYXJnLCBmaWVsZCwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCkge1xuICAgICAgICBsZXQgcmVwZWF0ZWQgPSBmaWVsZC5yZXBlYXQ7XG4gICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkLm9wdDtcbiAgICAgICAgICAgICAgICBpZiAocmVwZWF0ZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcnMoYXJnLCBmaWVsZC5ULCBkZXB0aCwgZmllbGQuTCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGFyKGFyZywgZmllbGQuVCwgZmllbGQuTCk7XG4gICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkLm9wdDtcbiAgICAgICAgICAgICAgICBpZiAocmVwZWF0ZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcnMoYXJnLCBTY2FsYXJUeXBlLklOVDMyLCBkZXB0aCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGFyKGFyZywgU2NhbGFyVHlwZS5JTlQzMik7XG4gICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlcGVhdGVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlcyhhcmcsIGZpZWxkLlQoKSwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZShhcmcsIGZpZWxkLlQoKSwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCk7XG4gICAgICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmcgIT0gJ29iamVjdCcgfHwgYXJnID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGRlcHRoIDwgMilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hcEtleXMoYXJnLCBmaWVsZC5LLCBkZXB0aCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLlYua2luZCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsYXJzKE9iamVjdC52YWx1ZXMoYXJnKSwgZmllbGQuVi5ULCBkZXB0aCwgZmllbGQuVi5MKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcnMoT2JqZWN0LnZhbHVlcyhhcmcpLCBTY2FsYXJUeXBlLklOVDMyLCBkZXB0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlcyhPYmplY3QudmFsdWVzKGFyZyksIGZpZWxkLlYuVCgpLCBhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMsIGRlcHRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIG1lc3NhZ2UoYXJnLCB0eXBlLCBhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMsIGRlcHRoKSB7XG4gICAgICAgIGlmIChhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlLmlzQXNzaWduYWJsZShhcmcsIGRlcHRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZS5pcyhhcmcsIGRlcHRoKTtcbiAgICB9XG4gICAgbWVzc2FnZXMoYXJnLCB0eXBlLCBhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMsIGRlcHRoKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcmcpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGVwdGggPCAyKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJnLmxlbmd0aCAmJiBpIDwgZGVwdGg7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAoIXR5cGUuaXNBc3NpZ25hYmxlKGFyZ1tpXSwgZGVwdGggLSAxKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmcubGVuZ3RoICYmIGkgPCBkZXB0aDsgaSsrKVxuICAgICAgICAgICAgICAgIGlmICghdHlwZS5pcyhhcmdbaV0sIGRlcHRoIC0gMSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc2NhbGFyKGFyZywgdHlwZSwgbG9uZ1R5cGUpIHtcbiAgICAgICAgbGV0IGFyZ1R5cGUgPSB0eXBlb2YgYXJnO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5VSU5UNjQ6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRklYRUQ2NDpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5JTlQ2NDpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQ2NDpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UNjQ6XG4gICAgICAgICAgICAgICAgc3dpdGNoIChsb25nVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExvbmdUeXBlLkJJR0lOVDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmdUeXBlID09IFwiYmlnaW50XCI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTG9uZ1R5cGUuTlVNQkVSOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFyZ1R5cGUgPT0gXCJudW1iZXJcIiAmJiAhaXNOYU4oYXJnKTtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmdUeXBlID09IFwic3RyaW5nXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJPT0w6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ1R5cGUgPT0gJ2Jvb2xlYW4nO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNUUklORzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJnVHlwZSA9PSAnc3RyaW5nJztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CWVRFUzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJnIGluc3RhbmNlb2YgVWludDhBcnJheTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5ET1VCTEU6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRkxPQVQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ1R5cGUgPT0gJ251bWJlcicgJiYgIWlzTmFOKGFyZyk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5VSU5UMzI6XG4gICAgICAgICAgICAgICAgLy8gY2FzZSBTY2FsYXJUeXBlLkZJWEVEMzI6XG4gICAgICAgICAgICAgICAgLy8gY2FzZSBTY2FsYXJUeXBlLklOVDMyOlxuICAgICAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5TSU5UMzI6XG4gICAgICAgICAgICAgICAgLy8gY2FzZSBTY2FsYXJUeXBlLlNGSVhFRDMyOlxuICAgICAgICAgICAgICAgIHJldHVybiBhcmdUeXBlID09ICdudW1iZXInICYmIE51bWJlci5pc0ludGVnZXIoYXJnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzY2FsYXJzKGFyZywgdHlwZSwgZGVwdGgsIGxvbmdUeXBlKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcmcpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGVwdGggPCAyKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZy5sZW5ndGggJiYgaSA8IGRlcHRoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNjYWxhcihhcmdbaV0sIHR5cGUsIGxvbmdUeXBlKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbWFwS2V5cyhtYXAsIHR5cGUsIGRlcHRoKSB7XG4gICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMobWFwKTtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuSU5UMzI6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRklYRUQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UMzI6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuVUlOVDMyOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcnMoa2V5cy5zbGljZSgwLCBkZXB0aCkubWFwKGsgPT4gcGFyc2VJbnQoaykpLCB0eXBlLCBkZXB0aCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuQk9PTDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsYXJzKGtleXMuc2xpY2UoMCwgZGVwdGgpLm1hcChrID0+IGsgPT0gJ3RydWUnID8gdHJ1ZSA6IGsgPT0gJ2ZhbHNlJyA/IGZhbHNlIDogayksIHR5cGUsIGRlcHRoKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGFycyhrZXlzLCB0eXBlLCBkZXB0aCwgTG9uZ1R5cGUuU1RSSU5HKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IExvbmdUeXBlIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1pbmZvXCI7XG4vKipcbiAqIFV0aWxpdHkgbWV0aG9kIHRvIGNvbnZlcnQgYSBQYkxvbmcgb3IgUGJVbG9uZyB0byBhIEphdmFTY3JpcHRcbiAqIHJlcHJlc2VudGF0aW9uIGR1cmluZyBydW50aW1lLlxuICpcbiAqIFdvcmtzIHdpdGggZ2VuZXJhdGVkIGZpZWxkIGluZm9ybWF0aW9uLCBgdW5kZWZpbmVkYCBpcyBlcXVpdmFsZW50XG4gKiB0byBgU1RSSU5HYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZmxlY3Rpb25Mb25nQ29udmVydChsb25nLCB0eXBlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgTG9uZ1R5cGUuQklHSU5UOlxuICAgICAgICAgICAgcmV0dXJuIGxvbmcudG9CaWdJbnQoKTtcbiAgICAgICAgY2FzZSBMb25nVHlwZS5OVU1CRVI6XG4gICAgICAgICAgICByZXR1cm4gbG9uZy50b051bWJlcigpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgICAgICAvLyBjYXNlIExvbmdUeXBlLlNUUklORzpcbiAgICAgICAgICAgIHJldHVybiBsb25nLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgaXNKc29uT2JqZWN0LCB0eXBlb2ZKc29uVmFsdWUgfSBmcm9tIFwiLi9qc29uLXR5cGluZ3NcIjtcbmltcG9ydCB7IGJhc2U2NGRlY29kZSB9IGZyb20gXCIuL2Jhc2U2NFwiO1xuaW1wb3J0IHsgTG9uZ1R5cGUsIFNjYWxhclR5cGUgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWluZm9cIjtcbmltcG9ydCB7IFBiTG9uZywgUGJVTG9uZyB9IGZyb20gXCIuL3BiLWxvbmdcIjtcbmltcG9ydCB7IGFzc2VydCwgYXNzZXJ0RmxvYXQzMiwgYXNzZXJ0SW50MzIsIGFzc2VydFVJbnQzMiB9IGZyb20gXCIuL2Fzc2VydFwiO1xuaW1wb3J0IHsgcmVmbGVjdGlvbkxvbmdDb252ZXJ0IH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1sb25nLWNvbnZlcnRcIjtcbi8qKlxuICogUmVhZHMgcHJvdG8zIG1lc3NhZ2VzIGluIGNhbm9uaWNhbCBKU09OIGZvcm1hdCB1c2luZyByZWZsZWN0aW9uIGluZm9ybWF0aW9uLlxuICpcbiAqIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICovXG5leHBvcnQgY2xhc3MgUmVmbGVjdGlvbkpzb25SZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKGluZm8pIHtcbiAgICAgICAgdGhpcy5pbmZvID0gaW5mbztcbiAgICB9XG4gICAgcHJlcGFyZSgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGhpcy5mTWFwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZk1hcCA9IHt9O1xuICAgICAgICAgICAgY29uc3QgZmllbGRzSW5wdXQgPSAoX2EgPSB0aGlzLmluZm8uZmllbGRzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzSW5wdXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZNYXBbZmllbGQubmFtZV0gPSBmaWVsZDtcbiAgICAgICAgICAgICAgICB0aGlzLmZNYXBbZmllbGQuanNvbk5hbWVdID0gZmllbGQ7XG4gICAgICAgICAgICAgICAgdGhpcy5mTWFwW2ZpZWxkLmxvY2FsTmFtZV0gPSBmaWVsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDYW5ub3QgcGFyc2UgSlNPTiA8dHlwZSBvZiBqc29uVmFsdWU+IGZvciA8dHlwZSBuYW1lPiM8ZmllbGROYW1lPi5cbiAgICBhc3NlcnQoY29uZGl0aW9uLCBmaWVsZE5hbWUsIGpzb25WYWx1ZSkge1xuICAgICAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgICAgICAgbGV0IHdoYXQgPSB0eXBlb2ZKc29uVmFsdWUoanNvblZhbHVlKTtcbiAgICAgICAgICAgIGlmICh3aGF0ID09IFwibnVtYmVyXCIgfHwgd2hhdCA9PSBcImJvb2xlYW5cIilcbiAgICAgICAgICAgICAgICB3aGF0ID0ganNvblZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSBKU09OICR7d2hhdH0gZm9yICR7dGhpcy5pbmZvLnR5cGVOYW1lfSMke2ZpZWxkTmFtZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhIG1lc3NhZ2UgZnJvbSBjYW5vbmljYWwgSlNPTiBmb3JtYXQgaW50byB0aGUgdGFyZ2V0IG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBSZXBlYXRlZCBmaWVsZHMgYXJlIGFwcGVuZGVkLiBNYXAgZW50cmllcyBhcmUgYWRkZWQsIG92ZXJ3cml0aW5nXG4gICAgICogZXhpc3Rpbmcga2V5cy5cbiAgICAgKlxuICAgICAqIElmIGEgbWVzc2FnZSBmaWVsZCBpcyBhbHJlYWR5IHByZXNlbnQsIGl0IHdpbGwgYmUgbWVyZ2VkIHdpdGggdGhlXG4gICAgICogbmV3IGRhdGEuXG4gICAgICovXG4gICAgcmVhZChpbnB1dCwgbWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnByZXBhcmUoKTtcbiAgICAgICAgY29uc3Qgb25lb2ZzSGFuZGxlZCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IFtqc29uS2V5LCBqc29uVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGlucHV0KSkge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZNYXBbanNvbktleV07XG4gICAgICAgICAgICBpZiAoIWZpZWxkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZVVua25vd25GaWVsZHMpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgdW5rbm93biBmaWVsZCB3aGlsZSByZWFkaW5nICR7dGhpcy5pbmZvLnR5cGVOYW1lfSBmcm9tIEpTT04gZm9ybWF0LiBKU09OIGtleTogJHtqc29uS2V5fWApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbG9jYWxOYW1lID0gZmllbGQubG9jYWxOYW1lO1xuICAgICAgICAgICAgLy8gaGFuZGxlIG9uZW9mIEFEVFxuICAgICAgICAgICAgbGV0IHRhcmdldDsgLy8gdGhpcyB3aWxsIGJlIHRoZSB0YXJnZXQgZm9yIHRoZSBmaWVsZCB2YWx1ZSwgd2hldGhlciBpdCBpcyBtZW1iZXIgb2YgYSBvbmVvZiBvciBub3RcbiAgICAgICAgICAgIGlmIChmaWVsZC5vbmVvZikge1xuICAgICAgICAgICAgICAgIGlmIChqc29uVmFsdWUgPT09IG51bGwgJiYgKGZpZWxkLmtpbmQgIT09ICdlbnVtJyB8fCBmaWVsZC5UKClbMF0gIT09ICdnb29nbGUucHJvdG9idWYuTnVsbFZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHNpbmNlIGpzb24gb2JqZWN0cyBhcmUgdW5vcmRlcmVkIGJ5IHNwZWNpZmljYXRpb24sIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB0YWtlIHRoZSBsYXN0IG9mIG11bHRpcGxlIG9uZW9mc1xuICAgICAgICAgICAgICAgIGlmIChvbmVvZnNIYW5kbGVkLmluY2x1ZGVzKGZpZWxkLm9uZW9mKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNdWx0aXBsZSBtZW1iZXJzIG9mIHRoZSBvbmVvZiBncm91cCBcIiR7ZmllbGQub25lb2Z9XCIgb2YgJHt0aGlzLmluZm8udHlwZU5hbWV9IGFyZSBwcmVzZW50IGluIEpTT04uYCk7XG4gICAgICAgICAgICAgICAgb25lb2ZzSGFuZGxlZC5wdXNoKGZpZWxkLm9uZW9mKTtcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSBtZXNzYWdlW2ZpZWxkLm9uZW9mXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgb25lb2ZLaW5kOiBsb2NhbE5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gbWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHdlIGhhdmUgaGFuZGxlZCBvbmVvZiBhYm92ZS4gd2UganVzdCBoYXZlIHJlYWQgdGhlIHZhbHVlIGludG8gYHRhcmdldGAuXG4gICAgICAgICAgICBpZiAoZmllbGQua2luZCA9PSAnbWFwJykge1xuICAgICAgICAgICAgICAgIGlmIChqc29uVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlucHV0XG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQoaXNKc29uT2JqZWN0KGpzb25WYWx1ZSksIGZpZWxkLm5hbWUsIGpzb25WYWx1ZSk7XG4gICAgICAgICAgICAgICAgLy8gb3VyIHRhcmdldCB0byBwdXQgbWFwIGVudHJpZXMgaW50b1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkT2JqID0gdGFyZ2V0W2xvY2FsTmFtZV07XG4gICAgICAgICAgICAgICAgLy8gcmVhZCBlbnRyaWVzXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbanNvbk9iaktleSwganNvbk9ialZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0KGpzb25PYmpWYWx1ZSAhPT0gbnVsbCwgZmllbGQubmFtZSArIFwiIG1hcCB2YWx1ZVwiLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVhZCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLlYua2luZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBmaWVsZC5WLlQoKS5pbnRlcm5hbEpzb25SZWFkKGpzb25PYmpWYWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHRoaXMuZW51bShmaWVsZC5WLlQoKSwganNvbk9ialZhbHVlLCBmaWVsZC5uYW1lLCBvcHRpb25zLmlnbm9yZVVua25vd25GaWVsZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB0aGlzLnNjYWxhcihqc29uT2JqVmFsdWUsIGZpZWxkLlYuVCwgZmllbGQuVi5MLCBmaWVsZC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2VydCh2YWwgIT09IHVuZGVmaW5lZCwgZmllbGQubmFtZSArIFwiIG1hcCB2YWx1ZVwiLCBqc29uT2JqVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyByZWFkIGtleVxuICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0ganNvbk9iaktleTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLksgPT0gU2NhbGFyVHlwZS5CT09MKVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0ga2V5ID09IFwidHJ1ZVwiID8gdHJ1ZSA6IGtleSA9PSBcImZhbHNlXCIgPyBmYWxzZSA6IGtleTtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5zY2FsYXIoa2V5LCBmaWVsZC5LLCBMb25nVHlwZS5TVFJJTkcsIGZpZWxkLm5hbWUpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkT2JqW2tleV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZmllbGQucmVwZWF0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGpzb25WYWx1ZSA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgaW5wdXRcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChBcnJheS5pc0FycmF5KGpzb25WYWx1ZSksIGZpZWxkLm5hbWUsIGpzb25WYWx1ZSk7XG4gICAgICAgICAgICAgICAgLy8gb3VyIHRhcmdldCB0byBwdXQgYXJyYXkgZW50cmllcyBpbnRvXG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGRBcnIgPSB0YXJnZXRbbG9jYWxOYW1lXTtcbiAgICAgICAgICAgICAgICAvLyByZWFkIGFycmF5IGVudHJpZXNcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGpzb25JdGVtIG9mIGpzb25WYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChqc29uSXRlbSAhPT0gbnVsbCwgZmllbGQubmFtZSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWw7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBmaWVsZC5UKCkuaW50ZXJuYWxKc29uUmVhZChqc29uSXRlbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHRoaXMuZW51bShmaWVsZC5UKCksIGpzb25JdGVtLCBmaWVsZC5uYW1lLCBvcHRpb25zLmlnbm9yZVVua25vd25GaWVsZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB0aGlzLnNjYWxhcihqc29uSXRlbSwgZmllbGQuVCwgZmllbGQuTCwgZmllbGQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQodmFsICE9PSB1bmRlZmluZWQsIGZpZWxkLm5hbWUsIGpzb25WYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkQXJyLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqc29uVmFsdWUgPT09IG51bGwgJiYgZmllbGQuVCgpLnR5cGVOYW1lICE9ICdnb29nbGUucHJvdG9idWYuVmFsdWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQoZmllbGQub25lb2YgPT09IHVuZGVmaW5lZCwgZmllbGQubmFtZSArIFwiIChvbmVvZiBtZW1iZXIpXCIsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2xvY2FsTmFtZV0gPSBmaWVsZC5UKCkuaW50ZXJuYWxKc29uUmVhZChqc29uVmFsdWUsIG9wdGlvbnMsIHRhcmdldFtsb2NhbE5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbCA9IHRoaXMuZW51bShmaWVsZC5UKCksIGpzb25WYWx1ZSwgZmllbGQubmFtZSwgb3B0aW9ucy5pZ25vcmVVbmtub3duRmllbGRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2xvY2FsTmFtZV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2xvY2FsTmFtZV0gPSB0aGlzLnNjYWxhcihqc29uVmFsdWUsIGZpZWxkLlQsIGZpZWxkLkwsIGZpZWxkLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYGZhbHNlYCBmb3IgdW5yZWNvZ25pemVkIHN0cmluZyByZXByZXNlbnRhdGlvbnMuXG4gICAgICpcbiAgICAgKiBnb29nbGUucHJvdG9idWYuTnVsbFZhbHVlIGFjY2VwdHMgb25seSBKU09OIGBudWxsYCAob3IgdGhlIG9sZCBgXCJOVUxMX1ZBTFVFXCJgKS5cbiAgICAgKi9cbiAgICBlbnVtKHR5cGUsIGpzb24sIGZpZWxkTmFtZSwgaWdub3JlVW5rbm93bkZpZWxkcykge1xuICAgICAgICBpZiAodHlwZVswXSA9PSAnZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZScpXG4gICAgICAgICAgICBhc3NlcnQoanNvbiA9PT0gbnVsbCB8fCBqc29uID09PSBcIk5VTExfVkFMVUVcIiwgYFVuYWJsZSB0byBwYXJzZSBmaWVsZCAke3RoaXMuaW5mby50eXBlTmFtZX0jJHtmaWVsZE5hbWV9LCBlbnVtICR7dHlwZVswXX0gb25seSBhY2NlcHRzIG51bGwuYCk7XG4gICAgICAgIGlmIChqc29uID09PSBudWxsKVxuICAgICAgICAgICAgLy8gd2UgcmVxdWlyZSAwIHRvIGJlIGRlZmF1bHQgdmFsdWUgZm9yIGFsbCBlbnVtc1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIHN3aXRjaCAodHlwZW9mIGpzb24pIHtcbiAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgICBhc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihqc29uKSwgYFVuYWJsZSB0byBwYXJzZSBmaWVsZCAke3RoaXMuaW5mby50eXBlTmFtZX0jJHtmaWVsZE5hbWV9LCBlbnVtIGNhbiBvbmx5IGJlIGludGVncmFsIG51bWJlciwgZ290ICR7anNvbn0uYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGpzb247XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsRW51bU5hbWUgPSBqc29uO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlWzJdICYmIGpzb24uc3Vic3RyaW5nKDAsIHR5cGVbMl0ubGVuZ3RoKSA9PT0gdHlwZVsyXSlcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9va3VwIHdpdGhvdXQgdGhlIHNoYXJlZCBwcmVmaXhcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxFbnVtTmFtZSA9IGpzb24uc3Vic3RyaW5nKHR5cGVbMl0ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBsZXQgZW51bU51bWJlciA9IHR5cGVbMV1bbG9jYWxFbnVtTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbnVtTnVtYmVyID09PSAndW5kZWZpbmVkJyAmJiBpZ25vcmVVbmtub3duRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiBlbnVtTnVtYmVyID09IFwibnVtYmVyXCIsIGBVbmFibGUgdG8gcGFyc2UgZmllbGQgJHt0aGlzLmluZm8udHlwZU5hbWV9IyR7ZmllbGROYW1lfSwgZW51bSAke3R5cGVbMF19IGhhcyBubyB2YWx1ZSBmb3IgXCIke2pzb259XCIuYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudW1OdW1iZXI7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KGZhbHNlLCBgVW5hYmxlIHRvIHBhcnNlIGZpZWxkICR7dGhpcy5pbmZvLnR5cGVOYW1lfSMke2ZpZWxkTmFtZX0sIGNhbm5vdCBwYXJzZSBlbnVtIHZhbHVlIGZyb20gJHt0eXBlb2YganNvbn1cIi5gKTtcbiAgICB9XG4gICAgc2NhbGFyKGpzb24sIHR5cGUsIGxvbmdUeXBlLCBmaWVsZE5hbWUpIHtcbiAgICAgICAgbGV0IGU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAvLyBmbG9hdCwgZG91YmxlOiBKU09OIHZhbHVlIHdpbGwgYmUgYSBudW1iZXIgb3Igb25lIG9mIHRoZSBzcGVjaWFsIHN0cmluZyB2YWx1ZXMgXCJOYU5cIiwgXCJJbmZpbml0eVwiLCBhbmQgXCItSW5maW5pdHlcIi5cbiAgICAgICAgICAgICAgICAvLyBFaXRoZXIgbnVtYmVycyBvciBzdHJpbmdzIGFyZSBhY2NlcHRlZC4gRXhwb25lbnQgbm90YXRpb24gaXMgYWxzbyBhY2NlcHRlZC5cbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRE9VQkxFOlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GTE9BVDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLjA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBcIk5hTlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlci5OYU47XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBcIkluZmluaXR5XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICAgICAgICAgICAgICBpZiAoanNvbiA9PT0gXCItSW5maW5pdHlcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlID0gXCJlbXB0eSBzdHJpbmdcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YganNvbiA9PSBcInN0cmluZ1wiICYmIGpzb24udHJpbSgpLmxlbmd0aCAhPT0ganNvbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBcImV4dHJhIHdoaXRlc3BhY2VcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YganNvbiAhPSBcInN0cmluZ1wiICYmIHR5cGVvZiBqc29uICE9IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBmbG9hdCA9IE51bWJlcihqc29uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihmbG9hdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBcIm5vdCBhIG51bWJlclwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoZmxvYXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZpbml0eSBhbmQgLWluZmluaXR5IGFyZSBoYW5kbGVkIGJ5IHN0cmluZyByZXByZXNlbnRhdGlvbiBhYm92ZSwgc28gdGhpcyBpcyBhbiBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFwidG9vIGxhcmdlIG9yIHNtYWxsXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBTY2FsYXJUeXBlLkZMT0FUKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RmxvYXQzMihmbG9hdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdDtcbiAgICAgICAgICAgICAgICAvLyBpbnQzMiwgZml4ZWQzMiwgdWludDMyOiBKU09OIHZhbHVlIHdpbGwgYmUgYSBkZWNpbWFsIG51bWJlci4gRWl0aGVyIG51bWJlcnMgb3Igc3RyaW5ncyBhcmUgYWNjZXB0ZWQuXG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDMyOlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDMyOlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQzMjpcbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDMyOlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5VSU5UMzI6XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbnQzMjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uID09IFwibnVtYmVyXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMiA9IGpzb247XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpzb24gPT09IFwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBlID0gXCJlbXB0eSBzdHJpbmdcIjtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGpzb24gPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24udHJpbSgpLmxlbmd0aCAhPT0ganNvbi5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFwiZXh0cmEgd2hpdGVzcGFjZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyID0gTnVtYmVyKGpzb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnQzMiA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFNjYWxhclR5cGUuVUlOVDMyKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VUludDMyKGludDMyKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SW50MzIoaW50MzIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50MzI7XG4gICAgICAgICAgICAgICAgLy8gaW50NjQsIGZpeGVkNjQsIHVpbnQ2NDogSlNPTiB2YWx1ZSB3aWxsIGJlIGEgZGVjaW1hbCBzdHJpbmcuIEVpdGhlciBudW1iZXJzIG9yIHN0cmluZ3MgYXJlIGFjY2VwdGVkLlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5JTlQ2NDpcbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0ZJWEVENjQ6XG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNJTlQ2NDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkxvbmdDb252ZXJ0KFBiTG9uZy5aRVJPLCBsb25nVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YganNvbiAhPSBcIm51bWJlclwiICYmIHR5cGVvZiBqc29uICE9IFwic3RyaW5nXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25Mb25nQ29udmVydChQYkxvbmcuZnJvbShqc29uKSwgbG9uZ1R5cGUpO1xuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDY0OlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5VSU5UNjQ6XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25Mb25nQ29udmVydChQYlVMb25nLlpFUk8sIGxvbmdUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uICE9IFwibnVtYmVyXCIgJiYgdHlwZW9mIGpzb24gIT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkxvbmdDb252ZXJ0KFBiVUxvbmcuZnJvbShqc29uKSwgbG9uZ1R5cGUpO1xuICAgICAgICAgICAgICAgIC8vIGJvb2w6XG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJPT0w6XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGpzb24gIT09IFwiYm9vbGVhblwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBqc29uO1xuICAgICAgICAgICAgICAgIC8vIHN0cmluZzpcbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU1RSSU5HOlxuICAgICAgICAgICAgICAgICAgICBpZiAoanNvbiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGpzb24gIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBcImV4dHJhIHdoaXRlc3BhY2VcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoanNvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBcImludmFsaWQgVVRGOFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpzb247XG4gICAgICAgICAgICAgICAgLy8gYnl0ZXM6IEpTT04gdmFsdWUgd2lsbCBiZSB0aGUgZGF0YSBlbmNvZGVkIGFzIGEgc3RyaW5nIHVzaW5nIHN0YW5kYXJkIGJhc2U2NCBlbmNvZGluZyB3aXRoIHBhZGRpbmdzLlxuICAgICAgICAgICAgICAgIC8vIEVpdGhlciBzdGFuZGFyZCBvciBVUkwtc2FmZSBiYXNlNjQgZW5jb2Rpbmcgd2l0aC93aXRob3V0IHBhZGRpbmdzIGFyZSBhY2NlcHRlZC5cbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuQllURVM6XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBudWxsIHx8IGpzb24gPT09IFwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YganNvbiAhPT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2U2NGRlY29kZShqc29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGUgPSBlcnJvci5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXNzZXJ0KGZhbHNlLCBmaWVsZE5hbWUgKyAoZSA/IFwiIC0gXCIgKyBlIDogXCJcIiksIGpzb24pO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IGJhc2U2NGVuY29kZSB9IGZyb20gXCIuL2Jhc2U2NFwiO1xuaW1wb3J0IHsgUGJMb25nLCBQYlVMb25nIH0gZnJvbSBcIi4vcGItbG9uZ1wiO1xuaW1wb3J0IHsgU2NhbGFyVHlwZSB9IGZyb20gXCIuL3JlZmxlY3Rpb24taW5mb1wiO1xuaW1wb3J0IHsgYXNzZXJ0LCBhc3NlcnRGbG9hdDMyLCBhc3NlcnRJbnQzMiwgYXNzZXJ0VUludDMyIH0gZnJvbSBcIi4vYXNzZXJ0XCI7XG4vKipcbiAqIFdyaXRlcyBwcm90bzMgbWVzc2FnZXMgaW4gY2Fub25pY2FsIEpTT04gZm9ybWF0IHVzaW5nIHJlZmxlY3Rpb25cbiAqIGluZm9ybWF0aW9uLlxuICpcbiAqIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICovXG5leHBvcnQgY2xhc3MgUmVmbGVjdGlvbkpzb25Xcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKGluZm8pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLmZpZWxkcyA9IChfYSA9IGluZm8uZmllbGRzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIG1lc3NhZ2UgdG8gYSBKU09OIG9iamVjdCwgYmFzZWQgb24gdGhlIGZpZWxkIGRlc2NyaXB0b3JzLlxuICAgICAqL1xuICAgIHdyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QganNvbiA9IHt9LCBzb3VyY2UgPSBtZXNzYWdlO1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuZmllbGRzKSB7XG4gICAgICAgICAgICAvLyBmaWVsZCBpcyBub3QgcGFydCBvZiBhIG9uZW9mLCBzaW1wbHkgd3JpdGUgYXMgaXNcbiAgICAgICAgICAgIGlmICghZmllbGQub25lb2YpIHtcbiAgICAgICAgICAgICAgICBsZXQganNvblZhbHVlID0gdGhpcy5maWVsZChmaWVsZCwgc291cmNlW2ZpZWxkLmxvY2FsTmFtZV0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmIChqc29uVmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAganNvbltvcHRpb25zLnVzZVByb3RvRmllbGROYW1lID8gZmllbGQubmFtZSA6IGZpZWxkLmpzb25OYW1lXSA9IGpzb25WYWx1ZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGZpZWxkIGlzIHBhcnQgb2YgYSBvbmVvZlxuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBzb3VyY2VbZmllbGQub25lb2ZdO1xuICAgICAgICAgICAgaWYgKGdyb3VwLm9uZW9mS2luZCAhPT0gZmllbGQubG9jYWxOYW1lKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBub3Qgc2VsZWN0ZWQsIHNraXBcbiAgICAgICAgICAgIGNvbnN0IG9wdCA9IGZpZWxkLmtpbmQgPT0gJ3NjYWxhcicgfHwgZmllbGQua2luZCA9PSAnZW51bSdcbiAgICAgICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHsgZW1pdERlZmF1bHRWYWx1ZXM6IHRydWUgfSkgOiBvcHRpb25zO1xuICAgICAgICAgICAgbGV0IGpzb25WYWx1ZSA9IHRoaXMuZmllbGQoZmllbGQsIGdyb3VwW2ZpZWxkLmxvY2FsTmFtZV0sIG9wdCk7XG4gICAgICAgICAgICBhc3NlcnQoanNvblZhbHVlICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAganNvbltvcHRpb25zLnVzZVByb3RvRmllbGROYW1lID8gZmllbGQubmFtZSA6IGZpZWxkLmpzb25OYW1lXSA9IGpzb25WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gICAgZmllbGQoZmllbGQsIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBqc29uVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChmaWVsZC5raW5kID09ICdtYXAnKSB7XG4gICAgICAgICAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpO1xuICAgICAgICAgICAgY29uc3QganNvbk9iaiA9IHt9O1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5WLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2VudHJ5S2V5LCBlbnRyeVZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuc2NhbGFyKGZpZWxkLlYuVCwgZW50cnlWYWx1ZSwgZmllbGQubmFtZSwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHZhbCAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25PYmpbZW50cnlLZXkudG9TdHJpbmcoKV0gPSB2YWw7IC8vIEpTT04gc3RhbmRhcmQgYWxsb3dzIG9ubHkgKGRvdWJsZSBxdW90ZWQpIHN0cmluZyBhcyBwcm9wZXJ0eSBrZXlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlVHlwZSA9IGZpZWxkLlYuVCgpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtlbnRyeUtleSwgZW50cnlWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLm1lc3NhZ2UobWVzc2FnZVR5cGUsIGVudHJ5VmFsdWUsIGZpZWxkLm5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHZhbCAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25PYmpbZW50cnlLZXkudG9TdHJpbmcoKV0gPSB2YWw7IC8vIEpTT04gc3RhbmRhcmQgYWxsb3dzIG9ubHkgKGRvdWJsZSBxdW90ZWQpIHN0cmluZyBhcyBwcm9wZXJ0eSBrZXlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnVtSW5mbyA9IGZpZWxkLlYuVCgpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtlbnRyeUtleSwgZW50cnlWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZW50cnlWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBlbnRyeVZhbHVlID09ICdudW1iZXInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZW51bShlbnVtSW5mbywgZW50cnlWYWx1ZSwgZmllbGQubmFtZSwgZmFsc2UsIHRydWUsIG9wdGlvbnMuZW51bUFzSW50ZWdlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQodmFsICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAganNvbk9ialtlbnRyeUtleS50b1N0cmluZygpXSA9IHZhbDsgLy8gSlNPTiBzdGFuZGFyZCBhbGxvd3Mgb25seSAoZG91YmxlIHF1b3RlZCkgc3RyaW5nIGFzIHByb3BlcnR5IGtleVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZW1pdERlZmF1bHRWYWx1ZXMgfHwgT2JqZWN0LmtleXMoanNvbk9iaikubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICBqc29uVmFsdWUgPSBqc29uT2JqO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZpZWxkLnJlcGVhdCkge1xuICAgICAgICAgICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkodmFsdWUpKTtcbiAgICAgICAgICAgIGNvbnN0IGpzb25BcnIgPSBbXTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5zY2FsYXIoZmllbGQuVCwgdmFsdWVbaV0sIGZpZWxkLm5hbWUsIGZpZWxkLm9wdCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQodmFsICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAganNvbkFyci5wdXNoKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW51bUluZm8gPSBmaWVsZC5UKCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCh2YWx1ZVtpXSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB2YWx1ZVtpXSA9PSAnbnVtYmVyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmVudW0oZW51bUluZm8sIHZhbHVlW2ldLCBmaWVsZC5uYW1lLCBmaWVsZC5vcHQsIHRydWUsIG9wdGlvbnMuZW51bUFzSW50ZWdlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQodmFsICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAganNvbkFyci5wdXNoKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVR5cGUgPSBmaWVsZC5UKCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMubWVzc2FnZShtZXNzYWdlVHlwZSwgdmFsdWVbaV0sIGZpZWxkLm5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHZhbCAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25BcnIucHVzaCh2YWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYWRkIGNvbnZlcnRlZCBhcnJheSB0byBqc29uIG91dHB1dFxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZW1pdERlZmF1bHRWYWx1ZXMgfHwganNvbkFyci5sZW5ndGggPiAwIHx8IG9wdGlvbnMuZW1pdERlZmF1bHRWYWx1ZXMpXG4gICAgICAgICAgICAgICAganNvblZhbHVlID0ganNvbkFycjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAganNvblZhbHVlID0gdGhpcy5zY2FsYXIoZmllbGQuVCwgdmFsdWUsIGZpZWxkLm5hbWUsIGZpZWxkLm9wdCwgb3B0aW9ucy5lbWl0RGVmYXVsdFZhbHVlcyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgIGpzb25WYWx1ZSA9IHRoaXMuZW51bShmaWVsZC5UKCksIHZhbHVlLCBmaWVsZC5uYW1lLCBmaWVsZC5vcHQsIG9wdGlvbnMuZW1pdERlZmF1bHRWYWx1ZXMsIG9wdGlvbnMuZW51bUFzSW50ZWdlcik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgIGpzb25WYWx1ZSA9IHRoaXMubWVzc2FnZShmaWVsZC5UKCksIHZhbHVlLCBmaWVsZC5uYW1lLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGpzb25WYWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgbnVsbGAgYXMgdGhlIGRlZmF1bHQgZm9yIGdvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWUuXG4gICAgICovXG4gICAgZW51bSh0eXBlLCB2YWx1ZSwgZmllbGROYW1lLCBvcHRpb25hbCwgZW1pdERlZmF1bHRWYWx1ZXMsIGVudW1Bc0ludGVnZXIpIHtcbiAgICAgICAgaWYgKHR5cGVbMF0gPT0gJ2dvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWUnKVxuICAgICAgICAgICAgcmV0dXJuICFlbWl0RGVmYXVsdFZhbHVlcyAmJiAhb3B0aW9uYWwgPyB1bmRlZmluZWQgOiBudWxsO1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXNzZXJ0KG9wdGlvbmFsKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlID09PSAwICYmICFlbWl0RGVmYXVsdFZhbHVlcyAmJiAhb3B0aW9uYWwpXG4gICAgICAgICAgICAvLyB3ZSByZXF1aXJlIDAgdG8gYmUgZGVmYXVsdCB2YWx1ZSBmb3IgYWxsIGVudW1zXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09ICdudW1iZXInKTtcbiAgICAgICAgYXNzZXJ0KE51bWJlci5pc0ludGVnZXIodmFsdWUpKTtcbiAgICAgICAgaWYgKGVudW1Bc0ludGVnZXIgfHwgIXR5cGVbMV0uaGFzT3duUHJvcGVydHkodmFsdWUpKVxuICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3Qgbm93IHRoZSBlbnVtIHZhbHVlLCBqdXN0IHJldHVybiB0aGUgbnVtYmVyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIGlmICh0eXBlWzJdKVxuICAgICAgICAgICAgLy8gcmVzdG9yZSB0aGUgZHJvcHBlZCBwcmVmaXhcbiAgICAgICAgICAgIHJldHVybiB0eXBlWzJdICsgdHlwZVsxXVt2YWx1ZV07XG4gICAgICAgIHJldHVybiB0eXBlWzFdW3ZhbHVlXTtcbiAgICB9XG4gICAgbWVzc2FnZSh0eXBlLCB2YWx1ZSwgZmllbGROYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZW1pdERlZmF1bHRWYWx1ZXMgPyBudWxsIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdHlwZS5pbnRlcm5hbEpzb25Xcml0ZSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHNjYWxhcih0eXBlLCB2YWx1ZSwgZmllbGROYW1lLCBvcHRpb25hbCwgZW1pdERlZmF1bHRWYWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFzc2VydChvcHRpb25hbCk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVkID0gZW1pdERlZmF1bHRWYWx1ZXMgfHwgb3B0aW9uYWw7XG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBGYWxsVGhyb3VnaEluU3dpdGNoU3RhdGVtZW50SlNcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAvLyBpbnQzMiwgZml4ZWQzMiwgdWludDMyOiBKU09OIHZhbHVlIHdpbGwgYmUgYSBkZWNpbWFsIG51bWJlci4gRWl0aGVyIG51bWJlcnMgb3Igc3RyaW5ncyBhcmUgYWNjZXB0ZWQuXG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuSU5UMzI6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0ZJWEVEMzI6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDMyOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVkID8gMCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBhc3NlcnRJbnQzMih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVEMzI6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuVUlOVDMyOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVkID8gMCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBhc3NlcnRVSW50MzIodmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIC8vIGZsb2F0LCBkb3VibGU6IEpTT04gdmFsdWUgd2lsbCBiZSBhIG51bWJlciBvciBvbmUgb2YgdGhlIHNwZWNpYWwgc3RyaW5nIHZhbHVlcyBcIk5hTlwiLCBcIkluZmluaXR5XCIsIGFuZCBcIi1JbmZpbml0eVwiLlxuICAgICAgICAgICAgLy8gRWl0aGVyIG51bWJlcnMgb3Igc3RyaW5ncyBhcmUgYWNjZXB0ZWQuIEV4cG9uZW50IG5vdGF0aW9uIGlzIGFsc28gYWNjZXB0ZWQuXG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRkxPQVQ6XG4gICAgICAgICAgICAgICAgYXNzZXJ0RmxvYXQzMih2YWx1ZSk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRE9VQkxFOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVkID8gMCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09ICdudW1iZXInKTtcbiAgICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdOYU4nO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0luZmluaXR5JztcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICctSW5maW5pdHknO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIC8vIHN0cmluZzpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TVFJJTkc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWQgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAvLyBib29sOlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJPT0w6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVkID8gZmFsc2UgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PSAnYm9vbGVhbicpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIC8vIEpTT04gdmFsdWUgd2lsbCBiZSBhIGRlY2ltYWwgc3RyaW5nLiBFaXRoZXIgbnVtYmVycyBvciBzdHJpbmdzIGFyZSBhY2NlcHRlZC5cbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5VSU5UNjQ6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRklYRUQ2NDpcbiAgICAgICAgICAgICAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT0gJ2JpZ2ludCcpO1xuICAgICAgICAgICAgICAgIGxldCB1bG9uZyA9IFBiVUxvbmcuZnJvbSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHVsb25nLmlzWmVybygpICYmICFlZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdWxvbmcudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIC8vIEpTT04gdmFsdWUgd2lsbCBiZSBhIGRlY2ltYWwgc3RyaW5nLiBFaXRoZXIgbnVtYmVycyBvciBzdHJpbmdzIGFyZSBhY2NlcHRlZC5cbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5JTlQ2NDpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQ2NDpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UNjQ6XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09ICdiaWdpbnQnKTtcbiAgICAgICAgICAgICAgICBsZXQgbG9uZyA9IFBiTG9uZy5mcm9tKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAobG9uZy5pc1plcm8oKSAmJiAhZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvbmcudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIC8vIGJ5dGVzOiBKU09OIHZhbHVlIHdpbGwgYmUgdGhlIGRhdGEgZW5jb2RlZCBhcyBhIHN0cmluZyB1c2luZyBzdGFuZGFyZCBiYXNlNjQgZW5jb2Rpbmcgd2l0aCBwYWRkaW5ncy5cbiAgICAgICAgICAgIC8vIEVpdGhlciBzdGFuZGFyZCBvciBVUkwtc2FmZSBiYXNlNjQgZW5jb2Rpbmcgd2l0aC93aXRob3V0IHBhZGRpbmdzIGFyZSBhY2NlcHRlZC5cbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CWVRFUzpcbiAgICAgICAgICAgICAgICBhc3NlcnQodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KTtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlZCA/IFwiXCIgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2U2NGVuY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBMb25nVHlwZSwgU2NhbGFyVHlwZSB9IGZyb20gXCIuL3JlZmxlY3Rpb24taW5mb1wiO1xuaW1wb3J0IHsgcmVmbGVjdGlvbkxvbmdDb252ZXJ0IH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1sb25nLWNvbnZlcnRcIjtcbmltcG9ydCB7IFBiTG9uZywgUGJVTG9uZyB9IGZyb20gXCIuL3BiLWxvbmdcIjtcbi8qKlxuICogQ3JlYXRlcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSBzY2FsYXIgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZmxlY3Rpb25TY2FsYXJEZWZhdWx0KHR5cGUsIGxvbmdUeXBlID0gTG9uZ1R5cGUuU1RSSU5HKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CT09MOlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjYXNlIFNjYWxhclR5cGUuVUlOVDY0OlxuICAgICAgICBjYXNlIFNjYWxhclR5cGUuRklYRUQ2NDpcbiAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQoUGJVTG9uZy5aRVJPLCBsb25nVHlwZSk7XG4gICAgICAgIGNhc2UgU2NhbGFyVHlwZS5JTlQ2NDpcbiAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNGSVhFRDY0OlxuICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDY0OlxuICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25Mb25nQ29udmVydChQYkxvbmcuWkVSTywgbG9uZ1R5cGUpO1xuICAgICAgICBjYXNlIFNjYWxhclR5cGUuRE9VQkxFOlxuICAgICAgICBjYXNlIFNjYWxhclR5cGUuRkxPQVQ6XG4gICAgICAgICAgICByZXR1cm4gMC4wO1xuICAgICAgICBjYXNlIFNjYWxhclR5cGUuQllURVM6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TVFJJTkc6XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5JTlQzMjpcbiAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5VSU5UMzI6XG4gICAgICAgICAgICAvLyBjYXNlIFNjYWxhclR5cGUuU0lOVDMyOlxuICAgICAgICAgICAgLy8gY2FzZSBTY2FsYXJUeXBlLkZJWEVEMzI6XG4gICAgICAgICAgICAvLyBjYXNlIFNjYWxhclR5cGUuU0ZJWEVEMzI6XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBVbmtub3duRmllbGRIYW5kbGVyLCBXaXJlVHlwZSB9IGZyb20gXCIuL2JpbmFyeS1mb3JtYXQtY29udHJhY3RcIjtcbmltcG9ydCB7IExvbmdUeXBlLCBTY2FsYXJUeXBlIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1pbmZvXCI7XG5pbXBvcnQgeyByZWZsZWN0aW9uTG9uZ0NvbnZlcnQgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWxvbmctY29udmVydFwiO1xuaW1wb3J0IHsgcmVmbGVjdGlvblNjYWxhckRlZmF1bHQgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLXNjYWxhci1kZWZhdWx0XCI7XG4vKipcbiAqIFJlYWRzIHByb3RvMyBtZXNzYWdlcyBpbiBiaW5hcnkgZm9ybWF0IHVzaW5nIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24uXG4gKlxuICogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL2VuY29kaW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWZsZWN0aW9uQmluYXJ5UmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihpbmZvKSB7XG4gICAgICAgIHRoaXMuaW5mbyA9IGluZm87XG4gICAgfVxuICAgIHByZXBhcmUoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLmZpZWxkTm9Ub0ZpZWxkKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZHNJbnB1dCA9IChfYSA9IHRoaXMuaW5mby5maWVsZHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdO1xuICAgICAgICAgICAgdGhpcy5maWVsZE5vVG9GaWVsZCA9IG5ldyBNYXAoZmllbGRzSW5wdXQubWFwKGZpZWxkID0+IFtmaWVsZC5ubywgZmllbGRdKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBtZXNzYWdlIGZyb20gYmluYXJ5IGZvcm1hdCBpbnRvIHRoZSB0YXJnZXQgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIFJlcGVhdGVkIGZpZWxkcyBhcmUgYXBwZW5kZWQuIE1hcCBlbnRyaWVzIGFyZSBhZGRlZCwgb3ZlcndyaXRpbmdcbiAgICAgKiBleGlzdGluZyBrZXlzLlxuICAgICAqXG4gICAgICogSWYgYSBtZXNzYWdlIGZpZWxkIGlzIGFscmVhZHkgcHJlc2VudCwgaXQgd2lsbCBiZSBtZXJnZWQgd2l0aCB0aGVcbiAgICAgKiBuZXcgZGF0YS5cbiAgICAgKi9cbiAgICByZWFkKHJlYWRlciwgbWVzc2FnZSwgb3B0aW9ucywgbGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZSgpO1xuICAgICAgICBjb25zdCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgLy8gcmVhZCB0aGUgdGFnIGFuZCBmaW5kIHRoZSBmaWVsZFxuICAgICAgICAgICAgY29uc3QgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKSwgZmllbGQgPSB0aGlzLmZpZWxkTm9Ub0ZpZWxkLmdldChmaWVsZE5vKTtcbiAgICAgICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICBpZiAodSA9PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMuaW5mby50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLmluZm8udHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRhcmdldCBvYmplY3QgZm9yIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZ1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IG1lc3NhZ2UsIHJlcGVhdGVkID0gZmllbGQucmVwZWF0LCBsb2NhbE5hbWUgPSBmaWVsZC5sb2NhbE5hbWU7XG4gICAgICAgICAgICAvLyBpZiBmaWVsZCBpcyBtZW1iZXIgb2Ygb25lb2YgQURULCB1c2UgQURUIGFzIHRhcmdldFxuICAgICAgICAgICAgaWYgKGZpZWxkLm9uZW9mKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0W2ZpZWxkLm9uZW9mXTtcbiAgICAgICAgICAgICAgICAvLyBpZiBvdGhlciBvbmVvZiBtZW1iZXIgc2VsZWN0ZWQsIHNldCBuZXcgQURUXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5vbmVvZktpbmQgIT09IGxvY2FsTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbWVzc2FnZVtmaWVsZC5vbmVvZl0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbmVvZktpbmQ6IGxvY2FsTmFtZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gd2UgaGF2ZSBoYW5kbGVkIG9uZW9mIGFib3ZlLCB3ZSBqdXN0IGhhdmUgcmVhZCB0aGUgdmFsdWUgaW50byBgdGFyZ2V0W2xvY2FsTmFtZV1gXG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgbGV0IFQgPSBmaWVsZC5raW5kID09IFwiZW51bVwiID8gU2NhbGFyVHlwZS5JTlQzMiA6IGZpZWxkLlQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCBMID0gZmllbGQua2luZCA9PSBcInNjYWxhclwiID8gZmllbGQuTCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGVhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXJyID0gdGFyZ2V0W2xvY2FsTmFtZV07IC8vIHNhZmUgdG8gYXNzdW1lIHByZXNlbmNlIG9mIGFycmF5LCBvbmVvZiBjYW5ub3QgY29udGFpbiByZXBlYXRlZCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aXJlVHlwZSA9PSBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQgJiYgVCAhPSBTY2FsYXJUeXBlLlNUUklORyAmJiBUICE9IFNjYWxhclR5cGUuQllURVMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZSA9IHJlYWRlci51aW50MzIoKSArIHJlYWRlci5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucHVzaCh0aGlzLnNjYWxhcihyZWFkZXIsIFQsIEwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucHVzaCh0aGlzLnNjYWxhcihyZWFkZXIsIFQsIEwpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbbG9jYWxOYW1lXSA9IHRoaXMuc2NhbGFyKHJlYWRlciwgVCwgTCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXBlYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFyciA9IHRhcmdldFtsb2NhbE5hbWVdOyAvLyBzYWZlIHRvIGFzc3VtZSBwcmVzZW5jZSBvZiBhcnJheSwgb25lb2YgY2Fubm90IGNvbnRhaW4gcmVwZWF0ZWQgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXNnID0gZmllbGQuVCgpLmludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIHJlYWRlci51aW50MzIoKSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcnIucHVzaChtc2cpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtsb2NhbE5hbWVdID0gZmllbGQuVCgpLmludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIHJlYWRlci51aW50MzIoKSwgb3B0aW9ucywgdGFyZ2V0W2xvY2FsTmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgICAgICAgICAgIGxldCBbbWFwS2V5LCBtYXBWYWxdID0gdGhpcy5tYXBFbnRyeShmaWVsZCwgcmVhZGVyLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2FmZSB0byBhc3N1bWUgcHJlc2VuY2Ugb2YgbWFwIG9iamVjdCwgb25lb2YgY2Fubm90IGNvbnRhaW4gcmVwZWF0ZWQgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtsb2NhbE5hbWVdW21hcEtleV0gPSBtYXBWYWw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBtYXAgZmllbGQsIGV4cGVjdGluZyBrZXkgZmllbGQgPSAxLCB2YWx1ZSBmaWVsZCA9IDJcbiAgICAgKi9cbiAgICBtYXBFbnRyeShmaWVsZCwgcmVhZGVyLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBsZW5ndGggPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgIGxldCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBsZXQga2V5ID0gdW5kZWZpbmVkOyAvLyBqYXZhc2NyaXB0IG9ubHkgYWxsb3dzIG51bWJlciBvciBzdHJpbmcgZm9yIG9iamVjdCBwcm9wZXJ0aWVzXG4gICAgICAgIGxldCB2YWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLksgPT0gU2NhbGFyVHlwZS5CT09MKVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcmVhZGVyLmJvb2woKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb25nIHR5cGVzIGFyZSByZWFkIGFzIHN0cmluZywgbnVtYmVyIHR5cGVzIGFyZSBva2F5IGFzIG51bWJlclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5zY2FsYXIocmVhZGVyLCBmaWVsZC5LLCBMb25nVHlwZS5TVFJJTkcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuVi5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdGhpcy5zY2FsYXIocmVhZGVyLCBmaWVsZC5WLlQsIGZpZWxkLlYuTCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBmaWVsZC5WLlQoKS5pbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCByZWFkZXIudWludDMyKCksIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGluIG1hcCBlbnRyeSBmb3IgJHt0aGlzLmluZm8udHlwZU5hbWV9IyR7ZmllbGQubmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBrZXlSYXcgPSByZWZsZWN0aW9uU2NhbGFyRGVmYXVsdChmaWVsZC5LKTtcbiAgICAgICAgICAgIGtleSA9IGZpZWxkLksgPT0gU2NhbGFyVHlwZS5CT09MID8ga2V5UmF3LnRvU3RyaW5nKCkgOiBrZXlSYXc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5WLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgIHZhbCA9IHJlZmxlY3Rpb25TY2FsYXJEZWZhdWx0KGZpZWxkLlYuVCwgZmllbGQuVi5MKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gMDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gZmllbGQuVi5UKCkuY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2tleSwgdmFsXTtcbiAgICB9XG4gICAgc2NhbGFyKHJlYWRlciwgdHlwZSwgbG9uZ1R5cGUpIHtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuSU5UMzI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNUUklORzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJPT0w6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRE9VQkxFOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIuZG91YmxlKCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRkxPQVQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDY0OlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQocmVhZGVyLmludDY0KCksIGxvbmdUeXBlKTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5VSU5UNjQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25Mb25nQ29udmVydChyZWFkZXIudWludDY0KCksIGxvbmdUeXBlKTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDY0OlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQocmVhZGVyLmZpeGVkNjQoKSwgbG9uZ1R5cGUpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVEMzI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5maXhlZDMyKCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuQllURVM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5ieXRlcygpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQzMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNGSVhFRDMyOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIuc2ZpeGVkMzIoKTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQ2NDpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkxvbmdDb252ZXJ0KHJlYWRlci5zZml4ZWQ2NCgpLCBsb25nVHlwZSk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDMyOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIuc2ludDMyKCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDY0OlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQocmVhZGVyLnNpbnQ2NCgpLCBsb25nVHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBVbmtub3duRmllbGRIYW5kbGVyLCBXaXJlVHlwZSB9IGZyb20gXCIuL2JpbmFyeS1mb3JtYXQtY29udHJhY3RcIjtcbmltcG9ydCB7IFJlcGVhdFR5cGUsIFNjYWxhclR5cGUgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWluZm9cIjtcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gXCIuL2Fzc2VydFwiO1xuaW1wb3J0IHsgUGJMb25nLCBQYlVMb25nIH0gZnJvbSBcIi4vcGItbG9uZ1wiO1xuLyoqXG4gKiBXcml0ZXMgcHJvdG8zIG1lc3NhZ2VzIGluIGJpbmFyeSBmb3JtYXQgdXNpbmcgcmVmbGVjdGlvbiBpbmZvcm1hdGlvbi5cbiAqXG4gKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvZW5jb2RpbmdcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZmxlY3Rpb25CaW5hcnlXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKGluZm8pIHtcbiAgICAgICAgdGhpcy5pbmZvID0gaW5mbztcbiAgICB9XG4gICAgcHJlcGFyZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpZWxkcykge1xuICAgICAgICAgICAgY29uc3QgZmllbGRzSW5wdXQgPSB0aGlzLmluZm8uZmllbGRzID8gdGhpcy5pbmZvLmZpZWxkcy5jb25jYXQoKSA6IFtdO1xuICAgICAgICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHNJbnB1dC5zb3J0KChhLCBiKSA9PiBhLm5vIC0gYi5ubyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQuXG4gICAgICovXG4gICAgd3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuZmllbGRzKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUsIC8vIHRoaXMgd2lsbCBiZSBvdXIgZmllbGQgdmFsdWUsIHdoZXRoZXIgaXQgaXMgbWVtYmVyIG9mIGEgb25lb2Ygb3Igbm90XG4gICAgICAgICAgICBlbWl0RGVmYXVsdCwgLy8gd2hldGhlciB3ZSBlbWl0IHRoZSBkZWZhdWx0IHZhbHVlIChvbmx5IHRydWUgZm9yIG9uZW9mIG1lbWJlcnMpXG4gICAgICAgICAgICByZXBlYXRlZCA9IGZpZWxkLnJlcGVhdCwgbG9jYWxOYW1lID0gZmllbGQubG9jYWxOYW1lO1xuICAgICAgICAgICAgLy8gaGFuZGxlIG9uZW9mIEFEVFxuICAgICAgICAgICAgaWYgKGZpZWxkLm9uZW9mKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBtZXNzYWdlW2ZpZWxkLm9uZW9mXTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXAub25lb2ZLaW5kICE9PSBsb2NhbE5hbWUpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBpZiBmaWVsZCBpcyBub3Qgc2VsZWN0ZWQsIHNraXBcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGdyb3VwW2xvY2FsTmFtZV07XG4gICAgICAgICAgICAgICAgZW1pdERlZmF1bHQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBtZXNzYWdlW2xvY2FsTmFtZV07XG4gICAgICAgICAgICAgICAgZW1pdERlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHdlIGhhdmUgaGFuZGxlZCBvbmVvZiBhYm92ZS4gd2UganVzdCBoYXZlIHRvIGhvbm9yIGBlbWl0RGVmYXVsdGAuXG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgbGV0IFQgPSBmaWVsZC5raW5kID09IFwiZW51bVwiID8gU2NhbGFyVHlwZS5JTlQzMiA6IGZpZWxkLlQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXBlYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBlYXRlZCA9PSBSZXBlYXRUeXBlLlBBQ0tFRClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhY2tlZCh3cml0ZXIsIFQsIGZpZWxkLm5vLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYWxhcih3cml0ZXIsIFQsIGZpZWxkLm5vLCBpdGVtLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZpZWxkLm9wdCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NhbGFyKHdyaXRlciwgVCwgZmllbGQubm8sIHZhbHVlLCBlbWl0RGVmYXVsdCB8fCBmaWVsZC5vcHQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAocmVwZWF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChBcnJheS5pc0FycmF5KHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlKHdyaXRlciwgb3B0aW9ucywgZmllbGQuVCgpLCBmaWVsZC5ubywgaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uod3JpdGVyLCBvcHRpb25zLCBmaWVsZC5UKCksIGZpZWxkLm5vLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgICAgICAgICAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwRW50cnkod3JpdGVyLCBvcHRpb25zLCBmaWVsZCwga2V5LCB2YWwpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMuaW5mby50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICB9XG4gICAgbWFwRW50cnkod3JpdGVyLCBvcHRpb25zLCBmaWVsZCwga2V5LCB2YWx1ZSkge1xuICAgICAgICB3cml0ZXIudGFnKGZpZWxkLm5vLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpO1xuICAgICAgICB3cml0ZXIuZm9yaygpO1xuICAgICAgICAvLyBqYXZhc2NyaXB0IG9ubHkgYWxsb3dzIG51bWJlciBvciBzdHJpbmcgZm9yIG9iamVjdCBwcm9wZXJ0aWVzXG4gICAgICAgIC8vIHdlIGNvbnZlcnQgZnJvbSBvdXIgcmVwcmVzZW50YXRpb24gdG8gdGhlIHByb3RvYnVmIHR5cGVcbiAgICAgICAgbGV0IGtleVZhbHVlID0ga2V5O1xuICAgICAgICBzd2l0Y2ggKGZpZWxkLkspIHtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5JTlQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDMyOlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UMzI6XG4gICAgICAgICAgICAgICAga2V5VmFsdWUgPSBOdW1iZXIucGFyc2VJbnQoa2V5KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CT09MOlxuICAgICAgICAgICAgICAgIGFzc2VydChrZXkgPT0gJ3RydWUnIHx8IGtleSA9PSAnZmFsc2UnKTtcbiAgICAgICAgICAgICAgICBrZXlWYWx1ZSA9IGtleSA9PSAndHJ1ZSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gd3JpdGUga2V5LCBleHBlY3Rpbmcga2V5IGZpZWxkIG51bWJlciA9IDFcbiAgICAgICAgdGhpcy5zY2FsYXIod3JpdGVyLCBmaWVsZC5LLCAxLCBrZXlWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgIC8vIHdyaXRlIHZhbHVlLCBleHBlY3RpbmcgdmFsdWUgZmllbGQgbnVtYmVyID0gMlxuICAgICAgICBzd2l0Y2ggKGZpZWxkLlYua2luZCkge1xuICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNjYWxhcih3cml0ZXIsIGZpZWxkLlYuVCwgMiwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZW51bSc6XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FsYXIod3JpdGVyLCBTY2FsYXJUeXBlLklOVDMyLCAyLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtZXNzYWdlJzpcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uod3JpdGVyLCBvcHRpb25zLCBmaWVsZC5WLlQoKSwgMiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci5qb2luKCk7XG4gICAgfVxuICAgIG1lc3NhZ2Uod3JpdGVyLCBvcHRpb25zLCBoYW5kbGVyLCBmaWVsZE5vLCB2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaGFuZGxlci5pbnRlcm5hbEJpbmFyeVdyaXRlKHZhbHVlLCB3cml0ZXIudGFnKGZpZWxkTm8sIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuZm9yaygpLCBvcHRpb25zKTtcbiAgICAgICAgd3JpdGVyLmpvaW4oKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBzaW5nbGUgc2NhbGFyIHZhbHVlLlxuICAgICAqL1xuICAgIHNjYWxhcih3cml0ZXIsIHR5cGUsIGZpZWxkTm8sIHZhbHVlLCBlbWl0RGVmYXVsdCkge1xuICAgICAgICBsZXQgW3dpcmVUeXBlLCBtZXRob2QsIGlzRGVmYXVsdF0gPSB0aGlzLnNjYWxhckluZm8odHlwZSwgdmFsdWUpO1xuICAgICAgICBpZiAoIWlzRGVmYXVsdCB8fCBlbWl0RGVmYXVsdCkge1xuICAgICAgICAgICAgd3JpdGVyLnRhZyhmaWVsZE5vLCB3aXJlVHlwZSk7XG4gICAgICAgICAgICB3cml0ZXJbbWV0aG9kXSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYW4gYXJyYXkgb2Ygc2NhbGFyIHZhbHVlcyBpbiBwYWNrZWQgZm9ybWF0LlxuICAgICAqL1xuICAgIHBhY2tlZCh3cml0ZXIsIHR5cGUsIGZpZWxkTm8sIHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBhc3NlcnQodHlwZSAhPT0gU2NhbGFyVHlwZS5CWVRFUyAmJiB0eXBlICE9PSBTY2FsYXJUeXBlLlNUUklORyk7XG4gICAgICAgIC8vIHdyaXRlIHRhZ1xuICAgICAgICB3cml0ZXIudGFnKGZpZWxkTm8sIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7XG4gICAgICAgIC8vIGJlZ2luIGxlbmd0aC1kZWxpbWl0ZWRcbiAgICAgICAgd3JpdGVyLmZvcmsoKTtcbiAgICAgICAgLy8gd3JpdGUgdmFsdWVzIHdpdGhvdXQgdGFnc1xuICAgICAgICBsZXQgWywgbWV0aG9kLF0gPSB0aGlzLnNjYWxhckluZm8odHlwZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB3cml0ZXJbbWV0aG9kXSh2YWx1ZVtpXSk7XG4gICAgICAgIC8vIGVuZCBsZW5ndGggZGVsaW1pdGVkXG4gICAgICAgIHdyaXRlci5qb2luKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBpbmZvcm1hdGlvbiBmb3Igd3JpdGluZyBhIHNjYWxhciB2YWx1ZS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgdHVwbGU6XG4gICAgICogWzBdOiBhcHByb3ByaWF0ZSBXaXJlVHlwZVxuICAgICAqIFsxXTogbmFtZSBvZiB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kIG9mIElCaW5hcnlXcml0ZXJcbiAgICAgKiBbMl06IHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgZGVmYXVsdCB2YWx1ZVxuICAgICAqXG4gICAgICogSWYgYXJndW1lbnQgYHZhbHVlYCBpcyBvbWl0dGVkLCBbMl0gaXMgYWx3YXlzIGZhbHNlLlxuICAgICAqL1xuICAgIHNjYWxhckluZm8odHlwZSwgdmFsdWUpIHtcbiAgICAgICAgbGV0IHQgPSBXaXJlVHlwZS5WYXJpbnQ7XG4gICAgICAgIGxldCBtO1xuICAgICAgICBsZXQgaSA9IHZhbHVlID09PSB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBkID0gdmFsdWUgPT09IDA7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDMyOlxuICAgICAgICAgICAgICAgIG0gPSBcImludDMyXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU1RSSU5HOlxuICAgICAgICAgICAgICAgIGQgPSBpIHx8ICF2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdCA9IFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZDtcbiAgICAgICAgICAgICAgICBtID0gXCJzdHJpbmdcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CT09MOlxuICAgICAgICAgICAgICAgIGQgPSB2YWx1ZSA9PT0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbSA9IFwiYm9vbFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQzMjpcbiAgICAgICAgICAgICAgICBtID0gXCJ1aW50MzJcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5ET1VCTEU6XG4gICAgICAgICAgICAgICAgdCA9IFdpcmVUeXBlLkJpdDY0O1xuICAgICAgICAgICAgICAgIG0gPSBcImRvdWJsZVwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZMT0FUOlxuICAgICAgICAgICAgICAgIHQgPSBXaXJlVHlwZS5CaXQzMjtcbiAgICAgICAgICAgICAgICBtID0gXCJmbG9hdFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDY0OlxuICAgICAgICAgICAgICAgIGQgPSBpIHx8IFBiTG9uZy5mcm9tKHZhbHVlKS5pc1plcm8oKTtcbiAgICAgICAgICAgICAgICBtID0gXCJpbnQ2NFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQ2NDpcbiAgICAgICAgICAgICAgICBkID0gaSB8fCBQYlVMb25nLmZyb20odmFsdWUpLmlzWmVybygpO1xuICAgICAgICAgICAgICAgIG0gPSBcInVpbnQ2NFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVENjQ6XG4gICAgICAgICAgICAgICAgZCA9IGkgfHwgUGJVTG9uZy5mcm9tKHZhbHVlKS5pc1plcm8oKTtcbiAgICAgICAgICAgICAgICB0ID0gV2lyZVR5cGUuQml0NjQ7XG4gICAgICAgICAgICAgICAgbSA9IFwiZml4ZWQ2NFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJZVEVTOlxuICAgICAgICAgICAgICAgIGQgPSBpIHx8ICF2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIHQgPSBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQ7XG4gICAgICAgICAgICAgICAgbSA9IFwiYnl0ZXNcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDMyOlxuICAgICAgICAgICAgICAgIHQgPSBXaXJlVHlwZS5CaXQzMjtcbiAgICAgICAgICAgICAgICBtID0gXCJmaXhlZDMyXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0ZJWEVEMzI6XG4gICAgICAgICAgICAgICAgdCA9IFdpcmVUeXBlLkJpdDMyO1xuICAgICAgICAgICAgICAgIG0gPSBcInNmaXhlZDMyXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0ZJWEVENjQ6XG4gICAgICAgICAgICAgICAgZCA9IGkgfHwgUGJMb25nLmZyb20odmFsdWUpLmlzWmVybygpO1xuICAgICAgICAgICAgICAgIHQgPSBXaXJlVHlwZS5CaXQ2NDtcbiAgICAgICAgICAgICAgICBtID0gXCJzZml4ZWQ2NFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNJTlQzMjpcbiAgICAgICAgICAgICAgICBtID0gXCJzaW50MzJcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UNjQ6XG4gICAgICAgICAgICAgICAgZCA9IGkgfHwgUGJMb25nLmZyb20odmFsdWUpLmlzWmVybygpO1xuICAgICAgICAgICAgICAgIG0gPSBcInNpbnQ2NFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdCwgbSwgaSB8fCBkXTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyByZWZsZWN0aW9uU2NhbGFyRGVmYXVsdCB9IGZyb20gXCIuL3JlZmxlY3Rpb24tc2NhbGFyLWRlZmF1bHRcIjtcbmltcG9ydCB7IE1FU1NBR0VfVFlQRSB9IGZyb20gJy4vbWVzc2FnZS10eXBlLWNvbnRyYWN0Jztcbi8qKlxuICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2VuZXJpYyBtZXNzYWdlLCB1c2luZyB0aGUgZmllbGRcbiAqIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVmbGVjdGlvbkNyZWF0ZSh0eXBlKSB7XG4gICAgLyoqXG4gICAgICogVGhpcyB0ZXJuYXJ5IGNhbiBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24uXG4gICAgICogVGhlIGBPYmplY3QuY3JlYXRlKClgIGNvZGUgcGF0aCB1dGlsaXplcyBhIG5ldyBgbWVzc2FnZVByb3RvdHlwZWBcbiAgICAgKiBwcm9wZXJ0eSBvbiB0aGUgYElNZXNzYWdlVHlwZWAgd2hpY2ggaGFzIHRoaXMgc2FtZSBgTUVTU0FHRV9UWVBFYFxuICAgICAqIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IG9uIGl0LiBEb2luZyBpdCB0aGlzIHdheSBtZWFucyB0aGF0IHdlIG9ubHlcbiAgICAgKiBwYXkgdGhlIGNvc3Qgb2YgYE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgpYCBvbmNlIHBlciBgSU1lc3NhZ2VUeXBlYFxuICAgICAqIGNsYXNzIG9mIG9uY2UgcGVyIFwiaW5zdGFuY2VcIi4gVGhlIGZhbHN5IGNvZGUgcGF0aCBpcyBvbmx5IHByb3ZpZGVkXG4gICAgICogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGluIGNhc2VzIHdoZXJlIHRoZSBydW50aW1lIGxpYnJhcnkgaXNcbiAgICAgKiB1cGRhdGVkIHdpdGhvdXQgYWxzbyB1cGRhdGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuXG4gICAgICovXG4gICAgY29uc3QgbXNnID0gdHlwZS5tZXNzYWdlUHJvdG90eXBlXG4gICAgICAgID8gT2JqZWN0LmNyZWF0ZSh0eXBlLm1lc3NhZ2VQcm90b3R5cGUpXG4gICAgICAgIDogT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCBNRVNTQUdFX1RZUEUsIHsgdmFsdWU6IHR5cGUgfSk7XG4gICAgZm9yIChsZXQgZmllbGQgb2YgdHlwZS5maWVsZHMpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBmaWVsZC5sb2NhbE5hbWU7XG4gICAgICAgIGlmIChmaWVsZC5vcHQpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKGZpZWxkLm9uZW9mKVxuICAgICAgICAgICAgbXNnW2ZpZWxkLm9uZW9mXSA9IHsgb25lb2ZLaW5kOiB1bmRlZmluZWQgfTtcbiAgICAgICAgZWxzZSBpZiAoZmllbGQucmVwZWF0KVxuICAgICAgICAgICAgbXNnW25hbWVdID0gW107XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgbXNnW25hbWVdID0gcmVmbGVjdGlvblNjYWxhckRlZmF1bHQoZmllbGQuVCwgZmllbGQuTCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIHJlcXVpcmUgMCB0byBiZSBkZWZhdWx0IHZhbHVlIGZvciBhbGwgZW51bXNcbiAgICAgICAgICAgICAgICAgICAgbXNnW25hbWVdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgICAgICAgICAgICBtc2dbbmFtZV0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtc2c7XG59XG4iLCIvKipcbiAqIENvcHkgcGFydGlhbCBkYXRhIGludG8gdGhlIHRhcmdldCBtZXNzYWdlLlxuICpcbiAqIElmIGEgc2luZ3VsYXIgc2NhbGFyIG9yIGVudW0gZmllbGQgaXMgcHJlc2VudCBpbiB0aGUgc291cmNlLCBpdFxuICogcmVwbGFjZXMgdGhlIGZpZWxkIGluIHRoZSB0YXJnZXQuXG4gKlxuICogSWYgYSBzaW5ndWxhciBtZXNzYWdlIGZpZWxkIGlzIHByZXNlbnQgaW4gdGhlIHNvdXJjZSwgaXQgaXMgbWVyZ2VkXG4gKiB3aXRoIHRoZSB0YXJnZXQgZmllbGQgYnkgY2FsbGluZyBtZXJnZVBhcnRpYWwoKSBvZiB0aGUgcmVzcG9uc2libGVcbiAqIG1lc3NhZ2UgdHlwZS5cbiAqXG4gKiBJZiBhIHJlcGVhdGVkIGZpZWxkIGlzIHByZXNlbnQgaW4gdGhlIHNvdXJjZSwgaXRzIHZhbHVlcyByZXBsYWNlXG4gKiBhbGwgdmFsdWVzIGluIHRoZSB0YXJnZXQgYXJyYXksIHJlbW92aW5nIGV4dHJhbmVvdXMgdmFsdWVzLlxuICogUmVwZWF0ZWQgbWVzc2FnZSBmaWVsZHMgYXJlIGNvcGllZCwgbm90IG1lcmdlZC5cbiAqXG4gKiBJZiBhIG1hcCBmaWVsZCBpcyBwcmVzZW50IGluIHRoZSBzb3VyY2UsIGVudHJpZXMgYXJlIGFkZGVkIHRvIHRoZVxuICogdGFyZ2V0IG1hcCwgcmVwbGFjaW5nIGVudHJpZXMgd2l0aCB0aGUgc2FtZSBrZXkuIEVudHJpZXMgdGhhdCBvbmx5XG4gKiBleGlzdCBpbiB0aGUgdGFyZ2V0IHJlbWFpbi4gRW50cmllcyB3aXRoIG1lc3NhZ2UgdmFsdWVzIGFyZSBjb3BpZWQsXG4gKiBub3QgbWVyZ2VkLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGRpZmZlcnMgZnJvbSBwcm90b2J1ZiBtZXJnZSBzZW1hbnRpY3MsXG4gKiB3aGljaCBhcHBlbmRzIHJlcGVhdGVkIGZpZWxkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwoaW5mbywgdGFyZ2V0LCBzb3VyY2UpIHtcbiAgICBsZXQgZmllbGRWYWx1ZSwgLy8gdGhlIGZpZWxkIHZhbHVlIHdlIGFyZSB3b3JraW5nIHdpdGhcbiAgICBpbnB1dCA9IHNvdXJjZSwgb3V0cHV0OyAvLyB3aGVyZSB3ZSB3YW50IG91ciBmaWVsZCB2YWx1ZSB0byBnb1xuICAgIGZvciAobGV0IGZpZWxkIG9mIGluZm8uZmllbGRzKSB7XG4gICAgICAgIGxldCBuYW1lID0gZmllbGQubG9jYWxOYW1lO1xuICAgICAgICBpZiAoZmllbGQub25lb2YpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gaW5wdXRbZmllbGQub25lb2ZdOyAvLyB0aGlzIGlzIHRoZSBvbmVvZmBzIGdyb3VwIGluIHRoZSBzb3VyY2VcbiAgICAgICAgICAgIGlmICgoZ3JvdXAgPT09IG51bGwgfHwgZ3JvdXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGdyb3VwLm9uZW9mS2luZCkgPT0gdW5kZWZpbmVkKSB7IC8vIHRoZSB1c2VyIGlzIGZyZWUgdG8gb21pdFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyB3ZSBza2lwIHRoaXMgZmllbGQsIGFuZCBhbGwgb3RoZXIgbWVtYmVycyB0b29cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpZWxkVmFsdWUgPSBncm91cFtuYW1lXTsgLy8gb3VyIHZhbHVlIGNvbWVzIGZyb20gdGhlIHRoZSBvbmVvZiBncm91cCBvZiB0aGUgc291cmNlXG4gICAgICAgICAgICBvdXRwdXQgPSB0YXJnZXRbZmllbGQub25lb2ZdOyAvLyBhbmQgb3VyIG91dHB1dCBpcyB0aGUgb25lb2YgZ3JvdXAgb2YgdGhlIHRhcmdldFxuICAgICAgICAgICAgb3V0cHV0Lm9uZW9mS2luZCA9IGdyb3VwLm9uZW9mS2luZDsgLy8gYWx3YXlzIHVwZGF0ZSBkaXNjcmltaW5hdG9yXG4gICAgICAgICAgICBpZiAoZmllbGRWYWx1ZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgb3V0cHV0W25hbWVdOyAvLyByZW1vdmUgYW55IGV4aXN0aW5nIHZhbHVlXG4gICAgICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgZnVydGhlciB3b3JrIG9uIGZpZWxkXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmaWVsZFZhbHVlID0gaW5wdXRbbmFtZV07IC8vIHdlIGFyZSB1c2luZyB0aGUgc291cmNlIGRpcmVjdGx5XG4gICAgICAgICAgICBvdXRwdXQgPSB0YXJnZXQ7IC8vIHdlIHdhbnQgb3VyIGZpZWxkIHZhbHVlIHRvIGdvIGRpcmVjdGx5IGludG8gdGhlIHRhcmdldFxuICAgICAgICAgICAgaWYgKGZpZWxkVmFsdWUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgZnVydGhlciB3b3JrIG9uIGZpZWxkLCBleGlzdGluZyB2YWx1ZSBpcyB1c2VkIGFzIGlzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpZWxkLnJlcGVhdClcbiAgICAgICAgICAgIG91dHB1dFtuYW1lXS5sZW5ndGggPSBmaWVsZFZhbHVlLmxlbmd0aDsgLy8gcmVzaXplIHRhcmdldCBhcnJheSB0byBtYXRjaCBzb3VyY2UgYXJyYXlcbiAgICAgICAgLy8gbm93IHdlIGp1c3Qgd29yayB3aXRoIGBmaWVsZFZhbHVlYCBhbmQgYG91dHB1dGAgdG8gbWVyZ2UgdGhlIHZhbHVlXG4gICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQucmVwZWF0KVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkVmFsdWUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbmFtZV1baV0gPSBmaWVsZFZhbHVlW2ldOyAvLyBub3QgYSByZWZlcmVuY2UgdHlwZVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W25hbWVdID0gZmllbGRWYWx1ZTsgLy8gbm90IGEgcmVmZXJlbmNlIHR5cGVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgbGV0IFQgPSBmaWVsZC5UKCk7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLnJlcGVhdClcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZFZhbHVlLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W25hbWVdW2ldID0gVC5jcmVhdGUoZmllbGRWYWx1ZVtpXSk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob3V0cHV0W25hbWVdID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtuYW1lXSA9IFQuY3JlYXRlKGZpZWxkVmFsdWUpOyAvLyBub3RoaW5nIHRvIG1lcmdlIHdpdGhcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIFQubWVyZ2VQYXJ0aWFsKG91dHB1dFtuYW1lXSwgZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgICAgICAgLy8gTWFwIGFuZCByZXBlYXRlZCBmaWVsZHMgYXJlIHNpbXBseSBvdmVyd3JpdHRlbiwgbm90IGFwcGVuZGVkIG9yIG1lcmdlZFxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuVi5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ob3V0cHV0W25hbWVdLCBmaWVsZFZhbHVlKTsgLy8gZWxlbWVudHMgYXJlIG5vdCByZWZlcmVuY2UgdHlwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IFQgPSBmaWVsZC5WLlQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgb2YgT2JqZWN0LmtleXMoZmllbGRWYWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W25hbWVdW2tdID0gVC5jcmVhdGUoZmllbGRWYWx1ZVtrXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBTY2FsYXJUeXBlIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1pbmZvXCI7XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0d28gbWVzc2FnZSBvZiB0aGUgc2FtZSB0eXBlIGhhdmUgdGhlIHNhbWUgZmllbGQgdmFsdWVzLlxuICogQ2hlY2tzIGZvciBkZWVwIGVxdWFsaXR5LCB0cmF2ZXJzaW5nIHJlcGVhdGVkIGZpZWxkcywgb25lb2YgZ3JvdXBzLCBtYXBzXG4gKiBhbmQgbWVzc2FnZXMgcmVjdXJzaXZlbHkuXG4gKiBXaWxsIGFsc28gcmV0dXJuIHRydWUgaWYgYm90aCBtZXNzYWdlcyBhcmUgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWZsZWN0aW9uRXF1YWxzKGluZm8sIGEsIGIpIHtcbiAgICBpZiAoYSA9PT0gYilcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKCFhIHx8ICFiKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgZmllbGQgb2YgaW5mby5maWVsZHMpIHtcbiAgICAgICAgbGV0IGxvY2FsTmFtZSA9IGZpZWxkLmxvY2FsTmFtZTtcbiAgICAgICAgbGV0IHZhbF9hID0gZmllbGQub25lb2YgPyBhW2ZpZWxkLm9uZW9mXVtsb2NhbE5hbWVdIDogYVtsb2NhbE5hbWVdO1xuICAgICAgICBsZXQgdmFsX2IgPSBmaWVsZC5vbmVvZiA/IGJbZmllbGQub25lb2ZdW2xvY2FsTmFtZV0gOiBiW2xvY2FsTmFtZV07XG4gICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICBsZXQgdCA9IGZpZWxkLmtpbmQgPT0gXCJlbnVtXCIgPyBTY2FsYXJUeXBlLklOVDMyIDogZmllbGQuVDtcbiAgICAgICAgICAgICAgICBpZiAoIShmaWVsZC5yZXBlYXRcbiAgICAgICAgICAgICAgICAgICAgPyByZXBlYXRlZFByaW1pdGl2ZUVxKHQsIHZhbF9hLCB2YWxfYilcbiAgICAgICAgICAgICAgICAgICAgOiBwcmltaXRpdmVFcSh0LCB2YWxfYSwgdmFsX2IpKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgICAgICAgIGlmICghKGZpZWxkLlYua2luZCA9PSBcIm1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICA/IHJlcGVhdGVkTXNnRXEoZmllbGQuVi5UKCksIG9iamVjdFZhbHVlcyh2YWxfYSksIG9iamVjdFZhbHVlcyh2YWxfYikpXG4gICAgICAgICAgICAgICAgICAgIDogcmVwZWF0ZWRQcmltaXRpdmVFcShmaWVsZC5WLmtpbmQgPT0gXCJlbnVtXCIgPyBTY2FsYXJUeXBlLklOVDMyIDogZmllbGQuVi5ULCBvYmplY3RWYWx1ZXModmFsX2EpLCBvYmplY3RWYWx1ZXModmFsX2IpKSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgbGV0IFQgPSBmaWVsZC5UKCk7XG4gICAgICAgICAgICAgICAgaWYgKCEoZmllbGQucmVwZWF0XG4gICAgICAgICAgICAgICAgICAgID8gcmVwZWF0ZWRNc2dFcShULCB2YWxfYSwgdmFsX2IpXG4gICAgICAgICAgICAgICAgICAgIDogVC5lcXVhbHModmFsX2EsIHZhbF9iKSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmNvbnN0IG9iamVjdFZhbHVlcyA9IE9iamVjdC52YWx1ZXM7XG5mdW5jdGlvbiBwcmltaXRpdmVFcSh0eXBlLCBhLCBiKSB7XG4gICAgaWYgKGEgPT09IGIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICh0eXBlICE9PSBTY2FsYXJUeXBlLkJZVEVTKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGJhID0gYTtcbiAgICBsZXQgYmIgPSBiO1xuICAgIGlmIChiYS5sZW5ndGggIT09IGJiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmIChiYVtpXSAhPSBiYltpXSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlcGVhdGVkUHJpbWl0aXZlRXEodHlwZSwgYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmICghcHJpbWl0aXZlRXEodHlwZSwgYVtpXSwgYltpXSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZXBlYXRlZE1zZ0VxKHR5cGUsIGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoIXR5cGUuZXF1YWxzKGFbaV0sIGJbaV0pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufVxuIiwiaW1wb3J0IHsgTUVTU0FHRV9UWVBFIH0gZnJvbSBcIi4vbWVzc2FnZS10eXBlLWNvbnRyYWN0XCI7XG5pbXBvcnQgeyBub3JtYWxpemVGaWVsZEluZm8gfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWluZm9cIjtcbmltcG9ydCB7IFJlZmxlY3Rpb25UeXBlQ2hlY2sgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLXR5cGUtY2hlY2tcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb25Kc29uUmVhZGVyIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1qc29uLXJlYWRlclwiO1xuaW1wb3J0IHsgUmVmbGVjdGlvbkpzb25Xcml0ZXIgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWpzb24td3JpdGVyXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uQmluYXJ5UmVhZGVyIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1iaW5hcnktcmVhZGVyXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uQmluYXJ5V3JpdGVyIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1iaW5hcnktd3JpdGVyXCI7XG5pbXBvcnQgeyByZWZsZWN0aW9uQ3JlYXRlIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1jcmVhdGVcIjtcbmltcG9ydCB7IHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLW1lcmdlLXBhcnRpYWxcIjtcbmltcG9ydCB7IHR5cGVvZkpzb25WYWx1ZSB9IGZyb20gXCIuL2pzb24tdHlwaW5nc1wiO1xuaW1wb3J0IHsganNvblJlYWRPcHRpb25zLCBqc29uV3JpdGVPcHRpb25zLCB9IGZyb20gXCIuL2pzb24tZm9ybWF0LWNvbnRyYWN0XCI7XG5pbXBvcnQgeyByZWZsZWN0aW9uRXF1YWxzIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1lcXVhbHNcIjtcbmltcG9ydCB7IGJpbmFyeVdyaXRlT3B0aW9ucyB9IGZyb20gXCIuL2JpbmFyeS13cml0ZXJcIjtcbmltcG9ydCB7IGJpbmFyeVJlYWRPcHRpb25zIH0gZnJvbSBcIi4vYmluYXJ5LXJlYWRlclwiO1xuLyoqXG4gKiBUaGlzIHN0YW5kYXJkIG1lc3NhZ2UgdHlwZSBwcm92aWRlcyByZWZsZWN0aW9uLWJhc2VkXG4gKiBvcGVyYXRpb25zIHRvIHdvcmsgd2l0aCBhIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IobmFtZSwgZmllbGRzLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZGVmYXVsdENoZWNrRGVwdGggPSAxNjtcbiAgICAgICAgdGhpcy50eXBlTmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuZmllbGRzID0gZmllbGRzLm1hcChub3JtYWxpemVGaWVsZEluZm8pO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiB7fTtcbiAgICAgICAgdGhpcy5tZXNzYWdlUHJvdG90eXBlID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCBNRVNTQUdFX1RZUEUsIHsgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIHRoaXMucmVmVHlwZUNoZWNrID0gbmV3IFJlZmxlY3Rpb25UeXBlQ2hlY2sodGhpcyk7XG4gICAgICAgIHRoaXMucmVmSnNvblJlYWRlciA9IG5ldyBSZWZsZWN0aW9uSnNvblJlYWRlcih0aGlzKTtcbiAgICAgICAgdGhpcy5yZWZKc29uV3JpdGVyID0gbmV3IFJlZmxlY3Rpb25Kc29uV3JpdGVyKHRoaXMpO1xuICAgICAgICB0aGlzLnJlZkJpblJlYWRlciA9IG5ldyBSZWZsZWN0aW9uQmluYXJ5UmVhZGVyKHRoaXMpO1xuICAgICAgICB0aGlzLnJlZkJpbldyaXRlciA9IG5ldyBSZWZsZWN0aW9uQmluYXJ5V3JpdGVyKHRoaXMpO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSByZWZsZWN0aW9uQ3JlYXRlKHRoaXMpO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb25lIHRoZSBtZXNzYWdlLlxuICAgICAqXG4gICAgICogVW5rbm93biBmaWVsZHMgYXJlIGRpc2NhcmRlZC5cbiAgICAgKi9cbiAgICBjbG9uZShtZXNzYWdlKSB7XG4gICAgICAgIGxldCBjb3B5ID0gdGhpcy5jcmVhdGUoKTtcbiAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBjb3B5LCBtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgd2hldGhlciB0d28gbWVzc2FnZSBvZiB0aGUgc2FtZSB0eXBlIGhhdmUgdGhlIHNhbWUgZmllbGQgdmFsdWVzLlxuICAgICAqIENoZWNrcyBmb3IgZGVlcCBlcXVhbGl0eSwgdHJhdmVyc2luZyByZXBlYXRlZCBmaWVsZHMsIG9uZW9mIGdyb3VwcywgbWFwc1xuICAgICAqIGFuZCBtZXNzYWdlcyByZWN1cnNpdmVseS5cbiAgICAgKiBXaWxsIGFsc28gcmV0dXJuIHRydWUgaWYgYm90aCBtZXNzYWdlcyBhcmUgYHVuZGVmaW5lZGAuXG4gICAgICovXG4gICAgZXF1YWxzKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25FcXVhbHModGhpcywgYSwgYik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElzIHRoZSBnaXZlbiB2YWx1ZSBhc3NpZ25hYmxlIHRvIG91ciBtZXNzYWdlIHR5cGVcbiAgICAgKiBhbmQgY29udGFpbnMgbm8gW2V4Y2VzcyBwcm9wZXJ0aWVzXShodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9pbnRlcmZhY2VzLmh0bWwjZXhjZXNzLXByb3BlcnR5LWNoZWNrcyk/XG4gICAgICovXG4gICAgaXMoYXJnLCBkZXB0aCA9IHRoaXMuZGVmYXVsdENoZWNrRGVwdGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmVHlwZUNoZWNrLmlzKGFyZywgZGVwdGgsIGZhbHNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXMgdGhlIGdpdmVuIHZhbHVlIGFzc2lnbmFibGUgdG8gb3VyIG1lc3NhZ2UgdHlwZSxcbiAgICAgKiByZWdhcmRsZXNzIG9mIFtleGNlc3MgcHJvcGVydGllc10oaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svaW50ZXJmYWNlcy5odG1sI2V4Y2Vzcy1wcm9wZXJ0eS1jaGVja3MpP1xuICAgICAqL1xuICAgIGlzQXNzaWduYWJsZShhcmcsIGRlcHRoID0gdGhpcy5kZWZhdWx0Q2hlY2tEZXB0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZUeXBlQ2hlY2suaXMoYXJnLCBkZXB0aCwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvcHkgcGFydGlhbCBkYXRhIGludG8gdGhlIHRhcmdldCBtZXNzYWdlLlxuICAgICAqL1xuICAgIG1lcmdlUGFydGlhbCh0YXJnZXQsIHNvdXJjZSkge1xuICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIHRhcmdldCwgc291cmNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IG1lc3NhZ2UgZnJvbSBiaW5hcnkgZm9ybWF0LlxuICAgICAqL1xuICAgIGZyb21CaW5hcnkoZGF0YSwgb3B0aW9ucykge1xuICAgICAgICBsZXQgb3B0ID0gYmluYXJ5UmVhZE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsQmluYXJ5UmVhZChvcHQucmVhZGVyRmFjdG9yeShkYXRhKSwgZGF0YS5ieXRlTGVuZ3RoLCBvcHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgbmV3IG1lc3NhZ2UgZnJvbSBhIEpTT04gdmFsdWUuXG4gICAgICovXG4gICAgZnJvbUpzb24oanNvbiwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEpzb25SZWFkKGpzb24sIGpzb25SZWFkT3B0aW9ucyhvcHRpb25zKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBuZXcgbWVzc2FnZSBmcm9tIGEgSlNPTiBzdHJpbmcuXG4gICAgICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBULmZyb21Kc29uKEpTT04ucGFyc2UoanNvbikpYC5cbiAgICAgKi9cbiAgICBmcm9tSnNvblN0cmluZyhqc29uLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IEpTT04ucGFyc2UoanNvbik7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb21Kc29uKHZhbHVlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgdGhlIG1lc3NhZ2UgdG8gY2Fub25pY2FsIEpTT04gdmFsdWUuXG4gICAgICovXG4gICAgdG9Kc29uKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxKc29uV3JpdGUobWVzc2FnZSwganNvbldyaXRlT3B0aW9ucyhvcHRpb25zKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgdGhlIG1lc3NhZ2UgdG8gY2Fub25pY2FsIEpTT04gc3RyaW5nLlxuICAgICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byBgSlNPTi5zdHJpbmdpZnkoVC50b0pzb24odCkpYFxuICAgICAqL1xuICAgIHRvSnNvblN0cmluZyhtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy50b0pzb24obWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnByZXR0eVNwYWNlcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIHRoZSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQuXG4gICAgICovXG4gICAgdG9CaW5hcnkobWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICBsZXQgb3B0ID0gYmluYXJ5V3JpdGVPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIG9wdC53cml0ZXJGYWN0b3J5KCksIG9wdCkuZmluaXNoKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kLiBJZiB5b3UganVzdCB3YW50IHRvIHJlYWQgYSBtZXNzYWdlIGZyb21cbiAgICAgKiBKU09OLCB1c2UgYGZyb21Kc29uKClgIG9yIGBmcm9tSnNvblN0cmluZygpYC5cbiAgICAgKlxuICAgICAqIFJlYWRzIEpTT04gdmFsdWUgYW5kIG1lcmdlcyB0aGUgZmllbGRzIGludG8gdGhlIHRhcmdldFxuICAgICAqIGFjY29yZGluZyB0byBwcm90b2J1ZiBydWxlcy4gSWYgdGhlIHRhcmdldCBpcyBvbWl0dGVkLFxuICAgICAqIGEgbmV3IGluc3RhbmNlIGlzIGNyZWF0ZWQgZmlyc3QuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uUmVhZChqc29uLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKGpzb24gIT09IG51bGwgJiYgdHlwZW9mIGpzb24gPT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShqc29uKSkge1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5yZWZKc29uUmVhZGVyLnJlYWQoanNvbiwgbWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBwYXJzZSBtZXNzYWdlICR7dGhpcy50eXBlTmFtZX0gZnJvbSBKU09OICR7dHlwZW9mSnNvblZhbHVlKGpzb24pfS5gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QuIElmIHlvdSBqdXN0IHdhbnQgdG8gd3JpdGUgYSBtZXNzYWdlXG4gICAgICogdG8gSlNPTiwgdXNlIGB0b0pzb24oKWAgb3IgYHRvSnNvblN0cmluZygpLlxuICAgICAqXG4gICAgICogV3JpdGVzIEpTT04gdmFsdWUgYW5kIHJldHVybnMgaXQuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uV3JpdGUobWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZKc29uV3JpdGVyLndyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZC4gSWYgeW91IGp1c3Qgd2FudCB0byB3cml0ZSBhIG1lc3NhZ2VcbiAgICAgKiBpbiBiaW5hcnkgZm9ybWF0LCB1c2UgYHRvQmluYXJ5KClgLlxuICAgICAqXG4gICAgICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSBpbiBiaW5hcnkgZm9ybWF0IGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBnaXZlblxuICAgICAqIHdyaXRlci4gUmV0dXJucyBwYXNzZWQgd3JpdGVyLlxuICAgICAqL1xuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMucmVmQmluV3JpdGVyLndyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kLiBJZiB5b3UganVzdCB3YW50IHRvIHJlYWQgYSBtZXNzYWdlIGZyb21cbiAgICAgKiBiaW5hcnkgZGF0YSwgdXNlIGBmcm9tQmluYXJ5KClgLlxuICAgICAqXG4gICAgICogUmVhZHMgZGF0YSBmcm9tIGJpbmFyeSBmb3JtYXQgYW5kIG1lcmdlcyB0aGUgZmllbGRzIGludG9cbiAgICAgKiB0aGUgdGFyZ2V0IGFjY29yZGluZyB0byBwcm90b2J1ZiBydWxlcy4gSWYgdGhlIHRhcmdldCBpc1xuICAgICAqIG9taXR0ZWQsIGEgbmV3IGluc3RhbmNlIGlzIGNyZWF0ZWQgZmlyc3QuXG4gICAgICovXG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICB0aGlzLnJlZkJpblJlYWRlci5yZWFkKHJlYWRlciwgbWVzc2FnZSwgb3B0aW9ucywgbGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgTUVTU0FHRV9UWVBFIH0gZnJvbSAnLi9tZXNzYWdlLXR5cGUtY29udHJhY3QnO1xuLyoqXG4gKiBDaGVjayBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGlzIGEgcHJvdG8gbWVzc2FnZS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSAtIGl0IGlzIGhlcmUgdG8gc3RheSwgYnV0XG4gKiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG1heSBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250YWluc01lc3NhZ2VUeXBlKG1zZykge1xuICAgIHJldHVybiBtc2dbTUVTU0FHRV9UWVBFXSAhPSBudWxsO1xufVxuIiwiLyoqXG4gKiBJcyB0aGlzIGEgbG9va3VwIG9iamVjdCBnZW5lcmF0ZWQgYnkgVHlwZXNjcmlwdCwgZm9yIGEgVHlwZXNjcmlwdCBlbnVtXG4gKiBnZW5lcmF0ZWQgYnkgcHJvdG9idWYtdHM/XG4gKlxuICogLSBObyBgY29uc3QgZW51bWAgKGVudW0gbXVzdCBub3QgYmUgaW5saW5lZCwgd2UgbmVlZCByZXZlcnNlIG1hcHBpbmcpLlxuICogLSBObyBzdHJpbmcgZW51bSAod2UgbmVlZCBpbnQzMiBmb3IgcHJvdG9idWYpLlxuICogLSBNdXN0IGhhdmUgYSB2YWx1ZSBmb3IgMCAob3RoZXJ3aXNlLCB3ZSB3b3VsZCBuZWVkIHRvIHN1cHBvcnQgY3VzdG9tIGRlZmF1bHQgdmFsdWVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW51bU9iamVjdChhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPSAnb2JqZWN0JyB8fCBhcmcgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWFyZy5oYXNPd25Qcm9wZXJ0eSgwKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAobGV0IGsgb2YgT2JqZWN0LmtleXMoYXJnKSkge1xuICAgICAgICBsZXQgbnVtID0gcGFyc2VJbnQoayk7XG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKG51bSkpIHtcbiAgICAgICAgICAgIC8vIGlzIHRoZXJlIGEgbmFtZSBmb3IgdGhlIG51bWJlcj9cbiAgICAgICAgICAgIGxldCBuYW0gPSBhcmdbbnVtXTtcbiAgICAgICAgICAgIGlmIChuYW0gPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAvLyBkb2VzIHRoZSBuYW1lIHJlc29sdmUgYmFjayB0byB0aGUgbnVtYmVyP1xuICAgICAgICAgICAgaWYgKGFyZ1tuYW1dICE9PSBudW0pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gaXMgdGhlcmUgYSBudW1iZXIgZm9yIHRoZSBuYW1lP1xuICAgICAgICAgICAgbGV0IG51bSA9IGFyZ1trXTtcbiAgICAgICAgICAgIGlmIChudW0gPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAvLyBpcyBpdCBhIHN0cmluZyBlbnVtP1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBudW0gIT09ICdudW1iZXInKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIC8vIGRvIHdlIGtub3cgdGhlIG51bWJlcj9cbiAgICAgICAgICAgIGlmIChhcmdbbnVtXSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8qKlxuICogTGlzdHMgYWxsIHZhbHVlcyBvZiBhIFR5cGVzY3JpcHQgZW51bSwgYXMgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIGEgXCJuYW1lXCJcbiAqIHByb3BlcnR5IGFuZCBhIFwibnVtYmVyXCIgcHJvcGVydHkuXG4gKlxuICogTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRoYXQgYSBudW1iZXIgYXBwZWFycyBtb3JlIHRoYW4gb25jZSwgYmVjYXVzZSBpdCBpc1xuICogcG9zc2libGUgdG8gaGF2ZSBhbGlhc2VzIGluIGFuIGVudW0uXG4gKlxuICogVGhyb3dzIGlmIHRoZSBlbnVtIGRvZXMgbm90IGFkaGVyZSB0byB0aGUgcnVsZXMgb2YgZW51bXMgZ2VuZXJhdGVkIGJ5XG4gKiBwcm90b2J1Zi10cy4gU2VlIGBpc0VudW1PYmplY3QoKWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0RW51bVZhbHVlcyhlbnVtT2JqZWN0KSB7XG4gICAgaWYgKCFpc0VudW1PYmplY3QoZW51bU9iamVjdCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBhIHR5cGVzY3JpcHQgZW51bSBvYmplY3RcIik7XG4gICAgbGV0IHZhbHVlcyA9IFtdO1xuICAgIGZvciAobGV0IFtuYW1lLCBudW1iZXJdIG9mIE9iamVjdC5lbnRyaWVzKGVudW1PYmplY3QpKVxuICAgICAgICBpZiAodHlwZW9mIG51bWJlciA9PSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdmFsdWVzLnB1c2goeyBuYW1lLCBudW1iZXIgfSk7XG4gICAgcmV0dXJuIHZhbHVlcztcbn1cbi8qKlxuICogTGlzdHMgdGhlIG5hbWVzIG9mIGEgVHlwZXNjcmlwdCBlbnVtLlxuICpcbiAqIFRocm93cyBpZiB0aGUgZW51bSBkb2VzIG5vdCBhZGhlcmUgdG8gdGhlIHJ1bGVzIG9mIGVudW1zIGdlbmVyYXRlZCBieVxuICogcHJvdG9idWYtdHMuIFNlZSBgaXNFbnVtT2JqZWN0KClgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdEVudW1OYW1lcyhlbnVtT2JqZWN0KSB7XG4gICAgcmV0dXJuIGxpc3RFbnVtVmFsdWVzKGVudW1PYmplY3QpLm1hcCh2YWwgPT4gdmFsLm5hbWUpO1xufVxuLyoqXG4gKiBMaXN0cyB0aGUgbnVtYmVycyBvZiBhIFR5cGVzY3JpcHQgZW51bS5cbiAqXG4gKiBUaHJvd3MgaWYgdGhlIGVudW0gZG9lcyBub3QgYWRoZXJlIHRvIHRoZSBydWxlcyBvZiBlbnVtcyBnZW5lcmF0ZWQgYnlcbiAqIHByb3RvYnVmLXRzLiBTZWUgYGlzRW51bU9iamVjdCgpYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RFbnVtTnVtYmVycyhlbnVtT2JqZWN0KSB7XG4gICAgcmV0dXJuIGxpc3RFbnVtVmFsdWVzKGVudW1PYmplY3QpXG4gICAgICAgIC5tYXAodmFsID0+IHZhbC5udW1iZXIpXG4gICAgICAgIC5maWx0ZXIoKG51bSwgaW5kZXgsIGFycikgPT4gYXJyLmluZGV4T2YobnVtKSA9PSBpbmRleCk7XG59XG4iLCIvLyBQdWJsaWMgQVBJIG9mIHRoZSBwcm90b2J1Zi10cyBydW50aW1lLlxuLy8gTm90ZTogd2UgZG8gbm90IHVzZSBgZXhwb3J0ICogZnJvbSAuLi5gIHRvIGhlbHAgdHJlZSBzaGFrZXJzLFxuLy8gd2VicGFjayB2ZXJib3NlIG91dHB1dCBoaW50cyB0aGF0IHRoaXMgc2hvdWxkIGJlIHVzZWZ1bFxuLy8gQ29udmVuaWVuY2UgSlNPTiB0eXBpbmdzIGFuZCBjb3JyZXNwb25kaW5nIHR5cGUgZ3VhcmRzXG5leHBvcnQgeyB0eXBlb2ZKc29uVmFsdWUsIGlzSnNvbk9iamVjdCB9IGZyb20gJy4vanNvbi10eXBpbmdzJztcbi8vIEJhc2UgNjQgZW5jb2RpbmdcbmV4cG9ydCB7IGJhc2U2NGRlY29kZSwgYmFzZTY0ZW5jb2RlIH0gZnJvbSAnLi9iYXNlNjQnO1xuLy8gVVRGOCBlbmNvZGluZ1xuZXhwb3J0IHsgdXRmOHJlYWQgfSBmcm9tICcuL3Byb3RvYnVmanMtdXRmOCc7XG4vLyBCaW5hcnkgZm9ybWF0IGNvbnRyYWN0cywgb3B0aW9ucyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZywgZm9yIGV4YW1wbGVcbmV4cG9ydCB7IFdpcmVUeXBlLCBtZXJnZUJpbmFyeU9wdGlvbnMsIFVua25vd25GaWVsZEhhbmRsZXIsIH0gZnJvbSAnLi9iaW5hcnktZm9ybWF0LWNvbnRyYWN0Jztcbi8vIFN0YW5kYXJkIElCaW5hcnlSZWFkZXIgaW1wbGVtZW50YXRpb25cbmV4cG9ydCB7IEJpbmFyeVJlYWRlciwgYmluYXJ5UmVhZE9wdGlvbnMgfSBmcm9tICcuL2JpbmFyeS1yZWFkZXInO1xuLy8gU3RhbmRhcmQgSUJpbmFyeVdyaXRlciBpbXBsZW1lbnRhdGlvblxuZXhwb3J0IHsgQmluYXJ5V3JpdGVyLCBiaW5hcnlXcml0ZU9wdGlvbnMgfSBmcm9tICcuL2JpbmFyeS13cml0ZXInO1xuLy8gSW50NjQgYW5kIFVJbnQ2NCBpbXBsZW1lbnRhdGlvbnMgcmVxdWlyZWQgZm9yIHRoZSBiaW5hcnkgZm9ybWF0XG5leHBvcnQgeyBQYkxvbmcsIFBiVUxvbmcgfSBmcm9tICcuL3BiLWxvbmcnO1xuLy8gSlNPTiBmb3JtYXQgY29udHJhY3RzLCBvcHRpb25zIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLCBmb3IgZXhhbXBsZVxuZXhwb3J0IHsganNvblJlYWRPcHRpb25zLCBqc29uV3JpdGVPcHRpb25zLCBtZXJnZUpzb25PcHRpb25zIH0gZnJvbSAnLi9qc29uLWZvcm1hdC1jb250cmFjdCc7XG4vLyBNZXNzYWdlIHR5cGUgY29udHJhY3RcbmV4cG9ydCB7IE1FU1NBR0VfVFlQRSB9IGZyb20gJy4vbWVzc2FnZS10eXBlLWNvbnRyYWN0Jztcbi8vIE1lc3NhZ2UgdHlwZSBpbXBsZW1lbnRhdGlvbiB2aWEgcmVmbGVjdGlvblxuZXhwb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tICcuL21lc3NhZ2UtdHlwZSc7XG4vLyBSZWZsZWN0aW9uIGluZm8sIGdlbmVyYXRlZCBieSB0aGUgcGx1Z2luLCBleHBvc2VkIHRvIHRoZSB1c2VyLCB1c2VkIGJ5IHJlZmxlY3Rpb24gb3BzXG5leHBvcnQgeyBTY2FsYXJUeXBlLCBMb25nVHlwZSwgUmVwZWF0VHlwZSwgbm9ybWFsaXplRmllbGRJbmZvLCByZWFkRmllbGRPcHRpb25zLCByZWFkRmllbGRPcHRpb24sIHJlYWRNZXNzYWdlT3B0aW9uIH0gZnJvbSAnLi9yZWZsZWN0aW9uLWluZm8nO1xuLy8gTWVzc2FnZSBvcGVyYXRpb25zIHZpYSByZWZsZWN0aW9uXG5leHBvcnQgeyBSZWZsZWN0aW9uVHlwZUNoZWNrIH0gZnJvbSAnLi9yZWZsZWN0aW9uLXR5cGUtY2hlY2snO1xuZXhwb3J0IHsgcmVmbGVjdGlvbkNyZWF0ZSB9IGZyb20gJy4vcmVmbGVjdGlvbi1jcmVhdGUnO1xuZXhwb3J0IHsgcmVmbGVjdGlvblNjYWxhckRlZmF1bHQgfSBmcm9tICcuL3JlZmxlY3Rpb24tc2NhbGFyLWRlZmF1bHQnO1xuZXhwb3J0IHsgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCB9IGZyb20gJy4vcmVmbGVjdGlvbi1tZXJnZS1wYXJ0aWFsJztcbmV4cG9ydCB7IHJlZmxlY3Rpb25FcXVhbHMgfSBmcm9tICcuL3JlZmxlY3Rpb24tZXF1YWxzJztcbmV4cG9ydCB7IFJlZmxlY3Rpb25CaW5hcnlSZWFkZXIgfSBmcm9tICcuL3JlZmxlY3Rpb24tYmluYXJ5LXJlYWRlcic7XG5leHBvcnQgeyBSZWZsZWN0aW9uQmluYXJ5V3JpdGVyIH0gZnJvbSAnLi9yZWZsZWN0aW9uLWJpbmFyeS13cml0ZXInO1xuZXhwb3J0IHsgUmVmbGVjdGlvbkpzb25SZWFkZXIgfSBmcm9tICcuL3JlZmxlY3Rpb24tanNvbi1yZWFkZXInO1xuZXhwb3J0IHsgUmVmbGVjdGlvbkpzb25Xcml0ZXIgfSBmcm9tICcuL3JlZmxlY3Rpb24tanNvbi13cml0ZXInO1xuZXhwb3J0IHsgY29udGFpbnNNZXNzYWdlVHlwZSB9IGZyb20gJy4vcmVmbGVjdGlvbi1jb250YWlucy1tZXNzYWdlLXR5cGUnO1xuLy8gT25lb2YgaGVscGVyc1xuZXhwb3J0IHsgaXNPbmVvZkdyb3VwLCBzZXRPbmVvZlZhbHVlLCBnZXRPbmVvZlZhbHVlLCBjbGVhck9uZW9mVmFsdWUsIGdldFNlbGVjdGVkT25lb2ZWYWx1ZSB9IGZyb20gJy4vb25lb2YnO1xuLy8gRW51bSBvYmplY3QgdHlwZSBndWFyZCBhbmQgcmVmbGVjdGlvbiB1dGlsLCBtYXkgYmUgaW50ZXJlc3RpbmcgdG8gdGhlIHVzZXIuXG5leHBvcnQgeyBsaXN0RW51bVZhbHVlcywgbGlzdEVudW1OYW1lcywgbGlzdEVudW1OdW1iZXJzLCBpc0VudW1PYmplY3QgfSBmcm9tICcuL2VudW0tb2JqZWN0Jztcbi8vIGxvd2VyQ2FtZWxDYXNlKCkgaXMgZXhwb3J0ZWQgZm9yIHBsdWdpbiwgcnBjLXJ1bnRpbWUgYW5kIG90aGVyIHJwYyBwYWNrYWdlc1xuZXhwb3J0IHsgbG93ZXJDYW1lbENhc2UgfSBmcm9tICcuL2xvd2VyLWNhbWVsLWNhc2UnO1xuLy8gYXNzZXJ0aW9uIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZm9yIHBsdWdpbiwgbWF5IGFsc28gYmUgdXNlZnVsIHRvIHVzZXJcbmV4cG9ydCB7IGFzc2VydCwgYXNzZXJ0TmV2ZXIsIGFzc2VydEludDMyLCBhc3NlcnRVSW50MzIsIGFzc2VydEZsb2F0MzIgfSBmcm9tICcuL2Fzc2VydCc7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9102\n')},9557:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ N3: () => (/* binding */ mergeJsonOptions),\n/* harmony export */ P2: () => (/* binding */ jsonWriteOptions),\n/* harmony export */ jl: () => (/* binding */ jsonReadOptions)\n/* harmony export */ });\nconst defaultsWrite = {\n emitDefaultValues: false,\n enumAsInteger: false,\n useProtoFieldName: false,\n prettySpaces: 0,\n}, defaultsRead = {\n ignoreUnknownFields: false,\n};\n/**\n * Make options for reading JSON data from partial options.\n */\nfunction jsonReadOptions(options) {\n return options ? Object.assign(Object.assign({}, defaultsRead), options) : defaultsRead;\n}\n/**\n * Make options for writing JSON data from partial options.\n */\nfunction jsonWriteOptions(options) {\n return options ? Object.assign(Object.assign({}, defaultsWrite), options) : defaultsWrite;\n}\n/**\n * Merges JSON write or read options. Later values override earlier values. Type registries are merged.\n */\nfunction mergeJsonOptions(a, b) {\n var _a, _b;\n let c = Object.assign(Object.assign({}, a), b);\n c.typeRegistry = [...((_a = a === null || a === void 0 ? void 0 : a.typeRegistry) !== null && _a !== void 0 ? _a : []), ...((_b = b === null || b === void 0 ? void 0 : b.typeRegistry) !== null && _b !== void 0 ? _b : [])];\n return c;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTU1Ny5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9qc29uLWZvcm1hdC1jb250cmFjdC5qcz83NWM4Il0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGRlZmF1bHRzV3JpdGUgPSB7XG4gICAgZW1pdERlZmF1bHRWYWx1ZXM6IGZhbHNlLFxuICAgIGVudW1Bc0ludGVnZXI6IGZhbHNlLFxuICAgIHVzZVByb3RvRmllbGROYW1lOiBmYWxzZSxcbiAgICBwcmV0dHlTcGFjZXM6IDAsXG59LCBkZWZhdWx0c1JlYWQgPSB7XG4gICAgaWdub3JlVW5rbm93bkZpZWxkczogZmFsc2UsXG59O1xuLyoqXG4gKiBNYWtlIG9wdGlvbnMgZm9yIHJlYWRpbmcgSlNPTiBkYXRhIGZyb20gcGFydGlhbCBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvblJlYWRPcHRpb25zKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucyA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHNSZWFkKSwgb3B0aW9ucykgOiBkZWZhdWx0c1JlYWQ7XG59XG4vKipcbiAqIE1ha2Ugb3B0aW9ucyBmb3Igd3JpdGluZyBKU09OIGRhdGEgZnJvbSBwYXJ0aWFsIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uV3JpdGVPcHRpb25zKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucyA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHNXcml0ZSksIG9wdGlvbnMpIDogZGVmYXVsdHNXcml0ZTtcbn1cbi8qKlxuICogTWVyZ2VzIEpTT04gd3JpdGUgb3IgcmVhZCBvcHRpb25zLiBMYXRlciB2YWx1ZXMgb3ZlcnJpZGUgZWFybGllciB2YWx1ZXMuIFR5cGUgcmVnaXN0cmllcyBhcmUgbWVyZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VKc29uT3B0aW9ucyhhLCBiKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBsZXQgYyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYSksIGIpO1xuICAgIGMudHlwZVJlZ2lzdHJ5ID0gWy4uLigoX2EgPSBhID09PSBudWxsIHx8IGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGEudHlwZVJlZ2lzdHJ5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXSksIC4uLigoX2IgPSBiID09PSBudWxsIHx8IGIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGIudHlwZVJlZ2lzdHJ5KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBbXSldO1xuICAgIHJldHVybiBjO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9557\n")},1212:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ c: () => (/* binding */ lowerCamelCase)\n/* harmony export */ });\n/**\n * Converts snake_case to lowerCamelCase.\n *\n * Should behave like protoc:\n * https://github.com/protocolbuffers/protobuf/blob/e8ae137c96444ea313485ed1118c5e43b2099cf1/src/google/protobuf/compiler/java/java_helpers.cc#L118\n */\nfunction lowerCamelCase(snakeCase) {\n let capNext = false;\n const sb = [];\n for (let i = 0; i < snakeCase.length; i++) {\n let next = snakeCase.charAt(i);\n if (next == '_') {\n capNext = true;\n }\n else if (/\\d/.test(next)) {\n sb.push(next);\n capNext = true;\n }\n else if (capNext) {\n sb.push(next.toUpperCase());\n capNext = false;\n }\n else if (i == 0) {\n sb.push(next.toLowerCase());\n }\n else {\n sb.push(next);\n }\n }\n return sb.join('');\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIxMi5qcyIsIm1hcHBpbmdzIjoiOzs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9sb3dlci1jYW1lbC1jYXNlLmpzPzQ3NGMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb252ZXJ0cyBzbmFrZV9jYXNlIHRvIGxvd2VyQ2FtZWxDYXNlLlxuICpcbiAqIFNob3VsZCBiZWhhdmUgbGlrZSBwcm90b2M6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL2Jsb2IvZThhZTEzN2M5NjQ0NGVhMzEzNDg1ZWQxMTE4YzVlNDNiMjA5OWNmMS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmNjI0wxMThcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvd2VyQ2FtZWxDYXNlKHNuYWtlQ2FzZSkge1xuICAgIGxldCBjYXBOZXh0ID0gZmFsc2U7XG4gICAgY29uc3Qgc2IgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNuYWtlQ2FzZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgbmV4dCA9IHNuYWtlQ2FzZS5jaGFyQXQoaSk7XG4gICAgICAgIGlmIChuZXh0ID09ICdfJykge1xuICAgICAgICAgICAgY2FwTmV4dCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoL1xcZC8udGVzdChuZXh0KSkge1xuICAgICAgICAgICAgc2IucHVzaChuZXh0KTtcbiAgICAgICAgICAgIGNhcE5leHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNhcE5leHQpIHtcbiAgICAgICAgICAgIHNiLnB1c2gobmV4dC50b1VwcGVyQ2FzZSgpKTtcbiAgICAgICAgICAgIGNhcE5leHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpID09IDApIHtcbiAgICAgICAgICAgIHNiLnB1c2gobmV4dC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNiLnB1c2gobmV4dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNiLmpvaW4oJycpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1212\n")},4154:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\r\n * archiver-utils\r\n *\r\n * Copyright (c) 2012-2014 Chris Talkington, contributors.\r\n * Licensed under the MIT license.\r\n * https://github.com/archiverjs/node-archiver/blob/master/LICENSE-MIT\r\n */\r\nvar fs = __webpack_require__(77);\r\nvar path = __webpack_require__(1017);\r\n\r\nvar flatten = __webpack_require__(5800);\r\nvar difference = __webpack_require__(1478);\r\nvar union = __webpack_require__(6744);\r\nvar isPlainObject = __webpack_require__(8146);\r\n\r\nvar glob = __webpack_require__(2884);\r\n\r\nvar file = module.exports = {};\r\n\r\nvar pathSeparatorRe = /[\\/\\\\]/g;\r\n\r\n// Process specified wildcard glob patterns or filenames against a\r\n// callback, excluding and uniquing files in the result set.\r\nvar processPatterns = function(patterns, fn) {\r\n // Filepaths to return.\r\n var result = [];\r\n // Iterate over flattened patterns array.\r\n flatten(patterns).forEach(function(pattern) {\r\n // If the first character is ! it should be omitted\r\n var exclusion = pattern.indexOf('!') === 0;\r\n // If the pattern is an exclusion, remove the !\r\n if (exclusion) { pattern = pattern.slice(1); }\r\n // Find all matching files for this pattern.\r\n var matches = fn(pattern);\r\n if (exclusion) {\r\n // If an exclusion, remove matching files.\r\n result = difference(result, matches);\r\n } else {\r\n // Otherwise add matching files.\r\n result = union(result, matches);\r\n }\r\n });\r\n return result;\r\n};\r\n\r\n// True if the file path exists.\r\nfile.exists = function() {\r\n var filepath = path.join.apply(path, arguments);\r\n return fs.existsSync(filepath);\r\n};\r\n\r\n// Return an array of all file paths that match the given wildcard patterns.\r\nfile.expand = function(...args) {\r\n // If the first argument is an options object, save those options to pass\r\n // into the File.prototype.glob.sync method.\r\n var options = isPlainObject(args[0]) ? args.shift() : {};\r\n // Use the first argument if it's an Array, otherwise convert the arguments\r\n // object to an array and use that.\r\n var patterns = Array.isArray(args[0]) ? args[0] : args;\r\n // Return empty set if there are no patterns or filepaths.\r\n if (patterns.length === 0) { return []; }\r\n // Return all matching filepaths.\r\n var matches = processPatterns(patterns, function(pattern) {\r\n // Find all matching files for this pattern.\r\n return glob.sync(pattern, options);\r\n });\r\n // Filter result set?\r\n if (options.filter) {\r\n matches = matches.filter(function(filepath) {\r\n filepath = path.join(options.cwd || '', filepath);\r\n try {\r\n if (typeof options.filter === 'function') {\r\n return options.filter(filepath);\r\n } else {\r\n // If the file is of the right type and exists, this should work.\r\n return fs.statSync(filepath)[options.filter]();\r\n }\r\n } catch(e) {\r\n // Otherwise, it's probably not the right type.\r\n return false;\r\n }\r\n });\r\n }\r\n return matches;\r\n};\r\n\r\n// Build a multi task \"files\" object dynamically.\r\nfile.expandMapping = function(patterns, destBase, options) {\r\n options = Object.assign({\r\n rename: function(destBase, destPath) {\r\n return path.join(destBase || '', destPath);\r\n }\r\n }, options);\r\n var files = [];\r\n var fileByDest = {};\r\n // Find all files matching pattern, using passed-in options.\r\n file.expand(options, patterns).forEach(function(src) {\r\n var destPath = src;\r\n // Flatten?\r\n if (options.flatten) {\r\n destPath = path.basename(destPath);\r\n }\r\n // Change the extension?\r\n if (options.ext) {\r\n destPath = destPath.replace(/(\\.[^\\/]*)?$/, options.ext);\r\n }\r\n // Generate destination filename.\r\n var dest = options.rename(destBase, destPath, options);\r\n // Prepend cwd to src path if necessary.\r\n if (options.cwd) { src = path.join(options.cwd, src); }\r\n // Normalize filepaths to be unix-style.\r\n dest = dest.replace(pathSeparatorRe, '/');\r\n src = src.replace(pathSeparatorRe, '/');\r\n // Map correct src path to dest path.\r\n if (fileByDest[dest]) {\r\n // If dest already exists, push this src onto that dest's src array.\r\n fileByDest[dest].src.push(src);\r\n } else {\r\n // Otherwise create a new src-dest file mapping object.\r\n files.push({\r\n src: [src],\r\n dest: dest,\r\n });\r\n // And store a reference for later use.\r\n fileByDest[dest] = files[files.length - 1];\r\n }\r\n });\r\n return files;\r\n};\r\n\r\n// reusing bits of grunt's multi-task source normalization\r\nfile.normalizeFilesArray = function(data) {\r\n var files = [];\r\n\r\n data.forEach(function(obj) {\r\n var prop;\r\n if ('src' in obj || 'dest' in obj) {\r\n files.push(obj);\r\n }\r\n });\r\n\r\n if (files.length === 0) {\r\n return [];\r\n }\r\n\r\n files = _(files).chain().forEach(function(obj) {\r\n if (!('src' in obj) || !obj.src) { return; }\r\n // Normalize .src properties to flattened array.\r\n if (Array.isArray(obj.src)) {\r\n obj.src = flatten(obj.src);\r\n } else {\r\n obj.src = [obj.src];\r\n }\r\n }).map(function(obj) {\r\n // Build options object, removing unwanted properties.\r\n var expandOptions = Object.assign({}, obj);\r\n delete expandOptions.src;\r\n delete expandOptions.dest;\r\n\r\n // Expand file mappings.\r\n if (obj.expand) {\r\n return file.expandMapping(obj.src, obj.dest, expandOptions).map(function(mapObj) {\r\n // Copy obj properties to result.\r\n var result = Object.assign({}, obj);\r\n // Make a clone of the orig obj available.\r\n result.orig = Object.assign({}, obj);\r\n // Set .src and .dest, processing both as templates.\r\n result.src = mapObj.src;\r\n result.dest = mapObj.dest;\r\n // Remove unwanted properties.\r\n ['expand', 'cwd', 'flatten', 'rename', 'ext'].forEach(function(prop) {\r\n delete result[prop];\r\n });\r\n return result;\r\n });\r\n }\r\n\r\n // Copy obj properties to result, adding an .orig property.\r\n var result = Object.assign({}, obj);\r\n // Make a clone of the orig obj available.\r\n result.orig = Object.assign({}, obj);\r\n\r\n if ('src' in result) {\r\n // Expose an expand-on-demand getter method as .src.\r\n Object.defineProperty(result, 'src', {\r\n enumerable: true,\r\n get: function fn() {\r\n var src;\r\n if (!('result' in fn)) {\r\n src = obj.src;\r\n // If src is an array, flatten it. Otherwise, make it into an array.\r\n src = Array.isArray(src) ? flatten(src) : [src];\r\n // Expand src files, memoizing result.\r\n fn.result = file.expand(expandOptions, src);\r\n }\r\n return fn.result;\r\n }\r\n });\r\n }\r\n\r\n if ('dest' in result) {\r\n result.dest = obj.dest;\r\n }\r\n\r\n return result;\r\n }).flatten().value();\r\n\r\n return files;\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE1NC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsbUJBQU8sQ0FBQyxFQUFhO0FBQzlCLFdBQVcsbUJBQU8sQ0FBQyxJQUFNO0FBQ3pCO0FBQ0EsY0FBYyxtQkFBTyxDQUFDLElBQWdCO0FBQ3RDLGlCQUFpQixtQkFBTyxDQUFDLElBQW1CO0FBQzVDLFlBQVksbUJBQU8sQ0FBQyxJQUFjO0FBQ2xDLG9CQUFvQixtQkFBTyxDQUFDLElBQXNCO0FBQ2xEO0FBQ0EsV0FBVyxtQkFBTyxDQUFDLElBQU07QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvYXJjaGl2ZXItdXRpbHMvZmlsZS5qcz9kNWVlIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBhcmNoaXZlci11dGlsc1xyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cclxuICogaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1hcmNoaXZlci9ibG9iL21hc3Rlci9MSUNFTlNFLU1JVFxyXG4gKi9cclxudmFyIGZzID0gcmVxdWlyZSgnZ3JhY2VmdWwtZnMnKTtcclxudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XHJcblxyXG52YXIgZmxhdHRlbiA9IHJlcXVpcmUoJ2xvZGFzaC5mbGF0dGVuJyk7XHJcbnZhciBkaWZmZXJlbmNlID0gcmVxdWlyZSgnbG9kYXNoLmRpZmZlcmVuY2UnKTtcclxudmFyIHVuaW9uID0gcmVxdWlyZSgnbG9kYXNoLnVuaW9uJyk7XHJcbnZhciBpc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnbG9kYXNoLmlzcGxhaW5vYmplY3QnKTtcclxuXHJcbnZhciBnbG9iID0gcmVxdWlyZSgnZ2xvYicpO1xyXG5cclxudmFyIGZpbGUgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xyXG5cclxudmFyIHBhdGhTZXBhcmF0b3JSZSA9IC9bXFwvXFxcXF0vZztcclxuXHJcbi8vIFByb2Nlc3Mgc3BlY2lmaWVkIHdpbGRjYXJkIGdsb2IgcGF0dGVybnMgb3IgZmlsZW5hbWVzIGFnYWluc3QgYVxyXG4vLyBjYWxsYmFjaywgZXhjbHVkaW5nIGFuZCB1bmlxdWluZyBmaWxlcyBpbiB0aGUgcmVzdWx0IHNldC5cclxudmFyIHByb2Nlc3NQYXR0ZXJucyA9IGZ1bmN0aW9uKHBhdHRlcm5zLCBmbikge1xyXG4gIC8vIEZpbGVwYXRocyB0byByZXR1cm4uXHJcbiAgdmFyIHJlc3VsdCA9IFtdO1xyXG4gIC8vIEl0ZXJhdGUgb3ZlciBmbGF0dGVuZWQgcGF0dGVybnMgYXJyYXkuXHJcbiAgZmxhdHRlbihwYXR0ZXJucykuZm9yRWFjaChmdW5jdGlvbihwYXR0ZXJuKSB7XHJcbiAgICAvLyBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzICEgaXQgc2hvdWxkIGJlIG9taXR0ZWRcclxuICAgIHZhciBleGNsdXNpb24gPSBwYXR0ZXJuLmluZGV4T2YoJyEnKSA9PT0gMDtcclxuICAgIC8vIElmIHRoZSBwYXR0ZXJuIGlzIGFuIGV4Y2x1c2lvbiwgcmVtb3ZlIHRoZSAhXHJcbiAgICBpZiAoZXhjbHVzaW9uKSB7IHBhdHRlcm4gPSBwYXR0ZXJuLnNsaWNlKDEpOyB9XHJcbiAgICAvLyBGaW5kIGFsbCBtYXRjaGluZyBmaWxlcyBmb3IgdGhpcyBwYXR0ZXJuLlxyXG4gICAgdmFyIG1hdGNoZXMgPSBmbihwYXR0ZXJuKTtcclxuICAgIGlmIChleGNsdXNpb24pIHtcclxuICAgICAgLy8gSWYgYW4gZXhjbHVzaW9uLCByZW1vdmUgbWF0Y2hpbmcgZmlsZXMuXHJcbiAgICAgIHJlc3VsdCA9IGRpZmZlcmVuY2UocmVzdWx0LCBtYXRjaGVzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIE90aGVyd2lzZSBhZGQgbWF0Y2hpbmcgZmlsZXMuXHJcbiAgICAgIHJlc3VsdCA9IHVuaW9uKHJlc3VsdCwgbWF0Y2hlcyk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufTtcclxuXHJcbi8vIFRydWUgaWYgdGhlIGZpbGUgcGF0aCBleGlzdHMuXHJcbmZpbGUuZXhpc3RzID0gZnVuY3Rpb24oKSB7XHJcbiAgdmFyIGZpbGVwYXRoID0gcGF0aC5qb2luLmFwcGx5KHBhdGgsIGFyZ3VtZW50cyk7XHJcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMoZmlsZXBhdGgpO1xyXG59O1xyXG5cclxuLy8gUmV0dXJuIGFuIGFycmF5IG9mIGFsbCBmaWxlIHBhdGhzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHdpbGRjYXJkIHBhdHRlcm5zLlxyXG5maWxlLmV4cGFuZCA9IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAvLyBJZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYW4gb3B0aW9ucyBvYmplY3QsIHNhdmUgdGhvc2Ugb3B0aW9ucyB0byBwYXNzXHJcbiAgLy8gaW50byB0aGUgRmlsZS5wcm90b3R5cGUuZ2xvYi5zeW5jIG1ldGhvZC5cclxuICB2YXIgb3B0aW9ucyA9IGlzUGxhaW5PYmplY3QoYXJnc1swXSkgPyBhcmdzLnNoaWZ0KCkgOiB7fTtcclxuICAvLyBVc2UgdGhlIGZpcnN0IGFyZ3VtZW50IGlmIGl0J3MgYW4gQXJyYXksIG90aGVyd2lzZSBjb252ZXJ0IHRoZSBhcmd1bWVudHNcclxuICAvLyBvYmplY3QgdG8gYW4gYXJyYXkgYW5kIHVzZSB0aGF0LlxyXG4gIHZhciBwYXR0ZXJucyA9IEFycmF5LmlzQXJyYXkoYXJnc1swXSkgPyBhcmdzWzBdIDogYXJncztcclxuICAvLyBSZXR1cm4gZW1wdHkgc2V0IGlmIHRoZXJlIGFyZSBubyBwYXR0ZXJucyBvciBmaWxlcGF0aHMuXHJcbiAgaWYgKHBhdHRlcm5zLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gW107IH1cclxuICAvLyBSZXR1cm4gYWxsIG1hdGNoaW5nIGZpbGVwYXRocy5cclxuICB2YXIgbWF0Y2hlcyA9IHByb2Nlc3NQYXR0ZXJucyhwYXR0ZXJucywgZnVuY3Rpb24ocGF0dGVybikge1xyXG4gICAgLy8gRmluZCBhbGwgbWF0Y2hpbmcgZmlsZXMgZm9yIHRoaXMgcGF0dGVybi5cclxuICAgIHJldHVybiBnbG9iLnN5bmMocGF0dGVybiwgb3B0aW9ucyk7XHJcbiAgfSk7XHJcbiAgLy8gRmlsdGVyIHJlc3VsdCBzZXQ/XHJcbiAgaWYgKG9wdGlvbnMuZmlsdGVyKSB7XHJcbiAgICBtYXRjaGVzID0gbWF0Y2hlcy5maWx0ZXIoZnVuY3Rpb24oZmlsZXBhdGgpIHtcclxuICAgICAgZmlsZXBhdGggPSBwYXRoLmpvaW4ob3B0aW9ucy5jd2QgfHwgJycsIGZpbGVwYXRoKTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICByZXR1cm4gb3B0aW9ucy5maWx0ZXIoZmlsZXBhdGgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBJZiB0aGUgZmlsZSBpcyBvZiB0aGUgcmlnaHQgdHlwZSBhbmQgZXhpc3RzLCB0aGlzIHNob3VsZCB3b3JrLlxyXG4gICAgICAgICAgcmV0dXJuIGZzLnN0YXRTeW5jKGZpbGVwYXRoKVtvcHRpb25zLmZpbHRlcl0oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2goZSkge1xyXG4gICAgICAgIC8vIE90aGVyd2lzZSwgaXQncyBwcm9iYWJseSBub3QgdGhlIHJpZ2h0IHR5cGUuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcmV0dXJuIG1hdGNoZXM7XHJcbn07XHJcblxyXG4vLyBCdWlsZCBhIG11bHRpIHRhc2sgXCJmaWxlc1wiIG9iamVjdCBkeW5hbWljYWxseS5cclxuZmlsZS5leHBhbmRNYXBwaW5nID0gZnVuY3Rpb24ocGF0dGVybnMsIGRlc3RCYXNlLCBvcHRpb25zKSB7XHJcbiAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgcmVuYW1lOiBmdW5jdGlvbihkZXN0QmFzZSwgZGVzdFBhdGgpIHtcclxuICAgICAgcmV0dXJuIHBhdGguam9pbihkZXN0QmFzZSB8fCAnJywgZGVzdFBhdGgpO1xyXG4gICAgfVxyXG4gIH0sIG9wdGlvbnMpO1xyXG4gIHZhciBmaWxlcyA9IFtdO1xyXG4gIHZhciBmaWxlQnlEZXN0ID0ge307XHJcbiAgLy8gRmluZCBhbGwgZmlsZXMgbWF0Y2hpbmcgcGF0dGVybiwgdXNpbmcgcGFzc2VkLWluIG9wdGlvbnMuXHJcbiAgZmlsZS5leHBhbmQob3B0aW9ucywgcGF0dGVybnMpLmZvckVhY2goZnVuY3Rpb24oc3JjKSB7XHJcbiAgICB2YXIgZGVzdFBhdGggPSBzcmM7XHJcbiAgICAvLyBGbGF0dGVuP1xyXG4gICAgaWYgKG9wdGlvbnMuZmxhdHRlbikge1xyXG4gICAgICBkZXN0UGF0aCA9IHBhdGguYmFzZW5hbWUoZGVzdFBhdGgpO1xyXG4gICAgfVxyXG4gICAgLy8gQ2hhbmdlIHRoZSBleHRlbnNpb24/XHJcbiAgICBpZiAob3B0aW9ucy5leHQpIHtcclxuICAgICAgZGVzdFBhdGggPSBkZXN0UGF0aC5yZXBsYWNlKC8oXFwuW15cXC9dKik/JC8sIG9wdGlvbnMuZXh0KTtcclxuICAgIH1cclxuICAgIC8vIEdlbmVyYXRlIGRlc3RpbmF0aW9uIGZpbGVuYW1lLlxyXG4gICAgdmFyIGRlc3QgPSBvcHRpb25zLnJlbmFtZShkZXN0QmFzZSwgZGVzdFBhdGgsIG9wdGlvbnMpO1xyXG4gICAgLy8gUHJlcGVuZCBjd2QgdG8gc3JjIHBhdGggaWYgbmVjZXNzYXJ5LlxyXG4gICAgaWYgKG9wdGlvbnMuY3dkKSB7IHNyYyA9IHBhdGguam9pbihvcHRpb25zLmN3ZCwgc3JjKTsgfVxyXG4gICAgLy8gTm9ybWFsaXplIGZpbGVwYXRocyB0byBiZSB1bml4LXN0eWxlLlxyXG4gICAgZGVzdCA9IGRlc3QucmVwbGFjZShwYXRoU2VwYXJhdG9yUmUsICcvJyk7XHJcbiAgICBzcmMgPSBzcmMucmVwbGFjZShwYXRoU2VwYXJhdG9yUmUsICcvJyk7XHJcbiAgICAvLyBNYXAgY29ycmVjdCBzcmMgcGF0aCB0byBkZXN0IHBhdGguXHJcbiAgICBpZiAoZmlsZUJ5RGVzdFtkZXN0XSkge1xyXG4gICAgICAvLyBJZiBkZXN0IGFscmVhZHkgZXhpc3RzLCBwdXNoIHRoaXMgc3JjIG9udG8gdGhhdCBkZXN0J3Mgc3JjIGFycmF5LlxyXG4gICAgICBmaWxlQnlEZXN0W2Rlc3RdLnNyYy5wdXNoKHNyYyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IHNyYy1kZXN0IGZpbGUgbWFwcGluZyBvYmplY3QuXHJcbiAgICAgIGZpbGVzLnB1c2goe1xyXG4gICAgICAgIHNyYzogW3NyY10sXHJcbiAgICAgICAgZGVzdDogZGVzdCxcclxuICAgICAgfSk7XHJcbiAgICAgIC8vIEFuZCBzdG9yZSBhIHJlZmVyZW5jZSBmb3IgbGF0ZXIgdXNlLlxyXG4gICAgICBmaWxlQnlEZXN0W2Rlc3RdID0gZmlsZXNbZmlsZXMubGVuZ3RoIC0gMV07XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIGZpbGVzO1xyXG59O1xyXG5cclxuLy8gcmV1c2luZyBiaXRzIG9mIGdydW50J3MgbXVsdGktdGFzayBzb3VyY2Ugbm9ybWFsaXphdGlvblxyXG5maWxlLm5vcm1hbGl6ZUZpbGVzQXJyYXkgPSBmdW5jdGlvbihkYXRhKSB7XHJcbiAgdmFyIGZpbGVzID0gW107XHJcblxyXG4gIGRhdGEuZm9yRWFjaChmdW5jdGlvbihvYmopIHtcclxuICAgIHZhciBwcm9wO1xyXG4gICAgaWYgKCdzcmMnIGluIG9iaiB8fCAnZGVzdCcgaW4gb2JqKSB7XHJcbiAgICAgIGZpbGVzLnB1c2gob2JqKTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuXHJcbiAgZmlsZXMgPSBfKGZpbGVzKS5jaGFpbigpLmZvckVhY2goZnVuY3Rpb24ob2JqKSB7XHJcbiAgICBpZiAoISgnc3JjJyBpbiBvYmopIHx8ICFvYmouc3JjKSB7IHJldHVybjsgfVxyXG4gICAgLy8gTm9ybWFsaXplIC5zcmMgcHJvcGVydGllcyB0byBmbGF0dGVuZWQgYXJyYXkuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmouc3JjKSkge1xyXG4gICAgICBvYmouc3JjID0gZmxhdHRlbihvYmouc3JjKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG9iai5zcmMgPSBbb2JqLnNyY107XHJcbiAgICB9XHJcbiAgfSkubWFwKGZ1bmN0aW9uKG9iaikge1xyXG4gICAgLy8gQnVpbGQgb3B0aW9ucyBvYmplY3QsIHJlbW92aW5nIHVud2FudGVkIHByb3BlcnRpZXMuXHJcbiAgICB2YXIgZXhwYW5kT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9iaik7XHJcbiAgICBkZWxldGUgZXhwYW5kT3B0aW9ucy5zcmM7XHJcbiAgICBkZWxldGUgZXhwYW5kT3B0aW9ucy5kZXN0O1xyXG5cclxuICAgIC8vIEV4cGFuZCBmaWxlIG1hcHBpbmdzLlxyXG4gICAgaWYgKG9iai5leHBhbmQpIHtcclxuICAgICAgcmV0dXJuIGZpbGUuZXhwYW5kTWFwcGluZyhvYmouc3JjLCBvYmouZGVzdCwgZXhwYW5kT3B0aW9ucykubWFwKGZ1bmN0aW9uKG1hcE9iaikge1xyXG4gICAgICAgIC8vIENvcHkgb2JqIHByb3BlcnRpZXMgdG8gcmVzdWx0LlxyXG4gICAgICAgIHZhciByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBvYmopO1xyXG4gICAgICAgIC8vIE1ha2UgYSBjbG9uZSBvZiB0aGUgb3JpZyBvYmogYXZhaWxhYmxlLlxyXG4gICAgICAgIHJlc3VsdC5vcmlnID0gT2JqZWN0LmFzc2lnbih7fSwgb2JqKTtcclxuICAgICAgICAvLyBTZXQgLnNyYyBhbmQgLmRlc3QsIHByb2Nlc3NpbmcgYm90aCBhcyB0ZW1wbGF0ZXMuXHJcbiAgICAgICAgcmVzdWx0LnNyYyA9IG1hcE9iai5zcmM7XHJcbiAgICAgICAgcmVzdWx0LmRlc3QgPSBtYXBPYmouZGVzdDtcclxuICAgICAgICAvLyBSZW1vdmUgdW53YW50ZWQgcHJvcGVydGllcy5cclxuICAgICAgICBbJ2V4cGFuZCcsICdjd2QnLCAnZmxhdHRlbicsICdyZW5hbWUnLCAnZXh0J10uZm9yRWFjaChmdW5jdGlvbihwcm9wKSB7XHJcbiAgICAgICAgICBkZWxldGUgcmVzdWx0W3Byb3BdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENvcHkgb2JqIHByb3BlcnRpZXMgdG8gcmVzdWx0LCBhZGRpbmcgYW4gLm9yaWcgcHJvcGVydHkuXHJcbiAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgb2JqKTtcclxuICAgIC8vIE1ha2UgYSBjbG9uZSBvZiB0aGUgb3JpZyBvYmogYXZhaWxhYmxlLlxyXG4gICAgcmVzdWx0Lm9yaWcgPSBPYmplY3QuYXNzaWduKHt9LCBvYmopO1xyXG5cclxuICAgIGlmICgnc3JjJyBpbiByZXN1bHQpIHtcclxuICAgICAgLy8gRXhwb3NlIGFuIGV4cGFuZC1vbi1kZW1hbmQgZ2V0dGVyIG1ldGhvZCBhcyAuc3JjLlxyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdWx0LCAnc3JjJywge1xyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBmbigpIHtcclxuICAgICAgICAgIHZhciBzcmM7XHJcbiAgICAgICAgICBpZiAoISgncmVzdWx0JyBpbiBmbikpIHtcclxuICAgICAgICAgICAgc3JjID0gb2JqLnNyYztcclxuICAgICAgICAgICAgLy8gSWYgc3JjIGlzIGFuIGFycmF5LCBmbGF0dGVuIGl0LiBPdGhlcndpc2UsIG1ha2UgaXQgaW50byBhbiBhcnJheS5cclxuICAgICAgICAgICAgc3JjID0gQXJyYXkuaXNBcnJheShzcmMpID8gZmxhdHRlbihzcmMpIDogW3NyY107XHJcbiAgICAgICAgICAgIC8vIEV4cGFuZCBzcmMgZmlsZXMsIG1lbW9pemluZyByZXN1bHQuXHJcbiAgICAgICAgICAgIGZuLnJlc3VsdCA9IGZpbGUuZXhwYW5kKGV4cGFuZE9wdGlvbnMsIHNyYyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gZm4ucmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCdkZXN0JyBpbiByZXN1bHQpIHtcclxuICAgICAgcmVzdWx0LmRlc3QgPSBvYmouZGVzdDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH0pLmZsYXR0ZW4oKS52YWx1ZSgpO1xyXG5cclxuICByZXR1cm4gZmlsZXM7XHJcbn07XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4154\n")},3672:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\r\n * archiver-utils\r\n *\r\n * Copyright (c) 2015 Chris Talkington.\r\n * Licensed under the MIT license.\r\n * https://github.com/archiverjs/archiver-utils/blob/master/LICENSE\r\n */\r\nvar fs = __webpack_require__(77);\r\nvar path = __webpack_require__(1017);\r\nvar nutil = __webpack_require__(3837);\r\nvar lazystream = __webpack_require__(4150);\r\nvar normalizePath = __webpack_require__(3171);\r\nvar defaults = __webpack_require__(5402);\r\n\r\nvar Stream = (__webpack_require__(2781).Stream);\r\nvar PassThrough = (__webpack_require__(9754).PassThrough);\r\n\r\nvar utils = module.exports = {};\r\nutils.file = __webpack_require__(4154);\r\n\r\nfunction assertPath(path) {\r\n if (typeof path !== 'string') {\r\n throw new TypeError('Path must be a string. Received ' + nutils.inspect(path));\r\n }\r\n}\r\n\r\nutils.collectStream = function(source, callback) {\r\n var collection = [];\r\n var size = 0;\r\n\r\n source.on('error', callback);\r\n\r\n source.on('data', function(chunk) {\r\n collection.push(chunk);\r\n size += chunk.length;\r\n });\r\n\r\n source.on('end', function() {\r\n var buf = new Buffer(size);\r\n var offset = 0;\r\n\r\n collection.forEach(function(data) {\r\n data.copy(buf, offset);\r\n offset += data.length;\r\n });\r\n\r\n callback(null, buf);\r\n });\r\n};\r\n\r\nutils.dateify = function(dateish) {\r\n dateish = dateish || new Date();\r\n\r\n if (dateish instanceof Date) {\r\n dateish = dateish;\r\n } else if (typeof dateish === 'string') {\r\n dateish = new Date(dateish);\r\n } else {\r\n dateish = new Date();\r\n }\r\n\r\n return dateish;\r\n};\r\n\r\n// this is slightly different from lodash version\r\nutils.defaults = function(object, source, guard) {\r\n var args = arguments;\r\n args[0] = args[0] || {};\r\n\r\n return defaults(...args);\r\n};\r\n\r\nutils.isStream = function(source) {\r\n return source instanceof Stream;\r\n};\r\n\r\nutils.lazyReadStream = function(filepath) {\r\n return new lazystream.Readable(function() {\r\n return fs.createReadStream(filepath);\r\n });\r\n};\r\n\r\nutils.normalizeInputSource = function(source) {\r\n if (source === null) {\r\n return new Buffer(0);\r\n } else if (typeof source === 'string') {\r\n return new Buffer(source);\r\n } else if (utils.isStream(source) && !source._readableState) {\r\n var normalized = new PassThrough();\r\n source.pipe(normalized);\r\n\r\n return normalized;\r\n }\r\n\r\n return source;\r\n};\r\n\r\nutils.sanitizePath = function(filepath) {\r\n return normalizePath(filepath, false).replace(/^\\w+:/, '').replace(/^(\\.\\.\\/|\\/)+/, '');\r\n};\r\n\r\nutils.trailingSlashIt = function(str) {\r\n return str.slice(-1) !== '/' ? str + '/' : str;\r\n};\r\n\r\nutils.unixifyPath = function(filepath) {\r\n return normalizePath(filepath, false).replace(/^\\w+:/, '');\r\n};\r\n\r\nutils.walkdir = function(dirpath, base, callback) {\r\n var results = [];\r\n\r\n if (typeof base === 'function') {\r\n callback = base;\r\n base = dirpath;\r\n }\r\n\r\n fs.readdir(dirpath, function(err, list) {\r\n var i = 0;\r\n var file;\r\n var filepath;\r\n\r\n if (err) {\r\n return callback(err);\r\n }\r\n\r\n (function next() {\r\n file = list[i++];\r\n\r\n if (!file) {\r\n return callback(null, results);\r\n }\r\n\r\n filepath = path.join(dirpath, file);\r\n\r\n fs.stat(filepath, function(err, stats) {\r\n results.push({\r\n path: filepath,\r\n relative: path.relative(base, filepath).replace(/\\\\/g, '/'),\r\n stats: stats\r\n });\r\n\r\n if (stats && stats.isDirectory()) {\r\n utils.walkdir(filepath, base, function(err, res) {\r\n res.forEach(function(dirEntry) {\r\n results.push(dirEntry);\r\n });\r\n next();\r\n });\r\n } else {\r\n next();\r\n }\r\n });\r\n })();\r\n });\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY3Mi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsbUJBQU8sQ0FBQyxFQUFhO0FBQzlCLFdBQVcsbUJBQU8sQ0FBQyxJQUFNO0FBQ3pCLFlBQVksbUJBQU8sQ0FBQyxJQUFNO0FBQzFCLGlCQUFpQixtQkFBTyxDQUFDLElBQVk7QUFDckMsb0JBQW9CLG1CQUFPLENBQUMsSUFBZ0I7QUFDNUMsZUFBZSxtQkFBTyxDQUFDLElBQWlCO0FBQ3hDO0FBQ0EsYUFBYSxrQ0FBd0I7QUFDckMsa0JBQWtCLHVDQUFzQztBQUN4RDtBQUNBO0FBQ0EsYUFBYSxtQkFBTyxDQUFDLElBQVc7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxXQUFXO0FBQ1gsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSCIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2FyY2hpdmVyLXV0aWxzL2luZGV4LmpzPzcxMWQiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIGFyY2hpdmVyLXV0aWxzXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxNSBDaHJpcyBUYWxraW5ndG9uLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcmNoaXZlcmpzL2FyY2hpdmVyLXV0aWxzL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcclxuICovXHJcbnZhciBmcyA9IHJlcXVpcmUoJ2dyYWNlZnVsLWZzJyk7XHJcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xyXG52YXIgbnV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XHJcbnZhciBsYXp5c3RyZWFtID0gcmVxdWlyZSgnbGF6eXN0cmVhbScpO1xyXG52YXIgbm9ybWFsaXplUGF0aCA9IHJlcXVpcmUoJ25vcm1hbGl6ZS1wYXRoJyk7XHJcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoJ2xvZGFzaC5kZWZhdWx0cycpO1xyXG5cclxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbTtcclxudmFyIFBhc3NUaHJvdWdoID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtJykuUGFzc1Rocm91Z2g7XHJcblxyXG52YXIgdXRpbHMgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xyXG51dGlscy5maWxlID0gcmVxdWlyZSgnLi9maWxlLmpzJyk7XHJcblxyXG5mdW5jdGlvbiBhc3NlcnRQYXRoKHBhdGgpIHtcclxuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQYXRoIG11c3QgYmUgYSBzdHJpbmcuIFJlY2VpdmVkICcgKyBudXRpbHMuaW5zcGVjdChwYXRoKSk7XHJcbiAgfVxyXG59XHJcblxyXG51dGlscy5jb2xsZWN0U3RyZWFtID0gZnVuY3Rpb24oc291cmNlLCBjYWxsYmFjaykge1xyXG4gIHZhciBjb2xsZWN0aW9uID0gW107XHJcbiAgdmFyIHNpemUgPSAwO1xyXG5cclxuICBzb3VyY2Uub24oJ2Vycm9yJywgY2FsbGJhY2spO1xyXG5cclxuICBzb3VyY2Uub24oJ2RhdGEnLCBmdW5jdGlvbihjaHVuaykge1xyXG4gICAgY29sbGVjdGlvbi5wdXNoKGNodW5rKTtcclxuICAgIHNpemUgKz0gY2h1bmsubGVuZ3RoO1xyXG4gIH0pO1xyXG5cclxuICBzb3VyY2Uub24oJ2VuZCcsIGZ1bmN0aW9uKCkge1xyXG4gICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoc2l6ZSk7XHJcbiAgICB2YXIgb2Zmc2V0ID0gMDtcclxuXHJcbiAgICBjb2xsZWN0aW9uLmZvckVhY2goZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgICBkYXRhLmNvcHkoYnVmLCBvZmZzZXQpO1xyXG4gICAgICBvZmZzZXQgKz0gZGF0YS5sZW5ndGg7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjYWxsYmFjayhudWxsLCBidWYpO1xyXG4gIH0pO1xyXG59O1xyXG5cclxudXRpbHMuZGF0ZWlmeSA9IGZ1bmN0aW9uKGRhdGVpc2gpIHtcclxuICBkYXRlaXNoID0gZGF0ZWlzaCB8fCBuZXcgRGF0ZSgpO1xyXG5cclxuICBpZiAoZGF0ZWlzaCBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgIGRhdGVpc2ggPSBkYXRlaXNoO1xyXG4gIH0gZWxzZSBpZiAodHlwZW9mIGRhdGVpc2ggPT09ICdzdHJpbmcnKSB7XHJcbiAgICBkYXRlaXNoID0gbmV3IERhdGUoZGF0ZWlzaCk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGRhdGVpc2ggPSBuZXcgRGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGRhdGVpc2g7XHJcbn07XHJcblxyXG4vLyB0aGlzIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIGxvZGFzaCB2ZXJzaW9uXHJcbnV0aWxzLmRlZmF1bHRzID0gZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIGd1YXJkKSB7XHJcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XHJcbiAgYXJnc1swXSA9IGFyZ3NbMF0gfHwge307XHJcblxyXG4gIHJldHVybiBkZWZhdWx0cyguLi5hcmdzKTtcclxufTtcclxuXHJcbnV0aWxzLmlzU3RyZWFtID0gZnVuY3Rpb24oc291cmNlKSB7XHJcbiAgcmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIFN0cmVhbTtcclxufTtcclxuXHJcbnV0aWxzLmxhenlSZWFkU3RyZWFtID0gZnVuY3Rpb24oZmlsZXBhdGgpIHtcclxuICByZXR1cm4gbmV3IGxhenlzdHJlYW0uUmVhZGFibGUoZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlcGF0aCk7XHJcbiAgfSk7XHJcbn07XHJcblxyXG51dGlscy5ub3JtYWxpemVJbnB1dFNvdXJjZSA9IGZ1bmN0aW9uKHNvdXJjZSkge1xyXG4gIGlmIChzb3VyY2UgPT09IG51bGwpIHtcclxuICAgIHJldHVybiBuZXcgQnVmZmVyKDApO1xyXG4gIH0gZWxzZSBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycpIHtcclxuICAgIHJldHVybiBuZXcgQnVmZmVyKHNvdXJjZSk7XHJcbiAgfSBlbHNlIGlmICh1dGlscy5pc1N0cmVhbShzb3VyY2UpICYmICFzb3VyY2UuX3JlYWRhYmxlU3RhdGUpIHtcclxuICAgIHZhciBub3JtYWxpemVkID0gbmV3IFBhc3NUaHJvdWdoKCk7XHJcbiAgICBzb3VyY2UucGlwZShub3JtYWxpemVkKTtcclxuXHJcbiAgICByZXR1cm4gbm9ybWFsaXplZDtcclxuICB9XHJcblxyXG4gIHJldHVybiBzb3VyY2U7XHJcbn07XHJcblxyXG51dGlscy5zYW5pdGl6ZVBhdGggPSBmdW5jdGlvbihmaWxlcGF0aCkge1xyXG4gIHJldHVybiBub3JtYWxpemVQYXRoKGZpbGVwYXRoLCBmYWxzZSkucmVwbGFjZSgvXlxcdys6LywgJycpLnJlcGxhY2UoL14oXFwuXFwuXFwvfFxcLykrLywgJycpO1xyXG59O1xyXG5cclxudXRpbHMudHJhaWxpbmdTbGFzaEl0ID0gZnVuY3Rpb24oc3RyKSB7XHJcbiAgcmV0dXJuIHN0ci5zbGljZSgtMSkgIT09ICcvJyA/IHN0ciArICcvJyA6IHN0cjtcclxufTtcclxuXHJcbnV0aWxzLnVuaXhpZnlQYXRoID0gZnVuY3Rpb24oZmlsZXBhdGgpIHtcclxuICByZXR1cm4gbm9ybWFsaXplUGF0aChmaWxlcGF0aCwgZmFsc2UpLnJlcGxhY2UoL15cXHcrOi8sICcnKTtcclxufTtcclxuXHJcbnV0aWxzLndhbGtkaXIgPSBmdW5jdGlvbihkaXJwYXRoLCBiYXNlLCBjYWxsYmFjaykge1xyXG4gIHZhciByZXN1bHRzID0gW107XHJcblxyXG4gIGlmICh0eXBlb2YgYmFzZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgY2FsbGJhY2sgPSBiYXNlO1xyXG4gICAgYmFzZSA9IGRpcnBhdGg7XHJcbiAgfVxyXG5cclxuICBmcy5yZWFkZGlyKGRpcnBhdGgsIGZ1bmN0aW9uKGVyciwgbGlzdCkge1xyXG4gICAgdmFyIGkgPSAwO1xyXG4gICAgdmFyIGZpbGU7XHJcbiAgICB2YXIgZmlsZXBhdGg7XHJcblxyXG4gICAgaWYgKGVycikge1xyXG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcclxuICAgIH1cclxuXHJcbiAgICAoZnVuY3Rpb24gbmV4dCgpIHtcclxuICAgICAgZmlsZSA9IGxpc3RbaSsrXTtcclxuXHJcbiAgICAgIGlmICghZmlsZSkge1xyXG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCByZXN1bHRzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZmlsZXBhdGggPSBwYXRoLmpvaW4oZGlycGF0aCwgZmlsZSk7XHJcblxyXG4gICAgICBmcy5zdGF0KGZpbGVwYXRoLCBmdW5jdGlvbihlcnIsIHN0YXRzKSB7XHJcbiAgICAgICAgcmVzdWx0cy5wdXNoKHtcclxuICAgICAgICAgIHBhdGg6IGZpbGVwYXRoLFxyXG4gICAgICAgICAgcmVsYXRpdmU6IHBhdGgucmVsYXRpdmUoYmFzZSwgZmlsZXBhdGgpLnJlcGxhY2UoL1xcXFwvZywgJy8nKSxcclxuICAgICAgICAgIHN0YXRzOiBzdGF0c1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoc3RhdHMgJiYgc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xyXG4gICAgICAgICAgdXRpbHMud2Fsa2RpcihmaWxlcGF0aCwgYmFzZSwgZnVuY3Rpb24oZXJyLCByZXMpIHtcclxuICAgICAgICAgICAgcmVzLmZvckVhY2goZnVuY3Rpb24oZGlyRW50cnkpIHtcclxuICAgICAgICAgICAgICByZXN1bHRzLnB1c2goZGlyRW50cnkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgbmV4dCgpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5leHQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSkoKTtcclxuICB9KTtcclxufTtcclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3672\n")},882:module=>{eval("var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n return toString.call(arr) == '[object Array]';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODgyLmpzIiwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvYXJjaGl2ZXItdXRpbHMvbm9kZV9tb2R1bGVzL2lzYXJyYXkvaW5kZXguanM/MDlmNSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///882\n")},6106:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a duplex stream is just a stream that is both readable and writable.\n// Since JS doesn't have multiple prototypal inheritance, this class\n// prototypally inherits from Readable, and then parasitically from\n// Writable.\n\n\n\n/**/\n\nvar pna = __webpack_require__(8212);\n/**/\n\n/**/\nvar objectKeys = Object.keys || function (obj) {\n var keys = [];\n for (var key in obj) {\n keys.push(key);\n }return keys;\n};\n/**/\n\nmodule.exports = Duplex;\n\n/**/\nvar util = Object.create(__webpack_require__(6497));\nutil.inherits = __webpack_require__(4378);\n/**/\n\nvar Readable = __webpack_require__(7190);\nvar Writable = __webpack_require__(8223);\n\nutil.inherits(Duplex, Readable);\n\n{\n // avoid scope creep, the keys array can then be collected\n var keys = objectKeys(Writable.prototype);\n for (var v = 0; v < keys.length; v++) {\n var method = keys[v];\n if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];\n }\n}\n\nfunction Duplex(options) {\n if (!(this instanceof Duplex)) return new Duplex(options);\n\n Readable.call(this, options);\n Writable.call(this, options);\n\n if (options && options.readable === false) this.readable = false;\n\n if (options && options.writable === false) this.writable = false;\n\n this.allowHalfOpen = true;\n if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;\n\n this.once('end', onend);\n}\n\nObject.defineProperty(Duplex.prototype, 'writableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function () {\n return this._writableState.highWaterMark;\n }\n});\n\n// the no-half-open enforcer\nfunction onend() {\n // if we allow half-open state, or if the writable side ended,\n // then we're ok.\n if (this.allowHalfOpen || this._writableState.ended) return;\n\n // no more data can be written.\n // But allow more writes to happen in this tick.\n pna.nextTick(onEndNT, this);\n}\n\nfunction onEndNT(self) {\n self.end();\n}\n\nObject.defineProperty(Duplex.prototype, 'destroyed', {\n get: function () {\n if (this._readableState === undefined || this._writableState === undefined) {\n return false;\n }\n return this._readableState.destroyed && this._writableState.destroyed;\n },\n set: function (value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (this._readableState === undefined || this._writableState === undefined) {\n return;\n }\n\n // backward compatibility, the user is explicitly\n // managing destroyed\n this._readableState.destroyed = value;\n this._writableState.destroyed = value;\n }\n});\n\nDuplex.prototype._destroy = function (err, cb) {\n this.push(null);\n this.end();\n\n pna.nextTick(cb, err);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjEwNi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViOztBQUVBLFVBQVUsbUJBQU8sQ0FBQyxJQUFzQjtBQUN4Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSx5QkFBeUIsbUJBQU8sQ0FBQyxJQUFjO0FBQy9DLGdCQUFnQixtQkFBTyxDQUFDLElBQVU7QUFDbEM7O0FBRUEsZUFBZSxtQkFBTyxDQUFDLElBQW9CO0FBQzNDLGVBQWUsbUJBQU8sQ0FBQyxJQUFvQjs7QUFFM0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9hcmNoaXZlci11dGlscy9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX2R1cGxleC5qcz8zNGMwIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIGR1cGxleCBzdHJlYW0gaXMganVzdCBhIHN0cmVhbSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLlxuLy8gU2luY2UgSlMgZG9lc24ndCBoYXZlIG11bHRpcGxlIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UsIHRoaXMgY2xhc3Ncbi8vIHByb3RvdHlwYWxseSBpbmhlcml0cyBmcm9tIFJlYWRhYmxlLCBhbmQgdGhlbiBwYXJhc2l0aWNhbGx5IGZyb21cbi8vIFdyaXRhYmxlLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBwbmEgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGtleXMucHVzaChrZXkpO1xuICB9cmV0dXJuIGtleXM7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gRHVwbGV4O1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSBPYmplY3QuY3JlYXRlKHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBSZWFkYWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV9yZWFkYWJsZScpO1xudmFyIFdyaXRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3dyaXRhYmxlJyk7XG5cbnV0aWwuaW5oZXJpdHMoRHVwbGV4LCBSZWFkYWJsZSk7XG5cbntcbiAgLy8gYXZvaWQgc2NvcGUgY3JlZXAsIHRoZSBrZXlzIGFycmF5IGNhbiB0aGVuIGJlIGNvbGxlY3RlZFxuICB2YXIga2V5cyA9IG9iamVjdEtleXMoV3JpdGFibGUucHJvdG90eXBlKTtcbiAgZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzLmxlbmd0aDsgdisrKSB7XG4gICAgdmFyIG1ldGhvZCA9IGtleXNbdl07XG4gICAgaWYgKCFEdXBsZXgucHJvdG90eXBlW21ldGhvZF0pIER1cGxleC5wcm90b3R5cGVbbWV0aG9kXSA9IFdyaXRhYmxlLnByb3RvdHlwZVttZXRob2RdO1xuICB9XG59XG5cbmZ1bmN0aW9uIER1cGxleChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKSByZXR1cm4gbmV3IER1cGxleChvcHRpb25zKTtcblxuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmVhZGFibGUgPT09IGZhbHNlKSB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy53cml0YWJsZSA9PT0gZmFsc2UpIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcblxuICB0aGlzLmFsbG93SGFsZk9wZW4gPSB0cnVlO1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmFsbG93SGFsZk9wZW4gPT09IGZhbHNlKSB0aGlzLmFsbG93SGFsZk9wZW4gPSBmYWxzZTtcblxuICB0aGlzLm9uY2UoJ2VuZCcsIG9uZW5kKTtcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuXG4vLyB0aGUgbm8taGFsZi1vcGVuIGVuZm9yY2VyXG5mdW5jdGlvbiBvbmVuZCgpIHtcbiAgLy8gaWYgd2UgYWxsb3cgaGFsZi1vcGVuIHN0YXRlLCBvciBpZiB0aGUgd3JpdGFibGUgc2lkZSBlbmRlZCxcbiAgLy8gdGhlbiB3ZSdyZSBvay5cbiAgaWYgKHRoaXMuYWxsb3dIYWxmT3BlbiB8fCB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm47XG5cbiAgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cbiAgcG5hLm5leHRUaWNrKG9uRW5kTlQsIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBvbkVuZE5UKHNlbGYpIHtcbiAgc2VsZi5lbmQoKTtcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAvLyB3ZSBpZ25vcmUgdGhlIHZhbHVlIGlmIHRoZSBzdHJlYW1cbiAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICB9XG59KTtcblxuRHVwbGV4LnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIHRoaXMucHVzaChudWxsKTtcbiAgdGhpcy5lbmQoKTtcblxuICBwbmEubmV4dFRpY2soY2IsIGVycik7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6106\n")},7592:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval('// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// "Software"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a passthrough stream.\n// basically just the most minimal sort of Transform stream.\n// Every written chunk gets output as-is.\n\n\n\nmodule.exports = PassThrough;\n\nvar Transform = __webpack_require__(1289);\n\n/**/\nvar util = Object.create(__webpack_require__(6497));\nutil.inherits = __webpack_require__(4378);\n/**/\n\nutil.inherits(PassThrough, Transform);\n\nfunction PassThrough(options) {\n if (!(this instanceof PassThrough)) return new PassThrough(options);\n\n Transform.call(this, options);\n}\n\nPassThrough.prototype._transform = function (chunk, encoding, cb) {\n cb(null, chunk);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzU5Mi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYjs7QUFFQSxnQkFBZ0IsbUJBQU8sQ0FBQyxJQUFxQjs7QUFFN0M7QUFDQSx5QkFBeUIsbUJBQU8sQ0FBQyxJQUFjO0FBQy9DLGdCQUFnQixtQkFBTyxDQUFDLElBQVU7QUFDbEM7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2FyY2hpdmVyLXV0aWxzL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanM/ZGRmYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSBwYXNzdGhyb3VnaCBzdHJlYW0uXG4vLyBiYXNpY2FsbHkganVzdCB0aGUgbW9zdCBtaW5pbWFsIHNvcnQgb2YgVHJhbnNmb3JtIHN0cmVhbS5cbi8vIEV2ZXJ5IHdyaXR0ZW4gY2h1bmsgZ2V0cyBvdXRwdXQgYXMtaXMuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYXNzVGhyb3VnaDtcblxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vX3N0cmVhbV90cmFuc2Zvcm0nKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gT2JqZWN0LmNyZWF0ZShyZXF1aXJlKCdjb3JlLXV0aWwtaXMnKSk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pO1xuXG5mdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpIHJldHVybiBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucyk7XG5cbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cblBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7592\n')},7190:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\n/**/\n\nvar pna = __webpack_require__(8212);\n/**/\n\nmodule.exports = Readable;\n\n/**/\nvar isArray = __webpack_require__(882);\n/**/\n\n/**/\nvar Duplex;\n/**/\n\nReadable.ReadableState = ReadableState;\n\n/**/\nvar EE = (__webpack_require__(2361).EventEmitter);\n\nvar EElistenerCount = function (emitter, type) {\n return emitter.listeners(type).length;\n};\n/**/\n\n/**/\nvar Stream = __webpack_require__(1581);\n/**/\n\n/**/\n\nvar Buffer = (__webpack_require__(1466).Buffer);\nvar OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};\nfunction _uint8ArrayToBuffer(chunk) {\n return Buffer.from(chunk);\n}\nfunction _isUint8Array(obj) {\n return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n\n/**/\n\n/**/\nvar util = Object.create(__webpack_require__(6497));\nutil.inherits = __webpack_require__(4378);\n/**/\n\n/**/\nvar debugUtil = __webpack_require__(3837);\nvar debug = void 0;\nif (debugUtil && debugUtil.debuglog) {\n debug = debugUtil.debuglog('stream');\n} else {\n debug = function () {};\n}\n/**/\n\nvar BufferList = __webpack_require__(5553);\nvar destroyImpl = __webpack_require__(1280);\nvar StringDecoder;\n\nutil.inherits(Readable, Stream);\n\nvar kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];\n\nfunction prependListener(emitter, event, fn) {\n // Sadly this is not cacheable as some libraries bundle their own\n // event emitter implementation with them.\n if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);\n\n // This is a hack to make sure that our error handler is attached before any\n // userland ones. NEVER DO THIS. This is here only because this code needs\n // to continue to work with older versions of Node.js that do not include\n // the prependListener() method. The goal is to eventually remove this hack.\n if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];\n}\n\nfunction ReadableState(options, stream) {\n Duplex = Duplex || __webpack_require__(6106);\n\n options = options || {};\n\n // Duplex streams are both readable and writable, but share\n // the same options object.\n // However, some cases require setting options to different\n // values for the readable and the writable sides of the duplex stream.\n // These options can be provided separately as readableXXX and writableXXX.\n var isDuplex = stream instanceof Duplex;\n\n // object stream flag. Used to make read(n) ignore n and to\n // make all the buffer merging and length checks go away\n this.objectMode = !!options.objectMode;\n\n if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;\n\n // the point at which it stops calling _read() to fill the buffer\n // Note: 0 is a valid value, means \"don't call _read preemptively ever\"\n var hwm = options.highWaterMark;\n var readableHwm = options.readableHighWaterMark;\n var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n\n if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;\n\n // cast to ints.\n this.highWaterMark = Math.floor(this.highWaterMark);\n\n // A linked list is used to store data chunks instead of an array because the\n // linked list can remove elements from the beginning faster than\n // array.shift()\n this.buffer = new BufferList();\n this.length = 0;\n this.pipes = null;\n this.pipesCount = 0;\n this.flowing = null;\n this.ended = false;\n this.endEmitted = false;\n this.reading = false;\n\n // a flag to be able to tell if the event 'readable'/'data' is emitted\n // immediately, or on a later tick. We set this to true at first, because\n // any actions that shouldn't happen until \"later\" should generally also\n // not happen before the first read call.\n this.sync = true;\n\n // whenever we return null, then we set a flag to say\n // that we're awaiting a 'readable' event emission.\n this.needReadable = false;\n this.emittedReadable = false;\n this.readableListening = false;\n this.resumeScheduled = false;\n\n // has it been destroyed\n this.destroyed = false;\n\n // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n // the number of writers that are awaiting a drain event in .pipe()s\n this.awaitDrain = 0;\n\n // if true, a maybeReadMore has been scheduled\n this.readingMore = false;\n\n this.decoder = null;\n this.encoding = null;\n if (options.encoding) {\n if (!StringDecoder) StringDecoder = (__webpack_require__(1198)/* .StringDecoder */ .s);\n this.decoder = new StringDecoder(options.encoding);\n this.encoding = options.encoding;\n }\n}\n\nfunction Readable(options) {\n Duplex = Duplex || __webpack_require__(6106);\n\n if (!(this instanceof Readable)) return new Readable(options);\n\n this._readableState = new ReadableState(options, this);\n\n // legacy\n this.readable = true;\n\n if (options) {\n if (typeof options.read === 'function') this._read = options.read;\n\n if (typeof options.destroy === 'function') this._destroy = options.destroy;\n }\n\n Stream.call(this);\n}\n\nObject.defineProperty(Readable.prototype, 'destroyed', {\n get: function () {\n if (this._readableState === undefined) {\n return false;\n }\n return this._readableState.destroyed;\n },\n set: function (value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (!this._readableState) {\n return;\n }\n\n // backward compatibility, the user is explicitly\n // managing destroyed\n this._readableState.destroyed = value;\n }\n});\n\nReadable.prototype.destroy = destroyImpl.destroy;\nReadable.prototype._undestroy = destroyImpl.undestroy;\nReadable.prototype._destroy = function (err, cb) {\n this.push(null);\n cb(err);\n};\n\n// Manually shove something into the read() buffer.\n// This returns true if the highWaterMark has not been hit yet,\n// similar to how Writable.write() returns true if you should\n// write() some more.\nReadable.prototype.push = function (chunk, encoding) {\n var state = this._readableState;\n var skipChunkCheck;\n\n if (!state.objectMode) {\n if (typeof chunk === 'string') {\n encoding = encoding || state.defaultEncoding;\n if (encoding !== state.encoding) {\n chunk = Buffer.from(chunk, encoding);\n encoding = '';\n }\n skipChunkCheck = true;\n }\n } else {\n skipChunkCheck = true;\n }\n\n return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);\n};\n\n// Unshift should *always* be something directly out of read()\nReadable.prototype.unshift = function (chunk) {\n return readableAddChunk(this, chunk, null, true, false);\n};\n\nfunction readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {\n var state = stream._readableState;\n if (chunk === null) {\n state.reading = false;\n onEofChunk(stream, state);\n } else {\n var er;\n if (!skipChunkCheck) er = chunkInvalid(state, chunk);\n if (er) {\n stream.emit('error', er);\n } else if (state.objectMode || chunk && chunk.length > 0) {\n if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {\n chunk = _uint8ArrayToBuffer(chunk);\n }\n\n if (addToFront) {\n if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);\n } else if (state.ended) {\n stream.emit('error', new Error('stream.push() after EOF'));\n } else {\n state.reading = false;\n if (state.decoder && !encoding) {\n chunk = state.decoder.write(chunk);\n if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);\n } else {\n addChunk(stream, state, chunk, false);\n }\n }\n } else if (!addToFront) {\n state.reading = false;\n }\n }\n\n return needMoreData(state);\n}\n\nfunction addChunk(stream, state, chunk, addToFront) {\n if (state.flowing && state.length === 0 && !state.sync) {\n stream.emit('data', chunk);\n stream.read(0);\n } else {\n // update the buffer info.\n state.length += state.objectMode ? 1 : chunk.length;\n if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);\n\n if (state.needReadable) emitReadable(stream);\n }\n maybeReadMore(stream, state);\n}\n\nfunction chunkInvalid(state, chunk) {\n var er;\n if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n er = new TypeError('Invalid non-string/buffer chunk');\n }\n return er;\n}\n\n// if it's past the high water mark, we can push in some more.\n// Also, if we have no data yet, we can stand some\n// more bytes. This is to work around cases where hwm=0,\n// such as the repl. Also, if the push() triggered a\n// readable event, and the user called read(largeNumber) such that\n// needReadable was set, then we ought to push more, so that another\n// 'readable' event will be triggered.\nfunction needMoreData(state) {\n return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);\n}\n\nReadable.prototype.isPaused = function () {\n return this._readableState.flowing === false;\n};\n\n// backwards compatibility.\nReadable.prototype.setEncoding = function (enc) {\n if (!StringDecoder) StringDecoder = (__webpack_require__(1198)/* .StringDecoder */ .s);\n this._readableState.decoder = new StringDecoder(enc);\n this._readableState.encoding = enc;\n return this;\n};\n\n// Don't raise the hwm > 8MB\nvar MAX_HWM = 0x800000;\nfunction computeNewHighWaterMark(n) {\n if (n >= MAX_HWM) {\n n = MAX_HWM;\n } else {\n // Get the next highest power of 2 to prevent increasing hwm excessively in\n // tiny amounts\n n--;\n n |= n >>> 1;\n n |= n >>> 2;\n n |= n >>> 4;\n n |= n >>> 8;\n n |= n >>> 16;\n n++;\n }\n return n;\n}\n\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction howMuchToRead(n, state) {\n if (n <= 0 || state.length === 0 && state.ended) return 0;\n if (state.objectMode) return 1;\n if (n !== n) {\n // Only flow one buffer at a time\n if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;\n }\n // If we're asking for more than the current hwm, then raise the hwm.\n if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);\n if (n <= state.length) return n;\n // Don't have enough\n if (!state.ended) {\n state.needReadable = true;\n return 0;\n }\n return state.length;\n}\n\n// you can override either this method, or the async _read(n) below.\nReadable.prototype.read = function (n) {\n debug('read', n);\n n = parseInt(n, 10);\n var state = this._readableState;\n var nOrig = n;\n\n if (n !== 0) state.emittedReadable = false;\n\n // if we're doing read(0) to trigger a readable event, but we\n // already have a bunch of data in the buffer, then just trigger\n // the 'readable' event and move on.\n if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {\n debug('read: emitReadable', state.length, state.ended);\n if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);\n return null;\n }\n\n n = howMuchToRead(n, state);\n\n // if we've ended, and we're now clear, then finish it up.\n if (n === 0 && state.ended) {\n if (state.length === 0) endReadable(this);\n return null;\n }\n\n // All the actual chunk generation logic needs to be\n // *below* the call to _read. The reason is that in certain\n // synthetic stream cases, such as passthrough streams, _read\n // may be a completely synchronous operation which may change\n // the state of the read buffer, providing enough data when\n // before there was *not* enough.\n //\n // So, the steps are:\n // 1. Figure out what the state of things will be after we do\n // a read from the buffer.\n //\n // 2. If that resulting state will trigger a _read, then call _read.\n // Note that this may be asynchronous, or synchronous. Yes, it is\n // deeply ugly to write APIs this way, but that still doesn't mean\n // that the Readable class should behave improperly, as streams are\n // designed to be sync/async agnostic.\n // Take note if the _read call is sync or async (ie, if the read call\n // has returned yet), so that we know whether or not it's safe to emit\n // 'readable' etc.\n //\n // 3. Actually pull the requested chunks out of the buffer and return.\n\n // if we need a readable event, then we need to do some reading.\n var doRead = state.needReadable;\n debug('need readable', doRead);\n\n // if we currently have less than the highWaterMark, then also read some\n if (state.length === 0 || state.length - n < state.highWaterMark) {\n doRead = true;\n debug('length less than watermark', doRead);\n }\n\n // however, if we've ended, then there's no point, and if we're already\n // reading, then it's unnecessary.\n if (state.ended || state.reading) {\n doRead = false;\n debug('reading or ended', doRead);\n } else if (doRead) {\n debug('do read');\n state.reading = true;\n state.sync = true;\n // if the length is currently zero, then we *need* a readable event.\n if (state.length === 0) state.needReadable = true;\n // call internal read method\n this._read(state.highWaterMark);\n state.sync = false;\n // If _read pushed data synchronously, then `reading` will be false,\n // and we need to re-evaluate how much data we can return to the user.\n if (!state.reading) n = howMuchToRead(nOrig, state);\n }\n\n var ret;\n if (n > 0) ret = fromList(n, state);else ret = null;\n\n if (ret === null) {\n state.needReadable = true;\n n = 0;\n } else {\n state.length -= n;\n }\n\n if (state.length === 0) {\n // If we have nothing in the buffer, then we want to know\n // as soon as we *do* get something into the buffer.\n if (!state.ended) state.needReadable = true;\n\n // If we tried to read() past the EOF, then emit end on the next tick.\n if (nOrig !== n && state.ended) endReadable(this);\n }\n\n if (ret !== null) this.emit('data', ret);\n\n return ret;\n};\n\nfunction onEofChunk(stream, state) {\n if (state.ended) return;\n if (state.decoder) {\n var chunk = state.decoder.end();\n if (chunk && chunk.length) {\n state.buffer.push(chunk);\n state.length += state.objectMode ? 1 : chunk.length;\n }\n }\n state.ended = true;\n\n // emit 'readable' now to make sure it gets picked up.\n emitReadable(stream);\n}\n\n// Don't emit readable right away in sync mode, because this can trigger\n// another read() call => stack overflow. This way, it might trigger\n// a nextTick recursion warning, but that's not so bad.\nfunction emitReadable(stream) {\n var state = stream._readableState;\n state.needReadable = false;\n if (!state.emittedReadable) {\n debug('emitReadable', state.flowing);\n state.emittedReadable = true;\n if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream);\n }\n}\n\nfunction emitReadable_(stream) {\n debug('emit readable');\n stream.emit('readable');\n flow(stream);\n}\n\n// at this point, the user has presumably seen the 'readable' event,\n// and called read() to consume some data. that may have triggered\n// in turn another _read(n) call, in which case reading = true if\n// it's in progress.\n// However, if we're not ended, or reading, and the length < hwm,\n// then go ahead and try to read some more preemptively.\nfunction maybeReadMore(stream, state) {\n if (!state.readingMore) {\n state.readingMore = true;\n pna.nextTick(maybeReadMore_, stream, state);\n }\n}\n\nfunction maybeReadMore_(stream, state) {\n var len = state.length;\n while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {\n debug('maybeReadMore read 0');\n stream.read(0);\n if (len === state.length)\n // didn't get any data, stop spinning.\n break;else len = state.length;\n }\n state.readingMore = false;\n}\n\n// abstract method. to be overridden in specific implementation classes.\n// call cb(er, data) where data is <= n in length.\n// for virtual (non-string, non-buffer) streams, \"length\" is somewhat\n// arbitrary, and perhaps not very meaningful.\nReadable.prototype._read = function (n) {\n this.emit('error', new Error('_read() is not implemented'));\n};\n\nReadable.prototype.pipe = function (dest, pipeOpts) {\n var src = this;\n var state = this._readableState;\n\n switch (state.pipesCount) {\n case 0:\n state.pipes = dest;\n break;\n case 1:\n state.pipes = [state.pipes, dest];\n break;\n default:\n state.pipes.push(dest);\n break;\n }\n state.pipesCount += 1;\n debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);\n\n var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;\n\n var endFn = doEnd ? onend : unpipe;\n if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn);\n\n dest.on('unpipe', onunpipe);\n function onunpipe(readable, unpipeInfo) {\n debug('onunpipe');\n if (readable === src) {\n if (unpipeInfo && unpipeInfo.hasUnpiped === false) {\n unpipeInfo.hasUnpiped = true;\n cleanup();\n }\n }\n }\n\n function onend() {\n debug('onend');\n dest.end();\n }\n\n // when the dest drains, it reduces the awaitDrain counter\n // on the source. This would be more elegant with a .once()\n // handler in flow(), but adding and removing repeatedly is\n // too slow.\n var ondrain = pipeOnDrain(src);\n dest.on('drain', ondrain);\n\n var cleanedUp = false;\n function cleanup() {\n debug('cleanup');\n // cleanup event handlers once the pipe is broken\n dest.removeListener('close', onclose);\n dest.removeListener('finish', onfinish);\n dest.removeListener('drain', ondrain);\n dest.removeListener('error', onerror);\n dest.removeListener('unpipe', onunpipe);\n src.removeListener('end', onend);\n src.removeListener('end', unpipe);\n src.removeListener('data', ondata);\n\n cleanedUp = true;\n\n // if the reader is waiting for a drain event from this\n // specific writer, then it would cause it to never start\n // flowing again.\n // So, if this is awaiting a drain, then we just call it now.\n // If we don't know, then assume that we are waiting for one.\n if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();\n }\n\n // If the user pushes more data while we're writing to dest then we'll end up\n // in ondata again. However, we only want to increase awaitDrain once because\n // dest will only emit one 'drain' event for the multiple writes.\n // => Introduce a guard on increasing awaitDrain.\n var increasedAwaitDrain = false;\n src.on('data', ondata);\n function ondata(chunk) {\n debug('ondata');\n increasedAwaitDrain = false;\n var ret = dest.write(chunk);\n if (false === ret && !increasedAwaitDrain) {\n // If the user unpiped during `dest.write()`, it is possible\n // to get stuck in a permanently paused state if that write\n // also returned false.\n // => Check whether `dest` is still a piping destination.\n if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {\n debug('false write response, pause', state.awaitDrain);\n state.awaitDrain++;\n increasedAwaitDrain = true;\n }\n src.pause();\n }\n }\n\n // if the dest has an error, then stop piping into it.\n // however, don't suppress the throwing behavior for this.\n function onerror(er) {\n debug('onerror', er);\n unpipe();\n dest.removeListener('error', onerror);\n if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);\n }\n\n // Make sure our error handler is attached before userland ones.\n prependListener(dest, 'error', onerror);\n\n // Both close and finish should trigger unpipe, but only once.\n function onclose() {\n dest.removeListener('finish', onfinish);\n unpipe();\n }\n dest.once('close', onclose);\n function onfinish() {\n debug('onfinish');\n dest.removeListener('close', onclose);\n unpipe();\n }\n dest.once('finish', onfinish);\n\n function unpipe() {\n debug('unpipe');\n src.unpipe(dest);\n }\n\n // tell the dest that it's being piped to\n dest.emit('pipe', src);\n\n // start the flow if it hasn't been started already.\n if (!state.flowing) {\n debug('pipe resume');\n src.resume();\n }\n\n return dest;\n};\n\nfunction pipeOnDrain(src) {\n return function () {\n var state = src._readableState;\n debug('pipeOnDrain', state.awaitDrain);\n if (state.awaitDrain) state.awaitDrain--;\n if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {\n state.flowing = true;\n flow(src);\n }\n };\n}\n\nReadable.prototype.unpipe = function (dest) {\n var state = this._readableState;\n var unpipeInfo = { hasUnpiped: false };\n\n // if we're not piping anywhere, then do nothing.\n if (state.pipesCount === 0) return this;\n\n // just one destination. most common case.\n if (state.pipesCount === 1) {\n // passed in one, but it's not the right one.\n if (dest && dest !== state.pipes) return this;\n\n if (!dest) dest = state.pipes;\n\n // got a match.\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n if (dest) dest.emit('unpipe', this, unpipeInfo);\n return this;\n }\n\n // slow case. multiple pipe destinations.\n\n if (!dest) {\n // remove all.\n var dests = state.pipes;\n var len = state.pipesCount;\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n\n for (var i = 0; i < len; i++) {\n dests[i].emit('unpipe', this, { hasUnpiped: false });\n }return this;\n }\n\n // try to find the right one.\n var index = indexOf(state.pipes, dest);\n if (index === -1) return this;\n\n state.pipes.splice(index, 1);\n state.pipesCount -= 1;\n if (state.pipesCount === 1) state.pipes = state.pipes[0];\n\n dest.emit('unpipe', this, unpipeInfo);\n\n return this;\n};\n\n// set up data events if they are asked for\n// Ensure readable listeners eventually get something\nReadable.prototype.on = function (ev, fn) {\n var res = Stream.prototype.on.call(this, ev, fn);\n\n if (ev === 'data') {\n // Start flowing on next tick if stream isn't explicitly paused\n if (this._readableState.flowing !== false) this.resume();\n } else if (ev === 'readable') {\n var state = this._readableState;\n if (!state.endEmitted && !state.readableListening) {\n state.readableListening = state.needReadable = true;\n state.emittedReadable = false;\n if (!state.reading) {\n pna.nextTick(nReadingNextTick, this);\n } else if (state.length) {\n emitReadable(this);\n }\n }\n }\n\n return res;\n};\nReadable.prototype.addListener = Readable.prototype.on;\n\nfunction nReadingNextTick(self) {\n debug('readable nexttick read 0');\n self.read(0);\n}\n\n// pause() and resume() are remnants of the legacy readable stream API\n// If the user uses them, then switch into old mode.\nReadable.prototype.resume = function () {\n var state = this._readableState;\n if (!state.flowing) {\n debug('resume');\n state.flowing = true;\n resume(this, state);\n }\n return this;\n};\n\nfunction resume(stream, state) {\n if (!state.resumeScheduled) {\n state.resumeScheduled = true;\n pna.nextTick(resume_, stream, state);\n }\n}\n\nfunction resume_(stream, state) {\n if (!state.reading) {\n debug('resume read 0');\n stream.read(0);\n }\n\n state.resumeScheduled = false;\n state.awaitDrain = 0;\n stream.emit('resume');\n flow(stream);\n if (state.flowing && !state.reading) stream.read(0);\n}\n\nReadable.prototype.pause = function () {\n debug('call pause flowing=%j', this._readableState.flowing);\n if (false !== this._readableState.flowing) {\n debug('pause');\n this._readableState.flowing = false;\n this.emit('pause');\n }\n return this;\n};\n\nfunction flow(stream) {\n var state = stream._readableState;\n debug('flow', state.flowing);\n while (state.flowing && stream.read() !== null) {}\n}\n\n// wrap an old-style stream as the async data source.\n// This is *not* part of the readable stream interface.\n// It is an ugly unfortunate mess of history.\nReadable.prototype.wrap = function (stream) {\n var _this = this;\n\n var state = this._readableState;\n var paused = false;\n\n stream.on('end', function () {\n debug('wrapped end');\n if (state.decoder && !state.ended) {\n var chunk = state.decoder.end();\n if (chunk && chunk.length) _this.push(chunk);\n }\n\n _this.push(null);\n });\n\n stream.on('data', function (chunk) {\n debug('wrapped data');\n if (state.decoder) chunk = state.decoder.write(chunk);\n\n // don't skip over falsy values in objectMode\n if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;\n\n var ret = _this.push(chunk);\n if (!ret) {\n paused = true;\n stream.pause();\n }\n });\n\n // proxy all the other methods.\n // important when wrapping filters and duplexes.\n for (var i in stream) {\n if (this[i] === undefined && typeof stream[i] === 'function') {\n this[i] = function (method) {\n return function () {\n return stream[method].apply(stream, arguments);\n };\n }(i);\n }\n }\n\n // proxy certain important events.\n for (var n = 0; n < kProxyEvents.length; n++) {\n stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));\n }\n\n // when we try to consume some more bytes, simply unpause the\n // underlying stream.\n this._read = function (n) {\n debug('wrapped _read', n);\n if (paused) {\n paused = false;\n stream.resume();\n }\n };\n\n return this;\n};\n\nObject.defineProperty(Readable.prototype, 'readableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function () {\n return this._readableState.highWaterMark;\n }\n});\n\n// exposed for testing purposes only.\nReadable._fromList = fromList;\n\n// Pluck off n bytes from an array of buffers.\n// Length is the combined lengths of all the buffers in the list.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromList(n, state) {\n // nothing buffered\n if (state.length === 0) return null;\n\n var ret;\n if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {\n // read it all, truncate the list\n if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);\n state.buffer.clear();\n } else {\n // read part of list\n ret = fromListPartial(n, state.buffer, state.decoder);\n }\n\n return ret;\n}\n\n// Extracts only enough buffered data to satisfy the amount requested.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromListPartial(n, list, hasStrings) {\n var ret;\n if (n < list.head.data.length) {\n // slice is the same for buffers and strings\n ret = list.head.data.slice(0, n);\n list.head.data = list.head.data.slice(n);\n } else if (n === list.head.data.length) {\n // first chunk is a perfect match\n ret = list.shift();\n } else {\n // result spans more than one buffer\n ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);\n }\n return ret;\n}\n\n// Copies a specified amount of characters from the list of buffered data\n// chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBufferString(n, list) {\n var p = list.head;\n var c = 1;\n var ret = p.data;\n n -= ret.length;\n while (p = p.next) {\n var str = p.data;\n var nb = n > str.length ? str.length : n;\n if (nb === str.length) ret += str;else ret += str.slice(0, n);\n n -= nb;\n if (n === 0) {\n if (nb === str.length) {\n ++c;\n if (p.next) list.head = p.next;else list.head = list.tail = null;\n } else {\n list.head = p;\n p.data = str.slice(nb);\n }\n break;\n }\n ++c;\n }\n list.length -= c;\n return ret;\n}\n\n// Copies a specified amount of bytes from the list of buffered data chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBuffer(n, list) {\n var ret = Buffer.allocUnsafe(n);\n var p = list.head;\n var c = 1;\n p.data.copy(ret);\n n -= p.data.length;\n while (p = p.next) {\n var buf = p.data;\n var nb = n > buf.length ? buf.length : n;\n buf.copy(ret, ret.length - n, 0, nb);\n n -= nb;\n if (n === 0) {\n if (nb === buf.length) {\n ++c;\n if (p.next) list.head = p.next;else list.head = list.tail = null;\n } else {\n list.head = p;\n p.data = buf.slice(nb);\n }\n break;\n }\n ++c;\n }\n list.length -= c;\n return ret;\n}\n\nfunction endReadable(stream) {\n var state = stream._readableState;\n\n // If we get here before consuming all the bytes, then that is a\n // bug in node. Should never happen.\n if (state.length > 0) throw new Error('\"endReadable()\" called on non-empty stream');\n\n if (!state.endEmitted) {\n state.ended = true;\n pna.nextTick(endReadableNT, state, stream);\n }\n}\n\nfunction endReadableNT(state, stream) {\n // Check that we didn't get one last unshift.\n if (!state.endEmitted && state.length === 0) {\n state.endEmitted = true;\n stream.readable = false;\n stream.emit('end');\n }\n}\n\nfunction indexOf(xs, x) {\n for (var i = 0, l = xs.length; i < l; i++) {\n if (xs[i] === x) return i;\n }\n return -1;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQ0FBc0Msa0RBQXdDO0FBQzlFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEVBQTRFO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSw0Q0FBNEM7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQjs7QUFFckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsU0FBUztBQUM3QixzQ0FBc0MsbUJBQW1CO0FBQ3pELEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEVBQTRFOztBQUU1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IseUJBQXlCO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBLG1EQUFtRCxpRUFBaUU7QUFDcEg7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQyxPQUFPO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvYXJjaGl2ZXItdXRpbHMvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcz9lZDMyIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBwbmEgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gUmVhZGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIER1cGxleDtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcblxudmFyIEVFbGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uIChlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGg7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBPdXJVaW50OEFycmF5ID0gKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDoge30pLlVpbnQ4QXJyYXkgfHwgZnVuY3Rpb24gKCkge307XG5mdW5jdGlvbiBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKSB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShjaHVuayk7XG59XG5mdW5jdGlvbiBfaXNVaW50OEFycmF5KG9iaikge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG9iaikgfHwgb2JqIGluc3RhbmNlb2YgT3VyVWludDhBcnJheTtcbn1cblxuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IE9iamVjdC5jcmVhdGUocmVxdWlyZSgnY29yZS11dGlsLWlzJykpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBkZWJ1Z1V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgZGVidWcgPSB2b2lkIDA7XG5pZiAoZGVidWdVdGlsICYmIGRlYnVnVXRpbC5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXJMaXN0ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL0J1ZmZlckxpc3QnKTtcbnZhciBkZXN0cm95SW1wbCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95Jyk7XG52YXIgU3RyaW5nRGVjb2RlcjtcblxudXRpbC5pbmhlcml0cyhSZWFkYWJsZSwgU3RyZWFtKTtcblxudmFyIGtQcm94eUV2ZW50cyA9IFsnZXJyb3InLCAnY2xvc2UnLCAnZGVzdHJveScsICdwYXVzZScsICdyZXN1bWUnXTtcblxuZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbikge1xuICAvLyBTYWRseSB0aGlzIGlzIG5vdCBjYWNoZWFibGUgYXMgc29tZSBsaWJyYXJpZXMgYnVuZGxlIHRoZWlyIG93blxuICAvLyBldmVudCBlbWl0dGVyIGltcGxlbWVudGF0aW9uIHdpdGggdGhlbS5cbiAgaWYgKHR5cGVvZiBlbWl0dGVyLnByZXBlbmRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyKGV2ZW50LCBmbik7XG5cbiAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIGVycm9yIGhhbmRsZXIgaXMgYXR0YWNoZWQgYmVmb3JlIGFueVxuICAvLyB1c2VybGFuZCBvbmVzLiAgTkVWRVIgRE8gVEhJUy4gVGhpcyBpcyBoZXJlIG9ubHkgYmVjYXVzZSB0aGlzIGNvZGUgbmVlZHNcbiAgLy8gdG8gY29udGludWUgdG8gd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIE5vZGUuanMgdGhhdCBkbyBub3QgaW5jbHVkZVxuICAvLyB0aGUgcHJlcGVuZExpc3RlbmVyKCkgbWV0aG9kLiBUaGUgZ29hbCBpcyB0byBldmVudHVhbGx5IHJlbW92ZSB0aGlzIGhhY2suXG4gIGlmICghZW1pdHRlci5fZXZlbnRzIHx8ICFlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSBlbWl0dGVyLm9uKGV2ZW50LCBmbik7ZWxzZSBpZiAoaXNBcnJheShlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSkgZW1pdHRlci5fZXZlbnRzW2V2ZW50XS51bnNoaWZ0KGZuKTtlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldmVudF0gPSBbZm4sIGVtaXR0ZXIuX2V2ZW50c1tldmVudF1dO1xufVxuXG5mdW5jdGlvbiBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIER1cGxleCBzdHJlYW1zIGFyZSBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZSwgYnV0IHNoYXJlXG4gIC8vIHRoZSBzYW1lIG9wdGlvbnMgb2JqZWN0LlxuICAvLyBIb3dldmVyLCBzb21lIGNhc2VzIHJlcXVpcmUgc2V0dGluZyBvcHRpb25zIHRvIGRpZmZlcmVudFxuICAvLyB2YWx1ZXMgZm9yIHRoZSByZWFkYWJsZSBhbmQgdGhlIHdyaXRhYmxlIHNpZGVzIG9mIHRoZSBkdXBsZXggc3RyZWFtLlxuICAvLyBUaGVzZSBvcHRpb25zIGNhbiBiZSBwcm92aWRlZCBzZXBhcmF0ZWx5IGFzIHJlYWRhYmxlWFhYIGFuZCB3cml0YWJsZVhYWC5cbiAgdmFyIGlzRHVwbGV4ID0gc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZy4gVXNlZCB0byBtYWtlIHJlYWQobikgaWdub3JlIG4gYW5kIHRvXG4gIC8vIG1ha2UgYWxsIHRoZSBidWZmZXIgbWVyZ2luZyBhbmQgbGVuZ3RoIGNoZWNrcyBnbyBhd2F5XG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuXG4gIGlmIChpc0R1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy5yZWFkYWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIGl0IHN0b3BzIGNhbGxpbmcgX3JlYWQoKSB0byBmaWxsIHRoZSBidWZmZXJcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyBcImRvbid0IGNhbGwgX3JlYWQgcHJlZW1wdGl2ZWx5IGV2ZXJcIlxuICB2YXIgaHdtID0gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrO1xuICB2YXIgcmVhZGFibGVId20gPSBvcHRpb25zLnJlYWRhYmxlSGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcblxuICBpZiAoaHdtIHx8IGh3bSA9PT0gMCkgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtO2Vsc2UgaWYgKGlzRHVwbGV4ICYmIChyZWFkYWJsZUh3bSB8fCByZWFkYWJsZUh3bSA9PT0gMCkpIHRoaXMuaGlnaFdhdGVyTWFyayA9IHJlYWRhYmxlSHdtO2Vsc2UgdGhpcy5oaWdoV2F0ZXJNYXJrID0gZGVmYXVsdEh3bTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IE1hdGguZmxvb3IodGhpcy5oaWdoV2F0ZXJNYXJrKTtcblxuICAvLyBBIGxpbmtlZCBsaXN0IGlzIHVzZWQgdG8gc3RvcmUgZGF0YSBjaHVua3MgaW5zdGVhZCBvZiBhbiBhcnJheSBiZWNhdXNlIHRoZVxuICAvLyBsaW5rZWQgbGlzdCBjYW4gcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGJlZ2lubmluZyBmYXN0ZXIgdGhhblxuICAvLyBhcnJheS5zaGlmdCgpXG4gIHRoaXMuYnVmZmVyID0gbmV3IEJ1ZmZlckxpc3QoKTtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICB0aGlzLnBpcGVzID0gbnVsbDtcbiAgdGhpcy5waXBlc0NvdW50ID0gMDtcbiAgdGhpcy5mbG93aW5nID0gbnVsbDtcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICB0aGlzLmVuZEVtaXR0ZWQgPSBmYWxzZTtcbiAgdGhpcy5yZWFkaW5nID0gZmFsc2U7XG5cbiAgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgZXZlbnQgJ3JlYWRhYmxlJy8nZGF0YScgaXMgZW1pdHRlZFxuICAvLyBpbW1lZGlhdGVseSwgb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZVxuICAvLyBhbnkgYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3QgcmVhZCBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG4gIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgLy8gaGFzIGl0IGJlZW4gZGVzdHJveWVkXG4gIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gdGhlIG51bWJlciBvZiB3cml0ZXJzIHRoYXQgYXJlIGF3YWl0aW5nIGEgZHJhaW4gZXZlbnQgaW4gLnBpcGUoKXNcbiAgdGhpcy5hd2FpdERyYWluID0gMDtcblxuICAvLyBpZiB0cnVlLCBhIG1heWJlUmVhZE1vcmUgaGFzIGJlZW4gc2NoZWR1bGVkXG4gIHRoaXMucmVhZGluZ01vcmUgPSBmYWxzZTtcblxuICB0aGlzLmRlY29kZXIgPSBudWxsO1xuICB0aGlzLmVuY29kaW5nID0gbnVsbDtcbiAgaWYgKG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICAgIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKG9wdGlvbnMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZGFibGUpKSByZXR1cm4gbmV3IFJlYWRhYmxlKG9wdGlvbnMpO1xuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3lcbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fcmVhZCA9IG9wdGlvbnMucmVhZDtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95O1xuICB9XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAoIXRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5cblJlYWRhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveTtcblJlYWRhYmxlLnByb3RvdHlwZS5fdW5kZXN0cm95ID0gZGVzdHJveUltcGwudW5kZXN0cm95O1xuUmVhZGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdGhpcy5wdXNoKG51bGwpO1xuICBjYihlcnIpO1xufTtcblxuLy8gTWFudWFsbHkgc2hvdmUgc29tZXRoaW5nIGludG8gdGhlIHJlYWQoKSBidWZmZXIuXG4vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGlnaFdhdGVyTWFyayBoYXMgbm90IGJlZW4gaGl0IHlldCxcbi8vIHNpbWlsYXIgdG8gaG93IFdyaXRhYmxlLndyaXRlKCkgcmV0dXJucyB0cnVlIGlmIHlvdSBzaG91bGRcbi8vIHdyaXRlKCkgc29tZSBtb3JlLlxuUmVhZGFibGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBza2lwQ2h1bmtDaGVjaztcblxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgICBpZiAoZW5jb2RpbmcgIT09IHN0YXRlLmVuY29kaW5nKSB7XG4gICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICAgIH1cbiAgICAgIHNraXBDaHVua0NoZWNrID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2tpcENodW5rQ2hlY2sgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgY2h1bmssIGVuY29kaW5nLCBmYWxzZSwgc2tpcENodW5rQ2hlY2spO1xufTtcblxuLy8gVW5zaGlmdCBzaG91bGQgKmFsd2F5cyogYmUgc29tZXRoaW5nIGRpcmVjdGx5IG91dCBvZiByZWFkKClcblJlYWRhYmxlLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBudWxsLCB0cnVlLCBmYWxzZSk7XG59O1xuXG5mdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSwgY2h1bmssIGVuY29kaW5nLCBhZGRUb0Zyb250LCBza2lwQ2h1bmtDaGVjaykge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBlcjtcbiAgICBpZiAoIXNraXBDaHVua0NoZWNrKSBlciA9IGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspO1xuICAgIGlmIChlcikge1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCBjaHVuayAmJiBjaHVuay5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiAhc3RhdGUub2JqZWN0TW9kZSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY2h1bmspICE9PSBCdWZmZXIucHJvdG90eXBlKSB7XG4gICAgICAgIGNodW5rID0gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuayk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhZGRUb0Zyb250KSB7XG4gICAgICAgIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50JykpO2Vsc2UgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lbmRlZCkge1xuICAgICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuICAgICAgICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rLmxlbmd0aCAhPT0gMCkgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtlbHNlIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmVlZE1vcmVEYXRhKHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGFkZFRvRnJvbnQpIHtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcblxuICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICB9XG4gIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspIHtcbiAgdmFyIGVyO1xuICBpZiAoIV9pc1VpbnQ4QXJyYXkoY2h1bmspICYmIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG4gIHJldHVybiBlcjtcbn1cblxuLy8gaWYgaXQncyBwYXN0IHRoZSBoaWdoIHdhdGVyIG1hcmssIHdlIGNhbiBwdXNoIGluIHNvbWUgbW9yZS5cbi8vIEFsc28sIGlmIHdlIGhhdmUgbm8gZGF0YSB5ZXQsIHdlIGNhbiBzdGFuZCBzb21lXG4vLyBtb3JlIGJ5dGVzLiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCxcbi8vIHN1Y2ggYXMgdGhlIHJlcGwuICBBbHNvLCBpZiB0aGUgcHVzaCgpIHRyaWdnZXJlZCBhXG4vLyByZWFkYWJsZSBldmVudCwgYW5kIHRoZSB1c2VyIGNhbGxlZCByZWFkKGxhcmdlTnVtYmVyKSBzdWNoIHRoYXRcbi8vIG5lZWRSZWFkYWJsZSB3YXMgc2V0LCB0aGVuIHdlIG91Z2h0IHRvIHB1c2ggbW9yZSwgc28gdGhhdCBhbm90aGVyXG4vLyAncmVhZGFibGUnIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLlxuZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKSB7XG4gIHJldHVybiAhc3RhdGUuZW5kZWQgJiYgKHN0YXRlLm5lZWRSZWFkYWJsZSB8fCBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59O1xuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gOE1CXG52YXIgTUFYX0hXTSA9IDB4ODAwMDAwO1xuZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMiB0byBwcmV2ZW50IGluY3JlYXNpbmcgaHdtIGV4Y2Vzc2l2ZWx5IGluXG4gICAgLy8gdGlueSBhbW91bnRzXG4gICAgbi0tO1xuICAgIG4gfD0gbiA+Pj4gMTtcbiAgICBuIHw9IG4gPj4+IDI7XG4gICAgbiB8PSBuID4+PiA0O1xuICAgIG4gfD0gbiA+Pj4gODtcbiAgICBuIHw9IG4gPj4+IDE2O1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gbjtcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKSB7XG4gIGlmIChuIDw9IDAgfHwgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSByZXR1cm4gMDtcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldHVybiAxO1xuICBpZiAobiAhPT0gbikge1xuICAgIC8vIE9ubHkgZmxvdyBvbmUgYnVmZmVyIGF0IGEgdGltZVxuICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCkgcmV0dXJuIHN0YXRlLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoO2Vsc2UgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgfVxuICAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIG1vcmUgdGhhbiB0aGUgY3VycmVudCBod20sIHRoZW4gcmFpc2UgdGhlIGh3bS5cbiAgaWYgKG4gPiBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSBzdGF0ZS5oaWdoV2F0ZXJNYXJrID0gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobik7XG4gIGlmIChuIDw9IHN0YXRlLmxlbmd0aCkgcmV0dXJuIG47XG4gIC8vIERvbid0IGhhdmUgZW5vdWdoXG4gIGlmICghc3RhdGUuZW5kZWQpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiBzdGF0ZS5sZW5ndGg7XG59XG5cbi8vIHlvdSBjYW4gb3ZlcnJpZGUgZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYXN5bmMgX3JlYWQobikgYmVsb3cuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIGRlYnVnKCdyZWFkJywgbik7XG4gIG4gPSBwYXJzZUludChuLCAxMCk7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBuT3JpZyA9IG47XG5cbiAgaWYgKG4gIT09IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7ZWxzZSBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTtcblxuICAvLyBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBsZXNzIHRoYW4gdGhlIGhpZ2hXYXRlck1hcmssIHRoZW4gYWxzbyByZWFkIHNvbWVcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfVxuXG4gIC8vIGhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGFuZCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeS5cbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcpIHtcbiAgICBkb1JlYWQgPSBmYWxzZTtcbiAgICBkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsIGRvUmVhZCk7XG4gIH0gZWxzZSBpZiAoZG9SZWFkKSB7XG4gICAgZGVidWcoJ2RvIHJlYWQnKTtcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZTtcbiAgICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgICAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgLy8gY2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayk7XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlO1xuICAgIC8vIElmIF9yZWFkIHB1c2hlZCBkYXRhIHN5bmNocm9ub3VzbHksIHRoZW4gYHJlYWRpbmdgIHdpbGwgYmUgZmFsc2UsXG4gICAgLy8gYW5kIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmV0dXJuIHRvIHRoZSB1c2VyLlxuICAgIGlmICghc3RhdGUucmVhZGluZykgbiA9IGhvd011Y2hUb1JlYWQobk9yaWcsIHN0YXRlKTtcbiAgfVxuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcblxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBuID0gMDtcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS5sZW5ndGggLT0gbjtcbiAgfVxuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwgdGhlbiB3ZSB3YW50IHRvIGtub3dcbiAgICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAgIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO1xuICB9XG5cbiAgaWYgKHJldCAhPT0gbnVsbCkgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5lbmRlZCkgcmV0dXJuO1xuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG5cbiAgLy8gZW1pdCAncmVhZGFibGUnIG5vdyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBwaWNrZWQgdXAuXG4gIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xufVxuXG4vLyBEb24ndCBlbWl0IHJlYWRhYmxlIHJpZ2h0IGF3YXkgaW4gc3luYyBtb2RlLCBiZWNhdXNlIHRoaXMgY2FuIHRyaWdnZXJcbi8vIGFub3RoZXIgcmVhZCgpIGNhbGwgPT4gc3RhY2sgb3ZlcmZsb3cuICBUaGlzIHdheSwgaXQgbWlnaHQgdHJpZ2dlclxuLy8gYSBuZXh0VGljayByZWN1cnNpb24gd2FybmluZywgYnV0IHRoYXQncyBub3Qgc28gYmFkLlxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICBpZiAoIXN0YXRlLmVtaXR0ZWRSZWFkYWJsZSkge1xuICAgIGRlYnVnKCdlbWl0UmVhZGFibGUnLCBzdGF0ZS5mbG93aW5nKTtcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlO1xuICAgIGlmIChzdGF0ZS5zeW5jKSBwbmEubmV4dFRpY2soZW1pdFJlYWRhYmxlXywgc3RyZWFtKTtlbHNlIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGVfKHN0cmVhbSkge1xuICBkZWJ1ZygnZW1pdCByZWFkYWJsZScpO1xuICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKTtcbiAgZmxvdyhzdHJlYW0pO1xufVxuXG4vLyBhdCB0aGlzIHBvaW50LCB0aGUgdXNlciBoYXMgcHJlc3VtYWJseSBzZWVuIHRoZSAncmVhZGFibGUnIGV2ZW50LFxuLy8gYW5kIGNhbGxlZCByZWFkKCkgdG8gY29uc3VtZSBzb21lIGRhdGEuICB0aGF0IG1heSBoYXZlIHRyaWdnZXJlZFxuLy8gaW4gdHVybiBhbm90aGVyIF9yZWFkKG4pIGNhbGwsIGluIHdoaWNoIGNhc2UgcmVhZGluZyA9IHRydWUgaWZcbi8vIGl0J3MgaW4gcHJvZ3Jlc3MuXG4vLyBIb3dldmVyLCBpZiB3ZSdyZSBub3QgZW5kZWQsIG9yIHJlYWRpbmcsIGFuZCB0aGUgbGVuZ3RoIDwgaHdtLFxuLy8gdGhlbiBnbyBhaGVhZCBhbmQgdHJ5IHRvIHJlYWQgc29tZSBtb3JlIHByZWVtcHRpdmVseS5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlYWRpbmdNb3JlKSB7XG4gICAgc3RhdGUucmVhZGluZ01vcmUgPSB0cnVlO1xuICAgIHBuYS5uZXh0VGljayhtYXliZVJlYWRNb3JlXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB3aGlsZSAoIXN0YXRlLnJlYWRpbmcgJiYgIXN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLmVuZGVkICYmIHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICBkZWJ1ZygnbWF5YmVSZWFkTW9yZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICBpZiAobGVuID09PSBzdGF0ZS5sZW5ndGgpXG4gICAgICAvLyBkaWRuJ3QgZ2V0IGFueSBkYXRhLCBzdG9wIHNwaW5uaW5nLlxuICAgICAgYnJlYWs7ZWxzZSBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIH1cbiAgc3RhdGUucmVhZGluZ01vcmUgPSBmYWxzZTtcbn1cblxuLy8gYWJzdHJhY3QgbWV0aG9kLiAgdG8gYmUgb3ZlcnJpZGRlbiBpbiBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gY2FsbCBjYihlciwgZGF0YSkgd2hlcmUgZGF0YSBpcyA8PSBuIGluIGxlbmd0aC5cbi8vIGZvciB2aXJ0dWFsIChub24tc3RyaW5nLCBub24tYnVmZmVyKSBzdHJlYW1zLCBcImxlbmd0aFwiIGlzIHNvbWV3aGF0XG4vLyBhcmJpdHJhcnksIGFuZCBwZXJoYXBzIG5vdCB2ZXJ5IG1lYW5pbmdmdWwuXG5SZWFkYWJsZS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdfcmVhZCgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuXG4gIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnI7XG5cbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IHVucGlwZTtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHBuYS5uZXh0VGljayhlbmRGbik7ZWxzZSBzcmMub25jZSgnZW5kJywgZW5kRm4pO1xuXG4gIGRlc3Qub24oJ3VucGlwZScsIG9udW5waXBlKTtcbiAgZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUsIHVucGlwZUluZm8pIHtcbiAgICBkZWJ1Zygnb251bnBpcGUnKTtcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgaWYgKHVucGlwZUluZm8gJiYgdW5waXBlSW5mby5oYXNVbnBpcGVkID09PSBmYWxzZSkge1xuICAgICAgICB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgZGVidWcoJ29uZW5kJyk7XG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG4gIC8vIHdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgLy8gb24gdGhlIHNvdXJjZS4gIFRoaXMgd291bGQgYmUgbW9yZSBlbGVnYW50IHdpdGggYSAub25jZSgpXG4gIC8vIGhhbmRsZXIgaW4gZmxvdygpLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyByZXBlYXRlZGx5IGlzXG4gIC8vIHRvbyBzbG93LlxuICB2YXIgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYyk7XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgdmFyIGNsZWFuZWRVcCA9IGZhbHNlO1xuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIGRlYnVnKCdjbGVhbnVwJyk7XG4gICAgLy8gY2xlYW51cCBldmVudCBoYW5kbGVycyBvbmNlIHRoZSBwaXBlIGlzIGJyb2tlblxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCB1bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG5cbiAgICBjbGVhbmVkVXAgPSB0cnVlO1xuXG4gICAgLy8gaWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiAmJiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKSBvbmRyYWluKCk7XG4gIH1cblxuICAvLyBJZiB0aGUgdXNlciBwdXNoZXMgbW9yZSBkYXRhIHdoaWxlIHdlJ3JlIHdyaXRpbmcgdG8gZGVzdCB0aGVuIHdlJ2xsIGVuZCB1cFxuICAvLyBpbiBvbmRhdGEgYWdhaW4uIEhvd2V2ZXIsIHdlIG9ubHkgd2FudCB0byBpbmNyZWFzZSBhd2FpdERyYWluIG9uY2UgYmVjYXVzZVxuICAvLyBkZXN0IHdpbGwgb25seSBlbWl0IG9uZSAnZHJhaW4nIGV2ZW50IGZvciB0aGUgbXVsdGlwbGUgd3JpdGVzLlxuICAvLyA9PiBJbnRyb2R1Y2UgYSBndWFyZCBvbiBpbmNyZWFzaW5nIGF3YWl0RHJhaW4uXG4gIHZhciBpbmNyZWFzZWRBd2FpdERyYWluID0gZmFsc2U7XG4gIHNyYy5vbignZGF0YScsIG9uZGF0YSk7XG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGRlYnVnKCdvbmRhdGEnKTtcbiAgICBpbmNyZWFzZWRBd2FpdERyYWluID0gZmFsc2U7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGlmIChmYWxzZSA9PT0gcmV0ICYmICFpbmNyZWFzZWRBd2FpdERyYWluKSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgLy8gPT4gQ2hlY2sgd2hldGhlciBgZGVzdGAgaXMgc3RpbGwgYSBwaXBpbmcgZGVzdGluYXRpb24uXG4gICAgICBpZiAoKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiYgc3RhdGUucGlwZXMgPT09IGRlc3QgfHwgc3RhdGUucGlwZXNDb3VudCA+IDEgJiYgaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCkgIT09IC0xKSAmJiAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICAgICAgc3RhdGUuYXdhaXREcmFpbisrO1xuICAgICAgICBpbmNyZWFzZWRBd2FpdERyYWluID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHNyYy5wYXVzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBkZXN0IGhhcyBhbiBlcnJvciwgdGhlbiBzdG9wIHBpcGluZyBpbnRvIGl0LlxuICAvLyBob3dldmVyLCBkb24ndCBzdXBwcmVzcyB0aGUgdGhyb3dpbmcgYmVoYXZpb3IgZm9yIHRoaXMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBkZWJ1Zygnb25lcnJvcicsIGVyKTtcbiAgICB1bnBpcGUoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGlmIChFRWxpc3RlbmVyQ291bnQoZGVzdCwgJ2Vycm9yJykgPT09IDApIGRlc3QuZW1pdCgnZXJyb3InLCBlcik7XG4gIH1cblxuICAvLyBNYWtlIHN1cmUgb3VyIGVycm9yIGhhbmRsZXIgaXMgYXR0YWNoZWQgYmVmb3JlIHVzZXJsYW5kIG9uZXMuXG4gIHByZXBlbmRMaXN0ZW5lcihkZXN0LCAnZXJyb3InLCBvbmVycm9yKTtcblxuICAvLyBCb3RoIGNsb3NlIGFuZCBmaW5pc2ggc2hvdWxkIHRyaWdnZXIgdW5waXBlLCBidXQgb25seSBvbmNlLlxuICBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2Nsb3NlJywgb25jbG9zZSk7XG4gIGZ1bmN0aW9uIG9uZmluaXNoKCkge1xuICAgIGRlYnVnKCdvbmZpbmlzaCcpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cbiAgZnVuY3Rpb24gdW5waXBlKCkge1xuICAgIGRlYnVnKCd1bnBpcGUnKTtcbiAgICBzcmMudW5waXBlKGRlc3QpO1xuICB9XG5cbiAgLy8gdGVsbCB0aGUgZGVzdCB0aGF0IGl0J3MgYmVpbmcgcGlwZWQgdG9cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKTtcblxuICAvLyBzdGFydCB0aGUgZmxvdyBpZiBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkIGFscmVhZHkuXG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwaXBlIHJlc3VtZScpO1xuICAgIHNyYy5yZXN1bWUoKTtcbiAgfVxuXG4gIHJldHVybiBkZXN0O1xufTtcblxuZnVuY3Rpb24gcGlwZU9uRHJhaW4oc3JjKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN0YXRlID0gc3JjLl9yZWFkYWJsZVN0YXRlO1xuICAgIGRlYnVnKCdwaXBlT25EcmFpbicsIHN0YXRlLmF3YWl0RHJhaW4pO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluKSBzdGF0ZS5hd2FpdERyYWluLS07XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPT09IDAgJiYgRUVsaXN0ZW5lckNvdW50KHNyYywgJ2RhdGEnKSkge1xuICAgICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgICBmbG93KHNyYyk7XG4gICAgfVxuICB9O1xufVxuXG5SZWFkYWJsZS5wcm90b3R5cGUudW5waXBlID0gZnVuY3Rpb24gKGRlc3QpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHVucGlwZUluZm8gPSB7IGhhc1VucGlwZWQ6IGZhbHNlIH07XG5cbiAgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMCkgcmV0dXJuIHRoaXM7XG5cbiAgLy8ganVzdCBvbmUgZGVzdGluYXRpb24uICBtb3N0IGNvbW1vbiBjYXNlLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkge1xuICAgIC8vIHBhc3NlZCBpbiBvbmUsIGJ1dCBpdCdzIG5vdCB0aGUgcmlnaHQgb25lLlxuICAgIGlmIChkZXN0ICYmIGRlc3QgIT09IHN0YXRlLnBpcGVzKSByZXR1cm4gdGhpcztcblxuICAgIGlmICghZGVzdCkgZGVzdCA9IHN0YXRlLnBpcGVzO1xuXG4gICAgLy8gZ290IGEgbWF0Y2guXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdCkgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzLCB1bnBpcGVJbmZvKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNsb3cgY2FzZS4gbXVsdGlwbGUgcGlwZSBkZXN0aW5hdGlvbnMuXG5cbiAgaWYgKCFkZXN0KSB7XG4gICAgLy8gcmVtb3ZlIGFsbC5cbiAgICB2YXIgZGVzdHMgPSBzdGF0ZS5waXBlcztcbiAgICB2YXIgbGVuID0gc3RhdGUucGlwZXNDb3VudDtcbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZGVzdHNbaV0uZW1pdCgndW5waXBlJywgdGhpcywgeyBoYXNVbnBpcGVkOiBmYWxzZSB9KTtcbiAgICB9cmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB0cnkgdG8gZmluZCB0aGUgcmlnaHQgb25lLlxuICB2YXIgaW5kZXggPSBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KTtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIHRoaXM7XG5cbiAgc3RhdGUucGlwZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgc3RhdGUucGlwZXNDb3VudCAtPSAxO1xuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkgc3RhdGUucGlwZXMgPSBzdGF0ZS5waXBlc1swXTtcblxuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gc2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmdcblJlYWRhYmxlLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIChldiwgZm4pIHtcbiAgdmFyIHJlcyA9IFN0cmVhbS5wcm90b3R5cGUub24uY2FsbCh0aGlzLCBldiwgZm4pO1xuXG4gIGlmIChldiA9PT0gJ2RhdGEnKSB7XG4gICAgLy8gU3RhcnQgZmxvd2luZyBvbiBuZXh0IHRpY2sgaWYgc3RyZWFtIGlzbid0IGV4cGxpY2l0bHkgcGF1c2VkXG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyAhPT0gZmFsc2UpIHRoaXMucmVzdW1lKCk7XG4gIH0gZWxzZSBpZiAoZXYgPT09ICdyZWFkYWJsZScpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiAhc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcpIHtcbiAgICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIHBuYS5uZXh0VGljayhuUmVhZGluZ05leHRUaWNrLCB0aGlzKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGVuZ3RoKSB7XG4gICAgICAgIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IFJlYWRhYmxlLnByb3RvdHlwZS5vbjtcblxuZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKSB7XG4gIGRlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtcbiAgc2VsZi5yZWFkKDApO1xufVxuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJyk7XG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwbmEubmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RhdGUuYXdhaXREcmFpbiA9IDA7XG4gIHN0cmVhbS5lbWl0KCdyZXN1bWUnKTtcbiAgZmxvdyhzdHJlYW0pO1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUucmVhZGluZykgc3RyZWFtLnJlYWQoMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyk7XG4gIGlmIChmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BhdXNlJyk7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZmxvdyhzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZmxvdycsIHN0YXRlLmZsb3dpbmcpO1xuICB3aGlsZSAoc3RhdGUuZmxvd2luZyAmJiBzdHJlYW0ucmVhZCgpICE9PSBudWxsKSB7fVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgcGF1c2VkID0gZmFsc2U7XG5cbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgX3RoaXMucHVzaChjaHVuayk7XG4gICAgfVxuXG4gICAgX3RoaXMucHVzaChudWxsKTtcbiAgfSk7XG5cbiAgc3RyZWFtLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZGF0YScpO1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuXG4gICAgLy8gZG9uJ3Qgc2tpcCBvdmVyIGZhbHN5IHZhbHVlcyBpbiBvYmplY3RNb2RlXG4gICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgJiYgKGNodW5rID09PSBudWxsIHx8IGNodW5rID09PSB1bmRlZmluZWQpKSByZXR1cm47ZWxzZSBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgKCFjaHVuayB8fCAhY2h1bmsubGVuZ3RoKSkgcmV0dXJuO1xuXG4gICAgdmFyIHJldCA9IF90aGlzLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwga1Byb3h5RXZlbnRzLmxlbmd0aDsgbisrKSB7XG4gICAgc3RyZWFtLm9uKGtQcm94eUV2ZW50c1tuXSwgdGhpcy5lbWl0LmJpbmQodGhpcywga1Byb3h5RXZlbnRzW25dKSk7XG4gIH1cblxuICAvLyB3aGVuIHdlIHRyeSB0byBjb25zdW1lIHNvbWUgbW9yZSBieXRlcywgc2ltcGx5IHVucGF1c2UgdGhlXG4gIC8vIHVuZGVybHlpbmcgc3RyZWFtLlxuICB0aGlzLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBfcmVhZCcsIG4pO1xuICAgIGlmIChwYXVzZWQpIHtcbiAgICAgIHBhdXNlZCA9IGZhbHNlO1xuICAgICAgc3RyZWFtLnJlc3VtZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdyZWFkYWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuXG4vLyBleHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5SZWFkYWJsZS5fZnJvbUxpc3QgPSBmcm9tTGlzdDtcblxuLy8gUGx1Y2sgb2ZmIG4gYnl0ZXMgZnJvbSBhbiBhcnJheSBvZiBidWZmZXJzLlxuLy8gTGVuZ3RoIGlzIHRoZSBjb21iaW5lZCBsZW5ndGhzIG9mIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgbGlzdC5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gZnJvbUxpc3Qobiwgc3RhdGUpIHtcbiAgLy8gbm90aGluZyBidWZmZXJlZFxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICB2YXIgcmV0O1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0ID0gc3RhdGUuYnVmZmVyLnNoaWZ0KCk7ZWxzZSBpZiAoIW4gfHwgbiA+PSBzdGF0ZS5sZW5ndGgpIHtcbiAgICAvLyByZWFkIGl0IGFsbCwgdHJ1bmNhdGUgdGhlIGxpc3RcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgcmV0ID0gc3RhdGUuYnVmZmVyLmpvaW4oJycpO2Vsc2UgaWYgKHN0YXRlLmJ1ZmZlci5sZW5ndGggPT09IDEpIHJldCA9IHN0YXRlLmJ1ZmZlci5oZWFkLmRhdGE7ZWxzZSByZXQgPSBzdGF0ZS5idWZmZXIuY29uY2F0KHN0YXRlLmxlbmd0aCk7XG4gICAgc3RhdGUuYnVmZmVyLmNsZWFyKCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVhZCBwYXJ0IG9mIGxpc3RcbiAgICByZXQgPSBmcm9tTGlzdFBhcnRpYWwobiwgc3RhdGUuYnVmZmVyLCBzdGF0ZS5kZWNvZGVyKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbi8vIEV4dHJhY3RzIG9ubHkgZW5vdWdoIGJ1ZmZlcmVkIGRhdGEgdG8gc2F0aXNmeSB0aGUgYW1vdW50IHJlcXVlc3RlZC5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gZnJvbUxpc3RQYXJ0aWFsKG4sIGxpc3QsIGhhc1N0cmluZ3MpIHtcbiAgdmFyIHJldDtcbiAgaWYgKG4gPCBsaXN0LmhlYWQuZGF0YS5sZW5ndGgpIHtcbiAgICAvLyBzbGljZSBpcyB0aGUgc2FtZSBmb3IgYnVmZmVycyBhbmQgc3RyaW5nc1xuICAgIHJldCA9IGxpc3QuaGVhZC5kYXRhLnNsaWNlKDAsIG4pO1xuICAgIGxpc3QuaGVhZC5kYXRhID0gbGlzdC5oZWFkLmRhdGEuc2xpY2Uobik7XG4gIH0gZWxzZSBpZiAobiA9PT0gbGlzdC5oZWFkLmRhdGEubGVuZ3RoKSB7XG4gICAgLy8gZmlyc3QgY2h1bmsgaXMgYSBwZXJmZWN0IG1hdGNoXG4gICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlc3VsdCBzcGFucyBtb3JlIHRoYW4gb25lIGJ1ZmZlclxuICAgIHJldCA9IGhhc1N0cmluZ3MgPyBjb3B5RnJvbUJ1ZmZlclN0cmluZyhuLCBsaXN0KSA6IGNvcHlGcm9tQnVmZmVyKG4sIGxpc3QpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8vIENvcGllcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsaXN0IG9mIGJ1ZmZlcmVkIGRhdGFcbi8vIGNodW5rcy5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gY29weUZyb21CdWZmZXJTdHJpbmcobiwgbGlzdCkge1xuICB2YXIgcCA9IGxpc3QuaGVhZDtcbiAgdmFyIGMgPSAxO1xuICB2YXIgcmV0ID0gcC5kYXRhO1xuICBuIC09IHJldC5sZW5ndGg7XG4gIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgdmFyIHN0ciA9IHAuZGF0YTtcbiAgICB2YXIgbmIgPSBuID4gc3RyLmxlbmd0aCA/IHN0ci5sZW5ndGggOiBuO1xuICAgIGlmIChuYiA9PT0gc3RyLmxlbmd0aCkgcmV0ICs9IHN0cjtlbHNlIHJldCArPSBzdHIuc2xpY2UoMCwgbik7XG4gICAgbiAtPSBuYjtcbiAgICBpZiAobiA9PT0gMCkge1xuICAgICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSB7XG4gICAgICAgICsrYztcbiAgICAgICAgaWYgKHAubmV4dCkgbGlzdC5oZWFkID0gcC5uZXh0O2Vsc2UgbGlzdC5oZWFkID0gbGlzdC50YWlsID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpc3QuaGVhZCA9IHA7XG4gICAgICAgIHAuZGF0YSA9IHN0ci5zbGljZShuYik7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgKytjO1xuICB9XG4gIGxpc3QubGVuZ3RoIC09IGM7XG4gIHJldHVybiByZXQ7XG59XG5cbi8vIENvcGllcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgYnl0ZXMgZnJvbSB0aGUgbGlzdCBvZiBidWZmZXJlZCBkYXRhIGNodW5rcy5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gY29weUZyb21CdWZmZXIobiwgbGlzdCkge1xuICB2YXIgcmV0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG4pO1xuICB2YXIgcCA9IGxpc3QuaGVhZDtcbiAgdmFyIGMgPSAxO1xuICBwLmRhdGEuY29weShyZXQpO1xuICBuIC09IHAuZGF0YS5sZW5ndGg7XG4gIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgdmFyIGJ1ZiA9IHAuZGF0YTtcbiAgICB2YXIgbmIgPSBuID4gYnVmLmxlbmd0aCA/IGJ1Zi5sZW5ndGggOiBuO1xuICAgIGJ1Zi5jb3B5KHJldCwgcmV0Lmxlbmd0aCAtIG4sIDAsIG5iKTtcbiAgICBuIC09IG5iO1xuICAgIGlmIChuID09PSAwKSB7XG4gICAgICBpZiAobmIgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgKytjO1xuICAgICAgICBpZiAocC5uZXh0KSBsaXN0LmhlYWQgPSBwLm5leHQ7ZWxzZSBsaXN0LmhlYWQgPSBsaXN0LnRhaWwgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdC5oZWFkID0gcDtcbiAgICAgICAgcC5kYXRhID0gYnVmLnNsaWNlKG5iKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICArK2M7XG4gIH1cbiAgbGlzdC5sZW5ndGggLT0gYztcbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBJZiB3ZSBnZXQgaGVyZSBiZWZvcmUgY29uc3VtaW5nIGFsbCB0aGUgYnl0ZXMsIHRoZW4gdGhhdCBpcyBhXG4gIC8vIGJ1ZyBpbiBub2RlLiAgU2hvdWxkIG5ldmVyIGhhcHBlbi5cbiAgaWYgKHN0YXRlLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcignXCJlbmRSZWFkYWJsZSgpXCIgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtcblxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gICAgcG5hLm5leHRUaWNrKGVuZFJlYWRhYmxlTlQsIHN0YXRlLCBzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlTlQoc3RhdGUsIHN0cmVhbSkge1xuICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIHN0YXRlLmVuZEVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdlbmQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmRleE9mKHhzLCB4KSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKHhzW2ldID09PSB4KSByZXR1cm4gaTtcbiAgfVxuICByZXR1cm4gLTE7XG59Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7190\n")},1289:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a transform stream is a readable/writable stream where you do\n// something with the data. Sometimes it's called a \"filter\",\n// but that's not a great name for it, since that implies a thing where\n// some bits pass through, and others are simply ignored. (That would\n// be a valid example of a transform, of course.)\n//\n// While the output is causally related to the input, it's not a\n// necessarily symmetric or synchronous transformation. For example,\n// a zlib stream might take multiple plain-text writes(), and then\n// emit a single compressed chunk some time in the future.\n//\n// Here's how this works:\n//\n// The Transform stream has all the aspects of the readable and writable\n// stream classes. When you write(chunk), that calls _write(chunk,cb)\n// internally, and returns false if there's a lot of pending writes\n// buffered up. When you call read(), that calls _read(n) until\n// there's enough pending readable data buffered up.\n//\n// In a transform stream, the written data is placed in a buffer. When\n// _read(n) is called, it transforms the queued up data, calling the\n// buffered _write cb's as it consumes chunks. If consuming a single\n// written chunk would result in multiple output chunks, then the first\n// outputted bit calls the readcb, and subsequent chunks just go into\n// the read buffer, and will cause it to emit 'readable' if necessary.\n//\n// This way, back-pressure is actually determined by the reading side,\n// since _read has to be called to start processing a new chunk. However,\n// a pathological inflate type of transform can cause excessive buffering\n// here. For example, imagine a stream where every byte of input is\n// interpreted as an integer from 0-255, and then results in that many\n// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in\n// 1kb of data being output. In this case, you could write a very small\n// amount of input, and end up with a very large amount of output. In\n// such a pathological inflating mechanism, there'd be no way to tell\n// the system to stop doing the transform. A single 4MB write could\n// cause the system to run out of memory.\n//\n// However, even in such a pathological case, only a single written chunk\n// would be consumed, and then the rest would wait (un-transformed) until\n// the results of the previous transformed chunk were consumed.\n\n\n\nmodule.exports = Transform;\n\nvar Duplex = __webpack_require__(6106);\n\n/**/\nvar util = Object.create(__webpack_require__(6497));\nutil.inherits = __webpack_require__(4378);\n/**/\n\nutil.inherits(Transform, Duplex);\n\nfunction afterTransform(er, data) {\n var ts = this._transformState;\n ts.transforming = false;\n\n var cb = ts.writecb;\n\n if (!cb) {\n return this.emit('error', new Error('write callback called multiple times'));\n }\n\n ts.writechunk = null;\n ts.writecb = null;\n\n if (data != null) // single equals check for both `null` and `undefined`\n this.push(data);\n\n cb(er);\n\n var rs = this._readableState;\n rs.reading = false;\n if (rs.needReadable || rs.length < rs.highWaterMark) {\n this._read(rs.highWaterMark);\n }\n}\n\nfunction Transform(options) {\n if (!(this instanceof Transform)) return new Transform(options);\n\n Duplex.call(this, options);\n\n this._transformState = {\n afterTransform: afterTransform.bind(this),\n needTransform: false,\n transforming: false,\n writecb: null,\n writechunk: null,\n writeencoding: null\n };\n\n // start out asking for a readable event once data is transformed.\n this._readableState.needReadable = true;\n\n // we have implemented the _read method, and done the other things\n // that Readable wants before the first _read call, so unset the\n // sync guard flag.\n this._readableState.sync = false;\n\n if (options) {\n if (typeof options.transform === 'function') this._transform = options.transform;\n\n if (typeof options.flush === 'function') this._flush = options.flush;\n }\n\n // When the writable side finishes, then flush out anything remaining.\n this.on('prefinish', prefinish);\n}\n\nfunction prefinish() {\n var _this = this;\n\n if (typeof this._flush === 'function') {\n this._flush(function (er, data) {\n done(_this, er, data);\n });\n } else {\n done(this, null, null);\n }\n}\n\nTransform.prototype.push = function (chunk, encoding) {\n this._transformState.needTransform = false;\n return Duplex.prototype.push.call(this, chunk, encoding);\n};\n\n// This is the part where you do stuff!\n// override this function in implementation classes.\n// 'chunk' is an input chunk.\n//\n// Call `push(newChunk)` to pass along transformed output\n// to the readable side. You may call 'push' zero or more times.\n//\n// Call `cb(err)` when you are done with this chunk. If you pass\n// an error, then that'll put the hurt on the whole operation. If you\n// never call cb(), then you'll never get another chunk.\nTransform.prototype._transform = function (chunk, encoding, cb) {\n throw new Error('_transform() is not implemented');\n};\n\nTransform.prototype._write = function (chunk, encoding, cb) {\n var ts = this._transformState;\n ts.writecb = cb;\n ts.writechunk = chunk;\n ts.writeencoding = encoding;\n if (!ts.transforming) {\n var rs = this._readableState;\n if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);\n }\n};\n\n// Doesn't matter what the args are here.\n// _transform does all the work.\n// That we got here means that the readable side wants more data.\nTransform.prototype._read = function (n) {\n var ts = this._transformState;\n\n if (ts.writechunk !== null && ts.writecb && !ts.transforming) {\n ts.transforming = true;\n this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);\n } else {\n // mark that we need a transform, so that any data that comes in\n // will get processed, now that we've asked for it.\n ts.needTransform = true;\n }\n};\n\nTransform.prototype._destroy = function (err, cb) {\n var _this2 = this;\n\n Duplex.prototype._destroy.call(this, err, function (err2) {\n cb(err2);\n _this2.emit('close');\n });\n};\n\nfunction done(stream, er, data) {\n if (er) return stream.emit('error', er);\n\n if (data != null) // single equals check for both `null` and `undefined`\n stream.push(data);\n\n // if there's nothing in the write buffer, then that means\n // that nothing more will ever be provided\n if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0');\n\n if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming');\n\n return stream.push(null);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI4OS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLGFBQWE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViOztBQUVBLGFBQWEsbUJBQU8sQ0FBQyxJQUFrQjs7QUFFdkM7QUFDQSx5QkFBeUIsbUJBQU8sQ0FBQyxJQUFjO0FBQy9DLGdCQUFnQixtQkFBTyxDQUFDLElBQVU7QUFDbEM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2FyY2hpdmVyLXV0aWxzL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzPzlmZTciXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgdHJhbnNmb3JtIHN0cmVhbSBpcyBhIHJlYWRhYmxlL3dyaXRhYmxlIHN0cmVhbSB3aGVyZSB5b3UgZG9cbi8vIHNvbWV0aGluZyB3aXRoIHRoZSBkYXRhLiAgU29tZXRpbWVzIGl0J3MgY2FsbGVkIGEgXCJmaWx0ZXJcIixcbi8vIGJ1dCB0aGF0J3Mgbm90IGEgZ3JlYXQgbmFtZSBmb3IgaXQsIHNpbmNlIHRoYXQgaW1wbGllcyBhIHRoaW5nIHdoZXJlXG4vLyBzb21lIGJpdHMgcGFzcyB0aHJvdWdoLCBhbmQgb3RoZXJzIGFyZSBzaW1wbHkgaWdub3JlZC4gIChUaGF0IHdvdWxkXG4vLyBiZSBhIHZhbGlkIGV4YW1wbGUgb2YgYSB0cmFuc2Zvcm0sIG9mIGNvdXJzZS4pXG4vL1xuLy8gV2hpbGUgdGhlIG91dHB1dCBpcyBjYXVzYWxseSByZWxhdGVkIHRvIHRoZSBpbnB1dCwgaXQncyBub3QgYVxuLy8gbmVjZXNzYXJpbHkgc3ltbWV0cmljIG9yIHN5bmNocm9ub3VzIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsXG4vLyBhIHpsaWIgc3RyZWFtIG1pZ2h0IHRha2UgbXVsdGlwbGUgcGxhaW4tdGV4dCB3cml0ZXMoKSwgYW5kIHRoZW5cbi8vIGVtaXQgYSBzaW5nbGUgY29tcHJlc3NlZCBjaHVuayBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZS5cbi8vXG4vLyBIZXJlJ3MgaG93IHRoaXMgd29ya3M6XG4vL1xuLy8gVGhlIFRyYW5zZm9ybSBzdHJlYW0gaGFzIGFsbCB0aGUgYXNwZWN0cyBvZiB0aGUgcmVhZGFibGUgYW5kIHdyaXRhYmxlXG4vLyBzdHJlYW0gY2xhc3Nlcy4gIFdoZW4geW91IHdyaXRlKGNodW5rKSwgdGhhdCBjYWxscyBfd3JpdGUoY2h1bmssY2IpXG4vLyBpbnRlcm5hbGx5LCBhbmQgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSdzIGEgbG90IG9mIHBlbmRpbmcgd3JpdGVzXG4vLyBidWZmZXJlZCB1cC4gIFdoZW4geW91IGNhbGwgcmVhZCgpLCB0aGF0IGNhbGxzIF9yZWFkKG4pIHVudGlsXG4vLyB0aGVyZSdzIGVub3VnaCBwZW5kaW5nIHJlYWRhYmxlIGRhdGEgYnVmZmVyZWQgdXAuXG4vL1xuLy8gSW4gYSB0cmFuc2Zvcm0gc3RyZWFtLCB0aGUgd3JpdHRlbiBkYXRhIGlzIHBsYWNlZCBpbiBhIGJ1ZmZlci4gIFdoZW5cbi8vIF9yZWFkKG4pIGlzIGNhbGxlZCwgaXQgdHJhbnNmb3JtcyB0aGUgcXVldWVkIHVwIGRhdGEsIGNhbGxpbmcgdGhlXG4vLyBidWZmZXJlZCBfd3JpdGUgY2IncyBhcyBpdCBjb25zdW1lcyBjaHVua3MuICBJZiBjb25zdW1pbmcgYSBzaW5nbGVcbi8vIHdyaXR0ZW4gY2h1bmsgd291bGQgcmVzdWx0IGluIG11bHRpcGxlIG91dHB1dCBjaHVua3MsIHRoZW4gdGhlIGZpcnN0XG4vLyBvdXRwdXR0ZWQgYml0IGNhbGxzIHRoZSByZWFkY2IsIGFuZCBzdWJzZXF1ZW50IGNodW5rcyBqdXN0IGdvIGludG9cbi8vIHRoZSByZWFkIGJ1ZmZlciwgYW5kIHdpbGwgY2F1c2UgaXQgdG8gZW1pdCAncmVhZGFibGUnIGlmIG5lY2Vzc2FyeS5cbi8vXG4vLyBUaGlzIHdheSwgYmFjay1wcmVzc3VyZSBpcyBhY3R1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSByZWFkaW5nIHNpZGUsXG4vLyBzaW5jZSBfcmVhZCBoYXMgdG8gYmUgY2FsbGVkIHRvIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgY2h1bmsuICBIb3dldmVyLFxuLy8gYSBwYXRob2xvZ2ljYWwgaW5mbGF0ZSB0eXBlIG9mIHRyYW5zZm9ybSBjYW4gY2F1c2UgZXhjZXNzaXZlIGJ1ZmZlcmluZ1xuLy8gaGVyZS4gIEZvciBleGFtcGxlLCBpbWFnaW5lIGEgc3RyZWFtIHdoZXJlIGV2ZXJ5IGJ5dGUgb2YgaW5wdXQgaXNcbi8vIGludGVycHJldGVkIGFzIGFuIGludGVnZXIgZnJvbSAwLTI1NSwgYW5kIHRoZW4gcmVzdWx0cyBpbiB0aGF0IG1hbnlcbi8vIGJ5dGVzIG9mIG91dHB1dC4gIFdyaXRpbmcgdGhlIDQgYnl0ZXMge2ZmLGZmLGZmLGZmfSB3b3VsZCByZXN1bHQgaW5cbi8vIDFrYiBvZiBkYXRhIGJlaW5nIG91dHB1dC4gIEluIHRoaXMgY2FzZSwgeW91IGNvdWxkIHdyaXRlIGEgdmVyeSBzbWFsbFxuLy8gYW1vdW50IG9mIGlucHV0LCBhbmQgZW5kIHVwIHdpdGggYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBvdXRwdXQuICBJblxuLy8gc3VjaCBhIHBhdGhvbG9naWNhbCBpbmZsYXRpbmcgbWVjaGFuaXNtLCB0aGVyZSdkIGJlIG5vIHdheSB0byB0ZWxsXG4vLyB0aGUgc3lzdGVtIHRvIHN0b3AgZG9pbmcgdGhlIHRyYW5zZm9ybS4gIEEgc2luZ2xlIDRNQiB3cml0ZSBjb3VsZFxuLy8gY2F1c2UgdGhlIHN5c3RlbSB0byBydW4gb3V0IG9mIG1lbW9yeS5cbi8vXG4vLyBIb3dldmVyLCBldmVuIGluIHN1Y2ggYSBwYXRob2xvZ2ljYWwgY2FzZSwgb25seSBhIHNpbmdsZSB3cml0dGVuIGNodW5rXG4vLyB3b3VsZCBiZSBjb25zdW1lZCwgYW5kIHRoZW4gdGhlIHJlc3Qgd291bGQgd2FpdCAodW4tdHJhbnNmb3JtZWQpIHVudGlsXG4vLyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgdHJhbnNmb3JtZWQgY2h1bmsgd2VyZSBjb25zdW1lZC5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxudmFyIER1cGxleCA9IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gT2JqZWN0LmNyZWF0ZShyZXF1aXJlKCdjb3JlLXV0aWwtaXMnKSk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFRyYW5zZm9ybSwgRHVwbGV4KTtcblxuZnVuY3Rpb24gYWZ0ZXJUcmFuc2Zvcm0oZXIsIGRhdGEpIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuXG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG5cbiAgaWYgKCFjYikge1xuICAgIHJldHVybiB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCd3cml0ZSBjYWxsYmFjayBjYWxsZWQgbXVsdGlwbGUgdGltZXMnKSk7XG4gIH1cblxuICB0cy53cml0ZWNodW5rID0gbnVsbDtcbiAgdHMud3JpdGVjYiA9IG51bGw7XG5cbiAgaWYgKGRhdGEgIT0gbnVsbCkgLy8gc2luZ2xlIGVxdWFscyBjaGVjayBmb3IgYm90aCBgbnVsbGAgYW5kIGB1bmRlZmluZWRgXG4gICAgdGhpcy5wdXNoKGRhdGEpO1xuXG4gIGNiKGVyKTtcblxuICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBycy5yZWFkaW5nID0gZmFsc2U7XG4gIGlmIChycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykge1xuICAgIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuXG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlID0ge1xuICAgIGFmdGVyVHJhbnNmb3JtOiBhZnRlclRyYW5zZm9ybS5iaW5kKHRoaXMpLFxuICAgIG5lZWRUcmFuc2Zvcm06IGZhbHNlLFxuICAgIHRyYW5zZm9ybWluZzogZmFsc2UsXG4gICAgd3JpdGVjYjogbnVsbCxcbiAgICB3cml0ZWNodW5rOiBudWxsLFxuICAgIHdyaXRlZW5jb2Rpbmc6IG51bGxcbiAgfTtcblxuICAvLyBzdGFydCBvdXQgYXNraW5nIGZvciBhIHJlYWRhYmxlIGV2ZW50IG9uY2UgZGF0YSBpcyB0cmFuc2Zvcm1lZC5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIHdlIGhhdmUgaW1wbGVtZW50ZWQgdGhlIF9yZWFkIG1ldGhvZCwgYW5kIGRvbmUgdGhlIG90aGVyIHRoaW5nc1xuICAvLyB0aGF0IFJlYWRhYmxlIHdhbnRzIGJlZm9yZSB0aGUgZmlyc3QgX3JlYWQgY2FsbCwgc28gdW5zZXQgdGhlXG4gIC8vIHN5bmMgZ3VhcmQgZmxhZy5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB0aGlzLl90cmFuc2Zvcm0gPSBvcHRpb25zLnRyYW5zZm9ybTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2ggPSBvcHRpb25zLmZsdXNoO1xuICB9XG5cbiAgLy8gV2hlbiB0aGUgd3JpdGFibGUgc2lkZSBmaW5pc2hlcywgdGhlbiBmbHVzaCBvdXQgYW55dGhpbmcgcmVtYWluaW5nLlxuICB0aGlzLm9uKCdwcmVmaW5pc2gnLCBwcmVmaW5pc2gpO1xufVxuXG5mdW5jdGlvbiBwcmVmaW5pc2goKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgaWYgKHR5cGVvZiB0aGlzLl9mbHVzaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uIChlciwgZGF0YSkge1xuICAgICAgZG9uZShfdGhpcywgZXIsIGRhdGEpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGRvbmUodGhpcywgbnVsbCwgbnVsbCk7XG4gIH1cbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHJldHVybiBEdXBsZXgucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBjaHVuaywgZW5jb2RpbmcpO1xufTtcblxuLy8gVGhpcyBpcyB0aGUgcGFydCB3aGVyZSB5b3UgZG8gc3R1ZmYhXG4vLyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGluIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyAnY2h1bmsnIGlzIGFuIGlucHV0IGNodW5rLlxuLy9cbi8vIENhbGwgYHB1c2gobmV3Q2h1bmspYCB0byBwYXNzIGFsb25nIHRyYW5zZm9ybWVkIG91dHB1dFxuLy8gdG8gdGhlIHJlYWRhYmxlIHNpZGUuICBZb3UgbWF5IGNhbGwgJ3B1c2gnIHplcm8gb3IgbW9yZSB0aW1lcy5cbi8vXG4vLyBDYWxsIGBjYihlcnIpYCB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoaXMgY2h1bmsuICBJZiB5b3UgcGFzc1xuLy8gYW4gZXJyb3IsIHRoZW4gdGhhdCdsbCBwdXQgdGhlIGh1cnQgb24gdGhlIHdob2xlIG9wZXJhdGlvbi4gIElmIHlvdVxuLy8gbmV2ZXIgY2FsbCBjYigpLCB0aGVuIHlvdSdsbCBuZXZlciBnZXQgYW5vdGhlciBjaHVuay5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRocm93IG5ldyBFcnJvcignX3RyYW5zZm9ybSgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMud3JpdGVjYiA9IGNiO1xuICB0cy53cml0ZWNodW5rID0gY2h1bms7XG4gIHRzLndyaXRlZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgaWYgKCF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICh0cy5uZWVkVHJhbnNmb3JtIHx8IHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59O1xuXG4vLyBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBhcmdzIGFyZSBoZXJlLlxuLy8gX3RyYW5zZm9ybSBkb2VzIGFsbCB0aGUgd29yay5cbi8vIFRoYXQgd2UgZ290IGhlcmUgbWVhbnMgdGhhdCB0aGUgcmVhZGFibGUgc2lkZSB3YW50cyBtb3JlIGRhdGEuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHRzLndyaXRlY2h1bmsgIT09IG51bGwgJiYgdHMud3JpdGVjYiAmJiAhdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdHMudHJhbnNmb3JtaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl90cmFuc2Zvcm0odHMud3JpdGVjaHVuaywgdHMud3JpdGVlbmNvZGluZywgdHMuYWZ0ZXJUcmFuc2Zvcm0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG1hcmsgdGhhdCB3ZSBuZWVkIGEgdHJhbnNmb3JtLCBzbyB0aGF0IGFueSBkYXRhIHRoYXQgY29tZXMgaW5cbiAgICAvLyB3aWxsIGdldCBwcm9jZXNzZWQsIG5vdyB0aGF0IHdlJ3ZlIGFza2VkIGZvciBpdC5cbiAgICB0cy5uZWVkVHJhbnNmb3JtID0gdHJ1ZTtcbiAgfVxufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gIER1cGxleC5wcm90b3R5cGUuX2Rlc3Ryb3kuY2FsbCh0aGlzLCBlcnIsIGZ1bmN0aW9uIChlcnIyKSB7XG4gICAgY2IoZXJyMik7XG4gICAgX3RoaXMyLmVtaXQoJ2Nsb3NlJyk7XG4gIH0pO1xufTtcblxuZnVuY3Rpb24gZG9uZShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIGlmIChlcikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcblxuICBpZiAoZGF0YSAhPSBudWxsKSAvLyBzaW5nbGUgZXF1YWxzIGNoZWNrIGZvciBib3RoIGBudWxsYCBhbmQgYHVuZGVmaW5lZGBcbiAgICBzdHJlYW0ucHVzaChkYXRhKTtcblxuICAvLyBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlciwgdGhlbiB0aGF0IG1lYW5zXG4gIC8vIHRoYXQgbm90aGluZyBtb3JlIHdpbGwgZXZlciBiZSBwcm92aWRlZFxuICBpZiAoc3RyZWFtLl93cml0YWJsZVN0YXRlLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAnKTtcblxuICBpZiAoc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZS50cmFuc2Zvcm1pbmcpIHRocm93IG5ldyBFcnJvcignQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZycpO1xuXG4gIHJldHVybiBzdHJlYW0ucHVzaChudWxsKTtcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1289\n")},8223:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// A bit simpler than readable streams.\n// Implement an async ._write(chunk, encoding, cb), and it'll handle all\n// the drain event emission and buffering.\n\n\n\n/**/\n\nvar pna = __webpack_require__(8212);\n/**/\n\nmodule.exports = Writable;\n\n/* */\nfunction WriteReq(chunk, encoding, cb) {\n this.chunk = chunk;\n this.encoding = encoding;\n this.callback = cb;\n this.next = null;\n}\n\n// It seems a linked list but it is not\n// there will be only 2 of these for each stream\nfunction CorkedRequest(state) {\n var _this = this;\n\n this.next = null;\n this.entry = null;\n this.finish = function () {\n onCorkedFinish(_this, state);\n };\n}\n/* */\n\n/**/\nvar asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick;\n/**/\n\n/**/\nvar Duplex;\n/**/\n\nWritable.WritableState = WritableState;\n\n/**/\nvar util = Object.create(__webpack_require__(6497));\nutil.inherits = __webpack_require__(4378);\n/**/\n\n/**/\nvar internalUtil = {\n deprecate: __webpack_require__(1159)\n};\n/**/\n\n/**/\nvar Stream = __webpack_require__(1581);\n/**/\n\n/**/\n\nvar Buffer = (__webpack_require__(1466).Buffer);\nvar OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};\nfunction _uint8ArrayToBuffer(chunk) {\n return Buffer.from(chunk);\n}\nfunction _isUint8Array(obj) {\n return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n\n/**/\n\nvar destroyImpl = __webpack_require__(1280);\n\nutil.inherits(Writable, Stream);\n\nfunction nop() {}\n\nfunction WritableState(options, stream) {\n Duplex = Duplex || __webpack_require__(6106);\n\n options = options || {};\n\n // Duplex streams are both readable and writable, but share\n // the same options object.\n // However, some cases require setting options to different\n // values for the readable and the writable sides of the duplex stream.\n // These options can be provided separately as readableXXX and writableXXX.\n var isDuplex = stream instanceof Duplex;\n\n // object stream flag to indicate whether or not this stream\n // contains buffers or objects.\n this.objectMode = !!options.objectMode;\n\n if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;\n\n // the point at which write() starts returning false\n // Note: 0 is a valid value, means that we always return false if\n // the entire buffer is not flushed immediately on write()\n var hwm = options.highWaterMark;\n var writableHwm = options.writableHighWaterMark;\n var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n\n if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm;\n\n // cast to ints.\n this.highWaterMark = Math.floor(this.highWaterMark);\n\n // if _final has been called\n this.finalCalled = false;\n\n // drain event flag.\n this.needDrain = false;\n // at the start of calling end()\n this.ending = false;\n // when end() has been called, and returned\n this.ended = false;\n // when 'finish' is emitted\n this.finished = false;\n\n // has it been destroyed\n this.destroyed = false;\n\n // should we decode strings into buffers before passing to _write?\n // this is here so that some node-core streams can optimize string\n // handling at a lower level.\n var noDecode = options.decodeStrings === false;\n this.decodeStrings = !noDecode;\n\n // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n // not an actual buffer we keep track of, but a measurement\n // of how much we're waiting to get pushed to some underlying\n // socket or file.\n this.length = 0;\n\n // a flag to see when we're in the middle of a write.\n this.writing = false;\n\n // when true all writes will be buffered until .uncork() call\n this.corked = 0;\n\n // a flag to be able to tell if the onwrite cb is called immediately,\n // or on a later tick. We set this to true at first, because any\n // actions that shouldn't happen until \"later\" should generally also\n // not happen before the first write call.\n this.sync = true;\n\n // a flag to know if we're processing previously buffered items, which\n // may call the _write() callback in the same tick, so that we don't\n // end up in an overlapped onwrite situation.\n this.bufferProcessing = false;\n\n // the callback that's passed to _write(chunk,cb)\n this.onwrite = function (er) {\n onwrite(stream, er);\n };\n\n // the callback that the user supplies to write(chunk,encoding,cb)\n this.writecb = null;\n\n // the amount that is being written when _write is called.\n this.writelen = 0;\n\n this.bufferedRequest = null;\n this.lastBufferedRequest = null;\n\n // number of pending user-supplied write callbacks\n // this must be 0 before 'finish' can be emitted\n this.pendingcb = 0;\n\n // emit prefinish if the only thing we're waiting for is _write cbs\n // This is relevant for synchronous Transform streams\n this.prefinished = false;\n\n // True if the error was already emitted and should not be thrown again\n this.errorEmitted = false;\n\n // count buffered requests\n this.bufferedRequestCount = 0;\n\n // allocate the first CorkedRequest, there is always\n // one allocated and free to use, and we maintain at most two\n this.corkedRequestsFree = new CorkedRequest(this);\n}\n\nWritableState.prototype.getBuffer = function getBuffer() {\n var current = this.bufferedRequest;\n var out = [];\n while (current) {\n out.push(current);\n current = current.next;\n }\n return out;\n};\n\n(function () {\n try {\n Object.defineProperty(WritableState.prototype, 'buffer', {\n get: internalUtil.deprecate(function () {\n return this.getBuffer();\n }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')\n });\n } catch (_) {}\n})();\n\n// Test _writableState for inheritance to account for Duplex streams,\n// whose prototype chain only points to Readable.\nvar realHasInstance;\nif (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {\n realHasInstance = Function.prototype[Symbol.hasInstance];\n Object.defineProperty(Writable, Symbol.hasInstance, {\n value: function (object) {\n if (realHasInstance.call(this, object)) return true;\n if (this !== Writable) return false;\n\n return object && object._writableState instanceof WritableState;\n }\n });\n} else {\n realHasInstance = function (object) {\n return object instanceof this;\n };\n}\n\nfunction Writable(options) {\n Duplex = Duplex || __webpack_require__(6106);\n\n // Writable ctor is applied to Duplexes, too.\n // `realHasInstance` is necessary because using plain `instanceof`\n // would return false, as no `_writableState` property is attached.\n\n // Trying to use the custom `instanceof` for Writable here will also break the\n // Node.js LazyTransform implementation, which has a non-trivial getter for\n // `_writableState` that would lead to infinite recursion.\n if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {\n return new Writable(options);\n }\n\n this._writableState = new WritableState(options, this);\n\n // legacy.\n this.writable = true;\n\n if (options) {\n if (typeof options.write === 'function') this._write = options.write;\n\n if (typeof options.writev === 'function') this._writev = options.writev;\n\n if (typeof options.destroy === 'function') this._destroy = options.destroy;\n\n if (typeof options.final === 'function') this._final = options.final;\n }\n\n Stream.call(this);\n}\n\n// Otherwise people can pipe Writable streams, which is just wrong.\nWritable.prototype.pipe = function () {\n this.emit('error', new Error('Cannot pipe, not readable'));\n};\n\nfunction writeAfterEnd(stream, cb) {\n var er = new Error('write after end');\n // TODO: defer error events consistently everywhere, not just the cb\n stream.emit('error', er);\n pna.nextTick(cb, er);\n}\n\n// Checks that a user-supplied chunk is valid, especially for the particular\n// mode the stream is in. Currently this means that `null` is never accepted\n// and undefined/non-string values are only allowed in object mode.\nfunction validChunk(stream, state, chunk, cb) {\n var valid = true;\n var er = false;\n\n if (chunk === null) {\n er = new TypeError('May not write null values to stream');\n } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n er = new TypeError('Invalid non-string/buffer chunk');\n }\n if (er) {\n stream.emit('error', er);\n pna.nextTick(cb, er);\n valid = false;\n }\n return valid;\n}\n\nWritable.prototype.write = function (chunk, encoding, cb) {\n var state = this._writableState;\n var ret = false;\n var isBuf = !state.objectMode && _isUint8Array(chunk);\n\n if (isBuf && !Buffer.isBuffer(chunk)) {\n chunk = _uint8ArrayToBuffer(chunk);\n }\n\n if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;\n\n if (typeof cb !== 'function') cb = nop;\n\n if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {\n state.pendingcb++;\n ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);\n }\n\n return ret;\n};\n\nWritable.prototype.cork = function () {\n var state = this._writableState;\n\n state.corked++;\n};\n\nWritable.prototype.uncork = function () {\n var state = this._writableState;\n\n if (state.corked) {\n state.corked--;\n\n if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);\n }\n};\n\nWritable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {\n // node::ParseEncoding() requires lower case.\n if (typeof encoding === 'string') encoding = encoding.toLowerCase();\n if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);\n this._writableState.defaultEncoding = encoding;\n return this;\n};\n\nfunction decodeChunk(state, chunk, encoding) {\n if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n return chunk;\n}\n\nObject.defineProperty(Writable.prototype, 'writableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function () {\n return this._writableState.highWaterMark;\n }\n});\n\n// if we're already writing something, then just put this\n// in the queue, and wait our turn. Otherwise, call _write\n// If we return false, then we need a drain event, so set that flag.\nfunction writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {\n if (!isBuf) {\n var newChunk = decodeChunk(state, chunk, encoding);\n if (chunk !== newChunk) {\n isBuf = true;\n encoding = 'buffer';\n chunk = newChunk;\n }\n }\n var len = state.objectMode ? 1 : chunk.length;\n\n state.length += len;\n\n var ret = state.length < state.highWaterMark;\n // we must ensure that previous needDrain will not be reset to false.\n if (!ret) state.needDrain = true;\n\n if (state.writing || state.corked) {\n var last = state.lastBufferedRequest;\n state.lastBufferedRequest = {\n chunk: chunk,\n encoding: encoding,\n isBuf: isBuf,\n callback: cb,\n next: null\n };\n if (last) {\n last.next = state.lastBufferedRequest;\n } else {\n state.bufferedRequest = state.lastBufferedRequest;\n }\n state.bufferedRequestCount += 1;\n } else {\n doWrite(stream, state, false, len, chunk, encoding, cb);\n }\n\n return ret;\n}\n\nfunction doWrite(stream, state, writev, len, chunk, encoding, cb) {\n state.writelen = len;\n state.writecb = cb;\n state.writing = true;\n state.sync = true;\n if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);\n state.sync = false;\n}\n\nfunction onwriteError(stream, state, sync, er, cb) {\n --state.pendingcb;\n\n if (sync) {\n // defer the callback if we are being called synchronously\n // to avoid piling up things on the stack\n pna.nextTick(cb, er);\n // this can emit finish, and it will always happen\n // after error\n pna.nextTick(finishMaybe, stream, state);\n stream._writableState.errorEmitted = true;\n stream.emit('error', er);\n } else {\n // the caller expect this to happen before if\n // it is async\n cb(er);\n stream._writableState.errorEmitted = true;\n stream.emit('error', er);\n // this can emit finish, but finish must\n // always follow error\n finishMaybe(stream, state);\n }\n}\n\nfunction onwriteStateUpdate(state) {\n state.writing = false;\n state.writecb = null;\n state.length -= state.writelen;\n state.writelen = 0;\n}\n\nfunction onwrite(stream, er) {\n var state = stream._writableState;\n var sync = state.sync;\n var cb = state.writecb;\n\n onwriteStateUpdate(state);\n\n if (er) onwriteError(stream, state, sync, er, cb);else {\n // Check if we're actually ready to finish, but don't emit yet\n var finished = needFinish(state);\n\n if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {\n clearBuffer(stream, state);\n }\n\n if (sync) {\n /**/\n asyncWrite(afterWrite, stream, state, finished, cb);\n /**/\n } else {\n afterWrite(stream, state, finished, cb);\n }\n }\n}\n\nfunction afterWrite(stream, state, finished, cb) {\n if (!finished) onwriteDrain(stream, state);\n state.pendingcb--;\n cb();\n finishMaybe(stream, state);\n}\n\n// Must force callback to be called on nextTick, so that we don't\n// emit 'drain' before the write() consumer gets the 'false' return\n// value, and has a chance to attach a 'drain' listener.\nfunction onwriteDrain(stream, state) {\n if (state.length === 0 && state.needDrain) {\n state.needDrain = false;\n stream.emit('drain');\n }\n}\n\n// if there's something in the buffer waiting, then process it\nfunction clearBuffer(stream, state) {\n state.bufferProcessing = true;\n var entry = state.bufferedRequest;\n\n if (stream._writev && entry && entry.next) {\n // Fast case, write everything using _writev()\n var l = state.bufferedRequestCount;\n var buffer = new Array(l);\n var holder = state.corkedRequestsFree;\n holder.entry = entry;\n\n var count = 0;\n var allBuffers = true;\n while (entry) {\n buffer[count] = entry;\n if (!entry.isBuf) allBuffers = false;\n entry = entry.next;\n count += 1;\n }\n buffer.allBuffers = allBuffers;\n\n doWrite(stream, state, true, state.length, buffer, '', holder.finish);\n\n // doWrite is almost always async, defer these to save a bit of time\n // as the hot path ends with doWrite\n state.pendingcb++;\n state.lastBufferedRequest = null;\n if (holder.next) {\n state.corkedRequestsFree = holder.next;\n holder.next = null;\n } else {\n state.corkedRequestsFree = new CorkedRequest(state);\n }\n state.bufferedRequestCount = 0;\n } else {\n // Slow case, write chunks one-by-one\n while (entry) {\n var chunk = entry.chunk;\n var encoding = entry.encoding;\n var cb = entry.callback;\n var len = state.objectMode ? 1 : chunk.length;\n\n doWrite(stream, state, false, len, chunk, encoding, cb);\n entry = entry.next;\n state.bufferedRequestCount--;\n // if we didn't call the onwrite immediately, then\n // it means that we need to wait until it does.\n // also, that means that the chunk and cb are currently\n // being processed, so move the buffer counter past them.\n if (state.writing) {\n break;\n }\n }\n\n if (entry === null) state.lastBufferedRequest = null;\n }\n\n state.bufferedRequest = entry;\n state.bufferProcessing = false;\n}\n\nWritable.prototype._write = function (chunk, encoding, cb) {\n cb(new Error('_write() is not implemented'));\n};\n\nWritable.prototype._writev = null;\n\nWritable.prototype.end = function (chunk, encoding, cb) {\n var state = this._writableState;\n\n if (typeof chunk === 'function') {\n cb = chunk;\n chunk = null;\n encoding = null;\n } else if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);\n\n // .end() fully uncorks\n if (state.corked) {\n state.corked = 1;\n this.uncork();\n }\n\n // ignore unnecessary end() calls.\n if (!state.ending) endWritable(this, state, cb);\n};\n\nfunction needFinish(state) {\n return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;\n}\nfunction callFinal(stream, state) {\n stream._final(function (err) {\n state.pendingcb--;\n if (err) {\n stream.emit('error', err);\n }\n state.prefinished = true;\n stream.emit('prefinish');\n finishMaybe(stream, state);\n });\n}\nfunction prefinish(stream, state) {\n if (!state.prefinished && !state.finalCalled) {\n if (typeof stream._final === 'function') {\n state.pendingcb++;\n state.finalCalled = true;\n pna.nextTick(callFinal, stream, state);\n } else {\n state.prefinished = true;\n stream.emit('prefinish');\n }\n }\n}\n\nfunction finishMaybe(stream, state) {\n var need = needFinish(state);\n if (need) {\n prefinish(stream, state);\n if (state.pendingcb === 0) {\n state.finished = true;\n stream.emit('finish');\n }\n }\n return need;\n}\n\nfunction endWritable(stream, state, cb) {\n state.ending = true;\n finishMaybe(stream, state);\n if (cb) {\n if (state.finished) pna.nextTick(cb);else stream.once('finish', cb);\n }\n state.ended = true;\n stream.writable = false;\n}\n\nfunction onCorkedFinish(corkReq, state, err) {\n var entry = corkReq.entry;\n corkReq.entry = null;\n while (entry) {\n var cb = entry.callback;\n state.pendingcb--;\n cb(err);\n entry = entry.next;\n }\n\n // reuse the free corkReq.\n state.corkedRequestsFree.next = corkReq;\n}\n\nObject.defineProperty(Writable.prototype, 'destroyed', {\n get: function () {\n if (this._writableState === undefined) {\n return false;\n }\n return this._writableState.destroyed;\n },\n set: function (value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (!this._writableState) {\n return;\n }\n\n // backward compatibility, the user is explicitly\n // managing destroyed\n this._writableState.destroyed = value;\n }\n});\n\nWritable.prototype.destroy = destroyImpl.destroy;\nWritable.prototype._undestroy = destroyImpl.undestroy;\nWritable.prototype._destroy = function (err, cb) {\n this.end();\n cb(err);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODIyMy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYjs7QUFFQSxVQUFVLG1CQUFPLENBQUMsSUFBc0I7QUFDeEM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHlCQUF5QixtQkFBTyxDQUFDLElBQWM7QUFDL0MsZ0JBQWdCLG1CQUFPLENBQUMsSUFBVTtBQUNsQzs7QUFFQTtBQUNBO0FBQ0EsYUFBYSxtQkFBTyxDQUFDLElBQWdCO0FBQ3JDO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLG1CQUFPLENBQUMsSUFBMkI7QUFDaEQ7O0FBRUE7O0FBRUEsYUFBYSxrQ0FBNkI7QUFDMUMsOElBQThJO0FBQzlJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxrQkFBa0IsbUJBQU8sQ0FBQyxJQUE0Qjs7QUFFdEQ7O0FBRUE7O0FBRUE7QUFDQSxxQkFBcUIsbUJBQU8sQ0FBQyxJQUFrQjs7QUFFL0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaURBQWlELDBGQUEwRjs7QUFFM0k7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxJQUFJO0FBQ0osQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBcUIsbUJBQU8sQ0FBQyxJQUFrQjs7QUFFL0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlDQUFpQzs7QUFFakM7O0FBRUEsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsb0RBQW9EO0FBQ3BEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9hcmNoaXZlci11dGlscy9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzPzIyMTYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIEEgYml0IHNpbXBsZXIgdGhhbiByZWFkYWJsZSBzdHJlYW1zLlxuLy8gSW1wbGVtZW50IGFuIGFzeW5jIC5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYiksIGFuZCBpdCdsbCBoYW5kbGUgYWxsXG4vLyB0aGUgZHJhaW4gZXZlbnQgZW1pc3Npb24gYW5kIGJ1ZmZlcmluZy5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgcG5hID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdyaXRhYmxlO1xuXG4vKiA8cmVwbGFjZW1lbnQ+ICovXG5mdW5jdGlvbiBXcml0ZVJlcShjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRoaXMuY2h1bmsgPSBjaHVuaztcbiAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICB0aGlzLmNhbGxiYWNrID0gY2I7XG4gIHRoaXMubmV4dCA9IG51bGw7XG59XG5cbi8vIEl0IHNlZW1zIGEgbGlua2VkIGxpc3QgYnV0IGl0IGlzIG5vdFxuLy8gdGhlcmUgd2lsbCBiZSBvbmx5IDIgb2YgdGhlc2UgZm9yIGVhY2ggc3RyZWFtXG5mdW5jdGlvbiBDb3JrZWRSZXF1ZXN0KHN0YXRlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgdGhpcy5lbnRyeSA9IG51bGw7XG4gIHRoaXMuZmluaXNoID0gZnVuY3Rpb24gKCkge1xuICAgIG9uQ29ya2VkRmluaXNoKF90aGlzLCBzdGF0ZSk7XG4gIH07XG59XG4vKiA8L3JlcGxhY2VtZW50PiAqL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGFzeW5jV3JpdGUgPSAhcHJvY2Vzcy5icm93c2VyICYmIFsndjAuMTAnLCAndjAuOS4nXS5pbmRleE9mKHByb2Nlc3MudmVyc2lvbi5zbGljZSgwLCA1KSkgPiAtMSA/IHNldEltbWVkaWF0ZSA6IHBuYS5uZXh0VGljaztcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIER1cGxleDtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5Xcml0YWJsZS5Xcml0YWJsZVN0YXRlID0gV3JpdGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gT2JqZWN0LmNyZWF0ZShyZXF1aXJlKCdjb3JlLXV0aWwtaXMnKSk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGludGVybmFsVXRpbCA9IHtcbiAgZGVwcmVjYXRlOiByZXF1aXJlKCd1dGlsLWRlcHJlY2F0ZScpXG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBPdXJVaW50OEFycmF5ID0gKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDoge30pLlVpbnQ4QXJyYXkgfHwgZnVuY3Rpb24gKCkge307XG5mdW5jdGlvbiBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKSB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShjaHVuayk7XG59XG5mdW5jdGlvbiBfaXNVaW50OEFycmF5KG9iaikge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG9iaikgfHwgb2JqIGluc3RhbmNlb2YgT3VyVWludDhBcnJheTtcbn1cblxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBkZXN0cm95SW1wbCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95Jyk7XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gRHVwbGV4IHN0cmVhbXMgYXJlIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLCBidXQgc2hhcmVcbiAgLy8gdGhlIHNhbWUgb3B0aW9ucyBvYmplY3QuXG4gIC8vIEhvd2V2ZXIsIHNvbWUgY2FzZXMgcmVxdWlyZSBzZXR0aW5nIG9wdGlvbnMgdG8gZGlmZmVyZW50XG4gIC8vIHZhbHVlcyBmb3IgdGhlIHJlYWRhYmxlIGFuZCB0aGUgd3JpdGFibGUgc2lkZXMgb2YgdGhlIGR1cGxleCBzdHJlYW0uXG4gIC8vIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkgYXMgcmVhZGFibGVYWFggYW5kIHdyaXRhYmxlWFhYLlxuICB2YXIgaXNEdXBsZXggPSBzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXg7XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKGlzRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggd3JpdGUoKSBzdGFydHMgcmV0dXJuaW5nIGZhbHNlXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgdGhhdCB3ZSBhbHdheXMgcmV0dXJuIGZhbHNlIGlmXG4gIC8vIHRoZSBlbnRpcmUgYnVmZmVyIGlzIG5vdCBmbHVzaGVkIGltbWVkaWF0ZWx5IG9uIHdyaXRlKClcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIHdyaXRhYmxlSHdtID0gb3B0aW9ucy53cml0YWJsZUhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG5cbiAgaWYgKGh3bSB8fCBod20gPT09IDApIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bTtlbHNlIGlmIChpc0R1cGxleCAmJiAod3JpdGFibGVId20gfHwgd3JpdGFibGVId20gPT09IDApKSB0aGlzLmhpZ2hXYXRlck1hcmsgPSB3cml0YWJsZUh3bTtlbHNlIHRoaXMuaGlnaFdhdGVyTWFyayA9IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBNYXRoLmZsb29yKHRoaXMuaGlnaFdhdGVyTWFyayk7XG5cbiAgLy8gaWYgX2ZpbmFsIGhhcyBiZWVuIGNhbGxlZFxuICB0aGlzLmZpbmFsQ2FsbGVkID0gZmFsc2U7XG5cbiAgLy8gZHJhaW4gZXZlbnQgZmxhZy5cbiAgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgLy8gYXQgdGhlIHN0YXJ0IG9mIGNhbGxpbmcgZW5kKClcbiAgdGhpcy5lbmRpbmcgPSBmYWxzZTtcbiAgLy8gd2hlbiBlbmQoKSBoYXMgYmVlbiBjYWxsZWQsIGFuZCByZXR1cm5lZFxuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIC8vIHdoZW4gJ2ZpbmlzaCcgaXMgZW1pdHRlZFxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gaGFzIGl0IGJlZW4gZGVzdHJveWVkXG4gIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gc2hvdWxkIHdlIGRlY29kZSBzdHJpbmdzIGludG8gYnVmZmVycyBiZWZvcmUgcGFzc2luZyB0byBfd3JpdGU/XG4gIC8vIHRoaXMgaXMgaGVyZSBzbyB0aGF0IHNvbWUgbm9kZS1jb3JlIHN0cmVhbXMgY2FuIG9wdGltaXplIHN0cmluZ1xuICAvLyBoYW5kbGluZyBhdCBhIGxvd2VyIGxldmVsLlxuICB2YXIgbm9EZWNvZGUgPSBvcHRpb25zLmRlY29kZVN0cmluZ3MgPT09IGZhbHNlO1xuICB0aGlzLmRlY29kZVN0cmluZ3MgPSAhbm9EZWNvZGU7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gbm90IGFuIGFjdHVhbCBidWZmZXIgd2Uga2VlcCB0cmFjayBvZiwgYnV0IGEgbWVhc3VyZW1lbnRcbiAgLy8gb2YgaG93IG11Y2ggd2UncmUgd2FpdGluZyB0byBnZXQgcHVzaGVkIHRvIHNvbWUgdW5kZXJseWluZ1xuICAvLyBzb2NrZXQgb3IgZmlsZS5cbiAgdGhpcy5sZW5ndGggPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBzZWUgd2hlbiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuXG4gIHRoaXMud3JpdGluZyA9IGZhbHNlO1xuXG4gIC8vIHdoZW4gdHJ1ZSBhbGwgd3JpdGVzIHdpbGwgYmUgYnVmZmVyZWQgdW50aWwgLnVuY29yaygpIGNhbGxcbiAgdGhpcy5jb3JrZWQgPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIGEgZmxhZyB0byBrbm93IGlmIHdlJ3JlIHByb2Nlc3NpbmcgcHJldmlvdXNseSBidWZmZXJlZCBpdGVtcywgd2hpY2hcbiAgLy8gbWF5IGNhbGwgdGhlIF93cml0ZSgpIGNhbGxiYWNrIGluIHRoZSBzYW1lIHRpY2ssIHNvIHRoYXQgd2UgZG9uJ3RcbiAgLy8gZW5kIHVwIGluIGFuIG92ZXJsYXBwZWQgb253cml0ZSBzaXR1YXRpb24uXG4gIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0J3MgcGFzc2VkIHRvIF93cml0ZShjaHVuayxjYilcbiAgdGhpcy5vbndyaXRlID0gZnVuY3Rpb24gKGVyKSB7XG4gICAgb253cml0ZShzdHJlYW0sIGVyKTtcbiAgfTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCB0aGUgdXNlciBzdXBwbGllcyB0byB3cml0ZShjaHVuayxlbmNvZGluZyxjYilcbiAgdGhpcy53cml0ZWNiID0gbnVsbDtcblxuICAvLyB0aGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG4gIHRoaXMud3JpdGVsZW4gPSAwO1xuXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcblxuICAvLyBudW1iZXIgb2YgcGVuZGluZyB1c2VyLXN1cHBsaWVkIHdyaXRlIGNhbGxiYWNrc1xuICAvLyB0aGlzIG11c3QgYmUgMCBiZWZvcmUgJ2ZpbmlzaCcgY2FuIGJlIGVtaXR0ZWRcbiAgdGhpcy5wZW5kaW5nY2IgPSAwO1xuXG4gIC8vIGVtaXQgcHJlZmluaXNoIGlmIHRoZSBvbmx5IHRoaW5nIHdlJ3JlIHdhaXRpbmcgZm9yIGlzIF93cml0ZSBjYnNcbiAgLy8gVGhpcyBpcyByZWxldmFudCBmb3Igc3luY2hyb25vdXMgVHJhbnNmb3JtIHN0cmVhbXNcbiAgdGhpcy5wcmVmaW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIFRydWUgaWYgdGhlIGVycm9yIHdhcyBhbHJlYWR5IGVtaXR0ZWQgYW5kIHNob3VsZCBub3QgYmUgdGhyb3duIGFnYWluXG4gIHRoaXMuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG5cbiAgLy8gY291bnQgYnVmZmVyZWQgcmVxdWVzdHNcbiAgdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7XG5cbiAgLy8gYWxsb2NhdGUgdGhlIGZpcnN0IENvcmtlZFJlcXVlc3QsIHRoZXJlIGlzIGFsd2F5c1xuICAvLyBvbmUgYWxsb2NhdGVkIGFuZCBmcmVlIHRvIHVzZSwgYW5kIHdlIG1haW50YWluIGF0IG1vc3QgdHdvXG4gIHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlID0gbmV3IENvcmtlZFJlcXVlc3QodGhpcyk7XG59XG5cbldyaXRhYmxlU3RhdGUucHJvdG90eXBlLmdldEJ1ZmZlciA9IGZ1bmN0aW9uIGdldEJ1ZmZlcigpIHtcbiAgdmFyIGN1cnJlbnQgPSB0aGlzLmJ1ZmZlcmVkUmVxdWVzdDtcbiAgdmFyIG91dCA9IFtdO1xuICB3aGlsZSAoY3VycmVudCkge1xuICAgIG91dC5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn07XG5cbihmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RhdGUucHJvdG90eXBlLCAnYnVmZmVyJywge1xuICAgICAgZ2V0OiBpbnRlcm5hbFV0aWwuZGVwcmVjYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCk7XG4gICAgICB9LCAnX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgJyArICdpbnN0ZWFkLicsICdERVAwMDAzJylcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykge31cbn0pKCk7XG5cbi8vIFRlc3QgX3dyaXRhYmxlU3RhdGUgZm9yIGluaGVyaXRhbmNlIHRvIGFjY291bnQgZm9yIER1cGxleCBzdHJlYW1zLFxuLy8gd2hvc2UgcHJvdG90eXBlIGNoYWluIG9ubHkgcG9pbnRzIHRvIFJlYWRhYmxlLlxudmFyIHJlYWxIYXNJbnN0YW5jZTtcbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5oYXNJbnN0YW5jZSAmJiB0eXBlb2YgRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgcmVhbEhhc0luc3RhbmNlID0gRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZSwgU3ltYm9sLmhhc0luc3RhbmNlLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgIGlmIChyZWFsSGFzSW5zdGFuY2UuY2FsbCh0aGlzLCBvYmplY3QpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICh0aGlzICE9PSBXcml0YWJsZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICByZXR1cm4gb2JqZWN0ICYmIG9iamVjdC5fd3JpdGFibGVTdGF0ZSBpbnN0YW5jZW9mIFdyaXRhYmxlU3RhdGU7XG4gICAgfVxuICB9KTtcbn0gZWxzZSB7XG4gIHJlYWxIYXNJbnN0YW5jZSA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgdGhpcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gV3JpdGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIC8vIFdyaXRhYmxlIGN0b3IgaXMgYXBwbGllZCB0byBEdXBsZXhlcywgdG9vLlxuICAvLyBgcmVhbEhhc0luc3RhbmNlYCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB1c2luZyBwbGFpbiBgaW5zdGFuY2VvZmBcbiAgLy8gd291bGQgcmV0dXJuIGZhbHNlLCBhcyBubyBgX3dyaXRhYmxlU3RhdGVgIHByb3BlcnR5IGlzIGF0dGFjaGVkLlxuXG4gIC8vIFRyeWluZyB0byB1c2UgdGhlIGN1c3RvbSBgaW5zdGFuY2VvZmAgZm9yIFdyaXRhYmxlIGhlcmUgd2lsbCBhbHNvIGJyZWFrIHRoZVxuICAvLyBOb2RlLmpzIExhenlUcmFuc2Zvcm0gaW1wbGVtZW50YXRpb24sIHdoaWNoIGhhcyBhIG5vbi10cml2aWFsIGdldHRlciBmb3JcbiAgLy8gYF93cml0YWJsZVN0YXRlYCB0aGF0IHdvdWxkIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICBpZiAoIXJlYWxIYXNJbnN0YW5jZS5jYWxsKFdyaXRhYmxlLCB0aGlzKSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKSB7XG4gICAgcmV0dXJuIG5ldyBXcml0YWJsZShvcHRpb25zKTtcbiAgfVxuXG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUgPSBuZXcgV3JpdGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3kuXG4gIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRlID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZSA9IG9wdGlvbnMud3JpdGU7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGV2ID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZXYgPSBvcHRpb25zLndyaXRldjtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95O1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbmFsID09PSAnZnVuY3Rpb24nKSB0aGlzLl9maW5hbCA9IG9wdGlvbnMuZmluYWw7XG4gIH1cblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuLy8gT3RoZXJ3aXNlIHBlb3BsZSBjYW4gcGlwZSBXcml0YWJsZSBzdHJlYW1zLCB3aGljaCBpcyBqdXN0IHdyb25nLlxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ0Nhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUnKSk7XG59O1xuXG5mdW5jdGlvbiB3cml0ZUFmdGVyRW5kKHN0cmVhbSwgY2IpIHtcbiAgdmFyIGVyID0gbmV3IEVycm9yKCd3cml0ZSBhZnRlciBlbmQnKTtcbiAgLy8gVE9ETzogZGVmZXIgZXJyb3IgZXZlbnRzIGNvbnNpc3RlbnRseSBldmVyeXdoZXJlLCBub3QganVzdCB0aGUgY2JcbiAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICBwbmEubmV4dFRpY2soY2IsIGVyKTtcbn1cblxuLy8gQ2hlY2tzIHRoYXQgYSB1c2VyLXN1cHBsaWVkIGNodW5rIGlzIHZhbGlkLCBlc3BlY2lhbGx5IGZvciB0aGUgcGFydGljdWxhclxuLy8gbW9kZSB0aGUgc3RyZWFtIGlzIGluLiBDdXJyZW50bHkgdGhpcyBtZWFucyB0aGF0IGBudWxsYCBpcyBuZXZlciBhY2NlcHRlZFxuLy8gYW5kIHVuZGVmaW5lZC9ub24tc3RyaW5nIHZhbHVlcyBhcmUgb25seSBhbGxvd2VkIGluIG9iamVjdCBtb2RlLlxuZnVuY3Rpb24gdmFsaWRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgY2IpIHtcbiAgdmFyIHZhbGlkID0gdHJ1ZTtcbiAgdmFyIGVyID0gZmFsc2U7XG5cbiAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbScpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICBwbmEubmV4dFRpY2soY2IsIGVyKTtcbiAgICB2YWxpZCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiB2YWxpZDtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHJldCA9IGZhbHNlO1xuICB2YXIgaXNCdWYgPSAhc3RhdGUub2JqZWN0TW9kZSAmJiBfaXNVaW50OEFycmF5KGNodW5rKTtcblxuICBpZiAoaXNCdWYgJiYgIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIHtcbiAgICBjaHVuayA9IF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGlzQnVmKSBlbmNvZGluZyA9ICdidWZmZXInO2Vsc2UgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG5cbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgY2IgPSBub3A7XG5cbiAgaWYgKHN0YXRlLmVuZGVkKSB3cml0ZUFmdGVyRW5kKHRoaXMsIGNiKTtlbHNlIGlmIChpc0J1ZiB8fCB2YWxpZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgY2IpKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgcmV0ID0gd3JpdGVPckJ1ZmZlcih0aGlzLCBzdGF0ZSwgaXNCdWYsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIHN0YXRlLmNvcmtlZCsrO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnVuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkLS07XG5cbiAgICBpZiAoIXN0YXRlLndyaXRpbmcgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIGNsZWFyQnVmZmVyKHRoaXMsIHN0YXRlKTtcbiAgfVxufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykge1xuICAvLyBub2RlOjpQYXJzZUVuY29kaW5nKCkgcmVxdWlyZXMgbG93ZXIgY2FzZS5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIGVuY29kaW5nID0gZW5jb2RpbmcudG9Mb3dlckNhc2UoKTtcbiAgaWYgKCEoWydoZXgnLCAndXRmOCcsICd1dGYtOCcsICdhc2NpaScsICdiaW5hcnknLCAnYmFzZTY0JywgJ3VjczInLCAndWNzLTInLCAndXRmMTZsZScsICd1dGYtMTZsZScsICdyYXcnXS5pbmRleE9mKChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpKSA+IC0xKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2RpbmcgPSBlbmNvZGluZztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKSB7XG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICB9XG4gIHJldHVybiBjaHVuaztcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlSGlnaFdhdGVyTWFyaycsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgfVxufSk7XG5cbi8vIGlmIHdlJ3JlIGFscmVhZHkgd3JpdGluZyBzb21ldGhpbmcsIHRoZW4ganVzdCBwdXQgdGhpc1xuLy8gaW4gdGhlIHF1ZXVlLCBhbmQgd2FpdCBvdXIgdHVybi4gIE90aGVyd2lzZSwgY2FsbCBfd3JpdGVcbi8vIElmIHdlIHJldHVybiBmYWxzZSwgdGhlbiB3ZSBuZWVkIGEgZHJhaW4gZXZlbnQsIHNvIHNldCB0aGF0IGZsYWcuXG5mdW5jdGlvbiB3cml0ZU9yQnVmZmVyKHN0cmVhbSwgc3RhdGUsIGlzQnVmLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGlmICghaXNCdWYpIHtcbiAgICB2YXIgbmV3Q2h1bmsgPSBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKTtcbiAgICBpZiAoY2h1bmsgIT09IG5ld0NodW5rKSB7XG4gICAgICBpc0J1ZiA9IHRydWU7XG4gICAgICBlbmNvZGluZyA9ICdidWZmZXInO1xuICAgICAgY2h1bmsgPSBuZXdDaHVuaztcbiAgICB9XG4gIH1cbiAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gIHN0YXRlLmxlbmd0aCArPSBsZW47XG5cbiAgdmFyIHJldCA9IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIC8vIHdlIG11c3QgZW5zdXJlIHRoYXQgcHJldmlvdXMgbmVlZERyYWluIHdpbGwgbm90IGJlIHJlc2V0IHRvIGZhbHNlLlxuICBpZiAoIXJldCkgc3RhdGUubmVlZERyYWluID0gdHJ1ZTtcblxuICBpZiAoc3RhdGUud3JpdGluZyB8fCBzdGF0ZS5jb3JrZWQpIHtcbiAgICB2YXIgbGFzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IHtcbiAgICAgIGNodW5rOiBjaHVuayxcbiAgICAgIGVuY29kaW5nOiBlbmNvZGluZyxcbiAgICAgIGlzQnVmOiBpc0J1ZixcbiAgICAgIGNhbGxiYWNrOiBjYixcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuICAgIGlmIChsYXN0KSB7XG4gICAgICBsYXN0Lm5leHQgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIH1cbiAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudCArPSAxO1xuICB9IGVsc2Uge1xuICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHdyaXRldiwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHN0YXRlLndyaXRlbGVuID0gbGVuO1xuICBzdGF0ZS53cml0ZWNiID0gY2I7XG4gIHN0YXRlLndyaXRpbmcgPSB0cnVlO1xuICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgaWYgKHdyaXRldikgc3RyZWFtLl93cml0ZXYoY2h1bmssIHN0YXRlLm9ud3JpdGUpO2Vsc2Ugc3RyZWFtLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIHN0YXRlLm9ud3JpdGUpO1xuICBzdGF0ZS5zeW5jID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpIHtcbiAgLS1zdGF0ZS5wZW5kaW5nY2I7XG5cbiAgaWYgKHN5bmMpIHtcbiAgICAvLyBkZWZlciB0aGUgY2FsbGJhY2sgaWYgd2UgYXJlIGJlaW5nIGNhbGxlZCBzeW5jaHJvbm91c2x5XG4gICAgLy8gdG8gYXZvaWQgcGlsaW5nIHVwIHRoaW5ncyBvbiB0aGUgc3RhY2tcbiAgICBwbmEubmV4dFRpY2soY2IsIGVyKTtcbiAgICAvLyB0aGlzIGNhbiBlbWl0IGZpbmlzaCwgYW5kIGl0IHdpbGwgYWx3YXlzIGhhcHBlblxuICAgIC8vIGFmdGVyIGVycm9yXG4gICAgcG5hLm5leHRUaWNrKGZpbmlzaE1heWJlLCBzdHJlYW0sIHN0YXRlKTtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIH0gZWxzZSB7XG4gICAgLy8gdGhlIGNhbGxlciBleHBlY3QgdGhpcyB0byBoYXBwZW4gYmVmb3JlIGlmXG4gICAgLy8gaXQgaXMgYXN5bmNcbiAgICBjYihlcik7XG4gICAgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgIC8vIHRoaXMgY2FuIGVtaXQgZmluaXNoLCBidXQgZmluaXNoIG11c3RcbiAgICAvLyBhbHdheXMgZm9sbG93IGVycm9yXG4gICAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKSB7XG4gIHN0YXRlLndyaXRpbmcgPSBmYWxzZTtcbiAgc3RhdGUud3JpdGVjYiA9IG51bGw7XG4gIHN0YXRlLmxlbmd0aCAtPSBzdGF0ZS53cml0ZWxlbjtcbiAgc3RhdGUud3JpdGVsZW4gPSAwO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlKHN0cmVhbSwgZXIpIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgc3luYyA9IHN0YXRlLnN5bmM7XG4gIHZhciBjYiA9IHN0YXRlLndyaXRlY2I7XG5cbiAgb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKTtcblxuICBpZiAoZXIpIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpO2Vsc2Uge1xuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGFjdHVhbGx5IHJlYWR5IHRvIGZpbmlzaCwgYnV0IGRvbid0IGVtaXQgeWV0XG4gICAgdmFyIGZpbmlzaGVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG5cbiAgICBpZiAoIWZpbmlzaGVkICYmICFzdGF0ZS5jb3JrZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSB7XG4gICAgICBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoc3luYykge1xuICAgICAgLyo8cmVwbGFjZW1lbnQ+Ki9cbiAgICAgIGFzeW5jV3JpdGUoYWZ0ZXJXcml0ZSwgc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICAgIC8qPC9yZXBsYWNlbWVudD4qL1xuICAgIH0gZWxzZSB7XG4gICAgICBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKSB7XG4gIGlmICghZmluaXNoZWQpIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKTtcbiAgc3RhdGUucGVuZGluZ2NiLS07XG4gIGNiKCk7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xufVxuXG4vLyBNdXN0IGZvcmNlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbiBuZXh0VGljaywgc28gdGhhdCB3ZSBkb24ndFxuLy8gZW1pdCAnZHJhaW4nIGJlZm9yZSB0aGUgd3JpdGUoKSBjb25zdW1lciBnZXRzIHRoZSAnZmFsc2UnIHJldHVyblxuLy8gdmFsdWUsIGFuZCBoYXMgYSBjaGFuY2UgdG8gYXR0YWNoIGEgJ2RyYWluJyBsaXN0ZW5lci5cbmZ1bmN0aW9uIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUubmVlZERyYWluKSB7XG4gICAgc3RhdGUubmVlZERyYWluID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2RyYWluJyk7XG4gIH1cbn1cblxuLy8gaWYgdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nLCB0aGVuIHByb2Nlc3MgaXRcbmZ1bmN0aW9uIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IHRydWU7XG4gIHZhciBlbnRyeSA9IHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdDtcblxuICBpZiAoc3RyZWFtLl93cml0ZXYgJiYgZW50cnkgJiYgZW50cnkubmV4dCkge1xuICAgIC8vIEZhc3QgY2FzZSwgd3JpdGUgZXZlcnl0aGluZyB1c2luZyBfd3JpdGV2KClcbiAgICB2YXIgbCA9IHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50O1xuICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXkobCk7XG4gICAgdmFyIGhvbGRlciA9IHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZTtcbiAgICBob2xkZXIuZW50cnkgPSBlbnRyeTtcblxuICAgIHZhciBjb3VudCA9IDA7XG4gICAgdmFyIGFsbEJ1ZmZlcnMgPSB0cnVlO1xuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgYnVmZmVyW2NvdW50XSA9IGVudHJ5O1xuICAgICAgaWYgKCFlbnRyeS5pc0J1ZikgYWxsQnVmZmVycyA9IGZhbHNlO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgY291bnQgKz0gMTtcbiAgICB9XG4gICAgYnVmZmVyLmFsbEJ1ZmZlcnMgPSBhbGxCdWZmZXJzO1xuXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGJ1ZmZlciwgJycsIGhvbGRlci5maW5pc2gpO1xuXG4gICAgLy8gZG9Xcml0ZSBpcyBhbG1vc3QgYWx3YXlzIGFzeW5jLCBkZWZlciB0aGVzZSB0byBzYXZlIGEgYml0IG9mIHRpbWVcbiAgICAvLyBhcyB0aGUgaG90IHBhdGggZW5kcyB3aXRoIGRvV3JpdGVcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgICBpZiAoaG9sZGVyLm5leHQpIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IGhvbGRlci5uZXh0O1xuICAgICAgaG9sZGVyLm5leHQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdChzdGF0ZSk7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBTbG93IGNhc2UsIHdyaXRlIGNodW5rcyBvbmUtYnktb25lXG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2h1bmsgPSBlbnRyeS5jaHVuaztcbiAgICAgIHZhciBlbmNvZGluZyA9IGVudHJ5LmVuY29kaW5nO1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudC0tO1xuICAgICAgLy8gaWYgd2UgZGlkbid0IGNhbGwgdGhlIG9ud3JpdGUgaW1tZWRpYXRlbHksIHRoZW5cbiAgICAgIC8vIGl0IG1lYW5zIHRoYXQgd2UgbmVlZCB0byB3YWl0IHVudGlsIGl0IGRvZXMuXG4gICAgICAvLyBhbHNvLCB0aGF0IG1lYW5zIHRoYXQgdGhlIGNodW5rIGFuZCBjYiBhcmUgY3VycmVudGx5XG4gICAgICAvLyBiZWluZyBwcm9jZXNzZWQsIHNvIG1vdmUgdGhlIGJ1ZmZlciBjb3VudGVyIHBhc3QgdGhlbS5cbiAgICAgIGlmIChzdGF0ZS53cml0aW5nKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbnRyeSA9PT0gbnVsbCkgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIH1cblxuICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPSBlbnRyeTtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobmV3IEVycm9yKCdfd3JpdGUoKSBpcyBub3QgaW1wbGVtZW50ZWQnKSk7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRldiA9IG51bGw7XG5cbldyaXRhYmxlLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmICh0eXBlb2YgY2h1bmsgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGNodW5rO1xuICAgIGNodW5rID0gbnVsbDtcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCkgdGhpcy53cml0ZShjaHVuaywgZW5jb2RpbmcpO1xuXG4gIC8vIC5lbmQoKSBmdWxseSB1bmNvcmtzXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQgPSAxO1xuICAgIHRoaXMudW5jb3JrKCk7XG4gIH1cblxuICAvLyBpZ25vcmUgdW5uZWNlc3NhcnkgZW5kKCkgY2FsbHMuXG4gIGlmICghc3RhdGUuZW5kaW5nKSBlbmRXcml0YWJsZSh0aGlzLCBzdGF0ZSwgY2IpO1xufTtcblxuZnVuY3Rpb24gbmVlZEZpbmlzaChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUuZW5kaW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPT09IG51bGwgJiYgIXN0YXRlLmZpbmlzaGVkICYmICFzdGF0ZS53cml0aW5nO1xufVxuZnVuY3Rpb24gY2FsbEZpbmFsKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RyZWFtLl9maW5hbChmdW5jdGlvbiAoZXJyKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgaWYgKGVycikge1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICB9XG4gICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdwcmVmaW5pc2gnKTtcbiAgICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnByZWZpbmlzaGVkICYmICFzdGF0ZS5maW5hbENhbGxlZCkge1xuICAgIGlmICh0eXBlb2Ygc3RyZWFtLl9maW5hbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgICBzdGF0ZS5maW5hbENhbGxlZCA9IHRydWU7XG4gICAgICBwbmEubmV4dFRpY2soY2FsbEZpbmFsLCBzdHJlYW0sIHN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBuZWVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG4gIGlmIChuZWVkKSB7XG4gICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICAgIGlmIChzdGF0ZS5wZW5kaW5nY2IgPT09IDApIHtcbiAgICAgIHN0YXRlLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lZWQ7XG59XG5cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIHBuYS5uZXh0VGljayhjYik7ZWxzZSBzdHJlYW0ub25jZSgnZmluaXNoJywgY2IpO1xuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9uQ29ya2VkRmluaXNoKGNvcmtSZXEsIHN0YXRlLCBlcnIpIHtcbiAgdmFyIGVudHJ5ID0gY29ya1JlcS5lbnRyeTtcbiAgY29ya1JlcS5lbnRyeSA9IG51bGw7XG4gIHdoaWxlIChlbnRyeSkge1xuICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgIHN0YXRlLnBlbmRpbmdjYi0tO1xuICAgIGNiKGVycik7XG4gICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICB9XG5cbiAgLy8gcmV1c2UgdGhlIGZyZWUgY29ya1JlcS5cbiAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQgPSBjb3JrUmVxO1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnZGVzdHJveWVkJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAvLyB3ZSBpZ25vcmUgdGhlIHZhbHVlIGlmIHRoZSBzdHJlYW1cbiAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XG4gICAgaWYgKCF0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHVzZXIgaXMgZXhwbGljaXRseVxuICAgIC8vIG1hbmFnaW5nIGRlc3Ryb3llZFxuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gIH1cbn0pO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLmRlc3Ryb3k7XG5Xcml0YWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLnVuZGVzdHJveTtcbldyaXRhYmxlLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIHRoaXMuZW5kKCk7XG4gIGNiKGVycik7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8223\n")},5553:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Buffer = (__webpack_require__(1466).Buffer);\nvar util = __webpack_require__(3837);\n\nfunction copyBuffer(src, target, offset) {\n src.copy(target, offset);\n}\n\nmodule.exports = function () {\n function BufferList() {\n _classCallCheck(this, BufferList);\n\n this.head = null;\n this.tail = null;\n this.length = 0;\n }\n\n BufferList.prototype.push = function push(v) {\n var entry = { data: v, next: null };\n if (this.length > 0) this.tail.next = entry;else this.head = entry;\n this.tail = entry;\n ++this.length;\n };\n\n BufferList.prototype.unshift = function unshift(v) {\n var entry = { data: v, next: this.head };\n if (this.length === 0) this.tail = entry;\n this.head = entry;\n ++this.length;\n };\n\n BufferList.prototype.shift = function shift() {\n if (this.length === 0) return;\n var ret = this.head.data;\n if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;\n --this.length;\n return ret;\n };\n\n BufferList.prototype.clear = function clear() {\n this.head = this.tail = null;\n this.length = 0;\n };\n\n BufferList.prototype.join = function join(s) {\n if (this.length === 0) return '';\n var p = this.head;\n var ret = '' + p.data;\n while (p = p.next) {\n ret += s + p.data;\n }return ret;\n };\n\n BufferList.prototype.concat = function concat(n) {\n if (this.length === 0) return Buffer.alloc(0);\n var ret = Buffer.allocUnsafe(n >>> 0);\n var p = this.head;\n var i = 0;\n while (p) {\n copyBuffer(p.data, ret, i);\n i += p.data.length;\n p = p.next;\n }\n return ret;\n };\n\n return BufferList;\n}();\n\nif (util && util.inspect && util.inspect.custom) {\n module.exports.prototype[util.inspect.custom] = function () {\n var obj = util.inspect({ length: this.length });\n return this.constructor.name + ' ' + obj;\n };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU1My5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixrREFBa0QsMENBQTBDOztBQUU1RixhQUFhLGtDQUE2QjtBQUMxQyxXQUFXLG1CQUFPLENBQUMsSUFBTTs7QUFFekI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQixnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLDZCQUE2QixxQkFBcUI7QUFDbEQ7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvYXJjaGl2ZXItdXRpbHMvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9CdWZmZXJMaXN0LmpzP2E2MDEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuZnVuY3Rpb24gY29weUJ1ZmZlcihzcmMsIHRhcmdldCwgb2Zmc2V0KSB7XG4gIHNyYy5jb3B5KHRhcmdldCwgb2Zmc2V0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEJ1ZmZlckxpc3QoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJ1ZmZlckxpc3QpO1xuXG4gICAgdGhpcy5oZWFkID0gbnVsbDtcbiAgICB0aGlzLnRhaWwgPSBudWxsO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgfVxuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiBwdXNoKHYpIHtcbiAgICB2YXIgZW50cnkgPSB7IGRhdGE6IHYsIG5leHQ6IG51bGwgfTtcbiAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB0aGlzLnRhaWwubmV4dCA9IGVudHJ5O2Vsc2UgdGhpcy5oZWFkID0gZW50cnk7XG4gICAgdGhpcy50YWlsID0gZW50cnk7XG4gICAgKyt0aGlzLmxlbmd0aDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gdW5zaGlmdCh2KSB7XG4gICAgdmFyIGVudHJ5ID0geyBkYXRhOiB2LCBuZXh0OiB0aGlzLmhlYWQgfTtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHRoaXMudGFpbCA9IGVudHJ5O1xuICAgIHRoaXMuaGVhZCA9IGVudHJ5O1xuICAgICsrdGhpcy5sZW5ndGg7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUuc2hpZnQgPSBmdW5jdGlvbiBzaGlmdCgpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB2YXIgcmV0ID0gdGhpcy5oZWFkLmRhdGE7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxKSB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsO2Vsc2UgdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHQ7XG4gICAgLS10aGlzLmxlbmd0aDtcbiAgICByZXR1cm4gcmV0O1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIGpvaW4ocykge1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICAgIHZhciBwID0gdGhpcy5oZWFkO1xuICAgIHZhciByZXQgPSAnJyArIHAuZGF0YTtcbiAgICB3aGlsZSAocCA9IHAubmV4dCkge1xuICAgICAgcmV0ICs9IHMgKyBwLmRhdGE7XG4gICAgfXJldHVybiByZXQ7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0KG4pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiBCdWZmZXIuYWxsb2MoMCk7XG4gICAgdmFyIHJldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuID4+PiAwKTtcbiAgICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKHApIHtcbiAgICAgIGNvcHlCdWZmZXIocC5kYXRhLCByZXQsIGkpO1xuICAgICAgaSArPSBwLmRhdGEubGVuZ3RoO1xuICAgICAgcCA9IHAubmV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcblxuICByZXR1cm4gQnVmZmVyTGlzdDtcbn0oKTtcblxuaWYgKHV0aWwgJiYgdXRpbC5pbnNwZWN0ICYmIHV0aWwuaW5zcGVjdC5jdXN0b20pIHtcbiAgbW9kdWxlLmV4cG9ydHMucHJvdG90eXBlW3V0aWwuaW5zcGVjdC5jdXN0b21dID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBvYmogPSB1dGlsLmluc3BlY3QoeyBsZW5ndGg6IHRoaXMubGVuZ3RoIH0pO1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnICcgKyBvYmo7XG4gIH07XG59Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5553\n")},1280:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\n/**/\n\nvar pna = __webpack_require__(8212);\n/**/\n\n// undocumented cb() API, needed for core, not for public API\nfunction destroy(err, cb) {\n var _this = this;\n\n var readableDestroyed = this._readableState && this._readableState.destroyed;\n var writableDestroyed = this._writableState && this._writableState.destroyed;\n\n if (readableDestroyed || writableDestroyed) {\n if (cb) {\n cb(err);\n } else if (err) {\n if (!this._writableState) {\n pna.nextTick(emitErrorNT, this, err);\n } else if (!this._writableState.errorEmitted) {\n this._writableState.errorEmitted = true;\n pna.nextTick(emitErrorNT, this, err);\n }\n }\n\n return this;\n }\n\n // we set destroyed to true before firing error callbacks in order\n // to make it re-entrance safe in case destroy() is called within callbacks\n\n if (this._readableState) {\n this._readableState.destroyed = true;\n }\n\n // if this is a duplex stream mark the writable part as destroyed as well\n if (this._writableState) {\n this._writableState.destroyed = true;\n }\n\n this._destroy(err || null, function (err) {\n if (!cb && err) {\n if (!_this._writableState) {\n pna.nextTick(emitErrorNT, _this, err);\n } else if (!_this._writableState.errorEmitted) {\n _this._writableState.errorEmitted = true;\n pna.nextTick(emitErrorNT, _this, err);\n }\n } else if (cb) {\n cb(err);\n }\n });\n\n return this;\n}\n\nfunction undestroy() {\n if (this._readableState) {\n this._readableState.destroyed = false;\n this._readableState.reading = false;\n this._readableState.ended = false;\n this._readableState.endEmitted = false;\n }\n\n if (this._writableState) {\n this._writableState.destroyed = false;\n this._writableState.ended = false;\n this._writableState.ending = false;\n this._writableState.finalCalled = false;\n this._writableState.prefinished = false;\n this._writableState.finished = false;\n this._writableState.errorEmitted = false;\n }\n}\n\nfunction emitErrorNT(self, err) {\n self.emit('error', err);\n}\n\nmodule.exports = {\n destroy: destroy,\n undestroy: undestroy\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI4MC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjs7QUFFQSxVQUFVLG1CQUFPLENBQUMsSUFBc0I7QUFDeEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9hcmNoaXZlci11dGlscy9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3kuanM/NWZhNyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBwbmEgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8vIHVuZG9jdW1lbnRlZCBjYigpIEFQSSwgbmVlZGVkIGZvciBjb3JlLCBub3QgZm9yIHB1YmxpYyBBUElcbmZ1bmN0aW9uIGRlc3Ryb3koZXJyLCBjYikge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHZhciByZWFkYWJsZURlc3Ryb3llZCA9IHRoaXMuX3JlYWRhYmxlU3RhdGUgJiYgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIHZhciB3cml0YWJsZURlc3Ryb3llZCA9IHRoaXMuX3dyaXRhYmxlU3RhdGUgJiYgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG5cbiAgaWYgKHJlYWRhYmxlRGVzdHJveWVkIHx8IHdyaXRhYmxlRGVzdHJveWVkKSB7XG4gICAgaWYgKGNiKSB7XG4gICAgICBjYihlcnIpO1xuICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICBpZiAoIXRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgICAgcG5hLm5leHRUaWNrKGVtaXRFcnJvck5ULCB0aGlzLCBlcnIpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQpIHtcbiAgICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgICAgICBwbmEubmV4dFRpY2soZW1pdEVycm9yTlQsIHRoaXMsIGVycik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB3ZSBzZXQgZGVzdHJveWVkIHRvIHRydWUgYmVmb3JlIGZpcmluZyBlcnJvciBjYWxsYmFja3MgaW4gb3JkZXJcbiAgLy8gdG8gbWFrZSBpdCByZS1lbnRyYW5jZSBzYWZlIGluIGNhc2UgZGVzdHJveSgpIGlzIGNhbGxlZCB3aXRoaW4gY2FsbGJhY2tzXG5cbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHRydWU7XG4gIH1cblxuICAvLyBpZiB0aGlzIGlzIGEgZHVwbGV4IHN0cmVhbSBtYXJrIHRoZSB3cml0YWJsZSBwYXJ0IGFzIGRlc3Ryb3llZCBhcyB3ZWxsXG4gIGlmICh0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB0cnVlO1xuICB9XG5cbiAgdGhpcy5fZGVzdHJveShlcnIgfHwgbnVsbCwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmICghY2IgJiYgZXJyKSB7XG4gICAgICBpZiAoIV90aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICAgIHBuYS5uZXh0VGljayhlbWl0RXJyb3JOVCwgX3RoaXMsIGVycik7XG4gICAgICB9IGVsc2UgaWYgKCFfdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQpIHtcbiAgICAgICAgX3RoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgcG5hLm5leHRUaWNrKGVtaXRFcnJvck5ULCBfdGhpcywgZXJyKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNiKSB7XG4gICAgICBjYihlcnIpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHRoaXM7XG59XG5cbmZ1bmN0aW9uIHVuZGVzdHJveSgpIHtcbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGlmICh0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmZpbmFsQ2FsbGVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5wcmVmaW5pc2hlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRFcnJvck5UKHNlbGYsIGVycikge1xuICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRlc3Ryb3k6IGRlc3Ryb3ksXG4gIHVuZGVzdHJveTogdW5kZXN0cm95XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1280\n")},1581:(module,__unused_webpack_exports,__webpack_require__)=>{eval("module.exports = __webpack_require__(2781);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU4MS5qcyIsIm1hcHBpbmdzIjoiQUFBQSwwQ0FBa0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9hcmNoaXZlci11dGlscy9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbS5qcz83OTdmIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnc3RyZWFtJyk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1581\n")},9754:(module,exports,__webpack_require__)=>{eval("var Stream = __webpack_require__(2781);\nif (process.env.READABLE_STREAM === 'disable' && Stream) {\n module.exports = Stream;\n exports = module.exports = Stream.Readable;\n exports.Readable = Stream.Readable;\n exports.Writable = Stream.Writable;\n exports.Duplex = Stream.Duplex;\n exports.Transform = Stream.Transform;\n exports.PassThrough = Stream.PassThrough;\n exports.Stream = Stream;\n} else {\n exports = module.exports = __webpack_require__(7190);\n exports.Stream = Stream || exports;\n exports.Readable = exports;\n exports.Writable = __webpack_require__(8223);\n exports.Duplex = __webpack_require__(6106);\n exports.Transform = __webpack_require__(1289);\n exports.PassThrough = __webpack_require__(7592);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTc1NC5qcyIsIm1hcHBpbmdzIjoiQUFBQSxhQUFhLG1CQUFPLENBQUMsSUFBUTtBQUM3QjtBQUNBO0FBQ0E7QUFDQSxFQUFFLGdCQUFnQjtBQUNsQixFQUFFLGdCQUFnQjtBQUNsQixFQUFFLGNBQWM7QUFDaEIsRUFBRSxpQkFBaUI7QUFDbkIsRUFBRSxtQkFBbUI7QUFDckIsRUFBRSxjQUFjO0FBQ2hCLEVBQUU7QUFDRixZQUFZLDBDQUFxRDtBQUNqRSxFQUFFLGNBQWM7QUFDaEIsRUFBRSxnQkFBZ0I7QUFDbEIsRUFBRSw0Q0FBdUQ7QUFDekQsRUFBRSwwQ0FBbUQ7QUFDckQsRUFBRSw2Q0FBeUQ7QUFDM0QsRUFBRSwrQ0FBNkQ7QUFDL0QiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9hcmNoaXZlci11dGlscy9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLmpzPzk4OGEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuaWYgKHByb2Nlc3MuZW52LlJFQURBQkxFX1NUUkVBTSA9PT0gJ2Rpc2FibGUnICYmIFN0cmVhbSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IFN0cmVhbTtcbiAgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gU3RyZWFtLlJlYWRhYmxlO1xuICBleHBvcnRzLlJlYWRhYmxlID0gU3RyZWFtLlJlYWRhYmxlO1xuICBleHBvcnRzLldyaXRhYmxlID0gU3RyZWFtLldyaXRhYmxlO1xuICBleHBvcnRzLkR1cGxleCA9IFN0cmVhbS5EdXBsZXg7XG4gIGV4cG9ydHMuVHJhbnNmb3JtID0gU3RyZWFtLlRyYW5zZm9ybTtcbiAgZXhwb3J0cy5QYXNzVGhyb3VnaCA9IFN0cmVhbS5QYXNzVGhyb3VnaDtcbiAgZXhwb3J0cy5TdHJlYW0gPSBTdHJlYW07XG59IGVsc2Uge1xuICBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzJyk7XG4gIGV4cG9ydHMuU3RyZWFtID0gU3RyZWFtIHx8IGV4cG9ydHM7XG4gIGV4cG9ydHMuUmVhZGFibGUgPSBleHBvcnRzO1xuICBleHBvcnRzLldyaXRhYmxlID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV93cml0YWJsZS5qcycpO1xuICBleHBvcnRzLkR1cGxleCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fZHVwbGV4LmpzJyk7XG4gIGV4cG9ydHMuVHJhbnNmb3JtID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMnKTtcbiAgZXhwb3J0cy5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMnKTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9754\n")},1466:(module,exports,__webpack_require__)=>{eval("/* eslint-disable node/no-deprecated-api */\nvar buffer = __webpack_require__(4300)\nvar Buffer = buffer.Buffer\n\n// alternative to using Object.keys for old browsers\nfunction copyProps (src, dst) {\n for (var key in src) {\n dst[key] = src[key]\n }\n}\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n module.exports = buffer\n} else {\n // Copy properties from require('buffer')\n copyProps(buffer, exports)\n exports.Buffer = SafeBuffer\n}\n\nfunction SafeBuffer (arg, encodingOrOffset, length) {\n return Buffer(arg, encodingOrOffset, length)\n}\n\n// Copy static methods from Buffer\ncopyProps(Buffer, SafeBuffer)\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n if (typeof arg === 'number') {\n throw new TypeError('Argument must not be a number')\n }\n return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n var buf = Buffer(size)\n if (fill !== undefined) {\n if (typeof encoding === 'string') {\n buf.fill(fill, encoding)\n } else {\n buf.fill(fill)\n }\n } else {\n buf.fill(0)\n }\n return buf\n}\n\nSafeBuffer.allocUnsafe = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return Buffer(size)\n}\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return buffer.SlowBuffer(size)\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ2Ni5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBLGFBQWEsbUJBQU8sQ0FBQyxJQUFRO0FBQzdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUUsY0FBYztBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9hcmNoaXZlci11dGlscy9ub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanM/NzY3MiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBub2RlL25vLWRlcHJlY2F0ZWQtYXBpICovXG52YXIgYnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJylcbnZhciBCdWZmZXIgPSBidWZmZXIuQnVmZmVyXG5cbi8vIGFsdGVybmF0aXZlIHRvIHVzaW5nIE9iamVjdC5rZXlzIGZvciBvbGQgYnJvd3NlcnNcbmZ1bmN0aW9uIGNvcHlQcm9wcyAoc3JjLCBkc3QpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgIGRzdFtrZXldID0gc3JjW2tleV1cbiAgfVxufVxuaWYgKEJ1ZmZlci5mcm9tICYmIEJ1ZmZlci5hbGxvYyAmJiBCdWZmZXIuYWxsb2NVbnNhZmUgJiYgQnVmZmVyLmFsbG9jVW5zYWZlU2xvdykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGJ1ZmZlclxufSBlbHNlIHtcbiAgLy8gQ29weSBwcm9wZXJ0aWVzIGZyb20gcmVxdWlyZSgnYnVmZmVyJylcbiAgY29weVByb3BzKGJ1ZmZlciwgZXhwb3J0cylcbiAgZXhwb3J0cy5CdWZmZXIgPSBTYWZlQnVmZmVyXG59XG5cbmZ1bmN0aW9uIFNhZmVCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbi8vIENvcHkgc3RhdGljIG1ldGhvZHMgZnJvbSBCdWZmZXJcbmNvcHlQcm9wcyhCdWZmZXIsIFNhZmVCdWZmZXIpXG5cblNhZmVCdWZmZXIuZnJvbSA9IGZ1bmN0aW9uIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuU2FmZUJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgdmFyIGJ1ZiA9IEJ1ZmZlcihzaXplKVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWYuZmlsbChmaWxsKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBidWYuZmlsbCgwKVxuICB9XG4gIHJldHVybiBidWZcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKHNpemUpXG59XG5cblNhZmVCdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBidWZmZXIuU2xvd0J1ZmZlcihzaXplKVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1466\n")},1198:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\n/**/\n\nvar Buffer = (__webpack_require__(1466).Buffer);\n/**/\n\nvar isEncoding = Buffer.isEncoding || function (encoding) {\n encoding = '' + encoding;\n switch (encoding && encoding.toLowerCase()) {\n case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':\n return true;\n default:\n return false;\n }\n};\n\nfunction _normalizeEncoding(enc) {\n if (!enc) return 'utf8';\n var retried;\n while (true) {\n switch (enc) {\n case 'utf8':\n case 'utf-8':\n return 'utf8';\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return 'utf16le';\n case 'latin1':\n case 'binary':\n return 'latin1';\n case 'base64':\n case 'ascii':\n case 'hex':\n return enc;\n default:\n if (retried) return; // undefined\n enc = ('' + enc).toLowerCase();\n retried = true;\n }\n }\n};\n\n// Do not cache `Buffer.isEncoding` when checking encoding names as some\n// modules monkey-patch it to support additional encodings\nfunction normalizeEncoding(enc) {\n var nenc = _normalizeEncoding(enc);\n if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);\n return nenc || enc;\n}\n\n// StringDecoder provides an interface for efficiently splitting a series of\n// buffers into a series of JS strings without breaking apart multi-byte\n// characters.\nexports.s = StringDecoder;\nfunction StringDecoder(encoding) {\n this.encoding = normalizeEncoding(encoding);\n var nb;\n switch (this.encoding) {\n case 'utf16le':\n this.text = utf16Text;\n this.end = utf16End;\n nb = 4;\n break;\n case 'utf8':\n this.fillLast = utf8FillLast;\n nb = 4;\n break;\n case 'base64':\n this.text = base64Text;\n this.end = base64End;\n nb = 3;\n break;\n default:\n this.write = simpleWrite;\n this.end = simpleEnd;\n return;\n }\n this.lastNeed = 0;\n this.lastTotal = 0;\n this.lastChar = Buffer.allocUnsafe(nb);\n}\n\nStringDecoder.prototype.write = function (buf) {\n if (buf.length === 0) return '';\n var r;\n var i;\n if (this.lastNeed) {\n r = this.fillLast(buf);\n if (r === undefined) return '';\n i = this.lastNeed;\n this.lastNeed = 0;\n } else {\n i = 0;\n }\n if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);\n return r || '';\n};\n\nStringDecoder.prototype.end = utf8End;\n\n// Returns only complete characters in a Buffer\nStringDecoder.prototype.text = utf8Text;\n\n// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer\nStringDecoder.prototype.fillLast = function (buf) {\n if (this.lastNeed <= buf.length) {\n buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);\n return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n }\n buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);\n this.lastNeed -= buf.length;\n};\n\n// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a\n// continuation byte. If an invalid byte is detected, -2 is returned.\nfunction utf8CheckByte(byte) {\n if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;\n return byte >> 6 === 0x02 ? -1 : -2;\n}\n\n// Checks at most 3 bytes at the end of a Buffer in order to detect an\n// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)\n// needed to complete the UTF-8 character (if applicable) are returned.\nfunction utf8CheckIncomplete(self, buf, i) {\n var j = buf.length - 1;\n if (j < i) return 0;\n var nb = utf8CheckByte(buf[j]);\n if (nb >= 0) {\n if (nb > 0) self.lastNeed = nb - 1;\n return nb;\n }\n if (--j < i || nb === -2) return 0;\n nb = utf8CheckByte(buf[j]);\n if (nb >= 0) {\n if (nb > 0) self.lastNeed = nb - 2;\n return nb;\n }\n if (--j < i || nb === -2) return 0;\n nb = utf8CheckByte(buf[j]);\n if (nb >= 0) {\n if (nb > 0) {\n if (nb === 2) nb = 0;else self.lastNeed = nb - 3;\n }\n return nb;\n }\n return 0;\n}\n\n// Validates as many continuation bytes for a multi-byte UTF-8 character as\n// needed or are available. If we see a non-continuation byte where we expect\n// one, we \"replace\" the validated continuation bytes we've seen so far with\n// a single UTF-8 replacement character ('\\ufffd'), to match v8's UTF-8 decoding\n// behavior. The continuation byte check is included three times in the case\n// where all of the continuation bytes for a character exist in the same buffer.\n// It is also done this way as a slight performance increase instead of using a\n// loop.\nfunction utf8CheckExtraBytes(self, buf, p) {\n if ((buf[0] & 0xC0) !== 0x80) {\n self.lastNeed = 0;\n return '\\ufffd';\n }\n if (self.lastNeed > 1 && buf.length > 1) {\n if ((buf[1] & 0xC0) !== 0x80) {\n self.lastNeed = 1;\n return '\\ufffd';\n }\n if (self.lastNeed > 2 && buf.length > 2) {\n if ((buf[2] & 0xC0) !== 0x80) {\n self.lastNeed = 2;\n return '\\ufffd';\n }\n }\n }\n}\n\n// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.\nfunction utf8FillLast(buf) {\n var p = this.lastTotal - this.lastNeed;\n var r = utf8CheckExtraBytes(this, buf, p);\n if (r !== undefined) return r;\n if (this.lastNeed <= buf.length) {\n buf.copy(this.lastChar, p, 0, this.lastNeed);\n return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n }\n buf.copy(this.lastChar, p, 0, buf.length);\n this.lastNeed -= buf.length;\n}\n\n// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a\n// partial character, the character's bytes are buffered until the required\n// number of bytes are available.\nfunction utf8Text(buf, i) {\n var total = utf8CheckIncomplete(this, buf, i);\n if (!this.lastNeed) return buf.toString('utf8', i);\n this.lastTotal = total;\n var end = buf.length - (total - this.lastNeed);\n buf.copy(this.lastChar, 0, end);\n return buf.toString('utf8', i, end);\n}\n\n// For UTF-8, a replacement character is added when ending on a partial\n// character.\nfunction utf8End(buf) {\n var r = buf && buf.length ? this.write(buf) : '';\n if (this.lastNeed) return r + '\\ufffd';\n return r;\n}\n\n// UTF-16LE typically needs two bytes per character, but even if we have an even\n// number of bytes available, we need to check if we end on a leading/high\n// surrogate. In that case, we need to wait for the next two bytes in order to\n// decode the last character properly.\nfunction utf16Text(buf, i) {\n if ((buf.length - i) % 2 === 0) {\n var r = buf.toString('utf16le', i);\n if (r) {\n var c = r.charCodeAt(r.length - 1);\n if (c >= 0xD800 && c <= 0xDBFF) {\n this.lastNeed = 2;\n this.lastTotal = 4;\n this.lastChar[0] = buf[buf.length - 2];\n this.lastChar[1] = buf[buf.length - 1];\n return r.slice(0, -1);\n }\n }\n return r;\n }\n this.lastNeed = 1;\n this.lastTotal = 2;\n this.lastChar[0] = buf[buf.length - 1];\n return buf.toString('utf16le', i, buf.length - 1);\n}\n\n// For UTF-16LE we do not explicitly append special replacement characters if we\n// end on a partial character, we simply let v8 handle that.\nfunction utf16End(buf) {\n var r = buf && buf.length ? this.write(buf) : '';\n if (this.lastNeed) {\n var end = this.lastTotal - this.lastNeed;\n return r + this.lastChar.toString('utf16le', 0, end);\n }\n return r;\n}\n\nfunction base64Text(buf, i) {\n var n = (buf.length - i) % 3;\n if (n === 0) return buf.toString('base64', i);\n this.lastNeed = 3 - n;\n this.lastTotal = 3;\n if (n === 1) {\n this.lastChar[0] = buf[buf.length - 1];\n } else {\n this.lastChar[0] = buf[buf.length - 2];\n this.lastChar[1] = buf[buf.length - 1];\n }\n return buf.toString('base64', i, buf.length - n);\n}\n\nfunction base64End(buf) {\n var r = buf && buf.length ? this.write(buf) : '';\n if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);\n return r;\n}\n\n// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)\nfunction simpleWrite(buf) {\n return buf.toString(this.encoding);\n}\n\nfunction simpleEnd(buf) {\n return buf && buf.length ? this.write(buf) : '';\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE5OC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViOztBQUVBLGFBQWEsa0NBQTZCO0FBQzFDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLHNDQUFzQyxzQ0FBc0M7QUFDekc7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvYXJjaGl2ZXItdXRpbHMvbm9kZV9tb2R1bGVzL3N0cmluZ19kZWNvZGVyL2xpYi9zdHJpbmdfZGVjb2Rlci5qcz8yYTQ2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgaXNFbmNvZGluZyA9IEJ1ZmZlci5pc0VuY29kaW5nIHx8IGZ1bmN0aW9uIChlbmNvZGluZykge1xuICBlbmNvZGluZyA9ICcnICsgZW5jb2Rpbmc7XG4gIHN3aXRjaCAoZW5jb2RpbmcgJiYgZW5jb2RpbmcudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6Y2FzZSAndXRmOCc6Y2FzZSAndXRmLTgnOmNhc2UgJ2FzY2lpJzpjYXNlICdiaW5hcnknOmNhc2UgJ2Jhc2U2NCc6Y2FzZSAndWNzMic6Y2FzZSAndWNzLTInOmNhc2UgJ3V0ZjE2bGUnOmNhc2UgJ3V0Zi0xNmxlJzpjYXNlICdyYXcnOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gX25vcm1hbGl6ZUVuY29kaW5nKGVuYykge1xuICBpZiAoIWVuYykgcmV0dXJuICd1dGY4JztcbiAgdmFyIHJldHJpZWQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmMpIHtcbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gJ3V0ZjgnO1xuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuICd1dGYxNmxlJztcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gJ2xhdGluMSc7XG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGVuYztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChyZXRyaWVkKSByZXR1cm47IC8vIHVuZGVmaW5lZFxuICAgICAgICBlbmMgPSAoJycgKyBlbmMpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHJpZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufTtcblxuLy8gRG8gbm90IGNhY2hlIGBCdWZmZXIuaXNFbmNvZGluZ2Agd2hlbiBjaGVja2luZyBlbmNvZGluZyBuYW1lcyBhcyBzb21lXG4vLyBtb2R1bGVzIG1vbmtleS1wYXRjaCBpdCB0byBzdXBwb3J0IGFkZGl0aW9uYWwgZW5jb2RpbmdzXG5mdW5jdGlvbiBub3JtYWxpemVFbmNvZGluZyhlbmMpIHtcbiAgdmFyIG5lbmMgPSBfbm9ybWFsaXplRW5jb2RpbmcoZW5jKTtcbiAgaWYgKHR5cGVvZiBuZW5jICE9PSAnc3RyaW5nJyAmJiAoQnVmZmVyLmlzRW5jb2RpbmcgPT09IGlzRW5jb2RpbmcgfHwgIWlzRW5jb2RpbmcoZW5jKSkpIHRocm93IG5ldyBFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuYyk7XG4gIHJldHVybiBuZW5jIHx8IGVuYztcbn1cblxuLy8gU3RyaW5nRGVjb2RlciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGVmZmljaWVudGx5IHNwbGl0dGluZyBhIHNlcmllcyBvZlxuLy8gYnVmZmVycyBpbnRvIGEgc2VyaWVzIG9mIEpTIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBhcGFydCBtdWx0aS1ieXRlXG4vLyBjaGFyYWN0ZXJzLlxuZXhwb3J0cy5TdHJpbmdEZWNvZGVyID0gU3RyaW5nRGVjb2RlcjtcbmZ1bmN0aW9uIFN0cmluZ0RlY29kZXIoZW5jb2RpbmcpIHtcbiAgdGhpcy5lbmNvZGluZyA9IG5vcm1hbGl6ZUVuY29kaW5nKGVuY29kaW5nKTtcbiAgdmFyIG5iO1xuICBzd2l0Y2ggKHRoaXMuZW5jb2RpbmcpIHtcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIHRoaXMudGV4dCA9IHV0ZjE2VGV4dDtcbiAgICAgIHRoaXMuZW5kID0gdXRmMTZFbmQ7XG4gICAgICBuYiA9IDQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd1dGY4JzpcbiAgICAgIHRoaXMuZmlsbExhc3QgPSB1dGY4RmlsbExhc3Q7XG4gICAgICBuYiA9IDQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgdGhpcy50ZXh0ID0gYmFzZTY0VGV4dDtcbiAgICAgIHRoaXMuZW5kID0gYmFzZTY0RW5kO1xuICAgICAgbmIgPSAzO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMud3JpdGUgPSBzaW1wbGVXcml0ZTtcbiAgICAgIHRoaXMuZW5kID0gc2ltcGxlRW5kO1xuICAgICAgcmV0dXJuO1xuICB9XG4gIHRoaXMubGFzdE5lZWQgPSAwO1xuICB0aGlzLmxhc3RUb3RhbCA9IDA7XG4gIHRoaXMubGFzdENoYXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobmIpO1xufVxuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChidWYpIHtcbiAgaWYgKGJ1Zi5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgdmFyIHI7XG4gIHZhciBpO1xuICBpZiAodGhpcy5sYXN0TmVlZCkge1xuICAgIHIgPSB0aGlzLmZpbGxMYXN0KGJ1Zik7XG4gICAgaWYgKHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuICcnO1xuICAgIGkgPSB0aGlzLmxhc3ROZWVkO1xuICAgIHRoaXMubGFzdE5lZWQgPSAwO1xuICB9IGVsc2Uge1xuICAgIGkgPSAwO1xuICB9XG4gIGlmIChpIDwgYnVmLmxlbmd0aCkgcmV0dXJuIHIgPyByICsgdGhpcy50ZXh0KGJ1ZiwgaSkgOiB0aGlzLnRleHQoYnVmLCBpKTtcbiAgcmV0dXJuIHIgfHwgJyc7XG59O1xuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSB1dGY4RW5kO1xuXG4vLyBSZXR1cm5zIG9ubHkgY29tcGxldGUgY2hhcmFjdGVycyBpbiBhIEJ1ZmZlclxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUudGV4dCA9IHV0ZjhUZXh0O1xuXG4vLyBBdHRlbXB0cyB0byBjb21wbGV0ZSBhIHBhcnRpYWwgbm9uLVVURi04IGNoYXJhY3RlciB1c2luZyBieXRlcyBmcm9tIGEgQnVmZmVyXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5maWxsTGFzdCA9IGZ1bmN0aW9uIChidWYpIHtcbiAgaWYgKHRoaXMubGFzdE5lZWQgPD0gYnVmLmxlbmd0aCkge1xuICAgIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZCwgMCwgdGhpcy5sYXN0TmVlZCk7XG4gICAgcmV0dXJuIHRoaXMubGFzdENoYXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywgMCwgdGhpcy5sYXN0VG90YWwpO1xuICB9XG4gIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZCwgMCwgYnVmLmxlbmd0aCk7XG4gIHRoaXMubGFzdE5lZWQgLT0gYnVmLmxlbmd0aDtcbn07XG5cbi8vIENoZWNrcyB0aGUgdHlwZSBvZiBhIFVURi04IGJ5dGUsIHdoZXRoZXIgaXQncyBBU0NJSSwgYSBsZWFkaW5nIGJ5dGUsIG9yIGFcbi8vIGNvbnRpbnVhdGlvbiBieXRlLiBJZiBhbiBpbnZhbGlkIGJ5dGUgaXMgZGV0ZWN0ZWQsIC0yIGlzIHJldHVybmVkLlxuZnVuY3Rpb24gdXRmOENoZWNrQnl0ZShieXRlKSB7XG4gIGlmIChieXRlIDw9IDB4N0YpIHJldHVybiAwO2Vsc2UgaWYgKGJ5dGUgPj4gNSA9PT0gMHgwNikgcmV0dXJuIDI7ZWxzZSBpZiAoYnl0ZSA+PiA0ID09PSAweDBFKSByZXR1cm4gMztlbHNlIGlmIChieXRlID4+IDMgPT09IDB4MUUpIHJldHVybiA0O1xuICByZXR1cm4gYnl0ZSA+PiA2ID09PSAweDAyID8gLTEgOiAtMjtcbn1cblxuLy8gQ2hlY2tzIGF0IG1vc3QgMyBieXRlcyBhdCB0aGUgZW5kIG9mIGEgQnVmZmVyIGluIG9yZGVyIHRvIGRldGVjdCBhblxuLy8gaW5jb21wbGV0ZSBtdWx0aS1ieXRlIFVURi04IGNoYXJhY3Rlci4gVGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyAoMiwgMywgb3IgNClcbi8vIG5lZWRlZCB0byBjb21wbGV0ZSB0aGUgVVRGLTggY2hhcmFjdGVyIChpZiBhcHBsaWNhYmxlKSBhcmUgcmV0dXJuZWQuXG5mdW5jdGlvbiB1dGY4Q2hlY2tJbmNvbXBsZXRlKHNlbGYsIGJ1ZiwgaSkge1xuICB2YXIgaiA9IGJ1Zi5sZW5ndGggLSAxO1xuICBpZiAoaiA8IGkpIHJldHVybiAwO1xuICB2YXIgbmIgPSB1dGY4Q2hlY2tCeXRlKGJ1ZltqXSk7XG4gIGlmIChuYiA+PSAwKSB7XG4gICAgaWYgKG5iID4gMCkgc2VsZi5sYXN0TmVlZCA9IG5iIC0gMTtcbiAgICByZXR1cm4gbmI7XG4gIH1cbiAgaWYgKC0taiA8IGkgfHwgbmIgPT09IC0yKSByZXR1cm4gMDtcbiAgbmIgPSB1dGY4Q2hlY2tCeXRlKGJ1ZltqXSk7XG4gIGlmIChuYiA+PSAwKSB7XG4gICAgaWYgKG5iID4gMCkgc2VsZi5sYXN0TmVlZCA9IG5iIC0gMjtcbiAgICByZXR1cm4gbmI7XG4gIH1cbiAgaWYgKC0taiA8IGkgfHwgbmIgPT09IC0yKSByZXR1cm4gMDtcbiAgbmIgPSB1dGY4Q2hlY2tCeXRlKGJ1ZltqXSk7XG4gIGlmIChuYiA+PSAwKSB7XG4gICAgaWYgKG5iID4gMCkge1xuICAgICAgaWYgKG5iID09PSAyKSBuYiA9IDA7ZWxzZSBzZWxmLmxhc3ROZWVkID0gbmIgLSAzO1xuICAgIH1cbiAgICByZXR1cm4gbmI7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vIFZhbGlkYXRlcyBhcyBtYW55IGNvbnRpbnVhdGlvbiBieXRlcyBmb3IgYSBtdWx0aS1ieXRlIFVURi04IGNoYXJhY3RlciBhc1xuLy8gbmVlZGVkIG9yIGFyZSBhdmFpbGFibGUuIElmIHdlIHNlZSBhIG5vbi1jb250aW51YXRpb24gYnl0ZSB3aGVyZSB3ZSBleHBlY3Rcbi8vIG9uZSwgd2UgXCJyZXBsYWNlXCIgdGhlIHZhbGlkYXRlZCBjb250aW51YXRpb24gYnl0ZXMgd2UndmUgc2VlbiBzbyBmYXIgd2l0aFxuLy8gYSBzaW5nbGUgVVRGLTggcmVwbGFjZW1lbnQgY2hhcmFjdGVyICgnXFx1ZmZmZCcpLCB0byBtYXRjaCB2OCdzIFVURi04IGRlY29kaW5nXG4vLyBiZWhhdmlvci4gVGhlIGNvbnRpbnVhdGlvbiBieXRlIGNoZWNrIGlzIGluY2x1ZGVkIHRocmVlIHRpbWVzIGluIHRoZSBjYXNlXG4vLyB3aGVyZSBhbGwgb2YgdGhlIGNvbnRpbnVhdGlvbiBieXRlcyBmb3IgYSBjaGFyYWN0ZXIgZXhpc3QgaW4gdGhlIHNhbWUgYnVmZmVyLlxuLy8gSXQgaXMgYWxzbyBkb25lIHRoaXMgd2F5IGFzIGEgc2xpZ2h0IHBlcmZvcm1hbmNlIGluY3JlYXNlIGluc3RlYWQgb2YgdXNpbmcgYVxuLy8gbG9vcC5cbmZ1bmN0aW9uIHV0ZjhDaGVja0V4dHJhQnl0ZXMoc2VsZiwgYnVmLCBwKSB7XG4gIGlmICgoYnVmWzBdICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICBzZWxmLmxhc3ROZWVkID0gMDtcbiAgICByZXR1cm4gJ1xcdWZmZmQnO1xuICB9XG4gIGlmIChzZWxmLmxhc3ROZWVkID4gMSAmJiBidWYubGVuZ3RoID4gMSkge1xuICAgIGlmICgoYnVmWzFdICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgIHNlbGYubGFzdE5lZWQgPSAxO1xuICAgICAgcmV0dXJuICdcXHVmZmZkJztcbiAgICB9XG4gICAgaWYgKHNlbGYubGFzdE5lZWQgPiAyICYmIGJ1Zi5sZW5ndGggPiAyKSB7XG4gICAgICBpZiAoKGJ1ZlsyXSAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgIHNlbGYubGFzdE5lZWQgPSAyO1xuICAgICAgICByZXR1cm4gJ1xcdWZmZmQnO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBBdHRlbXB0cyB0byBjb21wbGV0ZSBhIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyIHVzaW5nIGJ5dGVzIGZyb20gYSBCdWZmZXIuXG5mdW5jdGlvbiB1dGY4RmlsbExhc3QoYnVmKSB7XG4gIHZhciBwID0gdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkO1xuICB2YXIgciA9IHV0ZjhDaGVja0V4dHJhQnl0ZXModGhpcywgYnVmLCBwKTtcbiAgaWYgKHIgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHI7XG4gIGlmICh0aGlzLmxhc3ROZWVkIDw9IGJ1Zi5sZW5ndGgpIHtcbiAgICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCBwLCAwLCB0aGlzLmxhc3ROZWVkKTtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCB0aGlzLmxhc3RUb3RhbCk7XG4gIH1cbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgcCwgMCwgYnVmLmxlbmd0aCk7XG4gIHRoaXMubGFzdE5lZWQgLT0gYnVmLmxlbmd0aDtcbn1cblxuLy8gUmV0dXJucyBhbGwgY29tcGxldGUgVVRGLTggY2hhcmFjdGVycyBpbiBhIEJ1ZmZlci4gSWYgdGhlIEJ1ZmZlciBlbmRlZCBvbiBhXG4vLyBwYXJ0aWFsIGNoYXJhY3RlciwgdGhlIGNoYXJhY3RlcidzIGJ5dGVzIGFyZSBidWZmZXJlZCB1bnRpbCB0aGUgcmVxdWlyZWRcbi8vIG51bWJlciBvZiBieXRlcyBhcmUgYXZhaWxhYmxlLlxuZnVuY3Rpb24gdXRmOFRleHQoYnVmLCBpKSB7XG4gIHZhciB0b3RhbCA9IHV0ZjhDaGVja0luY29tcGxldGUodGhpcywgYnVmLCBpKTtcbiAgaWYgKCF0aGlzLmxhc3ROZWVkKSByZXR1cm4gYnVmLnRvU3RyaW5nKCd1dGY4JywgaSk7XG4gIHRoaXMubGFzdFRvdGFsID0gdG90YWw7XG4gIHZhciBlbmQgPSBidWYubGVuZ3RoIC0gKHRvdGFsIC0gdGhpcy5sYXN0TmVlZCk7XG4gIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIDAsIGVuZCk7XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjgnLCBpLCBlbmQpO1xufVxuXG4vLyBGb3IgVVRGLTgsIGEgcmVwbGFjZW1lbnQgY2hhcmFjdGVyIGlzIGFkZGVkIHdoZW4gZW5kaW5nIG9uIGEgcGFydGlhbFxuLy8gY2hhcmFjdGVyLlxuZnVuY3Rpb24gdXRmOEVuZChidWYpIHtcbiAgdmFyIHIgPSBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xuICBpZiAodGhpcy5sYXN0TmVlZCkgcmV0dXJuIHIgKyAnXFx1ZmZmZCc7XG4gIHJldHVybiByO1xufVxuXG4vLyBVVEYtMTZMRSB0eXBpY2FsbHkgbmVlZHMgdHdvIGJ5dGVzIHBlciBjaGFyYWN0ZXIsIGJ1dCBldmVuIGlmIHdlIGhhdmUgYW4gZXZlblxuLy8gbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSwgd2UgbmVlZCB0byBjaGVjayBpZiB3ZSBlbmQgb24gYSBsZWFkaW5nL2hpZ2hcbi8vIHN1cnJvZ2F0ZS4gSW4gdGhhdCBjYXNlLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBuZXh0IHR3byBieXRlcyBpbiBvcmRlciB0b1xuLy8gZGVjb2RlIHRoZSBsYXN0IGNoYXJhY3RlciBwcm9wZXJseS5cbmZ1bmN0aW9uIHV0ZjE2VGV4dChidWYsIGkpIHtcbiAgaWYgKChidWYubGVuZ3RoIC0gaSkgJSAyID09PSAwKSB7XG4gICAgdmFyIHIgPSBidWYudG9TdHJpbmcoJ3V0ZjE2bGUnLCBpKTtcbiAgICBpZiAocikge1xuICAgICAgdmFyIGMgPSByLmNoYXJDb2RlQXQoci5sZW5ndGggLSAxKTtcbiAgICAgIGlmIChjID49IDB4RDgwMCAmJiBjIDw9IDB4REJGRikge1xuICAgICAgICB0aGlzLmxhc3ROZWVkID0gMjtcbiAgICAgICAgdGhpcy5sYXN0VG90YWwgPSA0O1xuICAgICAgICB0aGlzLmxhc3RDaGFyWzBdID0gYnVmW2J1Zi5sZW5ndGggLSAyXTtcbiAgICAgICAgdGhpcy5sYXN0Q2hhclsxXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiByLnNsaWNlKDAsIC0xKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgdGhpcy5sYXN0TmVlZCA9IDE7XG4gIHRoaXMubGFzdFRvdGFsID0gMjtcbiAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjE2bGUnLCBpLCBidWYubGVuZ3RoIC0gMSk7XG59XG5cbi8vIEZvciBVVEYtMTZMRSB3ZSBkbyBub3QgZXhwbGljaXRseSBhcHBlbmQgc3BlY2lhbCByZXBsYWNlbWVudCBjaGFyYWN0ZXJzIGlmIHdlXG4vLyBlbmQgb24gYSBwYXJ0aWFsIGNoYXJhY3Rlciwgd2Ugc2ltcGx5IGxldCB2OCBoYW5kbGUgdGhhdC5cbmZ1bmN0aW9uIHV0ZjE2RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSB7XG4gICAgdmFyIGVuZCA9IHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZDtcbiAgICByZXR1cm4gciArIHRoaXMubGFzdENoYXIudG9TdHJpbmcoJ3V0ZjE2bGUnLCAwLCBlbmQpO1xuICB9XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBiYXNlNjRUZXh0KGJ1ZiwgaSkge1xuICB2YXIgbiA9IChidWYubGVuZ3RoIC0gaSkgJSAzO1xuICBpZiAobiA9PT0gMCkgcmV0dXJuIGJ1Zi50b1N0cmluZygnYmFzZTY0JywgaSk7XG4gIHRoaXMubGFzdE5lZWQgPSAzIC0gbjtcbiAgdGhpcy5sYXN0VG90YWwgPSAzO1xuICBpZiAobiA9PT0gMSkge1xuICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDJdO1xuICAgIHRoaXMubGFzdENoYXJbMV0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICB9XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ2Jhc2U2NCcsIGksIGJ1Zi5sZW5ndGggLSBuKTtcbn1cblxuZnVuY3Rpb24gYmFzZTY0RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSByZXR1cm4gciArIHRoaXMubGFzdENoYXIudG9TdHJpbmcoJ2Jhc2U2NCcsIDAsIDMgLSB0aGlzLmxhc3ROZWVkKTtcbiAgcmV0dXJuIHI7XG59XG5cbi8vIFBhc3MgYnl0ZXMgb24gdGhyb3VnaCBmb3Igc2luZ2xlLWJ5dGUgZW5jb2RpbmdzIChlLmcuIGFzY2lpLCBsYXRpbjEsIGhleClcbmZ1bmN0aW9uIHNpbXBsZVdyaXRlKGJ1Zikge1xuICByZXR1cm4gYnVmLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xufVxuXG5mdW5jdGlvbiBzaW1wbGVFbmQoYnVmKSB7XG4gIHJldHVybiBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xufSJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1198\n")},3861:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * Archiver Vending\n *\n * @ignore\n * @license [MIT]{@link https://github.com/archiverjs/node-archiver/blob/master/LICENSE}\n * @copyright (c) 2012-2014 Chris Talkington, contributors.\n */\nvar Archiver = __webpack_require__(9878);\n\nvar formats = {};\n\n/**\n * Dispenses a new Archiver instance.\n *\n * @constructor\n * @param {String} format The archive format to use.\n * @param {Object} options See [Archiver]{@link Archiver}\n * @return {Archiver}\n */\nvar vending = function(format, options) {\n return vending.create(format, options);\n};\n\n/**\n * Creates a new Archiver instance.\n *\n * @param {String} format The archive format to use.\n * @param {Object} options See [Archiver]{@link Archiver}\n * @return {Archiver}\n */\nvending.create = function(format, options) {\n if (formats[format]) {\n var instance = new Archiver(format, options);\n instance.setFormat(format);\n instance.setModule(new formats[format](options));\n\n return instance;\n } else {\n throw new Error('create(' + format + '): format not registered');\n }\n};\n\n/**\n * Registers a format for use with archiver.\n *\n * @param {String} format The name of the format.\n * @param {Function} module The function for archiver to interact with.\n * @return void\n */\nvending.registerFormat = function(format, module) {\n if (formats[format]) {\n throw new Error('register(' + format + '): format already registered');\n }\n\n if (typeof module !== 'function') {\n throw new Error('register(' + format + '): format module invalid');\n }\n\n if (typeof module.prototype.append !== 'function' || typeof module.prototype.finalize !== 'function') {\n throw new Error('register(' + format + '): format module missing methods');\n }\n\n formats[format] = module;\n};\n\n/**\n * Check if the format is already registered.\n * \n * @param {String} format the name of the format.\n * @return boolean\n */\nvending.isRegisteredFormat = function (format) {\n if (formats[format]) {\n return true;\n }\n \n return false;\n};\n\nvending.registerFormat('zip', __webpack_require__(907));\nvending.registerFormat('tar', __webpack_require__(62));\nvending.registerFormat('json', __webpack_require__(1072));\n\nmodule.exports = vending;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg2MS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EsZUFBZSxtQkFBTyxDQUFDLElBQVk7O0FBRW5DOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCLFlBQVksUUFBUSx1QkFBdUI7QUFDM0MsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQixZQUFZLFFBQVEsdUJBQXVCO0FBQzNDLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQixZQUFZLFVBQVU7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDhCQUE4QixtQkFBTyxDQUFDLEdBQW1CO0FBQ3pELDhCQUE4QixtQkFBTyxDQUFDLEVBQW1CO0FBQ3pELCtCQUErQixtQkFBTyxDQUFDLElBQW9COztBQUUzRCIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2FyY2hpdmVyL2luZGV4LmpzPzYzZGUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcmNoaXZlciBWZW5kaW5nXG4gKlxuICogQGlnbm9yZVxuICogQGxpY2Vuc2UgW01JVF17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1hcmNoaXZlci9ibG9iL21hc3Rlci9MSUNFTlNFfVxuICogQGNvcHlyaWdodCAoYykgMjAxMi0yMDE0IENocmlzIFRhbGtpbmd0b24sIGNvbnRyaWJ1dG9ycy5cbiAqL1xudmFyIEFyY2hpdmVyID0gcmVxdWlyZSgnLi9saWIvY29yZScpO1xuXG52YXIgZm9ybWF0cyA9IHt9O1xuXG4vKipcbiAqIERpc3BlbnNlcyBhIG5ldyBBcmNoaXZlciBpbnN0YW5jZS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSAge1N0cmluZ30gZm9ybWF0IFRoZSBhcmNoaXZlIGZvcm1hdCB0byB1c2UuXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnMgU2VlIFtBcmNoaXZlcl17QGxpbmsgQXJjaGl2ZXJ9XG4gKiBAcmV0dXJuIHtBcmNoaXZlcn1cbiAqL1xudmFyIHZlbmRpbmcgPSBmdW5jdGlvbihmb3JtYXQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHZlbmRpbmcuY3JlYXRlKGZvcm1hdCwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgQXJjaGl2ZXIgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBmb3JtYXQgVGhlIGFyY2hpdmUgZm9ybWF0IHRvIHVzZS5cbiAqIEBwYXJhbSAge09iamVjdH0gb3B0aW9ucyBTZWUgW0FyY2hpdmVyXXtAbGluayBBcmNoaXZlcn1cbiAqIEByZXR1cm4ge0FyY2hpdmVyfVxuICovXG52ZW5kaW5nLmNyZWF0ZSA9IGZ1bmN0aW9uKGZvcm1hdCwgb3B0aW9ucykge1xuICBpZiAoZm9ybWF0c1tmb3JtYXRdKSB7XG4gICAgdmFyIGluc3RhbmNlID0gbmV3IEFyY2hpdmVyKGZvcm1hdCwgb3B0aW9ucyk7XG4gICAgaW5zdGFuY2Uuc2V0Rm9ybWF0KGZvcm1hdCk7XG4gICAgaW5zdGFuY2Uuc2V0TW9kdWxlKG5ldyBmb3JtYXRzW2Zvcm1hdF0ob3B0aW9ucykpO1xuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignY3JlYXRlKCcgKyBmb3JtYXQgKyAnKTogZm9ybWF0IG5vdCByZWdpc3RlcmVkJyk7XG4gIH1cbn07XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgZm9ybWF0IGZvciB1c2Ugd2l0aCBhcmNoaXZlci5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGZvcm1hdCBUaGUgbmFtZSBvZiB0aGUgZm9ybWF0LlxuICogQHBhcmFtICB7RnVuY3Rpb259IG1vZHVsZSBUaGUgZnVuY3Rpb24gZm9yIGFyY2hpdmVyIHRvIGludGVyYWN0IHdpdGguXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xudmVuZGluZy5yZWdpc3RlckZvcm1hdCA9IGZ1bmN0aW9uKGZvcm1hdCwgbW9kdWxlKSB7XG4gIGlmIChmb3JtYXRzW2Zvcm1hdF0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlZ2lzdGVyKCcgKyBmb3JtYXQgKyAnKTogZm9ybWF0IGFscmVhZHkgcmVnaXN0ZXJlZCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlZ2lzdGVyKCcgKyBmb3JtYXQgKyAnKTogZm9ybWF0IG1vZHVsZSBpbnZhbGlkJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIG1vZHVsZS5wcm90b3R5cGUuYXBwZW5kICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBtb2R1bGUucHJvdG90eXBlLmZpbmFsaXplICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZWdpc3RlcignICsgZm9ybWF0ICsgJyk6IGZvcm1hdCBtb2R1bGUgbWlzc2luZyBtZXRob2RzJyk7XG4gIH1cblxuICBmb3JtYXRzW2Zvcm1hdF0gPSBtb2R1bGU7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBmb3JtYXQgaXMgYWxyZWFkeSByZWdpc3RlcmVkLlxuICogXG4gKiBAcGFyYW0ge1N0cmluZ30gZm9ybWF0IHRoZSBuYW1lIG9mIHRoZSBmb3JtYXQuXG4gKiBAcmV0dXJuIGJvb2xlYW5cbiAqL1xudmVuZGluZy5pc1JlZ2lzdGVyZWRGb3JtYXQgPSBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gIGlmIChmb3JtYXRzW2Zvcm1hdF0pIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxudmVuZGluZy5yZWdpc3RlckZvcm1hdCgnemlwJywgcmVxdWlyZSgnLi9saWIvcGx1Z2lucy96aXAnKSk7XG52ZW5kaW5nLnJlZ2lzdGVyRm9ybWF0KCd0YXInLCByZXF1aXJlKCcuL2xpYi9wbHVnaW5zL3RhcicpKTtcbnZlbmRpbmcucmVnaXN0ZXJGb3JtYXQoJ2pzb24nLCByZXF1aXJlKCcuL2xpYi9wbHVnaW5zL2pzb24nKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gdmVuZGluZzsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3861\n")},9878:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * Archiver Core\n *\n * @ignore\n * @license [MIT]{@link https://github.com/archiverjs/node-archiver/blob/master/LICENSE}\n * @copyright (c) 2012-2014 Chris Talkington, contributors.\n */\nvar fs = __webpack_require__(7147);\nvar glob = __webpack_require__(2141);\nvar async = __webpack_require__(1641);\nvar path = __webpack_require__(1017);\nvar util = __webpack_require__(3672);\n\nvar inherits = (__webpack_require__(3837).inherits);\nvar ArchiverError = __webpack_require__(1175);\nvar Transform = (__webpack_require__(1451).Transform);\n\nvar win32 = process.platform === 'win32';\n\n/**\n * @constructor\n * @param {String} format The archive format to use.\n * @param {(CoreOptions|TransformOptions)} options See also {@link ZipOptions} and {@link TarOptions}.\n */\nvar Archiver = function(format, options) {\n if (!(this instanceof Archiver)) {\n return new Archiver(format, options);\n }\n\n if (typeof format !== 'string') {\n options = format;\n format = 'zip';\n }\n\n options = this.options = util.defaults(options, {\n highWaterMark: 1024 * 1024,\n statConcurrency: 4\n });\n\n Transform.call(this, options);\n\n this._format = false;\n this._module = false;\n this._pending = 0;\n this._pointer = 0;\n\n this._entriesCount = 0;\n this._entriesProcessedCount = 0;\n this._fsEntriesTotalBytes = 0;\n this._fsEntriesProcessedBytes = 0;\n\n this._queue = async.queue(this._onQueueTask.bind(this), 1);\n this._queue.drain(this._onQueueDrain.bind(this));\n\n this._statQueue = async.queue(this._onStatQueueTask.bind(this), options.statConcurrency);\n this._statQueue.drain(this._onQueueDrain.bind(this));\n\n this._state = {\n aborted: false,\n finalize: false,\n finalizing: false,\n finalized: false,\n modulePiped: false\n };\n\n this._streams = [];\n};\n\ninherits(Archiver, Transform);\n\n/**\n * Internal logic for `abort`.\n *\n * @private\n * @return void\n */\nArchiver.prototype._abort = function() {\n this._state.aborted = true;\n this._queue.kill();\n this._statQueue.kill();\n\n if (this._queue.idle()) {\n this._shutdown();\n }\n};\n\n/**\n * Internal helper for appending files.\n *\n * @private\n * @param {String} filepath The source filepath.\n * @param {EntryData} data The entry data.\n * @return void\n */\nArchiver.prototype._append = function(filepath, data) {\n data = data || {};\n\n var task = {\n source: null,\n filepath: filepath\n };\n\n if (!data.name) {\n data.name = filepath;\n }\n\n data.sourcePath = filepath;\n task.data = data;\n this._entriesCount++;\n\n if (data.stats && data.stats instanceof fs.Stats) {\n task = this._updateQueueTaskWithStats(task, data.stats);\n if (task) {\n if (data.stats.size) {\n this._fsEntriesTotalBytes += data.stats.size;\n }\n\n this._queue.push(task);\n }\n } else {\n this._statQueue.push(task);\n }\n};\n\n/**\n * Internal logic for `finalize`.\n *\n * @private\n * @return void\n */\nArchiver.prototype._finalize = function() {\n if (this._state.finalizing || this._state.finalized || this._state.aborted) {\n return;\n }\n\n this._state.finalizing = true;\n\n this._moduleFinalize();\n\n this._state.finalizing = false;\n this._state.finalized = true;\n};\n\n/**\n * Checks the various state variables to determine if we can `finalize`.\n *\n * @private\n * @return {Boolean}\n */\nArchiver.prototype._maybeFinalize = function() {\n if (this._state.finalizing || this._state.finalized || this._state.aborted) {\n return false;\n }\n\n if (this._state.finalize && this._pending === 0 && this._queue.idle() && this._statQueue.idle()) {\n this._finalize();\n return true;\n }\n\n return false;\n};\n\n/**\n * Appends an entry to the module.\n *\n * @private\n * @fires Archiver#entry\n * @param {(Buffer|Stream)} source\n * @param {EntryData} data\n * @param {Function} callback\n * @return void\n */\nArchiver.prototype._moduleAppend = function(source, data, callback) {\n if (this._state.aborted) {\n callback();\n return;\n }\n\n this._module.append(source, data, function(err) {\n this._task = null;\n\n if (this._state.aborted) {\n this._shutdown();\n return;\n }\n\n if (err) {\n this.emit('error', err);\n setImmediate(callback);\n return;\n }\n\n /**\n * Fires when the entry's input has been processed and appended to the archive.\n *\n * @event Archiver#entry\n * @type {EntryData}\n */\n this.emit('entry', data);\n this._entriesProcessedCount++;\n\n if (data.stats && data.stats.size) {\n this._fsEntriesProcessedBytes += data.stats.size;\n }\n\n /**\n * @event Archiver#progress\n * @type {ProgressData}\n */\n this.emit('progress', {\n entries: {\n total: this._entriesCount,\n processed: this._entriesProcessedCount\n },\n fs: {\n totalBytes: this._fsEntriesTotalBytes,\n processedBytes: this._fsEntriesProcessedBytes\n }\n });\n\n setImmediate(callback);\n }.bind(this));\n};\n\n/**\n * Finalizes the module.\n *\n * @private\n * @return void\n */\nArchiver.prototype._moduleFinalize = function() {\n if (typeof this._module.finalize === 'function') {\n this._module.finalize();\n } else if (typeof this._module.end === 'function') {\n this._module.end();\n } else {\n this.emit('error', new ArchiverError('NOENDMETHOD'));\n }\n};\n\n/**\n * Pipes the module to our internal stream with error bubbling.\n *\n * @private\n * @return void\n */\nArchiver.prototype._modulePipe = function() {\n this._module.on('error', this._onModuleError.bind(this));\n this._module.pipe(this);\n this._state.modulePiped = true;\n};\n\n/**\n * Determines if the current module supports a defined feature.\n *\n * @private\n * @param {String} key\n * @return {Boolean}\n */\nArchiver.prototype._moduleSupports = function(key) {\n if (!this._module.supports || !this._module.supports[key]) {\n return false;\n }\n\n return this._module.supports[key];\n};\n\n/**\n * Unpipes the module from our internal stream.\n *\n * @private\n * @return void\n */\nArchiver.prototype._moduleUnpipe = function() {\n this._module.unpipe(this);\n this._state.modulePiped = false;\n};\n\n/**\n * Normalizes entry data with fallbacks for key properties.\n *\n * @private\n * @param {Object} data\n * @param {fs.Stats} stats\n * @return {Object}\n */\nArchiver.prototype._normalizeEntryData = function(data, stats) {\n data = util.defaults(data, {\n type: 'file',\n name: null,\n date: null,\n mode: null,\n prefix: null,\n sourcePath: null,\n stats: false\n });\n\n if (stats && data.stats === false) {\n data.stats = stats;\n }\n\n var isDir = data.type === 'directory';\n\n if (data.name) {\n if (typeof data.prefix === 'string' && '' !== data.prefix) {\n data.name = data.prefix + '/' + data.name;\n data.prefix = null;\n }\n\n data.name = util.sanitizePath(data.name);\n\n if (data.type !== 'symlink' && data.name.slice(-1) === '/') {\n isDir = true;\n data.type = 'directory';\n } else if (isDir) {\n data.name += '/';\n }\n }\n\n // 511 === 0777; 493 === 0755; 438 === 0666; 420 === 0644\n if (typeof data.mode === 'number') {\n if (win32) {\n data.mode &= 511;\n } else {\n data.mode &= 4095\n }\n } else if (data.stats && data.mode === null) {\n if (win32) {\n data.mode = data.stats.mode & 511;\n } else {\n data.mode = data.stats.mode & 4095;\n }\n\n // stat isn't reliable on windows; force 0755 for dir\n if (win32 && isDir) {\n data.mode = 493;\n }\n } else if (data.mode === null) {\n data.mode = isDir ? 493 : 420;\n }\n\n if (data.stats && data.date === null) {\n data.date = data.stats.mtime;\n } else {\n data.date = util.dateify(data.date);\n }\n\n return data;\n};\n\n/**\n * Error listener that re-emits error on to our internal stream.\n *\n * @private\n * @param {Error} err\n * @return void\n */\nArchiver.prototype._onModuleError = function(err) {\n /**\n * @event Archiver#error\n * @type {ErrorData}\n */\n this.emit('error', err);\n};\n\n/**\n * Checks the various state variables after queue has drained to determine if\n * we need to `finalize`.\n *\n * @private\n * @return void\n */\nArchiver.prototype._onQueueDrain = function() {\n if (this._state.finalizing || this._state.finalized || this._state.aborted) {\n return;\n }\n\n if (this._state.finalize && this._pending === 0 && this._queue.idle() && this._statQueue.idle()) {\n this._finalize();\n }\n};\n\n/**\n * Appends each queue task to the module.\n *\n * @private\n * @param {Object} task\n * @param {Function} callback\n * @return void\n */\nArchiver.prototype._onQueueTask = function(task, callback) {\n var fullCallback = () => {\n if(task.data.callback) {\n task.data.callback();\n }\n callback();\n }\n\n if (this._state.finalizing || this._state.finalized || this._state.aborted) {\n fullCallback();\n return;\n }\n\n this._task = task;\n this._moduleAppend(task.source, task.data, fullCallback);\n};\n\n/**\n * Performs a file stat and reinjects the task back into the queue.\n *\n * @private\n * @param {Object} task\n * @param {Function} callback\n * @return void\n */\nArchiver.prototype._onStatQueueTask = function(task, callback) {\n if (this._state.finalizing || this._state.finalized || this._state.aborted) {\n callback();\n return;\n }\n\n fs.lstat(task.filepath, function(err, stats) {\n if (this._state.aborted) {\n setImmediate(callback);\n return;\n }\n\n if (err) {\n this._entriesCount--;\n\n /**\n * @event Archiver#warning\n * @type {ErrorData}\n */\n this.emit('warning', err);\n setImmediate(callback);\n return;\n }\n\n task = this._updateQueueTaskWithStats(task, stats);\n\n if (task) {\n if (stats.size) {\n this._fsEntriesTotalBytes += stats.size;\n }\n\n this._queue.push(task);\n }\n\n setImmediate(callback);\n }.bind(this));\n};\n\n/**\n * Unpipes the module and ends our internal stream.\n *\n * @private\n * @return void\n */\nArchiver.prototype._shutdown = function() {\n this._moduleUnpipe();\n this.end();\n};\n\n/**\n * Tracks the bytes emitted by our internal stream.\n *\n * @private\n * @param {Buffer} chunk\n * @param {String} encoding\n * @param {Function} callback\n * @return void\n */\nArchiver.prototype._transform = function(chunk, encoding, callback) {\n if (chunk) {\n this._pointer += chunk.length;\n }\n\n callback(null, chunk);\n};\n\n/**\n * Updates and normalizes a queue task using stats data.\n *\n * @private\n * @param {Object} task\n * @param {fs.Stats} stats\n * @return {Object}\n */\nArchiver.prototype._updateQueueTaskWithStats = function(task, stats) {\n if (stats.isFile()) {\n task.data.type = 'file';\n task.data.sourceType = 'stream';\n task.source = util.lazyReadStream(task.filepath);\n } else if (stats.isDirectory() && this._moduleSupports('directory')) {\n task.data.name = util.trailingSlashIt(task.data.name);\n task.data.type = 'directory';\n task.data.sourcePath = util.trailingSlashIt(task.filepath);\n task.data.sourceType = 'buffer';\n task.source = Buffer.concat([]);\n } else if (stats.isSymbolicLink() && this._moduleSupports('symlink')) {\n var linkPath = fs.readlinkSync(task.filepath);\n var dirName = path.dirname(task.filepath);\n task.data.type = 'symlink';\n task.data.linkname = path.relative(dirName, path.resolve(dirName, linkPath));\n task.data.sourceType = 'buffer';\n task.source = Buffer.concat([]);\n } else {\n if (stats.isDirectory()) {\n this.emit('warning', new ArchiverError('DIRECTORYNOTSUPPORTED', task.data));\n } else if (stats.isSymbolicLink()) {\n this.emit('warning', new ArchiverError('SYMLINKNOTSUPPORTED', task.data));\n } else {\n this.emit('warning', new ArchiverError('ENTRYNOTSUPPORTED', task.data));\n }\n\n return null;\n }\n\n task.data = this._normalizeEntryData(task.data, stats);\n\n return task;\n};\n\n/**\n * Aborts the archiving process, taking a best-effort approach, by:\n *\n * - removing any pending queue tasks\n * - allowing any active queue workers to finish\n * - detaching internal module pipes\n * - ending both sides of the Transform stream\n *\n * It will NOT drain any remaining sources.\n *\n * @return {this}\n */\nArchiver.prototype.abort = function() {\n if (this._state.aborted || this._state.finalized) {\n return this;\n }\n\n this._abort();\n\n return this;\n};\n\n/**\n * Appends an input source (text string, buffer, or stream) to the instance.\n *\n * When the instance has received, processed, and emitted the input, the `entry`\n * event is fired.\n *\n * @fires Archiver#entry\n * @param {(Buffer|Stream|String)} source The input source.\n * @param {EntryData} data See also {@link ZipEntryData} and {@link TarEntryData}.\n * @return {this}\n */\nArchiver.prototype.append = function(source, data) {\n if (this._state.finalize || this._state.aborted) {\n this.emit('error', new ArchiverError('QUEUECLOSED'));\n return this;\n }\n\n data = this._normalizeEntryData(data);\n\n if (typeof data.name !== 'string' || data.name.length === 0) {\n this.emit('error', new ArchiverError('ENTRYNAMEREQUIRED'));\n return this;\n }\n\n if (data.type === 'directory' && !this._moduleSupports('directory')) {\n this.emit('error', new ArchiverError('DIRECTORYNOTSUPPORTED', { name: data.name }));\n return this;\n }\n\n source = util.normalizeInputSource(source);\n\n if (Buffer.isBuffer(source)) {\n data.sourceType = 'buffer';\n } else if (util.isStream(source)) {\n data.sourceType = 'stream';\n } else {\n this.emit('error', new ArchiverError('INPUTSTEAMBUFFERREQUIRED', { name: data.name }));\n return this;\n }\n\n this._entriesCount++;\n this._queue.push({\n data: data,\n source: source\n });\n\n return this;\n};\n\n/**\n * Appends a directory and its files, recursively, given its dirpath.\n *\n * @param {String} dirpath The source directory path.\n * @param {String} destpath The destination path within the archive.\n * @param {(EntryData|Function)} data See also [ZipEntryData]{@link ZipEntryData} and\n * [TarEntryData]{@link TarEntryData}.\n * @return {this}\n */\nArchiver.prototype.directory = function(dirpath, destpath, data) {\n if (this._state.finalize || this._state.aborted) {\n this.emit('error', new ArchiverError('QUEUECLOSED'));\n return this;\n }\n\n if (typeof dirpath !== 'string' || dirpath.length === 0) {\n this.emit('error', new ArchiverError('DIRECTORYDIRPATHREQUIRED'));\n return this;\n }\n\n this._pending++;\n\n if (destpath === false) {\n destpath = '';\n } else if (typeof destpath !== 'string'){\n destpath = dirpath;\n }\n\n var dataFunction = false;\n if (typeof data === 'function') {\n dataFunction = data;\n data = {};\n } else if (typeof data !== 'object') {\n data = {};\n }\n\n var globOptions = {\n stat: true,\n dot: true\n };\n\n function onGlobEnd() {\n this._pending--;\n this._maybeFinalize();\n }\n\n function onGlobError(err) {\n this.emit('error', err);\n }\n\n function onGlobMatch(match){\n globber.pause();\n\n var ignoreMatch = false;\n var entryData = Object.assign({}, data);\n entryData.name = match.relative;\n entryData.prefix = destpath;\n entryData.stats = match.stat;\n entryData.callback = globber.resume.bind(globber);\n\n try {\n if (dataFunction) {\n entryData = dataFunction(entryData);\n\n if (entryData === false) {\n ignoreMatch = true;\n } else if (typeof entryData !== 'object') {\n throw new ArchiverError('DIRECTORYFUNCTIONINVALIDDATA', { dirpath: dirpath });\n }\n }\n } catch(e) {\n this.emit('error', e);\n return;\n }\n\n if (ignoreMatch) {\n globber.resume();\n return;\n }\n\n this._append(match.absolute, entryData);\n }\n\n var globber = glob(dirpath, globOptions);\n globber.on('error', onGlobError.bind(this));\n globber.on('match', onGlobMatch.bind(this));\n globber.on('end', onGlobEnd.bind(this));\n\n return this;\n};\n\n/**\n * Appends a file given its filepath using a\n * [lazystream]{@link https://github.com/jpommerening/node-lazystream} wrapper to\n * prevent issues with open file limits.\n *\n * When the instance has received, processed, and emitted the file, the `entry`\n * event is fired.\n *\n * @param {String} filepath The source filepath.\n * @param {EntryData} data See also [ZipEntryData]{@link ZipEntryData} and\n * [TarEntryData]{@link TarEntryData}.\n * @return {this}\n */\nArchiver.prototype.file = function(filepath, data) {\n if (this._state.finalize || this._state.aborted) {\n this.emit('error', new ArchiverError('QUEUECLOSED'));\n return this;\n }\n\n if (typeof filepath !== 'string' || filepath.length === 0) {\n this.emit('error', new ArchiverError('FILEFILEPATHREQUIRED'));\n return this;\n }\n\n this._append(filepath, data);\n\n return this;\n};\n\n/**\n * Appends multiple files that match a glob pattern.\n *\n * @param {String} pattern The [glob pattern]{@link https://github.com/isaacs/minimatch} to match.\n * @param {Object} options See [node-readdir-glob]{@link https://github.com/yqnn/node-readdir-glob#options}.\n * @param {EntryData} data See also [ZipEntryData]{@link ZipEntryData} and\n * [TarEntryData]{@link TarEntryData}.\n * @return {this}\n */\nArchiver.prototype.glob = function(pattern, options, data) {\n this._pending++;\n\n options = util.defaults(options, {\n stat: true,\n pattern: pattern\n });\n\n function onGlobEnd() {\n this._pending--;\n this._maybeFinalize();\n }\n\n function onGlobError(err) {\n this.emit('error', err);\n }\n\n function onGlobMatch(match){\n globber.pause();\n var entryData = Object.assign({}, data);\n entryData.callback = globber.resume.bind(globber);\n entryData.stats = match.stat;\n entryData.name = match.relative;\n\n this._append(match.absolute, entryData);\n }\n\n var globber = glob(options.cwd || '.', options);\n globber.on('error', onGlobError.bind(this));\n globber.on('match', onGlobMatch.bind(this));\n globber.on('end', onGlobEnd.bind(this));\n\n return this;\n};\n\n/**\n * Finalizes the instance and prevents further appending to the archive\n * structure (queue will continue til drained).\n *\n * The `end`, `close` or `finish` events on the destination stream may fire\n * right after calling this method so you should set listeners beforehand to\n * properly detect stream completion.\n *\n * @return {Promise}\n */\nArchiver.prototype.finalize = function() {\n if (this._state.aborted) {\n var abortedError = new ArchiverError('ABORTED');\n this.emit('error', abortedError);\n return Promise.reject(abortedError);\n }\n\n if (this._state.finalize) {\n var finalizingError = new ArchiverError('FINALIZING');\n this.emit('error', finalizingError);\n return Promise.reject(finalizingError);\n }\n\n this._state.finalize = true;\n\n if (this._pending === 0 && this._queue.idle() && this._statQueue.idle()) {\n this._finalize();\n }\n\n var self = this;\n\n return new Promise(function(resolve, reject) {\n var errored;\n\n self._module.on('end', function() {\n if (!errored) {\n resolve();\n }\n })\n\n self._module.on('error', function(err) {\n errored = true;\n reject(err);\n })\n })\n};\n\n/**\n * Sets the module format name used for archiving.\n *\n * @param {String} format The name of the format.\n * @return {this}\n */\nArchiver.prototype.setFormat = function(format) {\n if (this._format) {\n this.emit('error', new ArchiverError('FORMATSET'));\n return this;\n }\n\n this._format = format;\n\n return this;\n};\n\n/**\n * Sets the module used for archiving.\n *\n * @param {Function} module The function for archiver to interact with.\n * @return {this}\n */\nArchiver.prototype.setModule = function(module) {\n if (this._state.aborted) {\n this.emit('error', new ArchiverError('ABORTED'));\n return this;\n }\n\n if (this._state.module) {\n this.emit('error', new ArchiverError('MODULESET'));\n return this;\n }\n\n this._module = module;\n this._modulePipe();\n\n return this;\n};\n\n/**\n * Appends a symlink to the instance.\n *\n * This does NOT interact with filesystem and is used for programmatically creating symlinks.\n *\n * @param {String} filepath The symlink path (within archive).\n * @param {String} target The target path (within archive).\n * @param {Number} mode Sets the entry permissions.\n * @return {this}\n */\nArchiver.prototype.symlink = function(filepath, target, mode) {\n if (this._state.finalize || this._state.aborted) {\n this.emit('error', new ArchiverError('QUEUECLOSED'));\n return this;\n }\n\n if (typeof filepath !== 'string' || filepath.length === 0) {\n this.emit('error', new ArchiverError('SYMLINKFILEPATHREQUIRED'));\n return this;\n }\n\n if (typeof target !== 'string' || target.length === 0) {\n this.emit('error', new ArchiverError('SYMLINKTARGETREQUIRED', { filepath: filepath }));\n return this;\n }\n\n if (!this._moduleSupports('symlink')) {\n this.emit('error', new ArchiverError('SYMLINKNOTSUPPORTED', { filepath: filepath }));\n return this;\n }\n\n var data = {};\n data.type = 'symlink';\n data.name = filepath.replace(/\\\\/g, '/');\n data.linkname = target.replace(/\\\\/g, '/');\n data.sourceType = 'buffer';\n\n if (typeof mode === \"number\") {\n data.mode = mode;\n }\n\n this._entriesCount++;\n this._queue.push({\n data: data,\n source: Buffer.concat([])\n });\n\n return this;\n};\n\n/**\n * Returns the current length (in bytes) that has been emitted.\n *\n * @return {Number}\n */\nArchiver.prototype.pointer = function() {\n return this._pointer;\n};\n\n/**\n * Middleware-like helper that has yet to be fully implemented.\n *\n * @private\n * @param {Function} plugin\n * @return {this}\n */\nArchiver.prototype.use = function(plugin) {\n this._streams.push(plugin);\n return this;\n};\n\nmodule.exports = Archiver;\n\n/**\n * @typedef {Object} CoreOptions\n * @global\n * @property {Number} [statConcurrency=4] Sets the number of workers used to\n * process the internal fs stat queue.\n */\n\n/**\n * @typedef {Object} TransformOptions\n * @property {Boolean} [allowHalfOpen=true] If set to false, then the stream\n * will automatically end the readable side when the writable side ends and vice\n * versa.\n * @property {Boolean} [readableObjectMode=false] Sets objectMode for readable\n * side of the stream. Has no effect if objectMode is true.\n * @property {Boolean} [writableObjectMode=false] Sets objectMode for writable\n * side of the stream. Has no effect if objectMode is true.\n * @property {Boolean} [decodeStrings=true] Whether or not to decode strings\n * into Buffers before passing them to _write(). `Writable`\n * @property {String} [encoding=NULL] If specified, then buffers will be decoded\n * to strings using the specified encoding. `Readable`\n * @property {Number} [highWaterMark=16kb] The maximum number of bytes to store\n * in the internal buffer before ceasing to read from the underlying resource.\n * `Readable` `Writable`\n * @property {Boolean} [objectMode=false] Whether this stream should behave as a\n * stream of objects. Meaning that stream.read(n) returns a single value instead\n * of a Buffer of size n. `Readable` `Writable`\n */\n\n/**\n * @typedef {Object} EntryData\n * @property {String} name Sets the entry name including internal path.\n * @property {(String|Date)} [date=NOW()] Sets the entry date.\n * @property {Number} [mode=D:0755/F:0644] Sets the entry permissions.\n * @property {String} [prefix] Sets a path prefix for the entry name. Useful\n * when working with methods like `directory` or `glob`.\n * @property {fs.Stats} [stats] Sets the fs stat data for this entry allowing\n * for reduction of fs stat calls when stat data is already known.\n */\n\n/**\n * @typedef {Object} ErrorData\n * @property {String} message The message of the error.\n * @property {String} code The error code assigned to this error.\n * @property {String} data Additional data provided for reporting or debugging (where available).\n */\n\n/**\n * @typedef {Object} ProgressData\n * @property {Object} entries\n * @property {Number} entries.total Number of entries that have been appended.\n * @property {Number} entries.processed Number of entries that have been processed.\n * @property {Object} fs\n * @property {Number} fs.totalBytes Number of bytes that have been appended. Calculated asynchronously and might not be accurate: it growth while entries are added. (based on fs.Stats)\n * @property {Number} fs.processedBytes Number of bytes that have been processed. (based on fs.Stats)\n */\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTg3OC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EsU0FBUyxtQkFBTyxDQUFDLElBQUk7QUFDckIsV0FBVyxtQkFBTyxDQUFDLElBQWM7QUFDakMsWUFBWSxtQkFBTyxDQUFDLElBQU87QUFDM0IsV0FBVyxtQkFBTyxDQUFDLElBQU07QUFDekIsV0FBVyxtQkFBTyxDQUFDLElBQWdCOztBQUVuQyxlQUFlLG9DQUF3QjtBQUN2QyxvQkFBb0IsbUJBQU8sQ0FBQyxJQUFTO0FBQ3JDLGdCQUFnQixxQ0FBb0M7O0FBRXBEOztBQUVBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxnQ0FBZ0Msa0JBQWtCLGtCQUFrQixLQUFLLGlCQUFpQjtBQUNyRztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEIsWUFBWSxXQUFXO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksaUJBQWlCO0FBQzdCLFlBQVksV0FBVztBQUN2QixZQUFZLFVBQVU7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEIsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQixZQUFZLFVBQVU7QUFDdEIsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7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QUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixjQUFjLFFBQVE7QUFDdEIsY0FBYyxlQUFlO0FBQzdCLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEI7QUFDQSxjQUFjLFVBQVU7QUFDeEI7QUFDQTs7QUFFQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsUUFBUTtBQUN0Qjs7QUFFQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsUUFBUTtBQUN0QiIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2FyY2hpdmVyL2xpYi9jb3JlLmpzP2U3YTciXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcmNoaXZlciBDb3JlXG4gKlxuICogQGlnbm9yZVxuICogQGxpY2Vuc2UgW01JVF17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1hcmNoaXZlci9ibG9iL21hc3Rlci9MSUNFTlNFfVxuICogQGNvcHlyaWdodCAoYykgMjAxMi0yMDE0IENocmlzIFRhbGtpbmd0b24sIGNvbnRyaWJ1dG9ycy5cbiAqL1xudmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbnZhciBnbG9iID0gcmVxdWlyZSgncmVhZGRpci1nbG9iJyk7XG52YXIgYXN5bmMgPSByZXF1aXJlKCdhc3luYycpO1xudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ2FyY2hpdmVyLXV0aWxzJyk7XG5cbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ3V0aWwnKS5pbmhlcml0cztcbnZhciBBcmNoaXZlckVycm9yID0gcmVxdWlyZSgnLi9lcnJvcicpO1xudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpLlRyYW5zZm9ybTtcblxudmFyIHdpbjMyID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBmb3JtYXQgVGhlIGFyY2hpdmUgZm9ybWF0IHRvIHVzZS5cbiAqIEBwYXJhbSB7KENvcmVPcHRpb25zfFRyYW5zZm9ybU9wdGlvbnMpfSBvcHRpb25zIFNlZSBhbHNvIHtAbGluayBaaXBPcHRpb25zfSBhbmQge0BsaW5rIFRhck9wdGlvbnN9LlxuICovXG52YXIgQXJjaGl2ZXIgPSBmdW5jdGlvbihmb3JtYXQsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEFyY2hpdmVyKSkge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZXIoZm9ybWF0LCBvcHRpb25zKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZm9ybWF0ICE9PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMgPSBmb3JtYXQ7XG4gICAgZm9ybWF0ID0gJ3ppcCc7XG4gIH1cblxuICBvcHRpb25zID0gdGhpcy5vcHRpb25zID0gdXRpbC5kZWZhdWx0cyhvcHRpb25zLCB7XG4gICAgaGlnaFdhdGVyTWFyazogMTAyNCAqIDEwMjQsXG4gICAgc3RhdENvbmN1cnJlbmN5OiA0XG4gIH0pO1xuXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuX2Zvcm1hdCA9IGZhbHNlO1xuICB0aGlzLl9tb2R1bGUgPSBmYWxzZTtcbiAgdGhpcy5fcGVuZGluZyA9IDA7XG4gIHRoaXMuX3BvaW50ZXIgPSAwO1xuXG4gIHRoaXMuX2VudHJpZXNDb3VudCA9IDA7XG4gIHRoaXMuX2VudHJpZXNQcm9jZXNzZWRDb3VudCA9IDA7XG4gIHRoaXMuX2ZzRW50cmllc1RvdGFsQnl0ZXMgPSAwO1xuICB0aGlzLl9mc0VudHJpZXNQcm9jZXNzZWRCeXRlcyA9IDA7XG5cbiAgdGhpcy5fcXVldWUgPSBhc3luYy5xdWV1ZSh0aGlzLl9vblF1ZXVlVGFzay5iaW5kKHRoaXMpLCAxKTtcbiAgdGhpcy5fcXVldWUuZHJhaW4odGhpcy5fb25RdWV1ZURyYWluLmJpbmQodGhpcykpO1xuXG4gIHRoaXMuX3N0YXRRdWV1ZSA9IGFzeW5jLnF1ZXVlKHRoaXMuX29uU3RhdFF1ZXVlVGFzay5iaW5kKHRoaXMpLCBvcHRpb25zLnN0YXRDb25jdXJyZW5jeSk7XG4gIHRoaXMuX3N0YXRRdWV1ZS5kcmFpbih0aGlzLl9vblF1ZXVlRHJhaW4uYmluZCh0aGlzKSk7XG5cbiAgdGhpcy5fc3RhdGUgPSB7XG4gICAgYWJvcnRlZDogZmFsc2UsXG4gICAgZmluYWxpemU6IGZhbHNlLFxuICAgIGZpbmFsaXppbmc6IGZhbHNlLFxuICAgIGZpbmFsaXplZDogZmFsc2UsXG4gICAgbW9kdWxlUGlwZWQ6IGZhbHNlXG4gIH07XG5cbiAgdGhpcy5fc3RyZWFtcyA9IFtdO1xufTtcblxuaW5oZXJpdHMoQXJjaGl2ZXIsIFRyYW5zZm9ybSk7XG5cbi8qKlxuICogSW50ZXJuYWwgbG9naWMgZm9yIGBhYm9ydGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4gdm9pZFxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuX2Fib3J0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3N0YXRlLmFib3J0ZWQgPSB0cnVlO1xuICB0aGlzLl9xdWV1ZS5raWxsKCk7XG4gIHRoaXMuX3N0YXRRdWV1ZS5raWxsKCk7XG5cbiAgaWYgKHRoaXMuX3F1ZXVlLmlkbGUoKSkge1xuICAgIHRoaXMuX3NodXRkb3duKCk7XG4gIH1cbn07XG5cbi8qKlxuICogSW50ZXJuYWwgaGVscGVyIGZvciBhcHBlbmRpbmcgZmlsZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge1N0cmluZ30gZmlsZXBhdGggVGhlIHNvdXJjZSBmaWxlcGF0aC5cbiAqIEBwYXJhbSAge0VudHJ5RGF0YX0gZGF0YSBUaGUgZW50cnkgZGF0YS5cbiAqIEByZXR1cm4gdm9pZFxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuX2FwcGVuZCA9IGZ1bmN0aW9uKGZpbGVwYXRoLCBkYXRhKSB7XG4gIGRhdGEgPSBkYXRhIHx8IHt9O1xuXG4gIHZhciB0YXNrID0ge1xuICAgIHNvdXJjZTogbnVsbCxcbiAgICBmaWxlcGF0aDogZmlsZXBhdGhcbiAgfTtcblxuICBpZiAoIWRhdGEubmFtZSkge1xuICAgIGRhdGEubmFtZSA9IGZpbGVwYXRoO1xuICB9XG5cbiAgZGF0YS5zb3VyY2VQYXRoID0gZmlsZXBhdGg7XG4gIHRhc2suZGF0YSA9IGRhdGE7XG4gIHRoaXMuX2VudHJpZXNDb3VudCsrO1xuXG4gIGlmIChkYXRhLnN0YXRzICYmIGRhdGEuc3RhdHMgaW5zdGFuY2VvZiBmcy5TdGF0cykge1xuICAgIHRhc2sgPSB0aGlzLl91cGRhdGVRdWV1ZVRhc2tXaXRoU3RhdHModGFzaywgZGF0YS5zdGF0cyk7XG4gICAgaWYgKHRhc2spIHtcbiAgICAgIGlmIChkYXRhLnN0YXRzLnNpemUpIHtcbiAgICAgICAgdGhpcy5fZnNFbnRyaWVzVG90YWxCeXRlcyArPSBkYXRhLnN0YXRzLnNpemU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3F1ZXVlLnB1c2godGFzayk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRoaXMuX3N0YXRRdWV1ZS5wdXNoKHRhc2spO1xuICB9XG59O1xuXG4vKipcbiAqIEludGVybmFsIGxvZ2ljIGZvciBgZmluYWxpemVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLl9maW5hbGl6ZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5fc3RhdGUuZmluYWxpemluZyB8fCB0aGlzLl9zdGF0ZS5maW5hbGl6ZWQgfHwgdGhpcy5fc3RhdGUuYWJvcnRlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuX3N0YXRlLmZpbmFsaXppbmcgPSB0cnVlO1xuXG4gIHRoaXMuX21vZHVsZUZpbmFsaXplKCk7XG5cbiAgdGhpcy5fc3RhdGUuZmluYWxpemluZyA9IGZhbHNlO1xuICB0aGlzLl9zdGF0ZS5maW5hbGl6ZWQgPSB0cnVlO1xufTtcblxuLyoqXG4gKiBDaGVja3MgdGhlIHZhcmlvdXMgc3RhdGUgdmFyaWFibGVzIHRvIGRldGVybWluZSBpZiB3ZSBjYW4gYGZpbmFsaXplYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLl9tYXliZUZpbmFsaXplID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLl9zdGF0ZS5maW5hbGl6aW5nIHx8IHRoaXMuX3N0YXRlLmZpbmFsaXplZCB8fCB0aGlzLl9zdGF0ZS5hYm9ydGVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHRoaXMuX3N0YXRlLmZpbmFsaXplICYmIHRoaXMuX3BlbmRpbmcgPT09IDAgJiYgdGhpcy5fcXVldWUuaWRsZSgpICYmIHRoaXMuX3N0YXRRdWV1ZS5pZGxlKCkpIHtcbiAgICB0aGlzLl9maW5hbGl6ZSgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBBcHBlbmRzIGFuIGVudHJ5IHRvIHRoZSBtb2R1bGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBmaXJlcyAgQXJjaGl2ZXIjZW50cnlcbiAqIEBwYXJhbSAgeyhCdWZmZXJ8U3RyZWFtKX0gc291cmNlXG4gKiBAcGFyYW0gIHtFbnRyeURhdGF9IGRhdGFcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB2b2lkXG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5fbW9kdWxlQXBwZW5kID0gZnVuY3Rpb24oc291cmNlLCBkYXRhLCBjYWxsYmFjaykge1xuICBpZiAodGhpcy5fc3RhdGUuYWJvcnRlZCkge1xuICAgIGNhbGxiYWNrKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5fbW9kdWxlLmFwcGVuZChzb3VyY2UsIGRhdGEsIGZ1bmN0aW9uKGVycikge1xuICAgIHRoaXMuX3Rhc2sgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMuX3N0YXRlLmFib3J0ZWQpIHtcbiAgICAgIHRoaXMuX3NodXRkb3duKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGVycikge1xuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICBzZXRJbW1lZGlhdGUoY2FsbGJhY2spO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gdGhlIGVudHJ5J3MgaW5wdXQgaGFzIGJlZW4gcHJvY2Vzc2VkIGFuZCBhcHBlbmRlZCB0byB0aGUgYXJjaGl2ZS5cbiAgICAgKlxuICAgICAqIEBldmVudCBBcmNoaXZlciNlbnRyeVxuICAgICAqIEB0eXBlIHtFbnRyeURhdGF9XG4gICAgICovXG4gICAgdGhpcy5lbWl0KCdlbnRyeScsIGRhdGEpO1xuICAgIHRoaXMuX2VudHJpZXNQcm9jZXNzZWRDb3VudCsrO1xuXG4gICAgaWYgKGRhdGEuc3RhdHMgJiYgZGF0YS5zdGF0cy5zaXplKSB7XG4gICAgICB0aGlzLl9mc0VudHJpZXNQcm9jZXNzZWRCeXRlcyArPSBkYXRhLnN0YXRzLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGV2ZW50IEFyY2hpdmVyI3Byb2dyZXNzXG4gICAgICogQHR5cGUge1Byb2dyZXNzRGF0YX1cbiAgICAgKi9cbiAgICB0aGlzLmVtaXQoJ3Byb2dyZXNzJywge1xuICAgICAgZW50cmllczoge1xuICAgICAgICB0b3RhbDogdGhpcy5fZW50cmllc0NvdW50LFxuICAgICAgICBwcm9jZXNzZWQ6IHRoaXMuX2VudHJpZXNQcm9jZXNzZWRDb3VudFxuICAgICAgfSxcbiAgICAgIGZzOiB7XG4gICAgICAgIHRvdGFsQnl0ZXM6IHRoaXMuX2ZzRW50cmllc1RvdGFsQnl0ZXMsXG4gICAgICAgIHByb2Nlc3NlZEJ5dGVzOiB0aGlzLl9mc0VudHJpZXNQcm9jZXNzZWRCeXRlc1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc2V0SW1tZWRpYXRlKGNhbGxiYWNrKTtcbiAgfS5iaW5kKHRoaXMpKTtcbn07XG5cbi8qKlxuICogRmluYWxpemVzIHRoZSBtb2R1bGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4gdm9pZFxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuX21vZHVsZUZpbmFsaXplID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0eXBlb2YgdGhpcy5fbW9kdWxlLmZpbmFsaXplID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5fbW9kdWxlLmZpbmFsaXplKCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuX21vZHVsZS5lbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLl9tb2R1bGUuZW5kKCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBBcmNoaXZlckVycm9yKCdOT0VORE1FVEhPRCcpKTtcbiAgfVxufTtcblxuLyoqXG4gKiBQaXBlcyB0aGUgbW9kdWxlIHRvIG91ciBpbnRlcm5hbCBzdHJlYW0gd2l0aCBlcnJvciBidWJibGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB2b2lkXG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5fbW9kdWxlUGlwZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9tb2R1bGUub24oJ2Vycm9yJywgdGhpcy5fb25Nb2R1bGVFcnJvci5iaW5kKHRoaXMpKTtcbiAgdGhpcy5fbW9kdWxlLnBpcGUodGhpcyk7XG4gIHRoaXMuX3N0YXRlLm1vZHVsZVBpcGVkID0gdHJ1ZTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgY3VycmVudCBtb2R1bGUgc3VwcG9ydHMgYSBkZWZpbmVkIGZlYXR1cmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge1N0cmluZ30ga2V5XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuX21vZHVsZVN1cHBvcnRzID0gZnVuY3Rpb24oa2V5KSB7XG4gIGlmICghdGhpcy5fbW9kdWxlLnN1cHBvcnRzIHx8ICF0aGlzLl9tb2R1bGUuc3VwcG9ydHNba2V5XSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9tb2R1bGUuc3VwcG9ydHNba2V5XTtcbn07XG5cbi8qKlxuICogVW5waXBlcyB0aGUgbW9kdWxlIGZyb20gb3VyIGludGVybmFsIHN0cmVhbS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB2b2lkXG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5fbW9kdWxlVW5waXBlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX21vZHVsZS51bnBpcGUodGhpcyk7XG4gIHRoaXMuX3N0YXRlLm1vZHVsZVBpcGVkID0gZmFsc2U7XG59O1xuXG4vKipcbiAqIE5vcm1hbGl6ZXMgZW50cnkgZGF0YSB3aXRoIGZhbGxiYWNrcyBmb3Iga2V5IHByb3BlcnRpZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge09iamVjdH0gZGF0YVxuICogQHBhcmFtICB7ZnMuU3RhdHN9IHN0YXRzXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5fbm9ybWFsaXplRW50cnlEYXRhID0gZnVuY3Rpb24oZGF0YSwgc3RhdHMpIHtcbiAgZGF0YSA9IHV0aWwuZGVmYXVsdHMoZGF0YSwge1xuICAgIHR5cGU6ICdmaWxlJyxcbiAgICBuYW1lOiBudWxsLFxuICAgIGRhdGU6IG51bGwsXG4gICAgbW9kZTogbnVsbCxcbiAgICBwcmVmaXg6IG51bGwsXG4gICAgc291cmNlUGF0aDogbnVsbCxcbiAgICBzdGF0czogZmFsc2VcbiAgfSk7XG5cbiAgaWYgKHN0YXRzICYmIGRhdGEuc3RhdHMgPT09IGZhbHNlKSB7XG4gICAgZGF0YS5zdGF0cyA9IHN0YXRzO1xuICB9XG5cbiAgdmFyIGlzRGlyID0gZGF0YS50eXBlID09PSAnZGlyZWN0b3J5JztcblxuICBpZiAoZGF0YS5uYW1lKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhLnByZWZpeCA9PT0gJ3N0cmluZycgJiYgJycgIT09IGRhdGEucHJlZml4KSB7XG4gICAgICBkYXRhLm5hbWUgPSBkYXRhLnByZWZpeCArICcvJyArIGRhdGEubmFtZTtcbiAgICAgIGRhdGEucHJlZml4ID0gbnVsbDtcbiAgICB9XG5cbiAgICBkYXRhLm5hbWUgPSB1dGlsLnNhbml0aXplUGF0aChkYXRhLm5hbWUpO1xuXG4gICAgaWYgKGRhdGEudHlwZSAhPT0gJ3N5bWxpbmsnICYmIGRhdGEubmFtZS5zbGljZSgtMSkgPT09ICcvJykge1xuICAgICAgaXNEaXIgPSB0cnVlO1xuICAgICAgZGF0YS50eXBlID0gJ2RpcmVjdG9yeSc7XG4gICAgfSBlbHNlIGlmIChpc0Rpcikge1xuICAgICAgZGF0YS5uYW1lICs9ICcvJztcbiAgICB9XG4gIH1cblxuICAvLyA1MTEgPT09IDA3Nzc7IDQ5MyA9PT0gMDc1NTsgNDM4ID09PSAwNjY2OyA0MjAgPT09IDA2NDRcbiAgaWYgKHR5cGVvZiBkYXRhLm1vZGUgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHdpbjMyKSB7XG4gICAgICBkYXRhLm1vZGUgJj0gNTExO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhLm1vZGUgJj0gNDA5NVxuICAgIH1cbiAgfSBlbHNlIGlmIChkYXRhLnN0YXRzICYmIGRhdGEubW9kZSA9PT0gbnVsbCkge1xuICAgIGlmICh3aW4zMikge1xuICAgICAgZGF0YS5tb2RlID0gZGF0YS5zdGF0cy5tb2RlICYgNTExO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhLm1vZGUgPSBkYXRhLnN0YXRzLm1vZGUgJiA0MDk1O1xuICAgIH1cblxuICAgIC8vIHN0YXQgaXNuJ3QgcmVsaWFibGUgb24gd2luZG93czsgZm9yY2UgMDc1NSBmb3IgZGlyXG4gICAgaWYgKHdpbjMyICYmIGlzRGlyKSB7XG4gICAgICBkYXRhLm1vZGUgPSA0OTM7XG4gICAgfVxuICB9IGVsc2UgaWYgKGRhdGEubW9kZSA9PT0gbnVsbCkge1xuICAgIGRhdGEubW9kZSA9IGlzRGlyID8gNDkzIDogNDIwO1xuICB9XG5cbiAgaWYgKGRhdGEuc3RhdHMgJiYgZGF0YS5kYXRlID09PSBudWxsKSB7XG4gICAgZGF0YS5kYXRlID0gZGF0YS5zdGF0cy5tdGltZTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhLmRhdGUgPSB1dGlsLmRhdGVpZnkoZGF0YS5kYXRlKTtcbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufTtcblxuLyoqXG4gKiBFcnJvciBsaXN0ZW5lciB0aGF0IHJlLWVtaXRzIGVycm9yIG9uIHRvIG91ciBpbnRlcm5hbCBzdHJlYW0uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge0Vycm9yfSBlcnJcbiAqIEByZXR1cm4gdm9pZFxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuX29uTW9kdWxlRXJyb3IgPSBmdW5jdGlvbihlcnIpIHtcbiAgLyoqXG4gICAqIEBldmVudCBBcmNoaXZlciNlcnJvclxuICAgKiBAdHlwZSB7RXJyb3JEYXRhfVxuICAgKi9cbiAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG59O1xuXG4vKipcbiAqIENoZWNrcyB0aGUgdmFyaW91cyBzdGF0ZSB2YXJpYWJsZXMgYWZ0ZXIgcXVldWUgaGFzIGRyYWluZWQgdG8gZGV0ZXJtaW5lIGlmXG4gKiB3ZSBuZWVkIHRvIGBmaW5hbGl6ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4gdm9pZFxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuX29uUXVldWVEcmFpbiA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5fc3RhdGUuZmluYWxpemluZyB8fCB0aGlzLl9zdGF0ZS5maW5hbGl6ZWQgfHwgdGhpcy5fc3RhdGUuYWJvcnRlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0aGlzLl9zdGF0ZS5maW5hbGl6ZSAmJiB0aGlzLl9wZW5kaW5nID09PSAwICYmIHRoaXMuX3F1ZXVlLmlkbGUoKSAmJiB0aGlzLl9zdGF0UXVldWUuaWRsZSgpKSB7XG4gICAgdGhpcy5fZmluYWxpemUoKTtcbiAgfVxufTtcblxuLyoqXG4gKiBBcHBlbmRzIGVhY2ggcXVldWUgdGFzayB0byB0aGUgbW9kdWxlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtPYmplY3R9IHRhc2tcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB2b2lkXG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5fb25RdWV1ZVRhc2sgPSBmdW5jdGlvbih0YXNrLCBjYWxsYmFjaykge1xuICB2YXIgZnVsbENhbGxiYWNrID0gKCkgPT4ge1xuICAgIGlmKHRhc2suZGF0YS5jYWxsYmFjaykge1xuICAgICAgdGFzay5kYXRhLmNhbGxiYWNrKCk7XG4gICAgfVxuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBpZiAodGhpcy5fc3RhdGUuZmluYWxpemluZyB8fCB0aGlzLl9zdGF0ZS5maW5hbGl6ZWQgfHwgdGhpcy5fc3RhdGUuYWJvcnRlZCkge1xuICAgIGZ1bGxDYWxsYmFjaygpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuX3Rhc2sgPSB0YXNrO1xuICB0aGlzLl9tb2R1bGVBcHBlbmQodGFzay5zb3VyY2UsIHRhc2suZGF0YSwgZnVsbENhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgYSBmaWxlIHN0YXQgYW5kIHJlaW5qZWN0cyB0aGUgdGFzayBiYWNrIGludG8gdGhlIHF1ZXVlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtPYmplY3R9IHRhc2tcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB2b2lkXG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5fb25TdGF0UXVldWVUYXNrID0gZnVuY3Rpb24odGFzaywgY2FsbGJhY2spIHtcbiAgaWYgKHRoaXMuX3N0YXRlLmZpbmFsaXppbmcgfHwgdGhpcy5fc3RhdGUuZmluYWxpemVkIHx8IHRoaXMuX3N0YXRlLmFib3J0ZWQpIHtcbiAgICBjYWxsYmFjaygpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZzLmxzdGF0KHRhc2suZmlsZXBhdGgsIGZ1bmN0aW9uKGVyciwgc3RhdHMpIHtcbiAgICBpZiAodGhpcy5fc3RhdGUuYWJvcnRlZCkge1xuICAgICAgc2V0SW1tZWRpYXRlKGNhbGxiYWNrKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXJyKSB7XG4gICAgICB0aGlzLl9lbnRyaWVzQ291bnQtLTtcblxuICAgICAgLyoqXG4gICAgICAgKiBAZXZlbnQgQXJjaGl2ZXIjd2FybmluZ1xuICAgICAgICogQHR5cGUge0Vycm9yRGF0YX1cbiAgICAgICAqL1xuICAgICAgdGhpcy5lbWl0KCd3YXJuaW5nJywgZXJyKTtcbiAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGFzayA9IHRoaXMuX3VwZGF0ZVF1ZXVlVGFza1dpdGhTdGF0cyh0YXNrLCBzdGF0cyk7XG5cbiAgICBpZiAodGFzaykge1xuICAgICAgaWYgKHN0YXRzLnNpemUpIHtcbiAgICAgICAgdGhpcy5fZnNFbnRyaWVzVG90YWxCeXRlcyArPSBzdGF0cy5zaXplO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9xdWV1ZS5wdXNoKHRhc2spO1xuICAgIH1cblxuICAgIHNldEltbWVkaWF0ZShjYWxsYmFjayk7XG4gIH0uYmluZCh0aGlzKSk7XG59O1xuXG4vKipcbiAqIFVucGlwZXMgdGhlIG1vZHVsZSBhbmQgZW5kcyBvdXIgaW50ZXJuYWwgc3RyZWFtLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLl9zaHV0ZG93biA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9tb2R1bGVVbnBpcGUoKTtcbiAgdGhpcy5lbmQoKTtcbn07XG5cbi8qKlxuICogVHJhY2tzIHRoZSBieXRlcyBlbWl0dGVkIGJ5IG91ciBpbnRlcm5hbCBzdHJlYW0uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge0J1ZmZlcn0gY2h1bmtcbiAqIEBwYXJhbSAge1N0cmluZ30gZW5jb2RpbmdcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB2b2lkXG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICBpZiAoY2h1bmspIHtcbiAgICB0aGlzLl9wb2ludGVyICs9IGNodW5rLmxlbmd0aDtcbiAgfVxuXG4gIGNhbGxiYWNrKG51bGwsIGNodW5rKTtcbn07XG5cbi8qKlxuICogVXBkYXRlcyBhbmQgbm9ybWFsaXplcyBhIHF1ZXVlIHRhc2sgdXNpbmcgc3RhdHMgZGF0YS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7T2JqZWN0fSB0YXNrXG4gKiBAcGFyYW0gIHtmcy5TdGF0c30gc3RhdHNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLl91cGRhdGVRdWV1ZVRhc2tXaXRoU3RhdHMgPSBmdW5jdGlvbih0YXNrLCBzdGF0cykge1xuICBpZiAoc3RhdHMuaXNGaWxlKCkpIHtcbiAgICB0YXNrLmRhdGEudHlwZSA9ICdmaWxlJztcbiAgICB0YXNrLmRhdGEuc291cmNlVHlwZSA9ICdzdHJlYW0nO1xuICAgIHRhc2suc291cmNlID0gdXRpbC5sYXp5UmVhZFN0cmVhbSh0YXNrLmZpbGVwYXRoKTtcbiAgfSBlbHNlIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpICYmIHRoaXMuX21vZHVsZVN1cHBvcnRzKCdkaXJlY3RvcnknKSkge1xuICAgIHRhc2suZGF0YS5uYW1lID0gdXRpbC50cmFpbGluZ1NsYXNoSXQodGFzay5kYXRhLm5hbWUpO1xuICAgIHRhc2suZGF0YS50eXBlID0gJ2RpcmVjdG9yeSc7XG4gICAgdGFzay5kYXRhLnNvdXJjZVBhdGggPSB1dGlsLnRyYWlsaW5nU2xhc2hJdCh0YXNrLmZpbGVwYXRoKTtcbiAgICB0YXNrLmRhdGEuc291cmNlVHlwZSA9ICdidWZmZXInO1xuICAgIHRhc2suc291cmNlID0gQnVmZmVyLmNvbmNhdChbXSk7XG4gIH0gZWxzZSBpZiAoc3RhdHMuaXNTeW1ib2xpY0xpbmsoKSAmJiB0aGlzLl9tb2R1bGVTdXBwb3J0cygnc3ltbGluaycpKSB7XG4gICAgdmFyIGxpbmtQYXRoID0gZnMucmVhZGxpbmtTeW5jKHRhc2suZmlsZXBhdGgpO1xuICAgIHZhciBkaXJOYW1lID0gcGF0aC5kaXJuYW1lKHRhc2suZmlsZXBhdGgpO1xuICAgIHRhc2suZGF0YS50eXBlID0gJ3N5bWxpbmsnO1xuICAgIHRhc2suZGF0YS5saW5rbmFtZSA9IHBhdGgucmVsYXRpdmUoZGlyTmFtZSwgcGF0aC5yZXNvbHZlKGRpck5hbWUsIGxpbmtQYXRoKSk7XG4gICAgdGFzay5kYXRhLnNvdXJjZVR5cGUgPSAnYnVmZmVyJztcbiAgICB0YXNrLnNvdXJjZSA9IEJ1ZmZlci5jb25jYXQoW10pO1xuICB9IGVsc2Uge1xuICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICB0aGlzLmVtaXQoJ3dhcm5pbmcnLCBuZXcgQXJjaGl2ZXJFcnJvcignRElSRUNUT1JZTk9UU1VQUE9SVEVEJywgdGFzay5kYXRhKSk7XG4gICAgfSBlbHNlIGlmIChzdGF0cy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICB0aGlzLmVtaXQoJ3dhcm5pbmcnLCBuZXcgQXJjaGl2ZXJFcnJvcignU1lNTElOS05PVFNVUFBPUlRFRCcsIHRhc2suZGF0YSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXQoJ3dhcm5pbmcnLCBuZXcgQXJjaGl2ZXJFcnJvcignRU5UUllOT1RTVVBQT1JURUQnLCB0YXNrLmRhdGEpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRhc2suZGF0YSA9IHRoaXMuX25vcm1hbGl6ZUVudHJ5RGF0YSh0YXNrLmRhdGEsIHN0YXRzKTtcblxuICByZXR1cm4gdGFzaztcbn07XG5cbi8qKlxuICogQWJvcnRzIHRoZSBhcmNoaXZpbmcgcHJvY2VzcywgdGFraW5nIGEgYmVzdC1lZmZvcnQgYXBwcm9hY2gsIGJ5OlxuICpcbiAqIC0gcmVtb3ZpbmcgYW55IHBlbmRpbmcgcXVldWUgdGFza3NcbiAqIC0gYWxsb3dpbmcgYW55IGFjdGl2ZSBxdWV1ZSB3b3JrZXJzIHRvIGZpbmlzaFxuICogLSBkZXRhY2hpbmcgaW50ZXJuYWwgbW9kdWxlIHBpcGVzXG4gKiAtIGVuZGluZyBib3RoIHNpZGVzIG9mIHRoZSBUcmFuc2Zvcm0gc3RyZWFtXG4gKlxuICogSXQgd2lsbCBOT1QgZHJhaW4gYW55IHJlbWFpbmluZyBzb3VyY2VzLlxuICpcbiAqIEByZXR1cm4ge3RoaXN9XG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5fc3RhdGUuYWJvcnRlZCB8fCB0aGlzLl9zdGF0ZS5maW5hbGl6ZWQpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRoaXMuX2Fib3J0KCk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEFwcGVuZHMgYW4gaW5wdXQgc291cmNlICh0ZXh0IHN0cmluZywgYnVmZmVyLCBvciBzdHJlYW0pIHRvIHRoZSBpbnN0YW5jZS5cbiAqXG4gKiBXaGVuIHRoZSBpbnN0YW5jZSBoYXMgcmVjZWl2ZWQsIHByb2Nlc3NlZCwgYW5kIGVtaXR0ZWQgdGhlIGlucHV0LCB0aGUgYGVudHJ5YFxuICogZXZlbnQgaXMgZmlyZWQuXG4gKlxuICogQGZpcmVzICBBcmNoaXZlciNlbnRyeVxuICogQHBhcmFtICB7KEJ1ZmZlcnxTdHJlYW18U3RyaW5nKX0gc291cmNlIFRoZSBpbnB1dCBzb3VyY2UuXG4gKiBAcGFyYW0gIHtFbnRyeURhdGF9IGRhdGEgU2VlIGFsc28ge0BsaW5rIFppcEVudHJ5RGF0YX0gYW5kIHtAbGluayBUYXJFbnRyeURhdGF9LlxuICogQHJldHVybiB7dGhpc31cbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKHNvdXJjZSwgZGF0YSkge1xuICBpZiAodGhpcy5fc3RhdGUuZmluYWxpemUgfHwgdGhpcy5fc3RhdGUuYWJvcnRlZCkge1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgQXJjaGl2ZXJFcnJvcignUVVFVUVDTE9TRUQnKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBkYXRhID0gdGhpcy5fbm9ybWFsaXplRW50cnlEYXRhKGRhdGEpO1xuXG4gIGlmICh0eXBlb2YgZGF0YS5uYW1lICE9PSAnc3RyaW5nJyB8fCBkYXRhLm5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBBcmNoaXZlckVycm9yKCdFTlRSWU5BTUVSRVFVSVJFRCcpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmIChkYXRhLnR5cGUgPT09ICdkaXJlY3RvcnknICYmICF0aGlzLl9tb2R1bGVTdXBwb3J0cygnZGlyZWN0b3J5JykpIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEFyY2hpdmVyRXJyb3IoJ0RJUkVDVE9SWU5PVFNVUFBPUlRFRCcsIHsgbmFtZTogZGF0YS5uYW1lIH0pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNvdXJjZSA9IHV0aWwubm9ybWFsaXplSW5wdXRTb3VyY2Uoc291cmNlKTtcblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHNvdXJjZSkpIHtcbiAgICBkYXRhLnNvdXJjZVR5cGUgPSAnYnVmZmVyJztcbiAgfSBlbHNlIGlmICh1dGlsLmlzU3RyZWFtKHNvdXJjZSkpIHtcbiAgICBkYXRhLnNvdXJjZVR5cGUgPSAnc3RyZWFtJztcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEFyY2hpdmVyRXJyb3IoJ0lOUFVUU1RFQU1CVUZGRVJSRVFVSVJFRCcsIHsgbmFtZTogZGF0YS5uYW1lIH0pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRoaXMuX2VudHJpZXNDb3VudCsrO1xuICB0aGlzLl9xdWV1ZS5wdXNoKHtcbiAgICBkYXRhOiBkYXRhLFxuICAgIHNvdXJjZTogc291cmNlXG4gIH0pO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBcHBlbmRzIGEgZGlyZWN0b3J5IGFuZCBpdHMgZmlsZXMsIHJlY3Vyc2l2ZWx5LCBnaXZlbiBpdHMgZGlycGF0aC5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGRpcnBhdGggVGhlIHNvdXJjZSBkaXJlY3RvcnkgcGF0aC5cbiAqIEBwYXJhbSAge1N0cmluZ30gZGVzdHBhdGggVGhlIGRlc3RpbmF0aW9uIHBhdGggd2l0aGluIHRoZSBhcmNoaXZlLlxuICogQHBhcmFtICB7KEVudHJ5RGF0YXxGdW5jdGlvbil9IGRhdGEgU2VlIGFsc28gW1ppcEVudHJ5RGF0YV17QGxpbmsgWmlwRW50cnlEYXRhfSBhbmRcbiAqIFtUYXJFbnRyeURhdGFde0BsaW5rIFRhckVudHJ5RGF0YX0uXG4gKiBAcmV0dXJuIHt0aGlzfVxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuZGlyZWN0b3J5ID0gZnVuY3Rpb24oZGlycGF0aCwgZGVzdHBhdGgsIGRhdGEpIHtcbiAgaWYgKHRoaXMuX3N0YXRlLmZpbmFsaXplIHx8IHRoaXMuX3N0YXRlLmFib3J0ZWQpIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEFyY2hpdmVyRXJyb3IoJ1FVRVVFQ0xPU0VEJykpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBkaXJwYXRoICE9PSAnc3RyaW5nJyB8fCBkaXJwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgQXJjaGl2ZXJFcnJvcignRElSRUNUT1JZRElSUEFUSFJFUVVJUkVEJykpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdGhpcy5fcGVuZGluZysrO1xuXG4gIGlmIChkZXN0cGF0aCA9PT0gZmFsc2UpIHtcbiAgICBkZXN0cGF0aCA9ICcnO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBkZXN0cGF0aCAhPT0gJ3N0cmluZycpe1xuICAgIGRlc3RwYXRoID0gZGlycGF0aDtcbiAgfVxuXG4gIHZhciBkYXRhRnVuY3Rpb24gPSBmYWxzZTtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZGF0YUZ1bmN0aW9uID0gZGF0YTtcbiAgICBkYXRhID0ge307XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgZGF0YSA9IHt9O1xuICB9XG5cbiAgdmFyIGdsb2JPcHRpb25zID0ge1xuICAgIHN0YXQ6IHRydWUsXG4gICAgZG90OiB0cnVlXG4gIH07XG5cbiAgZnVuY3Rpb24gb25HbG9iRW5kKCkge1xuICAgIHRoaXMuX3BlbmRpbmctLTtcbiAgICB0aGlzLl9tYXliZUZpbmFsaXplKCk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkdsb2JFcnJvcihlcnIpIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uR2xvYk1hdGNoKG1hdGNoKXtcbiAgICBnbG9iYmVyLnBhdXNlKCk7XG5cbiAgICB2YXIgaWdub3JlTWF0Y2ggPSBmYWxzZTtcbiAgICB2YXIgZW50cnlEYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgZGF0YSk7XG4gICAgZW50cnlEYXRhLm5hbWUgPSBtYXRjaC5yZWxhdGl2ZTtcbiAgICBlbnRyeURhdGEucHJlZml4ID0gZGVzdHBhdGg7XG4gICAgZW50cnlEYXRhLnN0YXRzID0gbWF0Y2guc3RhdDtcbiAgICBlbnRyeURhdGEuY2FsbGJhY2sgPSBnbG9iYmVyLnJlc3VtZS5iaW5kKGdsb2JiZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChkYXRhRnVuY3Rpb24pIHtcbiAgICAgICAgZW50cnlEYXRhID0gZGF0YUZ1bmN0aW9uKGVudHJ5RGF0YSk7XG5cbiAgICAgICAgaWYgKGVudHJ5RGF0YSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBpZ25vcmVNYXRjaCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVudHJ5RGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQXJjaGl2ZXJFcnJvcignRElSRUNUT1JZRlVOQ1RJT05JTlZBTElEREFUQScsIHsgZGlycGF0aDogZGlycGF0aCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2goZSkge1xuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpZ25vcmVNYXRjaCkge1xuICAgICAgZ2xvYmJlci5yZXN1bWUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9hcHBlbmQobWF0Y2guYWJzb2x1dGUsIGVudHJ5RGF0YSk7XG4gIH1cblxuICB2YXIgZ2xvYmJlciA9IGdsb2IoZGlycGF0aCwgZ2xvYk9wdGlvbnMpO1xuICBnbG9iYmVyLm9uKCdlcnJvcicsIG9uR2xvYkVycm9yLmJpbmQodGhpcykpO1xuICBnbG9iYmVyLm9uKCdtYXRjaCcsIG9uR2xvYk1hdGNoLmJpbmQodGhpcykpO1xuICBnbG9iYmVyLm9uKCdlbmQnLCBvbkdsb2JFbmQuYmluZCh0aGlzKSk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEFwcGVuZHMgYSBmaWxlIGdpdmVuIGl0cyBmaWxlcGF0aCB1c2luZyBhXG4gKiBbbGF6eXN0cmVhbV17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2pwb21tZXJlbmluZy9ub2RlLWxhenlzdHJlYW19IHdyYXBwZXIgdG9cbiAqIHByZXZlbnQgaXNzdWVzIHdpdGggb3BlbiBmaWxlIGxpbWl0cy5cbiAqXG4gKiBXaGVuIHRoZSBpbnN0YW5jZSBoYXMgcmVjZWl2ZWQsIHByb2Nlc3NlZCwgYW5kIGVtaXR0ZWQgdGhlIGZpbGUsIHRoZSBgZW50cnlgXG4gKiBldmVudCBpcyBmaXJlZC5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGZpbGVwYXRoIFRoZSBzb3VyY2UgZmlsZXBhdGguXG4gKiBAcGFyYW0gIHtFbnRyeURhdGF9IGRhdGEgU2VlIGFsc28gW1ppcEVudHJ5RGF0YV17QGxpbmsgWmlwRW50cnlEYXRhfSBhbmRcbiAqIFtUYXJFbnRyeURhdGFde0BsaW5rIFRhckVudHJ5RGF0YX0uXG4gKiBAcmV0dXJuIHt0aGlzfVxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuZmlsZSA9IGZ1bmN0aW9uKGZpbGVwYXRoLCBkYXRhKSB7XG4gIGlmICh0aGlzLl9zdGF0ZS5maW5hbGl6ZSB8fCB0aGlzLl9zdGF0ZS5hYm9ydGVkKSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBBcmNoaXZlckVycm9yKCdRVUVVRUNMT1NFRCcpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmICh0eXBlb2YgZmlsZXBhdGggIT09ICdzdHJpbmcnIHx8IGZpbGVwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgQXJjaGl2ZXJFcnJvcignRklMRUZJTEVQQVRIUkVRVUlSRUQnKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0aGlzLl9hcHBlbmQoZmlsZXBhdGgsIGRhdGEpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBcHBlbmRzIG11bHRpcGxlIGZpbGVzIHRoYXQgbWF0Y2ggYSBnbG9iIHBhdHRlcm4uXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBwYXR0ZXJuIFRoZSBbZ2xvYiBwYXR0ZXJuXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vaXNhYWNzL21pbmltYXRjaH0gdG8gbWF0Y2guXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnMgU2VlIFtub2RlLXJlYWRkaXItZ2xvYl17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3lxbm4vbm9kZS1yZWFkZGlyLWdsb2Ijb3B0aW9uc30uXG4gKiBAcGFyYW0gIHtFbnRyeURhdGF9IGRhdGEgU2VlIGFsc28gW1ppcEVudHJ5RGF0YV17QGxpbmsgWmlwRW50cnlEYXRhfSBhbmRcbiAqIFtUYXJFbnRyeURhdGFde0BsaW5rIFRhckVudHJ5RGF0YX0uXG4gKiBAcmV0dXJuIHt0aGlzfVxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuZ2xvYiA9IGZ1bmN0aW9uKHBhdHRlcm4sIG9wdGlvbnMsIGRhdGEpIHtcbiAgdGhpcy5fcGVuZGluZysrO1xuXG4gIG9wdGlvbnMgPSB1dGlsLmRlZmF1bHRzKG9wdGlvbnMsIHtcbiAgICBzdGF0OiB0cnVlLFxuICAgIHBhdHRlcm46IHBhdHRlcm5cbiAgfSk7XG5cbiAgZnVuY3Rpb24gb25HbG9iRW5kKCkge1xuICAgIHRoaXMuX3BlbmRpbmctLTtcbiAgICB0aGlzLl9tYXliZUZpbmFsaXplKCk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkdsb2JFcnJvcihlcnIpIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uR2xvYk1hdGNoKG1hdGNoKXtcbiAgICBnbG9iYmVyLnBhdXNlKCk7XG4gICAgdmFyIGVudHJ5RGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRhdGEpO1xuICAgIGVudHJ5RGF0YS5jYWxsYmFjayA9IGdsb2JiZXIucmVzdW1lLmJpbmQoZ2xvYmJlcik7XG4gICAgZW50cnlEYXRhLnN0YXRzID0gbWF0Y2guc3RhdDtcbiAgICBlbnRyeURhdGEubmFtZSA9IG1hdGNoLnJlbGF0aXZlO1xuXG4gICAgdGhpcy5fYXBwZW5kKG1hdGNoLmFic29sdXRlLCBlbnRyeURhdGEpO1xuICB9XG5cbiAgdmFyIGdsb2JiZXIgPSBnbG9iKG9wdGlvbnMuY3dkIHx8ICcuJywgb3B0aW9ucyk7XG4gIGdsb2JiZXIub24oJ2Vycm9yJywgb25HbG9iRXJyb3IuYmluZCh0aGlzKSk7XG4gIGdsb2JiZXIub24oJ21hdGNoJywgb25HbG9iTWF0Y2guYmluZCh0aGlzKSk7XG4gIGdsb2JiZXIub24oJ2VuZCcsIG9uR2xvYkVuZC5iaW5kKHRoaXMpKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogRmluYWxpemVzIHRoZSBpbnN0YW5jZSBhbmQgcHJldmVudHMgZnVydGhlciBhcHBlbmRpbmcgdG8gdGhlIGFyY2hpdmVcbiAqIHN0cnVjdHVyZSAocXVldWUgd2lsbCBjb250aW51ZSB0aWwgZHJhaW5lZCkuXG4gKlxuICogVGhlIGBlbmRgLCBgY2xvc2VgIG9yIGBmaW5pc2hgIGV2ZW50cyBvbiB0aGUgZGVzdGluYXRpb24gc3RyZWFtIG1heSBmaXJlXG4gKiByaWdodCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIHNvIHlvdSBzaG91bGQgc2V0IGxpc3RlbmVycyBiZWZvcmVoYW5kIHRvXG4gKiBwcm9wZXJseSBkZXRlY3Qgc3RyZWFtIGNvbXBsZXRpb24uXG4gKlxuICogQHJldHVybiB7UHJvbWlzZX1cbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLmZpbmFsaXplID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLl9zdGF0ZS5hYm9ydGVkKSB7XG4gICAgdmFyIGFib3J0ZWRFcnJvciA9IG5ldyBBcmNoaXZlckVycm9yKCdBQk9SVEVEJyk7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGFib3J0ZWRFcnJvcik7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGFib3J0ZWRFcnJvcik7XG4gIH1cblxuICBpZiAodGhpcy5fc3RhdGUuZmluYWxpemUpIHtcbiAgICB2YXIgZmluYWxpemluZ0Vycm9yID0gbmV3IEFyY2hpdmVyRXJyb3IoJ0ZJTkFMSVpJTkcnKTtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZmluYWxpemluZ0Vycm9yKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZmluYWxpemluZ0Vycm9yKTtcbiAgfVxuXG4gIHRoaXMuX3N0YXRlLmZpbmFsaXplID0gdHJ1ZTtcblxuICBpZiAodGhpcy5fcGVuZGluZyA9PT0gMCAmJiB0aGlzLl9xdWV1ZS5pZGxlKCkgJiYgdGhpcy5fc3RhdFF1ZXVlLmlkbGUoKSkge1xuICAgIHRoaXMuX2ZpbmFsaXplKCk7XG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciBlcnJvcmVkO1xuXG4gICAgc2VsZi5fbW9kdWxlLm9uKCdlbmQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghZXJyb3JlZCkge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSlcblxuICAgIHNlbGYuX21vZHVsZS5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgIGVycm9yZWQgPSB0cnVlO1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfSlcbiAgfSlcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgbW9kdWxlIGZvcm1hdCBuYW1lIHVzZWQgZm9yIGFyY2hpdmluZy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZm9ybWF0IFRoZSBuYW1lIG9mIHRoZSBmb3JtYXQuXG4gKiBAcmV0dXJuIHt0aGlzfVxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuc2V0Rm9ybWF0ID0gZnVuY3Rpb24oZm9ybWF0KSB7XG4gIGlmICh0aGlzLl9mb3JtYXQpIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEFyY2hpdmVyRXJyb3IoJ0ZPUk1BVFNFVCcpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRoaXMuX2Zvcm1hdCA9IGZvcm1hdDtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgbW9kdWxlIHVzZWQgZm9yIGFyY2hpdmluZy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtb2R1bGUgVGhlIGZ1bmN0aW9uIGZvciBhcmNoaXZlciB0byBpbnRlcmFjdCB3aXRoLlxuICogQHJldHVybiB7dGhpc31cbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLnNldE1vZHVsZSA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuICBpZiAodGhpcy5fc3RhdGUuYWJvcnRlZCkge1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgQXJjaGl2ZXJFcnJvcignQUJPUlRFRCcpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmICh0aGlzLl9zdGF0ZS5tb2R1bGUpIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEFyY2hpdmVyRXJyb3IoJ01PRFVMRVNFVCcpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRoaXMuX21vZHVsZSA9IG1vZHVsZTtcbiAgdGhpcy5fbW9kdWxlUGlwZSgpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBcHBlbmRzIGEgc3ltbGluayB0byB0aGUgaW5zdGFuY2UuXG4gKlxuICogVGhpcyBkb2VzIE5PVCBpbnRlcmFjdCB3aXRoIGZpbGVzeXN0ZW0gYW5kIGlzIHVzZWQgZm9yIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRpbmcgc3ltbGlua3MuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBmaWxlcGF0aCBUaGUgc3ltbGluayBwYXRoICh3aXRoaW4gYXJjaGl2ZSkuXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHRhcmdldCBUaGUgdGFyZ2V0IHBhdGggKHdpdGhpbiBhcmNoaXZlKS5cbiAqIEBwYXJhbSAge051bWJlcn0gbW9kZSBTZXRzIHRoZSBlbnRyeSBwZXJtaXNzaW9ucy5cbiAqIEByZXR1cm4ge3RoaXN9XG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5zeW1saW5rID0gZnVuY3Rpb24oZmlsZXBhdGgsIHRhcmdldCwgbW9kZSkge1xuICBpZiAodGhpcy5fc3RhdGUuZmluYWxpemUgfHwgdGhpcy5fc3RhdGUuYWJvcnRlZCkge1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgQXJjaGl2ZXJFcnJvcignUVVFVUVDTE9TRUQnKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpZiAodHlwZW9mIGZpbGVwYXRoICE9PSAnc3RyaW5nJyB8fCBmaWxlcGF0aC5sZW5ndGggPT09IDApIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEFyY2hpdmVyRXJyb3IoJ1NZTUxJTktGSUxFUEFUSFJFUVVJUkVEJykpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0YXJnZXQgIT09ICdzdHJpbmcnIHx8IHRhcmdldC5sZW5ndGggPT09IDApIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEFyY2hpdmVyRXJyb3IoJ1NZTUxJTktUQVJHRVRSRVFVSVJFRCcsIHsgZmlsZXBhdGg6IGZpbGVwYXRoIH0pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmICghdGhpcy5fbW9kdWxlU3VwcG9ydHMoJ3N5bWxpbmsnKSkge1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgQXJjaGl2ZXJFcnJvcignU1lNTElOS05PVFNVUFBPUlRFRCcsIHsgZmlsZXBhdGg6IGZpbGVwYXRoIH0pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhciBkYXRhID0ge307XG4gIGRhdGEudHlwZSA9ICdzeW1saW5rJztcbiAgZGF0YS5uYW1lID0gZmlsZXBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICBkYXRhLmxpbmtuYW1lID0gdGFyZ2V0LnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgZGF0YS5zb3VyY2VUeXBlID0gJ2J1ZmZlcic7XG5cbiAgaWYgKHR5cGVvZiBtb2RlID09PSBcIm51bWJlclwiKSB7XG4gICAgZGF0YS5tb2RlID0gbW9kZTtcbiAgfVxuXG4gIHRoaXMuX2VudHJpZXNDb3VudCsrO1xuICB0aGlzLl9xdWV1ZS5wdXNoKHtcbiAgICBkYXRhOiBkYXRhLFxuICAgIHNvdXJjZTogQnVmZmVyLmNvbmNhdChbXSlcbiAgfSk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGVuZ3RoIChpbiBieXRlcykgdGhhdCBoYXMgYmVlbiBlbWl0dGVkLlxuICpcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLnBvaW50ZXIgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX3BvaW50ZXI7XG59O1xuXG4vKipcbiAqIE1pZGRsZXdhcmUtbGlrZSBoZWxwZXIgdGhhdCBoYXMgeWV0IHRvIGJlIGZ1bGx5IGltcGxlbWVudGVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gcGx1Z2luXG4gKiBAcmV0dXJuIHt0aGlzfVxuICovXG5BcmNoaXZlci5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24ocGx1Z2luKSB7XG4gIHRoaXMuX3N0cmVhbXMucHVzaChwbHVnaW4pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQXJjaGl2ZXI7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ29yZU9wdGlvbnNcbiAqIEBnbG9iYWxcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbc3RhdENvbmN1cnJlbmN5PTRdIFNldHMgdGhlIG51bWJlciBvZiB3b3JrZXJzIHVzZWQgdG9cbiAqIHByb2Nlc3MgdGhlIGludGVybmFsIGZzIHN0YXQgcXVldWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUcmFuc2Zvcm1PcHRpb25zXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IFthbGxvd0hhbGZPcGVuPXRydWVdIElmIHNldCB0byBmYWxzZSwgdGhlbiB0aGUgc3RyZWFtXG4gKiB3aWxsIGF1dG9tYXRpY2FsbHkgZW5kIHRoZSByZWFkYWJsZSBzaWRlIHdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZW5kcyBhbmQgdmljZVxuICogdmVyc2EuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IFtyZWFkYWJsZU9iamVjdE1vZGU9ZmFsc2VdIFNldHMgb2JqZWN0TW9kZSBmb3IgcmVhZGFibGVcbiAqIHNpZGUgb2YgdGhlIHN0cmVhbS4gSGFzIG5vIGVmZmVjdCBpZiBvYmplY3RNb2RlIGlzIHRydWUuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IFt3cml0YWJsZU9iamVjdE1vZGU9ZmFsc2VdIFNldHMgb2JqZWN0TW9kZSBmb3Igd3JpdGFibGVcbiAqIHNpZGUgb2YgdGhlIHN0cmVhbS4gSGFzIG5vIGVmZmVjdCBpZiBvYmplY3RNb2RlIGlzIHRydWUuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IFtkZWNvZGVTdHJpbmdzPXRydWVdIFdoZXRoZXIgb3Igbm90IHRvIGRlY29kZSBzdHJpbmdzXG4gKiBpbnRvIEJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byBfd3JpdGUoKS4gYFdyaXRhYmxlYFxuICogQHByb3BlcnR5IHtTdHJpbmd9IFtlbmNvZGluZz1OVUxMXSBJZiBzcGVjaWZpZWQsIHRoZW4gYnVmZmVycyB3aWxsIGJlIGRlY29kZWRcbiAqIHRvIHN0cmluZ3MgdXNpbmcgdGhlIHNwZWNpZmllZCBlbmNvZGluZy4gYFJlYWRhYmxlYFxuICogQHByb3BlcnR5IHtOdW1iZXJ9IFtoaWdoV2F0ZXJNYXJrPTE2a2JdIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdG9yZVxuICogaW4gdGhlIGludGVybmFsIGJ1ZmZlciBiZWZvcmUgY2Vhc2luZyB0byByZWFkIGZyb20gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UuXG4gKiBgUmVhZGFibGVgIGBXcml0YWJsZWBcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW29iamVjdE1vZGU9ZmFsc2VdIFdoZXRoZXIgdGhpcyBzdHJlYW0gc2hvdWxkIGJlaGF2ZSBhcyBhXG4gKiBzdHJlYW0gb2Ygb2JqZWN0cy4gTWVhbmluZyB0aGF0IHN0cmVhbS5yZWFkKG4pIHJldHVybnMgYSBzaW5nbGUgdmFsdWUgaW5zdGVhZFxuICogb2YgYSBCdWZmZXIgb2Ygc2l6ZSBuLiBgUmVhZGFibGVgIGBXcml0YWJsZWBcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEVudHJ5RGF0YVxuICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgU2V0cyB0aGUgZW50cnkgbmFtZSBpbmNsdWRpbmcgaW50ZXJuYWwgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7KFN0cmluZ3xEYXRlKX0gW2RhdGU9Tk9XKCldIFNldHMgdGhlIGVudHJ5IGRhdGUuXG4gKiBAcHJvcGVydHkge051bWJlcn0gW21vZGU9RDowNzU1L0Y6MDY0NF0gU2V0cyB0aGUgZW50cnkgcGVybWlzc2lvbnMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gW3ByZWZpeF0gU2V0cyBhIHBhdGggcHJlZml4IGZvciB0aGUgZW50cnkgbmFtZS4gVXNlZnVsXG4gKiB3aGVuIHdvcmtpbmcgd2l0aCBtZXRob2RzIGxpa2UgYGRpcmVjdG9yeWAgb3IgYGdsb2JgLlxuICogQHByb3BlcnR5IHtmcy5TdGF0c30gW3N0YXRzXSBTZXRzIHRoZSBmcyBzdGF0IGRhdGEgZm9yIHRoaXMgZW50cnkgYWxsb3dpbmdcbiAqIGZvciByZWR1Y3Rpb24gb2YgZnMgc3RhdCBjYWxscyB3aGVuIHN0YXQgZGF0YSBpcyBhbHJlYWR5IGtub3duLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRXJyb3JEYXRhXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSBvZiB0aGUgZXJyb3IuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gY29kZSBUaGUgZXJyb3IgY29kZSBhc3NpZ25lZCB0byB0aGlzIGVycm9yLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGRhdGEgQWRkaXRpb25hbCBkYXRhIHByb3ZpZGVkIGZvciByZXBvcnRpbmcgb3IgZGVidWdnaW5nICh3aGVyZSBhdmFpbGFibGUpLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUHJvZ3Jlc3NEYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gZW50cmllc1xuICogQHByb3BlcnR5IHtOdW1iZXJ9IGVudHJpZXMudG90YWwgTnVtYmVyIG9mIGVudHJpZXMgdGhhdCBoYXZlIGJlZW4gYXBwZW5kZWQuXG4gKiBAcHJvcGVydHkge051bWJlcn0gZW50cmllcy5wcm9jZXNzZWQgTnVtYmVyIG9mIGVudHJpZXMgdGhhdCBoYXZlIGJlZW4gcHJvY2Vzc2VkLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGZzXG4gKiBAcHJvcGVydHkge051bWJlcn0gZnMudG90YWxCeXRlcyBOdW1iZXIgb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gYXBwZW5kZWQuIENhbGN1bGF0ZWQgYXN5bmNocm9ub3VzbHkgYW5kIG1pZ2h0IG5vdCBiZSBhY2N1cmF0ZTogaXQgZ3Jvd3RoIHdoaWxlIGVudHJpZXMgYXJlIGFkZGVkLiAoYmFzZWQgb24gZnMuU3RhdHMpXG4gKiBAcHJvcGVydHkge051bWJlcn0gZnMucHJvY2Vzc2VkQnl0ZXMgTnVtYmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gKGJhc2VkIG9uIGZzLlN0YXRzKVxuICovXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9878\n")},1175:(module,exports,__webpack_require__)=>{eval("/**\n * Archiver Core\n *\n * @ignore\n * @license [MIT]{@link https://github.com/archiverjs/node-archiver/blob/master/LICENSE}\n * @copyright (c) 2012-2014 Chris Talkington, contributors.\n */\n\nvar util = __webpack_require__(3837);\n\nconst ERROR_CODES = {\n 'ABORTED': 'archive was aborted',\n 'DIRECTORYDIRPATHREQUIRED': 'diretory dirpath argument must be a non-empty string value',\n 'DIRECTORYFUNCTIONINVALIDDATA': 'invalid data returned by directory custom data function',\n 'ENTRYNAMEREQUIRED': 'entry name must be a non-empty string value',\n 'FILEFILEPATHREQUIRED': 'file filepath argument must be a non-empty string value',\n 'FINALIZING': 'archive already finalizing',\n 'QUEUECLOSED': 'queue closed',\n 'NOENDMETHOD': 'no suitable finalize/end method defined by module',\n 'DIRECTORYNOTSUPPORTED': 'support for directory entries not defined by module',\n 'FORMATSET': 'archive format already set',\n 'INPUTSTEAMBUFFERREQUIRED': 'input source must be valid Stream or Buffer instance',\n 'MODULESET': 'module already set',\n 'SYMLINKNOTSUPPORTED': 'support for symlink entries not defined by module',\n 'SYMLINKFILEPATHREQUIRED': 'symlink filepath argument must be a non-empty string value',\n 'SYMLINKTARGETREQUIRED': 'symlink target argument must be a non-empty string value',\n 'ENTRYNOTSUPPORTED': 'entry not supported'\n};\n\nfunction ArchiverError(code, data) {\n Error.captureStackTrace(this, this.constructor);\n //this.name = this.constructor.name;\n this.message = ERROR_CODES[code] || code;\n this.code = code;\n this.data = data;\n}\n\nutil.inherits(ArchiverError, Error);\n\nexports = module.exports = ArchiverError;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE3NS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBLFdBQVcsbUJBQU8sQ0FBQyxJQUFNOztBQUV6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9hcmNoaXZlci9saWIvZXJyb3IuanM/NWY2YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFyY2hpdmVyIENvcmVcbiAqXG4gKiBAaWdub3JlXG4gKiBAbGljZW5zZSBbTUlUXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWFyY2hpdmVyL2Jsb2IvbWFzdGVyL0xJQ0VOU0V9XG4gKiBAY29weXJpZ2h0IChjKSAyMDEyLTIwMTQgQ2hyaXMgVGFsa2luZ3RvbiwgY29udHJpYnV0b3JzLlxuICovXG5cbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG5jb25zdCBFUlJPUl9DT0RFUyA9IHtcbiAgJ0FCT1JURUQnOiAnYXJjaGl2ZSB3YXMgYWJvcnRlZCcsXG4gICdESVJFQ1RPUllESVJQQVRIUkVRVUlSRUQnOiAnZGlyZXRvcnkgZGlycGF0aCBhcmd1bWVudCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyB2YWx1ZScsXG4gICdESVJFQ1RPUllGVU5DVElPTklOVkFMSUREQVRBJzogJ2ludmFsaWQgZGF0YSByZXR1cm5lZCBieSBkaXJlY3RvcnkgY3VzdG9tIGRhdGEgZnVuY3Rpb24nLFxuICAnRU5UUllOQU1FUkVRVUlSRUQnOiAnZW50cnkgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyB2YWx1ZScsXG4gICdGSUxFRklMRVBBVEhSRVFVSVJFRCc6ICdmaWxlIGZpbGVwYXRoIGFyZ3VtZW50IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIHZhbHVlJyxcbiAgJ0ZJTkFMSVpJTkcnOiAnYXJjaGl2ZSBhbHJlYWR5IGZpbmFsaXppbmcnLFxuICAnUVVFVUVDTE9TRUQnOiAncXVldWUgY2xvc2VkJyxcbiAgJ05PRU5ETUVUSE9EJzogJ25vIHN1aXRhYmxlIGZpbmFsaXplL2VuZCBtZXRob2QgZGVmaW5lZCBieSBtb2R1bGUnLFxuICAnRElSRUNUT1JZTk9UU1VQUE9SVEVEJzogJ3N1cHBvcnQgZm9yIGRpcmVjdG9yeSBlbnRyaWVzIG5vdCBkZWZpbmVkIGJ5IG1vZHVsZScsXG4gICdGT1JNQVRTRVQnOiAnYXJjaGl2ZSBmb3JtYXQgYWxyZWFkeSBzZXQnLFxuICAnSU5QVVRTVEVBTUJVRkZFUlJFUVVJUkVEJzogJ2lucHV0IHNvdXJjZSBtdXN0IGJlIHZhbGlkIFN0cmVhbSBvciBCdWZmZXIgaW5zdGFuY2UnLFxuICAnTU9EVUxFU0VUJzogJ21vZHVsZSBhbHJlYWR5IHNldCcsXG4gICdTWU1MSU5LTk9UU1VQUE9SVEVEJzogJ3N1cHBvcnQgZm9yIHN5bWxpbmsgZW50cmllcyBub3QgZGVmaW5lZCBieSBtb2R1bGUnLFxuICAnU1lNTElOS0ZJTEVQQVRIUkVRVUlSRUQnOiAnc3ltbGluayBmaWxlcGF0aCBhcmd1bWVudCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyB2YWx1ZScsXG4gICdTWU1MSU5LVEFSR0VUUkVRVUlSRUQnOiAnc3ltbGluayB0YXJnZXQgYXJndW1lbnQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcgdmFsdWUnLFxuICAnRU5UUllOT1RTVVBQT1JURUQnOiAnZW50cnkgbm90IHN1cHBvcnRlZCdcbn07XG5cbmZ1bmN0aW9uIEFyY2hpdmVyRXJyb3IoY29kZSwgZGF0YSkge1xuICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgLy90aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gIHRoaXMubWVzc2FnZSA9IEVSUk9SX0NPREVTW2NvZGVdIHx8IGNvZGU7XG4gIHRoaXMuY29kZSA9IGNvZGU7XG4gIHRoaXMuZGF0YSA9IGRhdGE7XG59XG5cbnV0aWwuaW5oZXJpdHMoQXJjaGl2ZXJFcnJvciwgRXJyb3IpO1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBBcmNoaXZlckVycm9yOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1175\n")},1072:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * JSON Format Plugin\n *\n * @module plugins/json\n * @license [MIT]{@link https://github.com/archiverjs/node-archiver/blob/master/LICENSE}\n * @copyright (c) 2012-2014 Chris Talkington, contributors.\n */\nvar inherits = (__webpack_require__(3837).inherits);\nvar Transform = (__webpack_require__(1451).Transform);\n\nvar crc32 = __webpack_require__(2779);\nvar util = __webpack_require__(3672);\n\n/**\n * @constructor\n * @param {(JsonOptions|TransformOptions)} options\n */\nvar Json = function(options) {\n if (!(this instanceof Json)) {\n return new Json(options);\n }\n\n options = this.options = util.defaults(options, {});\n\n Transform.call(this, options);\n\n this.supports = {\n directory: true,\n symlink: true\n };\n\n this.files = [];\n};\n\ninherits(Json, Transform);\n\n/**\n * [_transform description]\n *\n * @private\n * @param {Buffer} chunk\n * @param {String} encoding\n * @param {Function} callback\n * @return void\n */\nJson.prototype._transform = function(chunk, encoding, callback) {\n callback(null, chunk);\n};\n\n/**\n * [_writeStringified description]\n *\n * @private\n * @return void\n */\nJson.prototype._writeStringified = function() {\n var fileString = JSON.stringify(this.files);\n this.write(fileString);\n};\n\n/**\n * [append description]\n *\n * @param {(Buffer|Stream)} source\n * @param {EntryData} data\n * @param {Function} callback\n * @return void\n */\nJson.prototype.append = function(source, data, callback) {\n var self = this;\n\n data.crc32 = 0;\n\n function onend(err, sourceBuffer) {\n if (err) {\n callback(err);\n return;\n }\n\n data.size = sourceBuffer.length || 0;\n data.crc32 = crc32.unsigned(sourceBuffer);\n\n self.files.push(data);\n\n callback(null, data);\n }\n\n if (data.sourceType === 'buffer') {\n onend(null, source);\n } else if (data.sourceType === 'stream') {\n util.collectStream(source, onend);\n }\n};\n\n/**\n * [finalize description]\n *\n * @return void\n */\nJson.prototype.finalize = function() {\n this._writeStringified();\n this.end();\n};\n\nmodule.exports = Json;\n\n/**\n * @typedef {Object} JsonOptions\n * @global\n */\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA3Mi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EsZUFBZSxvQ0FBd0I7QUFDdkMsZ0JBQWdCLHFDQUFvQzs7QUFFcEQsWUFBWSxtQkFBTyxDQUFDLElBQWM7QUFDbEMsV0FBVyxtQkFBTyxDQUFDLElBQWdCOztBQUVuQztBQUNBO0FBQ0EsV0FBVyxnQ0FBZ0M7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvREFBb0Q7O0FBRXBEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFVBQVU7QUFDdEIsWUFBWSxVQUFVO0FBQ3RCLFlBQVksVUFBVTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVksbUJBQW1CO0FBQy9CLFlBQVksYUFBYTtBQUN6QixZQUFZLFVBQVU7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9hcmNoaXZlci9saWIvcGx1Z2lucy9qc29uLmpzP2U1ZmMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKU09OIEZvcm1hdCBQbHVnaW5cbiAqXG4gKiBAbW9kdWxlIHBsdWdpbnMvanNvblxuICogQGxpY2Vuc2UgW01JVF17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1hcmNoaXZlci9ibG9iL21hc3Rlci9MSUNFTlNFfVxuICogQGNvcHlyaWdodCAoYykgMjAxMi0yMDE0IENocmlzIFRhbGtpbmd0b24sIGNvbnRyaWJ1dG9ycy5cbiAqL1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgndXRpbCcpLmluaGVyaXRzO1xudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpLlRyYW5zZm9ybTtcblxudmFyIGNyYzMyID0gcmVxdWlyZSgnYnVmZmVyLWNyYzMyJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ2FyY2hpdmVyLXV0aWxzJyk7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0geyhKc29uT3B0aW9uc3xUcmFuc2Zvcm1PcHRpb25zKX0gb3B0aW9uc1xuICovXG52YXIgSnNvbiA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEpzb24pKSB7XG4gICAgcmV0dXJuIG5ldyBKc29uKG9wdGlvbnMpO1xuICB9XG5cbiAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyA9IHV0aWwuZGVmYXVsdHMob3B0aW9ucywge30pO1xuXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuc3VwcG9ydHMgPSB7XG4gICAgZGlyZWN0b3J5OiB0cnVlLFxuICAgIHN5bWxpbms6IHRydWVcbiAgfTtcblxuICB0aGlzLmZpbGVzID0gW107XG59O1xuXG5pbmhlcml0cyhKc29uLCBUcmFuc2Zvcm0pO1xuXG4vKipcbiAqIFtfdHJhbnNmb3JtIGRlc2NyaXB0aW9uXVxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtCdWZmZXJ9ICAgY2h1bmtcbiAqIEBwYXJhbSAge1N0cmluZ30gICBlbmNvZGluZ1xuICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuSnNvbi5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgY2FsbGJhY2sobnVsbCwgY2h1bmspO1xufTtcblxuLyoqXG4gKiBbX3dyaXRlU3RyaW5naWZpZWQgZGVzY3JpcHRpb25dXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4gdm9pZFxuICovXG5Kc29uLnByb3RvdHlwZS5fd3JpdGVTdHJpbmdpZmllZCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZmlsZVN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHRoaXMuZmlsZXMpO1xuICB0aGlzLndyaXRlKGZpbGVTdHJpbmcpO1xufTtcblxuLyoqXG4gKiBbYXBwZW5kIGRlc2NyaXB0aW9uXVxuICpcbiAqIEBwYXJhbSAgeyhCdWZmZXJ8U3RyZWFtKX0gICBzb3VyY2VcbiAqIEBwYXJhbSAge0VudHJ5RGF0YX0gICBkYXRhXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4gdm9pZFxuICovXG5Kc29uLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbihzb3VyY2UsIGRhdGEsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICBkYXRhLmNyYzMyID0gMDtcblxuICBmdW5jdGlvbiBvbmVuZChlcnIsIHNvdXJjZUJ1ZmZlcikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGF0YS5zaXplID0gc291cmNlQnVmZmVyLmxlbmd0aCB8fCAwO1xuICAgIGRhdGEuY3JjMzIgPSBjcmMzMi51bnNpZ25lZChzb3VyY2VCdWZmZXIpO1xuXG4gICAgc2VsZi5maWxlcy5wdXNoKGRhdGEpO1xuXG4gICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gIH1cblxuICBpZiAoZGF0YS5zb3VyY2VUeXBlID09PSAnYnVmZmVyJykge1xuICAgIG9uZW5kKG51bGwsIHNvdXJjZSk7XG4gIH0gZWxzZSBpZiAoZGF0YS5zb3VyY2VUeXBlID09PSAnc3RyZWFtJykge1xuICAgIHV0aWwuY29sbGVjdFN0cmVhbShzb3VyY2UsIG9uZW5kKTtcbiAgfVxufTtcblxuLyoqXG4gKiBbZmluYWxpemUgZGVzY3JpcHRpb25dXG4gKlxuICogQHJldHVybiB2b2lkXG4gKi9cbkpzb24ucHJvdG90eXBlLmZpbmFsaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3dyaXRlU3RyaW5naWZpZWQoKTtcbiAgdGhpcy5lbmQoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gSnNvbjtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBKc29uT3B0aW9uc1xuICogQGdsb2JhbFxuICovXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1072\n")},62:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * TAR Format Plugin\n *\n * @module plugins/tar\n * @license [MIT]{@link https://github.com/archiverjs/node-archiver/blob/master/LICENSE}\n * @copyright (c) 2012-2014 Chris Talkington, contributors.\n */\nvar zlib = __webpack_require__(9796);\n\nvar engine = __webpack_require__(3871);\nvar util = __webpack_require__(3672);\n\n/**\n * @constructor\n * @param {TarOptions} options\n */\nvar Tar = function(options) {\n if (!(this instanceof Tar)) {\n return new Tar(options);\n }\n\n options = this.options = util.defaults(options, {\n gzip: false\n });\n\n if (typeof options.gzipOptions !== 'object') {\n options.gzipOptions = {};\n }\n\n this.supports = {\n directory: true,\n symlink: true\n };\n\n this.engine = engine.pack(options);\n this.compressor = false;\n\n if (options.gzip) {\n this.compressor = zlib.createGzip(options.gzipOptions);\n this.compressor.on('error', this._onCompressorError.bind(this));\n }\n};\n\n/**\n * [_onCompressorError description]\n *\n * @private\n * @param {Error} err\n * @return void\n */\nTar.prototype._onCompressorError = function(err) {\n this.engine.emit('error', err);\n};\n\n/**\n * [append description]\n *\n * @param {(Buffer|Stream)} source\n * @param {TarEntryData} data\n * @param {Function} callback\n * @return void\n */\nTar.prototype.append = function(source, data, callback) {\n var self = this;\n\n data.mtime = data.date;\n\n function append(err, sourceBuffer) {\n if (err) {\n callback(err);\n return;\n }\n\n self.engine.entry(data, sourceBuffer, function(err) {\n callback(err, data);\n });\n }\n\n if (data.sourceType === 'buffer') {\n append(null, source);\n } else if (data.sourceType === 'stream' && data.stats) {\n data.size = data.stats.size;\n\n var entry = self.engine.entry(data, function(err) {\n callback(err, data);\n });\n\n source.pipe(entry);\n } else if (data.sourceType === 'stream') {\n util.collectStream(source, append);\n }\n};\n\n/**\n * [finalize description]\n *\n * @return void\n */\nTar.prototype.finalize = function() {\n this.engine.finalize();\n};\n\n/**\n * [on description]\n *\n * @return this.engine\n */\nTar.prototype.on = function() {\n return this.engine.on.apply(this.engine, arguments);\n};\n\n/**\n * [pipe description]\n *\n * @param {String} destination\n * @param {Object} options\n * @return this.engine\n */\nTar.prototype.pipe = function(destination, options) {\n if (this.compressor) {\n return this.engine.pipe.apply(this.engine, [this.compressor]).pipe(destination, options);\n } else {\n return this.engine.pipe.apply(this.engine, arguments);\n }\n};\n\n/**\n * [unpipe description]\n *\n * @return this.engine\n */\nTar.prototype.unpipe = function() {\n if (this.compressor) {\n return this.compressor.unpipe.apply(this.compressor, arguments);\n } else {\n return this.engine.unpipe.apply(this.engine, arguments);\n }\n};\n\nmodule.exports = Tar;\n\n/**\n * @typedef {Object} TarOptions\n * @global\n * @property {Boolean} [gzip=false] Compress the tar archive using gzip.\n * @property {Object} [gzipOptions] Passed to [zlib]{@link https://nodejs.org/api/zlib.html#zlib_class_options}\n * to control compression.\n * @property {*} [*] See [tar-stream]{@link https://github.com/mafintosh/tar-stream} documentation for additional properties.\n */\n\n/**\n * @typedef {Object} TarEntryData\n * @global\n * @property {String} name Sets the entry name including internal path.\n * @property {(String|Date)} [date=NOW()] Sets the entry date.\n * @property {Number} [mode=D:0755/F:0644] Sets the entry permissions.\n * @property {String} [prefix] Sets a path prefix for the entry name. Useful\n * when working with methods like `directory` or `glob`.\n * @property {fs.Stats} [stats] Sets the fs stat data for this entry allowing\n * for reduction of fs stat calls when stat data is already known.\n */\n\n/**\n * TarStream Module\n * @external TarStream\n * @see {@link https://github.com/mafintosh/tar-stream}\n */\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLFdBQVcsbUJBQU8sQ0FBQyxJQUFNOztBQUV6QixhQUFhLG1CQUFPLENBQUMsSUFBWTtBQUNqQyxXQUFXLG1CQUFPLENBQUMsSUFBZ0I7O0FBRW5DO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWSxpQkFBaUI7QUFDN0IsWUFBWSxjQUFjO0FBQzFCLFlBQVksVUFBVTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQixZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxjQUFjLFNBQVM7QUFDdkIsY0FBYyxRQUFRLCtCQUErQjtBQUNyRDtBQUNBLGNBQWMsR0FBRyxxQkFBcUIsK0NBQStDO0FBQ3JGOztBQUVBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsZUFBZTtBQUM3QixjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCO0FBQ0EsY0FBYyxVQUFVO0FBQ3hCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvYXJjaGl2ZXIvbGliL3BsdWdpbnMvdGFyLmpzP2Y0YzIiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUQVIgRm9ybWF0IFBsdWdpblxuICpcbiAqIEBtb2R1bGUgcGx1Z2lucy90YXJcbiAqIEBsaWNlbnNlIFtNSVRde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hcmNoaXZlcmpzL25vZGUtYXJjaGl2ZXIvYmxvYi9tYXN0ZXIvTElDRU5TRX1cbiAqIEBjb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKi9cbnZhciB6bGliID0gcmVxdWlyZSgnemxpYicpO1xuXG52YXIgZW5naW5lID0gcmVxdWlyZSgndGFyLXN0cmVhbScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCdhcmNoaXZlci11dGlscycpO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtUYXJPcHRpb25zfSBvcHRpb25zXG4gKi9cbnZhciBUYXIgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUYXIpKSB7XG4gICAgcmV0dXJuIG5ldyBUYXIob3B0aW9ucyk7XG4gIH1cblxuICBvcHRpb25zID0gdGhpcy5vcHRpb25zID0gdXRpbC5kZWZhdWx0cyhvcHRpb25zLCB7XG4gICAgZ3ppcDogZmFsc2VcbiAgfSk7XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmd6aXBPcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIG9wdGlvbnMuZ3ppcE9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHRoaXMuc3VwcG9ydHMgPSB7XG4gICAgZGlyZWN0b3J5OiB0cnVlLFxuICAgIHN5bWxpbms6IHRydWVcbiAgfTtcblxuICB0aGlzLmVuZ2luZSA9IGVuZ2luZS5wYWNrKG9wdGlvbnMpO1xuICB0aGlzLmNvbXByZXNzb3IgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucy5nemlwKSB7XG4gICAgdGhpcy5jb21wcmVzc29yID0gemxpYi5jcmVhdGVHemlwKG9wdGlvbnMuZ3ppcE9wdGlvbnMpO1xuICAgIHRoaXMuY29tcHJlc3Nvci5vbignZXJyb3InLCB0aGlzLl9vbkNvbXByZXNzb3JFcnJvci5iaW5kKHRoaXMpKTtcbiAgfVxufTtcblxuLyoqXG4gKiBbX29uQ29tcHJlc3NvckVycm9yIGRlc2NyaXB0aW9uXVxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtFcnJvcn0gZXJyXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuVGFyLnByb3RvdHlwZS5fb25Db21wcmVzc29yRXJyb3IgPSBmdW5jdGlvbihlcnIpIHtcbiAgdGhpcy5lbmdpbmUuZW1pdCgnZXJyb3InLCBlcnIpO1xufTtcblxuLyoqXG4gKiBbYXBwZW5kIGRlc2NyaXB0aW9uXVxuICpcbiAqIEBwYXJhbSAgeyhCdWZmZXJ8U3RyZWFtKX0gc291cmNlXG4gKiBAcGFyYW0gIHtUYXJFbnRyeURhdGF9IGRhdGFcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB2b2lkXG4gKi9cblRhci5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24oc291cmNlLCBkYXRhLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgZGF0YS5tdGltZSA9IGRhdGEuZGF0ZTtcblxuICBmdW5jdGlvbiBhcHBlbmQoZXJyLCBzb3VyY2VCdWZmZXIpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNlbGYuZW5naW5lLmVudHJ5KGRhdGEsIHNvdXJjZUJ1ZmZlciwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICBjYWxsYmFjayhlcnIsIGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKGRhdGEuc291cmNlVHlwZSA9PT0gJ2J1ZmZlcicpIHtcbiAgICBhcHBlbmQobnVsbCwgc291cmNlKTtcbiAgfSBlbHNlIGlmIChkYXRhLnNvdXJjZVR5cGUgPT09ICdzdHJlYW0nICYmIGRhdGEuc3RhdHMpIHtcbiAgICBkYXRhLnNpemUgPSBkYXRhLnN0YXRzLnNpemU7XG5cbiAgICB2YXIgZW50cnkgPSBzZWxmLmVuZ2luZS5lbnRyeShkYXRhLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgIGNhbGxiYWNrKGVyciwgZGF0YSk7XG4gICAgfSk7XG5cbiAgICBzb3VyY2UucGlwZShlbnRyeSk7XG4gIH0gZWxzZSBpZiAoZGF0YS5zb3VyY2VUeXBlID09PSAnc3RyZWFtJykge1xuICAgIHV0aWwuY29sbGVjdFN0cmVhbShzb3VyY2UsIGFwcGVuZCk7XG4gIH1cbn07XG5cbi8qKlxuICogW2ZpbmFsaXplIGRlc2NyaXB0aW9uXVxuICpcbiAqIEByZXR1cm4gdm9pZFxuICovXG5UYXIucHJvdG90eXBlLmZpbmFsaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZW5naW5lLmZpbmFsaXplKCk7XG59O1xuXG4vKipcbiAqIFtvbiBkZXNjcmlwdGlvbl1cbiAqXG4gKiBAcmV0dXJuIHRoaXMuZW5naW5lXG4gKi9cblRhci5wcm90b3R5cGUub24gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZW5naW5lLm9uLmFwcGx5KHRoaXMuZW5naW5lLCBhcmd1bWVudHMpO1xufTtcblxuLyoqXG4gKiBbcGlwZSBkZXNjcmlwdGlvbl1cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGRlc3RpbmF0aW9uXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4gdGhpcy5lbmdpbmVcbiAqL1xuVGFyLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oZGVzdGluYXRpb24sIG9wdGlvbnMpIHtcbiAgaWYgKHRoaXMuY29tcHJlc3Nvcikge1xuICAgIHJldHVybiB0aGlzLmVuZ2luZS5waXBlLmFwcGx5KHRoaXMuZW5naW5lLCBbdGhpcy5jb21wcmVzc29yXSkucGlwZShkZXN0aW5hdGlvbiwgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMuZW5naW5lLnBpcGUuYXBwbHkodGhpcy5lbmdpbmUsIGFyZ3VtZW50cyk7XG4gIH1cbn07XG5cbi8qKlxuICogW3VucGlwZSBkZXNjcmlwdGlvbl1cbiAqXG4gKiBAcmV0dXJuIHRoaXMuZW5naW5lXG4gKi9cblRhci5wcm90b3R5cGUudW5waXBlID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLmNvbXByZXNzb3IpIHtcbiAgICByZXR1cm4gdGhpcy5jb21wcmVzc29yLnVucGlwZS5hcHBseSh0aGlzLmNvbXByZXNzb3IsIGFyZ3VtZW50cyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMuZW5naW5lLnVucGlwZS5hcHBseSh0aGlzLmVuZ2luZSwgYXJndW1lbnRzKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBUYXI7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVGFyT3B0aW9uc1xuICogQGdsb2JhbFxuICogQHByb3BlcnR5IHtCb29sZWFufSBbZ3ppcD1mYWxzZV0gQ29tcHJlc3MgdGhlIHRhciBhcmNoaXZlIHVzaW5nIGd6aXAuXG4gKiBAcHJvcGVydHkge09iamVjdH0gW2d6aXBPcHRpb25zXSBQYXNzZWQgdG8gW3psaWJde0BsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvemxpYi5odG1sI3psaWJfY2xhc3Nfb3B0aW9uc31cbiAqIHRvIGNvbnRyb2wgY29tcHJlc3Npb24uXG4gKiBAcHJvcGVydHkgeyp9IFsqXSBTZWUgW3Rhci1zdHJlYW1de0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9tYWZpbnRvc2gvdGFyLXN0cmVhbX0gZG9jdW1lbnRhdGlvbiBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVGFyRW50cnlEYXRhXG4gKiBAZ2xvYmFsXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBTZXRzIHRoZSBlbnRyeSBuYW1lIGluY2x1ZGluZyBpbnRlcm5hbCBwYXRoLlxuICogQHByb3BlcnR5IHsoU3RyaW5nfERhdGUpfSBbZGF0ZT1OT1coKV0gU2V0cyB0aGUgZW50cnkgZGF0ZS5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbbW9kZT1EOjA3NTUvRjowNjQ0XSBTZXRzIHRoZSBlbnRyeSBwZXJtaXNzaW9ucy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbcHJlZml4XSBTZXRzIGEgcGF0aCBwcmVmaXggZm9yIHRoZSBlbnRyeSBuYW1lLiBVc2VmdWxcbiAqIHdoZW4gd29ya2luZyB3aXRoIG1ldGhvZHMgbGlrZSBgZGlyZWN0b3J5YCBvciBgZ2xvYmAuXG4gKiBAcHJvcGVydHkge2ZzLlN0YXRzfSBbc3RhdHNdIFNldHMgdGhlIGZzIHN0YXQgZGF0YSBmb3IgdGhpcyBlbnRyeSBhbGxvd2luZ1xuICogZm9yIHJlZHVjdGlvbiBvZiBmcyBzdGF0IGNhbGxzIHdoZW4gc3RhdCBkYXRhIGlzIGFscmVhZHkga25vd24uXG4gKi9cblxuLyoqXG4gKiBUYXJTdHJlYW0gTW9kdWxlXG4gKiBAZXh0ZXJuYWwgVGFyU3RyZWFtXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbWFmaW50b3NoL3Rhci1zdHJlYW19XG4gKi9cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///62\n")},907:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * ZIP Format Plugin\n *\n * @module plugins/zip\n * @license [MIT]{@link https://github.com/archiverjs/node-archiver/blob/master/LICENSE}\n * @copyright (c) 2012-2014 Chris Talkington, contributors.\n */\nvar engine = __webpack_require__(7380);\nvar util = __webpack_require__(3672);\n\n/**\n * @constructor\n * @param {ZipOptions} [options]\n * @param {String} [options.comment] Sets the zip archive comment.\n * @param {Boolean} [options.forceLocalTime=false] Forces the archive to contain local file times instead of UTC.\n * @param {Boolean} [options.forceZip64=false] Forces the archive to contain ZIP64 headers.\n * @param {Boolean} [options.namePrependSlash=false] Prepends a forward slash to archive file paths.\n * @param {Boolean} [options.store=false] Sets the compression method to STORE.\n * @param {Object} [options.zlib] Passed to [zlib]{@link https://nodejs.org/api/zlib.html#zlib_class_options}\n */\nvar Zip = function(options) {\n if (!(this instanceof Zip)) {\n return new Zip(options);\n }\n\n options = this.options = util.defaults(options, {\n comment: '',\n forceUTC: false,\n namePrependSlash: false,\n store: false\n });\n\n this.supports = {\n directory: true,\n symlink: true\n };\n\n this.engine = new engine(options);\n};\n\n/**\n * @param {(Buffer|Stream)} source\n * @param {ZipEntryData} data\n * @param {String} data.name Sets the entry name including internal path.\n * @param {(String|Date)} [data.date=NOW()] Sets the entry date.\n * @param {Number} [data.mode=D:0755/F:0644] Sets the entry permissions.\n * @param {String} [data.prefix] Sets a path prefix for the entry name. Useful\n * when working with methods like `directory` or `glob`.\n * @param {fs.Stats} [data.stats] Sets the fs stat data for this entry allowing\n * for reduction of fs stat calls when stat data is already known.\n * @param {Boolean} [data.store=ZipOptions.store] Sets the compression method to STORE.\n * @param {Function} callback\n * @return void\n */\nZip.prototype.append = function(source, data, callback) {\n this.engine.entry(source, data, callback);\n};\n\n/**\n * @return void\n */\nZip.prototype.finalize = function() {\n this.engine.finalize();\n};\n\n/**\n * @return this.engine\n */\nZip.prototype.on = function() {\n return this.engine.on.apply(this.engine, arguments);\n};\n\n/**\n * @return this.engine\n */\nZip.prototype.pipe = function() {\n return this.engine.pipe.apply(this.engine, arguments);\n};\n\n/**\n * @return this.engine\n */\nZip.prototype.unpipe = function() {\n return this.engine.unpipe.apply(this.engine, arguments);\n};\n\nmodule.exports = Zip;\n\n/**\n * @typedef {Object} ZipOptions\n * @global\n * @property {String} [comment] Sets the zip archive comment.\n * @property {Boolean} [forceLocalTime=false] Forces the archive to contain local file times instead of UTC.\n * @property {Boolean} [forceZip64=false] Forces the archive to contain ZIP64 headers.\n * @prpperty {Boolean} [namePrependSlash=false] Prepends a forward slash to archive file paths.\n * @property {Boolean} [store=false] Sets the compression method to STORE.\n * @property {Object} [zlib] Passed to [zlib]{@link https://nodejs.org/api/zlib.html#zlib_class_options}\n * to control compression.\n * @property {*} [*] See [zip-stream]{@link https://archiverjs.com/zip-stream/ZipStream.html} documentation for current list of properties.\n */\n\n/**\n * @typedef {Object} ZipEntryData\n * @global\n * @property {String} name Sets the entry name including internal path.\n * @property {(String|Date)} [date=NOW()] Sets the entry date.\n * @property {Number} [mode=D:0755/F:0644] Sets the entry permissions.\n * @property {Boolean} [namePrependSlash=ZipOptions.namePrependSlash] Prepends a forward slash to archive file paths.\n * @property {String} [prefix] Sets a path prefix for the entry name. Useful\n * when working with methods like `directory` or `glob`.\n * @property {fs.Stats} [stats] Sets the fs stat data for this entry allowing\n * for reduction of fs stat calls when stat data is already known.\n * @property {Boolean} [store=ZipOptions.store] Sets the compression method to STORE.\n */\n\n/**\n * ZipStream Module\n * @external ZipStream\n * @see {@link https://www.archiverjs.com/zip-stream/ZipStream.html}\n */\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTA3LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxhQUFhLG1CQUFPLENBQUMsSUFBWTtBQUNqQyxXQUFXLG1CQUFPLENBQUMsSUFBZ0I7O0FBRW5DO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsU0FBUztBQUNwQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsU0FBUztBQUNwQixXQUFXLFFBQVEsZ0NBQWdDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFlBQVksaUJBQWlCO0FBQzdCLFlBQVksY0FBYztBQUMxQixZQUFZLFFBQVE7QUFDcEIsWUFBWSxlQUFlO0FBQzNCLFlBQVksUUFBUTtBQUNwQixZQUFZLFFBQVE7QUFDcEI7QUFDQSxZQUFZLFVBQVU7QUFDdEI7QUFDQSxZQUFZLFNBQVM7QUFDckIsWUFBWSxVQUFVO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsU0FBUztBQUN2QixjQUFjLFNBQVM7QUFDdkIsY0FBYyxTQUFTO0FBQ3ZCLGNBQWMsU0FBUztBQUN2QixjQUFjLFFBQVEsd0JBQXdCO0FBQzlDO0FBQ0EsY0FBYyxHQUFHLHFCQUFxQix3REFBd0Q7QUFDOUY7O0FBRUE7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxjQUFjLFFBQVE7QUFDdEIsY0FBYyxlQUFlO0FBQzdCLGNBQWMsUUFBUTtBQUN0QixjQUFjLFNBQVM7QUFDdkIsY0FBYyxRQUFRO0FBQ3RCO0FBQ0EsY0FBYyxVQUFVO0FBQ3hCO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2FyY2hpdmVyL2xpYi9wbHVnaW5zL3ppcC5qcz83MjNkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogWklQIEZvcm1hdCBQbHVnaW5cbiAqXG4gKiBAbW9kdWxlIHBsdWdpbnMvemlwXG4gKiBAbGljZW5zZSBbTUlUXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWFyY2hpdmVyL2Jsb2IvbWFzdGVyL0xJQ0VOU0V9XG4gKiBAY29weXJpZ2h0IChjKSAyMDEyLTIwMTQgQ2hyaXMgVGFsa2luZ3RvbiwgY29udHJpYnV0b3JzLlxuICovXG52YXIgZW5naW5lID0gcmVxdWlyZSgnemlwLXN0cmVhbScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCdhcmNoaXZlci11dGlscycpO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtaaXBPcHRpb25zfSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5jb21tZW50XSBTZXRzIHRoZSB6aXAgYXJjaGl2ZSBjb21tZW50LlxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5mb3JjZUxvY2FsVGltZT1mYWxzZV0gRm9yY2VzIHRoZSBhcmNoaXZlIHRvIGNvbnRhaW4gbG9jYWwgZmlsZSB0aW1lcyBpbnN0ZWFkIG9mIFVUQy5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZm9yY2VaaXA2ND1mYWxzZV0gRm9yY2VzIHRoZSBhcmNoaXZlIHRvIGNvbnRhaW4gWklQNjQgaGVhZGVycy5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubmFtZVByZXBlbmRTbGFzaD1mYWxzZV0gUHJlcGVuZHMgYSBmb3J3YXJkIHNsYXNoIHRvIGFyY2hpdmUgZmlsZSBwYXRocy5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc3RvcmU9ZmFsc2VdIFNldHMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCB0byBTVE9SRS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy56bGliXSBQYXNzZWQgdG8gW3psaWJde0BsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvemxpYi5odG1sI3psaWJfY2xhc3Nfb3B0aW9uc31cbiAqL1xudmFyIFppcCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFppcCkpIHtcbiAgICByZXR1cm4gbmV3IFppcChvcHRpb25zKTtcbiAgfVxuXG4gIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMgPSB1dGlsLmRlZmF1bHRzKG9wdGlvbnMsIHtcbiAgICBjb21tZW50OiAnJyxcbiAgICBmb3JjZVVUQzogZmFsc2UsXG4gICAgbmFtZVByZXBlbmRTbGFzaDogZmFsc2UsXG4gICAgc3RvcmU6IGZhbHNlXG4gIH0pO1xuXG4gIHRoaXMuc3VwcG9ydHMgPSB7XG4gICAgZGlyZWN0b3J5OiB0cnVlLFxuICAgIHN5bWxpbms6IHRydWVcbiAgfTtcblxuICB0aGlzLmVuZ2luZSA9IG5ldyBlbmdpbmUob3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAgeyhCdWZmZXJ8U3RyZWFtKX0gc291cmNlXG4gKiBAcGFyYW0gIHtaaXBFbnRyeURhdGF9IGRhdGFcbiAqIEBwYXJhbSAge1N0cmluZ30gZGF0YS5uYW1lIFNldHMgdGhlIGVudHJ5IG5hbWUgaW5jbHVkaW5nIGludGVybmFsIHBhdGguXG4gKiBAcGFyYW0gIHsoU3RyaW5nfERhdGUpfSBbZGF0YS5kYXRlPU5PVygpXSBTZXRzIHRoZSBlbnRyeSBkYXRlLlxuICogQHBhcmFtICB7TnVtYmVyfSBbZGF0YS5tb2RlPUQ6MDc1NS9GOjA2NDRdIFNldHMgdGhlIGVudHJ5IHBlcm1pc3Npb25zLlxuICogQHBhcmFtICB7U3RyaW5nfSBbZGF0YS5wcmVmaXhdIFNldHMgYSBwYXRoIHByZWZpeCBmb3IgdGhlIGVudHJ5IG5hbWUuIFVzZWZ1bFxuICogd2hlbiB3b3JraW5nIHdpdGggbWV0aG9kcyBsaWtlIGBkaXJlY3RvcnlgIG9yIGBnbG9iYC5cbiAqIEBwYXJhbSAge2ZzLlN0YXRzfSBbZGF0YS5zdGF0c10gU2V0cyB0aGUgZnMgc3RhdCBkYXRhIGZvciB0aGlzIGVudHJ5IGFsbG93aW5nXG4gKiBmb3IgcmVkdWN0aW9uIG9mIGZzIHN0YXQgY2FsbHMgd2hlbiBzdGF0IGRhdGEgaXMgYWxyZWFkeSBrbm93bi5cbiAqIEBwYXJhbSAge0Jvb2xlYW59IFtkYXRhLnN0b3JlPVppcE9wdGlvbnMuc3RvcmVdIFNldHMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCB0byBTVE9SRS5cbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB2b2lkXG4gKi9cblppcC5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24oc291cmNlLCBkYXRhLCBjYWxsYmFjaykge1xuICB0aGlzLmVuZ2luZS5lbnRyeShzb3VyY2UsIGRhdGEsIGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB2b2lkXG4gKi9cblppcC5wcm90b3R5cGUuZmluYWxpemUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5lbmdpbmUuZmluYWxpemUoKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB0aGlzLmVuZ2luZVxuICovXG5aaXAucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVuZ2luZS5vbi5hcHBseSh0aGlzLmVuZ2luZSwgYXJndW1lbnRzKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB0aGlzLmVuZ2luZVxuICovXG5aaXAucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZW5naW5lLnBpcGUuYXBwbHkodGhpcy5lbmdpbmUsIGFyZ3VtZW50cyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4gdGhpcy5lbmdpbmVcbiAqL1xuWmlwLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZW5naW5lLnVucGlwZS5hcHBseSh0aGlzLmVuZ2luZSwgYXJndW1lbnRzKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gWmlwO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFppcE9wdGlvbnNcbiAqIEBnbG9iYWxcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbY29tbWVudF0gU2V0cyB0aGUgemlwIGFyY2hpdmUgY29tbWVudC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2ZvcmNlTG9jYWxUaW1lPWZhbHNlXSBGb3JjZXMgdGhlIGFyY2hpdmUgdG8gY29udGFpbiBsb2NhbCBmaWxlIHRpbWVzIGluc3RlYWQgb2YgVVRDLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBbZm9yY2VaaXA2ND1mYWxzZV0gRm9yY2VzIHRoZSBhcmNoaXZlIHRvIGNvbnRhaW4gWklQNjQgaGVhZGVycy5cbiAqIEBwcnBwZXJ0eSB7Qm9vbGVhbn0gW25hbWVQcmVwZW5kU2xhc2g9ZmFsc2VdIFByZXBlbmRzIGEgZm9yd2FyZCBzbGFzaCB0byBhcmNoaXZlIGZpbGUgcGF0aHMuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IFtzdG9yZT1mYWxzZV0gU2V0cyB0aGUgY29tcHJlc3Npb24gbWV0aG9kIHRvIFNUT1JFLlxuICogQHByb3BlcnR5IHtPYmplY3R9IFt6bGliXSBQYXNzZWQgdG8gW3psaWJde0BsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvemxpYi5odG1sI3psaWJfY2xhc3Nfb3B0aW9uc31cbiAqIHRvIGNvbnRyb2wgY29tcHJlc3Npb24uXG4gKiBAcHJvcGVydHkgeyp9IFsqXSBTZWUgW3ppcC1zdHJlYW1de0BsaW5rIGh0dHBzOi8vYXJjaGl2ZXJqcy5jb20vemlwLXN0cmVhbS9aaXBTdHJlYW0uaHRtbH0gZG9jdW1lbnRhdGlvbiBmb3IgY3VycmVudCBsaXN0IG9mIHByb3BlcnRpZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBaaXBFbnRyeURhdGFcbiAqIEBnbG9iYWxcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFNldHMgdGhlIGVudHJ5IG5hbWUgaW5jbHVkaW5nIGludGVybmFsIHBhdGguXG4gKiBAcHJvcGVydHkgeyhTdHJpbmd8RGF0ZSl9IFtkYXRlPU5PVygpXSBTZXRzIHRoZSBlbnRyeSBkYXRlLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IFttb2RlPUQ6MDc1NS9GOjA2NDRdIFNldHMgdGhlIGVudHJ5IHBlcm1pc3Npb25zLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBbbmFtZVByZXBlbmRTbGFzaD1aaXBPcHRpb25zLm5hbWVQcmVwZW5kU2xhc2hdIFByZXBlbmRzIGEgZm9yd2FyZCBzbGFzaCB0byBhcmNoaXZlIGZpbGUgcGF0aHMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gW3ByZWZpeF0gU2V0cyBhIHBhdGggcHJlZml4IGZvciB0aGUgZW50cnkgbmFtZS4gVXNlZnVsXG4gKiB3aGVuIHdvcmtpbmcgd2l0aCBtZXRob2RzIGxpa2UgYGRpcmVjdG9yeWAgb3IgYGdsb2JgLlxuICogQHByb3BlcnR5IHtmcy5TdGF0c30gW3N0YXRzXSBTZXRzIHRoZSBmcyBzdGF0IGRhdGEgZm9yIHRoaXMgZW50cnkgYWxsb3dpbmdcbiAqIGZvciByZWR1Y3Rpb24gb2YgZnMgc3RhdCBjYWxscyB3aGVuIHN0YXQgZGF0YSBpcyBhbHJlYWR5IGtub3duLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBbc3RvcmU9WmlwT3B0aW9ucy5zdG9yZV0gU2V0cyB0aGUgY29tcHJlc3Npb24gbWV0aG9kIHRvIFNUT1JFLlxuICovXG5cbi8qKlxuICogWmlwU3RyZWFtIE1vZHVsZVxuICogQGV4dGVybmFsIFppcFN0cmVhbVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93d3cuYXJjaGl2ZXJqcy5jb20vemlwLXN0cmVhbS9aaXBTdHJlYW0uaHRtbH1cbiAqL1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///907\n")},9118:(module,__unused_webpack_exports,__webpack_require__)=>{eval("module.exports =\n{\n parallel : __webpack_require__(9162),\n serial : __webpack_require__(1357),\n serialOrdered : __webpack_require__(9087)\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTExOC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0Esa0JBQWtCLG1CQUFPLENBQUMsSUFBZTtBQUN6QyxrQkFBa0IsbUJBQU8sQ0FBQyxJQUFhO0FBQ3ZDLGtCQUFrQixtQkFBTyxDQUFDLElBQW9CO0FBQzlDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvYXN5bmNraXQvaW5kZXguanM/OTYyMSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG57XG4gIHBhcmFsbGVsICAgICAgOiByZXF1aXJlKCcuL3BhcmFsbGVsLmpzJyksXG4gIHNlcmlhbCAgICAgICAgOiByZXF1aXJlKCcuL3NlcmlhbC5qcycpLFxuICBzZXJpYWxPcmRlcmVkIDogcmVxdWlyZSgnLi9zZXJpYWxPcmRlcmVkLmpzJylcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9118\n")},7651:module=>{eval("// API\nmodule.exports = abort;\n\n/**\n * Aborts leftover active jobs\n *\n * @param {object} state - current state object\n */\nfunction abort(state)\n{\n Object.keys(state.jobs).forEach(clean.bind(state));\n\n // reset leftover jobs\n state.jobs = {};\n}\n\n/**\n * Cleans up leftover job by invoking abort function for the provided job id\n *\n * @this state\n * @param {string|number} key - job id to abort\n */\nfunction clean(key)\n{\n if (typeof this.jobs[key] == 'function')\n {\n this.jobs[key]();\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzY1MS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGVBQWU7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2FzeW5ja2l0L2xpYi9hYm9ydC5qcz85NTZjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEFQSVxubW9kdWxlLmV4cG9ydHMgPSBhYm9ydDtcblxuLyoqXG4gKiBBYm9ydHMgbGVmdG92ZXIgYWN0aXZlIGpvYnNcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gc3RhdGUgLSBjdXJyZW50IHN0YXRlIG9iamVjdFxuICovXG5mdW5jdGlvbiBhYm9ydChzdGF0ZSlcbntcbiAgT2JqZWN0LmtleXMoc3RhdGUuam9icykuZm9yRWFjaChjbGVhbi5iaW5kKHN0YXRlKSk7XG5cbiAgLy8gcmVzZXQgbGVmdG92ZXIgam9ic1xuICBzdGF0ZS5qb2JzID0ge307XG59XG5cbi8qKlxuICogQ2xlYW5zIHVwIGxlZnRvdmVyIGpvYiBieSBpbnZva2luZyBhYm9ydCBmdW5jdGlvbiBmb3IgdGhlIHByb3ZpZGVkIGpvYiBpZFxuICpcbiAqIEB0aGlzICBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBrZXkgLSBqb2IgaWQgdG8gYWJvcnRcbiAqL1xuZnVuY3Rpb24gY2xlYW4oa2V5KVxue1xuICBpZiAodHlwZW9mIHRoaXMuam9ic1trZXldID09ICdmdW5jdGlvbicpXG4gIHtcbiAgICB0aGlzLmpvYnNba2V5XSgpO1xuICB9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7651\n")},5912:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var defer = __webpack_require__(9265);\n\n// API\nmodule.exports = async;\n\n/**\n * Runs provided callback asynchronously\n * even if callback itself is not\n *\n * @param {function} callback - callback to invoke\n * @returns {function} - augmented callback\n */\nfunction async(callback)\n{\n var isAsync = false;\n\n // check if async happened\n defer(function() { isAsync = true; });\n\n return function async_callback(err, result)\n {\n if (isAsync)\n {\n callback(err, result);\n }\n else\n {\n defer(function nextTick_callback()\n {\n callback(err, result);\n });\n }\n };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkxMi5qcyIsIm1hcHBpbmdzIjoiQUFBQSxZQUFZLG1CQUFPLENBQUMsSUFBWTs7QUFFaEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsVUFBVTtBQUN2QixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBcUIsaUJBQWlCOztBQUV0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2FzeW5ja2l0L2xpYi9hc3luYy5qcz84ZWNmIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBkZWZlciA9IHJlcXVpcmUoJy4vZGVmZXIuanMnKTtcblxuLy8gQVBJXG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jO1xuXG4vKipcbiAqIFJ1bnMgcHJvdmlkZWQgY2FsbGJhY2sgYXN5bmNocm9ub3VzbHlcbiAqIGV2ZW4gaWYgY2FsbGJhY2sgaXRzZWxmIGlzIG5vdFxuICpcbiAqIEBwYXJhbSAgIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBjYWxsYmFjayB0byBpbnZva2VcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gLSBhdWdtZW50ZWQgY2FsbGJhY2tcbiAqL1xuZnVuY3Rpb24gYXN5bmMoY2FsbGJhY2spXG57XG4gIHZhciBpc0FzeW5jID0gZmFsc2U7XG5cbiAgLy8gY2hlY2sgaWYgYXN5bmMgaGFwcGVuZWRcbiAgZGVmZXIoZnVuY3Rpb24oKSB7IGlzQXN5bmMgPSB0cnVlOyB9KTtcblxuICByZXR1cm4gZnVuY3Rpb24gYXN5bmNfY2FsbGJhY2soZXJyLCByZXN1bHQpXG4gIHtcbiAgICBpZiAoaXNBc3luYylcbiAgICB7XG4gICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdCk7XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICBkZWZlcihmdW5jdGlvbiBuZXh0VGlja19jYWxsYmFjaygpXG4gICAgICB7XG4gICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5912\n")},9265:module=>{eval("module.exports = defer;\n\n/**\n * Runs provided function on next iteration of the event loop\n *\n * @param {function} fn - function to run\n */\nfunction defer(fn)\n{\n var nextTick = typeof setImmediate == 'function'\n ? setImmediate\n : (\n typeof process == 'object' && typeof process.nextTick == 'function'\n ? process.nextTick\n : null\n );\n\n if (nextTick)\n {\n nextTick(fn);\n }\n else\n {\n setTimeout(fn, 0);\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTI2NS5qcyIsIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvYXN5bmNraXQvbGliL2RlZmVyLmpzPzkyYzEiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBkZWZlcjtcblxuLyoqXG4gKiBSdW5zIHByb3ZpZGVkIGZ1bmN0aW9uIG9uIG5leHQgaXRlcmF0aW9uIG9mIHRoZSBldmVudCBsb29wXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gZm4gLSBmdW5jdGlvbiB0byBydW5cbiAqL1xuZnVuY3Rpb24gZGVmZXIoZm4pXG57XG4gIHZhciBuZXh0VGljayA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgPT0gJ2Z1bmN0aW9uJ1xuICAgID8gc2V0SW1tZWRpYXRlXG4gICAgOiAoXG4gICAgICB0eXBlb2YgcHJvY2VzcyA9PSAnb2JqZWN0JyAmJiB0eXBlb2YgcHJvY2Vzcy5uZXh0VGljayA9PSAnZnVuY3Rpb24nXG4gICAgICA/IHByb2Nlc3MubmV4dFRpY2tcbiAgICAgIDogbnVsbFxuICAgICk7XG5cbiAgaWYgKG5leHRUaWNrKVxuICB7XG4gICAgbmV4dFRpY2soZm4pO1xuICB9XG4gIGVsc2VcbiAge1xuICAgIHNldFRpbWVvdXQoZm4sIDApO1xuICB9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9265\n")},7594:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var async = __webpack_require__(5912)\n , abort = __webpack_require__(7651)\n ;\n\n// API\nmodule.exports = iterate;\n\n/**\n * Iterates over each job object\n *\n * @param {array|object} list - array or object (named list) to iterate over\n * @param {function} iterator - iterator to run\n * @param {object} state - current job status\n * @param {function} callback - invoked when all elements processed\n */\nfunction iterate(list, iterator, state, callback)\n{\n // store current index\n var key = state['keyedList'] ? state['keyedList'][state.index] : state.index;\n\n state.jobs[key] = runJob(iterator, key, list[key], function(error, output)\n {\n // don't repeat yourself\n // skip secondary callbacks\n if (!(key in state.jobs))\n {\n return;\n }\n\n // clean up jobs\n delete state.jobs[key];\n\n if (error)\n {\n // don't process rest of the results\n // stop still active jobs\n // and reset the list\n abort(state);\n }\n else\n {\n state.results[key] = output;\n }\n\n // return salvaged results\n callback(error, state.results);\n });\n}\n\n/**\n * Runs iterator over provided job element\n *\n * @param {function} iterator - iterator to invoke\n * @param {string|number} key - key/index of the element in the list of jobs\n * @param {mixed} item - job description\n * @param {function} callback - invoked after iterator is done with the job\n * @returns {function|mixed} - job abort function or something else\n */\nfunction runJob(iterator, key, item, callback)\n{\n var aborter;\n\n // allow shortcut if iterator expects only two arguments\n if (iterator.length == 2)\n {\n aborter = iterator(item, async(callback));\n }\n // otherwise go with full three arguments\n else\n {\n aborter = iterator(item, key, async(callback));\n }\n\n return aborter;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzU5NC5qcyIsIm1hcHBpbmdzIjoiQUFBQSxZQUFZLG1CQUFPLENBQUMsSUFBWTtBQUNoQyxZQUFZLG1CQUFPLENBQUMsSUFBWTtBQUNoQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsY0FBYztBQUN6QixXQUFXLFVBQVU7QUFDckIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsVUFBVTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCLGFBQWEsZUFBZTtBQUM1QixhQUFhLE9BQU87QUFDcEIsYUFBYSxVQUFVO0FBQ3ZCLGFBQWEsZ0JBQWdCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9hc3luY2tpdC9saWIvaXRlcmF0ZS5qcz9iNTYxIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhc3luYyA9IHJlcXVpcmUoJy4vYXN5bmMuanMnKVxuICAsIGFib3J0ID0gcmVxdWlyZSgnLi9hYm9ydC5qcycpXG4gIDtcblxuLy8gQVBJXG5tb2R1bGUuZXhwb3J0cyA9IGl0ZXJhdGU7XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciBlYWNoIGpvYiBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge2FycmF5fG9iamVjdH0gbGlzdCAtIGFycmF5IG9yIG9iamVjdCAobmFtZWQgbGlzdCkgdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBpdGVyYXRvciAtIGl0ZXJhdG9yIHRvIHJ1blxuICogQHBhcmFtIHtvYmplY3R9IHN0YXRlIC0gY3VycmVudCBqb2Igc3RhdHVzXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIGludm9rZWQgd2hlbiBhbGwgZWxlbWVudHMgcHJvY2Vzc2VkXG4gKi9cbmZ1bmN0aW9uIGl0ZXJhdGUobGlzdCwgaXRlcmF0b3IsIHN0YXRlLCBjYWxsYmFjaylcbntcbiAgLy8gc3RvcmUgY3VycmVudCBpbmRleFxuICB2YXIga2V5ID0gc3RhdGVbJ2tleWVkTGlzdCddID8gc3RhdGVbJ2tleWVkTGlzdCddW3N0YXRlLmluZGV4XSA6IHN0YXRlLmluZGV4O1xuXG4gIHN0YXRlLmpvYnNba2V5XSA9IHJ1bkpvYihpdGVyYXRvciwga2V5LCBsaXN0W2tleV0sIGZ1bmN0aW9uKGVycm9yLCBvdXRwdXQpXG4gIHtcbiAgICAvLyBkb24ndCByZXBlYXQgeW91cnNlbGZcbiAgICAvLyBza2lwIHNlY29uZGFyeSBjYWxsYmFja3NcbiAgICBpZiAoIShrZXkgaW4gc3RhdGUuam9icykpXG4gICAge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNsZWFuIHVwIGpvYnNcbiAgICBkZWxldGUgc3RhdGUuam9ic1trZXldO1xuXG4gICAgaWYgKGVycm9yKVxuICAgIHtcbiAgICAgIC8vIGRvbid0IHByb2Nlc3MgcmVzdCBvZiB0aGUgcmVzdWx0c1xuICAgICAgLy8gc3RvcCBzdGlsbCBhY3RpdmUgam9ic1xuICAgICAgLy8gYW5kIHJlc2V0IHRoZSBsaXN0XG4gICAgICBhYm9ydChzdGF0ZSk7XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICBzdGF0ZS5yZXN1bHRzW2tleV0gPSBvdXRwdXQ7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIHNhbHZhZ2VkIHJlc3VsdHNcbiAgICBjYWxsYmFjayhlcnJvciwgc3RhdGUucmVzdWx0cyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJ1bnMgaXRlcmF0b3Igb3ZlciBwcm92aWRlZCBqb2IgZWxlbWVudFxuICpcbiAqIEBwYXJhbSAgIHtmdW5jdGlvbn0gaXRlcmF0b3IgLSBpdGVyYXRvciB0byBpbnZva2VcbiAqIEBwYXJhbSAgIHtzdHJpbmd8bnVtYmVyfSBrZXkgLSBrZXkvaW5kZXggb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGxpc3Qgb2Ygam9ic1xuICogQHBhcmFtICAge21peGVkfSBpdGVtIC0gam9iIGRlc2NyaXB0aW9uXG4gKiBAcGFyYW0gICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gaW52b2tlZCBhZnRlciBpdGVyYXRvciBpcyBkb25lIHdpdGggdGhlIGpvYlxuICogQHJldHVybnMge2Z1bmN0aW9ufG1peGVkfSAtIGpvYiBhYm9ydCBmdW5jdGlvbiBvciBzb21ldGhpbmcgZWxzZVxuICovXG5mdW5jdGlvbiBydW5Kb2IoaXRlcmF0b3IsIGtleSwgaXRlbSwgY2FsbGJhY2spXG57XG4gIHZhciBhYm9ydGVyO1xuXG4gIC8vIGFsbG93IHNob3J0Y3V0IGlmIGl0ZXJhdG9yIGV4cGVjdHMgb25seSB0d28gYXJndW1lbnRzXG4gIGlmIChpdGVyYXRvci5sZW5ndGggPT0gMilcbiAge1xuICAgIGFib3J0ZXIgPSBpdGVyYXRvcihpdGVtLCBhc3luYyhjYWxsYmFjaykpO1xuICB9XG4gIC8vIG90aGVyd2lzZSBnbyB3aXRoIGZ1bGwgdGhyZWUgYXJndW1lbnRzXG4gIGVsc2VcbiAge1xuICAgIGFib3J0ZXIgPSBpdGVyYXRvcihpdGVtLCBrZXksIGFzeW5jKGNhbGxiYWNrKSk7XG4gIH1cblxuICByZXR1cm4gYWJvcnRlcjtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7594\n")},4528:module=>{eval("// API\nmodule.exports = state;\n\n/**\n * Creates initial state object\n * for iteration over list\n *\n * @param {array|object} list - list to iterate over\n * @param {function|null} sortMethod - function to use for keys sort,\n * or `null` to keep them as is\n * @returns {object} - initial state object\n */\nfunction state(list, sortMethod)\n{\n var isNamedList = !Array.isArray(list)\n , initState =\n {\n index : 0,\n keyedList: isNamedList || sortMethod ? Object.keys(list) : null,\n jobs : {},\n results : isNamedList ? {} : [],\n size : isNamedList ? Object.keys(list).length : list.length\n }\n ;\n\n if (sortMethod)\n {\n // sort array keys based on it's values\n // sort object's keys just on own merit\n initState.keyedList.sort(isNamedList ? sortMethod : function(a, b)\n {\n return sortMethod(list[a], list[b]);\n });\n }\n\n return initState;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUyOC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxjQUFjO0FBQzNCLGFBQWEsZUFBZTtBQUM1QjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2FzeW5ja2l0L2xpYi9zdGF0ZS5qcz80MTA5Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIEFQSVxubW9kdWxlLmV4cG9ydHMgPSBzdGF0ZTtcblxuLyoqXG4gKiBDcmVhdGVzIGluaXRpYWwgc3RhdGUgb2JqZWN0XG4gKiBmb3IgaXRlcmF0aW9uIG92ZXIgbGlzdFxuICpcbiAqIEBwYXJhbSAgIHthcnJheXxvYmplY3R9IGxpc3QgLSBsaXN0IHRvIGl0ZXJhdGUgb3ZlclxuICogQHBhcmFtICAge2Z1bmN0aW9ufG51bGx9IHNvcnRNZXRob2QgLSBmdW5jdGlvbiB0byB1c2UgZm9yIGtleXMgc29ydCxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGBudWxsYCB0byBrZWVwIHRoZW0gYXMgaXNcbiAqIEByZXR1cm5zIHtvYmplY3R9IC0gaW5pdGlhbCBzdGF0ZSBvYmplY3RcbiAqL1xuZnVuY3Rpb24gc3RhdGUobGlzdCwgc29ydE1ldGhvZClcbntcbiAgdmFyIGlzTmFtZWRMaXN0ID0gIUFycmF5LmlzQXJyYXkobGlzdClcbiAgICAsIGluaXRTdGF0ZSA9XG4gICAge1xuICAgICAgaW5kZXggICAgOiAwLFxuICAgICAga2V5ZWRMaXN0OiBpc05hbWVkTGlzdCB8fCBzb3J0TWV0aG9kID8gT2JqZWN0LmtleXMobGlzdCkgOiBudWxsLFxuICAgICAgam9icyAgICAgOiB7fSxcbiAgICAgIHJlc3VsdHMgIDogaXNOYW1lZExpc3QgPyB7fSA6IFtdLFxuICAgICAgc2l6ZSAgICAgOiBpc05hbWVkTGlzdCA/IE9iamVjdC5rZXlzKGxpc3QpLmxlbmd0aCA6IGxpc3QubGVuZ3RoXG4gICAgfVxuICAgIDtcblxuICBpZiAoc29ydE1ldGhvZClcbiAge1xuICAgIC8vIHNvcnQgYXJyYXkga2V5cyBiYXNlZCBvbiBpdCdzIHZhbHVlc1xuICAgIC8vIHNvcnQgb2JqZWN0J3Mga2V5cyBqdXN0IG9uIG93biBtZXJpdFxuICAgIGluaXRTdGF0ZS5rZXllZExpc3Quc29ydChpc05hbWVkTGlzdCA/IHNvcnRNZXRob2QgOiBmdW5jdGlvbihhLCBiKVxuICAgIHtcbiAgICAgIHJldHVybiBzb3J0TWV0aG9kKGxpc3RbYV0sIGxpc3RbYl0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGluaXRTdGF0ZTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4528\n")},5353:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var abort = __webpack_require__(7651)\n , async = __webpack_require__(5912)\n ;\n\n// API\nmodule.exports = terminator;\n\n/**\n * Terminates jobs in the attached state context\n *\n * @this AsyncKitState#\n * @param {function} callback - final callback to invoke after termination\n */\nfunction terminator(callback)\n{\n if (!Object.keys(this.jobs).length)\n {\n return;\n }\n\n // fast forward iteration index\n this.index = this.size;\n\n // abort jobs\n abort(this);\n\n // send back results we have so far\n async(callback)(null, this.results);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTM1My5qcyIsIm1hcHBpbmdzIjoiQUFBQSxZQUFZLG1CQUFPLENBQUMsSUFBWTtBQUNoQyxZQUFZLG1CQUFPLENBQUMsSUFBWTtBQUNoQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9hc3luY2tpdC9saWIvdGVybWluYXRvci5qcz8xMjk1Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBhYm9ydCA9IHJlcXVpcmUoJy4vYWJvcnQuanMnKVxuICAsIGFzeW5jID0gcmVxdWlyZSgnLi9hc3luYy5qcycpXG4gIDtcblxuLy8gQVBJXG5tb2R1bGUuZXhwb3J0cyA9IHRlcm1pbmF0b3I7XG5cbi8qKlxuICogVGVybWluYXRlcyBqb2JzIGluIHRoZSBhdHRhY2hlZCBzdGF0ZSBjb250ZXh0XG4gKlxuICogQHRoaXMgIEFzeW5jS2l0U3RhdGUjXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIGZpbmFsIGNhbGxiYWNrIHRvIGludm9rZSBhZnRlciB0ZXJtaW5hdGlvblxuICovXG5mdW5jdGlvbiB0ZXJtaW5hdG9yKGNhbGxiYWNrKVxue1xuICBpZiAoIU9iamVjdC5rZXlzKHRoaXMuam9icykubGVuZ3RoKVxuICB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gZmFzdCBmb3J3YXJkIGl0ZXJhdGlvbiBpbmRleFxuICB0aGlzLmluZGV4ID0gdGhpcy5zaXplO1xuXG4gIC8vIGFib3J0IGpvYnNcbiAgYWJvcnQodGhpcyk7XG5cbiAgLy8gc2VuZCBiYWNrIHJlc3VsdHMgd2UgaGF2ZSBzbyBmYXJcbiAgYXN5bmMoY2FsbGJhY2spKG51bGwsIHRoaXMucmVzdWx0cyk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5353\n")},9162:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var iterate = __webpack_require__(7594)\n , initState = __webpack_require__(4528)\n , terminator = __webpack_require__(5353)\n ;\n\n// Public API\nmodule.exports = parallel;\n\n/**\n * Runs iterator over provided array elements in parallel\n *\n * @param {array|object} list - array or object (named list) to iterate over\n * @param {function} iterator - iterator to run\n * @param {function} callback - invoked when all elements processed\n * @returns {function} - jobs terminator\n */\nfunction parallel(list, iterator, callback)\n{\n var state = initState(list);\n\n while (state.index < (state['keyedList'] || list).length)\n {\n iterate(list, iterator, state, function(error, result)\n {\n if (error)\n {\n callback(error, result);\n return;\n }\n\n // looks like it's the last one\n if (Object.keys(state.jobs).length === 0)\n {\n callback(null, state.results);\n return;\n }\n });\n\n state.index++;\n }\n\n return terminator.bind(state, callback);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTE2Mi5qcyIsIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxJQUFrQjtBQUMzQyxpQkFBaUIsbUJBQU8sQ0FBQyxJQUFnQjtBQUN6QyxpQkFBaUIsbUJBQU8sQ0FBQyxJQUFxQjtBQUM5Qzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsY0FBYztBQUMzQixhQUFhLFVBQVU7QUFDdkIsYUFBYSxVQUFVO0FBQ3ZCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9hc3luY2tpdC9wYXJhbGxlbC5qcz85MTVhIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpdGVyYXRlICAgID0gcmVxdWlyZSgnLi9saWIvaXRlcmF0ZS5qcycpXG4gICwgaW5pdFN0YXRlICA9IHJlcXVpcmUoJy4vbGliL3N0YXRlLmpzJylcbiAgLCB0ZXJtaW5hdG9yID0gcmVxdWlyZSgnLi9saWIvdGVybWluYXRvci5qcycpXG4gIDtcblxuLy8gUHVibGljIEFQSVxubW9kdWxlLmV4cG9ydHMgPSBwYXJhbGxlbDtcblxuLyoqXG4gKiBSdW5zIGl0ZXJhdG9yIG92ZXIgcHJvdmlkZWQgYXJyYXkgZWxlbWVudHMgaW4gcGFyYWxsZWxcbiAqXG4gKiBAcGFyYW0gICB7YXJyYXl8b2JqZWN0fSBsaXN0IC0gYXJyYXkgb3Igb2JqZWN0IChuYW1lZCBsaXN0KSB0byBpdGVyYXRlIG92ZXJcbiAqIEBwYXJhbSAgIHtmdW5jdGlvbn0gaXRlcmF0b3IgLSBpdGVyYXRvciB0byBydW5cbiAqIEBwYXJhbSAgIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBpbnZva2VkIHdoZW4gYWxsIGVsZW1lbnRzIHByb2Nlc3NlZFxuICogQHJldHVybnMge2Z1bmN0aW9ufSAtIGpvYnMgdGVybWluYXRvclxuICovXG5mdW5jdGlvbiBwYXJhbGxlbChsaXN0LCBpdGVyYXRvciwgY2FsbGJhY2spXG57XG4gIHZhciBzdGF0ZSA9IGluaXRTdGF0ZShsaXN0KTtcblxuICB3aGlsZSAoc3RhdGUuaW5kZXggPCAoc3RhdGVbJ2tleWVkTGlzdCddIHx8IGxpc3QpLmxlbmd0aClcbiAge1xuICAgIGl0ZXJhdGUobGlzdCwgaXRlcmF0b3IsIHN0YXRlLCBmdW5jdGlvbihlcnJvciwgcmVzdWx0KVxuICAgIHtcbiAgICAgIGlmIChlcnJvcilcbiAgICAgIHtcbiAgICAgICAgY2FsbGJhY2soZXJyb3IsIHJlc3VsdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gbG9va3MgbGlrZSBpdCdzIHRoZSBsYXN0IG9uZVxuICAgICAgaWYgKE9iamVjdC5rZXlzKHN0YXRlLmpvYnMpLmxlbmd0aCA9PT0gMClcbiAgICAgIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgc3RhdGUucmVzdWx0cyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHN0YXRlLmluZGV4Kys7XG4gIH1cblxuICByZXR1cm4gdGVybWluYXRvci5iaW5kKHN0YXRlLCBjYWxsYmFjayk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9162\n")},1357:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var serialOrdered = __webpack_require__(9087);\n\n// Public API\nmodule.exports = serial;\n\n/**\n * Runs iterator over provided array elements in series\n *\n * @param {array|object} list - array or object (named list) to iterate over\n * @param {function} iterator - iterator to run\n * @param {function} callback - invoked when all elements processed\n * @returns {function} - jobs terminator\n */\nfunction serial(list, iterator, callback)\n{\n return serialOrdered(list, iterator, null, callback);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM1Ny5qcyIsIm1hcHBpbmdzIjoiQUFBQSxvQkFBb0IsbUJBQU8sQ0FBQyxJQUFvQjs7QUFFaEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGNBQWM7QUFDM0IsYUFBYSxVQUFVO0FBQ3ZCLGFBQWEsVUFBVTtBQUN2QixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2FzeW5ja2l0L3NlcmlhbC5qcz82YzczIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBzZXJpYWxPcmRlcmVkID0gcmVxdWlyZSgnLi9zZXJpYWxPcmRlcmVkLmpzJyk7XG5cbi8vIFB1YmxpYyBBUElcbm1vZHVsZS5leHBvcnRzID0gc2VyaWFsO1xuXG4vKipcbiAqIFJ1bnMgaXRlcmF0b3Igb3ZlciBwcm92aWRlZCBhcnJheSBlbGVtZW50cyBpbiBzZXJpZXNcbiAqXG4gKiBAcGFyYW0gICB7YXJyYXl8b2JqZWN0fSBsaXN0IC0gYXJyYXkgb3Igb2JqZWN0IChuYW1lZCBsaXN0KSB0byBpdGVyYXRlIG92ZXJcbiAqIEBwYXJhbSAgIHtmdW5jdGlvbn0gaXRlcmF0b3IgLSBpdGVyYXRvciB0byBydW5cbiAqIEBwYXJhbSAgIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBpbnZva2VkIHdoZW4gYWxsIGVsZW1lbnRzIHByb2Nlc3NlZFxuICogQHJldHVybnMge2Z1bmN0aW9ufSAtIGpvYnMgdGVybWluYXRvclxuICovXG5mdW5jdGlvbiBzZXJpYWwobGlzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKVxue1xuICByZXR1cm4gc2VyaWFsT3JkZXJlZChsaXN0LCBpdGVyYXRvciwgbnVsbCwgY2FsbGJhY2spO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1357\n")},9087:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var iterate = __webpack_require__(7594)\n , initState = __webpack_require__(4528)\n , terminator = __webpack_require__(5353)\n ;\n\n// Public API\nmodule.exports = serialOrdered;\n// sorting helpers\nmodule.exports.ascending = ascending;\nmodule.exports.descending = descending;\n\n/**\n * Runs iterator over provided sorted array elements in series\n *\n * @param {array|object} list - array or object (named list) to iterate over\n * @param {function} iterator - iterator to run\n * @param {function} sortMethod - custom sort function\n * @param {function} callback - invoked when all elements processed\n * @returns {function} - jobs terminator\n */\nfunction serialOrdered(list, iterator, sortMethod, callback)\n{\n var state = initState(list, sortMethod);\n\n iterate(list, iterator, state, function iteratorHandler(error, result)\n {\n if (error)\n {\n callback(error, result);\n return;\n }\n\n state.index++;\n\n // are we there yet?\n if (state.index < (state['keyedList'] || list).length)\n {\n iterate(list, iterator, state, iteratorHandler);\n return;\n }\n\n // done here\n callback(null, state.results);\n });\n\n return terminator.bind(state, callback);\n}\n\n/*\n * -- Sort methods\n */\n\n/**\n * sort helper to sort array elements in ascending order\n *\n * @param {mixed} a - an item to compare\n * @param {mixed} b - an item to compare\n * @returns {number} - comparison result\n */\nfunction ascending(a, b)\n{\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\n/**\n * sort helper to sort array elements in descending order\n *\n * @param {mixed} a - an item to compare\n * @param {mixed} b - an item to compare\n * @returns {number} - comparison result\n */\nfunction descending(a, b)\n{\n return -1 * ascending(a, b);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTA4Ny5qcyIsIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxJQUFrQjtBQUMzQyxpQkFBaUIsbUJBQU8sQ0FBQyxJQUFnQjtBQUN6QyxpQkFBaUIsbUJBQU8sQ0FBQyxJQUFxQjtBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEIseUJBQXlCOztBQUV6QjtBQUNBO0FBQ0E7QUFDQSxhQUFhLGNBQWM7QUFDM0IsYUFBYSxVQUFVO0FBQ3ZCLGFBQWEsVUFBVTtBQUN2QixhQUFhLFVBQVU7QUFDdkIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9hc3luY2tpdC9zZXJpYWxPcmRlcmVkLmpzP2ZlN2EiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGl0ZXJhdGUgICAgPSByZXF1aXJlKCcuL2xpYi9pdGVyYXRlLmpzJylcbiAgLCBpbml0U3RhdGUgID0gcmVxdWlyZSgnLi9saWIvc3RhdGUuanMnKVxuICAsIHRlcm1pbmF0b3IgPSByZXF1aXJlKCcuL2xpYi90ZXJtaW5hdG9yLmpzJylcbiAgO1xuXG4vLyBQdWJsaWMgQVBJXG5tb2R1bGUuZXhwb3J0cyA9IHNlcmlhbE9yZGVyZWQ7XG4vLyBzb3J0aW5nIGhlbHBlcnNcbm1vZHVsZS5leHBvcnRzLmFzY2VuZGluZyAgPSBhc2NlbmRpbmc7XG5tb2R1bGUuZXhwb3J0cy5kZXNjZW5kaW5nID0gZGVzY2VuZGluZztcblxuLyoqXG4gKiBSdW5zIGl0ZXJhdG9yIG92ZXIgcHJvdmlkZWQgc29ydGVkIGFycmF5IGVsZW1lbnRzIGluIHNlcmllc1xuICpcbiAqIEBwYXJhbSAgIHthcnJheXxvYmplY3R9IGxpc3QgLSBhcnJheSBvciBvYmplY3QgKG5hbWVkIGxpc3QpIHRvIGl0ZXJhdGUgb3ZlclxuICogQHBhcmFtICAge2Z1bmN0aW9ufSBpdGVyYXRvciAtIGl0ZXJhdG9yIHRvIHJ1blxuICogQHBhcmFtICAge2Z1bmN0aW9ufSBzb3J0TWV0aG9kIC0gY3VzdG9tIHNvcnQgZnVuY3Rpb25cbiAqIEBwYXJhbSAgIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBpbnZva2VkIHdoZW4gYWxsIGVsZW1lbnRzIHByb2Nlc3NlZFxuICogQHJldHVybnMge2Z1bmN0aW9ufSAtIGpvYnMgdGVybWluYXRvclxuICovXG5mdW5jdGlvbiBzZXJpYWxPcmRlcmVkKGxpc3QsIGl0ZXJhdG9yLCBzb3J0TWV0aG9kLCBjYWxsYmFjaylcbntcbiAgdmFyIHN0YXRlID0gaW5pdFN0YXRlKGxpc3QsIHNvcnRNZXRob2QpO1xuXG4gIGl0ZXJhdGUobGlzdCwgaXRlcmF0b3IsIHN0YXRlLCBmdW5jdGlvbiBpdGVyYXRvckhhbmRsZXIoZXJyb3IsIHJlc3VsdClcbiAge1xuICAgIGlmIChlcnJvcilcbiAgICB7XG4gICAgICBjYWxsYmFjayhlcnJvciwgcmVzdWx0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdGF0ZS5pbmRleCsrO1xuXG4gICAgLy8gYXJlIHdlIHRoZXJlIHlldD9cbiAgICBpZiAoc3RhdGUuaW5kZXggPCAoc3RhdGVbJ2tleWVkTGlzdCddIHx8IGxpc3QpLmxlbmd0aClcbiAgICB7XG4gICAgICBpdGVyYXRlKGxpc3QsIGl0ZXJhdG9yLCBzdGF0ZSwgaXRlcmF0b3JIYW5kbGVyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBkb25lIGhlcmVcbiAgICBjYWxsYmFjayhudWxsLCBzdGF0ZS5yZXN1bHRzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHRlcm1pbmF0b3IuYmluZChzdGF0ZSwgY2FsbGJhY2spO1xufVxuXG4vKlxuICogLS0gU29ydCBtZXRob2RzXG4gKi9cblxuLyoqXG4gKiBzb3J0IGhlbHBlciB0byBzb3J0IGFycmF5IGVsZW1lbnRzIGluIGFzY2VuZGluZyBvcmRlclxuICpcbiAqIEBwYXJhbSAgIHttaXhlZH0gYSAtIGFuIGl0ZW0gdG8gY29tcGFyZVxuICogQHBhcmFtICAge21peGVkfSBiIC0gYW4gaXRlbSB0byBjb21wYXJlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIGNvbXBhcmlzb24gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKVxue1xuICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDA7XG59XG5cbi8qKlxuICogc29ydCBoZWxwZXIgdG8gc29ydCBhcnJheSBlbGVtZW50cyBpbiBkZXNjZW5kaW5nIG9yZGVyXG4gKlxuICogQHBhcmFtICAge21peGVkfSBhIC0gYW4gaXRlbSB0byBjb21wYXJlXG4gKiBAcGFyYW0gICB7bWl4ZWR9IGIgLSBhbiBpdGVtIHRvIGNvbXBhcmVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gY29tcGFyaXNvbiByZXN1bHRcbiAqL1xuZnVuY3Rpb24gZGVzY2VuZGluZyhhLCBiKVxue1xuICByZXR1cm4gLTEgKiBhc2NlbmRpbmcoYSwgYik7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9087\n")},5623:module=>{"use strict";eval("\nmodule.exports = balanced;\nfunction balanced(a, b, str) {\n if (a instanceof RegExp) a = maybeMatch(a, str);\n if (b instanceof RegExp) b = maybeMatch(b, str);\n\n var r = range(a, b, str);\n\n return r && {\n start: r[0],\n end: r[1],\n pre: str.slice(0, r[0]),\n body: str.slice(r[0] + a.length, r[1]),\n post: str.slice(r[1] + b.length)\n };\n}\n\nfunction maybeMatch(reg, str) {\n var m = str.match(reg);\n return m ? m[0] : null;\n}\n\nbalanced.range = range;\nfunction range(a, b, str) {\n var begs, beg, left, right, result;\n var ai = str.indexOf(a);\n var bi = str.indexOf(b, ai + 1);\n var i = ai;\n\n if (ai >= 0 && bi > 0) {\n if(a===b) {\n return [ai, bi];\n }\n begs = [];\n left = str.length;\n\n while (i >= 0 && !result) {\n if (i == ai) {\n begs.push(i);\n ai = str.indexOf(a, i + 1);\n } else if (begs.length == 1) {\n result = [ begs.pop(), bi ];\n } else {\n beg = begs.pop();\n if (beg < left) {\n left = beg;\n right = bi;\n }\n\n bi = str.indexOf(b, i + 1);\n }\n\n i = ai < bi && ai >= 0 ? ai : bi;\n }\n\n if (begs.length) {\n result = [ left, right ];\n }\n }\n\n return result;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYyMy5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvYmFsYW5jZWQtbWF0Y2gvaW5kZXguanM/OTFiMCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGJhbGFuY2VkO1xuZnVuY3Rpb24gYmFsYW5jZWQoYSwgYiwgc3RyKSB7XG4gIGlmIChhIGluc3RhbmNlb2YgUmVnRXhwKSBhID0gbWF5YmVNYXRjaChhLCBzdHIpO1xuICBpZiAoYiBpbnN0YW5jZW9mIFJlZ0V4cCkgYiA9IG1heWJlTWF0Y2goYiwgc3RyKTtcblxuICB2YXIgciA9IHJhbmdlKGEsIGIsIHN0cik7XG5cbiAgcmV0dXJuIHIgJiYge1xuICAgIHN0YXJ0OiByWzBdLFxuICAgIGVuZDogclsxXSxcbiAgICBwcmU6IHN0ci5zbGljZSgwLCByWzBdKSxcbiAgICBib2R5OiBzdHIuc2xpY2UoclswXSArIGEubGVuZ3RoLCByWzFdKSxcbiAgICBwb3N0OiBzdHIuc2xpY2UoclsxXSArIGIubGVuZ3RoKVxuICB9O1xufVxuXG5mdW5jdGlvbiBtYXliZU1hdGNoKHJlZywgc3RyKSB7XG4gIHZhciBtID0gc3RyLm1hdGNoKHJlZyk7XG4gIHJldHVybiBtID8gbVswXSA6IG51bGw7XG59XG5cbmJhbGFuY2VkLnJhbmdlID0gcmFuZ2U7XG5mdW5jdGlvbiByYW5nZShhLCBiLCBzdHIpIHtcbiAgdmFyIGJlZ3MsIGJlZywgbGVmdCwgcmlnaHQsIHJlc3VsdDtcbiAgdmFyIGFpID0gc3RyLmluZGV4T2YoYSk7XG4gIHZhciBiaSA9IHN0ci5pbmRleE9mKGIsIGFpICsgMSk7XG4gIHZhciBpID0gYWk7XG5cbiAgaWYgKGFpID49IDAgJiYgYmkgPiAwKSB7XG4gICAgaWYoYT09PWIpIHtcbiAgICAgIHJldHVybiBbYWksIGJpXTtcbiAgICB9XG4gICAgYmVncyA9IFtdO1xuICAgIGxlZnQgPSBzdHIubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGkgPj0gMCAmJiAhcmVzdWx0KSB7XG4gICAgICBpZiAoaSA9PSBhaSkge1xuICAgICAgICBiZWdzLnB1c2goaSk7XG4gICAgICAgIGFpID0gc3RyLmluZGV4T2YoYSwgaSArIDEpO1xuICAgICAgfSBlbHNlIGlmIChiZWdzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgIHJlc3VsdCA9IFsgYmVncy5wb3AoKSwgYmkgXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJlZyA9IGJlZ3MucG9wKCk7XG4gICAgICAgIGlmIChiZWcgPCBsZWZ0KSB7XG4gICAgICAgICAgbGVmdCA9IGJlZztcbiAgICAgICAgICByaWdodCA9IGJpO1xuICAgICAgICB9XG5cbiAgICAgICAgYmkgPSBzdHIuaW5kZXhPZihiLCBpICsgMSk7XG4gICAgICB9XG5cbiAgICAgIGkgPSBhaSA8IGJpICYmIGFpID49IDAgPyBhaSA6IGJpO1xuICAgIH1cblxuICAgIGlmIChiZWdzLmxlbmd0aCkge1xuICAgICAgcmVzdWx0ID0gWyBsZWZ0LCByaWdodCBdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5623\n")},5186:(module,__unused_webpack_exports,__webpack_require__)=>{eval('var register = __webpack_require__(3698);\nvar addHook = __webpack_require__(2505);\nvar removeHook = __webpack_require__(6417);\n\n// bind with array of arguments: https://stackoverflow.com/a/21792913\nvar bind = Function.bind;\nvar bindable = bind.bind(bind);\n\nfunction bindApi(hook, state, name) {\n var removeHookRef = bindable(removeHook, null).apply(\n null,\n name ? [state, name] : [state]\n );\n hook.api = { remove: removeHookRef };\n hook.remove = removeHookRef;\n ["before", "error", "after", "wrap"].forEach(function (kind) {\n var args = name ? [state, kind, name] : [state, kind];\n hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args);\n });\n}\n\nfunction HookSingular() {\n var singularHookName = "h";\n var singularHookState = {\n registry: {},\n };\n var singularHook = register.bind(null, singularHookState, singularHookName);\n bindApi(singularHook, singularHookState, singularHookName);\n return singularHook;\n}\n\nfunction HookCollection() {\n var state = {\n registry: {},\n };\n\n var hook = register.bind(null, state);\n bindApi(hook, state);\n\n return hook;\n}\n\nvar collectionHookDeprecationMessageDisplayed = false;\nfunction Hook() {\n if (!collectionHookDeprecationMessageDisplayed) {\n console.warn(\n \'[before-after-hook]: "Hook()" repurposing warning, use "Hook.Collection()". Read more: https://git.io/upgrade-before-after-hook-to-1.4\'\n );\n collectionHookDeprecationMessageDisplayed = true;\n }\n return HookCollection();\n}\n\nHook.Singular = HookSingular.bind();\nHook.Collection = HookCollection.bind();\n\nmodule.exports = Hook;\n// expose constructors as a named property for TypeScript\nmodule.exports.Hook = Hook;\nmodule.exports.Singular = Hook.Singular;\nmodule.exports.Collection = Hook.Collection;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTE4Ni5qcyIsIm1hcHBpbmdzIjoiQUFBQSxlQUFlLG1CQUFPLENBQUMsSUFBZ0I7QUFDdkMsY0FBYyxtQkFBTyxDQUFDLElBQVc7QUFDakMsaUJBQWlCLG1CQUFPLENBQUMsSUFBYzs7QUFFdkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CLHVCQUF1QjtBQUN2Qix5QkFBeUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9iZWZvcmUtYWZ0ZXItaG9vay9pbmRleC5qcz82N2NhIl0sInNvdXJjZXNDb250ZW50IjpbInZhciByZWdpc3RlciA9IHJlcXVpcmUoXCIuL2xpYi9yZWdpc3RlclwiKTtcbnZhciBhZGRIb29rID0gcmVxdWlyZShcIi4vbGliL2FkZFwiKTtcbnZhciByZW1vdmVIb29rID0gcmVxdWlyZShcIi4vbGliL3JlbW92ZVwiKTtcblxuLy8gYmluZCB3aXRoIGFycmF5IG9mIGFyZ3VtZW50czogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIxNzkyOTEzXG52YXIgYmluZCA9IEZ1bmN0aW9uLmJpbmQ7XG52YXIgYmluZGFibGUgPSBiaW5kLmJpbmQoYmluZCk7XG5cbmZ1bmN0aW9uIGJpbmRBcGkoaG9vaywgc3RhdGUsIG5hbWUpIHtcbiAgdmFyIHJlbW92ZUhvb2tSZWYgPSBiaW5kYWJsZShyZW1vdmVIb29rLCBudWxsKS5hcHBseShcbiAgICBudWxsLFxuICAgIG5hbWUgPyBbc3RhdGUsIG5hbWVdIDogW3N0YXRlXVxuICApO1xuICBob29rLmFwaSA9IHsgcmVtb3ZlOiByZW1vdmVIb29rUmVmIH07XG4gIGhvb2sucmVtb3ZlID0gcmVtb3ZlSG9va1JlZjtcbiAgW1wiYmVmb3JlXCIsIFwiZXJyb3JcIiwgXCJhZnRlclwiLCBcIndyYXBcIl0uZm9yRWFjaChmdW5jdGlvbiAoa2luZCkge1xuICAgIHZhciBhcmdzID0gbmFtZSA/IFtzdGF0ZSwga2luZCwgbmFtZV0gOiBbc3RhdGUsIGtpbmRdO1xuICAgIGhvb2tba2luZF0gPSBob29rLmFwaVtraW5kXSA9IGJpbmRhYmxlKGFkZEhvb2ssIG51bGwpLmFwcGx5KG51bGwsIGFyZ3MpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gSG9va1Npbmd1bGFyKCkge1xuICB2YXIgc2luZ3VsYXJIb29rTmFtZSA9IFwiaFwiO1xuICB2YXIgc2luZ3VsYXJIb29rU3RhdGUgPSB7XG4gICAgcmVnaXN0cnk6IHt9LFxuICB9O1xuICB2YXIgc2luZ3VsYXJIb29rID0gcmVnaXN0ZXIuYmluZChudWxsLCBzaW5ndWxhckhvb2tTdGF0ZSwgc2luZ3VsYXJIb29rTmFtZSk7XG4gIGJpbmRBcGkoc2luZ3VsYXJIb29rLCBzaW5ndWxhckhvb2tTdGF0ZSwgc2luZ3VsYXJIb29rTmFtZSk7XG4gIHJldHVybiBzaW5ndWxhckhvb2s7XG59XG5cbmZ1bmN0aW9uIEhvb2tDb2xsZWN0aW9uKCkge1xuICB2YXIgc3RhdGUgPSB7XG4gICAgcmVnaXN0cnk6IHt9LFxuICB9O1xuXG4gIHZhciBob29rID0gcmVnaXN0ZXIuYmluZChudWxsLCBzdGF0ZSk7XG4gIGJpbmRBcGkoaG9vaywgc3RhdGUpO1xuXG4gIHJldHVybiBob29rO1xufVxuXG52YXIgY29sbGVjdGlvbkhvb2tEZXByZWNhdGlvbk1lc3NhZ2VEaXNwbGF5ZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIEhvb2soKSB7XG4gIGlmICghY29sbGVjdGlvbkhvb2tEZXByZWNhdGlvbk1lc3NhZ2VEaXNwbGF5ZWQpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnW2JlZm9yZS1hZnRlci1ob29rXTogXCJIb29rKClcIiByZXB1cnBvc2luZyB3YXJuaW5nLCB1c2UgXCJIb29rLkNvbGxlY3Rpb24oKVwiLiBSZWFkIG1vcmU6IGh0dHBzOi8vZ2l0LmlvL3VwZ3JhZGUtYmVmb3JlLWFmdGVyLWhvb2stdG8tMS40J1xuICAgICk7XG4gICAgY29sbGVjdGlvbkhvb2tEZXByZWNhdGlvbk1lc3NhZ2VEaXNwbGF5ZWQgPSB0cnVlO1xuICB9XG4gIHJldHVybiBIb29rQ29sbGVjdGlvbigpO1xufVxuXG5Ib29rLlNpbmd1bGFyID0gSG9va1Npbmd1bGFyLmJpbmQoKTtcbkhvb2suQ29sbGVjdGlvbiA9IEhvb2tDb2xsZWN0aW9uLmJpbmQoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBIb29rO1xuLy8gZXhwb3NlIGNvbnN0cnVjdG9ycyBhcyBhIG5hbWVkIHByb3BlcnR5IGZvciBUeXBlU2NyaXB0XG5tb2R1bGUuZXhwb3J0cy5Ib29rID0gSG9vaztcbm1vZHVsZS5leHBvcnRzLlNpbmd1bGFyID0gSG9vay5TaW5ndWxhcjtcbm1vZHVsZS5leHBvcnRzLkNvbGxlY3Rpb24gPSBIb29rLkNvbGxlY3Rpb247XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5186\n')},2505:module=>{eval('module.exports = addHook;\n\nfunction addHook(state, kind, name, hook) {\n var orig = hook;\n if (!state.registry[name]) {\n state.registry[name] = [];\n }\n\n if (kind === "before") {\n hook = function (method, options) {\n return Promise.resolve()\n .then(orig.bind(null, options))\n .then(method.bind(null, options));\n };\n }\n\n if (kind === "after") {\n hook = function (method, options) {\n var result;\n return Promise.resolve()\n .then(method.bind(null, options))\n .then(function (result_) {\n result = result_;\n return orig(result, options);\n })\n .then(function () {\n return result;\n });\n };\n }\n\n if (kind === "error") {\n hook = function (method, options) {\n return Promise.resolve()\n .then(method.bind(null, options))\n .catch(function (error) {\n return orig(error, options);\n });\n };\n }\n\n state.registry[name].push({\n hook: hook,\n orig: orig,\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUwNS5qcyIsIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2JlZm9yZS1hZnRlci1ob29rL2xpYi9hZGQuanM/MTE0YSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGFkZEhvb2s7XG5cbmZ1bmN0aW9uIGFkZEhvb2soc3RhdGUsIGtpbmQsIG5hbWUsIGhvb2spIHtcbiAgdmFyIG9yaWcgPSBob29rO1xuICBpZiAoIXN0YXRlLnJlZ2lzdHJ5W25hbWVdKSB7XG4gICAgc3RhdGUucmVnaXN0cnlbbmFtZV0gPSBbXTtcbiAgfVxuXG4gIGlmIChraW5kID09PSBcImJlZm9yZVwiKSB7XG4gICAgaG9vayA9IGZ1bmN0aW9uIChtZXRob2QsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAudGhlbihvcmlnLmJpbmQobnVsbCwgb3B0aW9ucykpXG4gICAgICAgIC50aGVuKG1ldGhvZC5iaW5kKG51bGwsIG9wdGlvbnMpKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKGtpbmQgPT09IFwiYWZ0ZXJcIikge1xuICAgIGhvb2sgPSBmdW5jdGlvbiAobWV0aG9kLCBvcHRpb25zKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgIC50aGVuKG1ldGhvZC5iaW5kKG51bGwsIG9wdGlvbnMpKVxuICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0Xykge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdF87XG4gICAgICAgICAgcmV0dXJuIG9yaWcocmVzdWx0LCBvcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBpZiAoa2luZCA9PT0gXCJlcnJvclwiKSB7XG4gICAgaG9vayA9IGZ1bmN0aW9uIChtZXRob2QsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAudGhlbihtZXRob2QuYmluZChudWxsLCBvcHRpb25zKSlcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBvcmlnKGVycm9yLCBvcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRlLnJlZ2lzdHJ5W25hbWVdLnB1c2goe1xuICAgIGhvb2s6IGhvb2ssXG4gICAgb3JpZzogb3JpZyxcbiAgfSk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2505\n')},3698:module=>{eval('module.exports = register;\n\nfunction register(state, name, method, options) {\n if (typeof method !== "function") {\n throw new Error("method for before hook must be a function");\n }\n\n if (!options) {\n options = {};\n }\n\n if (Array.isArray(name)) {\n return name.reverse().reduce(function (callback, name) {\n return register.bind(null, state, name, callback, options);\n }, method)();\n }\n\n return Promise.resolve().then(function () {\n if (!state.registry[name]) {\n return method(options);\n }\n\n return state.registry[name].reduce(function (method, registered) {\n return registered.hook.bind(null, method, options);\n }, method)();\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY5OC5qcyIsIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvYmVmb3JlLWFmdGVyLWhvb2svbGliL3JlZ2lzdGVyLmpzP2U2ZTEiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZWdpc3RlcjtcblxuZnVuY3Rpb24gcmVnaXN0ZXIoc3RhdGUsIG5hbWUsIG1ldGhvZCwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwibWV0aG9kIGZvciBiZWZvcmUgaG9vayBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gIH1cblxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShuYW1lKSkge1xuICAgIHJldHVybiBuYW1lLnJldmVyc2UoKS5yZWR1Y2UoZnVuY3Rpb24gKGNhbGxiYWNrLCBuYW1lKSB7XG4gICAgICByZXR1cm4gcmVnaXN0ZXIuYmluZChudWxsLCBzdGF0ZSwgbmFtZSwgY2FsbGJhY2ssIG9wdGlvbnMpO1xuICAgIH0sIG1ldGhvZCkoKTtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXN0YXRlLnJlZ2lzdHJ5W25hbWVdKSB7XG4gICAgICByZXR1cm4gbWV0aG9kKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZS5yZWdpc3RyeVtuYW1lXS5yZWR1Y2UoZnVuY3Rpb24gKG1ldGhvZCwgcmVnaXN0ZXJlZCkge1xuICAgICAgcmV0dXJuIHJlZ2lzdGVyZWQuaG9vay5iaW5kKG51bGwsIG1ldGhvZCwgb3B0aW9ucyk7XG4gICAgfSwgbWV0aG9kKSgpO1xuICB9KTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3698\n')},6417:module=>{eval("module.exports = removeHook;\n\nfunction removeHook(state, name, method) {\n if (!state.registry[name]) {\n return;\n }\n\n var index = state.registry[name]\n .map(function (registered) {\n return registered.orig;\n })\n .indexOf(method);\n\n if (index === -1) {\n return;\n }\n\n state.registry[name].splice(index, 1);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQxNy5qcyIsIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9iZWZvcmUtYWZ0ZXItaG9vay9saWIvcmVtb3ZlLmpzPzQ3ZWQiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZW1vdmVIb29rO1xuXG5mdW5jdGlvbiByZW1vdmVIb29rKHN0YXRlLCBuYW1lLCBtZXRob2QpIHtcbiAgaWYgKCFzdGF0ZS5yZWdpc3RyeVtuYW1lXSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBpbmRleCA9IHN0YXRlLnJlZ2lzdHJ5W25hbWVdXG4gICAgLm1hcChmdW5jdGlvbiAocmVnaXN0ZXJlZCkge1xuICAgICAgcmV0dXJuIHJlZ2lzdGVyZWQub3JpZztcbiAgICB9KVxuICAgIC5pbmRleE9mKG1ldGhvZCk7XG5cbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN0YXRlLnJlZ2lzdHJ5W25hbWVdLnNwbGljZShpbmRleCwgMSk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6417\n")},7740:(module,exports,__webpack_require__)=>{eval("var Chainsaw = __webpack_require__(4077);\nvar EventEmitter = (__webpack_require__(2361).EventEmitter);\nvar Buffers = __webpack_require__(5289);\nvar Vars = __webpack_require__(7962);\nvar Stream = (__webpack_require__(2781).Stream);\n\nexports = module.exports = function (bufOrEm, eventName) {\n if (Buffer.isBuffer(bufOrEm)) {\n return exports.parse(bufOrEm);\n }\n \n var s = exports.stream();\n if (bufOrEm && bufOrEm.pipe) {\n bufOrEm.pipe(s);\n }\n else if (bufOrEm) {\n bufOrEm.on(eventName || 'data', function (buf) {\n s.write(buf);\n });\n \n bufOrEm.on('end', function () {\n s.end();\n });\n }\n return s;\n};\n\nexports.stream = function (input) {\n if (input) return exports.apply(null, arguments);\n \n var pending = null;\n function getBytes (bytes, cb, skip) {\n pending = {\n bytes : bytes,\n skip : skip,\n cb : function (buf) {\n pending = null;\n cb(buf);\n },\n };\n dispatch();\n }\n \n var offset = null;\n function dispatch () {\n if (!pending) {\n if (caughtEnd) done = true;\n return;\n }\n if (typeof pending === 'function') {\n pending();\n }\n else {\n var bytes = offset + pending.bytes;\n \n if (buffers.length >= bytes) {\n var buf;\n if (offset == null) {\n buf = buffers.splice(0, bytes);\n if (!pending.skip) {\n buf = buf.slice();\n }\n }\n else {\n if (!pending.skip) {\n buf = buffers.slice(offset, bytes);\n }\n offset = bytes;\n }\n \n if (pending.skip) {\n pending.cb();\n }\n else {\n pending.cb(buf);\n }\n }\n }\n }\n \n function builder (saw) {\n function next () { if (!done) saw.next() }\n \n var self = words(function (bytes, cb) {\n return function (name) {\n getBytes(bytes, function (buf) {\n vars.set(name, cb(buf));\n next();\n });\n };\n });\n \n self.tap = function (cb) {\n saw.nest(cb, vars.store);\n };\n \n self.into = function (key, cb) {\n if (!vars.get(key)) vars.set(key, {});\n var parent = vars;\n vars = Vars(parent.get(key));\n \n saw.nest(function () {\n cb.apply(this, arguments);\n this.tap(function () {\n vars = parent;\n });\n }, vars.store);\n };\n \n self.flush = function () {\n vars.store = {};\n next();\n };\n \n self.loop = function (cb) {\n var end = false;\n \n saw.nest(false, function loop () {\n this.vars = vars.store;\n cb.call(this, function () {\n end = true;\n next();\n }, vars.store);\n this.tap(function () {\n if (end) saw.next()\n else loop.call(this)\n }.bind(this));\n }, vars.store);\n };\n \n self.buffer = function (name, bytes) {\n if (typeof bytes === 'string') {\n bytes = vars.get(bytes);\n }\n \n getBytes(bytes, function (buf) {\n vars.set(name, buf);\n next();\n });\n };\n \n self.skip = function (bytes) {\n if (typeof bytes === 'string') {\n bytes = vars.get(bytes);\n }\n \n getBytes(bytes, function () {\n next();\n });\n };\n \n self.scan = function find (name, search) {\n if (typeof search === 'string') {\n search = new Buffer(search);\n }\n else if (!Buffer.isBuffer(search)) {\n throw new Error('search must be a Buffer or a string');\n }\n \n var taken = 0;\n pending = function () {\n var pos = buffers.indexOf(search, offset + taken);\n var i = pos-offset-taken;\n if (pos !== -1) {\n pending = null;\n if (offset != null) {\n vars.set(\n name,\n buffers.slice(offset, offset + taken + i)\n );\n offset += taken + i + search.length;\n }\n else {\n vars.set(\n name,\n buffers.slice(0, taken + i)\n );\n buffers.splice(0, taken + i + search.length);\n }\n next();\n dispatch();\n } else {\n i = Math.max(buffers.length - search.length - offset - taken, 0);\n\t\t\t\t}\n taken += i;\n };\n dispatch();\n };\n \n self.peek = function (cb) {\n offset = 0;\n saw.nest(function () {\n cb.call(this, vars.store);\n this.tap(function () {\n offset = null;\n });\n });\n };\n \n return self;\n };\n \n var stream = Chainsaw.light(builder);\n stream.writable = true;\n \n var buffers = Buffers();\n \n stream.write = function (buf) {\n buffers.push(buf);\n dispatch();\n };\n \n var vars = Vars();\n \n var done = false, caughtEnd = false;\n stream.end = function () {\n caughtEnd = true;\n };\n \n stream.pipe = Stream.prototype.pipe;\n Object.getOwnPropertyNames(EventEmitter.prototype).forEach(function (name) {\n stream[name] = EventEmitter.prototype[name];\n });\n \n return stream;\n};\n\nexports.parse = function parse (buffer) {\n var self = words(function (bytes, cb) {\n return function (name) {\n if (offset + bytes <= buffer.length) {\n var buf = buffer.slice(offset, offset + bytes);\n offset += bytes;\n vars.set(name, cb(buf));\n }\n else {\n vars.set(name, null);\n }\n return self;\n };\n });\n \n var offset = 0;\n var vars = Vars();\n self.vars = vars.store;\n \n self.tap = function (cb) {\n cb.call(self, vars.store);\n return self;\n };\n \n self.into = function (key, cb) {\n if (!vars.get(key)) {\n vars.set(key, {});\n }\n var parent = vars;\n vars = Vars(parent.get(key));\n cb.call(self, vars.store);\n vars = parent;\n return self;\n };\n \n self.loop = function (cb) {\n var end = false;\n var ender = function () { end = true };\n while (end === false) {\n cb.call(self, ender, vars.store);\n }\n return self;\n };\n \n self.buffer = function (name, size) {\n if (typeof size === 'string') {\n size = vars.get(size);\n }\n var buf = buffer.slice(offset, Math.min(buffer.length, offset + size));\n offset += size;\n vars.set(name, buf);\n \n return self;\n };\n \n self.skip = function (bytes) {\n if (typeof bytes === 'string') {\n bytes = vars.get(bytes);\n }\n offset += bytes;\n \n return self;\n };\n \n self.scan = function (name, search) {\n if (typeof search === 'string') {\n search = new Buffer(search);\n }\n else if (!Buffer.isBuffer(search)) {\n throw new Error('search must be a Buffer or a string');\n }\n vars.set(name, null);\n \n // simple but slow string search\n for (var i = 0; i + offset <= buffer.length - search.length + 1; i++) {\n for (\n var j = 0;\n j < search.length && buffer[offset+i+j] === search[j];\n j++\n );\n if (j === search.length) break;\n }\n \n vars.set(name, buffer.slice(offset, offset + i));\n offset += i + search.length;\n return self;\n };\n \n self.peek = function (cb) {\n var was = offset;\n cb.call(self, vars.store);\n offset = was;\n return self;\n };\n \n self.flush = function () {\n vars.store = {};\n return self;\n };\n \n self.eof = function () {\n return offset >= buffer.length;\n };\n \n return self;\n};\n\n// convert byte strings to unsigned little endian numbers\nfunction decodeLEu (bytes) {\n var acc = 0;\n for (var i = 0; i < bytes.length; i++) {\n acc += Math.pow(256,i) * bytes[i];\n }\n return acc;\n}\n\n// convert byte strings to unsigned big endian numbers\nfunction decodeBEu (bytes) {\n var acc = 0;\n for (var i = 0; i < bytes.length; i++) {\n acc += Math.pow(256, bytes.length - i - 1) * bytes[i];\n }\n return acc;\n}\n\n// convert byte strings to signed big endian numbers\nfunction decodeBEs (bytes) {\n var val = decodeBEu(bytes);\n if ((bytes[0] & 0x80) == 0x80) {\n val -= Math.pow(256, bytes.length);\n }\n return val;\n}\n\n// convert byte strings to signed little endian numbers\nfunction decodeLEs (bytes) {\n var val = decodeLEu(bytes);\n if ((bytes[bytes.length - 1] & 0x80) == 0x80) {\n val -= Math.pow(256, bytes.length);\n }\n return val;\n}\n\nfunction words (decode) {\n var self = {};\n \n [ 1, 2, 4, 8 ].forEach(function (bytes) {\n var bits = bytes * 8;\n \n self['word' + bits + 'le']\n = self['word' + bits + 'lu']\n = decode(bytes, decodeLEu);\n \n self['word' + bits + 'ls']\n = decode(bytes, decodeLEs);\n \n self['word' + bits + 'be']\n = self['word' + bits + 'bu']\n = decode(bytes, decodeBEu);\n \n self['word' + bits + 'bs']\n = decode(bytes, decodeBEs);\n });\n \n // word8be(n) == word8le(n) for all n\n self.word8 = self.word8u = self.word8be;\n self.word8s = self.word8bs;\n \n return self;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzc0MC5qcyIsIm1hcHBpbmdzIjoiQUFBQSxlQUFlLG1CQUFPLENBQUMsSUFBVTtBQUNqQyxtQkFBbUIsd0NBQThCO0FBQ2pELGNBQWMsbUJBQU8sQ0FBQyxJQUFTO0FBQy9CLFdBQVcsbUJBQU8sQ0FBQyxJQUFlO0FBQ2xDLGFBQWEsa0NBQXdCOztBQUVyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUEsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGlEQUFpRDtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixrQkFBa0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvYmluYXJ5L2luZGV4LmpzP2Y1MTQiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIENoYWluc2F3ID0gcmVxdWlyZSgnY2hhaW5zYXcnKTtcbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG52YXIgQnVmZmVycyA9IHJlcXVpcmUoJ2J1ZmZlcnMnKTtcbnZhciBWYXJzID0gcmVxdWlyZSgnLi9saWIvdmFycy5qcycpO1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbTtcblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJ1Zk9yRW0sIGV2ZW50TmFtZSkge1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoYnVmT3JFbSkpIHtcbiAgICAgICAgcmV0dXJuIGV4cG9ydHMucGFyc2UoYnVmT3JFbSk7XG4gICAgfVxuICAgIFxuICAgIHZhciBzID0gZXhwb3J0cy5zdHJlYW0oKTtcbiAgICBpZiAoYnVmT3JFbSAmJiBidWZPckVtLnBpcGUpIHtcbiAgICAgICAgYnVmT3JFbS5waXBlKHMpO1xuICAgIH1cbiAgICBlbHNlIGlmIChidWZPckVtKSB7XG4gICAgICAgIGJ1Zk9yRW0ub24oZXZlbnROYW1lIHx8ICdkYXRhJywgZnVuY3Rpb24gKGJ1Zikge1xuICAgICAgICAgICAgcy53cml0ZShidWYpO1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIGJ1Zk9yRW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHMuZW5kKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcztcbn07XG5cbmV4cG9ydHMuc3RyZWFtID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgaWYgKGlucHV0KSByZXR1cm4gZXhwb3J0cy5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIFxuICAgIHZhciBwZW5kaW5nID0gbnVsbDtcbiAgICBmdW5jdGlvbiBnZXRCeXRlcyAoYnl0ZXMsIGNiLCBza2lwKSB7XG4gICAgICAgIHBlbmRpbmcgPSB7XG4gICAgICAgICAgICBieXRlcyA6IGJ5dGVzLFxuICAgICAgICAgICAgc2tpcCA6IHNraXAsXG4gICAgICAgICAgICBjYiA6IGZ1bmN0aW9uIChidWYpIHtcbiAgICAgICAgICAgICAgICBwZW5kaW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgICBjYihidWYpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgZGlzcGF0Y2goKTtcbiAgICB9XG4gICAgXG4gICAgdmFyIG9mZnNldCA9IG51bGw7XG4gICAgZnVuY3Rpb24gZGlzcGF0Y2ggKCkge1xuICAgICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgICAgIGlmIChjYXVnaHRFbmQpIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGVuZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcGVuZGluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGJ5dGVzID0gb2Zmc2V0ICsgcGVuZGluZy5ieXRlcztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGJ1ZmZlcnMubGVuZ3RoID49IGJ5dGVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJ1ZjtcbiAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmID0gYnVmZmVycy5zcGxpY2UoMCwgYnl0ZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBlbmRpbmcuc2tpcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gYnVmLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGVuZGluZy5za2lwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWYgPSBidWZmZXJzLnNsaWNlKG9mZnNldCwgYnl0ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGJ5dGVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAocGVuZGluZy5za2lwKSB7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmcuY2IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmcuY2IoYnVmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgZnVuY3Rpb24gYnVpbGRlciAoc2F3KSB7XG4gICAgICAgIGZ1bmN0aW9uIG5leHQgKCkgeyBpZiAoIWRvbmUpIHNhdy5uZXh0KCkgfVxuICAgICAgICBcbiAgICAgICAgdmFyIHNlbGYgPSB3b3JkcyhmdW5jdGlvbiAoYnl0ZXMsIGNiKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICBnZXRCeXRlcyhieXRlcywgZnVuY3Rpb24gKGJ1Zikge1xuICAgICAgICAgICAgICAgICAgICB2YXJzLnNldChuYW1lLCBjYihidWYpKTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBzZWxmLnRhcCA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgc2F3Lm5lc3QoY2IsIHZhcnMuc3RvcmUpO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgc2VsZi5pbnRvID0gZnVuY3Rpb24gKGtleSwgY2IpIHtcbiAgICAgICAgICAgIGlmICghdmFycy5nZXQoa2V5KSkgdmFycy5zZXQoa2V5LCB7fSk7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gdmFycztcbiAgICAgICAgICAgIHZhcnMgPSBWYXJzKHBhcmVudC5nZXQoa2V5KSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHNhdy5uZXN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFycyA9IHBhcmVudDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIHZhcnMuc3RvcmUpO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgc2VsZi5mbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhcnMuc3RvcmUgPSB7fTtcbiAgICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHNlbGYubG9vcCA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgdmFyIGVuZCA9IGZhbHNlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBzYXcubmVzdChmYWxzZSwgZnVuY3Rpb24gbG9vcCAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YXJzID0gdmFycy5zdG9yZTtcbiAgICAgICAgICAgICAgICBjYi5jYWxsKHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICAgIH0sIHZhcnMuc3RvcmUpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZCkgc2F3Lm5leHQoKVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGxvb3AuY2FsbCh0aGlzKVxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICAgICAgICB9LCB2YXJzLnN0b3JlKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHNlbGYuYnVmZmVyID0gZnVuY3Rpb24gKG5hbWUsIGJ5dGVzKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGJ5dGVzID0gdmFycy5nZXQoYnl0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBnZXRCeXRlcyhieXRlcywgZnVuY3Rpb24gKGJ1Zikge1xuICAgICAgICAgICAgICAgIHZhcnMuc2V0KG5hbWUsIGJ1Zik7XG4gICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBzZWxmLnNraXAgPSBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgYnl0ZXMgPSB2YXJzLmdldChieXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGdldEJ5dGVzKGJ5dGVzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBzZWxmLnNjYW4gPSBmdW5jdGlvbiBmaW5kIChuYW1lLCBzZWFyY2gpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHNlYXJjaCA9IG5ldyBCdWZmZXIoc2VhcmNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFCdWZmZXIuaXNCdWZmZXIoc2VhcmNoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2VhcmNoIG11c3QgYmUgYSBCdWZmZXIgb3IgYSBzdHJpbmcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRha2VuID0gMDtcbiAgICAgICAgICAgIHBlbmRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBvcyA9IGJ1ZmZlcnMuaW5kZXhPZihzZWFyY2gsIG9mZnNldCArIHRha2VuKTtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IHBvcy1vZmZzZXQtdGFrZW47XG4gICAgICAgICAgICAgICAgaWYgKHBvcyAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFycy5zZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgdGFrZW4gKyBpKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSB0YWtlbiArIGkgKyBzZWFyY2gubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFycy5zZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzLnNsaWNlKDAsIHRha2VuICsgaSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzLnNwbGljZSgwLCB0YWtlbiArIGkgKyBzZWFyY2gubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaSA9IE1hdGgubWF4KGJ1ZmZlcnMubGVuZ3RoIC0gc2VhcmNoLmxlbmd0aCAtIG9mZnNldCAtIHRha2VuLCAwKTtcblx0XHRcdFx0fVxuICAgICAgICAgICAgICAgIHRha2VuICs9IGk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGlzcGF0Y2goKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHNlbGYucGVlayA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIHNhdy5uZXN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjYi5jYWxsKHRoaXMsIHZhcnMuc3RvcmUpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfTtcbiAgICBcbiAgICB2YXIgc3RyZWFtID0gQ2hhaW5zYXcubGlnaHQoYnVpbGRlcik7XG4gICAgc3RyZWFtLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBcbiAgICB2YXIgYnVmZmVycyA9IEJ1ZmZlcnMoKTtcbiAgICBcbiAgICBzdHJlYW0ud3JpdGUgPSBmdW5jdGlvbiAoYnVmKSB7XG4gICAgICAgIGJ1ZmZlcnMucHVzaChidWYpO1xuICAgICAgICBkaXNwYXRjaCgpO1xuICAgIH07XG4gICAgXG4gICAgdmFyIHZhcnMgPSBWYXJzKCk7XG4gICAgXG4gICAgdmFyIGRvbmUgPSBmYWxzZSwgY2F1Z2h0RW5kID0gZmFsc2U7XG4gICAgc3RyZWFtLmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2F1Z2h0RW5kID0gdHJ1ZTtcbiAgICB9O1xuICAgIFxuICAgIHN0cmVhbS5waXBlID0gU3RyZWFtLnByb3RvdHlwZS5waXBlO1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEV2ZW50RW1pdHRlci5wcm90b3R5cGUpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgc3RyZWFtW25hbWVdID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZVtuYW1lXTtcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gc3RyZWFtO1xufTtcblxuZXhwb3J0cy5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlIChidWZmZXIpIHtcbiAgICB2YXIgc2VsZiA9IHdvcmRzKGZ1bmN0aW9uIChieXRlcywgY2IpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICBpZiAob2Zmc2V0ICsgYnl0ZXMgPD0gYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciBidWYgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBieXRlcyk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGJ5dGVzO1xuICAgICAgICAgICAgICAgIHZhcnMuc2V0KG5hbWUsIGNiKGJ1ZikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFycy5zZXQobmFtZSwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICBcbiAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICB2YXIgdmFycyA9IFZhcnMoKTtcbiAgICBzZWxmLnZhcnMgPSB2YXJzLnN0b3JlO1xuICAgIFxuICAgIHNlbGYudGFwID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgIGNiLmNhbGwoc2VsZiwgdmFycy5zdG9yZSk7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgXG4gICAgc2VsZi5pbnRvID0gZnVuY3Rpb24gKGtleSwgY2IpIHtcbiAgICAgICAgaWYgKCF2YXJzLmdldChrZXkpKSB7XG4gICAgICAgICAgICB2YXJzLnNldChrZXksIHt9KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50ID0gdmFycztcbiAgICAgICAgdmFycyA9IFZhcnMocGFyZW50LmdldChrZXkpKTtcbiAgICAgICAgY2IuY2FsbChzZWxmLCB2YXJzLnN0b3JlKTtcbiAgICAgICAgdmFycyA9IHBhcmVudDtcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfTtcbiAgICBcbiAgICBzZWxmLmxvb3AgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgdmFyIGVuZCA9IGZhbHNlO1xuICAgICAgICB2YXIgZW5kZXIgPSBmdW5jdGlvbiAoKSB7IGVuZCA9IHRydWUgfTtcbiAgICAgICAgd2hpbGUgKGVuZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNiLmNhbGwoc2VsZiwgZW5kZXIsIHZhcnMuc3RvcmUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgXG4gICAgc2VsZi5idWZmZXIgPSBmdW5jdGlvbiAobmFtZSwgc2l6ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHNpemUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBzaXplID0gdmFycy5nZXQoc2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJ1ZiA9IGJ1ZmZlci5zbGljZShvZmZzZXQsIE1hdGgubWluKGJ1ZmZlci5sZW5ndGgsIG9mZnNldCArIHNpemUpKTtcbiAgICAgICAgb2Zmc2V0ICs9IHNpemU7XG4gICAgICAgIHZhcnMuc2V0KG5hbWUsIGJ1Zik7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9O1xuICAgIFxuICAgIHNlbGYuc2tpcCA9IGZ1bmN0aW9uIChieXRlcykge1xuICAgICAgICBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgYnl0ZXMgPSB2YXJzLmdldChieXRlcyk7XG4gICAgICAgIH1cbiAgICAgICAgb2Zmc2V0ICs9IGJ5dGVzO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfTtcbiAgICBcbiAgICBzZWxmLnNjYW4gPSBmdW5jdGlvbiAobmFtZSwgc2VhcmNoKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgc2VhcmNoID0gbmV3IEJ1ZmZlcihzZWFyY2gpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFCdWZmZXIuaXNCdWZmZXIoc2VhcmNoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZWFyY2ggbXVzdCBiZSBhIEJ1ZmZlciBvciBhIHN0cmluZycpO1xuICAgICAgICB9XG4gICAgICAgIHZhcnMuc2V0KG5hbWUsIG51bGwpO1xuICAgICAgICBcbiAgICAgICAgLy8gc2ltcGxlIGJ1dCBzbG93IHN0cmluZyBzZWFyY2hcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgKyBvZmZzZXQgPD0gYnVmZmVyLmxlbmd0aCAtIHNlYXJjaC5sZW5ndGggKyAxOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgICAgdmFyIGogPSAwO1xuICAgICAgICAgICAgICAgIGogPCBzZWFyY2gubGVuZ3RoICYmIGJ1ZmZlcltvZmZzZXQraStqXSA9PT0gc2VhcmNoW2pdO1xuICAgICAgICAgICAgICAgIGorK1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChqID09PSBzZWFyY2gubGVuZ3RoKSBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdmFycy5zZXQobmFtZSwgYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgaSkpO1xuICAgICAgICBvZmZzZXQgKz0gaSArIHNlYXJjaC5sZW5ndGg7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgXG4gICAgc2VsZi5wZWVrID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgIHZhciB3YXMgPSBvZmZzZXQ7XG4gICAgICAgIGNiLmNhbGwoc2VsZiwgdmFycy5zdG9yZSk7XG4gICAgICAgIG9mZnNldCA9IHdhcztcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfTtcbiAgICBcbiAgICBzZWxmLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXJzLnN0b3JlID0ge307XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgXG4gICAgc2VsZi5lb2YgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPj0gYnVmZmVyLmxlbmd0aDtcbiAgICB9O1xuICAgIFxuICAgIHJldHVybiBzZWxmO1xufTtcblxuLy8gY29udmVydCBieXRlIHN0cmluZ3MgdG8gdW5zaWduZWQgbGl0dGxlIGVuZGlhbiBudW1iZXJzXG5mdW5jdGlvbiBkZWNvZGVMRXUgKGJ5dGVzKSB7XG4gICAgdmFyIGFjYyA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhY2MgKz0gTWF0aC5wb3coMjU2LGkpICogYnl0ZXNbaV07XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG59XG5cbi8vIGNvbnZlcnQgYnl0ZSBzdHJpbmdzIHRvIHVuc2lnbmVkIGJpZyBlbmRpYW4gbnVtYmVyc1xuZnVuY3Rpb24gZGVjb2RlQkV1IChieXRlcykge1xuICAgIHZhciBhY2MgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYWNjICs9IE1hdGgucG93KDI1NiwgYnl0ZXMubGVuZ3RoIC0gaSAtIDEpICogYnl0ZXNbaV07XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG59XG5cbi8vIGNvbnZlcnQgYnl0ZSBzdHJpbmdzIHRvIHNpZ25lZCBiaWcgZW5kaWFuIG51bWJlcnNcbmZ1bmN0aW9uIGRlY29kZUJFcyAoYnl0ZXMpIHtcbiAgICB2YXIgdmFsID0gZGVjb2RlQkV1KGJ5dGVzKTtcbiAgICBpZiAoKGJ5dGVzWzBdICYgMHg4MCkgPT0gMHg4MCkge1xuICAgICAgICB2YWwgLT0gTWF0aC5wb3coMjU2LCBieXRlcy5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xufVxuXG4vLyBjb252ZXJ0IGJ5dGUgc3RyaW5ncyB0byBzaWduZWQgbGl0dGxlIGVuZGlhbiBudW1iZXJzXG5mdW5jdGlvbiBkZWNvZGVMRXMgKGJ5dGVzKSB7XG4gICAgdmFyIHZhbCA9IGRlY29kZUxFdShieXRlcyk7XG4gICAgaWYgKChieXRlc1tieXRlcy5sZW5ndGggLSAxXSAmIDB4ODApID09IDB4ODApIHtcbiAgICAgICAgdmFsIC09IE1hdGgucG93KDI1NiwgYnl0ZXMubGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gd29yZHMgKGRlY29kZSkge1xuICAgIHZhciBzZWxmID0ge307XG4gICAgXG4gICAgWyAxLCAyLCA0LCA4IF0uZm9yRWFjaChmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgICAgICAgdmFyIGJpdHMgPSBieXRlcyAqIDg7XG4gICAgICAgIFxuICAgICAgICBzZWxmWyd3b3JkJyArIGJpdHMgKyAnbGUnXVxuICAgICAgICA9IHNlbGZbJ3dvcmQnICsgYml0cyArICdsdSddXG4gICAgICAgID0gZGVjb2RlKGJ5dGVzLCBkZWNvZGVMRXUpO1xuICAgICAgICBcbiAgICAgICAgc2VsZlsnd29yZCcgKyBiaXRzICsgJ2xzJ11cbiAgICAgICAgPSBkZWNvZGUoYnl0ZXMsIGRlY29kZUxFcyk7XG4gICAgICAgIFxuICAgICAgICBzZWxmWyd3b3JkJyArIGJpdHMgKyAnYmUnXVxuICAgICAgICA9IHNlbGZbJ3dvcmQnICsgYml0cyArICdidSddXG4gICAgICAgID0gZGVjb2RlKGJ5dGVzLCBkZWNvZGVCRXUpO1xuICAgICAgICBcbiAgICAgICAgc2VsZlsnd29yZCcgKyBiaXRzICsgJ2JzJ11cbiAgICAgICAgPSBkZWNvZGUoYnl0ZXMsIGRlY29kZUJFcyk7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gd29yZDhiZShuKSA9PSB3b3JkOGxlKG4pIGZvciBhbGwgblxuICAgIHNlbGYud29yZDggPSBzZWxmLndvcmQ4dSA9IHNlbGYud29yZDhiZTtcbiAgICBzZWxmLndvcmQ4cyA9IHNlbGYud29yZDhicztcbiAgICBcbiAgICByZXR1cm4gc2VsZjtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7740\n")},7962:module=>{eval("module.exports = function (store) {\n function getset (name, value) {\n var node = vars.store;\n var keys = name.split('.');\n keys.slice(0,-1).forEach(function (k) {\n if (node[k] === undefined) node[k] = {};\n node = node[k]\n });\n var key = keys[keys.length - 1];\n if (arguments.length == 1) {\n return node[key];\n }\n else {\n return node[key] = value;\n }\n }\n \n var vars = {\n get : function (name) {\n return getset(name);\n },\n set : function (name, value) {\n return getset(name, value);\n },\n store : store || {},\n };\n return vars;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzk2Mi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVCwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvYmluYXJ5L2xpYi92YXJzLmpzP2ExNzgiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RvcmUpIHtcbiAgICBmdW5jdGlvbiBnZXRzZXQgKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHZhciBub2RlID0gdmFycy5zdG9yZTtcbiAgICAgICAgdmFyIGtleXMgPSBuYW1lLnNwbGl0KCcuJyk7XG4gICAgICAgIGtleXMuc2xpY2UoMCwtMSkuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICAgICAgaWYgKG5vZGVba10gPT09IHVuZGVmaW5lZCkgbm9kZVtrXSA9IHt9O1xuICAgICAgICAgICAgbm9kZSA9IG5vZGVba11cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZVtrZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdmFyIHZhcnMgPSB7XG4gICAgICAgIGdldCA6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0c2V0KG5hbWUpO1xuICAgICAgICB9LFxuICAgICAgICBzZXQgOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRzZXQobmFtZSwgdmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBzdG9yZSA6IHN0b3JlIHx8IHt9LFxuICAgIH07XG4gICAgcmV0dXJuIHZhcnM7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7962\n")},9668:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nconst { Buffer } = __webpack_require__(4300)\nconst symbol = Symbol.for('BufferList')\n\nfunction BufferList (buf) {\n if (!(this instanceof BufferList)) {\n return new BufferList(buf)\n }\n\n BufferList._init.call(this, buf)\n}\n\nBufferList._init = function _init (buf) {\n Object.defineProperty(this, symbol, { value: true })\n\n this._bufs = []\n this.length = 0\n\n if (buf) {\n this.append(buf)\n }\n}\n\nBufferList.prototype._new = function _new (buf) {\n return new BufferList(buf)\n}\n\nBufferList.prototype._offset = function _offset (offset) {\n if (offset === 0) {\n return [0, 0]\n }\n\n let tot = 0\n\n for (let i = 0; i < this._bufs.length; i++) {\n const _t = tot + this._bufs[i].length\n if (offset < _t || i === this._bufs.length - 1) {\n return [i, offset - tot]\n }\n tot = _t\n }\n}\n\nBufferList.prototype._reverseOffset = function (blOffset) {\n const bufferId = blOffset[0]\n let offset = blOffset[1]\n\n for (let i = 0; i < bufferId; i++) {\n offset += this._bufs[i].length\n }\n\n return offset\n}\n\nBufferList.prototype.get = function get (index) {\n if (index > this.length || index < 0) {\n return undefined\n }\n\n const offset = this._offset(index)\n\n return this._bufs[offset[0]][offset[1]]\n}\n\nBufferList.prototype.slice = function slice (start, end) {\n if (typeof start === 'number' && start < 0) {\n start += this.length\n }\n\n if (typeof end === 'number' && end < 0) {\n end += this.length\n }\n\n return this.copy(null, 0, start, end)\n}\n\nBufferList.prototype.copy = function copy (dst, dstStart, srcStart, srcEnd) {\n if (typeof srcStart !== 'number' || srcStart < 0) {\n srcStart = 0\n }\n\n if (typeof srcEnd !== 'number' || srcEnd > this.length) {\n srcEnd = this.length\n }\n\n if (srcStart >= this.length) {\n return dst || Buffer.alloc(0)\n }\n\n if (srcEnd <= 0) {\n return dst || Buffer.alloc(0)\n }\n\n const copy = !!dst\n const off = this._offset(srcStart)\n const len = srcEnd - srcStart\n let bytes = len\n let bufoff = (copy && dstStart) || 0\n let start = off[1]\n\n // copy/slice everything\n if (srcStart === 0 && srcEnd === this.length) {\n if (!copy) {\n // slice, but full concat if multiple buffers\n return this._bufs.length === 1\n ? this._bufs[0]\n : Buffer.concat(this._bufs, this.length)\n }\n\n // copy, need to copy individual buffers\n for (let i = 0; i < this._bufs.length; i++) {\n this._bufs[i].copy(dst, bufoff)\n bufoff += this._bufs[i].length\n }\n\n return dst\n }\n\n // easy, cheap case where it's a subset of one of the buffers\n if (bytes <= this._bufs[off[0]].length - start) {\n return copy\n ? this._bufs[off[0]].copy(dst, dstStart, start, start + bytes)\n : this._bufs[off[0]].slice(start, start + bytes)\n }\n\n if (!copy) {\n // a slice, we need something to copy in to\n dst = Buffer.allocUnsafe(len)\n }\n\n for (let i = off[0]; i < this._bufs.length; i++) {\n const l = this._bufs[i].length - start\n\n if (bytes > l) {\n this._bufs[i].copy(dst, bufoff, start)\n bufoff += l\n } else {\n this._bufs[i].copy(dst, bufoff, start, start + bytes)\n bufoff += l\n break\n }\n\n bytes -= l\n\n if (start) {\n start = 0\n }\n }\n\n // safeguard so that we don't return uninitialized memory\n if (dst.length > bufoff) return dst.slice(0, bufoff)\n\n return dst\n}\n\nBufferList.prototype.shallowSlice = function shallowSlice (start, end) {\n start = start || 0\n end = typeof end !== 'number' ? this.length : end\n\n if (start < 0) {\n start += this.length\n }\n\n if (end < 0) {\n end += this.length\n }\n\n if (start === end) {\n return this._new()\n }\n\n const startOffset = this._offset(start)\n const endOffset = this._offset(end)\n const buffers = this._bufs.slice(startOffset[0], endOffset[0] + 1)\n\n if (endOffset[1] === 0) {\n buffers.pop()\n } else {\n buffers[buffers.length - 1] = buffers[buffers.length - 1].slice(0, endOffset[1])\n }\n\n if (startOffset[1] !== 0) {\n buffers[0] = buffers[0].slice(startOffset[1])\n }\n\n return this._new(buffers)\n}\n\nBufferList.prototype.toString = function toString (encoding, start, end) {\n return this.slice(start, end).toString(encoding)\n}\n\nBufferList.prototype.consume = function consume (bytes) {\n // first, normalize the argument, in accordance with how Buffer does it\n bytes = Math.trunc(bytes)\n // do nothing if not a positive number\n if (Number.isNaN(bytes) || bytes <= 0) return this\n\n while (this._bufs.length) {\n if (bytes >= this._bufs[0].length) {\n bytes -= this._bufs[0].length\n this.length -= this._bufs[0].length\n this._bufs.shift()\n } else {\n this._bufs[0] = this._bufs[0].slice(bytes)\n this.length -= bytes\n break\n }\n }\n\n return this\n}\n\nBufferList.prototype.duplicate = function duplicate () {\n const copy = this._new()\n\n for (let i = 0; i < this._bufs.length; i++) {\n copy.append(this._bufs[i])\n }\n\n return copy\n}\n\nBufferList.prototype.append = function append (buf) {\n if (buf == null) {\n return this\n }\n\n if (buf.buffer) {\n // append a view of the underlying ArrayBuffer\n this._appendBuffer(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength))\n } else if (Array.isArray(buf)) {\n for (let i = 0; i < buf.length; i++) {\n this.append(buf[i])\n }\n } else if (this._isBufferList(buf)) {\n // unwrap argument into individual BufferLists\n for (let i = 0; i < buf._bufs.length; i++) {\n this.append(buf._bufs[i])\n }\n } else {\n // coerce number arguments to strings, since Buffer(number) does\n // uninitialized memory allocation\n if (typeof buf === 'number') {\n buf = buf.toString()\n }\n\n this._appendBuffer(Buffer.from(buf))\n }\n\n return this\n}\n\nBufferList.prototype._appendBuffer = function appendBuffer (buf) {\n this._bufs.push(buf)\n this.length += buf.length\n}\n\nBufferList.prototype.indexOf = function (search, offset, encoding) {\n if (encoding === undefined && typeof offset === 'string') {\n encoding = offset\n offset = undefined\n }\n\n if (typeof search === 'function' || Array.isArray(search)) {\n throw new TypeError('The \"value\" argument must be one of type string, Buffer, BufferList, or Uint8Array.')\n } else if (typeof search === 'number') {\n search = Buffer.from([search])\n } else if (typeof search === 'string') {\n search = Buffer.from(search, encoding)\n } else if (this._isBufferList(search)) {\n search = search.slice()\n } else if (Array.isArray(search.buffer)) {\n search = Buffer.from(search.buffer, search.byteOffset, search.byteLength)\n } else if (!Buffer.isBuffer(search)) {\n search = Buffer.from(search)\n }\n\n offset = Number(offset || 0)\n\n if (isNaN(offset)) {\n offset = 0\n }\n\n if (offset < 0) {\n offset = this.length + offset\n }\n\n if (offset < 0) {\n offset = 0\n }\n\n if (search.length === 0) {\n return offset > this.length ? this.length : offset\n }\n\n const blOffset = this._offset(offset)\n let blIndex = blOffset[0] // index of which internal buffer we're working on\n let buffOffset = blOffset[1] // offset of the internal buffer we're working on\n\n // scan over each buffer\n for (; blIndex < this._bufs.length; blIndex++) {\n const buff = this._bufs[blIndex]\n\n while (buffOffset < buff.length) {\n const availableWindow = buff.length - buffOffset\n\n if (availableWindow >= search.length) {\n const nativeSearchResult = buff.indexOf(search, buffOffset)\n\n if (nativeSearchResult !== -1) {\n return this._reverseOffset([blIndex, nativeSearchResult])\n }\n\n buffOffset = buff.length - search.length + 1 // end of native search window\n } else {\n const revOffset = this._reverseOffset([blIndex, buffOffset])\n\n if (this._match(revOffset, search)) {\n return revOffset\n }\n\n buffOffset++\n }\n }\n\n buffOffset = 0\n }\n\n return -1\n}\n\nBufferList.prototype._match = function (offset, search) {\n if (this.length - offset < search.length) {\n return false\n }\n\n for (let searchOffset = 0; searchOffset < search.length; searchOffset++) {\n if (this.get(offset + searchOffset) !== search[searchOffset]) {\n return false\n }\n }\n return true\n}\n\n;(function () {\n const methods = {\n readDoubleBE: 8,\n readDoubleLE: 8,\n readFloatBE: 4,\n readFloatLE: 4,\n readInt32BE: 4,\n readInt32LE: 4,\n readUInt32BE: 4,\n readUInt32LE: 4,\n readInt16BE: 2,\n readInt16LE: 2,\n readUInt16BE: 2,\n readUInt16LE: 2,\n readInt8: 1,\n readUInt8: 1,\n readIntBE: null,\n readIntLE: null,\n readUIntBE: null,\n readUIntLE: null\n }\n\n for (const m in methods) {\n (function (m) {\n if (methods[m] === null) {\n BufferList.prototype[m] = function (offset, byteLength) {\n return this.slice(offset, offset + byteLength)[m](0, byteLength)\n }\n } else {\n BufferList.prototype[m] = function (offset = 0) {\n return this.slice(offset, offset + methods[m])[m](0)\n }\n }\n }(m))\n }\n}())\n\n// Used internally by the class and also as an indicator of this object being\n// a `BufferList`. It's not possible to use `instanceof BufferList` in a browser\n// environment because there could be multiple different copies of the\n// BufferList class and some `BufferList`s might be `BufferList`s.\nBufferList.prototype._isBufferList = function _isBufferList (b) {\n return b instanceof BufferList || BufferList.isBufferList(b)\n}\n\nBufferList.isBufferList = function isBufferList (b) {\n return b != null && b[symbol]\n}\n\nmodule.exports = BufferList\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9ibC9CdWZmZXJMaXN0LmpzPzMzMDEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgQnVmZmVyIH0gPSByZXF1aXJlKCdidWZmZXInKVxuY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcignQnVmZmVyTGlzdCcpXG5cbmZ1bmN0aW9uIEJ1ZmZlckxpc3QgKGJ1Zikge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyTGlzdCkpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlckxpc3QoYnVmKVxuICB9XG5cbiAgQnVmZmVyTGlzdC5faW5pdC5jYWxsKHRoaXMsIGJ1Zilcbn1cblxuQnVmZmVyTGlzdC5faW5pdCA9IGZ1bmN0aW9uIF9pbml0IChidWYpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHN5bWJvbCwgeyB2YWx1ZTogdHJ1ZSB9KVxuXG4gIHRoaXMuX2J1ZnMgPSBbXVxuICB0aGlzLmxlbmd0aCA9IDBcblxuICBpZiAoYnVmKSB7XG4gICAgdGhpcy5hcHBlbmQoYnVmKVxuICB9XG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLl9uZXcgPSBmdW5jdGlvbiBfbmV3IChidWYpIHtcbiAgcmV0dXJuIG5ldyBCdWZmZXJMaXN0KGJ1Zilcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuX29mZnNldCA9IGZ1bmN0aW9uIF9vZmZzZXQgKG9mZnNldCkge1xuICBpZiAob2Zmc2V0ID09PSAwKSB7XG4gICAgcmV0dXJuIFswLCAwXVxuICB9XG5cbiAgbGV0IHRvdCA9IDBcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2J1ZnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBfdCA9IHRvdCArIHRoaXMuX2J1ZnNbaV0ubGVuZ3RoXG4gICAgaWYgKG9mZnNldCA8IF90IHx8IGkgPT09IHRoaXMuX2J1ZnMubGVuZ3RoIC0gMSkge1xuICAgICAgcmV0dXJuIFtpLCBvZmZzZXQgLSB0b3RdXG4gICAgfVxuICAgIHRvdCA9IF90XG4gIH1cbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuX3JldmVyc2VPZmZzZXQgPSBmdW5jdGlvbiAoYmxPZmZzZXQpIHtcbiAgY29uc3QgYnVmZmVySWQgPSBibE9mZnNldFswXVxuICBsZXQgb2Zmc2V0ID0gYmxPZmZzZXRbMV1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlcklkOyBpKyspIHtcbiAgICBvZmZzZXQgKz0gdGhpcy5fYnVmc1tpXS5sZW5ndGhcbiAgfVxuXG4gIHJldHVybiBvZmZzZXRcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChpbmRleCkge1xuICBpZiAoaW5kZXggPiB0aGlzLmxlbmd0aCB8fCBpbmRleCA8IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSB0aGlzLl9vZmZzZXQoaW5kZXgpXG5cbiAgcmV0dXJuIHRoaXMuX2J1ZnNbb2Zmc2V0WzBdXVtvZmZzZXRbMV1dXG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ251bWJlcicgJiYgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmICh0eXBlb2YgZW5kID09PSAnbnVtYmVyJyAmJiBlbmQgPCAwKSB7XG4gICAgZW5kICs9IHRoaXMubGVuZ3RoXG4gIH1cblxuICByZXR1cm4gdGhpcy5jb3B5KG51bGwsIDAsIHN0YXJ0LCBlbmQpXG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5IChkc3QsIGRzdFN0YXJ0LCBzcmNTdGFydCwgc3JjRW5kKSB7XG4gIGlmICh0eXBlb2Ygc3JjU3RhcnQgIT09ICdudW1iZXInIHx8IHNyY1N0YXJ0IDwgMCkge1xuICAgIHNyY1N0YXJ0ID0gMFxuICB9XG5cbiAgaWYgKHR5cGVvZiBzcmNFbmQgIT09ICdudW1iZXInIHx8IHNyY0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgc3JjRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzcmNTdGFydCA+PSB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiBkc3QgfHwgQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICBpZiAoc3JjRW5kIDw9IDApIHtcbiAgICByZXR1cm4gZHN0IHx8IEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgY29uc3QgY29weSA9ICEhZHN0XG4gIGNvbnN0IG9mZiA9IHRoaXMuX29mZnNldChzcmNTdGFydClcbiAgY29uc3QgbGVuID0gc3JjRW5kIC0gc3JjU3RhcnRcbiAgbGV0IGJ5dGVzID0gbGVuXG4gIGxldCBidWZvZmYgPSAoY29weSAmJiBkc3RTdGFydCkgfHwgMFxuICBsZXQgc3RhcnQgPSBvZmZbMV1cblxuICAvLyBjb3B5L3NsaWNlIGV2ZXJ5dGhpbmdcbiAgaWYgKHNyY1N0YXJ0ID09PSAwICYmIHNyY0VuZCA9PT0gdGhpcy5sZW5ndGgpIHtcbiAgICBpZiAoIWNvcHkpIHtcbiAgICAgIC8vIHNsaWNlLCBidXQgZnVsbCBjb25jYXQgaWYgbXVsdGlwbGUgYnVmZmVyc1xuICAgICAgcmV0dXJuIHRoaXMuX2J1ZnMubGVuZ3RoID09PSAxXG4gICAgICAgID8gdGhpcy5fYnVmc1swXVxuICAgICAgICA6IEJ1ZmZlci5jb25jYXQodGhpcy5fYnVmcywgdGhpcy5sZW5ndGgpXG4gICAgfVxuXG4gICAgLy8gY29weSwgbmVlZCB0byBjb3B5IGluZGl2aWR1YWwgYnVmZmVyc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fYnVmcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5fYnVmc1tpXS5jb3B5KGRzdCwgYnVmb2ZmKVxuICAgICAgYnVmb2ZmICs9IHRoaXMuX2J1ZnNbaV0ubGVuZ3RoXG4gICAgfVxuXG4gICAgcmV0dXJuIGRzdFxuICB9XG5cbiAgLy8gZWFzeSwgY2hlYXAgY2FzZSB3aGVyZSBpdCdzIGEgc3Vic2V0IG9mIG9uZSBvZiB0aGUgYnVmZmVyc1xuICBpZiAoYnl0ZXMgPD0gdGhpcy5fYnVmc1tvZmZbMF1dLmxlbmd0aCAtIHN0YXJ0KSB7XG4gICAgcmV0dXJuIGNvcHlcbiAgICAgID8gdGhpcy5fYnVmc1tvZmZbMF1dLmNvcHkoZHN0LCBkc3RTdGFydCwgc3RhcnQsIHN0YXJ0ICsgYnl0ZXMpXG4gICAgICA6IHRoaXMuX2J1ZnNbb2ZmWzBdXS5zbGljZShzdGFydCwgc3RhcnQgKyBieXRlcylcbiAgfVxuXG4gIGlmICghY29weSkge1xuICAgIC8vIGEgc2xpY2UsIHdlIG5lZWQgc29tZXRoaW5nIHRvIGNvcHkgaW4gdG9cbiAgICBkc3QgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuKVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IG9mZlswXTsgaSA8IHRoaXMuX2J1ZnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBsID0gdGhpcy5fYnVmc1tpXS5sZW5ndGggLSBzdGFydFxuXG4gICAgaWYgKGJ5dGVzID4gbCkge1xuICAgICAgdGhpcy5fYnVmc1tpXS5jb3B5KGRzdCwgYnVmb2ZmLCBzdGFydClcbiAgICAgIGJ1Zm9mZiArPSBsXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2J1ZnNbaV0uY29weShkc3QsIGJ1Zm9mZiwgc3RhcnQsIHN0YXJ0ICsgYnl0ZXMpXG4gICAgICBidWZvZmYgKz0gbFxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBieXRlcyAtPSBsXG5cbiAgICBpZiAoc3RhcnQpIHtcbiAgICAgIHN0YXJ0ID0gMFxuICAgIH1cbiAgfVxuXG4gIC8vIHNhZmVndWFyZCBzbyB0aGF0IHdlIGRvbid0IHJldHVybiB1bmluaXRpYWxpemVkIG1lbW9yeVxuICBpZiAoZHN0Lmxlbmd0aCA+IGJ1Zm9mZikgcmV0dXJuIGRzdC5zbGljZSgwLCBidWZvZmYpXG5cbiAgcmV0dXJuIGRzdFxufVxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5zaGFsbG93U2xpY2UgPSBmdW5jdGlvbiBzaGFsbG93U2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgc3RhcnQgPSBzdGFydCB8fCAwXG4gIGVuZCA9IHR5cGVvZiBlbmQgIT09ICdudW1iZXInID8gdGhpcy5sZW5ndGggOiBlbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IGVuZCkge1xuICAgIHJldHVybiB0aGlzLl9uZXcoKVxuICB9XG5cbiAgY29uc3Qgc3RhcnRPZmZzZXQgPSB0aGlzLl9vZmZzZXQoc3RhcnQpXG4gIGNvbnN0IGVuZE9mZnNldCA9IHRoaXMuX29mZnNldChlbmQpXG4gIGNvbnN0IGJ1ZmZlcnMgPSB0aGlzLl9idWZzLnNsaWNlKHN0YXJ0T2Zmc2V0WzBdLCBlbmRPZmZzZXRbMF0gKyAxKVxuXG4gIGlmIChlbmRPZmZzZXRbMV0gPT09IDApIHtcbiAgICBidWZmZXJzLnBvcCgpXG4gIH0gZWxzZSB7XG4gICAgYnVmZmVyc1tidWZmZXJzLmxlbmd0aCAtIDFdID0gYnVmZmVyc1tidWZmZXJzLmxlbmd0aCAtIDFdLnNsaWNlKDAsIGVuZE9mZnNldFsxXSlcbiAgfVxuXG4gIGlmIChzdGFydE9mZnNldFsxXSAhPT0gMCkge1xuICAgIGJ1ZmZlcnNbMF0gPSBidWZmZXJzWzBdLnNsaWNlKHN0YXJ0T2Zmc2V0WzFdKVxuICB9XG5cbiAgcmV0dXJuIHRoaXMuX25ldyhidWZmZXJzKVxufVxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICByZXR1cm4gdGhpcy5zbGljZShzdGFydCwgZW5kKS50b1N0cmluZyhlbmNvZGluZylcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuY29uc3VtZSA9IGZ1bmN0aW9uIGNvbnN1bWUgKGJ5dGVzKSB7XG4gIC8vIGZpcnN0LCBub3JtYWxpemUgdGhlIGFyZ3VtZW50LCBpbiBhY2NvcmRhbmNlIHdpdGggaG93IEJ1ZmZlciBkb2VzIGl0XG4gIGJ5dGVzID0gTWF0aC50cnVuYyhieXRlcylcbiAgLy8gZG8gbm90aGluZyBpZiBub3QgYSBwb3NpdGl2ZSBudW1iZXJcbiAgaWYgKE51bWJlci5pc05hTihieXRlcykgfHwgYnl0ZXMgPD0gMCkgcmV0dXJuIHRoaXNcblxuICB3aGlsZSAodGhpcy5fYnVmcy5sZW5ndGgpIHtcbiAgICBpZiAoYnl0ZXMgPj0gdGhpcy5fYnVmc1swXS5sZW5ndGgpIHtcbiAgICAgIGJ5dGVzIC09IHRoaXMuX2J1ZnNbMF0ubGVuZ3RoXG4gICAgICB0aGlzLmxlbmd0aCAtPSB0aGlzLl9idWZzWzBdLmxlbmd0aFxuICAgICAgdGhpcy5fYnVmcy5zaGlmdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2J1ZnNbMF0gPSB0aGlzLl9idWZzWzBdLnNsaWNlKGJ5dGVzKVxuICAgICAgdGhpcy5sZW5ndGggLT0gYnl0ZXNcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuZHVwbGljYXRlID0gZnVuY3Rpb24gZHVwbGljYXRlICgpIHtcbiAgY29uc3QgY29weSA9IHRoaXMuX25ldygpXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9idWZzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29weS5hcHBlbmQodGhpcy5fYnVmc1tpXSlcbiAgfVxuXG4gIHJldHVybiBjb3B5XG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIGFwcGVuZCAoYnVmKSB7XG4gIGlmIChidWYgPT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBpZiAoYnVmLmJ1ZmZlcikge1xuICAgIC8vIGFwcGVuZCBhIHZpZXcgb2YgdGhlIHVuZGVybHlpbmcgQXJyYXlCdWZmZXJcbiAgICB0aGlzLl9hcHBlbmRCdWZmZXIoQnVmZmVyLmZyb20oYnVmLmJ1ZmZlciwgYnVmLmJ5dGVPZmZzZXQsIGJ1Zi5ieXRlTGVuZ3RoKSlcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGJ1ZikpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5hcHBlbmQoYnVmW2ldKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0aGlzLl9pc0J1ZmZlckxpc3QoYnVmKSkge1xuICAgIC8vIHVud3JhcCBhcmd1bWVudCBpbnRvIGluZGl2aWR1YWwgQnVmZmVyTGlzdHNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1Zi5fYnVmcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5hcHBlbmQoYnVmLl9idWZzW2ldKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBjb2VyY2UgbnVtYmVyIGFyZ3VtZW50cyB0byBzdHJpbmdzLCBzaW5jZSBCdWZmZXIobnVtYmVyKSBkb2VzXG4gICAgLy8gdW5pbml0aWFsaXplZCBtZW1vcnkgYWxsb2NhdGlvblxuICAgIGlmICh0eXBlb2YgYnVmID09PSAnbnVtYmVyJykge1xuICAgICAgYnVmID0gYnVmLnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICB0aGlzLl9hcHBlbmRCdWZmZXIoQnVmZmVyLmZyb20oYnVmKSlcbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLl9hcHBlbmRCdWZmZXIgPSBmdW5jdGlvbiBhcHBlbmRCdWZmZXIgKGJ1Zikge1xuICB0aGlzLl9idWZzLnB1c2goYnVmKVxuICB0aGlzLmxlbmd0aCArPSBidWYubGVuZ3RoXG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiAoc2VhcmNoLCBvZmZzZXQsIGVuY29kaW5nKSB7XG4gIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBvZmZzZXQgPSB1bmRlZmluZWRcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc2VhcmNoID09PSAnZnVuY3Rpb24nIHx8IEFycmF5LmlzQXJyYXkoc2VhcmNoKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQnVmZmVyTGlzdCwgb3IgVWludDhBcnJheS4nKVxuICB9IGVsc2UgaWYgKHR5cGVvZiBzZWFyY2ggPT09ICdudW1iZXInKSB7XG4gICAgc2VhcmNoID0gQnVmZmVyLmZyb20oW3NlYXJjaF0pXG4gIH0gZWxzZSBpZiAodHlwZW9mIHNlYXJjaCA9PT0gJ3N0cmluZycpIHtcbiAgICBzZWFyY2ggPSBCdWZmZXIuZnJvbShzZWFyY2gsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKHRoaXMuX2lzQnVmZmVyTGlzdChzZWFyY2gpKSB7XG4gICAgc2VhcmNoID0gc2VhcmNoLnNsaWNlKClcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHNlYXJjaC5idWZmZXIpKSB7XG4gICAgc2VhcmNoID0gQnVmZmVyLmZyb20oc2VhcmNoLmJ1ZmZlciwgc2VhcmNoLmJ5dGVPZmZzZXQsIHNlYXJjaC5ieXRlTGVuZ3RoKVxuICB9IGVsc2UgaWYgKCFCdWZmZXIuaXNCdWZmZXIoc2VhcmNoKSkge1xuICAgIHNlYXJjaCA9IEJ1ZmZlci5mcm9tKHNlYXJjaClcbiAgfVxuXG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQgfHwgMClcblxuICBpZiAoaXNOYU4ob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IDBcbiAgfVxuXG4gIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgb2Zmc2V0ID0gdGhpcy5sZW5ndGggKyBvZmZzZXRcbiAgfVxuXG4gIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgb2Zmc2V0ID0gMFxuICB9XG5cbiAgaWYgKHNlYXJjaC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gb2Zmc2V0ID4gdGhpcy5sZW5ndGggPyB0aGlzLmxlbmd0aCA6IG9mZnNldFxuICB9XG5cbiAgY29uc3QgYmxPZmZzZXQgPSB0aGlzLl9vZmZzZXQob2Zmc2V0KVxuICBsZXQgYmxJbmRleCA9IGJsT2Zmc2V0WzBdIC8vIGluZGV4IG9mIHdoaWNoIGludGVybmFsIGJ1ZmZlciB3ZSdyZSB3b3JraW5nIG9uXG4gIGxldCBidWZmT2Zmc2V0ID0gYmxPZmZzZXRbMV0gLy8gb2Zmc2V0IG9mIHRoZSBpbnRlcm5hbCBidWZmZXIgd2UncmUgd29ya2luZyBvblxuXG4gIC8vIHNjYW4gb3ZlciBlYWNoIGJ1ZmZlclxuICBmb3IgKDsgYmxJbmRleCA8IHRoaXMuX2J1ZnMubGVuZ3RoOyBibEluZGV4KyspIHtcbiAgICBjb25zdCBidWZmID0gdGhpcy5fYnVmc1tibEluZGV4XVxuXG4gICAgd2hpbGUgKGJ1ZmZPZmZzZXQgPCBidWZmLmxlbmd0aCkge1xuICAgICAgY29uc3QgYXZhaWxhYmxlV2luZG93ID0gYnVmZi5sZW5ndGggLSBidWZmT2Zmc2V0XG5cbiAgICAgIGlmIChhdmFpbGFibGVXaW5kb3cgPj0gc2VhcmNoLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBuYXRpdmVTZWFyY2hSZXN1bHQgPSBidWZmLmluZGV4T2Yoc2VhcmNoLCBidWZmT2Zmc2V0KVxuXG4gICAgICAgIGlmIChuYXRpdmVTZWFyY2hSZXN1bHQgIT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3JldmVyc2VPZmZzZXQoW2JsSW5kZXgsIG5hdGl2ZVNlYXJjaFJlc3VsdF0pXG4gICAgICAgIH1cblxuICAgICAgICBidWZmT2Zmc2V0ID0gYnVmZi5sZW5ndGggLSBzZWFyY2gubGVuZ3RoICsgMSAvLyBlbmQgb2YgbmF0aXZlIHNlYXJjaCB3aW5kb3dcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJldk9mZnNldCA9IHRoaXMuX3JldmVyc2VPZmZzZXQoW2JsSW5kZXgsIGJ1ZmZPZmZzZXRdKVxuXG4gICAgICAgIGlmICh0aGlzLl9tYXRjaChyZXZPZmZzZXQsIHNlYXJjaCkpIHtcbiAgICAgICAgICByZXR1cm4gcmV2T2Zmc2V0XG4gICAgICAgIH1cblxuICAgICAgICBidWZmT2Zmc2V0KytcbiAgICAgIH1cbiAgICB9XG5cbiAgICBidWZmT2Zmc2V0ID0gMFxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLl9tYXRjaCA9IGZ1bmN0aW9uIChvZmZzZXQsIHNlYXJjaCkge1xuICBpZiAodGhpcy5sZW5ndGggLSBvZmZzZXQgPCBzZWFyY2gubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmb3IgKGxldCBzZWFyY2hPZmZzZXQgPSAwOyBzZWFyY2hPZmZzZXQgPCBzZWFyY2gubGVuZ3RoOyBzZWFyY2hPZmZzZXQrKykge1xuICAgIGlmICh0aGlzLmdldChvZmZzZXQgKyBzZWFyY2hPZmZzZXQpICE9PSBzZWFyY2hbc2VhcmNoT2Zmc2V0XSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbjsoZnVuY3Rpb24gKCkge1xuICBjb25zdCBtZXRob2RzID0ge1xuICAgIHJlYWREb3VibGVCRTogOCxcbiAgICByZWFkRG91YmxlTEU6IDgsXG4gICAgcmVhZEZsb2F0QkU6IDQsXG4gICAgcmVhZEZsb2F0TEU6IDQsXG4gICAgcmVhZEludDMyQkU6IDQsXG4gICAgcmVhZEludDMyTEU6IDQsXG4gICAgcmVhZFVJbnQzMkJFOiA0LFxuICAgIHJlYWRVSW50MzJMRTogNCxcbiAgICByZWFkSW50MTZCRTogMixcbiAgICByZWFkSW50MTZMRTogMixcbiAgICByZWFkVUludDE2QkU6IDIsXG4gICAgcmVhZFVJbnQxNkxFOiAyLFxuICAgIHJlYWRJbnQ4OiAxLFxuICAgIHJlYWRVSW50ODogMSxcbiAgICByZWFkSW50QkU6IG51bGwsXG4gICAgcmVhZEludExFOiBudWxsLFxuICAgIHJlYWRVSW50QkU6IG51bGwsXG4gICAgcmVhZFVJbnRMRTogbnVsbFxuICB9XG5cbiAgZm9yIChjb25zdCBtIGluIG1ldGhvZHMpIHtcbiAgICAoZnVuY3Rpb24gKG0pIHtcbiAgICAgIGlmIChtZXRob2RzW21dID09PSBudWxsKSB7XG4gICAgICAgIEJ1ZmZlckxpc3QucHJvdG90eXBlW21dID0gZnVuY3Rpb24gKG9mZnNldCwgYnl0ZUxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgYnl0ZUxlbmd0aClbbV0oMCwgYnl0ZUxlbmd0aClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQnVmZmVyTGlzdC5wcm90b3R5cGVbbV0gPSBmdW5jdGlvbiAob2Zmc2V0ID0gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgbWV0aG9kc1ttXSlbbV0oMClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0obSkpXG4gIH1cbn0oKSlcblxuLy8gVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjbGFzcyBhbmQgYWxzbyBhcyBhbiBpbmRpY2F0b3Igb2YgdGhpcyBvYmplY3QgYmVpbmdcbi8vIGEgYEJ1ZmZlckxpc3RgLiBJdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgYGluc3RhbmNlb2YgQnVmZmVyTGlzdGAgaW4gYSBicm93c2VyXG4vLyBlbnZpcm9ubWVudCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGRpZmZlcmVudCBjb3BpZXMgb2YgdGhlXG4vLyBCdWZmZXJMaXN0IGNsYXNzIGFuZCBzb21lIGBCdWZmZXJMaXN0YHMgbWlnaHQgYmUgYEJ1ZmZlckxpc3Rgcy5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLl9pc0J1ZmZlckxpc3QgPSBmdW5jdGlvbiBfaXNCdWZmZXJMaXN0IChiKSB7XG4gIHJldHVybiBiIGluc3RhbmNlb2YgQnVmZmVyTGlzdCB8fCBCdWZmZXJMaXN0LmlzQnVmZmVyTGlzdChiKVxufVxuXG5CdWZmZXJMaXN0LmlzQnVmZmVyTGlzdCA9IGZ1bmN0aW9uIGlzQnVmZmVyTGlzdCAoYikge1xuICByZXR1cm4gYiAhPSBudWxsICYmIGJbc3ltYm9sXVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEJ1ZmZlckxpc3RcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9668\n")},22:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nconst DuplexStream = (__webpack_require__(1451).Duplex)\nconst inherits = __webpack_require__(4378)\nconst BufferList = __webpack_require__(9668)\n\nfunction BufferListStream (callback) {\n if (!(this instanceof BufferListStream)) {\n return new BufferListStream(callback)\n }\n\n if (typeof callback === 'function') {\n this._callback = callback\n\n const piper = function piper (err) {\n if (this._callback) {\n this._callback(err)\n this._callback = null\n }\n }.bind(this)\n\n this.on('pipe', function onPipe (src) {\n src.on('error', piper)\n })\n this.on('unpipe', function onUnpipe (src) {\n src.removeListener('error', piper)\n })\n\n callback = null\n }\n\n BufferList._init.call(this, callback)\n DuplexStream.call(this)\n}\n\ninherits(BufferListStream, DuplexStream)\nObject.assign(BufferListStream.prototype, BufferList.prototype)\n\nBufferListStream.prototype._new = function _new (callback) {\n return new BufferListStream(callback)\n}\n\nBufferListStream.prototype._write = function _write (buf, encoding, callback) {\n this._appendBuffer(buf)\n\n if (typeof callback === 'function') {\n callback()\n }\n}\n\nBufferListStream.prototype._read = function _read (size) {\n if (!this.length) {\n return this.push(null)\n }\n\n size = Math.min(size, this.length)\n this.push(this.slice(0, size))\n this.consume(size)\n}\n\nBufferListStream.prototype.end = function end (chunk) {\n DuplexStream.prototype.end.call(this, chunk)\n\n if (this._callback) {\n this._callback(null, this.slice())\n this._callback = null\n }\n}\n\nBufferListStream.prototype._destroy = function _destroy (err, cb) {\n this._bufs.length = 0\n this.length = 0\n cb(err)\n}\n\nBufferListStream.prototype._isBufferList = function _isBufferList (b) {\n return b instanceof BufferListStream || b instanceof BufferList || BufferListStream.isBufferList(b)\n}\n\nBufferListStream.isBufferList = BufferList.isBufferList\n\nmodule.exports = BufferListStream\nmodule.exports.BufferListStream = BufferListStream\nmodule.exports.BufferList = BufferList\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIuanMiLCJtYXBwaW5ncyI6IkFBQVk7O0FBRVoscUJBQXFCLGtDQUFpQztBQUN0RCxpQkFBaUIsbUJBQU8sQ0FBQyxJQUFVO0FBQ25DLG1CQUFtQixtQkFBTyxDQUFDLElBQWM7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLCtCQUErQjtBQUMvQix5QkFBeUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9ibC9ibC5qcz81MWU5Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBEdXBsZXhTdHJlYW0gPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0nKS5EdXBsZXhcbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxuY29uc3QgQnVmZmVyTGlzdCA9IHJlcXVpcmUoJy4vQnVmZmVyTGlzdCcpXG5cbmZ1bmN0aW9uIEJ1ZmZlckxpc3RTdHJlYW0gKGNhbGxiYWNrKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXJMaXN0U3RyZWFtKSkge1xuICAgIHJldHVybiBuZXcgQnVmZmVyTGlzdFN0cmVhbShjYWxsYmFjaylcbiAgfVxuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrXG5cbiAgICBjb25zdCBwaXBlciA9IGZ1bmN0aW9uIHBpcGVyIChlcnIpIHtcbiAgICAgIGlmICh0aGlzLl9jYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9jYWxsYmFjayhlcnIpXG4gICAgICAgIHRoaXMuX2NhbGxiYWNrID0gbnVsbFxuICAgICAgfVxuICAgIH0uYmluZCh0aGlzKVxuXG4gICAgdGhpcy5vbigncGlwZScsIGZ1bmN0aW9uIG9uUGlwZSAoc3JjKSB7XG4gICAgICBzcmMub24oJ2Vycm9yJywgcGlwZXIpXG4gICAgfSlcbiAgICB0aGlzLm9uKCd1bnBpcGUnLCBmdW5jdGlvbiBvblVucGlwZSAoc3JjKSB7XG4gICAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgcGlwZXIpXG4gICAgfSlcblxuICAgIGNhbGxiYWNrID0gbnVsbFxuICB9XG5cbiAgQnVmZmVyTGlzdC5faW5pdC5jYWxsKHRoaXMsIGNhbGxiYWNrKVxuICBEdXBsZXhTdHJlYW0uY2FsbCh0aGlzKVxufVxuXG5pbmhlcml0cyhCdWZmZXJMaXN0U3RyZWFtLCBEdXBsZXhTdHJlYW0pXG5PYmplY3QuYXNzaWduKEJ1ZmZlckxpc3RTdHJlYW0ucHJvdG90eXBlLCBCdWZmZXJMaXN0LnByb3RvdHlwZSlcblxuQnVmZmVyTGlzdFN0cmVhbS5wcm90b3R5cGUuX25ldyA9IGZ1bmN0aW9uIF9uZXcgKGNhbGxiYWNrKSB7XG4gIHJldHVybiBuZXcgQnVmZmVyTGlzdFN0cmVhbShjYWxsYmFjaylcbn1cblxuQnVmZmVyTGlzdFN0cmVhbS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gX3dyaXRlIChidWYsIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICB0aGlzLl9hcHBlbmRCdWZmZXIoYnVmKVxuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjaygpXG4gIH1cbn1cblxuQnVmZmVyTGlzdFN0cmVhbS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiBfcmVhZCAoc2l6ZSkge1xuICBpZiAoIXRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRoaXMucHVzaChudWxsKVxuICB9XG5cbiAgc2l6ZSA9IE1hdGgubWluKHNpemUsIHRoaXMubGVuZ3RoKVxuICB0aGlzLnB1c2godGhpcy5zbGljZSgwLCBzaXplKSlcbiAgdGhpcy5jb25zdW1lKHNpemUpXG59XG5cbkJ1ZmZlckxpc3RTdHJlYW0ucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIGVuZCAoY2h1bmspIHtcbiAgRHVwbGV4U3RyZWFtLnByb3RvdHlwZS5lbmQuY2FsbCh0aGlzLCBjaHVuaylcblxuICBpZiAodGhpcy5fY2FsbGJhY2spIHtcbiAgICB0aGlzLl9jYWxsYmFjayhudWxsLCB0aGlzLnNsaWNlKCkpXG4gICAgdGhpcy5fY2FsbGJhY2sgPSBudWxsXG4gIH1cbn1cblxuQnVmZmVyTGlzdFN0cmVhbS5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiBfZGVzdHJveSAoZXJyLCBjYikge1xuICB0aGlzLl9idWZzLmxlbmd0aCA9IDBcbiAgdGhpcy5sZW5ndGggPSAwXG4gIGNiKGVycilcbn1cblxuQnVmZmVyTGlzdFN0cmVhbS5wcm90b3R5cGUuX2lzQnVmZmVyTGlzdCA9IGZ1bmN0aW9uIF9pc0J1ZmZlckxpc3QgKGIpIHtcbiAgcmV0dXJuIGIgaW5zdGFuY2VvZiBCdWZmZXJMaXN0U3RyZWFtIHx8IGIgaW5zdGFuY2VvZiBCdWZmZXJMaXN0IHx8IEJ1ZmZlckxpc3RTdHJlYW0uaXNCdWZmZXJMaXN0KGIpXG59XG5cbkJ1ZmZlckxpc3RTdHJlYW0uaXNCdWZmZXJMaXN0ID0gQnVmZmVyTGlzdC5pc0J1ZmZlckxpc3RcblxubW9kdWxlLmV4cG9ydHMgPSBCdWZmZXJMaXN0U3RyZWFtXG5tb2R1bGUuZXhwb3J0cy5CdWZmZXJMaXN0U3RyZWFtID0gQnVmZmVyTGlzdFN0cmVhbVxubW9kdWxlLmV4cG9ydHMuQnVmZmVyTGlzdCA9IEJ1ZmZlckxpc3RcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///22\n")},1209:function(module){eval('/**\n * This file contains the Bottleneck library (MIT), compiled to ES2017, and without Clustering support.\n * https://github.com/SGrondin/bottleneck\n */\n(function (global, factory) {\n\t true ? module.exports = factory() :\n\t0;\n}(this, (function () { \'use strict\';\n\n\tvar commonjsGlobal = typeof globalThis !== \'undefined\' ? globalThis : typeof window !== \'undefined\' ? window : typeof global !== \'undefined\' ? global : typeof self !== \'undefined\' ? self : {};\n\n\tfunction getCjsExportFromNamespace (n) {\n\t\treturn n && n[\'default\'] || n;\n\t}\n\n\tvar load = function(received, defaults, onto = {}) {\n\t var k, ref, v;\n\t for (k in defaults) {\n\t v = defaults[k];\n\t onto[k] = (ref = received[k]) != null ? ref : v;\n\t }\n\t return onto;\n\t};\n\n\tvar overwrite = function(received, defaults, onto = {}) {\n\t var k, v;\n\t for (k in received) {\n\t v = received[k];\n\t if (defaults[k] !== void 0) {\n\t onto[k] = v;\n\t }\n\t }\n\t return onto;\n\t};\n\n\tvar parser = {\n\t\tload: load,\n\t\toverwrite: overwrite\n\t};\n\n\tvar DLList;\n\n\tDLList = class DLList {\n\t constructor(incr, decr) {\n\t this.incr = incr;\n\t this.decr = decr;\n\t this._first = null;\n\t this._last = null;\n\t this.length = 0;\n\t }\n\n\t push(value) {\n\t var node;\n\t this.length++;\n\t if (typeof this.incr === "function") {\n\t this.incr();\n\t }\n\t node = {\n\t value,\n\t prev: this._last,\n\t next: null\n\t };\n\t if (this._last != null) {\n\t this._last.next = node;\n\t this._last = node;\n\t } else {\n\t this._first = this._last = node;\n\t }\n\t return void 0;\n\t }\n\n\t shift() {\n\t var value;\n\t if (this._first == null) {\n\t return;\n\t } else {\n\t this.length--;\n\t if (typeof this.decr === "function") {\n\t this.decr();\n\t }\n\t }\n\t value = this._first.value;\n\t if ((this._first = this._first.next) != null) {\n\t this._first.prev = null;\n\t } else {\n\t this._last = null;\n\t }\n\t return value;\n\t }\n\n\t first() {\n\t if (this._first != null) {\n\t return this._first.value;\n\t }\n\t }\n\n\t getArray() {\n\t var node, ref, results;\n\t node = this._first;\n\t results = [];\n\t while (node != null) {\n\t results.push((ref = node, node = node.next, ref.value));\n\t }\n\t return results;\n\t }\n\n\t forEachShift(cb) {\n\t var node;\n\t node = this.shift();\n\t while (node != null) {\n\t (cb(node), node = this.shift());\n\t }\n\t return void 0;\n\t }\n\n\t debug() {\n\t var node, ref, ref1, ref2, results;\n\t node = this._first;\n\t results = [];\n\t while (node != null) {\n\t results.push((ref = node, node = node.next, {\n\t value: ref.value,\n\t prev: (ref1 = ref.prev) != null ? ref1.value : void 0,\n\t next: (ref2 = ref.next) != null ? ref2.value : void 0\n\t }));\n\t }\n\t return results;\n\t }\n\n\t};\n\n\tvar DLList_1 = DLList;\n\n\tvar Events;\n\n\tEvents = class Events {\n\t constructor(instance) {\n\t this.instance = instance;\n\t this._events = {};\n\t if ((this.instance.on != null) || (this.instance.once != null) || (this.instance.removeAllListeners != null)) {\n\t throw new Error("An Emitter already exists for this object");\n\t }\n\t this.instance.on = (name, cb) => {\n\t return this._addListener(name, "many", cb);\n\t };\n\t this.instance.once = (name, cb) => {\n\t return this._addListener(name, "once", cb);\n\t };\n\t this.instance.removeAllListeners = (name = null) => {\n\t if (name != null) {\n\t return delete this._events[name];\n\t } else {\n\t return this._events = {};\n\t }\n\t };\n\t }\n\n\t _addListener(name, status, cb) {\n\t var base;\n\t if ((base = this._events)[name] == null) {\n\t base[name] = [];\n\t }\n\t this._events[name].push({cb, status});\n\t return this.instance;\n\t }\n\n\t listenerCount(name) {\n\t if (this._events[name] != null) {\n\t return this._events[name].length;\n\t } else {\n\t return 0;\n\t }\n\t }\n\n\t async trigger(name, ...args) {\n\t var e, promises;\n\t try {\n\t if (name !== "debug") {\n\t this.trigger("debug", `Event triggered: ${name}`, args);\n\t }\n\t if (this._events[name] == null) {\n\t return;\n\t }\n\t this._events[name] = this._events[name].filter(function(listener) {\n\t return listener.status !== "none";\n\t });\n\t promises = this._events[name].map(async(listener) => {\n\t var e, returned;\n\t if (listener.status === "none") {\n\t return;\n\t }\n\t if (listener.status === "once") {\n\t listener.status = "none";\n\t }\n\t try {\n\t returned = typeof listener.cb === "function" ? listener.cb(...args) : void 0;\n\t if (typeof (returned != null ? returned.then : void 0) === "function") {\n\t return (await returned);\n\t } else {\n\t return returned;\n\t }\n\t } catch (error) {\n\t e = error;\n\t {\n\t this.trigger("error", e);\n\t }\n\t return null;\n\t }\n\t });\n\t return ((await Promise.all(promises))).find(function(x) {\n\t return x != null;\n\t });\n\t } catch (error) {\n\t e = error;\n\t {\n\t this.trigger("error", e);\n\t }\n\t return null;\n\t }\n\t }\n\n\t};\n\n\tvar Events_1 = Events;\n\n\tvar DLList$1, Events$1, Queues;\n\n\tDLList$1 = DLList_1;\n\n\tEvents$1 = Events_1;\n\n\tQueues = class Queues {\n\t constructor(num_priorities) {\n\t var i;\n\t this.Events = new Events$1(this);\n\t this._length = 0;\n\t this._lists = (function() {\n\t var j, ref, results;\n\t results = [];\n\t for (i = j = 1, ref = num_priorities; (1 <= ref ? j <= ref : j >= ref); i = 1 <= ref ? ++j : --j) {\n\t results.push(new DLList$1((() => {\n\t return this.incr();\n\t }), (() => {\n\t return this.decr();\n\t })));\n\t }\n\t return results;\n\t }).call(this);\n\t }\n\n\t incr() {\n\t if (this._length++ === 0) {\n\t return this.Events.trigger("leftzero");\n\t }\n\t }\n\n\t decr() {\n\t if (--this._length === 0) {\n\t return this.Events.trigger("zero");\n\t }\n\t }\n\n\t push(job) {\n\t return this._lists[job.options.priority].push(job);\n\t }\n\n\t queued(priority) {\n\t if (priority != null) {\n\t return this._lists[priority].length;\n\t } else {\n\t return this._length;\n\t }\n\t }\n\n\t shiftAll(fn) {\n\t return this._lists.forEach(function(list) {\n\t return list.forEachShift(fn);\n\t });\n\t }\n\n\t getFirst(arr = this._lists) {\n\t var j, len, list;\n\t for (j = 0, len = arr.length; j < len; j++) {\n\t list = arr[j];\n\t if (list.length > 0) {\n\t return list;\n\t }\n\t }\n\t return [];\n\t }\n\n\t shiftLastFrom(priority) {\n\t return this.getFirst(this._lists.slice(priority).reverse()).shift();\n\t }\n\n\t};\n\n\tvar Queues_1 = Queues;\n\n\tvar BottleneckError;\n\n\tBottleneckError = class BottleneckError extends Error {};\n\n\tvar BottleneckError_1 = BottleneckError;\n\n\tvar BottleneckError$1, DEFAULT_PRIORITY, Job, NUM_PRIORITIES, parser$1;\n\n\tNUM_PRIORITIES = 10;\n\n\tDEFAULT_PRIORITY = 5;\n\n\tparser$1 = parser;\n\n\tBottleneckError$1 = BottleneckError_1;\n\n\tJob = class Job {\n\t constructor(task, args, options, jobDefaults, rejectOnDrop, Events, _states, Promise) {\n\t this.task = task;\n\t this.args = args;\n\t this.rejectOnDrop = rejectOnDrop;\n\t this.Events = Events;\n\t this._states = _states;\n\t this.Promise = Promise;\n\t this.options = parser$1.load(options, jobDefaults);\n\t this.options.priority = this._sanitizePriority(this.options.priority);\n\t if (this.options.id === jobDefaults.id) {\n\t this.options.id = `${this.options.id}-${this._randomIndex()}`;\n\t }\n\t this.promise = new this.Promise((_resolve, _reject) => {\n\t this._resolve = _resolve;\n\t this._reject = _reject;\n\t });\n\t this.retryCount = 0;\n\t }\n\n\t _sanitizePriority(priority) {\n\t var sProperty;\n\t sProperty = ~~priority !== priority ? DEFAULT_PRIORITY : priority;\n\t if (sProperty < 0) {\n\t return 0;\n\t } else if (sProperty > NUM_PRIORITIES - 1) {\n\t return NUM_PRIORITIES - 1;\n\t } else {\n\t return sProperty;\n\t }\n\t }\n\n\t _randomIndex() {\n\t return Math.random().toString(36).slice(2);\n\t }\n\n\t doDrop({error, message = "This job has been dropped by Bottleneck"} = {}) {\n\t if (this._states.remove(this.options.id)) {\n\t if (this.rejectOnDrop) {\n\t this._reject(error != null ? error : new BottleneckError$1(message));\n\t }\n\t this.Events.trigger("dropped", {args: this.args, options: this.options, task: this.task, promise: this.promise});\n\t return true;\n\t } else {\n\t return false;\n\t }\n\t }\n\n\t _assertStatus(expected) {\n\t var status;\n\t status = this._states.jobStatus(this.options.id);\n\t if (!(status === expected || (expected === "DONE" && status === null))) {\n\t throw new BottleneckError$1(`Invalid job status ${status}, expected ${expected}. Please open an issue at https://github.com/SGrondin/bottleneck/issues`);\n\t }\n\t }\n\n\t doReceive() {\n\t this._states.start(this.options.id);\n\t return this.Events.trigger("received", {args: this.args, options: this.options});\n\t }\n\n\t doQueue(reachedHWM, blocked) {\n\t this._assertStatus("RECEIVED");\n\t this._states.next(this.options.id);\n\t return this.Events.trigger("queued", {args: this.args, options: this.options, reachedHWM, blocked});\n\t }\n\n\t doRun() {\n\t if (this.retryCount === 0) {\n\t this._assertStatus("QUEUED");\n\t this._states.next(this.options.id);\n\t } else {\n\t this._assertStatus("EXECUTING");\n\t }\n\t return this.Events.trigger("scheduled", {args: this.args, options: this.options});\n\t }\n\n\t async doExecute(chained, clearGlobalState, run, free) {\n\t var error, eventInfo, passed;\n\t if (this.retryCount === 0) {\n\t this._assertStatus("RUNNING");\n\t this._states.next(this.options.id);\n\t } else {\n\t this._assertStatus("EXECUTING");\n\t }\n\t eventInfo = {args: this.args, options: this.options, retryCount: this.retryCount};\n\t this.Events.trigger("executing", eventInfo);\n\t try {\n\t passed = (await (chained != null ? chained.schedule(this.options, this.task, ...this.args) : this.task(...this.args)));\n\t if (clearGlobalState()) {\n\t this.doDone(eventInfo);\n\t await free(this.options, eventInfo);\n\t this._assertStatus("DONE");\n\t return this._resolve(passed);\n\t }\n\t } catch (error1) {\n\t error = error1;\n\t return this._onFailure(error, eventInfo, clearGlobalState, run, free);\n\t }\n\t }\n\n\t doExpire(clearGlobalState, run, free) {\n\t var error, eventInfo;\n\t if (this._states.jobStatus(this.options.id === "RUNNING")) {\n\t this._states.next(this.options.id);\n\t }\n\t this._assertStatus("EXECUTING");\n\t eventInfo = {args: this.args, options: this.options, retryCount: this.retryCount};\n\t error = new BottleneckError$1(`This job timed out after ${this.options.expiration} ms.`);\n\t return this._onFailure(error, eventInfo, clearGlobalState, run, free);\n\t }\n\n\t async _onFailure(error, eventInfo, clearGlobalState, run, free) {\n\t var retry, retryAfter;\n\t if (clearGlobalState()) {\n\t retry = (await this.Events.trigger("failed", error, eventInfo));\n\t if (retry != null) {\n\t retryAfter = ~~retry;\n\t this.Events.trigger("retry", `Retrying ${this.options.id} after ${retryAfter} ms`, eventInfo);\n\t this.retryCount++;\n\t return run(retryAfter);\n\t } else {\n\t this.doDone(eventInfo);\n\t await free(this.options, eventInfo);\n\t this._assertStatus("DONE");\n\t return this._reject(error);\n\t }\n\t }\n\t }\n\n\t doDone(eventInfo) {\n\t this._assertStatus("EXECUTING");\n\t this._states.next(this.options.id);\n\t return this.Events.trigger("done", eventInfo);\n\t }\n\n\t};\n\n\tvar Job_1 = Job;\n\n\tvar BottleneckError$2, LocalDatastore, parser$2;\n\n\tparser$2 = parser;\n\n\tBottleneckError$2 = BottleneckError_1;\n\n\tLocalDatastore = class LocalDatastore {\n\t constructor(instance, storeOptions, storeInstanceOptions) {\n\t this.instance = instance;\n\t this.storeOptions = storeOptions;\n\t this.clientId = this.instance._randomIndex();\n\t parser$2.load(storeInstanceOptions, storeInstanceOptions, this);\n\t this._nextRequest = this._lastReservoirRefresh = this._lastReservoirIncrease = Date.now();\n\t this._running = 0;\n\t this._done = 0;\n\t this._unblockTime = 0;\n\t this.ready = this.Promise.resolve();\n\t this.clients = {};\n\t this._startHeartbeat();\n\t }\n\n\t _startHeartbeat() {\n\t var base;\n\t if ((this.heartbeat == null) && (((this.storeOptions.reservoirRefreshInterval != null) && (this.storeOptions.reservoirRefreshAmount != null)) || ((this.storeOptions.reservoirIncreaseInterval != null) && (this.storeOptions.reservoirIncreaseAmount != null)))) {\n\t return typeof (base = (this.heartbeat = setInterval(() => {\n\t var amount, incr, maximum, now, reservoir;\n\t now = Date.now();\n\t if ((this.storeOptions.reservoirRefreshInterval != null) && now >= this._lastReservoirRefresh + this.storeOptions.reservoirRefreshInterval) {\n\t this._lastReservoirRefresh = now;\n\t this.storeOptions.reservoir = this.storeOptions.reservoirRefreshAmount;\n\t this.instance._drainAll(this.computeCapacity());\n\t }\n\t if ((this.storeOptions.reservoirIncreaseInterval != null) && now >= this._lastReservoirIncrease + this.storeOptions.reservoirIncreaseInterval) {\n\t ({\n\t reservoirIncreaseAmount: amount,\n\t reservoirIncreaseMaximum: maximum,\n\t reservoir\n\t } = this.storeOptions);\n\t this._lastReservoirIncrease = now;\n\t incr = maximum != null ? Math.min(amount, maximum - reservoir) : amount;\n\t if (incr > 0) {\n\t this.storeOptions.reservoir += incr;\n\t return this.instance._drainAll(this.computeCapacity());\n\t }\n\t }\n\t }, this.heartbeatInterval))).unref === "function" ? base.unref() : void 0;\n\t } else {\n\t return clearInterval(this.heartbeat);\n\t }\n\t }\n\n\t async __publish__(message) {\n\t await this.yieldLoop();\n\t return this.instance.Events.trigger("message", message.toString());\n\t }\n\n\t async __disconnect__(flush) {\n\t await this.yieldLoop();\n\t clearInterval(this.heartbeat);\n\t return this.Promise.resolve();\n\t }\n\n\t yieldLoop(t = 0) {\n\t return new this.Promise(function(resolve, reject) {\n\t return setTimeout(resolve, t);\n\t });\n\t }\n\n\t computePenalty() {\n\t var ref;\n\t return (ref = this.storeOptions.penalty) != null ? ref : (15 * this.storeOptions.minTime) || 5000;\n\t }\n\n\t async __updateSettings__(options) {\n\t await this.yieldLoop();\n\t parser$2.overwrite(options, options, this.storeOptions);\n\t this._startHeartbeat();\n\t this.instance._drainAll(this.computeCapacity());\n\t return true;\n\t }\n\n\t async __running__() {\n\t await this.yieldLoop();\n\t return this._running;\n\t }\n\n\t async __queued__() {\n\t await this.yieldLoop();\n\t return this.instance.queued();\n\t }\n\n\t async __done__() {\n\t await this.yieldLoop();\n\t return this._done;\n\t }\n\n\t async __groupCheck__(time) {\n\t await this.yieldLoop();\n\t return (this._nextRequest + this.timeout) < time;\n\t }\n\n\t computeCapacity() {\n\t var maxConcurrent, reservoir;\n\t ({maxConcurrent, reservoir} = this.storeOptions);\n\t if ((maxConcurrent != null) && (reservoir != null)) {\n\t return Math.min(maxConcurrent - this._running, reservoir);\n\t } else if (maxConcurrent != null) {\n\t return maxConcurrent - this._running;\n\t } else if (reservoir != null) {\n\t return reservoir;\n\t } else {\n\t return null;\n\t }\n\t }\n\n\t conditionsCheck(weight) {\n\t var capacity;\n\t capacity = this.computeCapacity();\n\t return (capacity == null) || weight <= capacity;\n\t }\n\n\t async __incrementReservoir__(incr) {\n\t var reservoir;\n\t await this.yieldLoop();\n\t reservoir = this.storeOptions.reservoir += incr;\n\t this.instance._drainAll(this.computeCapacity());\n\t return reservoir;\n\t }\n\n\t async __currentReservoir__() {\n\t await this.yieldLoop();\n\t return this.storeOptions.reservoir;\n\t }\n\n\t isBlocked(now) {\n\t return this._unblockTime >= now;\n\t }\n\n\t check(weight, now) {\n\t return this.conditionsCheck(weight) && (this._nextRequest - now) <= 0;\n\t }\n\n\t async __check__(weight) {\n\t var now;\n\t await this.yieldLoop();\n\t now = Date.now();\n\t return this.check(weight, now);\n\t }\n\n\t async __register__(index, weight, expiration) {\n\t var now, wait;\n\t await this.yieldLoop();\n\t now = Date.now();\n\t if (this.conditionsCheck(weight)) {\n\t this._running += weight;\n\t if (this.storeOptions.reservoir != null) {\n\t this.storeOptions.reservoir -= weight;\n\t }\n\t wait = Math.max(this._nextRequest - now, 0);\n\t this._nextRequest = now + wait + this.storeOptions.minTime;\n\t return {\n\t success: true,\n\t wait,\n\t reservoir: this.storeOptions.reservoir\n\t };\n\t } else {\n\t return {\n\t success: false\n\t };\n\t }\n\t }\n\n\t strategyIsBlock() {\n\t return this.storeOptions.strategy === 3;\n\t }\n\n\t async __submit__(queueLength, weight) {\n\t var blocked, now, reachedHWM;\n\t await this.yieldLoop();\n\t if ((this.storeOptions.maxConcurrent != null) && weight > this.storeOptions.maxConcurrent) {\n\t throw new BottleneckError$2(`Impossible to add a job having a weight of ${weight} to a limiter having a maxConcurrent setting of ${this.storeOptions.maxConcurrent}`);\n\t }\n\t now = Date.now();\n\t reachedHWM = (this.storeOptions.highWater != null) && queueLength === this.storeOptions.highWater && !this.check(weight, now);\n\t blocked = this.strategyIsBlock() && (reachedHWM || this.isBlocked(now));\n\t if (blocked) {\n\t this._unblockTime = now + this.computePenalty();\n\t this._nextRequest = this._unblockTime + this.storeOptions.minTime;\n\t this.instance._dropAllQueued();\n\t }\n\t return {\n\t reachedHWM,\n\t blocked,\n\t strategy: this.storeOptions.strategy\n\t };\n\t }\n\n\t async __free__(index, weight) {\n\t await this.yieldLoop();\n\t this._running -= weight;\n\t this._done += weight;\n\t this.instance._drainAll(this.computeCapacity());\n\t return {\n\t running: this._running\n\t };\n\t }\n\n\t};\n\n\tvar LocalDatastore_1 = LocalDatastore;\n\n\tvar BottleneckError$3, States;\n\n\tBottleneckError$3 = BottleneckError_1;\n\n\tStates = class States {\n\t constructor(status1) {\n\t this.status = status1;\n\t this._jobs = {};\n\t this.counts = this.status.map(function() {\n\t return 0;\n\t });\n\t }\n\n\t next(id) {\n\t var current, next;\n\t current = this._jobs[id];\n\t next = current + 1;\n\t if ((current != null) && next < this.status.length) {\n\t this.counts[current]--;\n\t this.counts[next]++;\n\t return this._jobs[id]++;\n\t } else if (current != null) {\n\t this.counts[current]--;\n\t return delete this._jobs[id];\n\t }\n\t }\n\n\t start(id) {\n\t var initial;\n\t initial = 0;\n\t this._jobs[id] = initial;\n\t return this.counts[initial]++;\n\t }\n\n\t remove(id) {\n\t var current;\n\t current = this._jobs[id];\n\t if (current != null) {\n\t this.counts[current]--;\n\t delete this._jobs[id];\n\t }\n\t return current != null;\n\t }\n\n\t jobStatus(id) {\n\t var ref;\n\t return (ref = this.status[this._jobs[id]]) != null ? ref : null;\n\t }\n\n\t statusJobs(status) {\n\t var k, pos, ref, results, v;\n\t if (status != null) {\n\t pos = this.status.indexOf(status);\n\t if (pos < 0) {\n\t throw new BottleneckError$3(`status must be one of ${this.status.join(\', \')}`);\n\t }\n\t ref = this._jobs;\n\t results = [];\n\t for (k in ref) {\n\t v = ref[k];\n\t if (v === pos) {\n\t results.push(k);\n\t }\n\t }\n\t return results;\n\t } else {\n\t return Object.keys(this._jobs);\n\t }\n\t }\n\n\t statusCounts() {\n\t return this.counts.reduce(((acc, v, i) => {\n\t acc[this.status[i]] = v;\n\t return acc;\n\t }), {});\n\t }\n\n\t};\n\n\tvar States_1 = States;\n\n\tvar DLList$2, Sync;\n\n\tDLList$2 = DLList_1;\n\n\tSync = class Sync {\n\t constructor(name, Promise) {\n\t this.schedule = this.schedule.bind(this);\n\t this.name = name;\n\t this.Promise = Promise;\n\t this._running = 0;\n\t this._queue = new DLList$2();\n\t }\n\n\t isEmpty() {\n\t return this._queue.length === 0;\n\t }\n\n\t async _tryToRun() {\n\t var args, cb, error, reject, resolve, returned, task;\n\t if ((this._running < 1) && this._queue.length > 0) {\n\t this._running++;\n\t ({task, args, resolve, reject} = this._queue.shift());\n\t cb = (await (async function() {\n\t try {\n\t returned = (await task(...args));\n\t return function() {\n\t return resolve(returned);\n\t };\n\t } catch (error1) {\n\t error = error1;\n\t return function() {\n\t return reject(error);\n\t };\n\t }\n\t })());\n\t this._running--;\n\t this._tryToRun();\n\t return cb();\n\t }\n\t }\n\n\t schedule(task, ...args) {\n\t var promise, reject, resolve;\n\t resolve = reject = null;\n\t promise = new this.Promise(function(_resolve, _reject) {\n\t resolve = _resolve;\n\t return reject = _reject;\n\t });\n\t this._queue.push({task, args, resolve, reject});\n\t this._tryToRun();\n\t return promise;\n\t }\n\n\t};\n\n\tvar Sync_1 = Sync;\n\n\tvar version = "2.19.5";\n\tvar version$1 = {\n\t\tversion: version\n\t};\n\n\tvar version$2 = /*#__PURE__*/Object.freeze({\n\t\tversion: version,\n\t\tdefault: version$1\n\t});\n\n\tvar require$$2 = () => console.log(\'You must import the full version of Bottleneck in order to use this feature.\');\n\n\tvar require$$3 = () => console.log(\'You must import the full version of Bottleneck in order to use this feature.\');\n\n\tvar require$$4 = () => console.log(\'You must import the full version of Bottleneck in order to use this feature.\');\n\n\tvar Events$2, Group, IORedisConnection$1, RedisConnection$1, Scripts$1, parser$3;\n\n\tparser$3 = parser;\n\n\tEvents$2 = Events_1;\n\n\tRedisConnection$1 = require$$2;\n\n\tIORedisConnection$1 = require$$3;\n\n\tScripts$1 = require$$4;\n\n\tGroup = (function() {\n\t class Group {\n\t constructor(limiterOptions = {}) {\n\t this.deleteKey = this.deleteKey.bind(this);\n\t this.limiterOptions = limiterOptions;\n\t parser$3.load(this.limiterOptions, this.defaults, this);\n\t this.Events = new Events$2(this);\n\t this.instances = {};\n\t this.Bottleneck = Bottleneck_1;\n\t this._startAutoCleanup();\n\t this.sharedConnection = this.connection != null;\n\t if (this.connection == null) {\n\t if (this.limiterOptions.datastore === "redis") {\n\t this.connection = new RedisConnection$1(Object.assign({}, this.limiterOptions, {Events: this.Events}));\n\t } else if (this.limiterOptions.datastore === "ioredis") {\n\t this.connection = new IORedisConnection$1(Object.assign({}, this.limiterOptions, {Events: this.Events}));\n\t }\n\t }\n\t }\n\n\t key(key = "") {\n\t var ref;\n\t return (ref = this.instances[key]) != null ? ref : (() => {\n\t var limiter;\n\t limiter = this.instances[key] = new this.Bottleneck(Object.assign(this.limiterOptions, {\n\t id: `${this.id}-${key}`,\n\t timeout: this.timeout,\n\t connection: this.connection\n\t }));\n\t this.Events.trigger("created", limiter, key);\n\t return limiter;\n\t })();\n\t }\n\n\t async deleteKey(key = "") {\n\t var deleted, instance;\n\t instance = this.instances[key];\n\t if (this.connection) {\n\t deleted = (await this.connection.__runCommand__([\'del\', ...Scripts$1.allKeys(`${this.id}-${key}`)]));\n\t }\n\t if (instance != null) {\n\t delete this.instances[key];\n\t await instance.disconnect();\n\t }\n\t return (instance != null) || deleted > 0;\n\t }\n\n\t limiters() {\n\t var k, ref, results, v;\n\t ref = this.instances;\n\t results = [];\n\t for (k in ref) {\n\t v = ref[k];\n\t results.push({\n\t key: k,\n\t limiter: v\n\t });\n\t }\n\t return results;\n\t }\n\n\t keys() {\n\t return Object.keys(this.instances);\n\t }\n\n\t async clusterKeys() {\n\t var cursor, end, found, i, k, keys, len, next, start;\n\t if (this.connection == null) {\n\t return this.Promise.resolve(this.keys());\n\t }\n\t keys = [];\n\t cursor = null;\n\t start = `b_${this.id}-`.length;\n\t end = "_settings".length;\n\t while (cursor !== 0) {\n\t [next, found] = (await this.connection.__runCommand__(["scan", cursor != null ? cursor : 0, "match", `b_${this.id}-*_settings`, "count", 10000]));\n\t cursor = ~~next;\n\t for (i = 0, len = found.length; i < len; i++) {\n\t k = found[i];\n\t keys.push(k.slice(start, -end));\n\t }\n\t }\n\t return keys;\n\t }\n\n\t _startAutoCleanup() {\n\t var base;\n\t clearInterval(this.interval);\n\t return typeof (base = (this.interval = setInterval(async() => {\n\t var e, k, ref, results, time, v;\n\t time = Date.now();\n\t ref = this.instances;\n\t results = [];\n\t for (k in ref) {\n\t v = ref[k];\n\t try {\n\t if ((await v._store.__groupCheck__(time))) {\n\t results.push(this.deleteKey(k));\n\t } else {\n\t results.push(void 0);\n\t }\n\t } catch (error) {\n\t e = error;\n\t results.push(v.Events.trigger("error", e));\n\t }\n\t }\n\t return results;\n\t }, this.timeout / 2))).unref === "function" ? base.unref() : void 0;\n\t }\n\n\t updateSettings(options = {}) {\n\t parser$3.overwrite(options, this.defaults, this);\n\t parser$3.overwrite(options, options, this.limiterOptions);\n\t if (options.timeout != null) {\n\t return this._startAutoCleanup();\n\t }\n\t }\n\n\t disconnect(flush = true) {\n\t var ref;\n\t if (!this.sharedConnection) {\n\t return (ref = this.connection) != null ? ref.disconnect(flush) : void 0;\n\t }\n\t }\n\n\t }\n\t Group.prototype.defaults = {\n\t timeout: 1000 * 60 * 5,\n\t connection: null,\n\t Promise: Promise,\n\t id: "group-key"\n\t };\n\n\t return Group;\n\n\t}).call(commonjsGlobal);\n\n\tvar Group_1 = Group;\n\n\tvar Batcher, Events$3, parser$4;\n\n\tparser$4 = parser;\n\n\tEvents$3 = Events_1;\n\n\tBatcher = (function() {\n\t class Batcher {\n\t constructor(options = {}) {\n\t this.options = options;\n\t parser$4.load(this.options, this.defaults, this);\n\t this.Events = new Events$3(this);\n\t this._arr = [];\n\t this._resetPromise();\n\t this._lastFlush = Date.now();\n\t }\n\n\t _resetPromise() {\n\t return this._promise = new this.Promise((res, rej) => {\n\t return this._resolve = res;\n\t });\n\t }\n\n\t _flush() {\n\t clearTimeout(this._timeout);\n\t this._lastFlush = Date.now();\n\t this._resolve();\n\t this.Events.trigger("batch", this._arr);\n\t this._arr = [];\n\t return this._resetPromise();\n\t }\n\n\t add(data) {\n\t var ret;\n\t this._arr.push(data);\n\t ret = this._promise;\n\t if (this._arr.length === this.maxSize) {\n\t this._flush();\n\t } else if ((this.maxTime != null) && this._arr.length === 1) {\n\t this._timeout = setTimeout(() => {\n\t return this._flush();\n\t }, this.maxTime);\n\t }\n\t return ret;\n\t }\n\n\t }\n\t Batcher.prototype.defaults = {\n\t maxTime: null,\n\t maxSize: null,\n\t Promise: Promise\n\t };\n\n\t return Batcher;\n\n\t}).call(commonjsGlobal);\n\n\tvar Batcher_1 = Batcher;\n\n\tvar require$$4$1 = () => console.log(\'You must import the full version of Bottleneck in order to use this feature.\');\n\n\tvar require$$8 = getCjsExportFromNamespace(version$2);\n\n\tvar Bottleneck, DEFAULT_PRIORITY$1, Events$4, Job$1, LocalDatastore$1, NUM_PRIORITIES$1, Queues$1, RedisDatastore$1, States$1, Sync$1, parser$5,\n\t splice = [].splice;\n\n\tNUM_PRIORITIES$1 = 10;\n\n\tDEFAULT_PRIORITY$1 = 5;\n\n\tparser$5 = parser;\n\n\tQueues$1 = Queues_1;\n\n\tJob$1 = Job_1;\n\n\tLocalDatastore$1 = LocalDatastore_1;\n\n\tRedisDatastore$1 = require$$4$1;\n\n\tEvents$4 = Events_1;\n\n\tStates$1 = States_1;\n\n\tSync$1 = Sync_1;\n\n\tBottleneck = (function() {\n\t class Bottleneck {\n\t constructor(options = {}, ...invalid) {\n\t var storeInstanceOptions, storeOptions;\n\t this._addToQueue = this._addToQueue.bind(this);\n\t this._validateOptions(options, invalid);\n\t parser$5.load(options, this.instanceDefaults, this);\n\t this._queues = new Queues$1(NUM_PRIORITIES$1);\n\t this._scheduled = {};\n\t this._states = new States$1(["RECEIVED", "QUEUED", "RUNNING", "EXECUTING"].concat(this.trackDoneStatus ? ["DONE"] : []));\n\t this._limiter = null;\n\t this.Events = new Events$4(this);\n\t this._submitLock = new Sync$1("submit", this.Promise);\n\t this._registerLock = new Sync$1("register", this.Promise);\n\t storeOptions = parser$5.load(options, this.storeDefaults, {});\n\t this._store = (function() {\n\t if (this.datastore === "redis" || this.datastore === "ioredis" || (this.connection != null)) {\n\t storeInstanceOptions = parser$5.load(options, this.redisStoreDefaults, {});\n\t return new RedisDatastore$1(this, storeOptions, storeInstanceOptions);\n\t } else if (this.datastore === "local") {\n\t storeInstanceOptions = parser$5.load(options, this.localStoreDefaults, {});\n\t return new LocalDatastore$1(this, storeOptions, storeInstanceOptions);\n\t } else {\n\t throw new Bottleneck.prototype.BottleneckError(`Invalid datastore type: ${this.datastore}`);\n\t }\n\t }).call(this);\n\t this._queues.on("leftzero", () => {\n\t var ref;\n\t return (ref = this._store.heartbeat) != null ? typeof ref.ref === "function" ? ref.ref() : void 0 : void 0;\n\t });\n\t this._queues.on("zero", () => {\n\t var ref;\n\t return (ref = this._store.heartbeat) != null ? typeof ref.unref === "function" ? ref.unref() : void 0 : void 0;\n\t });\n\t }\n\n\t _validateOptions(options, invalid) {\n\t if (!((options != null) && typeof options === "object" && invalid.length === 0)) {\n\t throw new Bottleneck.prototype.BottleneckError("Bottleneck v2 takes a single object argument. Refer to https://github.com/SGrondin/bottleneck#upgrading-to-v2 if you\'re upgrading from Bottleneck v1.");\n\t }\n\t }\n\n\t ready() {\n\t return this._store.ready;\n\t }\n\n\t clients() {\n\t return this._store.clients;\n\t }\n\n\t channel() {\n\t return `b_${this.id}`;\n\t }\n\n\t channel_client() {\n\t return `b_${this.id}_${this._store.clientId}`;\n\t }\n\n\t publish(message) {\n\t return this._store.__publish__(message);\n\t }\n\n\t disconnect(flush = true) {\n\t return this._store.__disconnect__(flush);\n\t }\n\n\t chain(_limiter) {\n\t this._limiter = _limiter;\n\t return this;\n\t }\n\n\t queued(priority) {\n\t return this._queues.queued(priority);\n\t }\n\n\t clusterQueued() {\n\t return this._store.__queued__();\n\t }\n\n\t empty() {\n\t return this.queued() === 0 && this._submitLock.isEmpty();\n\t }\n\n\t running() {\n\t return this._store.__running__();\n\t }\n\n\t done() {\n\t return this._store.__done__();\n\t }\n\n\t jobStatus(id) {\n\t return this._states.jobStatus(id);\n\t }\n\n\t jobs(status) {\n\t return this._states.statusJobs(status);\n\t }\n\n\t counts() {\n\t return this._states.statusCounts();\n\t }\n\n\t _randomIndex() {\n\t return Math.random().toString(36).slice(2);\n\t }\n\n\t check(weight = 1) {\n\t return this._store.__check__(weight);\n\t }\n\n\t _clearGlobalState(index) {\n\t if (this._scheduled[index] != null) {\n\t clearTimeout(this._scheduled[index].expiration);\n\t delete this._scheduled[index];\n\t return true;\n\t } else {\n\t return false;\n\t }\n\t }\n\n\t async _free(index, job, options, eventInfo) {\n\t var e, running;\n\t try {\n\t ({running} = (await this._store.__free__(index, options.weight)));\n\t this.Events.trigger("debug", `Freed ${options.id}`, eventInfo);\n\t if (running === 0 && this.empty()) {\n\t return this.Events.trigger("idle");\n\t }\n\t } catch (error1) {\n\t e = error1;\n\t return this.Events.trigger("error", e);\n\t }\n\t }\n\n\t _run(index, job, wait) {\n\t var clearGlobalState, free, run;\n\t job.doRun();\n\t clearGlobalState = this._clearGlobalState.bind(this, index);\n\t run = this._run.bind(this, index, job);\n\t free = this._free.bind(this, index, job);\n\t return this._scheduled[index] = {\n\t timeout: setTimeout(() => {\n\t return job.doExecute(this._limiter, clearGlobalState, run, free);\n\t }, wait),\n\t expiration: job.options.expiration != null ? setTimeout(function() {\n\t return job.doExpire(clearGlobalState, run, free);\n\t }, wait + job.options.expiration) : void 0,\n\t job: job\n\t };\n\t }\n\n\t _drainOne(capacity) {\n\t return this._registerLock.schedule(() => {\n\t var args, index, next, options, queue;\n\t if (this.queued() === 0) {\n\t return this.Promise.resolve(null);\n\t }\n\t queue = this._queues.getFirst();\n\t ({options, args} = next = queue.first());\n\t if ((capacity != null) && options.weight > capacity) {\n\t return this.Promise.resolve(null);\n\t }\n\t this.Events.trigger("debug", `Draining ${options.id}`, {args, options});\n\t index = this._randomIndex();\n\t return this._store.__register__(index, options.weight, options.expiration).then(({success, wait, reservoir}) => {\n\t var empty;\n\t this.Events.trigger("debug", `Drained ${options.id}`, {success, args, options});\n\t if (success) {\n\t queue.shift();\n\t empty = this.empty();\n\t if (empty) {\n\t this.Events.trigger("empty");\n\t }\n\t if (reservoir === 0) {\n\t this.Events.trigger("depleted", empty);\n\t }\n\t this._run(index, next, wait);\n\t return this.Promise.resolve(options.weight);\n\t } else {\n\t return this.Promise.resolve(null);\n\t }\n\t });\n\t });\n\t }\n\n\t _drainAll(capacity, total = 0) {\n\t return this._drainOne(capacity).then((drained) => {\n\t var newCapacity;\n\t if (drained != null) {\n\t newCapacity = capacity != null ? capacity - drained : capacity;\n\t return this._drainAll(newCapacity, total + drained);\n\t } else {\n\t return this.Promise.resolve(total);\n\t }\n\t }).catch((e) => {\n\t return this.Events.trigger("error", e);\n\t });\n\t }\n\n\t _dropAllQueued(message) {\n\t return this._queues.shiftAll(function(job) {\n\t return job.doDrop({message});\n\t });\n\t }\n\n\t stop(options = {}) {\n\t var done, waitForExecuting;\n\t options = parser$5.load(options, this.stopDefaults);\n\t waitForExecuting = (at) => {\n\t var finished;\n\t finished = () => {\n\t var counts;\n\t counts = this._states.counts;\n\t return (counts[0] + counts[1] + counts[2] + counts[3]) === at;\n\t };\n\t return new this.Promise((resolve, reject) => {\n\t if (finished()) {\n\t return resolve();\n\t } else {\n\t return this.on("done", () => {\n\t if (finished()) {\n\t this.removeAllListeners("done");\n\t return resolve();\n\t }\n\t });\n\t }\n\t });\n\t };\n\t done = options.dropWaitingJobs ? (this._run = function(index, next) {\n\t return next.doDrop({\n\t message: options.dropErrorMessage\n\t });\n\t }, this._drainOne = () => {\n\t return this.Promise.resolve(null);\n\t }, this._registerLock.schedule(() => {\n\t return this._submitLock.schedule(() => {\n\t var k, ref, v;\n\t ref = this._scheduled;\n\t for (k in ref) {\n\t v = ref[k];\n\t if (this.jobStatus(v.job.options.id) === "RUNNING") {\n\t clearTimeout(v.timeout);\n\t clearTimeout(v.expiration);\n\t v.job.doDrop({\n\t message: options.dropErrorMessage\n\t });\n\t }\n\t }\n\t this._dropAllQueued(options.dropErrorMessage);\n\t return waitForExecuting(0);\n\t });\n\t })) : this.schedule({\n\t priority: NUM_PRIORITIES$1 - 1,\n\t weight: 0\n\t }, () => {\n\t return waitForExecuting(1);\n\t });\n\t this._receive = function(job) {\n\t return job._reject(new Bottleneck.prototype.BottleneckError(options.enqueueErrorMessage));\n\t };\n\t this.stop = () => {\n\t return this.Promise.reject(new Bottleneck.prototype.BottleneckError("stop() has already been called"));\n\t };\n\t return done;\n\t }\n\n\t async _addToQueue(job) {\n\t var args, blocked, error, options, reachedHWM, shifted, strategy;\n\t ({args, options} = job);\n\t try {\n\t ({reachedHWM, blocked, strategy} = (await this._store.__submit__(this.queued(), options.weight)));\n\t } catch (error1) {\n\t error = error1;\n\t this.Events.trigger("debug", `Could not queue ${options.id}`, {args, options, error});\n\t job.doDrop({error});\n\t return false;\n\t }\n\t if (blocked) {\n\t job.doDrop();\n\t return true;\n\t } else if (reachedHWM) {\n\t shifted = strategy === Bottleneck.prototype.strategy.LEAK ? this._queues.shiftLastFrom(options.priority) : strategy === Bottleneck.prototype.strategy.OVERFLOW_PRIORITY ? this._queues.shiftLastFrom(options.priority + 1) : strategy === Bottleneck.prototype.strategy.OVERFLOW ? job : void 0;\n\t if (shifted != null) {\n\t shifted.doDrop();\n\t }\n\t if ((shifted == null) || strategy === Bottleneck.prototype.strategy.OVERFLOW) {\n\t if (shifted == null) {\n\t job.doDrop();\n\t }\n\t return reachedHWM;\n\t }\n\t }\n\t job.doQueue(reachedHWM, blocked);\n\t this._queues.push(job);\n\t await this._drainAll();\n\t return reachedHWM;\n\t }\n\n\t _receive(job) {\n\t if (this._states.jobStatus(job.options.id) != null) {\n\t job._reject(new Bottleneck.prototype.BottleneckError(`A job with the same id already exists (id=${job.options.id})`));\n\t return false;\n\t } else {\n\t job.doReceive();\n\t return this._submitLock.schedule(this._addToQueue, job);\n\t }\n\t }\n\n\t submit(...args) {\n\t var cb, fn, job, options, ref, ref1, task;\n\t if (typeof args[0] === "function") {\n\t ref = args, [fn, ...args] = ref, [cb] = splice.call(args, -1);\n\t options = parser$5.load({}, this.jobDefaults);\n\t } else {\n\t ref1 = args, [options, fn, ...args] = ref1, [cb] = splice.call(args, -1);\n\t options = parser$5.load(options, this.jobDefaults);\n\t }\n\t task = (...args) => {\n\t return new this.Promise(function(resolve, reject) {\n\t return fn(...args, function(...args) {\n\t return (args[0] != null ? reject : resolve)(args);\n\t });\n\t });\n\t };\n\t job = new Job$1(task, args, options, this.jobDefaults, this.rejectOnDrop, this.Events, this._states, this.Promise);\n\t job.promise.then(function(args) {\n\t return typeof cb === "function" ? cb(...args) : void 0;\n\t }).catch(function(args) {\n\t if (Array.isArray(args)) {\n\t return typeof cb === "function" ? cb(...args) : void 0;\n\t } else {\n\t return typeof cb === "function" ? cb(args) : void 0;\n\t }\n\t });\n\t return this._receive(job);\n\t }\n\n\t schedule(...args) {\n\t var job, options, task;\n\t if (typeof args[0] === "function") {\n\t [task, ...args] = args;\n\t options = {};\n\t } else {\n\t [options, task, ...args] = args;\n\t }\n\t job = new Job$1(task, args, options, this.jobDefaults, this.rejectOnDrop, this.Events, this._states, this.Promise);\n\t this._receive(job);\n\t return job.promise;\n\t }\n\n\t wrap(fn) {\n\t var schedule, wrapped;\n\t schedule = this.schedule.bind(this);\n\t wrapped = function(...args) {\n\t return schedule(fn.bind(this), ...args);\n\t };\n\t wrapped.withOptions = function(options, ...args) {\n\t return schedule(options, fn, ...args);\n\t };\n\t return wrapped;\n\t }\n\n\t async updateSettings(options = {}) {\n\t await this._store.__updateSettings__(parser$5.overwrite(options, this.storeDefaults));\n\t parser$5.overwrite(options, this.instanceDefaults, this);\n\t return this;\n\t }\n\n\t currentReservoir() {\n\t return this._store.__currentReservoir__();\n\t }\n\n\t incrementReservoir(incr = 0) {\n\t return this._store.__incrementReservoir__(incr);\n\t }\n\n\t }\n\t Bottleneck.default = Bottleneck;\n\n\t Bottleneck.Events = Events$4;\n\n\t Bottleneck.version = Bottleneck.prototype.version = require$$8.version;\n\n\t Bottleneck.strategy = Bottleneck.prototype.strategy = {\n\t LEAK: 1,\n\t OVERFLOW: 2,\n\t OVERFLOW_PRIORITY: 4,\n\t BLOCK: 3\n\t };\n\n\t Bottleneck.BottleneckError = Bottleneck.prototype.BottleneckError = BottleneckError_1;\n\n\t Bottleneck.Group = Bottleneck.prototype.Group = Group_1;\n\n\t Bottleneck.RedisConnection = Bottleneck.prototype.RedisConnection = require$$2;\n\n\t Bottleneck.IORedisConnection = Bottleneck.prototype.IORedisConnection = require$$3;\n\n\t Bottleneck.Batcher = Bottleneck.prototype.Batcher = Batcher_1;\n\n\t Bottleneck.prototype.jobDefaults = {\n\t priority: DEFAULT_PRIORITY$1,\n\t weight: 1,\n\t expiration: null,\n\t id: ""\n\t };\n\n\t Bottleneck.prototype.storeDefaults = {\n\t maxConcurrent: null,\n\t minTime: 0,\n\t highWater: null,\n\t strategy: Bottleneck.prototype.strategy.LEAK,\n\t penalty: null,\n\t reservoir: null,\n\t reservoirRefreshInterval: null,\n\t reservoirRefreshAmount: null,\n\t reservoirIncreaseInterval: null,\n\t reservoirIncreaseAmount: null,\n\t reservoirIncreaseMaximum: null\n\t };\n\n\t Bottleneck.prototype.localStoreDefaults = {\n\t Promise: Promise,\n\t timeout: null,\n\t heartbeatInterval: 250\n\t };\n\n\t Bottleneck.prototype.redisStoreDefaults = {\n\t Promise: Promise,\n\t timeout: null,\n\t heartbeatInterval: 5000,\n\t clientTimeout: 10000,\n\t Redis: null,\n\t clientOptions: {},\n\t clusterNodes: null,\n\t clearDatastore: false,\n\t connection: null\n\t };\n\n\t Bottleneck.prototype.instanceDefaults = {\n\t datastore: "local",\n\t connection: null,\n\t id: "",\n\t rejectOnDrop: true,\n\t trackDoneStatus: false,\n\t Promise: Promise\n\t };\n\n\t Bottleneck.prototype.stopDefaults = {\n\t enqueueErrorMessage: "This limiter has been stopped and cannot accept new jobs.",\n\t dropWaitingJobs: true,\n\t dropErrorMessage: "This limiter has been stopped."\n\t };\n\n\t return Bottleneck;\n\n\t}).call(commonjsGlobal);\n\n\tvar Bottleneck_1 = Bottleneck;\n\n\tvar lib = Bottleneck_1;\n\n\treturn lib;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1IsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTywwQkFBMEI7QUFDakM7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlGQUFpRixRQUFRLGlEQUFpRCxnQ0FBZ0M7QUFDMUs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQsdUJBQXVCO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sS0FBSztBQUNYOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyw2QkFBNkI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sdUJBQXVCLDRCQUE0QjtBQUNuRDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FLHdCQUF3QixvQkFBb0I7QUFDL0csV0FBVztBQUNYLHFFQUFxRSx3QkFBd0Isb0JBQW9CO0FBQ2pIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFFBQVEsR0FBRyxJQUFJO0FBQ2pDO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFFBQVE7QUFDUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlGQUF5RixRQUFRLEdBQUcsSUFBSTtBQUN4RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQSxtSEFBbUgsUUFBUTtBQUMzSDtBQUNBLHlDQUF5QyxTQUFTO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUEsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsRUFBRTs7QUFFRjs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsRUFBRTs7QUFFRjs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRTtBQUNuRTtBQUNBO0FBQ0Esb0ZBQW9GO0FBQ3BGO0FBQ0EsV0FBVztBQUNYLG9GQUFvRjtBQUNwRjtBQUNBLFdBQVc7QUFDWCxxRkFBcUYsZUFBZTtBQUNwRztBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixRQUFRO0FBQzNCOztBQUVBO0FBQ0EsbUJBQW1CLFFBQVEsR0FBRyxxQkFBcUI7QUFDbkQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLCtDQUErQyxXQUFXO0FBQzFEO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGVBQWU7QUFDMUI7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELFdBQVcsSUFBSSxjQUFjO0FBQy9FO0FBQ0EsMkZBQTJGLHlCQUF5QjtBQUNwSDtBQUNBLG1EQUFtRCxXQUFXLElBQUksdUJBQXVCO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFVBQVU7QUFDVixRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBLDRCQUE0QixRQUFRO0FBQ3BDLFFBQVE7QUFDUjs7QUFFQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLFFBQVE7QUFDUjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVMsZUFBZTtBQUN4QjtBQUNBLFdBQVcsK0JBQStCO0FBQzFDLFNBQVM7QUFDVDtBQUNBLHlEQUF5RCxXQUFXLElBQUkscUJBQXFCO0FBQzdGLHFCQUFxQixNQUFNO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJHQUEyRyxlQUFlO0FBQzFIO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWixVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLEVBQUU7O0FBRUY7O0FBRUE7O0FBRUE7O0FBRUEsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2JvdHRsZW5lY2svbGlnaHQuanM/NjYzZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEJvdHRsZW5lY2sgbGlicmFyeSAoTUlUKSwgY29tcGlsZWQgdG8gRVMyMDE3LCBhbmQgd2l0aG91dCBDbHVzdGVyaW5nIHN1cHBvcnQuXG4gICogaHR0cHM6Ly9naXRodWIuY29tL1NHcm9uZGluL2JvdHRsZW5lY2tcbiAgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcblx0dHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcblx0KGdsb2JhbC5Cb3R0bGVuZWNrID0gZmFjdG9yeSgpKTtcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cdHZhciBjb21tb25qc0dsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9O1xuXG5cdGZ1bmN0aW9uIGdldENqc0V4cG9ydEZyb21OYW1lc3BhY2UgKG4pIHtcblx0XHRyZXR1cm4gbiAmJiBuWydkZWZhdWx0J10gfHwgbjtcblx0fVxuXG5cdHZhciBsb2FkID0gZnVuY3Rpb24ocmVjZWl2ZWQsIGRlZmF1bHRzLCBvbnRvID0ge30pIHtcblx0ICB2YXIgaywgcmVmLCB2O1xuXHQgIGZvciAoayBpbiBkZWZhdWx0cykge1xuXHQgICAgdiA9IGRlZmF1bHRzW2tdO1xuXHQgICAgb250b1trXSA9IChyZWYgPSByZWNlaXZlZFtrXSkgIT0gbnVsbCA/IHJlZiA6IHY7XG5cdCAgfVxuXHQgIHJldHVybiBvbnRvO1xuXHR9O1xuXG5cdHZhciBvdmVyd3JpdGUgPSBmdW5jdGlvbihyZWNlaXZlZCwgZGVmYXVsdHMsIG9udG8gPSB7fSkge1xuXHQgIHZhciBrLCB2O1xuXHQgIGZvciAoayBpbiByZWNlaXZlZCkge1xuXHQgICAgdiA9IHJlY2VpdmVkW2tdO1xuXHQgICAgaWYgKGRlZmF1bHRzW2tdICE9PSB2b2lkIDApIHtcblx0ICAgICAgb250b1trXSA9IHY7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHJldHVybiBvbnRvO1xuXHR9O1xuXG5cdHZhciBwYXJzZXIgPSB7XG5cdFx0bG9hZDogbG9hZCxcblx0XHRvdmVyd3JpdGU6IG92ZXJ3cml0ZVxuXHR9O1xuXG5cdHZhciBETExpc3Q7XG5cblx0RExMaXN0ID0gY2xhc3MgRExMaXN0IHtcblx0ICBjb25zdHJ1Y3RvcihpbmNyLCBkZWNyKSB7XG5cdCAgICB0aGlzLmluY3IgPSBpbmNyO1xuXHQgICAgdGhpcy5kZWNyID0gZGVjcjtcblx0ICAgIHRoaXMuX2ZpcnN0ID0gbnVsbDtcblx0ICAgIHRoaXMuX2xhc3QgPSBudWxsO1xuXHQgICAgdGhpcy5sZW5ndGggPSAwO1xuXHQgIH1cblxuXHQgIHB1c2godmFsdWUpIHtcblx0ICAgIHZhciBub2RlO1xuXHQgICAgdGhpcy5sZW5ndGgrKztcblx0ICAgIGlmICh0eXBlb2YgdGhpcy5pbmNyID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICAgICAgdGhpcy5pbmNyKCk7XG5cdCAgICB9XG5cdCAgICBub2RlID0ge1xuXHQgICAgICB2YWx1ZSxcblx0ICAgICAgcHJldjogdGhpcy5fbGFzdCxcblx0ICAgICAgbmV4dDogbnVsbFxuXHQgICAgfTtcblx0ICAgIGlmICh0aGlzLl9sYXN0ICE9IG51bGwpIHtcblx0ICAgICAgdGhpcy5fbGFzdC5uZXh0ID0gbm9kZTtcblx0ICAgICAgdGhpcy5fbGFzdCA9IG5vZGU7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLl9maXJzdCA9IHRoaXMuX2xhc3QgPSBub2RlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHZvaWQgMDtcblx0ICB9XG5cblx0ICBzaGlmdCgpIHtcblx0ICAgIHZhciB2YWx1ZTtcblx0ICAgIGlmICh0aGlzLl9maXJzdCA9PSBudWxsKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMubGVuZ3RoLS07XG5cdCAgICAgIGlmICh0eXBlb2YgdGhpcy5kZWNyID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICAgICAgICB0aGlzLmRlY3IoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgdmFsdWUgPSB0aGlzLl9maXJzdC52YWx1ZTtcblx0ICAgIGlmICgodGhpcy5fZmlyc3QgPSB0aGlzLl9maXJzdC5uZXh0KSAhPSBudWxsKSB7XG5cdCAgICAgIHRoaXMuX2ZpcnN0LnByZXYgPSBudWxsO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5fbGFzdCA9IG51bGw7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gdmFsdWU7XG5cdCAgfVxuXG5cdCAgZmlyc3QoKSB7XG5cdCAgICBpZiAodGhpcy5fZmlyc3QgIT0gbnVsbCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fZmlyc3QudmFsdWU7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgZ2V0QXJyYXkoKSB7XG5cdCAgICB2YXIgbm9kZSwgcmVmLCByZXN1bHRzO1xuXHQgICAgbm9kZSA9IHRoaXMuX2ZpcnN0O1xuXHQgICAgcmVzdWx0cyA9IFtdO1xuXHQgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuXHQgICAgICByZXN1bHRzLnB1c2goKHJlZiA9IG5vZGUsIG5vZGUgPSBub2RlLm5leHQsIHJlZi52YWx1ZSkpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHJlc3VsdHM7XG5cdCAgfVxuXG5cdCAgZm9yRWFjaFNoaWZ0KGNiKSB7XG5cdCAgICB2YXIgbm9kZTtcblx0ICAgIG5vZGUgPSB0aGlzLnNoaWZ0KCk7XG5cdCAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG5cdCAgICAgIChjYihub2RlKSwgbm9kZSA9IHRoaXMuc2hpZnQoKSk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gdm9pZCAwO1xuXHQgIH1cblxuXHQgIGRlYnVnKCkge1xuXHQgICAgdmFyIG5vZGUsIHJlZiwgcmVmMSwgcmVmMiwgcmVzdWx0cztcblx0ICAgIG5vZGUgPSB0aGlzLl9maXJzdDtcblx0ICAgIHJlc3VsdHMgPSBbXTtcblx0ICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcblx0ICAgICAgcmVzdWx0cy5wdXNoKChyZWYgPSBub2RlLCBub2RlID0gbm9kZS5uZXh0LCB7XG5cdCAgICAgICAgdmFsdWU6IHJlZi52YWx1ZSxcblx0ICAgICAgICBwcmV2OiAocmVmMSA9IHJlZi5wcmV2KSAhPSBudWxsID8gcmVmMS52YWx1ZSA6IHZvaWQgMCxcblx0ICAgICAgICBuZXh0OiAocmVmMiA9IHJlZi5uZXh0KSAhPSBudWxsID8gcmVmMi52YWx1ZSA6IHZvaWQgMFxuXHQgICAgICB9KSk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gcmVzdWx0cztcblx0ICB9XG5cblx0fTtcblxuXHR2YXIgRExMaXN0XzEgPSBETExpc3Q7XG5cblx0dmFyIEV2ZW50cztcblxuXHRFdmVudHMgPSBjbGFzcyBFdmVudHMge1xuXHQgIGNvbnN0cnVjdG9yKGluc3RhbmNlKSB7XG5cdCAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG5cdCAgICB0aGlzLl9ldmVudHMgPSB7fTtcblx0ICAgIGlmICgodGhpcy5pbnN0YW5jZS5vbiAhPSBudWxsKSB8fCAodGhpcy5pbnN0YW5jZS5vbmNlICE9IG51bGwpIHx8ICh0aGlzLmluc3RhbmNlLnJlbW92ZUFsbExpc3RlbmVycyAhPSBudWxsKSkge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBbiBFbWl0dGVyIGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIG9iamVjdFwiKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuaW5zdGFuY2Uub24gPSAobmFtZSwgY2IpID0+IHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX2FkZExpc3RlbmVyKG5hbWUsIFwibWFueVwiLCBjYik7XG5cdCAgICB9O1xuXHQgICAgdGhpcy5pbnN0YW5jZS5vbmNlID0gKG5hbWUsIGNiKSA9PiB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9hZGRMaXN0ZW5lcihuYW1lLCBcIm9uY2VcIiwgY2IpO1xuXHQgICAgfTtcblx0ICAgIHRoaXMuaW5zdGFuY2UucmVtb3ZlQWxsTGlzdGVuZXJzID0gKG5hbWUgPSBudWxsKSA9PiB7XG5cdCAgICAgIGlmIChuYW1lICE9IG51bGwpIHtcblx0ICAgICAgICByZXR1cm4gZGVsZXRlIHRoaXMuX2V2ZW50c1tuYW1lXTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRzID0ge307XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgfVxuXG5cdCAgX2FkZExpc3RlbmVyKG5hbWUsIHN0YXR1cywgY2IpIHtcblx0ICAgIHZhciBiYXNlO1xuXHQgICAgaWYgKChiYXNlID0gdGhpcy5fZXZlbnRzKVtuYW1lXSA9PSBudWxsKSB7XG5cdCAgICAgIGJhc2VbbmFtZV0gPSBbXTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX2V2ZW50c1tuYW1lXS5wdXNoKHtjYiwgc3RhdHVzfSk7XG5cdCAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcblx0ICB9XG5cblx0ICBsaXN0ZW5lckNvdW50KG5hbWUpIHtcblx0ICAgIGlmICh0aGlzLl9ldmVudHNbbmFtZV0gIT0gbnVsbCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fZXZlbnRzW25hbWVdLmxlbmd0aDtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHJldHVybiAwO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIGFzeW5jIHRyaWdnZXIobmFtZSwgLi4uYXJncykge1xuXHQgICAgdmFyIGUsIHByb21pc2VzO1xuXHQgICAgdHJ5IHtcblx0ICAgICAgaWYgKG5hbWUgIT09IFwiZGVidWdcIikge1xuXHQgICAgICAgIHRoaXMudHJpZ2dlcihcImRlYnVnXCIsIGBFdmVudCB0cmlnZ2VyZWQ6ICR7bmFtZX1gLCBhcmdzKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5fZXZlbnRzW25hbWVdID09IG51bGwpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5fZXZlbnRzW25hbWVdID0gdGhpcy5fZXZlbnRzW25hbWVdLmZpbHRlcihmdW5jdGlvbihsaXN0ZW5lcikge1xuXHQgICAgICAgIHJldHVybiBsaXN0ZW5lci5zdGF0dXMgIT09IFwibm9uZVwiO1xuXHQgICAgICB9KTtcblx0ICAgICAgcHJvbWlzZXMgPSB0aGlzLl9ldmVudHNbbmFtZV0ubWFwKGFzeW5jKGxpc3RlbmVyKSA9PiB7XG5cdCAgICAgICAgdmFyIGUsIHJldHVybmVkO1xuXHQgICAgICAgIGlmIChsaXN0ZW5lci5zdGF0dXMgPT09IFwibm9uZVwiKSB7XG5cdCAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChsaXN0ZW5lci5zdGF0dXMgPT09IFwib25jZVwiKSB7XG5cdCAgICAgICAgICBsaXN0ZW5lci5zdGF0dXMgPSBcIm5vbmVcIjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgIHJldHVybmVkID0gdHlwZW9mIGxpc3RlbmVyLmNiID09PSBcImZ1bmN0aW9uXCIgPyBsaXN0ZW5lci5jYiguLi5hcmdzKSA6IHZvaWQgMDtcblx0ICAgICAgICAgIGlmICh0eXBlb2YgKHJldHVybmVkICE9IG51bGwgPyByZXR1cm5lZC50aGVuIDogdm9pZCAwKSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAoYXdhaXQgcmV0dXJuZWQpO1xuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHJldHVybmVkO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG5cdCAgICAgICAgICBlID0gZXJyb3I7XG5cdCAgICAgICAgICB7XG5cdCAgICAgICAgICAgIHRoaXMudHJpZ2dlcihcImVycm9yXCIsIGUpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuICgoYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpKSkuZmluZChmdW5jdGlvbih4KSB7XG5cdCAgICAgICAgcmV0dXJuIHggIT0gbnVsbDtcblx0ICAgICAgfSk7XG5cdCAgICB9IGNhdGNoIChlcnJvcikge1xuXHQgICAgICBlID0gZXJyb3I7XG5cdCAgICAgIHtcblx0ICAgICAgICB0aGlzLnRyaWdnZXIoXCJlcnJvclwiLCBlKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gbnVsbDtcblx0ICAgIH1cblx0ICB9XG5cblx0fTtcblxuXHR2YXIgRXZlbnRzXzEgPSBFdmVudHM7XG5cblx0dmFyIERMTGlzdCQxLCBFdmVudHMkMSwgUXVldWVzO1xuXG5cdERMTGlzdCQxID0gRExMaXN0XzE7XG5cblx0RXZlbnRzJDEgPSBFdmVudHNfMTtcblxuXHRRdWV1ZXMgPSBjbGFzcyBRdWV1ZXMge1xuXHQgIGNvbnN0cnVjdG9yKG51bV9wcmlvcml0aWVzKSB7XG5cdCAgICB2YXIgaTtcblx0ICAgIHRoaXMuRXZlbnRzID0gbmV3IEV2ZW50cyQxKHRoaXMpO1xuXHQgICAgdGhpcy5fbGVuZ3RoID0gMDtcblx0ICAgIHRoaXMuX2xpc3RzID0gKGZ1bmN0aW9uKCkge1xuXHQgICAgICB2YXIgaiwgcmVmLCByZXN1bHRzO1xuXHQgICAgICByZXN1bHRzID0gW107XG5cdCAgICAgIGZvciAoaSA9IGogPSAxLCByZWYgPSBudW1fcHJpb3JpdGllczsgKDEgPD0gcmVmID8gaiA8PSByZWYgOiBqID49IHJlZik7IGkgPSAxIDw9IHJlZiA/ICsraiA6IC0taikge1xuXHQgICAgICAgIHJlc3VsdHMucHVzaChuZXcgRExMaXN0JDEoKCgpID0+IHtcblx0ICAgICAgICAgIHJldHVybiB0aGlzLmluY3IoKTtcblx0ICAgICAgICB9KSwgKCgpID0+IHtcblx0ICAgICAgICAgIHJldHVybiB0aGlzLmRlY3IoKTtcblx0ICAgICAgICB9KSkpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiByZXN1bHRzO1xuXHQgICAgfSkuY2FsbCh0aGlzKTtcblx0ICB9XG5cblx0ICBpbmNyKCkge1xuXHQgICAgaWYgKHRoaXMuX2xlbmd0aCsrID09PSAwKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLkV2ZW50cy50cmlnZ2VyKFwibGVmdHplcm9cIik7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgZGVjcigpIHtcblx0ICAgIGlmICgtLXRoaXMuX2xlbmd0aCA9PT0gMCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5FdmVudHMudHJpZ2dlcihcInplcm9cIik7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgcHVzaChqb2IpIHtcblx0ICAgIHJldHVybiB0aGlzLl9saXN0c1tqb2Iub3B0aW9ucy5wcmlvcml0eV0ucHVzaChqb2IpO1xuXHQgIH1cblxuXHQgIHF1ZXVlZChwcmlvcml0eSkge1xuXHQgICAgaWYgKHByaW9yaXR5ICE9IG51bGwpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX2xpc3RzW3ByaW9yaXR5XS5sZW5ndGg7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHNoaWZ0QWxsKGZuKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fbGlzdHMuZm9yRWFjaChmdW5jdGlvbihsaXN0KSB7XG5cdCAgICAgIHJldHVybiBsaXN0LmZvckVhY2hTaGlmdChmbik7XG5cdCAgICB9KTtcblx0ICB9XG5cblx0ICBnZXRGaXJzdChhcnIgPSB0aGlzLl9saXN0cykge1xuXHQgICAgdmFyIGosIGxlbiwgbGlzdDtcblx0ICAgIGZvciAoaiA9IDAsIGxlbiA9IGFyci5sZW5ndGg7IGogPCBsZW47IGorKykge1xuXHQgICAgICBsaXN0ID0gYXJyW2pdO1xuXHQgICAgICBpZiAobGlzdC5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgcmV0dXJuIGxpc3Q7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiBbXTtcblx0ICB9XG5cblx0ICBzaGlmdExhc3RGcm9tKHByaW9yaXR5KSB7XG5cdCAgICByZXR1cm4gdGhpcy5nZXRGaXJzdCh0aGlzLl9saXN0cy5zbGljZShwcmlvcml0eSkucmV2ZXJzZSgpKS5zaGlmdCgpO1xuXHQgIH1cblxuXHR9O1xuXG5cdHZhciBRdWV1ZXNfMSA9IFF1ZXVlcztcblxuXHR2YXIgQm90dGxlbmVja0Vycm9yO1xuXG5cdEJvdHRsZW5lY2tFcnJvciA9IGNsYXNzIEJvdHRsZW5lY2tFcnJvciBleHRlbmRzIEVycm9yIHt9O1xuXG5cdHZhciBCb3R0bGVuZWNrRXJyb3JfMSA9IEJvdHRsZW5lY2tFcnJvcjtcblxuXHR2YXIgQm90dGxlbmVja0Vycm9yJDEsIERFRkFVTFRfUFJJT1JJVFksIEpvYiwgTlVNX1BSSU9SSVRJRVMsIHBhcnNlciQxO1xuXG5cdE5VTV9QUklPUklUSUVTID0gMTA7XG5cblx0REVGQVVMVF9QUklPUklUWSA9IDU7XG5cblx0cGFyc2VyJDEgPSBwYXJzZXI7XG5cblx0Qm90dGxlbmVja0Vycm9yJDEgPSBCb3R0bGVuZWNrRXJyb3JfMTtcblxuXHRKb2IgPSBjbGFzcyBKb2Ige1xuXHQgIGNvbnN0cnVjdG9yKHRhc2ssIGFyZ3MsIG9wdGlvbnMsIGpvYkRlZmF1bHRzLCByZWplY3RPbkRyb3AsIEV2ZW50cywgX3N0YXRlcywgUHJvbWlzZSkge1xuXHQgICAgdGhpcy50YXNrID0gdGFzaztcblx0ICAgIHRoaXMuYXJncyA9IGFyZ3M7XG5cdCAgICB0aGlzLnJlamVjdE9uRHJvcCA9IHJlamVjdE9uRHJvcDtcblx0ICAgIHRoaXMuRXZlbnRzID0gRXZlbnRzO1xuXHQgICAgdGhpcy5fc3RhdGVzID0gX3N0YXRlcztcblx0ICAgIHRoaXMuUHJvbWlzZSA9IFByb21pc2U7XG5cdCAgICB0aGlzLm9wdGlvbnMgPSBwYXJzZXIkMS5sb2FkKG9wdGlvbnMsIGpvYkRlZmF1bHRzKTtcblx0ICAgIHRoaXMub3B0aW9ucy5wcmlvcml0eSA9IHRoaXMuX3Nhbml0aXplUHJpb3JpdHkodGhpcy5vcHRpb25zLnByaW9yaXR5KTtcblx0ICAgIGlmICh0aGlzLm9wdGlvbnMuaWQgPT09IGpvYkRlZmF1bHRzLmlkKSB7XG5cdCAgICAgIHRoaXMub3B0aW9ucy5pZCA9IGAke3RoaXMub3B0aW9ucy5pZH0tJHt0aGlzLl9yYW5kb21JbmRleCgpfWA7XG5cdCAgICB9XG5cdCAgICB0aGlzLnByb21pc2UgPSBuZXcgdGhpcy5Qcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xuXHQgICAgICB0aGlzLl9yZXNvbHZlID0gX3Jlc29sdmU7XG5cdCAgICAgIHRoaXMuX3JlamVjdCA9IF9yZWplY3Q7XG5cdCAgICB9KTtcblx0ICAgIHRoaXMucmV0cnlDb3VudCA9IDA7XG5cdCAgfVxuXG5cdCAgX3Nhbml0aXplUHJpb3JpdHkocHJpb3JpdHkpIHtcblx0ICAgIHZhciBzUHJvcGVydHk7XG5cdCAgICBzUHJvcGVydHkgPSB+fnByaW9yaXR5ICE9PSBwcmlvcml0eSA/IERFRkFVTFRfUFJJT1JJVFkgOiBwcmlvcml0eTtcblx0ICAgIGlmIChzUHJvcGVydHkgPCAwKSB7XG5cdCAgICAgIHJldHVybiAwO1xuXHQgICAgfSBlbHNlIGlmIChzUHJvcGVydHkgPiBOVU1fUFJJT1JJVElFUyAtIDEpIHtcblx0ICAgICAgcmV0dXJuIE5VTV9QUklPUklUSUVTIC0gMTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHJldHVybiBzUHJvcGVydHk7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgX3JhbmRvbUluZGV4KCkge1xuXHQgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO1xuXHQgIH1cblxuXHQgIGRvRHJvcCh7ZXJyb3IsIG1lc3NhZ2UgPSBcIlRoaXMgam9iIGhhcyBiZWVuIGRyb3BwZWQgYnkgQm90dGxlbmVja1wifSA9IHt9KSB7XG5cdCAgICBpZiAodGhpcy5fc3RhdGVzLnJlbW92ZSh0aGlzLm9wdGlvbnMuaWQpKSB7XG5cdCAgICAgIGlmICh0aGlzLnJlamVjdE9uRHJvcCkge1xuXHQgICAgICAgIHRoaXMuX3JlamVjdChlcnJvciAhPSBudWxsID8gZXJyb3IgOiBuZXcgQm90dGxlbmVja0Vycm9yJDEobWVzc2FnZSkpO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuRXZlbnRzLnRyaWdnZXIoXCJkcm9wcGVkXCIsIHthcmdzOiB0aGlzLmFyZ3MsIG9wdGlvbnM6IHRoaXMub3B0aW9ucywgdGFzazogdGhpcy50YXNrLCBwcm9taXNlOiB0aGlzLnByb21pc2V9KTtcblx0ICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgX2Fzc2VydFN0YXR1cyhleHBlY3RlZCkge1xuXHQgICAgdmFyIHN0YXR1cztcblx0ICAgIHN0YXR1cyA9IHRoaXMuX3N0YXRlcy5qb2JTdGF0dXModGhpcy5vcHRpb25zLmlkKTtcblx0ICAgIGlmICghKHN0YXR1cyA9PT0gZXhwZWN0ZWQgfHwgKGV4cGVjdGVkID09PSBcIkRPTkVcIiAmJiBzdGF0dXMgPT09IG51bGwpKSkge1xuXHQgICAgICB0aHJvdyBuZXcgQm90dGxlbmVja0Vycm9yJDEoYEludmFsaWQgam9iIHN0YXR1cyAke3N0YXR1c30sIGV4cGVjdGVkICR7ZXhwZWN0ZWR9LiBQbGVhc2Ugb3BlbiBhbiBpc3N1ZSBhdCBodHRwczovL2dpdGh1Yi5jb20vU0dyb25kaW4vYm90dGxlbmVjay9pc3N1ZXNgKTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICBkb1JlY2VpdmUoKSB7XG5cdCAgICB0aGlzLl9zdGF0ZXMuc3RhcnQodGhpcy5vcHRpb25zLmlkKTtcblx0ICAgIHJldHVybiB0aGlzLkV2ZW50cy50cmlnZ2VyKFwicmVjZWl2ZWRcIiwge2FyZ3M6IHRoaXMuYXJncywgb3B0aW9uczogdGhpcy5vcHRpb25zfSk7XG5cdCAgfVxuXG5cdCAgZG9RdWV1ZShyZWFjaGVkSFdNLCBibG9ja2VkKSB7XG5cdCAgICB0aGlzLl9hc3NlcnRTdGF0dXMoXCJSRUNFSVZFRFwiKTtcblx0ICAgIHRoaXMuX3N0YXRlcy5uZXh0KHRoaXMub3B0aW9ucy5pZCk7XG5cdCAgICByZXR1cm4gdGhpcy5FdmVudHMudHJpZ2dlcihcInF1ZXVlZFwiLCB7YXJnczogdGhpcy5hcmdzLCBvcHRpb25zOiB0aGlzLm9wdGlvbnMsIHJlYWNoZWRIV00sIGJsb2NrZWR9KTtcblx0ICB9XG5cblx0ICBkb1J1bigpIHtcblx0ICAgIGlmICh0aGlzLnJldHJ5Q291bnQgPT09IDApIHtcblx0ICAgICAgdGhpcy5fYXNzZXJ0U3RhdHVzKFwiUVVFVUVEXCIpO1xuXHQgICAgICB0aGlzLl9zdGF0ZXMubmV4dCh0aGlzLm9wdGlvbnMuaWQpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5fYXNzZXJ0U3RhdHVzKFwiRVhFQ1VUSU5HXCIpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHRoaXMuRXZlbnRzLnRyaWdnZXIoXCJzY2hlZHVsZWRcIiwge2FyZ3M6IHRoaXMuYXJncywgb3B0aW9uczogdGhpcy5vcHRpb25zfSk7XG5cdCAgfVxuXG5cdCAgYXN5bmMgZG9FeGVjdXRlKGNoYWluZWQsIGNsZWFyR2xvYmFsU3RhdGUsIHJ1biwgZnJlZSkge1xuXHQgICAgdmFyIGVycm9yLCBldmVudEluZm8sIHBhc3NlZDtcblx0ICAgIGlmICh0aGlzLnJldHJ5Q291bnQgPT09IDApIHtcblx0ICAgICAgdGhpcy5fYXNzZXJ0U3RhdHVzKFwiUlVOTklOR1wiKTtcblx0ICAgICAgdGhpcy5fc3RhdGVzLm5leHQodGhpcy5vcHRpb25zLmlkKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMuX2Fzc2VydFN0YXR1cyhcIkVYRUNVVElOR1wiKTtcblx0ICAgIH1cblx0ICAgIGV2ZW50SW5mbyA9IHthcmdzOiB0aGlzLmFyZ3MsIG9wdGlvbnM6IHRoaXMub3B0aW9ucywgcmV0cnlDb3VudDogdGhpcy5yZXRyeUNvdW50fTtcblx0ICAgIHRoaXMuRXZlbnRzLnRyaWdnZXIoXCJleGVjdXRpbmdcIiwgZXZlbnRJbmZvKTtcblx0ICAgIHRyeSB7XG5cdCAgICAgIHBhc3NlZCA9IChhd2FpdCAoY2hhaW5lZCAhPSBudWxsID8gY2hhaW5lZC5zY2hlZHVsZSh0aGlzLm9wdGlvbnMsIHRoaXMudGFzaywgLi4udGhpcy5hcmdzKSA6IHRoaXMudGFzayguLi50aGlzLmFyZ3MpKSk7XG5cdCAgICAgIGlmIChjbGVhckdsb2JhbFN0YXRlKCkpIHtcblx0ICAgICAgICB0aGlzLmRvRG9uZShldmVudEluZm8pO1xuXHQgICAgICAgIGF3YWl0IGZyZWUodGhpcy5vcHRpb25zLCBldmVudEluZm8pO1xuXHQgICAgICAgIHRoaXMuX2Fzc2VydFN0YXR1cyhcIkRPTkVcIik7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdmUocGFzc2VkKTtcblx0ICAgICAgfVxuXHQgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG5cdCAgICAgIGVycm9yID0gZXJyb3IxO1xuXHQgICAgICByZXR1cm4gdGhpcy5fb25GYWlsdXJlKGVycm9yLCBldmVudEluZm8sIGNsZWFyR2xvYmFsU3RhdGUsIHJ1biwgZnJlZSk7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgZG9FeHBpcmUoY2xlYXJHbG9iYWxTdGF0ZSwgcnVuLCBmcmVlKSB7XG5cdCAgICB2YXIgZXJyb3IsIGV2ZW50SW5mbztcblx0ICAgIGlmICh0aGlzLl9zdGF0ZXMuam9iU3RhdHVzKHRoaXMub3B0aW9ucy5pZCA9PT0gXCJSVU5OSU5HXCIpKSB7XG5cdCAgICAgIHRoaXMuX3N0YXRlcy5uZXh0KHRoaXMub3B0aW9ucy5pZCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9hc3NlcnRTdGF0dXMoXCJFWEVDVVRJTkdcIik7XG5cdCAgICBldmVudEluZm8gPSB7YXJnczogdGhpcy5hcmdzLCBvcHRpb25zOiB0aGlzLm9wdGlvbnMsIHJldHJ5Q291bnQ6IHRoaXMucmV0cnlDb3VudH07XG5cdCAgICBlcnJvciA9IG5ldyBCb3R0bGVuZWNrRXJyb3IkMShgVGhpcyBqb2IgdGltZWQgb3V0IGFmdGVyICR7dGhpcy5vcHRpb25zLmV4cGlyYXRpb259IG1zLmApO1xuXHQgICAgcmV0dXJuIHRoaXMuX29uRmFpbHVyZShlcnJvciwgZXZlbnRJbmZvLCBjbGVhckdsb2JhbFN0YXRlLCBydW4sIGZyZWUpO1xuXHQgIH1cblxuXHQgIGFzeW5jIF9vbkZhaWx1cmUoZXJyb3IsIGV2ZW50SW5mbywgY2xlYXJHbG9iYWxTdGF0ZSwgcnVuLCBmcmVlKSB7XG5cdCAgICB2YXIgcmV0cnksIHJldHJ5QWZ0ZXI7XG5cdCAgICBpZiAoY2xlYXJHbG9iYWxTdGF0ZSgpKSB7XG5cdCAgICAgIHJldHJ5ID0gKGF3YWl0IHRoaXMuRXZlbnRzLnRyaWdnZXIoXCJmYWlsZWRcIiwgZXJyb3IsIGV2ZW50SW5mbykpO1xuXHQgICAgICBpZiAocmV0cnkgIT0gbnVsbCkge1xuXHQgICAgICAgIHJldHJ5QWZ0ZXIgPSB+fnJldHJ5O1xuXHQgICAgICAgIHRoaXMuRXZlbnRzLnRyaWdnZXIoXCJyZXRyeVwiLCBgUmV0cnlpbmcgJHt0aGlzLm9wdGlvbnMuaWR9IGFmdGVyICR7cmV0cnlBZnRlcn0gbXNgLCBldmVudEluZm8pO1xuXHQgICAgICAgIHRoaXMucmV0cnlDb3VudCsrO1xuXHQgICAgICAgIHJldHVybiBydW4ocmV0cnlBZnRlcik7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5kb0RvbmUoZXZlbnRJbmZvKTtcblx0ICAgICAgICBhd2FpdCBmcmVlKHRoaXMub3B0aW9ucywgZXZlbnRJbmZvKTtcblx0ICAgICAgICB0aGlzLl9hc3NlcnRTdGF0dXMoXCJET05FXCIpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9yZWplY3QoZXJyb3IpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgZG9Eb25lKGV2ZW50SW5mbykge1xuXHQgICAgdGhpcy5fYXNzZXJ0U3RhdHVzKFwiRVhFQ1VUSU5HXCIpO1xuXHQgICAgdGhpcy5fc3RhdGVzLm5leHQodGhpcy5vcHRpb25zLmlkKTtcblx0ICAgIHJldHVybiB0aGlzLkV2ZW50cy50cmlnZ2VyKFwiZG9uZVwiLCBldmVudEluZm8pO1xuXHQgIH1cblxuXHR9O1xuXG5cdHZhciBKb2JfMSA9IEpvYjtcblxuXHR2YXIgQm90dGxlbmVja0Vycm9yJDIsIExvY2FsRGF0YXN0b3JlLCBwYXJzZXIkMjtcblxuXHRwYXJzZXIkMiA9IHBhcnNlcjtcblxuXHRCb3R0bGVuZWNrRXJyb3IkMiA9IEJvdHRsZW5lY2tFcnJvcl8xO1xuXG5cdExvY2FsRGF0YXN0b3JlID0gY2xhc3MgTG9jYWxEYXRhc3RvcmUge1xuXHQgIGNvbnN0cnVjdG9yKGluc3RhbmNlLCBzdG9yZU9wdGlvbnMsIHN0b3JlSW5zdGFuY2VPcHRpb25zKSB7XG5cdCAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG5cdCAgICB0aGlzLnN0b3JlT3B0aW9ucyA9IHN0b3JlT3B0aW9ucztcblx0ICAgIHRoaXMuY2xpZW50SWQgPSB0aGlzLmluc3RhbmNlLl9yYW5kb21JbmRleCgpO1xuXHQgICAgcGFyc2VyJDIubG9hZChzdG9yZUluc3RhbmNlT3B0aW9ucywgc3RvcmVJbnN0YW5jZU9wdGlvbnMsIHRoaXMpO1xuXHQgICAgdGhpcy5fbmV4dFJlcXVlc3QgPSB0aGlzLl9sYXN0UmVzZXJ2b2lyUmVmcmVzaCA9IHRoaXMuX2xhc3RSZXNlcnZvaXJJbmNyZWFzZSA9IERhdGUubm93KCk7XG5cdCAgICB0aGlzLl9ydW5uaW5nID0gMDtcblx0ICAgIHRoaXMuX2RvbmUgPSAwO1xuXHQgICAgdGhpcy5fdW5ibG9ja1RpbWUgPSAwO1xuXHQgICAgdGhpcy5yZWFkeSA9IHRoaXMuUHJvbWlzZS5yZXNvbHZlKCk7XG5cdCAgICB0aGlzLmNsaWVudHMgPSB7fTtcblx0ICAgIHRoaXMuX3N0YXJ0SGVhcnRiZWF0KCk7XG5cdCAgfVxuXG5cdCAgX3N0YXJ0SGVhcnRiZWF0KCkge1xuXHQgICAgdmFyIGJhc2U7XG5cdCAgICBpZiAoKHRoaXMuaGVhcnRiZWF0ID09IG51bGwpICYmICgoKHRoaXMuc3RvcmVPcHRpb25zLnJlc2Vydm9pclJlZnJlc2hJbnRlcnZhbCAhPSBudWxsKSAmJiAodGhpcy5zdG9yZU9wdGlvbnMucmVzZXJ2b2lyUmVmcmVzaEFtb3VudCAhPSBudWxsKSkgfHwgKCh0aGlzLnN0b3JlT3B0aW9ucy5yZXNlcnZvaXJJbmNyZWFzZUludGVydmFsICE9IG51bGwpICYmICh0aGlzLnN0b3JlT3B0aW9ucy5yZXNlcnZvaXJJbmNyZWFzZUFtb3VudCAhPSBudWxsKSkpKSB7XG5cdCAgICAgIHJldHVybiB0eXBlb2YgKGJhc2UgPSAodGhpcy5oZWFydGJlYXQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG5cdCAgICAgICAgdmFyIGFtb3VudCwgaW5jciwgbWF4aW11bSwgbm93LCByZXNlcnZvaXI7XG5cdCAgICAgICAgbm93ID0gRGF0ZS5ub3coKTtcblx0ICAgICAgICBpZiAoKHRoaXMuc3RvcmVPcHRpb25zLnJlc2Vydm9pclJlZnJlc2hJbnRlcnZhbCAhPSBudWxsKSAmJiBub3cgPj0gdGhpcy5fbGFzdFJlc2Vydm9pclJlZnJlc2ggKyB0aGlzLnN0b3JlT3B0aW9ucy5yZXNlcnZvaXJSZWZyZXNoSW50ZXJ2YWwpIHtcblx0ICAgICAgICAgIHRoaXMuX2xhc3RSZXNlcnZvaXJSZWZyZXNoID0gbm93O1xuXHQgICAgICAgICAgdGhpcy5zdG9yZU9wdGlvbnMucmVzZXJ2b2lyID0gdGhpcy5zdG9yZU9wdGlvbnMucmVzZXJ2b2lyUmVmcmVzaEFtb3VudDtcblx0ICAgICAgICAgIHRoaXMuaW5zdGFuY2UuX2RyYWluQWxsKHRoaXMuY29tcHV0ZUNhcGFjaXR5KCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoKHRoaXMuc3RvcmVPcHRpb25zLnJlc2Vydm9pckluY3JlYXNlSW50ZXJ2YWwgIT0gbnVsbCkgJiYgbm93ID49IHRoaXMuX2xhc3RSZXNlcnZvaXJJbmNyZWFzZSArIHRoaXMuc3RvcmVPcHRpb25zLnJlc2Vydm9pckluY3JlYXNlSW50ZXJ2YWwpIHtcblx0ICAgICAgICAgICh7XG5cdCAgICAgICAgICAgIHJlc2Vydm9pckluY3JlYXNlQW1vdW50OiBhbW91bnQsXG5cdCAgICAgICAgICAgIHJlc2Vydm9pckluY3JlYXNlTWF4aW11bTogbWF4aW11bSxcblx0ICAgICAgICAgICAgcmVzZXJ2b2lyXG5cdCAgICAgICAgICB9ID0gdGhpcy5zdG9yZU9wdGlvbnMpO1xuXHQgICAgICAgICAgdGhpcy5fbGFzdFJlc2Vydm9pckluY3JlYXNlID0gbm93O1xuXHQgICAgICAgICAgaW5jciA9IG1heGltdW0gIT0gbnVsbCA/IE1hdGgubWluKGFtb3VudCwgbWF4aW11bSAtIHJlc2Vydm9pcikgOiBhbW91bnQ7XG5cdCAgICAgICAgICBpZiAoaW5jciA+IDApIHtcblx0ICAgICAgICAgICAgdGhpcy5zdG9yZU9wdGlvbnMucmVzZXJ2b2lyICs9IGluY3I7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlLl9kcmFpbkFsbCh0aGlzLmNvbXB1dGVDYXBhY2l0eSgpKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH0sIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWwpKSkudW5yZWYgPT09IFwiZnVuY3Rpb25cIiA/IGJhc2UudW5yZWYoKSA6IHZvaWQgMDtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHJldHVybiBjbGVhckludGVydmFsKHRoaXMuaGVhcnRiZWF0KTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICBhc3luYyBfX3B1Ymxpc2hfXyhtZXNzYWdlKSB7XG5cdCAgICBhd2FpdCB0aGlzLnlpZWxkTG9vcCgpO1xuXHQgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UuRXZlbnRzLnRyaWdnZXIoXCJtZXNzYWdlXCIsIG1lc3NhZ2UudG9TdHJpbmcoKSk7XG5cdCAgfVxuXG5cdCAgYXN5bmMgX19kaXNjb25uZWN0X18oZmx1c2gpIHtcblx0ICAgIGF3YWl0IHRoaXMueWllbGRMb29wKCk7XG5cdCAgICBjbGVhckludGVydmFsKHRoaXMuaGVhcnRiZWF0KTtcblx0ICAgIHJldHVybiB0aGlzLlByb21pc2UucmVzb2x2ZSgpO1xuXHQgIH1cblxuXHQgIHlpZWxkTG9vcCh0ID0gMCkge1xuXHQgICAgcmV0dXJuIG5ldyB0aGlzLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdCAgICAgIHJldHVybiBzZXRUaW1lb3V0KHJlc29sdmUsIHQpO1xuXHQgICAgfSk7XG5cdCAgfVxuXG5cdCAgY29tcHV0ZVBlbmFsdHkoKSB7XG5cdCAgICB2YXIgcmVmO1xuXHQgICAgcmV0dXJuIChyZWYgPSB0aGlzLnN0b3JlT3B0aW9ucy5wZW5hbHR5KSAhPSBudWxsID8gcmVmIDogKDE1ICogdGhpcy5zdG9yZU9wdGlvbnMubWluVGltZSkgfHwgNTAwMDtcblx0ICB9XG5cblx0ICBhc3luYyBfX3VwZGF0ZVNldHRpbmdzX18ob3B0aW9ucykge1xuXHQgICAgYXdhaXQgdGhpcy55aWVsZExvb3AoKTtcblx0ICAgIHBhcnNlciQyLm92ZXJ3cml0ZShvcHRpb25zLCBvcHRpb25zLCB0aGlzLnN0b3JlT3B0aW9ucyk7XG5cdCAgICB0aGlzLl9zdGFydEhlYXJ0YmVhdCgpO1xuXHQgICAgdGhpcy5pbnN0YW5jZS5fZHJhaW5BbGwodGhpcy5jb21wdXRlQ2FwYWNpdHkoKSk7XG5cdCAgICByZXR1cm4gdHJ1ZTtcblx0ICB9XG5cblx0ICBhc3luYyBfX3J1bm5pbmdfXygpIHtcblx0ICAgIGF3YWl0IHRoaXMueWllbGRMb29wKCk7XG5cdCAgICByZXR1cm4gdGhpcy5fcnVubmluZztcblx0ICB9XG5cblx0ICBhc3luYyBfX3F1ZXVlZF9fKCkge1xuXHQgICAgYXdhaXQgdGhpcy55aWVsZExvb3AoKTtcblx0ICAgIHJldHVybiB0aGlzLmluc3RhbmNlLnF1ZXVlZCgpO1xuXHQgIH1cblxuXHQgIGFzeW5jIF9fZG9uZV9fKCkge1xuXHQgICAgYXdhaXQgdGhpcy55aWVsZExvb3AoKTtcblx0ICAgIHJldHVybiB0aGlzLl9kb25lO1xuXHQgIH1cblxuXHQgIGFzeW5jIF9fZ3JvdXBDaGVja19fKHRpbWUpIHtcblx0ICAgIGF3YWl0IHRoaXMueWllbGRMb29wKCk7XG5cdCAgICByZXR1cm4gKHRoaXMuX25leHRSZXF1ZXN0ICsgdGhpcy50aW1lb3V0KSA8IHRpbWU7XG5cdCAgfVxuXG5cdCAgY29tcHV0ZUNhcGFjaXR5KCkge1xuXHQgICAgdmFyIG1heENvbmN1cnJlbnQsIHJlc2Vydm9pcjtcblx0ICAgICh7bWF4Q29uY3VycmVudCwgcmVzZXJ2b2lyfSA9IHRoaXMuc3RvcmVPcHRpb25zKTtcblx0ICAgIGlmICgobWF4Q29uY3VycmVudCAhPSBudWxsKSAmJiAocmVzZXJ2b2lyICE9IG51bGwpKSB7XG5cdCAgICAgIHJldHVybiBNYXRoLm1pbihtYXhDb25jdXJyZW50IC0gdGhpcy5fcnVubmluZywgcmVzZXJ2b2lyKTtcblx0ICAgIH0gZWxzZSBpZiAobWF4Q29uY3VycmVudCAhPSBudWxsKSB7XG5cdCAgICAgIHJldHVybiBtYXhDb25jdXJyZW50IC0gdGhpcy5fcnVubmluZztcblx0ICAgIH0gZWxzZSBpZiAocmVzZXJ2b2lyICE9IG51bGwpIHtcblx0ICAgICAgcmV0dXJuIHJlc2Vydm9pcjtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIGNvbmRpdGlvbnNDaGVjayh3ZWlnaHQpIHtcblx0ICAgIHZhciBjYXBhY2l0eTtcblx0ICAgIGNhcGFjaXR5ID0gdGhpcy5jb21wdXRlQ2FwYWNpdHkoKTtcblx0ICAgIHJldHVybiAoY2FwYWNpdHkgPT0gbnVsbCkgfHwgd2VpZ2h0IDw9IGNhcGFjaXR5O1xuXHQgIH1cblxuXHQgIGFzeW5jIF9faW5jcmVtZW50UmVzZXJ2b2lyX18oaW5jcikge1xuXHQgICAgdmFyIHJlc2Vydm9pcjtcblx0ICAgIGF3YWl0IHRoaXMueWllbGRMb29wKCk7XG5cdCAgICByZXNlcnZvaXIgPSB0aGlzLnN0b3JlT3B0aW9ucy5yZXNlcnZvaXIgKz0gaW5jcjtcblx0ICAgIHRoaXMuaW5zdGFuY2UuX2RyYWluQWxsKHRoaXMuY29tcHV0ZUNhcGFjaXR5KCkpO1xuXHQgICAgcmV0dXJuIHJlc2Vydm9pcjtcblx0ICB9XG5cblx0ICBhc3luYyBfX2N1cnJlbnRSZXNlcnZvaXJfXygpIHtcblx0ICAgIGF3YWl0IHRoaXMueWllbGRMb29wKCk7XG5cdCAgICByZXR1cm4gdGhpcy5zdG9yZU9wdGlvbnMucmVzZXJ2b2lyO1xuXHQgIH1cblxuXHQgIGlzQmxvY2tlZChub3cpIHtcblx0ICAgIHJldHVybiB0aGlzLl91bmJsb2NrVGltZSA+PSBub3c7XG5cdCAgfVxuXG5cdCAgY2hlY2sod2VpZ2h0LCBub3cpIHtcblx0ICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNDaGVjayh3ZWlnaHQpICYmICh0aGlzLl9uZXh0UmVxdWVzdCAtIG5vdykgPD0gMDtcblx0ICB9XG5cblx0ICBhc3luYyBfX2NoZWNrX18od2VpZ2h0KSB7XG5cdCAgICB2YXIgbm93O1xuXHQgICAgYXdhaXQgdGhpcy55aWVsZExvb3AoKTtcblx0ICAgIG5vdyA9IERhdGUubm93KCk7XG5cdCAgICByZXR1cm4gdGhpcy5jaGVjayh3ZWlnaHQsIG5vdyk7XG5cdCAgfVxuXG5cdCAgYXN5bmMgX19yZWdpc3Rlcl9fKGluZGV4LCB3ZWlnaHQsIGV4cGlyYXRpb24pIHtcblx0ICAgIHZhciBub3csIHdhaXQ7XG5cdCAgICBhd2FpdCB0aGlzLnlpZWxkTG9vcCgpO1xuXHQgICAgbm93ID0gRGF0ZS5ub3coKTtcblx0ICAgIGlmICh0aGlzLmNvbmRpdGlvbnNDaGVjayh3ZWlnaHQpKSB7XG5cdCAgICAgIHRoaXMuX3J1bm5pbmcgKz0gd2VpZ2h0O1xuXHQgICAgICBpZiAodGhpcy5zdG9yZU9wdGlvbnMucmVzZXJ2b2lyICE9IG51bGwpIHtcblx0ICAgICAgICB0aGlzLnN0b3JlT3B0aW9ucy5yZXNlcnZvaXIgLT0gd2VpZ2h0O1xuXHQgICAgICB9XG5cdCAgICAgIHdhaXQgPSBNYXRoLm1heCh0aGlzLl9uZXh0UmVxdWVzdCAtIG5vdywgMCk7XG5cdCAgICAgIHRoaXMuX25leHRSZXF1ZXN0ID0gbm93ICsgd2FpdCArIHRoaXMuc3RvcmVPcHRpb25zLm1pblRpbWU7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgc3VjY2VzczogdHJ1ZSxcblx0ICAgICAgICB3YWl0LFxuXHQgICAgICAgIHJlc2Vydm9pcjogdGhpcy5zdG9yZU9wdGlvbnMucmVzZXJ2b2lyXG5cdCAgICAgIH07XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIHN1Y2Nlc3M6IGZhbHNlXG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgc3RyYXRlZ3lJc0Jsb2NrKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuc3RvcmVPcHRpb25zLnN0cmF0ZWd5ID09PSAzO1xuXHQgIH1cblxuXHQgIGFzeW5jIF9fc3VibWl0X18ocXVldWVMZW5ndGgsIHdlaWdodCkge1xuXHQgICAgdmFyIGJsb2NrZWQsIG5vdywgcmVhY2hlZEhXTTtcblx0ICAgIGF3YWl0IHRoaXMueWllbGRMb29wKCk7XG5cdCAgICBpZiAoKHRoaXMuc3RvcmVPcHRpb25zLm1heENvbmN1cnJlbnQgIT0gbnVsbCkgJiYgd2VpZ2h0ID4gdGhpcy5zdG9yZU9wdGlvbnMubWF4Q29uY3VycmVudCkge1xuXHQgICAgICB0aHJvdyBuZXcgQm90dGxlbmVja0Vycm9yJDIoYEltcG9zc2libGUgdG8gYWRkIGEgam9iIGhhdmluZyBhIHdlaWdodCBvZiAke3dlaWdodH0gdG8gYSBsaW1pdGVyIGhhdmluZyBhIG1heENvbmN1cnJlbnQgc2V0dGluZyBvZiAke3RoaXMuc3RvcmVPcHRpb25zLm1heENvbmN1cnJlbnR9YCk7XG5cdCAgICB9XG5cdCAgICBub3cgPSBEYXRlLm5vdygpO1xuXHQgICAgcmVhY2hlZEhXTSA9ICh0aGlzLnN0b3JlT3B0aW9ucy5oaWdoV2F0ZXIgIT0gbnVsbCkgJiYgcXVldWVMZW5ndGggPT09IHRoaXMuc3RvcmVPcHRpb25zLmhpZ2hXYXRlciAmJiAhdGhpcy5jaGVjayh3ZWlnaHQsIG5vdyk7XG5cdCAgICBibG9ja2VkID0gdGhpcy5zdHJhdGVneUlzQmxvY2soKSAmJiAocmVhY2hlZEhXTSB8fCB0aGlzLmlzQmxvY2tlZChub3cpKTtcblx0ICAgIGlmIChibG9ja2VkKSB7XG5cdCAgICAgIHRoaXMuX3VuYmxvY2tUaW1lID0gbm93ICsgdGhpcy5jb21wdXRlUGVuYWx0eSgpO1xuXHQgICAgICB0aGlzLl9uZXh0UmVxdWVzdCA9IHRoaXMuX3VuYmxvY2tUaW1lICsgdGhpcy5zdG9yZU9wdGlvbnMubWluVGltZTtcblx0ICAgICAgdGhpcy5pbnN0YW5jZS5fZHJvcEFsbFF1ZXVlZCgpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgcmVhY2hlZEhXTSxcblx0ICAgICAgYmxvY2tlZCxcblx0ICAgICAgc3RyYXRlZ3k6IHRoaXMuc3RvcmVPcHRpb25zLnN0cmF0ZWd5XG5cdCAgICB9O1xuXHQgIH1cblxuXHQgIGFzeW5jIF9fZnJlZV9fKGluZGV4LCB3ZWlnaHQpIHtcblx0ICAgIGF3YWl0IHRoaXMueWllbGRMb29wKCk7XG5cdCAgICB0aGlzLl9ydW5uaW5nIC09IHdlaWdodDtcblx0ICAgIHRoaXMuX2RvbmUgKz0gd2VpZ2h0O1xuXHQgICAgdGhpcy5pbnN0YW5jZS5fZHJhaW5BbGwodGhpcy5jb21wdXRlQ2FwYWNpdHkoKSk7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBydW5uaW5nOiB0aGlzLl9ydW5uaW5nXG5cdCAgICB9O1xuXHQgIH1cblxuXHR9O1xuXG5cdHZhciBMb2NhbERhdGFzdG9yZV8xID0gTG9jYWxEYXRhc3RvcmU7XG5cblx0dmFyIEJvdHRsZW5lY2tFcnJvciQzLCBTdGF0ZXM7XG5cblx0Qm90dGxlbmVja0Vycm9yJDMgPSBCb3R0bGVuZWNrRXJyb3JfMTtcblxuXHRTdGF0ZXMgPSBjbGFzcyBTdGF0ZXMge1xuXHQgIGNvbnN0cnVjdG9yKHN0YXR1czEpIHtcblx0ICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzMTtcblx0ICAgIHRoaXMuX2pvYnMgPSB7fTtcblx0ICAgIHRoaXMuY291bnRzID0gdGhpcy5zdGF0dXMubWFwKGZ1bmN0aW9uKCkge1xuXHQgICAgICByZXR1cm4gMDtcblx0ICAgIH0pO1xuXHQgIH1cblxuXHQgIG5leHQoaWQpIHtcblx0ICAgIHZhciBjdXJyZW50LCBuZXh0O1xuXHQgICAgY3VycmVudCA9IHRoaXMuX2pvYnNbaWRdO1xuXHQgICAgbmV4dCA9IGN1cnJlbnQgKyAxO1xuXHQgICAgaWYgKChjdXJyZW50ICE9IG51bGwpICYmIG5leHQgPCB0aGlzLnN0YXR1cy5sZW5ndGgpIHtcblx0ICAgICAgdGhpcy5jb3VudHNbY3VycmVudF0tLTtcblx0ICAgICAgdGhpcy5jb3VudHNbbmV4dF0rKztcblx0ICAgICAgcmV0dXJuIHRoaXMuX2pvYnNbaWRdKys7XG5cdCAgICB9IGVsc2UgaWYgKGN1cnJlbnQgIT0gbnVsbCkge1xuXHQgICAgICB0aGlzLmNvdW50c1tjdXJyZW50XS0tO1xuXHQgICAgICByZXR1cm4gZGVsZXRlIHRoaXMuX2pvYnNbaWRdO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHN0YXJ0KGlkKSB7XG5cdCAgICB2YXIgaW5pdGlhbDtcblx0ICAgIGluaXRpYWwgPSAwO1xuXHQgICAgdGhpcy5fam9ic1tpZF0gPSBpbml0aWFsO1xuXHQgICAgcmV0dXJuIHRoaXMuY291bnRzW2luaXRpYWxdKys7XG5cdCAgfVxuXG5cdCAgcmVtb3ZlKGlkKSB7XG5cdCAgICB2YXIgY3VycmVudDtcblx0ICAgIGN1cnJlbnQgPSB0aGlzLl9qb2JzW2lkXTtcblx0ICAgIGlmIChjdXJyZW50ICE9IG51bGwpIHtcblx0ICAgICAgdGhpcy5jb3VudHNbY3VycmVudF0tLTtcblx0ICAgICAgZGVsZXRlIHRoaXMuX2pvYnNbaWRdO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIGN1cnJlbnQgIT0gbnVsbDtcblx0ICB9XG5cblx0ICBqb2JTdGF0dXMoaWQpIHtcblx0ICAgIHZhciByZWY7XG5cdCAgICByZXR1cm4gKHJlZiA9IHRoaXMuc3RhdHVzW3RoaXMuX2pvYnNbaWRdXSkgIT0gbnVsbCA/IHJlZiA6IG51bGw7XG5cdCAgfVxuXG5cdCAgc3RhdHVzSm9icyhzdGF0dXMpIHtcblx0ICAgIHZhciBrLCBwb3MsIHJlZiwgcmVzdWx0cywgdjtcblx0ICAgIGlmIChzdGF0dXMgIT0gbnVsbCkge1xuXHQgICAgICBwb3MgPSB0aGlzLnN0YXR1cy5pbmRleE9mKHN0YXR1cyk7XG5cdCAgICAgIGlmIChwb3MgPCAwKSB7XG5cdCAgICAgICAgdGhyb3cgbmV3IEJvdHRsZW5lY2tFcnJvciQzKGBzdGF0dXMgbXVzdCBiZSBvbmUgb2YgJHt0aGlzLnN0YXR1cy5qb2luKCcsICcpfWApO1xuXHQgICAgICB9XG5cdCAgICAgIHJlZiA9IHRoaXMuX2pvYnM7XG5cdCAgICAgIHJlc3VsdHMgPSBbXTtcblx0ICAgICAgZm9yIChrIGluIHJlZikge1xuXHQgICAgICAgIHYgPSByZWZba107XG5cdCAgICAgICAgaWYgKHYgPT09IHBvcykge1xuXHQgICAgICAgICAgcmVzdWx0cy5wdXNoKGspO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gcmVzdWx0cztcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9qb2JzKTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICBzdGF0dXNDb3VudHMoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5jb3VudHMucmVkdWNlKCgoYWNjLCB2LCBpKSA9PiB7XG5cdCAgICAgIGFjY1t0aGlzLnN0YXR1c1tpXV0gPSB2O1xuXHQgICAgICByZXR1cm4gYWNjO1xuXHQgICAgfSksIHt9KTtcblx0ICB9XG5cblx0fTtcblxuXHR2YXIgU3RhdGVzXzEgPSBTdGF0ZXM7XG5cblx0dmFyIERMTGlzdCQyLCBTeW5jO1xuXG5cdERMTGlzdCQyID0gRExMaXN0XzE7XG5cblx0U3luYyA9IGNsYXNzIFN5bmMge1xuXHQgIGNvbnN0cnVjdG9yKG5hbWUsIFByb21pc2UpIHtcblx0ICAgIHRoaXMuc2NoZWR1bGUgPSB0aGlzLnNjaGVkdWxlLmJpbmQodGhpcyk7XG5cdCAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXHQgICAgdGhpcy5Qcm9taXNlID0gUHJvbWlzZTtcblx0ICAgIHRoaXMuX3J1bm5pbmcgPSAwO1xuXHQgICAgdGhpcy5fcXVldWUgPSBuZXcgRExMaXN0JDIoKTtcblx0ICB9XG5cblx0ICBpc0VtcHR5KCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3F1ZXVlLmxlbmd0aCA9PT0gMDtcblx0ICB9XG5cblx0ICBhc3luYyBfdHJ5VG9SdW4oKSB7XG5cdCAgICB2YXIgYXJncywgY2IsIGVycm9yLCByZWplY3QsIHJlc29sdmUsIHJldHVybmVkLCB0YXNrO1xuXHQgICAgaWYgKCh0aGlzLl9ydW5uaW5nIDwgMSkgJiYgdGhpcy5fcXVldWUubGVuZ3RoID4gMCkge1xuXHQgICAgICB0aGlzLl9ydW5uaW5nKys7XG5cdCAgICAgICh7dGFzaywgYXJncywgcmVzb2x2ZSwgcmVqZWN0fSA9IHRoaXMuX3F1ZXVlLnNoaWZ0KCkpO1xuXHQgICAgICBjYiA9IChhd2FpdCAoYXN5bmMgZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgIHJldHVybmVkID0gKGF3YWl0IHRhc2soLi4uYXJncykpO1xuXHQgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXR1cm5lZCk7XG5cdCAgICAgICAgICB9O1xuXHQgICAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuXHQgICAgICAgICAgZXJyb3IgPSBlcnJvcjE7XG5cdCAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyb3IpO1xuXHQgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0pKCkpO1xuXHQgICAgICB0aGlzLl9ydW5uaW5nLS07XG5cdCAgICAgIHRoaXMuX3RyeVRvUnVuKCk7XG5cdCAgICAgIHJldHVybiBjYigpO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHNjaGVkdWxlKHRhc2ssIC4uLmFyZ3MpIHtcblx0ICAgIHZhciBwcm9taXNlLCByZWplY3QsIHJlc29sdmU7XG5cdCAgICByZXNvbHZlID0gcmVqZWN0ID0gbnVsbDtcblx0ICAgIHByb21pc2UgPSBuZXcgdGhpcy5Qcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG5cdCAgICAgIHJlc29sdmUgPSBfcmVzb2x2ZTtcblx0ICAgICAgcmV0dXJuIHJlamVjdCA9IF9yZWplY3Q7XG5cdCAgICB9KTtcblx0ICAgIHRoaXMuX3F1ZXVlLnB1c2goe3Rhc2ssIGFyZ3MsIHJlc29sdmUsIHJlamVjdH0pO1xuXHQgICAgdGhpcy5fdHJ5VG9SdW4oKTtcblx0ICAgIHJldHVybiBwcm9taXNlO1xuXHQgIH1cblxuXHR9O1xuXG5cdHZhciBTeW5jXzEgPSBTeW5jO1xuXG5cdHZhciB2ZXJzaW9uID0gXCIyLjE5LjVcIjtcblx0dmFyIHZlcnNpb24kMSA9IHtcblx0XHR2ZXJzaW9uOiB2ZXJzaW9uXG5cdH07XG5cblx0dmFyIHZlcnNpb24kMiA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcblx0XHR2ZXJzaW9uOiB2ZXJzaW9uLFxuXHRcdGRlZmF1bHQ6IHZlcnNpb24kMVxuXHR9KTtcblxuXHR2YXIgcmVxdWlyZSQkMiA9ICgpID0+IGNvbnNvbGUubG9nKCdZb3UgbXVzdCBpbXBvcnQgdGhlIGZ1bGwgdmVyc2lvbiBvZiBCb3R0bGVuZWNrIGluIG9yZGVyIHRvIHVzZSB0aGlzIGZlYXR1cmUuJyk7XG5cblx0dmFyIHJlcXVpcmUkJDMgPSAoKSA9PiBjb25zb2xlLmxvZygnWW91IG11c3QgaW1wb3J0IHRoZSBmdWxsIHZlcnNpb24gb2YgQm90dGxlbmVjayBpbiBvcmRlciB0byB1c2UgdGhpcyBmZWF0dXJlLicpO1xuXG5cdHZhciByZXF1aXJlJCQ0ID0gKCkgPT4gY29uc29sZS5sb2coJ1lvdSBtdXN0IGltcG9ydCB0aGUgZnVsbCB2ZXJzaW9uIG9mIEJvdHRsZW5lY2sgaW4gb3JkZXIgdG8gdXNlIHRoaXMgZmVhdHVyZS4nKTtcblxuXHR2YXIgRXZlbnRzJDIsIEdyb3VwLCBJT1JlZGlzQ29ubmVjdGlvbiQxLCBSZWRpc0Nvbm5lY3Rpb24kMSwgU2NyaXB0cyQxLCBwYXJzZXIkMztcblxuXHRwYXJzZXIkMyA9IHBhcnNlcjtcblxuXHRFdmVudHMkMiA9IEV2ZW50c18xO1xuXG5cdFJlZGlzQ29ubmVjdGlvbiQxID0gcmVxdWlyZSQkMjtcblxuXHRJT1JlZGlzQ29ubmVjdGlvbiQxID0gcmVxdWlyZSQkMztcblxuXHRTY3JpcHRzJDEgPSByZXF1aXJlJCQ0O1xuXG5cdEdyb3VwID0gKGZ1bmN0aW9uKCkge1xuXHQgIGNsYXNzIEdyb3VwIHtcblx0ICAgIGNvbnN0cnVjdG9yKGxpbWl0ZXJPcHRpb25zID0ge30pIHtcblx0ICAgICAgdGhpcy5kZWxldGVLZXkgPSB0aGlzLmRlbGV0ZUtleS5iaW5kKHRoaXMpO1xuXHQgICAgICB0aGlzLmxpbWl0ZXJPcHRpb25zID0gbGltaXRlck9wdGlvbnM7XG5cdCAgICAgIHBhcnNlciQzLmxvYWQodGhpcy5saW1pdGVyT3B0aW9ucywgdGhpcy5kZWZhdWx0cywgdGhpcyk7XG5cdCAgICAgIHRoaXMuRXZlbnRzID0gbmV3IEV2ZW50cyQyKHRoaXMpO1xuXHQgICAgICB0aGlzLmluc3RhbmNlcyA9IHt9O1xuXHQgICAgICB0aGlzLkJvdHRsZW5lY2sgPSBCb3R0bGVuZWNrXzE7XG5cdCAgICAgIHRoaXMuX3N0YXJ0QXV0b0NsZWFudXAoKTtcblx0ICAgICAgdGhpcy5zaGFyZWRDb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9uICE9IG51bGw7XG5cdCAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24gPT0gbnVsbCkge1xuXHQgICAgICAgIGlmICh0aGlzLmxpbWl0ZXJPcHRpb25zLmRhdGFzdG9yZSA9PT0gXCJyZWRpc1wiKSB7XG5cdCAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBuZXcgUmVkaXNDb25uZWN0aW9uJDEoT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5saW1pdGVyT3B0aW9ucywge0V2ZW50czogdGhpcy5FdmVudHN9KSk7XG5cdCAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxpbWl0ZXJPcHRpb25zLmRhdGFzdG9yZSA9PT0gXCJpb3JlZGlzXCIpIHtcblx0ICAgICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IG5ldyBJT1JlZGlzQ29ubmVjdGlvbiQxKE9iamVjdC5hc3NpZ24oe30sIHRoaXMubGltaXRlck9wdGlvbnMsIHtFdmVudHM6IHRoaXMuRXZlbnRzfSkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICBrZXkoa2V5ID0gXCJcIikge1xuXHQgICAgICB2YXIgcmVmO1xuXHQgICAgICByZXR1cm4gKHJlZiA9IHRoaXMuaW5zdGFuY2VzW2tleV0pICE9IG51bGwgPyByZWYgOiAoKCkgPT4ge1xuXHQgICAgICAgIHZhciBsaW1pdGVyO1xuXHQgICAgICAgIGxpbWl0ZXIgPSB0aGlzLmluc3RhbmNlc1trZXldID0gbmV3IHRoaXMuQm90dGxlbmVjayhPYmplY3QuYXNzaWduKHRoaXMubGltaXRlck9wdGlvbnMsIHtcblx0ICAgICAgICAgIGlkOiBgJHt0aGlzLmlkfS0ke2tleX1gLFxuXHQgICAgICAgICAgdGltZW91dDogdGhpcy50aW1lb3V0LFxuXHQgICAgICAgICAgY29ubmVjdGlvbjogdGhpcy5jb25uZWN0aW9uXG5cdCAgICAgICAgfSkpO1xuXHQgICAgICAgIHRoaXMuRXZlbnRzLnRyaWdnZXIoXCJjcmVhdGVkXCIsIGxpbWl0ZXIsIGtleSk7XG5cdCAgICAgICAgcmV0dXJuIGxpbWl0ZXI7XG5cdCAgICAgIH0pKCk7XG5cdCAgICB9XG5cblx0ICAgIGFzeW5jIGRlbGV0ZUtleShrZXkgPSBcIlwiKSB7XG5cdCAgICAgIHZhciBkZWxldGVkLCBpbnN0YW5jZTtcblx0ICAgICAgaW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlc1trZXldO1xuXHQgICAgICBpZiAodGhpcy5jb25uZWN0aW9uKSB7XG5cdCAgICAgICAgZGVsZXRlZCA9IChhd2FpdCB0aGlzLmNvbm5lY3Rpb24uX19ydW5Db21tYW5kX18oWydkZWwnLCAuLi5TY3JpcHRzJDEuYWxsS2V5cyhgJHt0aGlzLmlkfS0ke2tleX1gKV0pKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoaW5zdGFuY2UgIT0gbnVsbCkge1xuXHQgICAgICAgIGRlbGV0ZSB0aGlzLmluc3RhbmNlc1trZXldO1xuXHQgICAgICAgIGF3YWl0IGluc3RhbmNlLmRpc2Nvbm5lY3QoKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gKGluc3RhbmNlICE9IG51bGwpIHx8IGRlbGV0ZWQgPiAwO1xuXHQgICAgfVxuXG5cdCAgICBsaW1pdGVycygpIHtcblx0ICAgICAgdmFyIGssIHJlZiwgcmVzdWx0cywgdjtcblx0ICAgICAgcmVmID0gdGhpcy5pbnN0YW5jZXM7XG5cdCAgICAgIHJlc3VsdHMgPSBbXTtcblx0ICAgICAgZm9yIChrIGluIHJlZikge1xuXHQgICAgICAgIHYgPSByZWZba107XG5cdCAgICAgICAgcmVzdWx0cy5wdXNoKHtcblx0ICAgICAgICAgIGtleTogayxcblx0ICAgICAgICAgIGxpbWl0ZXI6IHZcblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gcmVzdWx0cztcblx0ICAgIH1cblxuXHQgICAga2V5cygpIHtcblx0ICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuaW5zdGFuY2VzKTtcblx0ICAgIH1cblxuXHQgICAgYXN5bmMgY2x1c3RlcktleXMoKSB7XG5cdCAgICAgIHZhciBjdXJzb3IsIGVuZCwgZm91bmQsIGksIGssIGtleXMsIGxlbiwgbmV4dCwgc3RhcnQ7XG5cdCAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24gPT0gbnVsbCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLlByb21pc2UucmVzb2x2ZSh0aGlzLmtleXMoKSk7XG5cdCAgICAgIH1cblx0ICAgICAga2V5cyA9IFtdO1xuXHQgICAgICBjdXJzb3IgPSBudWxsO1xuXHQgICAgICBzdGFydCA9IGBiXyR7dGhpcy5pZH0tYC5sZW5ndGg7XG5cdCAgICAgIGVuZCA9IFwiX3NldHRpbmdzXCIubGVuZ3RoO1xuXHQgICAgICB3aGlsZSAoY3Vyc29yICE9PSAwKSB7XG5cdCAgICAgICAgW25leHQsIGZvdW5kXSA9IChhd2FpdCB0aGlzLmNvbm5lY3Rpb24uX19ydW5Db21tYW5kX18oW1wic2NhblwiLCBjdXJzb3IgIT0gbnVsbCA/IGN1cnNvciA6IDAsIFwibWF0Y2hcIiwgYGJfJHt0aGlzLmlkfS0qX3NldHRpbmdzYCwgXCJjb3VudFwiLCAxMDAwMF0pKTtcblx0ICAgICAgICBjdXJzb3IgPSB+fm5leHQ7XG5cdCAgICAgICAgZm9yIChpID0gMCwgbGVuID0gZm91bmQubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICAgIGsgPSBmb3VuZFtpXTtcblx0ICAgICAgICAgIGtleXMucHVzaChrLnNsaWNlKHN0YXJ0LCAtZW5kKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBrZXlzO1xuXHQgICAgfVxuXG5cdCAgICBfc3RhcnRBdXRvQ2xlYW51cCgpIHtcblx0ICAgICAgdmFyIGJhc2U7XG5cdCAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCk7XG5cdCAgICAgIHJldHVybiB0eXBlb2YgKGJhc2UgPSAodGhpcy5pbnRlcnZhbCA9IHNldEludGVydmFsKGFzeW5jKCkgPT4ge1xuXHQgICAgICAgIHZhciBlLCBrLCByZWYsIHJlc3VsdHMsIHRpbWUsIHY7XG5cdCAgICAgICAgdGltZSA9IERhdGUubm93KCk7XG5cdCAgICAgICAgcmVmID0gdGhpcy5pbnN0YW5jZXM7XG5cdCAgICAgICAgcmVzdWx0cyA9IFtdO1xuXHQgICAgICAgIGZvciAoayBpbiByZWYpIHtcblx0ICAgICAgICAgIHYgPSByZWZba107XG5cdCAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICBpZiAoKGF3YWl0IHYuX3N0b3JlLl9fZ3JvdXBDaGVja19fKHRpbWUpKSkge1xuXHQgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLmRlbGV0ZUtleShrKSk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHZvaWQgMCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG5cdCAgICAgICAgICAgIGUgPSBlcnJvcjtcblx0ICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHYuRXZlbnRzLnRyaWdnZXIoXCJlcnJvclwiLCBlKSk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiByZXN1bHRzO1xuXHQgICAgICB9LCB0aGlzLnRpbWVvdXQgLyAyKSkpLnVucmVmID09PSBcImZ1bmN0aW9uXCIgPyBiYXNlLnVucmVmKCkgOiB2b2lkIDA7XG5cdCAgICB9XG5cblx0ICAgIHVwZGF0ZVNldHRpbmdzKG9wdGlvbnMgPSB7fSkge1xuXHQgICAgICBwYXJzZXIkMy5vdmVyd3JpdGUob3B0aW9ucywgdGhpcy5kZWZhdWx0cywgdGhpcyk7XG5cdCAgICAgIHBhcnNlciQzLm92ZXJ3cml0ZShvcHRpb25zLCBvcHRpb25zLCB0aGlzLmxpbWl0ZXJPcHRpb25zKTtcblx0ICAgICAgaWYgKG9wdGlvbnMudGltZW91dCAhPSBudWxsKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0QXV0b0NsZWFudXAoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICBkaXNjb25uZWN0KGZsdXNoID0gdHJ1ZSkge1xuXHQgICAgICB2YXIgcmVmO1xuXHQgICAgICBpZiAoIXRoaXMuc2hhcmVkQ29ubmVjdGlvbikge1xuXHQgICAgICAgIHJldHVybiAocmVmID0gdGhpcy5jb25uZWN0aW9uKSAhPSBudWxsID8gcmVmLmRpc2Nvbm5lY3QoZmx1c2gpIDogdm9pZCAwO1xuXHQgICAgICB9XG5cdCAgICB9XG5cblx0ICB9XG5cdCAgR3JvdXAucHJvdG90eXBlLmRlZmF1bHRzID0ge1xuXHQgICAgdGltZW91dDogMTAwMCAqIDYwICogNSxcblx0ICAgIGNvbm5lY3Rpb246IG51bGwsXG5cdCAgICBQcm9taXNlOiBQcm9taXNlLFxuXHQgICAgaWQ6IFwiZ3JvdXAta2V5XCJcblx0ICB9O1xuXG5cdCAgcmV0dXJuIEdyb3VwO1xuXG5cdH0pLmNhbGwoY29tbW9uanNHbG9iYWwpO1xuXG5cdHZhciBHcm91cF8xID0gR3JvdXA7XG5cblx0dmFyIEJhdGNoZXIsIEV2ZW50cyQzLCBwYXJzZXIkNDtcblxuXHRwYXJzZXIkNCA9IHBhcnNlcjtcblxuXHRFdmVudHMkMyA9IEV2ZW50c18xO1xuXG5cdEJhdGNoZXIgPSAoZnVuY3Rpb24oKSB7XG5cdCAgY2xhc3MgQmF0Y2hlciB7XG5cdCAgICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcblx0ICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0ICAgICAgcGFyc2VyJDQubG9hZCh0aGlzLm9wdGlvbnMsIHRoaXMuZGVmYXVsdHMsIHRoaXMpO1xuXHQgICAgICB0aGlzLkV2ZW50cyA9IG5ldyBFdmVudHMkMyh0aGlzKTtcblx0ICAgICAgdGhpcy5fYXJyID0gW107XG5cdCAgICAgIHRoaXMuX3Jlc2V0UHJvbWlzZSgpO1xuXHQgICAgICB0aGlzLl9sYXN0Rmx1c2ggPSBEYXRlLm5vdygpO1xuXHQgICAgfVxuXG5cdCAgICBfcmVzZXRQcm9taXNlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fcHJvbWlzZSA9IG5ldyB0aGlzLlByb21pc2UoKHJlcywgcmVqKSA9PiB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdmUgPSByZXM7XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXG5cdCAgICBfZmx1c2goKSB7XG5cdCAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcblx0ICAgICAgdGhpcy5fbGFzdEZsdXNoID0gRGF0ZS5ub3coKTtcblx0ICAgICAgdGhpcy5fcmVzb2x2ZSgpO1xuXHQgICAgICB0aGlzLkV2ZW50cy50cmlnZ2VyKFwiYmF0Y2hcIiwgdGhpcy5fYXJyKTtcblx0ICAgICAgdGhpcy5fYXJyID0gW107XG5cdCAgICAgIHJldHVybiB0aGlzLl9yZXNldFByb21pc2UoKTtcblx0ICAgIH1cblxuXHQgICAgYWRkKGRhdGEpIHtcblx0ICAgICAgdmFyIHJldDtcblx0ICAgICAgdGhpcy5fYXJyLnB1c2goZGF0YSk7XG5cdCAgICAgIHJldCA9IHRoaXMuX3Byb21pc2U7XG5cdCAgICAgIGlmICh0aGlzLl9hcnIubGVuZ3RoID09PSB0aGlzLm1heFNpemUpIHtcblx0ICAgICAgICB0aGlzLl9mbHVzaCgpO1xuXHQgICAgICB9IGVsc2UgaWYgKCh0aGlzLm1heFRpbWUgIT0gbnVsbCkgJiYgdGhpcy5fYXJyLmxlbmd0aCA9PT0gMSkge1xuXHQgICAgICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0ICAgICAgICAgIHJldHVybiB0aGlzLl9mbHVzaCgpO1xuXHQgICAgICAgIH0sIHRoaXMubWF4VGltZSk7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIHJldDtcblx0ICAgIH1cblxuXHQgIH1cblx0ICBCYXRjaGVyLnByb3RvdHlwZS5kZWZhdWx0cyA9IHtcblx0ICAgIG1heFRpbWU6IG51bGwsXG5cdCAgICBtYXhTaXplOiBudWxsLFxuXHQgICAgUHJvbWlzZTogUHJvbWlzZVxuXHQgIH07XG5cblx0ICByZXR1cm4gQmF0Y2hlcjtcblxuXHR9KS5jYWxsKGNvbW1vbmpzR2xvYmFsKTtcblxuXHR2YXIgQmF0Y2hlcl8xID0gQmF0Y2hlcjtcblxuXHR2YXIgcmVxdWlyZSQkNCQxID0gKCkgPT4gY29uc29sZS5sb2coJ1lvdSBtdXN0IGltcG9ydCB0aGUgZnVsbCB2ZXJzaW9uIG9mIEJvdHRsZW5lY2sgaW4gb3JkZXIgdG8gdXNlIHRoaXMgZmVhdHVyZS4nKTtcblxuXHR2YXIgcmVxdWlyZSQkOCA9IGdldENqc0V4cG9ydEZyb21OYW1lc3BhY2UodmVyc2lvbiQyKTtcblxuXHR2YXIgQm90dGxlbmVjaywgREVGQVVMVF9QUklPUklUWSQxLCBFdmVudHMkNCwgSm9iJDEsIExvY2FsRGF0YXN0b3JlJDEsIE5VTV9QUklPUklUSUVTJDEsIFF1ZXVlcyQxLCBSZWRpc0RhdGFzdG9yZSQxLCBTdGF0ZXMkMSwgU3luYyQxLCBwYXJzZXIkNSxcblx0ICBzcGxpY2UgPSBbXS5zcGxpY2U7XG5cblx0TlVNX1BSSU9SSVRJRVMkMSA9IDEwO1xuXG5cdERFRkFVTFRfUFJJT1JJVFkkMSA9IDU7XG5cblx0cGFyc2VyJDUgPSBwYXJzZXI7XG5cblx0UXVldWVzJDEgPSBRdWV1ZXNfMTtcblxuXHRKb2IkMSA9IEpvYl8xO1xuXG5cdExvY2FsRGF0YXN0b3JlJDEgPSBMb2NhbERhdGFzdG9yZV8xO1xuXG5cdFJlZGlzRGF0YXN0b3JlJDEgPSByZXF1aXJlJCQ0JDE7XG5cblx0RXZlbnRzJDQgPSBFdmVudHNfMTtcblxuXHRTdGF0ZXMkMSA9IFN0YXRlc18xO1xuXG5cdFN5bmMkMSA9IFN5bmNfMTtcblxuXHRCb3R0bGVuZWNrID0gKGZ1bmN0aW9uKCkge1xuXHQgIGNsYXNzIEJvdHRsZW5lY2sge1xuXHQgICAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9LCAuLi5pbnZhbGlkKSB7XG5cdCAgICAgIHZhciBzdG9yZUluc3RhbmNlT3B0aW9ucywgc3RvcmVPcHRpb25zO1xuXHQgICAgICB0aGlzLl9hZGRUb1F1ZXVlID0gdGhpcy5fYWRkVG9RdWV1ZS5iaW5kKHRoaXMpO1xuXHQgICAgICB0aGlzLl92YWxpZGF0ZU9wdGlvbnMob3B0aW9ucywgaW52YWxpZCk7XG5cdCAgICAgIHBhcnNlciQ1LmxvYWQob3B0aW9ucywgdGhpcy5pbnN0YW5jZURlZmF1bHRzLCB0aGlzKTtcblx0ICAgICAgdGhpcy5fcXVldWVzID0gbmV3IFF1ZXVlcyQxKE5VTV9QUklPUklUSUVTJDEpO1xuXHQgICAgICB0aGlzLl9zY2hlZHVsZWQgPSB7fTtcblx0ICAgICAgdGhpcy5fc3RhdGVzID0gbmV3IFN0YXRlcyQxKFtcIlJFQ0VJVkVEXCIsIFwiUVVFVUVEXCIsIFwiUlVOTklOR1wiLCBcIkVYRUNVVElOR1wiXS5jb25jYXQodGhpcy50cmFja0RvbmVTdGF0dXMgPyBbXCJET05FXCJdIDogW10pKTtcblx0ICAgICAgdGhpcy5fbGltaXRlciA9IG51bGw7XG5cdCAgICAgIHRoaXMuRXZlbnRzID0gbmV3IEV2ZW50cyQ0KHRoaXMpO1xuXHQgICAgICB0aGlzLl9zdWJtaXRMb2NrID0gbmV3IFN5bmMkMShcInN1Ym1pdFwiLCB0aGlzLlByb21pc2UpO1xuXHQgICAgICB0aGlzLl9yZWdpc3RlckxvY2sgPSBuZXcgU3luYyQxKFwicmVnaXN0ZXJcIiwgdGhpcy5Qcm9taXNlKTtcblx0ICAgICAgc3RvcmVPcHRpb25zID0gcGFyc2VyJDUubG9hZChvcHRpb25zLCB0aGlzLnN0b3JlRGVmYXVsdHMsIHt9KTtcblx0ICAgICAgdGhpcy5fc3RvcmUgPSAoZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuZGF0YXN0b3JlID09PSBcInJlZGlzXCIgfHwgdGhpcy5kYXRhc3RvcmUgPT09IFwiaW9yZWRpc1wiIHx8ICh0aGlzLmNvbm5lY3Rpb24gIT0gbnVsbCkpIHtcblx0ICAgICAgICAgIHN0b3JlSW5zdGFuY2VPcHRpb25zID0gcGFyc2VyJDUubG9hZChvcHRpb25zLCB0aGlzLnJlZGlzU3RvcmVEZWZhdWx0cywge30pO1xuXHQgICAgICAgICAgcmV0dXJuIG5ldyBSZWRpc0RhdGFzdG9yZSQxKHRoaXMsIHN0b3JlT3B0aW9ucywgc3RvcmVJbnN0YW5jZU9wdGlvbnMpO1xuXHQgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhc3RvcmUgPT09IFwibG9jYWxcIikge1xuXHQgICAgICAgICAgc3RvcmVJbnN0YW5jZU9wdGlvbnMgPSBwYXJzZXIkNS5sb2FkKG9wdGlvbnMsIHRoaXMubG9jYWxTdG9yZURlZmF1bHRzLCB7fSk7XG5cdCAgICAgICAgICByZXR1cm4gbmV3IExvY2FsRGF0YXN0b3JlJDEodGhpcywgc3RvcmVPcHRpb25zLCBzdG9yZUluc3RhbmNlT3B0aW9ucyk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRocm93IG5ldyBCb3R0bGVuZWNrLnByb3RvdHlwZS5Cb3R0bGVuZWNrRXJyb3IoYEludmFsaWQgZGF0YXN0b3JlIHR5cGU6ICR7dGhpcy5kYXRhc3RvcmV9YCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9KS5jYWxsKHRoaXMpO1xuXHQgICAgICB0aGlzLl9xdWV1ZXMub24oXCJsZWZ0emVyb1wiLCAoKSA9PiB7XG5cdCAgICAgICAgdmFyIHJlZjtcblx0ICAgICAgICByZXR1cm4gKHJlZiA9IHRoaXMuX3N0b3JlLmhlYXJ0YmVhdCkgIT0gbnVsbCA/IHR5cGVvZiByZWYucmVmID09PSBcImZ1bmN0aW9uXCIgPyByZWYucmVmKCkgOiB2b2lkIDAgOiB2b2lkIDA7XG5cdCAgICAgIH0pO1xuXHQgICAgICB0aGlzLl9xdWV1ZXMub24oXCJ6ZXJvXCIsICgpID0+IHtcblx0ICAgICAgICB2YXIgcmVmO1xuXHQgICAgICAgIHJldHVybiAocmVmID0gdGhpcy5fc3RvcmUuaGVhcnRiZWF0KSAhPSBudWxsID8gdHlwZW9mIHJlZi51bnJlZiA9PT0gXCJmdW5jdGlvblwiID8gcmVmLnVucmVmKCkgOiB2b2lkIDAgOiB2b2lkIDA7XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXG5cdCAgICBfdmFsaWRhdGVPcHRpb25zKG9wdGlvbnMsIGludmFsaWQpIHtcblx0ICAgICAgaWYgKCEoKG9wdGlvbnMgIT0gbnVsbCkgJiYgdHlwZW9mIG9wdGlvbnMgPT09IFwib2JqZWN0XCIgJiYgaW52YWxpZC5sZW5ndGggPT09IDApKSB7XG5cdCAgICAgICAgdGhyb3cgbmV3IEJvdHRsZW5lY2sucHJvdG90eXBlLkJvdHRsZW5lY2tFcnJvcihcIkJvdHRsZW5lY2sgdjIgdGFrZXMgYSBzaW5nbGUgb2JqZWN0IGFyZ3VtZW50LiBSZWZlciB0byBodHRwczovL2dpdGh1Yi5jb20vU0dyb25kaW4vYm90dGxlbmVjayN1cGdyYWRpbmctdG8tdjIgaWYgeW91J3JlIHVwZ3JhZGluZyBmcm9tIEJvdHRsZW5lY2sgdjEuXCIpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIHJlYWR5KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc3RvcmUucmVhZHk7XG5cdCAgICB9XG5cblx0ICAgIGNsaWVudHMoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9zdG9yZS5jbGllbnRzO1xuXHQgICAgfVxuXG5cdCAgICBjaGFubmVsKCkge1xuXHQgICAgICByZXR1cm4gYGJfJHt0aGlzLmlkfWA7XG5cdCAgICB9XG5cblx0ICAgIGNoYW5uZWxfY2xpZW50KCkge1xuXHQgICAgICByZXR1cm4gYGJfJHt0aGlzLmlkfV8ke3RoaXMuX3N0b3JlLmNsaWVudElkfWA7XG5cdCAgICB9XG5cblx0ICAgIHB1Ymxpc2gobWVzc2FnZSkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc3RvcmUuX19wdWJsaXNoX18obWVzc2FnZSk7XG5cdCAgICB9XG5cblx0ICAgIGRpc2Nvbm5lY3QoZmx1c2ggPSB0cnVlKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9zdG9yZS5fX2Rpc2Nvbm5lY3RfXyhmbHVzaCk7XG5cdCAgICB9XG5cblx0ICAgIGNoYWluKF9saW1pdGVyKSB7XG5cdCAgICAgIHRoaXMuX2xpbWl0ZXIgPSBfbGltaXRlcjtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cblx0ICAgIHF1ZXVlZChwcmlvcml0eSkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fcXVldWVzLnF1ZXVlZChwcmlvcml0eSk7XG5cdCAgICB9XG5cblx0ICAgIGNsdXN0ZXJRdWV1ZWQoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9zdG9yZS5fX3F1ZXVlZF9fKCk7XG5cdCAgICB9XG5cblx0ICAgIGVtcHR5KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5xdWV1ZWQoKSA9PT0gMCAmJiB0aGlzLl9zdWJtaXRMb2NrLmlzRW1wdHkoKTtcblx0ICAgIH1cblxuXHQgICAgcnVubmluZygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3N0b3JlLl9fcnVubmluZ19fKCk7XG5cdCAgICB9XG5cblx0ICAgIGRvbmUoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9zdG9yZS5fX2RvbmVfXygpO1xuXHQgICAgfVxuXG5cdCAgICBqb2JTdGF0dXMoaWQpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlcy5qb2JTdGF0dXMoaWQpO1xuXHQgICAgfVxuXG5cdCAgICBqb2JzKHN0YXR1cykge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc3RhdGVzLnN0YXR1c0pvYnMoc3RhdHVzKTtcblx0ICAgIH1cblxuXHQgICAgY291bnRzKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc3RhdGVzLnN0YXR1c0NvdW50cygpO1xuXHQgICAgfVxuXG5cdCAgICBfcmFuZG9tSW5kZXgoKSB7XG5cdCAgICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtcblx0ICAgIH1cblxuXHQgICAgY2hlY2sod2VpZ2h0ID0gMSkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc3RvcmUuX19jaGVja19fKHdlaWdodCk7XG5cdCAgICB9XG5cblx0ICAgIF9jbGVhckdsb2JhbFN0YXRlKGluZGV4KSB7XG5cdCAgICAgIGlmICh0aGlzLl9zY2hlZHVsZWRbaW5kZXhdICE9IG51bGwpIHtcblx0ICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fc2NoZWR1bGVkW2luZGV4XS5leHBpcmF0aW9uKTtcblx0ICAgICAgICBkZWxldGUgdGhpcy5fc2NoZWR1bGVkW2luZGV4XTtcblx0ICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgYXN5bmMgX2ZyZWUoaW5kZXgsIGpvYiwgb3B0aW9ucywgZXZlbnRJbmZvKSB7XG5cdCAgICAgIHZhciBlLCBydW5uaW5nO1xuXHQgICAgICB0cnkge1xuXHQgICAgICAgICh7cnVubmluZ30gPSAoYXdhaXQgdGhpcy5fc3RvcmUuX19mcmVlX18oaW5kZXgsIG9wdGlvbnMud2VpZ2h0KSkpO1xuXHQgICAgICAgIHRoaXMuRXZlbnRzLnRyaWdnZXIoXCJkZWJ1Z1wiLCBgRnJlZWQgJHtvcHRpb25zLmlkfWAsIGV2ZW50SW5mbyk7XG5cdCAgICAgICAgaWYgKHJ1bm5pbmcgPT09IDAgJiYgdGhpcy5lbXB0eSgpKSB7XG5cdCAgICAgICAgICByZXR1cm4gdGhpcy5FdmVudHMudHJpZ2dlcihcImlkbGVcIik7XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGNhdGNoIChlcnJvcjEpIHtcblx0ICAgICAgICBlID0gZXJyb3IxO1xuXHQgICAgICAgIHJldHVybiB0aGlzLkV2ZW50cy50cmlnZ2VyKFwiZXJyb3JcIiwgZSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgX3J1bihpbmRleCwgam9iLCB3YWl0KSB7XG5cdCAgICAgIHZhciBjbGVhckdsb2JhbFN0YXRlLCBmcmVlLCBydW47XG5cdCAgICAgIGpvYi5kb1J1bigpO1xuXHQgICAgICBjbGVhckdsb2JhbFN0YXRlID0gdGhpcy5fY2xlYXJHbG9iYWxTdGF0ZS5iaW5kKHRoaXMsIGluZGV4KTtcblx0ICAgICAgcnVuID0gdGhpcy5fcnVuLmJpbmQodGhpcywgaW5kZXgsIGpvYik7XG5cdCAgICAgIGZyZWUgPSB0aGlzLl9mcmVlLmJpbmQodGhpcywgaW5kZXgsIGpvYik7XG5cdCAgICAgIHJldHVybiB0aGlzLl9zY2hlZHVsZWRbaW5kZXhdID0ge1xuXHQgICAgICAgIHRpbWVvdXQ6IHNldFRpbWVvdXQoKCkgPT4ge1xuXHQgICAgICAgICAgcmV0dXJuIGpvYi5kb0V4ZWN1dGUodGhpcy5fbGltaXRlciwgY2xlYXJHbG9iYWxTdGF0ZSwgcnVuLCBmcmVlKTtcblx0ICAgICAgICB9LCB3YWl0KSxcblx0ICAgICAgICBleHBpcmF0aW9uOiBqb2Iub3B0aW9ucy5leHBpcmF0aW9uICE9IG51bGwgPyBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgcmV0dXJuIGpvYi5kb0V4cGlyZShjbGVhckdsb2JhbFN0YXRlLCBydW4sIGZyZWUpO1xuXHQgICAgICAgIH0sIHdhaXQgKyBqb2Iub3B0aW9ucy5leHBpcmF0aW9uKSA6IHZvaWQgMCxcblx0ICAgICAgICBqb2I6IGpvYlxuXHQgICAgICB9O1xuXHQgICAgfVxuXG5cdCAgICBfZHJhaW5PbmUoY2FwYWNpdHkpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyTG9jay5zY2hlZHVsZSgoKSA9PiB7XG5cdCAgICAgICAgdmFyIGFyZ3MsIGluZGV4LCBuZXh0LCBvcHRpb25zLCBxdWV1ZTtcblx0ICAgICAgICBpZiAodGhpcy5xdWV1ZWQoKSA9PT0gMCkge1xuXHQgICAgICAgICAgcmV0dXJuIHRoaXMuUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBxdWV1ZSA9IHRoaXMuX3F1ZXVlcy5nZXRGaXJzdCgpO1xuXHQgICAgICAgICh7b3B0aW9ucywgYXJnc30gPSBuZXh0ID0gcXVldWUuZmlyc3QoKSk7XG5cdCAgICAgICAgaWYgKChjYXBhY2l0eSAhPSBudWxsKSAmJiBvcHRpb25zLndlaWdodCA+IGNhcGFjaXR5KSB7XG5cdCAgICAgICAgICByZXR1cm4gdGhpcy5Qcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuRXZlbnRzLnRyaWdnZXIoXCJkZWJ1Z1wiLCBgRHJhaW5pbmcgJHtvcHRpb25zLmlkfWAsIHthcmdzLCBvcHRpb25zfSk7XG5cdCAgICAgICAgaW5kZXggPSB0aGlzLl9yYW5kb21JbmRleCgpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9zdG9yZS5fX3JlZ2lzdGVyX18oaW5kZXgsIG9wdGlvbnMud2VpZ2h0LCBvcHRpb25zLmV4cGlyYXRpb24pLnRoZW4oKHtzdWNjZXNzLCB3YWl0LCByZXNlcnZvaXJ9KSA9PiB7XG5cdCAgICAgICAgICB2YXIgZW1wdHk7XG5cdCAgICAgICAgICB0aGlzLkV2ZW50cy50cmlnZ2VyKFwiZGVidWdcIiwgYERyYWluZWQgJHtvcHRpb25zLmlkfWAsIHtzdWNjZXNzLCBhcmdzLCBvcHRpb25zfSk7XG5cdCAgICAgICAgICBpZiAoc3VjY2Vzcykge1xuXHQgICAgICAgICAgICBxdWV1ZS5zaGlmdCgpO1xuXHQgICAgICAgICAgICBlbXB0eSA9IHRoaXMuZW1wdHkoKTtcblx0ICAgICAgICAgICAgaWYgKGVtcHR5KSB7XG5cdCAgICAgICAgICAgICAgdGhpcy5FdmVudHMudHJpZ2dlcihcImVtcHR5XCIpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChyZXNlcnZvaXIgPT09IDApIHtcblx0ICAgICAgICAgICAgICB0aGlzLkV2ZW50cy50cmlnZ2VyKFwiZGVwbGV0ZWRcIiwgZW1wdHkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuX3J1bihpbmRleCwgbmV4dCwgd2FpdCk7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLlByb21pc2UucmVzb2x2ZShvcHRpb25zLndlaWdodCk7XG5cdCAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5Qcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXG5cdCAgICBfZHJhaW5BbGwoY2FwYWNpdHksIHRvdGFsID0gMCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fZHJhaW5PbmUoY2FwYWNpdHkpLnRoZW4oKGRyYWluZWQpID0+IHtcblx0ICAgICAgICB2YXIgbmV3Q2FwYWNpdHk7XG5cdCAgICAgICAgaWYgKGRyYWluZWQgIT0gbnVsbCkge1xuXHQgICAgICAgICAgbmV3Q2FwYWNpdHkgPSBjYXBhY2l0eSAhPSBudWxsID8gY2FwYWNpdHkgLSBkcmFpbmVkIDogY2FwYWNpdHk7XG5cdCAgICAgICAgICByZXR1cm4gdGhpcy5fZHJhaW5BbGwobmV3Q2FwYWNpdHksIHRvdGFsICsgZHJhaW5lZCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHJldHVybiB0aGlzLlByb21pc2UucmVzb2x2ZSh0b3RhbCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuXHQgICAgICAgIHJldHVybiB0aGlzLkV2ZW50cy50cmlnZ2VyKFwiZXJyb3JcIiwgZSk7XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXG5cdCAgICBfZHJvcEFsbFF1ZXVlZChtZXNzYWdlKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9xdWV1ZXMuc2hpZnRBbGwoZnVuY3Rpb24oam9iKSB7XG5cdCAgICAgICAgcmV0dXJuIGpvYi5kb0Ryb3Aoe21lc3NhZ2V9KTtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cblx0ICAgIHN0b3Aob3B0aW9ucyA9IHt9KSB7XG5cdCAgICAgIHZhciBkb25lLCB3YWl0Rm9yRXhlY3V0aW5nO1xuXHQgICAgICBvcHRpb25zID0gcGFyc2VyJDUubG9hZChvcHRpb25zLCB0aGlzLnN0b3BEZWZhdWx0cyk7XG5cdCAgICAgIHdhaXRGb3JFeGVjdXRpbmcgPSAoYXQpID0+IHtcblx0ICAgICAgICB2YXIgZmluaXNoZWQ7XG5cdCAgICAgICAgZmluaXNoZWQgPSAoKSA9PiB7XG5cdCAgICAgICAgICB2YXIgY291bnRzO1xuXHQgICAgICAgICAgY291bnRzID0gdGhpcy5fc3RhdGVzLmNvdW50cztcblx0ICAgICAgICAgIHJldHVybiAoY291bnRzWzBdICsgY291bnRzWzFdICsgY291bnRzWzJdICsgY291bnRzWzNdKSA9PT0gYXQ7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICByZXR1cm4gbmV3IHRoaXMuUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdCAgICAgICAgICBpZiAoZmluaXNoZWQoKSkge1xuXHQgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMub24oXCJkb25lXCIsICgpID0+IHtcblx0ICAgICAgICAgICAgICBpZiAoZmluaXNoZWQoKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJkb25lXCIpO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcblx0ICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9O1xuXHQgICAgICBkb25lID0gb3B0aW9ucy5kcm9wV2FpdGluZ0pvYnMgPyAodGhpcy5fcnVuID0gZnVuY3Rpb24oaW5kZXgsIG5leHQpIHtcblx0ICAgICAgICByZXR1cm4gbmV4dC5kb0Ryb3Aoe1xuXHQgICAgICAgICAgbWVzc2FnZTogb3B0aW9ucy5kcm9wRXJyb3JNZXNzYWdlXG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0sIHRoaXMuX2RyYWluT25lID0gKCkgPT4ge1xuXHQgICAgICAgIHJldHVybiB0aGlzLlByb21pc2UucmVzb2x2ZShudWxsKTtcblx0ICAgICAgfSwgdGhpcy5fcmVnaXN0ZXJMb2NrLnNjaGVkdWxlKCgpID0+IHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fc3VibWl0TG9jay5zY2hlZHVsZSgoKSA9PiB7XG5cdCAgICAgICAgICB2YXIgaywgcmVmLCB2O1xuXHQgICAgICAgICAgcmVmID0gdGhpcy5fc2NoZWR1bGVkO1xuXHQgICAgICAgICAgZm9yIChrIGluIHJlZikge1xuXHQgICAgICAgICAgICB2ID0gcmVmW2tdO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5qb2JTdGF0dXModi5qb2Iub3B0aW9ucy5pZCkgPT09IFwiUlVOTklOR1wiKSB7XG5cdCAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHYudGltZW91dCk7XG5cdCAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHYuZXhwaXJhdGlvbik7XG5cdCAgICAgICAgICAgICAgdi5qb2IuZG9Ecm9wKHtcblx0ICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG9wdGlvbnMuZHJvcEVycm9yTWVzc2FnZVxuXHQgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB0aGlzLl9kcm9wQWxsUXVldWVkKG9wdGlvbnMuZHJvcEVycm9yTWVzc2FnZSk7XG5cdCAgICAgICAgICByZXR1cm4gd2FpdEZvckV4ZWN1dGluZygwKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgfSkpIDogdGhpcy5zY2hlZHVsZSh7XG5cdCAgICAgICAgcHJpb3JpdHk6IE5VTV9QUklPUklUSUVTJDEgLSAxLFxuXHQgICAgICAgIHdlaWdodDogMFxuXHQgICAgICB9LCAoKSA9PiB7XG5cdCAgICAgICAgcmV0dXJuIHdhaXRGb3JFeGVjdXRpbmcoMSk7XG5cdCAgICAgIH0pO1xuXHQgICAgICB0aGlzLl9yZWNlaXZlID0gZnVuY3Rpb24oam9iKSB7XG5cdCAgICAgICAgcmV0dXJuIGpvYi5fcmVqZWN0KG5ldyBCb3R0bGVuZWNrLnByb3RvdHlwZS5Cb3R0bGVuZWNrRXJyb3Iob3B0aW9ucy5lbnF1ZXVlRXJyb3JNZXNzYWdlKSk7XG5cdCAgICAgIH07XG5cdCAgICAgIHRoaXMuc3RvcCA9ICgpID0+IHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5Qcm9taXNlLnJlamVjdChuZXcgQm90dGxlbmVjay5wcm90b3R5cGUuQm90dGxlbmVja0Vycm9yKFwic3RvcCgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkXCIpKTtcblx0ICAgICAgfTtcblx0ICAgICAgcmV0dXJuIGRvbmU7XG5cdCAgICB9XG5cblx0ICAgIGFzeW5jIF9hZGRUb1F1ZXVlKGpvYikge1xuXHQgICAgICB2YXIgYXJncywgYmxvY2tlZCwgZXJyb3IsIG9wdGlvbnMsIHJlYWNoZWRIV00sIHNoaWZ0ZWQsIHN0cmF0ZWd5O1xuXHQgICAgICAoe2FyZ3MsIG9wdGlvbnN9ID0gam9iKTtcblx0ICAgICAgdHJ5IHtcblx0ICAgICAgICAoe3JlYWNoZWRIV00sIGJsb2NrZWQsIHN0cmF0ZWd5fSA9IChhd2FpdCB0aGlzLl9zdG9yZS5fX3N1Ym1pdF9fKHRoaXMucXVldWVkKCksIG9wdGlvbnMud2VpZ2h0KSkpO1xuXHQgICAgICB9IGNhdGNoIChlcnJvcjEpIHtcblx0ICAgICAgICBlcnJvciA9IGVycm9yMTtcblx0ICAgICAgICB0aGlzLkV2ZW50cy50cmlnZ2VyKFwiZGVidWdcIiwgYENvdWxkIG5vdCBxdWV1ZSAke29wdGlvbnMuaWR9YCwge2FyZ3MsIG9wdGlvbnMsIGVycm9yfSk7XG5cdCAgICAgICAgam9iLmRvRHJvcCh7ZXJyb3J9KTtcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKGJsb2NrZWQpIHtcblx0ICAgICAgICBqb2IuZG9Ecm9wKCk7XG5cdCAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgIH0gZWxzZSBpZiAocmVhY2hlZEhXTSkge1xuXHQgICAgICAgIHNoaWZ0ZWQgPSBzdHJhdGVneSA9PT0gQm90dGxlbmVjay5wcm90b3R5cGUuc3RyYXRlZ3kuTEVBSyA/IHRoaXMuX3F1ZXVlcy5zaGlmdExhc3RGcm9tKG9wdGlvbnMucHJpb3JpdHkpIDogc3RyYXRlZ3kgPT09IEJvdHRsZW5lY2sucHJvdG90eXBlLnN0cmF0ZWd5Lk9WRVJGTE9XX1BSSU9SSVRZID8gdGhpcy5fcXVldWVzLnNoaWZ0TGFzdEZyb20ob3B0aW9ucy5wcmlvcml0eSArIDEpIDogc3RyYXRlZ3kgPT09IEJvdHRsZW5lY2sucHJvdG90eXBlLnN0cmF0ZWd5Lk9WRVJGTE9XID8gam9iIDogdm9pZCAwO1xuXHQgICAgICAgIGlmIChzaGlmdGVkICE9IG51bGwpIHtcblx0ICAgICAgICAgIHNoaWZ0ZWQuZG9Ecm9wKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICgoc2hpZnRlZCA9PSBudWxsKSB8fCBzdHJhdGVneSA9PT0gQm90dGxlbmVjay5wcm90b3R5cGUuc3RyYXRlZ3kuT1ZFUkZMT1cpIHtcblx0ICAgICAgICAgIGlmIChzaGlmdGVkID09IG51bGwpIHtcblx0ICAgICAgICAgICAgam9iLmRvRHJvcCgpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgcmV0dXJuIHJlYWNoZWRIV007XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIGpvYi5kb1F1ZXVlKHJlYWNoZWRIV00sIGJsb2NrZWQpO1xuXHQgICAgICB0aGlzLl9xdWV1ZXMucHVzaChqb2IpO1xuXHQgICAgICBhd2FpdCB0aGlzLl9kcmFpbkFsbCgpO1xuXHQgICAgICByZXR1cm4gcmVhY2hlZEhXTTtcblx0ICAgIH1cblxuXHQgICAgX3JlY2VpdmUoam9iKSB7XG5cdCAgICAgIGlmICh0aGlzLl9zdGF0ZXMuam9iU3RhdHVzKGpvYi5vcHRpb25zLmlkKSAhPSBudWxsKSB7XG5cdCAgICAgICAgam9iLl9yZWplY3QobmV3IEJvdHRsZW5lY2sucHJvdG90eXBlLkJvdHRsZW5lY2tFcnJvcihgQSBqb2Igd2l0aCB0aGUgc2FtZSBpZCBhbHJlYWR5IGV4aXN0cyAoaWQ9JHtqb2Iub3B0aW9ucy5pZH0pYCkpO1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBqb2IuZG9SZWNlaXZlKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX3N1Ym1pdExvY2suc2NoZWR1bGUodGhpcy5fYWRkVG9RdWV1ZSwgam9iKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICBzdWJtaXQoLi4uYXJncykge1xuXHQgICAgICB2YXIgY2IsIGZuLCBqb2IsIG9wdGlvbnMsIHJlZiwgcmVmMSwgdGFzaztcblx0ICAgICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICAgICAgICByZWYgPSBhcmdzLCBbZm4sIC4uLmFyZ3NdID0gcmVmLCBbY2JdID0gc3BsaWNlLmNhbGwoYXJncywgLTEpO1xuXHQgICAgICAgIG9wdGlvbnMgPSBwYXJzZXIkNS5sb2FkKHt9LCB0aGlzLmpvYkRlZmF1bHRzKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICByZWYxID0gYXJncywgW29wdGlvbnMsIGZuLCAuLi5hcmdzXSA9IHJlZjEsIFtjYl0gPSBzcGxpY2UuY2FsbChhcmdzLCAtMSk7XG5cdCAgICAgICAgb3B0aW9ucyA9IHBhcnNlciQ1LmxvYWQob3B0aW9ucywgdGhpcy5qb2JEZWZhdWx0cyk7XG5cdCAgICAgIH1cblx0ICAgICAgdGFzayA9ICguLi5hcmdzKSA9PiB7XG5cdCAgICAgICAgcmV0dXJuIG5ldyB0aGlzLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdCAgICAgICAgICByZXR1cm4gZm4oLi4uYXJncywgZnVuY3Rpb24oLi4uYXJncykge1xuXHQgICAgICAgICAgICByZXR1cm4gKGFyZ3NbMF0gIT0gbnVsbCA/IHJlamVjdCA6IHJlc29sdmUpKGFyZ3MpO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH07XG5cdCAgICAgIGpvYiA9IG5ldyBKb2IkMSh0YXNrLCBhcmdzLCBvcHRpb25zLCB0aGlzLmpvYkRlZmF1bHRzLCB0aGlzLnJlamVjdE9uRHJvcCwgdGhpcy5FdmVudHMsIHRoaXMuX3N0YXRlcywgdGhpcy5Qcm9taXNlKTtcblx0ICAgICAgam9iLnByb21pc2UudGhlbihmdW5jdGlvbihhcmdzKSB7XG5cdCAgICAgICAgcmV0dXJuIHR5cGVvZiBjYiA9PT0gXCJmdW5jdGlvblwiID8gY2IoLi4uYXJncykgOiB2b2lkIDA7XG5cdCAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGFyZ3MpIHtcblx0ICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzKSkge1xuXHQgICAgICAgICAgcmV0dXJuIHR5cGVvZiBjYiA9PT0gXCJmdW5jdGlvblwiID8gY2IoLi4uYXJncykgOiB2b2lkIDA7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHJldHVybiB0eXBlb2YgY2IgPT09IFwiZnVuY3Rpb25cIiA/IGNiKGFyZ3MpIDogdm9pZCAwO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiB0aGlzLl9yZWNlaXZlKGpvYik7XG5cdCAgICB9XG5cblx0ICAgIHNjaGVkdWxlKC4uLmFyZ3MpIHtcblx0ICAgICAgdmFyIGpvYiwgb3B0aW9ucywgdGFzaztcblx0ICAgICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICAgICAgICBbdGFzaywgLi4uYXJnc10gPSBhcmdzO1xuXHQgICAgICAgIG9wdGlvbnMgPSB7fTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBbb3B0aW9ucywgdGFzaywgLi4uYXJnc10gPSBhcmdzO1xuXHQgICAgICB9XG5cdCAgICAgIGpvYiA9IG5ldyBKb2IkMSh0YXNrLCBhcmdzLCBvcHRpb25zLCB0aGlzLmpvYkRlZmF1bHRzLCB0aGlzLnJlamVjdE9uRHJvcCwgdGhpcy5FdmVudHMsIHRoaXMuX3N0YXRlcywgdGhpcy5Qcm9taXNlKTtcblx0ICAgICAgdGhpcy5fcmVjZWl2ZShqb2IpO1xuXHQgICAgICByZXR1cm4gam9iLnByb21pc2U7XG5cdCAgICB9XG5cblx0ICAgIHdyYXAoZm4pIHtcblx0ICAgICAgdmFyIHNjaGVkdWxlLCB3cmFwcGVkO1xuXHQgICAgICBzY2hlZHVsZSA9IHRoaXMuc2NoZWR1bGUuYmluZCh0aGlzKTtcblx0ICAgICAgd3JhcHBlZCA9IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcblx0ICAgICAgICByZXR1cm4gc2NoZWR1bGUoZm4uYmluZCh0aGlzKSwgLi4uYXJncyk7XG5cdCAgICAgIH07XG5cdCAgICAgIHdyYXBwZWQud2l0aE9wdGlvbnMgPSBmdW5jdGlvbihvcHRpb25zLCAuLi5hcmdzKSB7XG5cdCAgICAgICAgcmV0dXJuIHNjaGVkdWxlKG9wdGlvbnMsIGZuLCAuLi5hcmdzKTtcblx0ICAgICAgfTtcblx0ICAgICAgcmV0dXJuIHdyYXBwZWQ7XG5cdCAgICB9XG5cblx0ICAgIGFzeW5jIHVwZGF0ZVNldHRpbmdzKG9wdGlvbnMgPSB7fSkge1xuXHQgICAgICBhd2FpdCB0aGlzLl9zdG9yZS5fX3VwZGF0ZVNldHRpbmdzX18ocGFyc2VyJDUub3ZlcndyaXRlKG9wdGlvbnMsIHRoaXMuc3RvcmVEZWZhdWx0cykpO1xuXHQgICAgICBwYXJzZXIkNS5vdmVyd3JpdGUob3B0aW9ucywgdGhpcy5pbnN0YW5jZURlZmF1bHRzLCB0aGlzKTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cblx0ICAgIGN1cnJlbnRSZXNlcnZvaXIoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9zdG9yZS5fX2N1cnJlbnRSZXNlcnZvaXJfXygpO1xuXHQgICAgfVxuXG5cdCAgICBpbmNyZW1lbnRSZXNlcnZvaXIoaW5jciA9IDApIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3N0b3JlLl9faW5jcmVtZW50UmVzZXJ2b2lyX18oaW5jcik7XG5cdCAgICB9XG5cblx0ICB9XG5cdCAgQm90dGxlbmVjay5kZWZhdWx0ID0gQm90dGxlbmVjaztcblxuXHQgIEJvdHRsZW5lY2suRXZlbnRzID0gRXZlbnRzJDQ7XG5cblx0ICBCb3R0bGVuZWNrLnZlcnNpb24gPSBCb3R0bGVuZWNrLnByb3RvdHlwZS52ZXJzaW9uID0gcmVxdWlyZSQkOC52ZXJzaW9uO1xuXG5cdCAgQm90dGxlbmVjay5zdHJhdGVneSA9IEJvdHRsZW5lY2sucHJvdG90eXBlLnN0cmF0ZWd5ID0ge1xuXHQgICAgTEVBSzogMSxcblx0ICAgIE9WRVJGTE9XOiAyLFxuXHQgICAgT1ZFUkZMT1dfUFJJT1JJVFk6IDQsXG5cdCAgICBCTE9DSzogM1xuXHQgIH07XG5cblx0ICBCb3R0bGVuZWNrLkJvdHRsZW5lY2tFcnJvciA9IEJvdHRsZW5lY2sucHJvdG90eXBlLkJvdHRsZW5lY2tFcnJvciA9IEJvdHRsZW5lY2tFcnJvcl8xO1xuXG5cdCAgQm90dGxlbmVjay5Hcm91cCA9IEJvdHRsZW5lY2sucHJvdG90eXBlLkdyb3VwID0gR3JvdXBfMTtcblxuXHQgIEJvdHRsZW5lY2suUmVkaXNDb25uZWN0aW9uID0gQm90dGxlbmVjay5wcm90b3R5cGUuUmVkaXNDb25uZWN0aW9uID0gcmVxdWlyZSQkMjtcblxuXHQgIEJvdHRsZW5lY2suSU9SZWRpc0Nvbm5lY3Rpb24gPSBCb3R0bGVuZWNrLnByb3RvdHlwZS5JT1JlZGlzQ29ubmVjdGlvbiA9IHJlcXVpcmUkJDM7XG5cblx0ICBCb3R0bGVuZWNrLkJhdGNoZXIgPSBCb3R0bGVuZWNrLnByb3RvdHlwZS5CYXRjaGVyID0gQmF0Y2hlcl8xO1xuXG5cdCAgQm90dGxlbmVjay5wcm90b3R5cGUuam9iRGVmYXVsdHMgPSB7XG5cdCAgICBwcmlvcml0eTogREVGQVVMVF9QUklPUklUWSQxLFxuXHQgICAgd2VpZ2h0OiAxLFxuXHQgICAgZXhwaXJhdGlvbjogbnVsbCxcblx0ICAgIGlkOiBcIjxuby1pZD5cIlxuXHQgIH07XG5cblx0ICBCb3R0bGVuZWNrLnByb3RvdHlwZS5zdG9yZURlZmF1bHRzID0ge1xuXHQgICAgbWF4Q29uY3VycmVudDogbnVsbCxcblx0ICAgIG1pblRpbWU6IDAsXG5cdCAgICBoaWdoV2F0ZXI6IG51bGwsXG5cdCAgICBzdHJhdGVneTogQm90dGxlbmVjay5wcm90b3R5cGUuc3RyYXRlZ3kuTEVBSyxcblx0ICAgIHBlbmFsdHk6IG51bGwsXG5cdCAgICByZXNlcnZvaXI6IG51bGwsXG5cdCAgICByZXNlcnZvaXJSZWZyZXNoSW50ZXJ2YWw6IG51bGwsXG5cdCAgICByZXNlcnZvaXJSZWZyZXNoQW1vdW50OiBudWxsLFxuXHQgICAgcmVzZXJ2b2lySW5jcmVhc2VJbnRlcnZhbDogbnVsbCxcblx0ICAgIHJlc2Vydm9pckluY3JlYXNlQW1vdW50OiBudWxsLFxuXHQgICAgcmVzZXJ2b2lySW5jcmVhc2VNYXhpbXVtOiBudWxsXG5cdCAgfTtcblxuXHQgIEJvdHRsZW5lY2sucHJvdG90eXBlLmxvY2FsU3RvcmVEZWZhdWx0cyA9IHtcblx0ICAgIFByb21pc2U6IFByb21pc2UsXG5cdCAgICB0aW1lb3V0OiBudWxsLFxuXHQgICAgaGVhcnRiZWF0SW50ZXJ2YWw6IDI1MFxuXHQgIH07XG5cblx0ICBCb3R0bGVuZWNrLnByb3RvdHlwZS5yZWRpc1N0b3JlRGVmYXVsdHMgPSB7XG5cdCAgICBQcm9taXNlOiBQcm9taXNlLFxuXHQgICAgdGltZW91dDogbnVsbCxcblx0ICAgIGhlYXJ0YmVhdEludGVydmFsOiA1MDAwLFxuXHQgICAgY2xpZW50VGltZW91dDogMTAwMDAsXG5cdCAgICBSZWRpczogbnVsbCxcblx0ICAgIGNsaWVudE9wdGlvbnM6IHt9LFxuXHQgICAgY2x1c3Rlck5vZGVzOiBudWxsLFxuXHQgICAgY2xlYXJEYXRhc3RvcmU6IGZhbHNlLFxuXHQgICAgY29ubmVjdGlvbjogbnVsbFxuXHQgIH07XG5cblx0ICBCb3R0bGVuZWNrLnByb3RvdHlwZS5pbnN0YW5jZURlZmF1bHRzID0ge1xuXHQgICAgZGF0YXN0b3JlOiBcImxvY2FsXCIsXG5cdCAgICBjb25uZWN0aW9uOiBudWxsLFxuXHQgICAgaWQ6IFwiPG5vLWlkPlwiLFxuXHQgICAgcmVqZWN0T25Ecm9wOiB0cnVlLFxuXHQgICAgdHJhY2tEb25lU3RhdHVzOiBmYWxzZSxcblx0ICAgIFByb21pc2U6IFByb21pc2Vcblx0ICB9O1xuXG5cdCAgQm90dGxlbmVjay5wcm90b3R5cGUuc3RvcERlZmF1bHRzID0ge1xuXHQgICAgZW5xdWV1ZUVycm9yTWVzc2FnZTogXCJUaGlzIGxpbWl0ZXIgaGFzIGJlZW4gc3RvcHBlZCBhbmQgY2Fubm90IGFjY2VwdCBuZXcgam9icy5cIixcblx0ICAgIGRyb3BXYWl0aW5nSm9iczogdHJ1ZSxcblx0ICAgIGRyb3BFcnJvck1lc3NhZ2U6IFwiVGhpcyBsaW1pdGVyIGhhcyBiZWVuIHN0b3BwZWQuXCJcblx0ICB9O1xuXG5cdCAgcmV0dXJuIEJvdHRsZW5lY2s7XG5cblx0fSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG5cblx0dmFyIEJvdHRsZW5lY2tfMSA9IEJvdHRsZW5lY2s7XG5cblx0dmFyIGxpYiA9IEJvdHRsZW5lY2tfMTtcblxuXHRyZXR1cm4gbGliO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1209\n')},3644:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var concatMap = __webpack_require__(1048);\nvar balanced = __webpack_require__(5623);\n\nmodule.exports = expandTop;\n\nvar escSlash = '\\0SLASH'+Math.random()+'\\0';\nvar escOpen = '\\0OPEN'+Math.random()+'\\0';\nvar escClose = '\\0CLOSE'+Math.random()+'\\0';\nvar escComma = '\\0COMMA'+Math.random()+'\\0';\nvar escPeriod = '\\0PERIOD'+Math.random()+'\\0';\n\nfunction numeric(str) {\n return parseInt(str, 10) == str\n ? parseInt(str, 10)\n : str.charCodeAt(0);\n}\n\nfunction escapeBraces(str) {\n return str.split('\\\\\\\\').join(escSlash)\n .split('\\\\{').join(escOpen)\n .split('\\\\}').join(escClose)\n .split('\\\\,').join(escComma)\n .split('\\\\.').join(escPeriod);\n}\n\nfunction unescapeBraces(str) {\n return str.split(escSlash).join('\\\\')\n .split(escOpen).join('{')\n .split(escClose).join('}')\n .split(escComma).join(',')\n .split(escPeriod).join('.');\n}\n\n\n// Basically just str.split(\",\"), but handling cases\n// where we have nested braced sections, which should be\n// treated as individual members, like {a,{b,c},d}\nfunction parseCommaParts(str) {\n if (!str)\n return [''];\n\n var parts = [];\n var m = balanced('{', '}', str);\n\n if (!m)\n return str.split(',');\n\n var pre = m.pre;\n var body = m.body;\n var post = m.post;\n var p = pre.split(',');\n\n p[p.length-1] += '{' + body + '}';\n var postParts = parseCommaParts(post);\n if (post.length) {\n p[p.length-1] += postParts.shift();\n p.push.apply(p, postParts);\n }\n\n parts.push.apply(parts, p);\n\n return parts;\n}\n\nfunction expandTop(str) {\n if (!str)\n return [];\n\n // I don't know why Bash 4.3 does this, but it does.\n // Anything starting with {} will have the first two bytes preserved\n // but *only* at the top level, so {},a}b will not expand to anything,\n // but a{},b}c will be expanded to [a}c,abc].\n // One could argue that this is a bug in Bash, but since the goal of\n // this module is to match Bash's rules, we escape a leading {}\n if (str.substr(0, 2) === '{}') {\n str = '\\\\{\\\\}' + str.substr(2);\n }\n\n return expand(escapeBraces(str), true).map(unescapeBraces);\n}\n\nfunction identity(e) {\n return e;\n}\n\nfunction embrace(str) {\n return '{' + str + '}';\n}\nfunction isPadded(el) {\n return /^-?0\\d/.test(el);\n}\n\nfunction lte(i, y) {\n return i <= y;\n}\nfunction gte(i, y) {\n return i >= y;\n}\n\nfunction expand(str, isTop) {\n var expansions = [];\n\n var m = balanced('{', '}', str);\n if (!m || /\\$$/.test(m.pre)) return [str];\n\n var isNumericSequence = /^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(m.body);\n var isAlphaSequence = /^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(m.body);\n var isSequence = isNumericSequence || isAlphaSequence;\n var isOptions = m.body.indexOf(',') >= 0;\n if (!isSequence && !isOptions) {\n // {a},b}\n if (m.post.match(/,.*\\}/)) {\n str = m.pre + '{' + m.body + escClose + m.post;\n return expand(str);\n }\n return [str];\n }\n\n var n;\n if (isSequence) {\n n = m.body.split(/\\.\\./);\n } else {\n n = parseCommaParts(m.body);\n if (n.length === 1) {\n // x{{a,b}}y ==> x{a}y x{b}y\n n = expand(n[0], false).map(embrace);\n if (n.length === 1) {\n var post = m.post.length\n ? expand(m.post, false)\n : [''];\n return post.map(function(p) {\n return m.pre + n[0] + p;\n });\n }\n }\n }\n\n // at this point, n is the parts, and we know it's not a comma set\n // with a single entry.\n\n // no need to expand pre, since it is guaranteed to be free of brace-sets\n var pre = m.pre;\n var post = m.post.length\n ? expand(m.post, false)\n : [''];\n\n var N;\n\n if (isSequence) {\n var x = numeric(n[0]);\n var y = numeric(n[1]);\n var width = Math.max(n[0].length, n[1].length)\n var incr = n.length == 3\n ? Math.abs(numeric(n[2]))\n : 1;\n var test = lte;\n var reverse = y < x;\n if (reverse) {\n incr *= -1;\n test = gte;\n }\n var pad = n.some(isPadded);\n\n N = [];\n\n for (var i = x; test(i, y); i += incr) {\n var c;\n if (isAlphaSequence) {\n c = String.fromCharCode(i);\n if (c === '\\\\')\n c = '';\n } else {\n c = String(i);\n if (pad) {\n var need = width - c.length;\n if (need > 0) {\n var z = new Array(need + 1).join('0');\n if (i < 0)\n c = '-' + z + c.slice(1);\n else\n c = z + c;\n }\n }\n }\n N.push(c);\n }\n } else {\n N = concatMap(n, function(el) { return expand(el, false) });\n }\n\n for (var j = 0; j < N.length; j++) {\n for (var k = 0; k < post.length; k++) {\n var expansion = pre + N[j] + post[k];\n if (!isTop || isSequence || expansion)\n expansions.push(expansion);\n }\n }\n\n return expansions;\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY0NC5qcyIsIm1hcHBpbmdzIjoiQUFBQSxnQkFBZ0IsbUJBQU8sQ0FBQyxJQUFZO0FBQ3BDLGVBQWUsbUJBQU8sQ0FBQyxJQUFnQjs7QUFFdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkIsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSx3Q0FBd0MsR0FBRyxJQUFJO0FBQy9DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixLQUFLOztBQUUxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixhQUFhO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQkFBK0I7QUFDL0IsdUNBQXVDLEdBQUc7QUFDMUMsWUFBWSxHQUFHLHlCQUF5QjtBQUN4QztBQUNBO0FBQ0EsOEJBQThCO0FBQzlCLGNBQWMsR0FBRztBQUNqQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFdBQVcsWUFBWTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxxQkFBcUIsS0FBSztBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxFQUFFO0FBQ1YsMkJBQTJCO0FBQzNCLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLFlBQVksS0FBSyxRQUFRLEVBQUUsSUFBSSxFQUFFO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxvQkFBb0IsWUFBWTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osb0NBQW9DLDBCQUEwQjtBQUM5RDs7QUFFQSxrQkFBa0IsY0FBYztBQUNoQyxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2JyYWNlLWV4cGFuc2lvbi9pbmRleC5qcz80ZWUwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBjb25jYXRNYXAgPSByZXF1aXJlKCdjb25jYXQtbWFwJyk7XG52YXIgYmFsYW5jZWQgPSByZXF1aXJlKCdiYWxhbmNlZC1tYXRjaCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cGFuZFRvcDtcblxudmFyIGVzY1NsYXNoID0gJ1xcMFNMQVNIJytNYXRoLnJhbmRvbSgpKydcXDAnO1xudmFyIGVzY09wZW4gPSAnXFwwT1BFTicrTWF0aC5yYW5kb20oKSsnXFwwJztcbnZhciBlc2NDbG9zZSA9ICdcXDBDTE9TRScrTWF0aC5yYW5kb20oKSsnXFwwJztcbnZhciBlc2NDb21tYSA9ICdcXDBDT01NQScrTWF0aC5yYW5kb20oKSsnXFwwJztcbnZhciBlc2NQZXJpb2QgPSAnXFwwUEVSSU9EJytNYXRoLnJhbmRvbSgpKydcXDAnO1xuXG5mdW5jdGlvbiBudW1lcmljKHN0cikge1xuICByZXR1cm4gcGFyc2VJbnQoc3RyLCAxMCkgPT0gc3RyXG4gICAgPyBwYXJzZUludChzdHIsIDEwKVxuICAgIDogc3RyLmNoYXJDb2RlQXQoMCk7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZUJyYWNlcyhzdHIpIHtcbiAgcmV0dXJuIHN0ci5zcGxpdCgnXFxcXFxcXFwnKS5qb2luKGVzY1NsYXNoKVxuICAgICAgICAgICAgLnNwbGl0KCdcXFxceycpLmpvaW4oZXNjT3BlbilcbiAgICAgICAgICAgIC5zcGxpdCgnXFxcXH0nKS5qb2luKGVzY0Nsb3NlKVxuICAgICAgICAgICAgLnNwbGl0KCdcXFxcLCcpLmpvaW4oZXNjQ29tbWEpXG4gICAgICAgICAgICAuc3BsaXQoJ1xcXFwuJykuam9pbihlc2NQZXJpb2QpO1xufVxuXG5mdW5jdGlvbiB1bmVzY2FwZUJyYWNlcyhzdHIpIHtcbiAgcmV0dXJuIHN0ci5zcGxpdChlc2NTbGFzaCkuam9pbignXFxcXCcpXG4gICAgICAgICAgICAuc3BsaXQoZXNjT3Blbikuam9pbigneycpXG4gICAgICAgICAgICAuc3BsaXQoZXNjQ2xvc2UpLmpvaW4oJ30nKVxuICAgICAgICAgICAgLnNwbGl0KGVzY0NvbW1hKS5qb2luKCcsJylcbiAgICAgICAgICAgIC5zcGxpdChlc2NQZXJpb2QpLmpvaW4oJy4nKTtcbn1cblxuXG4vLyBCYXNpY2FsbHkganVzdCBzdHIuc3BsaXQoXCIsXCIpLCBidXQgaGFuZGxpbmcgY2FzZXNcbi8vIHdoZXJlIHdlIGhhdmUgbmVzdGVkIGJyYWNlZCBzZWN0aW9ucywgd2hpY2ggc2hvdWxkIGJlXG4vLyB0cmVhdGVkIGFzIGluZGl2aWR1YWwgbWVtYmVycywgbGlrZSB7YSx7YixjfSxkfVxuZnVuY3Rpb24gcGFyc2VDb21tYVBhcnRzKHN0cikge1xuICBpZiAoIXN0cilcbiAgICByZXR1cm4gWycnXTtcblxuICB2YXIgcGFydHMgPSBbXTtcbiAgdmFyIG0gPSBiYWxhbmNlZCgneycsICd9Jywgc3RyKTtcblxuICBpZiAoIW0pXG4gICAgcmV0dXJuIHN0ci5zcGxpdCgnLCcpO1xuXG4gIHZhciBwcmUgPSBtLnByZTtcbiAgdmFyIGJvZHkgPSBtLmJvZHk7XG4gIHZhciBwb3N0ID0gbS5wb3N0O1xuICB2YXIgcCA9IHByZS5zcGxpdCgnLCcpO1xuXG4gIHBbcC5sZW5ndGgtMV0gKz0gJ3snICsgYm9keSArICd9JztcbiAgdmFyIHBvc3RQYXJ0cyA9IHBhcnNlQ29tbWFQYXJ0cyhwb3N0KTtcbiAgaWYgKHBvc3QubGVuZ3RoKSB7XG4gICAgcFtwLmxlbmd0aC0xXSArPSBwb3N0UGFydHMuc2hpZnQoKTtcbiAgICBwLnB1c2guYXBwbHkocCwgcG9zdFBhcnRzKTtcbiAgfVxuXG4gIHBhcnRzLnB1c2guYXBwbHkocGFydHMsIHApO1xuXG4gIHJldHVybiBwYXJ0cztcbn1cblxuZnVuY3Rpb24gZXhwYW5kVG9wKHN0cikge1xuICBpZiAoIXN0cilcbiAgICByZXR1cm4gW107XG5cbiAgLy8gSSBkb24ndCBrbm93IHdoeSBCYXNoIDQuMyBkb2VzIHRoaXMsIGJ1dCBpdCBkb2VzLlxuICAvLyBBbnl0aGluZyBzdGFydGluZyB3aXRoIHt9IHdpbGwgaGF2ZSB0aGUgZmlyc3QgdHdvIGJ5dGVzIHByZXNlcnZlZFxuICAvLyBidXQgKm9ubHkqIGF0IHRoZSB0b3AgbGV2ZWwsIHNvIHt9LGF9YiB3aWxsIG5vdCBleHBhbmQgdG8gYW55dGhpbmcsXG4gIC8vIGJ1dCBhe30sYn1jIHdpbGwgYmUgZXhwYW5kZWQgdG8gW2F9YyxhYmNdLlxuICAvLyBPbmUgY291bGQgYXJndWUgdGhhdCB0aGlzIGlzIGEgYnVnIGluIEJhc2gsIGJ1dCBzaW5jZSB0aGUgZ29hbCBvZlxuICAvLyB0aGlzIG1vZHVsZSBpcyB0byBtYXRjaCBCYXNoJ3MgcnVsZXMsIHdlIGVzY2FwZSBhIGxlYWRpbmcge31cbiAgaWYgKHN0ci5zdWJzdHIoMCwgMikgPT09ICd7fScpIHtcbiAgICBzdHIgPSAnXFxcXHtcXFxcfScgKyBzdHIuc3Vic3RyKDIpO1xuICB9XG5cbiAgcmV0dXJuIGV4cGFuZChlc2NhcGVCcmFjZXMoc3RyKSwgdHJ1ZSkubWFwKHVuZXNjYXBlQnJhY2VzKTtcbn1cblxuZnVuY3Rpb24gaWRlbnRpdHkoZSkge1xuICByZXR1cm4gZTtcbn1cblxuZnVuY3Rpb24gZW1icmFjZShzdHIpIHtcbiAgcmV0dXJuICd7JyArIHN0ciArICd9Jztcbn1cbmZ1bmN0aW9uIGlzUGFkZGVkKGVsKSB7XG4gIHJldHVybiAvXi0/MFxcZC8udGVzdChlbCk7XG59XG5cbmZ1bmN0aW9uIGx0ZShpLCB5KSB7XG4gIHJldHVybiBpIDw9IHk7XG59XG5mdW5jdGlvbiBndGUoaSwgeSkge1xuICByZXR1cm4gaSA+PSB5O1xufVxuXG5mdW5jdGlvbiBleHBhbmQoc3RyLCBpc1RvcCkge1xuICB2YXIgZXhwYW5zaW9ucyA9IFtdO1xuXG4gIHZhciBtID0gYmFsYW5jZWQoJ3snLCAnfScsIHN0cik7XG4gIGlmICghbSB8fCAvXFwkJC8udGVzdChtLnByZSkpIHJldHVybiBbc3RyXTtcblxuICB2YXIgaXNOdW1lcmljU2VxdWVuY2UgPSAvXi0/XFxkK1xcLlxcLi0/XFxkKyg/OlxcLlxcLi0/XFxkKyk/JC8udGVzdChtLmJvZHkpO1xuICB2YXIgaXNBbHBoYVNlcXVlbmNlID0gL15bYS16QS1aXVxcLlxcLlthLXpBLVpdKD86XFwuXFwuLT9cXGQrKT8kLy50ZXN0KG0uYm9keSk7XG4gIHZhciBpc1NlcXVlbmNlID0gaXNOdW1lcmljU2VxdWVuY2UgfHwgaXNBbHBoYVNlcXVlbmNlO1xuICB2YXIgaXNPcHRpb25zID0gbS5ib2R5LmluZGV4T2YoJywnKSA+PSAwO1xuICBpZiAoIWlzU2VxdWVuY2UgJiYgIWlzT3B0aW9ucykge1xuICAgIC8vIHthfSxifVxuICAgIGlmIChtLnBvc3QubWF0Y2goLywuKlxcfS8pKSB7XG4gICAgICBzdHIgPSBtLnByZSArICd7JyArIG0uYm9keSArIGVzY0Nsb3NlICsgbS5wb3N0O1xuICAgICAgcmV0dXJuIGV4cGFuZChzdHIpO1xuICAgIH1cbiAgICByZXR1cm4gW3N0cl07XG4gIH1cblxuICB2YXIgbjtcbiAgaWYgKGlzU2VxdWVuY2UpIHtcbiAgICBuID0gbS5ib2R5LnNwbGl0KC9cXC5cXC4vKTtcbiAgfSBlbHNlIHtcbiAgICBuID0gcGFyc2VDb21tYVBhcnRzKG0uYm9keSk7XG4gICAgaWYgKG4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAvLyB4e3thLGJ9fXkgPT0+IHh7YX15IHh7Yn15XG4gICAgICBuID0gZXhwYW5kKG5bMF0sIGZhbHNlKS5tYXAoZW1icmFjZSk7XG4gICAgICBpZiAobi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgdmFyIHBvc3QgPSBtLnBvc3QubGVuZ3RoXG4gICAgICAgICAgPyBleHBhbmQobS5wb3N0LCBmYWxzZSlcbiAgICAgICAgICA6IFsnJ107XG4gICAgICAgIHJldHVybiBwb3N0Lm1hcChmdW5jdGlvbihwKSB7XG4gICAgICAgICAgcmV0dXJuIG0ucHJlICsgblswXSArIHA7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGF0IHRoaXMgcG9pbnQsIG4gaXMgdGhlIHBhcnRzLCBhbmQgd2Uga25vdyBpdCdzIG5vdCBhIGNvbW1hIHNldFxuICAvLyB3aXRoIGEgc2luZ2xlIGVudHJ5LlxuXG4gIC8vIG5vIG5lZWQgdG8gZXhwYW5kIHByZSwgc2luY2UgaXQgaXMgZ3VhcmFudGVlZCB0byBiZSBmcmVlIG9mIGJyYWNlLXNldHNcbiAgdmFyIHByZSA9IG0ucHJlO1xuICB2YXIgcG9zdCA9IG0ucG9zdC5sZW5ndGhcbiAgICA/IGV4cGFuZChtLnBvc3QsIGZhbHNlKVxuICAgIDogWycnXTtcblxuICB2YXIgTjtcblxuICBpZiAoaXNTZXF1ZW5jZSkge1xuICAgIHZhciB4ID0gbnVtZXJpYyhuWzBdKTtcbiAgICB2YXIgeSA9IG51bWVyaWMoblsxXSk7XG4gICAgdmFyIHdpZHRoID0gTWF0aC5tYXgoblswXS5sZW5ndGgsIG5bMV0ubGVuZ3RoKVxuICAgIHZhciBpbmNyID0gbi5sZW5ndGggPT0gM1xuICAgICAgPyBNYXRoLmFicyhudW1lcmljKG5bMl0pKVxuICAgICAgOiAxO1xuICAgIHZhciB0ZXN0ID0gbHRlO1xuICAgIHZhciByZXZlcnNlID0geSA8IHg7XG4gICAgaWYgKHJldmVyc2UpIHtcbiAgICAgIGluY3IgKj0gLTE7XG4gICAgICB0ZXN0ID0gZ3RlO1xuICAgIH1cbiAgICB2YXIgcGFkID0gbi5zb21lKGlzUGFkZGVkKTtcblxuICAgIE4gPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSB4OyB0ZXN0KGksIHkpOyBpICs9IGluY3IpIHtcbiAgICAgIHZhciBjO1xuICAgICAgaWYgKGlzQWxwaGFTZXF1ZW5jZSkge1xuICAgICAgICBjID0gU3RyaW5nLmZyb21DaGFyQ29kZShpKTtcbiAgICAgICAgaWYgKGMgPT09ICdcXFxcJylcbiAgICAgICAgICBjID0gJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjID0gU3RyaW5nKGkpO1xuICAgICAgICBpZiAocGFkKSB7XG4gICAgICAgICAgdmFyIG5lZWQgPSB3aWR0aCAtIGMubGVuZ3RoO1xuICAgICAgICAgIGlmIChuZWVkID4gMCkge1xuICAgICAgICAgICAgdmFyIHogPSBuZXcgQXJyYXkobmVlZCArIDEpLmpvaW4oJzAnKTtcbiAgICAgICAgICAgIGlmIChpIDwgMClcbiAgICAgICAgICAgICAgYyA9ICctJyArIHogKyBjLnNsaWNlKDEpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBjID0geiArIGM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBOLnB1c2goYyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIE4gPSBjb25jYXRNYXAobiwgZnVuY3Rpb24oZWwpIHsgcmV0dXJuIGV4cGFuZChlbCwgZmFsc2UpIH0pO1xuICB9XG5cbiAgZm9yICh2YXIgaiA9IDA7IGogPCBOLmxlbmd0aDsgaisrKSB7XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBwb3N0Lmxlbmd0aDsgaysrKSB7XG4gICAgICB2YXIgZXhwYW5zaW9uID0gcHJlICsgTltqXSArIHBvc3Rba107XG4gICAgICBpZiAoIWlzVG9wIHx8IGlzU2VxdWVuY2UgfHwgZXhwYW5zaW9uKVxuICAgICAgICBleHBhbnNpb25zLnB1c2goZXhwYW5zaW9uKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhwYW5zaW9ucztcbn1cblxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3644\n")},2779:(module,__unused_webpack_exports,__webpack_require__)=>{eval('var Buffer = (__webpack_require__(4300).Buffer);\n\nvar CRC_TABLE = [\n 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,\n 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,\n 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,\n 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,\n 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,\n 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,\n 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,\n 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,\n 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,\n 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,\n 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,\n 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,\n 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,\n 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,\n 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,\n 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,\n 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,\n 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,\n 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,\n 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,\n 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,\n 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,\n 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,\n 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,\n 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,\n 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,\n 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,\n 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,\n 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,\n 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,\n 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,\n 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,\n 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,\n 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,\n 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,\n 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,\n 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,\n 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,\n 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,\n 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,\n 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,\n 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,\n 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,\n 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,\n 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,\n 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,\n 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,\n 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,\n 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,\n 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,\n 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,\n 0x2d02ef8d\n];\n\nif (typeof Int32Array !== \'undefined\') {\n CRC_TABLE = new Int32Array(CRC_TABLE);\n}\n\nfunction ensureBuffer(input) {\n if (Buffer.isBuffer(input)) {\n return input;\n }\n\n var hasNewBufferAPI =\n typeof Buffer.alloc === "function" &&\n typeof Buffer.from === "function";\n\n if (typeof input === "number") {\n return hasNewBufferAPI ? Buffer.alloc(input) : new Buffer(input);\n }\n else if (typeof input === "string") {\n return hasNewBufferAPI ? Buffer.from(input) : new Buffer(input);\n }\n else {\n throw new Error("input must be buffer, number, or string, received " +\n typeof input);\n }\n}\n\nfunction bufferizeInt(num) {\n var tmp = ensureBuffer(4);\n tmp.writeInt32BE(num, 0);\n return tmp;\n}\n\nfunction _crc32(buf, previous) {\n buf = ensureBuffer(buf);\n if (Buffer.isBuffer(previous)) {\n previous = previous.readUInt32BE(0);\n }\n var crc = ~~previous ^ -1;\n for (var n = 0; n < buf.length; n++) {\n crc = CRC_TABLE[(crc ^ buf[n]) & 0xff] ^ (crc >>> 8);\n }\n return (crc ^ -1);\n}\n\nfunction crc32() {\n return bufferizeInt(_crc32.apply(null, arguments));\n}\ncrc32.signed = function () {\n return _crc32.apply(null, arguments);\n};\ncrc32.unsigned = function () {\n return _crc32.apply(null, arguments) >>> 0;\n};\n\nmodule.exports = crc32;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc3OS5qcyIsIm1hcHBpbmdzIjoiQUFBQSxhQUFhLGtDQUF3Qjs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvYnVmZmVyLWNyYzMyL2luZGV4LmpzPzMwODYiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxudmFyIENSQ19UQUJMRSA9IFtcbiAgMHgwMDAwMDAwMCwgMHg3NzA3MzA5NiwgMHhlZTBlNjEyYywgMHg5OTA5NTFiYSwgMHgwNzZkYzQxOSxcbiAgMHg3MDZhZjQ4ZiwgMHhlOTYzYTUzNSwgMHg5ZTY0OTVhMywgMHgwZWRiODgzMiwgMHg3OWRjYjhhNCxcbiAgMHhlMGQ1ZTkxZSwgMHg5N2QyZDk4OCwgMHgwOWI2NGMyYiwgMHg3ZWIxN2NiZCwgMHhlN2I4MmQwNyxcbiAgMHg5MGJmMWQ5MSwgMHgxZGI3MTA2NCwgMHg2YWIwMjBmMiwgMHhmM2I5NzE0OCwgMHg4NGJlNDFkZSxcbiAgMHgxYWRhZDQ3ZCwgMHg2ZGRkZTRlYiwgMHhmNGQ0YjU1MSwgMHg4M2QzODVjNywgMHgxMzZjOTg1NixcbiAgMHg2NDZiYThjMCwgMHhmZDYyZjk3YSwgMHg4YTY1YzllYywgMHgxNDAxNWM0ZiwgMHg2MzA2NmNkOSxcbiAgMHhmYTBmM2Q2MywgMHg4ZDA4MGRmNSwgMHgzYjZlMjBjOCwgMHg0YzY5MTA1ZSwgMHhkNTYwNDFlNCxcbiAgMHhhMjY3NzE3MiwgMHgzYzAzZTRkMSwgMHg0YjA0ZDQ0NywgMHhkMjBkODVmZCwgMHhhNTBhYjU2YixcbiAgMHgzNWI1YThmYSwgMHg0MmIyOTg2YywgMHhkYmJiYzlkNiwgMHhhY2JjZjk0MCwgMHgzMmQ4NmNlMyxcbiAgMHg0NWRmNWM3NSwgMHhkY2Q2MGRjZiwgMHhhYmQxM2Q1OSwgMHgyNmQ5MzBhYywgMHg1MWRlMDAzYSxcbiAgMHhjOGQ3NTE4MCwgMHhiZmQwNjExNiwgMHgyMWI0ZjRiNSwgMHg1NmIzYzQyMywgMHhjZmJhOTU5OSxcbiAgMHhiOGJkYTUwZiwgMHgyODAyYjg5ZSwgMHg1ZjA1ODgwOCwgMHhjNjBjZDliMiwgMHhiMTBiZTkyNCxcbiAgMHgyZjZmN2M4NywgMHg1ODY4NGMxMSwgMHhjMTYxMWRhYiwgMHhiNjY2MmQzZCwgMHg3NmRjNDE5MCxcbiAgMHgwMWRiNzEwNiwgMHg5OGQyMjBiYywgMHhlZmQ1MTAyYSwgMHg3MWIxODU4OSwgMHgwNmI2YjUxZixcbiAgMHg5ZmJmZTRhNSwgMHhlOGI4ZDQzMywgMHg3ODA3YzlhMiwgMHgwZjAwZjkzNCwgMHg5NjA5YTg4ZSxcbiAgMHhlMTBlOTgxOCwgMHg3ZjZhMGRiYiwgMHgwODZkM2QyZCwgMHg5MTY0NmM5NywgMHhlNjYzNWMwMSxcbiAgMHg2YjZiNTFmNCwgMHgxYzZjNjE2MiwgMHg4NTY1MzBkOCwgMHhmMjYyMDA0ZSwgMHg2YzA2OTVlZCxcbiAgMHgxYjAxYTU3YiwgMHg4MjA4ZjRjMSwgMHhmNTBmYzQ1NywgMHg2NWIwZDljNiwgMHgxMmI3ZTk1MCxcbiAgMHg4YmJlYjhlYSwgMHhmY2I5ODg3YywgMHg2MmRkMWRkZiwgMHgxNWRhMmQ0OSwgMHg4Y2QzN2NmMyxcbiAgMHhmYmQ0NGM2NSwgMHg0ZGIyNjE1OCwgMHgzYWI1NTFjZSwgMHhhM2JjMDA3NCwgMHhkNGJiMzBlMixcbiAgMHg0YWRmYTU0MSwgMHgzZGQ4OTVkNywgMHhhNGQxYzQ2ZCwgMHhkM2Q2ZjRmYiwgMHg0MzY5ZTk2YSxcbiAgMHgzNDZlZDlmYywgMHhhZDY3ODg0NiwgMHhkYTYwYjhkMCwgMHg0NDA0MmQ3MywgMHgzMzAzMWRlNSxcbiAgMHhhYTBhNGM1ZiwgMHhkZDBkN2NjOSwgMHg1MDA1NzEzYywgMHgyNzAyNDFhYSwgMHhiZTBiMTAxMCxcbiAgMHhjOTBjMjA4NiwgMHg1NzY4YjUyNSwgMHgyMDZmODViMywgMHhiOTY2ZDQwOSwgMHhjZTYxZTQ5ZixcbiAgMHg1ZWRlZjkwZSwgMHgyOWQ5Yzk5OCwgMHhiMGQwOTgyMiwgMHhjN2Q3YThiNCwgMHg1OWIzM2QxNyxcbiAgMHgyZWI0MGQ4MSwgMHhiN2JkNWMzYiwgMHhjMGJhNmNhZCwgMHhlZGI4ODMyMCwgMHg5YWJmYjNiNixcbiAgMHgwM2I2ZTIwYywgMHg3NGIxZDI5YSwgMHhlYWQ1NDczOSwgMHg5ZGQyNzdhZiwgMHgwNGRiMjYxNSxcbiAgMHg3M2RjMTY4MywgMHhlMzYzMGIxMiwgMHg5NDY0M2I4NCwgMHgwZDZkNmEzZSwgMHg3YTZhNWFhOCxcbiAgMHhlNDBlY2YwYiwgMHg5MzA5ZmY5ZCwgMHgwYTAwYWUyNywgMHg3ZDA3OWViMSwgMHhmMDBmOTM0NCxcbiAgMHg4NzA4YTNkMiwgMHgxZTAxZjI2OCwgMHg2OTA2YzJmZSwgMHhmNzYyNTc1ZCwgMHg4MDY1NjdjYixcbiAgMHgxOTZjMzY3MSwgMHg2ZTZiMDZlNywgMHhmZWQ0MWI3NiwgMHg4OWQzMmJlMCwgMHgxMGRhN2E1YSxcbiAgMHg2N2RkNGFjYywgMHhmOWI5ZGY2ZiwgMHg4ZWJlZWZmOSwgMHgxN2I3YmU0MywgMHg2MGIwOGVkNSxcbiAgMHhkNmQ2YTNlOCwgMHhhMWQxOTM3ZSwgMHgzOGQ4YzJjNCwgMHg0ZmRmZjI1MiwgMHhkMWJiNjdmMSxcbiAgMHhhNmJjNTc2NywgMHgzZmI1MDZkZCwgMHg0OGIyMzY0YiwgMHhkODBkMmJkYSwgMHhhZjBhMWI0YyxcbiAgMHgzNjAzNGFmNiwgMHg0MTA0N2E2MCwgMHhkZjYwZWZjMywgMHhhODY3ZGY1NSwgMHgzMTZlOGVlZixcbiAgMHg0NjY5YmU3OSwgMHhjYjYxYjM4YywgMHhiYzY2ODMxYSwgMHgyNTZmZDJhMCwgMHg1MjY4ZTIzNixcbiAgMHhjYzBjNzc5NSwgMHhiYjBiNDcwMywgMHgyMjAyMTZiOSwgMHg1NTA1MjYyZiwgMHhjNWJhM2JiZSxcbiAgMHhiMmJkMGIyOCwgMHgyYmI0NWE5MiwgMHg1Y2IzNmEwNCwgMHhjMmQ3ZmZhNywgMHhiNWQwY2YzMSxcbiAgMHgyY2Q5OWU4YiwgMHg1YmRlYWUxZCwgMHg5YjY0YzJiMCwgMHhlYzYzZjIyNiwgMHg3NTZhYTM5YyxcbiAgMHgwMjZkOTMwYSwgMHg5YzA5MDZhOSwgMHhlYjBlMzYzZiwgMHg3MjA3Njc4NSwgMHgwNTAwNTcxMyxcbiAgMHg5NWJmNGE4MiwgMHhlMmI4N2ExNCwgMHg3YmIxMmJhZSwgMHgwY2I2MWIzOCwgMHg5MmQyOGU5YixcbiAgMHhlNWQ1YmUwZCwgMHg3Y2RjZWZiNywgMHgwYmRiZGYyMSwgMHg4NmQzZDJkNCwgMHhmMWQ0ZTI0MixcbiAgMHg2OGRkYjNmOCwgMHgxZmRhODM2ZSwgMHg4MWJlMTZjZCwgMHhmNmI5MjY1YiwgMHg2ZmIwNzdlMSxcbiAgMHgxOGI3NDc3NywgMHg4ODA4NWFlNiwgMHhmZjBmNmE3MCwgMHg2NjA2M2JjYSwgMHgxMTAxMGI1YyxcbiAgMHg4ZjY1OWVmZiwgMHhmODYyYWU2OSwgMHg2MTZiZmZkMywgMHgxNjZjY2Y0NSwgMHhhMDBhZTI3OCxcbiAgMHhkNzBkZDJlZSwgMHg0ZTA0ODM1NCwgMHgzOTAzYjNjMiwgMHhhNzY3MjY2MSwgMHhkMDYwMTZmNyxcbiAgMHg0OTY5NDc0ZCwgMHgzZTZlNzdkYiwgMHhhZWQxNmE0YSwgMHhkOWQ2NWFkYywgMHg0MGRmMGI2NixcbiAgMHgzN2Q4M2JmMCwgMHhhOWJjYWU1MywgMHhkZWJiOWVjNSwgMHg0N2IyY2Y3ZiwgMHgzMGI1ZmZlOSxcbiAgMHhiZGJkZjIxYywgMHhjYWJhYzI4YSwgMHg1M2IzOTMzMCwgMHgyNGI0YTNhNiwgMHhiYWQwMzYwNSxcbiAgMHhjZGQ3MDY5MywgMHg1NGRlNTcyOSwgMHgyM2Q5NjdiZiwgMHhiMzY2N2EyZSwgMHhjNDYxNGFiOCxcbiAgMHg1ZDY4MWIwMiwgMHgyYTZmMmI5NCwgMHhiNDBiYmUzNywgMHhjMzBjOGVhMSwgMHg1YTA1ZGYxYixcbiAgMHgyZDAyZWY4ZFxuXTtcblxuaWYgKHR5cGVvZiBJbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJykge1xuICBDUkNfVEFCTEUgPSBuZXcgSW50MzJBcnJheShDUkNfVEFCTEUpO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVCdWZmZXIoaW5wdXQpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihpbnB1dCkpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cblxuICB2YXIgaGFzTmV3QnVmZmVyQVBJID1cbiAgICAgIHR5cGVvZiBCdWZmZXIuYWxsb2MgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgdHlwZW9mIEJ1ZmZlci5mcm9tID09PSBcImZ1bmN0aW9uXCI7XG5cbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBoYXNOZXdCdWZmZXJBUEkgPyBCdWZmZXIuYWxsb2MoaW5wdXQpIDogbmV3IEJ1ZmZlcihpbnB1dCk7XG4gIH1cbiAgZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGhhc05ld0J1ZmZlckFQSSA/IEJ1ZmZlci5mcm9tKGlucHV0KSA6IG5ldyBCdWZmZXIoaW5wdXQpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcImlucHV0IG11c3QgYmUgYnVmZmVyLCBudW1iZXIsIG9yIHN0cmluZywgcmVjZWl2ZWQgXCIgK1xuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgaW5wdXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1ZmZlcml6ZUludChudW0pIHtcbiAgdmFyIHRtcCA9IGVuc3VyZUJ1ZmZlcig0KTtcbiAgdG1wLndyaXRlSW50MzJCRShudW0sIDApO1xuICByZXR1cm4gdG1wO1xufVxuXG5mdW5jdGlvbiBfY3JjMzIoYnVmLCBwcmV2aW91cykge1xuICBidWYgPSBlbnN1cmVCdWZmZXIoYnVmKTtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihwcmV2aW91cykpIHtcbiAgICBwcmV2aW91cyA9IHByZXZpb3VzLnJlYWRVSW50MzJCRSgwKTtcbiAgfVxuICB2YXIgY3JjID0gfn5wcmV2aW91cyBeIC0xO1xuICBmb3IgKHZhciBuID0gMDsgbiA8IGJ1Zi5sZW5ndGg7IG4rKykge1xuICAgIGNyYyA9IENSQ19UQUJMRVsoY3JjIF4gYnVmW25dKSAmIDB4ZmZdIF4gKGNyYyA+Pj4gOCk7XG4gIH1cbiAgcmV0dXJuIChjcmMgXiAtMSk7XG59XG5cbmZ1bmN0aW9uIGNyYzMyKCkge1xuICByZXR1cm4gYnVmZmVyaXplSW50KF9jcmMzMi5hcHBseShudWxsLCBhcmd1bWVudHMpKTtcbn1cbmNyYzMyLnNpZ25lZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIF9jcmMzMi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufTtcbmNyYzMyLnVuc2lnbmVkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX2NyYzMyLmFwcGx5KG51bGwsIGFyZ3VtZW50cykgPj4+IDA7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyYzMyO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2779\n')},5289:module=>{eval("module.exports = Buffers;\n\nfunction Buffers (bufs) {\n if (!(this instanceof Buffers)) return new Buffers(bufs);\n this.buffers = bufs || [];\n this.length = this.buffers.reduce(function (size, buf) {\n return size + buf.length\n }, 0);\n}\n\nBuffers.prototype.push = function () {\n for (var i = 0; i < arguments.length; i++) {\n if (!Buffer.isBuffer(arguments[i])) {\n throw new TypeError('Tried to push a non-buffer');\n }\n }\n \n for (var i = 0; i < arguments.length; i++) {\n var buf = arguments[i];\n this.buffers.push(buf);\n this.length += buf.length;\n }\n return this.length;\n};\n\nBuffers.prototype.unshift = function () {\n for (var i = 0; i < arguments.length; i++) {\n if (!Buffer.isBuffer(arguments[i])) {\n throw new TypeError('Tried to unshift a non-buffer');\n }\n }\n \n for (var i = 0; i < arguments.length; i++) {\n var buf = arguments[i];\n this.buffers.unshift(buf);\n this.length += buf.length;\n }\n return this.length;\n};\n\nBuffers.prototype.copy = function (dst, dStart, start, end) {\n return this.slice(start, end).copy(dst, dStart, 0, end - start);\n};\n\nBuffers.prototype.splice = function (i, howMany) {\n var buffers = this.buffers;\n var index = i >= 0 ? i : this.length - i;\n var reps = [].slice.call(arguments, 2);\n \n if (howMany === undefined) {\n howMany = this.length - index;\n }\n else if (howMany > this.length - index) {\n howMany = this.length - index;\n }\n \n for (var i = 0; i < reps.length; i++) {\n this.length += reps[i].length;\n }\n \n var removed = new Buffers();\n var bytes = 0;\n \n var startBytes = 0;\n for (\n var ii = 0;\n ii < buffers.length && startBytes + buffers[ii].length < index;\n ii ++\n ) { startBytes += buffers[ii].length }\n \n if (index - startBytes > 0) {\n var start = index - startBytes;\n \n if (start + howMany < buffers[ii].length) {\n removed.push(buffers[ii].slice(start, start + howMany));\n \n var orig = buffers[ii];\n //var buf = new Buffer(orig.length - howMany);\n var buf0 = new Buffer(start);\n for (var i = 0; i < start; i++) {\n buf0[i] = orig[i];\n }\n \n var buf1 = new Buffer(orig.length - start - howMany);\n for (var i = start + howMany; i < orig.length; i++) {\n buf1[ i - howMany - start ] = orig[i]\n }\n \n if (reps.length > 0) {\n var reps_ = reps.slice();\n reps_.unshift(buf0);\n reps_.push(buf1);\n buffers.splice.apply(buffers, [ ii, 1 ].concat(reps_));\n ii += reps_.length;\n reps = [];\n }\n else {\n buffers.splice(ii, 1, buf0, buf1);\n //buffers[ii] = buf;\n ii += 2;\n }\n }\n else {\n removed.push(buffers[ii].slice(start));\n buffers[ii] = buffers[ii].slice(0, start);\n ii ++;\n }\n }\n \n if (reps.length > 0) {\n buffers.splice.apply(buffers, [ ii, 0 ].concat(reps));\n ii += reps.length;\n }\n \n while (removed.length < howMany) {\n var buf = buffers[ii];\n var len = buf.length;\n var take = Math.min(len, howMany - removed.length);\n \n if (take === len) {\n removed.push(buf);\n buffers.splice(ii, 1);\n }\n else {\n removed.push(buf.slice(0, take));\n buffers[ii] = buffers[ii].slice(take);\n }\n }\n \n this.length -= removed.length;\n \n return removed;\n};\n \nBuffers.prototype.slice = function (i, j) {\n var buffers = this.buffers;\n if (j === undefined) j = this.length;\n if (i === undefined) i = 0;\n \n if (j > this.length) j = this.length;\n \n var startBytes = 0;\n for (\n var si = 0;\n si < buffers.length && startBytes + buffers[si].length <= i;\n si ++\n ) { startBytes += buffers[si].length }\n \n var target = new Buffer(j - i);\n \n var ti = 0;\n for (var ii = si; ti < j - i && ii < buffers.length; ii++) {\n var len = buffers[ii].length;\n \n var start = ti === 0 ? i - startBytes : 0;\n var end = ti + len >= j - i\n ? Math.min(start + (j - i) - ti, len)\n : len\n ;\n \n buffers[ii].copy(target, ti, start, end);\n ti += end - start;\n }\n \n return target;\n};\n\nBuffers.prototype.pos = function (i) {\n if (i < 0 || i >= this.length) throw new Error('oob');\n var l = i, bi = 0, bu = null;\n for (;;) {\n bu = this.buffers[bi];\n if (l < bu.length) {\n return {buf: bi, offset: l};\n } else {\n l -= bu.length;\n }\n bi++;\n }\n};\n\nBuffers.prototype.get = function get (i) {\n var pos = this.pos(i);\n\n return this.buffers[pos.buf].get(pos.offset);\n};\n\nBuffers.prototype.set = function set (i, b) {\n var pos = this.pos(i);\n\n return this.buffers[pos.buf].set(pos.offset, b);\n};\n\nBuffers.prototype.indexOf = function (needle, offset) {\n if (\"string\" === typeof needle) {\n needle = new Buffer(needle);\n } else if (needle instanceof Buffer) {\n // already a buffer\n } else {\n throw new Error('Invalid type for a search string');\n }\n\n if (!needle.length) {\n return 0;\n }\n\n if (!this.length) {\n return -1;\n }\n\n var i = 0, j = 0, match = 0, mstart, pos = 0;\n\n // start search from a particular point in the virtual buffer\n if (offset) {\n var p = this.pos(offset);\n i = p.buf;\n j = p.offset;\n pos = offset;\n }\n\n // for each character in virtual buffer\n for (;;) {\n while (j >= this.buffers[i].length) {\n j = 0;\n i++;\n\n if (i >= this.buffers.length) {\n // search string not found\n return -1;\n }\n }\n\n var char = this.buffers[i][j];\n\n if (char == needle[match]) {\n // keep track where match started\n if (match == 0) {\n mstart = {\n i: i,\n j: j,\n pos: pos\n };\n }\n match++;\n if (match == needle.length) {\n // full match\n return mstart.pos;\n }\n } else if (match != 0) {\n // a partial match ended, go back to match starting position\n // this will continue the search at the next character\n i = mstart.i;\n j = mstart.j;\n pos = mstart.pos;\n match = 0;\n }\n\n j++;\n pos++;\n }\n};\n\nBuffers.prototype.toBuffer = function() {\n return this.slice();\n}\n\nBuffers.prototype.toString = function(encoding, start, end) {\n return this.slice(start, end).toString(encoding);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI4OS5qcyIsIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFdBQVc7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsaUJBQWlCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLG1DQUFtQztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9idWZmZXJzL2luZGV4LmpzPzE3ZDkiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBCdWZmZXJzO1xuXG5mdW5jdGlvbiBCdWZmZXJzIChidWZzKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcnMpKSByZXR1cm4gbmV3IEJ1ZmZlcnMoYnVmcyk7XG4gICAgdGhpcy5idWZmZXJzID0gYnVmcyB8fCBbXTtcbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuYnVmZmVycy5yZWR1Y2UoZnVuY3Rpb24gKHNpemUsIGJ1Zikge1xuICAgICAgICByZXR1cm4gc2l6ZSArIGJ1Zi5sZW5ndGhcbiAgICB9LCAwKTtcbn1cblxuQnVmZmVycy5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhcmd1bWVudHNbaV0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUcmllZCB0byBwdXNoIGEgbm9uLWJ1ZmZlcicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBidWYgPSBhcmd1bWVudHNbaV07XG4gICAgICAgIHRoaXMuYnVmZmVycy5wdXNoKGJ1Zik7XG4gICAgICAgIHRoaXMubGVuZ3RoICs9IGJ1Zi5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxlbmd0aDtcbn07XG5cbkJ1ZmZlcnMucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYXJndW1lbnRzW2ldKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJpZWQgdG8gdW5zaGlmdCBhIG5vbi1idWZmZXInKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYnVmID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB0aGlzLmJ1ZmZlcnMudW5zaGlmdChidWYpO1xuICAgICAgICB0aGlzLmxlbmd0aCArPSBidWYubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sZW5ndGg7XG59O1xuXG5CdWZmZXJzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKGRzdCwgZFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2Uoc3RhcnQsIGVuZCkuY29weShkc3QsIGRTdGFydCwgMCwgZW5kIC0gc3RhcnQpO1xufTtcblxuQnVmZmVycy5wcm90b3R5cGUuc3BsaWNlID0gZnVuY3Rpb24gKGksIGhvd01hbnkpIHtcbiAgICB2YXIgYnVmZmVycyA9IHRoaXMuYnVmZmVycztcbiAgICB2YXIgaW5kZXggPSBpID49IDAgPyBpIDogdGhpcy5sZW5ndGggLSBpO1xuICAgIHZhciByZXBzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgIFxuICAgIGlmIChob3dNYW55ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaG93TWFueSA9IHRoaXMubGVuZ3RoIC0gaW5kZXg7XG4gICAgfVxuICAgIGVsc2UgaWYgKGhvd01hbnkgPiB0aGlzLmxlbmd0aCAtIGluZGV4KSB7XG4gICAgICAgIGhvd01hbnkgPSB0aGlzLmxlbmd0aCAtIGluZGV4O1xuICAgIH1cbiAgICBcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5sZW5ndGggKz0gcmVwc1tpXS5sZW5ndGg7XG4gICAgfVxuICAgIFxuICAgIHZhciByZW1vdmVkID0gbmV3IEJ1ZmZlcnMoKTtcbiAgICB2YXIgYnl0ZXMgPSAwO1xuICAgIFxuICAgIHZhciBzdGFydEJ5dGVzID0gMDtcbiAgICBmb3IgKFxuICAgICAgICB2YXIgaWkgPSAwO1xuICAgICAgICBpaSA8IGJ1ZmZlcnMubGVuZ3RoICYmIHN0YXJ0Qnl0ZXMgKyBidWZmZXJzW2lpXS5sZW5ndGggPCBpbmRleDtcbiAgICAgICAgaWkgKytcbiAgICApIHsgc3RhcnRCeXRlcyArPSBidWZmZXJzW2lpXS5sZW5ndGggfVxuICAgIFxuICAgIGlmIChpbmRleCAtIHN0YXJ0Qnl0ZXMgPiAwKSB7XG4gICAgICAgIHZhciBzdGFydCA9IGluZGV4IC0gc3RhcnRCeXRlcztcbiAgICAgICAgXG4gICAgICAgIGlmIChzdGFydCArIGhvd01hbnkgPCBidWZmZXJzW2lpXS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlbW92ZWQucHVzaChidWZmZXJzW2lpXS5zbGljZShzdGFydCwgc3RhcnQgKyBob3dNYW55KSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBvcmlnID0gYnVmZmVyc1tpaV07XG4gICAgICAgICAgICAvL3ZhciBidWYgPSBuZXcgQnVmZmVyKG9yaWcubGVuZ3RoIC0gaG93TWFueSk7XG4gICAgICAgICAgICB2YXIgYnVmMCA9IG5ldyBCdWZmZXIoc3RhcnQpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGFydDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYnVmMFtpXSA9IG9yaWdbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBidWYxID0gbmV3IEJ1ZmZlcihvcmlnLmxlbmd0aCAtIHN0YXJ0IC0gaG93TWFueSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQgKyBob3dNYW55OyBpIDwgb3JpZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGJ1ZjFbIGkgLSBob3dNYW55IC0gc3RhcnQgXSA9IG9yaWdbaV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHJlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciByZXBzXyA9IHJlcHMuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICByZXBzXy51bnNoaWZ0KGJ1ZjApO1xuICAgICAgICAgICAgICAgIHJlcHNfLnB1c2goYnVmMSk7XG4gICAgICAgICAgICAgICAgYnVmZmVycy5zcGxpY2UuYXBwbHkoYnVmZmVycywgWyBpaSwgMSBdLmNvbmNhdChyZXBzXykpO1xuICAgICAgICAgICAgICAgIGlpICs9IHJlcHNfLmxlbmd0aDtcbiAgICAgICAgICAgICAgICByZXBzID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBidWZmZXJzLnNwbGljZShpaSwgMSwgYnVmMCwgYnVmMSk7XG4gICAgICAgICAgICAgICAgLy9idWZmZXJzW2lpXSA9IGJ1ZjtcbiAgICAgICAgICAgICAgICBpaSArPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVtb3ZlZC5wdXNoKGJ1ZmZlcnNbaWldLnNsaWNlKHN0YXJ0KSk7XG4gICAgICAgICAgICBidWZmZXJzW2lpXSA9IGJ1ZmZlcnNbaWldLnNsaWNlKDAsIHN0YXJ0KTtcbiAgICAgICAgICAgIGlpICsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIGlmIChyZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYnVmZmVycy5zcGxpY2UuYXBwbHkoYnVmZmVycywgWyBpaSwgMCBdLmNvbmNhdChyZXBzKSk7XG4gICAgICAgIGlpICs9IHJlcHMubGVuZ3RoO1xuICAgIH1cbiAgICBcbiAgICB3aGlsZSAocmVtb3ZlZC5sZW5ndGggPCBob3dNYW55KSB7XG4gICAgICAgIHZhciBidWYgPSBidWZmZXJzW2lpXTtcbiAgICAgICAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7XG4gICAgICAgIHZhciB0YWtlID0gTWF0aC5taW4obGVuLCBob3dNYW55IC0gcmVtb3ZlZC5sZW5ndGgpO1xuICAgICAgICBcbiAgICAgICAgaWYgKHRha2UgPT09IGxlbikge1xuICAgICAgICAgICAgcmVtb3ZlZC5wdXNoKGJ1Zik7XG4gICAgICAgICAgICBidWZmZXJzLnNwbGljZShpaSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZW1vdmVkLnB1c2goYnVmLnNsaWNlKDAsIHRha2UpKTtcbiAgICAgICAgICAgIGJ1ZmZlcnNbaWldID0gYnVmZmVyc1tpaV0uc2xpY2UodGFrZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhpcy5sZW5ndGggLT0gcmVtb3ZlZC5sZW5ndGg7XG4gICAgXG4gICAgcmV0dXJuIHJlbW92ZWQ7XG59O1xuIFxuQnVmZmVycy5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiAoaSwgaikge1xuICAgIHZhciBidWZmZXJzID0gdGhpcy5idWZmZXJzO1xuICAgIGlmIChqID09PSB1bmRlZmluZWQpIGogPSB0aGlzLmxlbmd0aDtcbiAgICBpZiAoaSA9PT0gdW5kZWZpbmVkKSBpID0gMDtcbiAgICBcbiAgICBpZiAoaiA+IHRoaXMubGVuZ3RoKSBqID0gdGhpcy5sZW5ndGg7XG4gICAgXG4gICAgdmFyIHN0YXJ0Qnl0ZXMgPSAwO1xuICAgIGZvciAoXG4gICAgICAgIHZhciBzaSA9IDA7XG4gICAgICAgIHNpIDwgYnVmZmVycy5sZW5ndGggJiYgc3RhcnRCeXRlcyArIGJ1ZmZlcnNbc2ldLmxlbmd0aCA8PSBpO1xuICAgICAgICBzaSArK1xuICAgICkgeyBzdGFydEJ5dGVzICs9IGJ1ZmZlcnNbc2ldLmxlbmd0aCB9XG4gICAgXG4gICAgdmFyIHRhcmdldCA9IG5ldyBCdWZmZXIoaiAtIGkpO1xuICAgIFxuICAgIHZhciB0aSA9IDA7XG4gICAgZm9yICh2YXIgaWkgPSBzaTsgdGkgPCBqIC0gaSAmJiBpaSA8IGJ1ZmZlcnMubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgIHZhciBsZW4gPSBidWZmZXJzW2lpXS5sZW5ndGg7XG4gICAgICAgIFxuICAgICAgICB2YXIgc3RhcnQgPSB0aSA9PT0gMCA/IGkgLSBzdGFydEJ5dGVzIDogMDtcbiAgICAgICAgdmFyIGVuZCA9IHRpICsgbGVuID49IGogLSBpXG4gICAgICAgICAgICA/IE1hdGgubWluKHN0YXJ0ICsgKGogLSBpKSAtIHRpLCBsZW4pXG4gICAgICAgICAgICA6IGxlblxuICAgICAgICA7XG4gICAgICAgIFxuICAgICAgICBidWZmZXJzW2lpXS5jb3B5KHRhcmdldCwgdGksIHN0YXJ0LCBlbmQpO1xuICAgICAgICB0aSArPSBlbmQgLSBzdGFydDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRhcmdldDtcbn07XG5cbkJ1ZmZlcnMucHJvdG90eXBlLnBvcyA9IGZ1bmN0aW9uIChpKSB7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignb29iJyk7XG4gICAgdmFyIGwgPSBpLCBiaSA9IDAsIGJ1ID0gbnVsbDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGJ1ID0gdGhpcy5idWZmZXJzW2JpXTtcbiAgICAgICAgaWYgKGwgPCBidS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7YnVmOiBiaSwgb2Zmc2V0OiBsfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGwgLT0gYnUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGJpKys7XG4gICAgfVxufTtcblxuQnVmZmVycy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChpKSB7XG4gICAgdmFyIHBvcyA9IHRoaXMucG9zKGkpO1xuXG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyc1twb3MuYnVmXS5nZXQocG9zLm9mZnNldCk7XG59O1xuXG5CdWZmZXJzLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiBzZXQgKGksIGIpIHtcbiAgICB2YXIgcG9zID0gdGhpcy5wb3MoaSk7XG5cbiAgICByZXR1cm4gdGhpcy5idWZmZXJzW3Bvcy5idWZdLnNldChwb3Mub2Zmc2V0LCBiKTtcbn07XG5cbkJ1ZmZlcnMucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiAobmVlZGxlLCBvZmZzZXQpIHtcbiAgICBpZiAoXCJzdHJpbmdcIiA9PT0gdHlwZW9mIG5lZWRsZSkge1xuICAgICAgICBuZWVkbGUgPSBuZXcgQnVmZmVyKG5lZWRsZSk7XG4gICAgfSBlbHNlIGlmIChuZWVkbGUgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgICAgLy8gYWxyZWFkeSBhIGJ1ZmZlclxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0eXBlIGZvciBhIHNlYXJjaCBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoIW5lZWRsZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgdmFyIGkgPSAwLCBqID0gMCwgbWF0Y2ggPSAwLCBtc3RhcnQsIHBvcyA9IDA7XG5cbiAgICAvLyBzdGFydCBzZWFyY2ggZnJvbSBhIHBhcnRpY3VsYXIgcG9pbnQgaW4gdGhlIHZpcnR1YWwgYnVmZmVyXG4gICAgaWYgKG9mZnNldCkge1xuICAgICAgICB2YXIgcCA9IHRoaXMucG9zKG9mZnNldCk7XG4gICAgICAgIGkgPSBwLmJ1ZjtcbiAgICAgICAgaiA9IHAub2Zmc2V0O1xuICAgICAgICBwb3MgPSBvZmZzZXQ7XG4gICAgfVxuXG4gICAgLy8gZm9yIGVhY2ggY2hhcmFjdGVyIGluIHZpcnR1YWwgYnVmZmVyXG4gICAgZm9yICg7Oykge1xuICAgICAgICB3aGlsZSAoaiA+PSB0aGlzLmJ1ZmZlcnNbaV0ubGVuZ3RoKSB7XG4gICAgICAgICAgICBqID0gMDtcbiAgICAgICAgICAgIGkrKztcblxuICAgICAgICAgICAgaWYgKGkgPj0gdGhpcy5idWZmZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIHNlYXJjaCBzdHJpbmcgbm90IGZvdW5kXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoYXIgPSB0aGlzLmJ1ZmZlcnNbaV1bal07XG5cbiAgICAgICAgaWYgKGNoYXIgPT0gbmVlZGxlW21hdGNoXSkge1xuICAgICAgICAgICAgLy8ga2VlcCB0cmFjayB3aGVyZSBtYXRjaCBzdGFydGVkXG4gICAgICAgICAgICBpZiAobWF0Y2ggPT0gMCkge1xuICAgICAgICAgICAgICAgIG1zdGFydCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaTogaSxcbiAgICAgICAgICAgICAgICAgICAgajogaixcbiAgICAgICAgICAgICAgICAgICAgcG9zOiBwb3NcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWF0Y2grKztcbiAgICAgICAgICAgIGlmIChtYXRjaCA9PSBuZWVkbGUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gZnVsbCBtYXRjaFxuICAgICAgICAgICAgICAgIHJldHVybiBtc3RhcnQucG9zO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG1hdGNoICE9IDApIHtcbiAgICAgICAgICAgIC8vIGEgcGFydGlhbCBtYXRjaCBlbmRlZCwgZ28gYmFjayB0byBtYXRjaCBzdGFydGluZyBwb3NpdGlvblxuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGNvbnRpbnVlIHRoZSBzZWFyY2ggYXQgdGhlIG5leHQgY2hhcmFjdGVyXG4gICAgICAgICAgICBpID0gbXN0YXJ0Lmk7XG4gICAgICAgICAgICBqID0gbXN0YXJ0Lmo7XG4gICAgICAgICAgICBwb3MgPSBtc3RhcnQucG9zO1xuICAgICAgICAgICAgbWF0Y2ggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaisrO1xuICAgICAgICBwb3MrKztcbiAgICB9XG59O1xuXG5CdWZmZXJzLnByb3RvdHlwZS50b0J1ZmZlciA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnNsaWNlKCk7XG59XG5cbkJ1ZmZlcnMucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gdGhpcy5zbGljZShzdGFydCwgZW5kKS50b1N0cmluZyhlbmNvZGluZyk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5289\n")},4077:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var Traverse = __webpack_require__(3692);\nvar EventEmitter = (__webpack_require__(2361).EventEmitter);\n\nmodule.exports = Chainsaw;\nfunction Chainsaw (builder) {\n var saw = Chainsaw.saw(builder, {});\n var r = builder.call(saw.handlers, saw);\n if (r !== undefined) saw.handlers = r;\n saw.record();\n return saw.chain();\n};\n\nChainsaw.light = function ChainsawLight (builder) {\n var saw = Chainsaw.saw(builder, {});\n var r = builder.call(saw.handlers, saw);\n if (r !== undefined) saw.handlers = r;\n return saw.chain();\n};\n\nChainsaw.saw = function (builder, handlers) {\n var saw = new EventEmitter;\n saw.handlers = handlers;\n saw.actions = [];\n\n saw.chain = function () {\n var ch = Traverse(saw.handlers).map(function (node) {\n if (this.isRoot) return node;\n var ps = this.path;\n\n if (typeof node === 'function') {\n this.update(function () {\n saw.actions.push({\n path : ps,\n args : [].slice.call(arguments)\n });\n return ch;\n });\n }\n });\n\n process.nextTick(function () {\n saw.emit('begin');\n saw.next();\n });\n\n return ch;\n };\n\n saw.pop = function () {\n return saw.actions.shift();\n };\n\n saw.next = function () {\n var action = saw.pop();\n\n if (!action) {\n saw.emit('end');\n }\n else if (!action.trap) {\n var node = saw.handlers;\n action.path.forEach(function (key) { node = node[key] });\n node.apply(saw.handlers, action.args);\n }\n };\n\n saw.nest = function (cb) {\n var args = [].slice.call(arguments, 1);\n var autonext = true;\n\n if (typeof cb === 'boolean') {\n var autonext = cb;\n cb = args.shift();\n }\n\n var s = Chainsaw.saw(builder, {});\n var r = builder.call(s.handlers, s);\n\n if (r !== undefined) s.handlers = r;\n\n // If we are recording...\n if (\"undefined\" !== typeof saw.step) {\n // ... our children should, too\n s.record();\n }\n\n cb.apply(s.chain(), args);\n if (autonext !== false) s.on('end', saw.next);\n };\n\n saw.record = function () {\n upgradeChainsaw(saw);\n };\n\n ['trap', 'down', 'jump'].forEach(function (method) {\n saw[method] = function () {\n throw new Error(\"To use the trap, down and jump features, please \"+\n \"call record() first to start recording actions.\");\n };\n });\n\n return saw;\n};\n\nfunction upgradeChainsaw(saw) {\n saw.step = 0;\n\n // override pop\n saw.pop = function () {\n return saw.actions[saw.step++];\n };\n\n saw.trap = function (name, cb) {\n var ps = Array.isArray(name) ? name : [name];\n saw.actions.push({\n path : ps,\n step : saw.step,\n cb : cb,\n trap : true\n });\n };\n\n saw.down = function (name) {\n var ps = (Array.isArray(name) ? name : [name]).join('/');\n var i = saw.actions.slice(saw.step).map(function (x) {\n if (x.trap && x.step <= saw.step) return false;\n return x.path.join('/') == ps;\n }).indexOf(true);\n\n if (i >= 0) saw.step += i;\n else saw.step = saw.actions.length;\n\n var act = saw.actions[saw.step - 1];\n if (act && act.trap) {\n // It's a trap!\n saw.step = act.step;\n act.cb();\n }\n else saw.next();\n };\n\n saw.jump = function (step) {\n saw.step = step;\n saw.next();\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA3Ny5qcyIsIm1hcHBpbmdzIjoiQUFBQSxlQUFlLG1CQUFPLENBQUMsSUFBVTtBQUNqQyxtQkFBbUIsd0NBQThCOztBQUVqRDtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsa0JBQWtCO0FBQ25FO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0NBQXdDO0FBQ3hDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9jaGFpbnNhdy9pbmRleC5qcz82MzAyIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBUcmF2ZXJzZSA9IHJlcXVpcmUoJ3RyYXZlcnNlJyk7XG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENoYWluc2F3O1xuZnVuY3Rpb24gQ2hhaW5zYXcgKGJ1aWxkZXIpIHtcbiAgICB2YXIgc2F3ID0gQ2hhaW5zYXcuc2F3KGJ1aWxkZXIsIHt9KTtcbiAgICB2YXIgciA9IGJ1aWxkZXIuY2FsbChzYXcuaGFuZGxlcnMsIHNhdyk7XG4gICAgaWYgKHIgIT09IHVuZGVmaW5lZCkgc2F3LmhhbmRsZXJzID0gcjtcbiAgICBzYXcucmVjb3JkKCk7XG4gICAgcmV0dXJuIHNhdy5jaGFpbigpO1xufTtcblxuQ2hhaW5zYXcubGlnaHQgPSBmdW5jdGlvbiBDaGFpbnNhd0xpZ2h0IChidWlsZGVyKSB7XG4gICAgdmFyIHNhdyA9IENoYWluc2F3LnNhdyhidWlsZGVyLCB7fSk7XG4gICAgdmFyIHIgPSBidWlsZGVyLmNhbGwoc2F3LmhhbmRsZXJzLCBzYXcpO1xuICAgIGlmIChyICE9PSB1bmRlZmluZWQpIHNhdy5oYW5kbGVycyA9IHI7XG4gICAgcmV0dXJuIHNhdy5jaGFpbigpO1xufTtcblxuQ2hhaW5zYXcuc2F3ID0gZnVuY3Rpb24gKGJ1aWxkZXIsIGhhbmRsZXJzKSB7XG4gICAgdmFyIHNhdyA9IG5ldyBFdmVudEVtaXR0ZXI7XG4gICAgc2F3LmhhbmRsZXJzID0gaGFuZGxlcnM7XG4gICAgc2F3LmFjdGlvbnMgPSBbXTtcblxuICAgIHNhdy5jaGFpbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNoID0gVHJhdmVyc2Uoc2F3LmhhbmRsZXJzKS5tYXAoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUm9vdCkgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB2YXIgcHMgPSB0aGlzLnBhdGg7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygbm9kZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2F3LmFjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoIDogcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzIDogW10uc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2g7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2F3LmVtaXQoJ2JlZ2luJyk7XG4gICAgICAgICAgICBzYXcubmV4dCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY2g7XG4gICAgfTtcblxuICAgIHNhdy5wb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBzYXcuYWN0aW9ucy5zaGlmdCgpO1xuICAgIH07XG5cbiAgICBzYXcubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFjdGlvbiA9IHNhdy5wb3AoKTtcblxuICAgICAgICBpZiAoIWFjdGlvbikge1xuICAgICAgICAgICAgc2F3LmVtaXQoJ2VuZCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFhY3Rpb24udHJhcCkge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSBzYXcuaGFuZGxlcnM7XG4gICAgICAgICAgICBhY3Rpb24ucGF0aC5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgbm9kZSA9IG5vZGVba2V5XSB9KTtcbiAgICAgICAgICAgIG5vZGUuYXBwbHkoc2F3LmhhbmRsZXJzLCBhY3Rpb24uYXJncyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgc2F3Lm5lc3QgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIHZhciBhdXRvbmV4dCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB2YXIgYXV0b25leHQgPSBjYjtcbiAgICAgICAgICAgIGNiID0gYXJncy5zaGlmdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHMgPSBDaGFpbnNhdy5zYXcoYnVpbGRlciwge30pO1xuICAgICAgICB2YXIgciA9IGJ1aWxkZXIuY2FsbChzLmhhbmRsZXJzLCBzKTtcblxuICAgICAgICBpZiAociAhPT0gdW5kZWZpbmVkKSBzLmhhbmRsZXJzID0gcjtcblxuICAgICAgICAvLyBJZiB3ZSBhcmUgcmVjb3JkaW5nLi4uXG4gICAgICAgIGlmIChcInVuZGVmaW5lZFwiICE9PSB0eXBlb2Ygc2F3LnN0ZXApIHtcbiAgICAgICAgICAgIC8vIC4uLiBvdXIgY2hpbGRyZW4gc2hvdWxkLCB0b29cbiAgICAgICAgICAgIHMucmVjb3JkKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjYi5hcHBseShzLmNoYWluKCksIGFyZ3MpO1xuICAgICAgICBpZiAoYXV0b25leHQgIT09IGZhbHNlKSBzLm9uKCdlbmQnLCBzYXcubmV4dCk7XG4gICAgfTtcblxuICAgIHNhdy5yZWNvcmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHVwZ3JhZGVDaGFpbnNhdyhzYXcpO1xuICAgIH07XG5cbiAgICBbJ3RyYXAnLCAnZG93bicsICdqdW1wJ10uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICAgIHNhd1ttZXRob2RdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVG8gdXNlIHRoZSB0cmFwLCBkb3duIGFuZCBqdW1wIGZlYXR1cmVzLCBwbGVhc2UgXCIrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjYWxsIHJlY29yZCgpIGZpcnN0IHRvIHN0YXJ0IHJlY29yZGluZyBhY3Rpb25zLlwiKTtcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiBzYXc7XG59O1xuXG5mdW5jdGlvbiB1cGdyYWRlQ2hhaW5zYXcoc2F3KSB7XG4gICAgc2F3LnN0ZXAgPSAwO1xuXG4gICAgLy8gb3ZlcnJpZGUgcG9wXG4gICAgc2F3LnBvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHNhdy5hY3Rpb25zW3Nhdy5zdGVwKytdO1xuICAgIH07XG5cbiAgICBzYXcudHJhcCA9IGZ1bmN0aW9uIChuYW1lLCBjYikge1xuICAgICAgICB2YXIgcHMgPSBBcnJheS5pc0FycmF5KG5hbWUpID8gbmFtZSA6IFtuYW1lXTtcbiAgICAgICAgc2F3LmFjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBwYXRoIDogcHMsXG4gICAgICAgICAgICBzdGVwIDogc2F3LnN0ZXAsXG4gICAgICAgICAgICBjYiA6IGNiLFxuICAgICAgICAgICAgdHJhcCA6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHNhdy5kb3duID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIHBzID0gKEFycmF5LmlzQXJyYXkobmFtZSkgPyBuYW1lIDogW25hbWVdKS5qb2luKCcvJyk7XG4gICAgICAgIHZhciBpID0gc2F3LmFjdGlvbnMuc2xpY2Uoc2F3LnN0ZXApLm1hcChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgaWYgKHgudHJhcCAmJiB4LnN0ZXAgPD0gc2F3LnN0ZXApIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB4LnBhdGguam9pbignLycpID09IHBzO1xuICAgICAgICB9KS5pbmRleE9mKHRydWUpO1xuXG4gICAgICAgIGlmIChpID49IDApIHNhdy5zdGVwICs9IGk7XG4gICAgICAgIGVsc2Ugc2F3LnN0ZXAgPSBzYXcuYWN0aW9ucy5sZW5ndGg7XG5cbiAgICAgICAgdmFyIGFjdCA9IHNhdy5hY3Rpb25zW3Nhdy5zdGVwIC0gMV07XG4gICAgICAgIGlmIChhY3QgJiYgYWN0LnRyYXApIHtcbiAgICAgICAgICAgIC8vIEl0J3MgYSB0cmFwIVxuICAgICAgICAgICAgc2F3LnN0ZXAgPSBhY3Quc3RlcDtcbiAgICAgICAgICAgIGFjdC5jYigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Ugc2F3Lm5leHQoKTtcbiAgICB9O1xuXG4gICAgc2F3Lmp1bXAgPSBmdW5jdGlvbiAoc3RlcCkge1xuICAgICAgICBzYXcuc3RlcCA9IHN0ZXA7XG4gICAgICAgIHNhdy5uZXh0KCk7XG4gICAgfTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4077\n")},9779:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var util = __webpack_require__(3837);\nvar Stream = (__webpack_require__(2781).Stream);\nvar DelayedStream = __webpack_require__(3463);\n\nmodule.exports = CombinedStream;\nfunction CombinedStream() {\n this.writable = false;\n this.readable = true;\n this.dataSize = 0;\n this.maxDataSize = 2 * 1024 * 1024;\n this.pauseStreams = true;\n\n this._released = false;\n this._streams = [];\n this._currentStream = null;\n this._insideLoop = false;\n this._pendingNext = false;\n}\nutil.inherits(CombinedStream, Stream);\n\nCombinedStream.create = function(options) {\n var combinedStream = new this();\n\n options = options || {};\n for (var option in options) {\n combinedStream[option] = options[option];\n }\n\n return combinedStream;\n};\n\nCombinedStream.isStreamLike = function(stream) {\n return (typeof stream !== 'function')\n && (typeof stream !== 'string')\n && (typeof stream !== 'boolean')\n && (typeof stream !== 'number')\n && (!Buffer.isBuffer(stream));\n};\n\nCombinedStream.prototype.append = function(stream) {\n var isStreamLike = CombinedStream.isStreamLike(stream);\n\n if (isStreamLike) {\n if (!(stream instanceof DelayedStream)) {\n var newStream = DelayedStream.create(stream, {\n maxDataSize: Infinity,\n pauseStream: this.pauseStreams,\n });\n stream.on('data', this._checkDataSize.bind(this));\n stream = newStream;\n }\n\n this._handleErrors(stream);\n\n if (this.pauseStreams) {\n stream.pause();\n }\n }\n\n this._streams.push(stream);\n return this;\n};\n\nCombinedStream.prototype.pipe = function(dest, options) {\n Stream.prototype.pipe.call(this, dest, options);\n this.resume();\n return dest;\n};\n\nCombinedStream.prototype._getNext = function() {\n this._currentStream = null;\n\n if (this._insideLoop) {\n this._pendingNext = true;\n return; // defer call\n }\n\n this._insideLoop = true;\n try {\n do {\n this._pendingNext = false;\n this._realGetNext();\n } while (this._pendingNext);\n } finally {\n this._insideLoop = false;\n }\n};\n\nCombinedStream.prototype._realGetNext = function() {\n var stream = this._streams.shift();\n\n\n if (typeof stream == 'undefined') {\n this.end();\n return;\n }\n\n if (typeof stream !== 'function') {\n this._pipeNext(stream);\n return;\n }\n\n var getStream = stream;\n getStream(function(stream) {\n var isStreamLike = CombinedStream.isStreamLike(stream);\n if (isStreamLike) {\n stream.on('data', this._checkDataSize.bind(this));\n this._handleErrors(stream);\n }\n\n this._pipeNext(stream);\n }.bind(this));\n};\n\nCombinedStream.prototype._pipeNext = function(stream) {\n this._currentStream = stream;\n\n var isStreamLike = CombinedStream.isStreamLike(stream);\n if (isStreamLike) {\n stream.on('end', this._getNext.bind(this));\n stream.pipe(this, {end: false});\n return;\n }\n\n var value = stream;\n this.write(value);\n this._getNext();\n};\n\nCombinedStream.prototype._handleErrors = function(stream) {\n var self = this;\n stream.on('error', function(err) {\n self._emitError(err);\n });\n};\n\nCombinedStream.prototype.write = function(data) {\n this.emit('data', data);\n};\n\nCombinedStream.prototype.pause = function() {\n if (!this.pauseStreams) {\n return;\n }\n\n if(this.pauseStreams && this._currentStream && typeof(this._currentStream.pause) == 'function') this._currentStream.pause();\n this.emit('pause');\n};\n\nCombinedStream.prototype.resume = function() {\n if (!this._released) {\n this._released = true;\n this.writable = true;\n this._getNext();\n }\n\n if(this.pauseStreams && this._currentStream && typeof(this._currentStream.resume) == 'function') this._currentStream.resume();\n this.emit('resume');\n};\n\nCombinedStream.prototype.end = function() {\n this._reset();\n this.emit('end');\n};\n\nCombinedStream.prototype.destroy = function() {\n this._reset();\n this.emit('close');\n};\n\nCombinedStream.prototype._reset = function() {\n this.writable = false;\n this._streams = [];\n this._currentStream = null;\n};\n\nCombinedStream.prototype._checkDataSize = function() {\n this._updateDataSize();\n if (this.dataSize <= this.maxDataSize) {\n return;\n }\n\n var message =\n 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.';\n this._emitError(new Error(message));\n};\n\nCombinedStream.prototype._updateDataSize = function() {\n this.dataSize = 0;\n\n var self = this;\n this._streams.forEach(function(stream) {\n if (!stream.dataSize) {\n return;\n }\n\n self.dataSize += stream.dataSize;\n });\n\n if (this._currentStream && this._currentStream.dataSize) {\n this.dataSize += this._currentStream.dataSize;\n }\n};\n\nCombinedStream.prototype._emitError = function(err) {\n this._reset();\n this.emit('error', err);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTc3OS5qcyIsIm1hcHBpbmdzIjoiQUFBQSxXQUFXLG1CQUFPLENBQUMsSUFBTTtBQUN6QixhQUFhLGtDQUF3QjtBQUNyQyxvQkFBb0IsbUJBQU8sQ0FBQyxJQUFnQjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixXQUFXO0FBQ2xDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvY29tYmluZWQtc3RyZWFtL2xpYi9jb21iaW5lZF9zdHJlYW0uanM/NWZkMCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKS5TdHJlYW07XG52YXIgRGVsYXllZFN0cmVhbSA9IHJlcXVpcmUoJ2RlbGF5ZWQtc3RyZWFtJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gQ29tYmluZWRTdHJlYW07XG5mdW5jdGlvbiBDb21iaW5lZFN0cmVhbSgpIHtcbiAgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcbiAgdGhpcy5kYXRhU2l6ZSA9IDA7XG4gIHRoaXMubWF4RGF0YVNpemUgPSAyICogMTAyNCAqIDEwMjQ7XG4gIHRoaXMucGF1c2VTdHJlYW1zID0gdHJ1ZTtcblxuICB0aGlzLl9yZWxlYXNlZCA9IGZhbHNlO1xuICB0aGlzLl9zdHJlYW1zID0gW107XG4gIHRoaXMuX2N1cnJlbnRTdHJlYW0gPSBudWxsO1xuICB0aGlzLl9pbnNpZGVMb29wID0gZmFsc2U7XG4gIHRoaXMuX3BlbmRpbmdOZXh0ID0gZmFsc2U7XG59XG51dGlsLmluaGVyaXRzKENvbWJpbmVkU3RyZWFtLCBTdHJlYW0pO1xuXG5Db21iaW5lZFN0cmVhbS5jcmVhdGUgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIHZhciBjb21iaW5lZFN0cmVhbSA9IG5ldyB0aGlzKCk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGZvciAodmFyIG9wdGlvbiBpbiBvcHRpb25zKSB7XG4gICAgY29tYmluZWRTdHJlYW1bb3B0aW9uXSA9IG9wdGlvbnNbb3B0aW9uXTtcbiAgfVxuXG4gIHJldHVybiBjb21iaW5lZFN0cmVhbTtcbn07XG5cbkNvbWJpbmVkU3RyZWFtLmlzU3RyZWFtTGlrZSA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuICByZXR1cm4gKHR5cGVvZiBzdHJlYW0gIT09ICdmdW5jdGlvbicpXG4gICAgJiYgKHR5cGVvZiBzdHJlYW0gIT09ICdzdHJpbmcnKVxuICAgICYmICh0eXBlb2Ygc3RyZWFtICE9PSAnYm9vbGVhbicpXG4gICAgJiYgKHR5cGVvZiBzdHJlYW0gIT09ICdudW1iZXInKVxuICAgICYmICghQnVmZmVyLmlzQnVmZmVyKHN0cmVhbSkpO1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuICB2YXIgaXNTdHJlYW1MaWtlID0gQ29tYmluZWRTdHJlYW0uaXNTdHJlYW1MaWtlKHN0cmVhbSk7XG5cbiAgaWYgKGlzU3RyZWFtTGlrZSkge1xuICAgIGlmICghKHN0cmVhbSBpbnN0YW5jZW9mIERlbGF5ZWRTdHJlYW0pKSB7XG4gICAgICB2YXIgbmV3U3RyZWFtID0gRGVsYXllZFN0cmVhbS5jcmVhdGUoc3RyZWFtLCB7XG4gICAgICAgIG1heERhdGFTaXplOiBJbmZpbml0eSxcbiAgICAgICAgcGF1c2VTdHJlYW06IHRoaXMucGF1c2VTdHJlYW1zLFxuICAgICAgfSk7XG4gICAgICBzdHJlYW0ub24oJ2RhdGEnLCB0aGlzLl9jaGVja0RhdGFTaXplLmJpbmQodGhpcykpO1xuICAgICAgc3RyZWFtID0gbmV3U3RyZWFtO1xuICAgIH1cblxuICAgIHRoaXMuX2hhbmRsZUVycm9ycyhzdHJlYW0pO1xuXG4gICAgaWYgKHRoaXMucGF1c2VTdHJlYW1zKSB7XG4gICAgICBzdHJlYW0ucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICB0aGlzLl9zdHJlYW1zLnB1c2goc3RyZWFtKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Db21iaW5lZFN0cmVhbS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uKGRlc3QsIG9wdGlvbnMpIHtcbiAgU3RyZWFtLnByb3RvdHlwZS5waXBlLmNhbGwodGhpcywgZGVzdCwgb3B0aW9ucyk7XG4gIHRoaXMucmVzdW1lKCk7XG4gIHJldHVybiBkZXN0O1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLl9nZXROZXh0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX2N1cnJlbnRTdHJlYW0gPSBudWxsO1xuXG4gIGlmICh0aGlzLl9pbnNpZGVMb29wKSB7XG4gICAgdGhpcy5fcGVuZGluZ05leHQgPSB0cnVlO1xuICAgIHJldHVybjsgLy8gZGVmZXIgY2FsbFxuICB9XG5cbiAgdGhpcy5faW5zaWRlTG9vcCA9IHRydWU7XG4gIHRyeSB7XG4gICAgZG8ge1xuICAgICAgdGhpcy5fcGVuZGluZ05leHQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3JlYWxHZXROZXh0KCk7XG4gICAgfSB3aGlsZSAodGhpcy5fcGVuZGluZ05leHQpO1xuICB9IGZpbmFsbHkge1xuICAgIHRoaXMuX2luc2lkZUxvb3AgPSBmYWxzZTtcbiAgfVxufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLl9yZWFsR2V0TmV4dCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3RyZWFtID0gdGhpcy5fc3RyZWFtcy5zaGlmdCgpO1xuXG5cbiAgaWYgKHR5cGVvZiBzdHJlYW0gPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0aGlzLmVuZCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RyZWFtICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5fcGlwZU5leHQoc3RyZWFtKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZ2V0U3RyZWFtID0gc3RyZWFtO1xuICBnZXRTdHJlYW0oZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgdmFyIGlzU3RyZWFtTGlrZSA9IENvbWJpbmVkU3RyZWFtLmlzU3RyZWFtTGlrZShzdHJlYW0pO1xuICAgIGlmIChpc1N0cmVhbUxpa2UpIHtcbiAgICAgIHN0cmVhbS5vbignZGF0YScsIHRoaXMuX2NoZWNrRGF0YVNpemUuYmluZCh0aGlzKSk7XG4gICAgICB0aGlzLl9oYW5kbGVFcnJvcnMoc3RyZWFtKTtcbiAgICB9XG5cbiAgICB0aGlzLl9waXBlTmV4dChzdHJlYW0pO1xuICB9LmJpbmQodGhpcykpO1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLl9waXBlTmV4dCA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuICB0aGlzLl9jdXJyZW50U3RyZWFtID0gc3RyZWFtO1xuXG4gIHZhciBpc1N0cmVhbUxpa2UgPSBDb21iaW5lZFN0cmVhbS5pc1N0cmVhbUxpa2Uoc3RyZWFtKTtcbiAgaWYgKGlzU3RyZWFtTGlrZSkge1xuICAgIHN0cmVhbS5vbignZW5kJywgdGhpcy5fZ2V0TmV4dC5iaW5kKHRoaXMpKTtcbiAgICBzdHJlYW0ucGlwZSh0aGlzLCB7ZW5kOiBmYWxzZX0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB2YWx1ZSA9IHN0cmVhbTtcbiAgdGhpcy53cml0ZSh2YWx1ZSk7XG4gIHRoaXMuX2dldE5leHQoKTtcbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS5faGFuZGxlRXJyb3JzID0gZnVuY3Rpb24oc3RyZWFtKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc3RyZWFtLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikge1xuICAgIHNlbGYuX2VtaXRFcnJvcihlcnIpO1xuICB9KTtcbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgdGhpcy5lbWl0KCdkYXRhJywgZGF0YSk7XG59O1xuXG5Db21iaW5lZFN0cmVhbS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLnBhdXNlU3RyZWFtcykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmKHRoaXMucGF1c2VTdHJlYW1zICYmIHRoaXMuX2N1cnJlbnRTdHJlYW0gJiYgdHlwZW9mKHRoaXMuX2N1cnJlbnRTdHJlYW0ucGF1c2UpID09ICdmdW5jdGlvbicpIHRoaXMuX2N1cnJlbnRTdHJlYW0ucGF1c2UoKTtcbiAgdGhpcy5lbWl0KCdwYXVzZScpO1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMuX3JlbGVhc2VkKSB7XG4gICAgdGhpcy5fcmVsZWFzZWQgPSB0cnVlO1xuICAgIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuICAgIHRoaXMuX2dldE5leHQoKTtcbiAgfVxuXG4gIGlmKHRoaXMucGF1c2VTdHJlYW1zICYmIHRoaXMuX2N1cnJlbnRTdHJlYW0gJiYgdHlwZW9mKHRoaXMuX2N1cnJlbnRTdHJlYW0ucmVzdW1lKSA9PSAnZnVuY3Rpb24nKSB0aGlzLl9jdXJyZW50U3RyZWFtLnJlc3VtZSgpO1xuICB0aGlzLmVtaXQoJ3Jlc3VtZScpO1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9yZXNldCgpO1xuICB0aGlzLmVtaXQoJ2VuZCcpO1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fcmVzZXQoKTtcbiAgdGhpcy5lbWl0KCdjbG9zZScpO1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLl9yZXNldCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gIHRoaXMuX3N0cmVhbXMgPSBbXTtcbiAgdGhpcy5fY3VycmVudFN0cmVhbSA9IG51bGw7XG59O1xuXG5Db21iaW5lZFN0cmVhbS5wcm90b3R5cGUuX2NoZWNrRGF0YVNpemUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fdXBkYXRlRGF0YVNpemUoKTtcbiAgaWYgKHRoaXMuZGF0YVNpemUgPD0gdGhpcy5tYXhEYXRhU2l6ZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBtZXNzYWdlID1cbiAgICAnRGVsYXllZFN0cmVhbSNtYXhEYXRhU2l6ZSBvZiAnICsgdGhpcy5tYXhEYXRhU2l6ZSArICcgYnl0ZXMgZXhjZWVkZWQuJztcbiAgdGhpcy5fZW1pdEVycm9yKG5ldyBFcnJvcihtZXNzYWdlKSk7XG59O1xuXG5Db21iaW5lZFN0cmVhbS5wcm90b3R5cGUuX3VwZGF0ZURhdGFTaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZGF0YVNpemUgPSAwO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy5fc3RyZWFtcy5mb3JFYWNoKGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgIGlmICghc3RyZWFtLmRhdGFTaXplKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2VsZi5kYXRhU2l6ZSArPSBzdHJlYW0uZGF0YVNpemU7XG4gIH0pO1xuXG4gIGlmICh0aGlzLl9jdXJyZW50U3RyZWFtICYmIHRoaXMuX2N1cnJlbnRTdHJlYW0uZGF0YVNpemUpIHtcbiAgICB0aGlzLmRhdGFTaXplICs9IHRoaXMuX2N1cnJlbnRTdHJlYW0uZGF0YVNpemU7XG4gIH1cbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS5fZW1pdEVycm9yID0gZnVuY3Rpb24oZXJyKSB7XG4gIHRoaXMuX3Jlc2V0KCk7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9779\n")},8919:module=>{eval("/**\n * node-compress-commons\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-compress-commons/blob/master/LICENSE-MIT\n */\nvar ArchiveEntry = module.exports = function() {};\n\nArchiveEntry.prototype.getName = function() {};\n\nArchiveEntry.prototype.getSize = function() {};\n\nArchiveEntry.prototype.getLastModifiedDate = function() {};\n\nArchiveEntry.prototype.isDirectory = function() {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODkxOS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvY29tcHJlc3MtY29tbW9ucy9saWIvYXJjaGl2ZXJzL2FyY2hpdmUtZW50cnkuanM/OWIyOCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG5vZGUtY29tcHJlc3MtY29tbW9uc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWNvbXByZXNzLWNvbW1vbnMvYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVRcbiAqL1xudmFyIEFyY2hpdmVFbnRyeSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7fTtcblxuQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXROYW1lID0gZnVuY3Rpb24oKSB7fTtcblxuQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRTaXplID0gZnVuY3Rpb24oKSB7fTtcblxuQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRMYXN0TW9kaWZpZWREYXRlID0gZnVuY3Rpb24oKSB7fTtcblxuQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5pc0RpcmVjdG9yeSA9IGZ1bmN0aW9uKCkge307Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8919\n")},211:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * node-compress-commons\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-compress-commons/blob/master/LICENSE-MIT\n */\nvar inherits = (__webpack_require__(3837).inherits);\nvar Transform = (__webpack_require__(1451).Transform);\n\nvar ArchiveEntry = __webpack_require__(8919);\nvar util = __webpack_require__(5986);\n\nvar ArchiveOutputStream = module.exports = function(options) {\n if (!(this instanceof ArchiveOutputStream)) {\n return new ArchiveOutputStream(options);\n }\n\n Transform.call(this, options);\n\n this.offset = 0;\n this._archive = {\n finish: false,\n finished: false,\n processing: false\n };\n};\n\ninherits(ArchiveOutputStream, Transform);\n\nArchiveOutputStream.prototype._appendBuffer = function(zae, source, callback) {\n // scaffold only\n};\n\nArchiveOutputStream.prototype._appendStream = function(zae, source, callback) {\n // scaffold only\n};\n\nArchiveOutputStream.prototype._emitErrorCallback = function(err) {\n if (err) {\n this.emit('error', err);\n }\n};\n\nArchiveOutputStream.prototype._finish = function(ae) {\n // scaffold only\n};\n\nArchiveOutputStream.prototype._normalizeEntry = function(ae) {\n // scaffold only\n};\n\nArchiveOutputStream.prototype._transform = function(chunk, encoding, callback) {\n callback(null, chunk);\n};\n\nArchiveOutputStream.prototype.entry = function(ae, source, callback) {\n source = source || null;\n\n if (typeof callback !== 'function') {\n callback = this._emitErrorCallback.bind(this);\n }\n\n if (!(ae instanceof ArchiveEntry)) {\n callback(new Error('not a valid instance of ArchiveEntry'));\n return;\n }\n\n if (this._archive.finish || this._archive.finished) {\n callback(new Error('unacceptable entry after finish'));\n return;\n }\n\n if (this._archive.processing) {\n callback(new Error('already processing an entry'));\n return;\n }\n\n this._archive.processing = true;\n this._normalizeEntry(ae);\n this._entry = ae;\n\n source = util.normalizeInputSource(source);\n\n if (Buffer.isBuffer(source)) {\n this._appendBuffer(ae, source, callback);\n } else if (util.isStream(source)) {\n this._appendStream(ae, source, callback);\n } else {\n this._archive.processing = false;\n callback(new Error('input source must be valid Stream or Buffer instance'));\n return;\n }\n\n return this;\n};\n\nArchiveOutputStream.prototype.finish = function() {\n if (this._archive.processing) {\n this._archive.finish = true;\n return;\n }\n\n this._finish();\n};\n\nArchiveOutputStream.prototype.getBytesWritten = function() {\n return this.offset;\n};\n\nArchiveOutputStream.prototype.write = function(chunk, cb) {\n if (chunk) {\n this.offset += chunk.length;\n }\n\n return Transform.prototype.write.call(this, chunk, cb);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjExLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQ0FBd0I7QUFDdkMsZ0JBQWdCLHFDQUFvQzs7QUFFcEQsbUJBQW1CLG1CQUFPLENBQUMsSUFBaUI7QUFDNUMsV0FBVyxtQkFBTyxDQUFDLElBQVM7O0FBRTVCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2NvbXByZXNzLWNvbW1vbnMvbGliL2FyY2hpdmVycy9hcmNoaXZlLW91dHB1dC1zdHJlYW0uanM/MTBjMiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG5vZGUtY29tcHJlc3MtY29tbW9uc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWNvbXByZXNzLWNvbW1vbnMvYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVRcbiAqL1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgndXRpbCcpLmluaGVyaXRzO1xudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpLlRyYW5zZm9ybTtcblxudmFyIEFyY2hpdmVFbnRyeSA9IHJlcXVpcmUoJy4vYXJjaGl2ZS1lbnRyeScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsJyk7XG5cbnZhciBBcmNoaXZlT3V0cHV0U3RyZWFtID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBBcmNoaXZlT3V0cHV0U3RyZWFtKSkge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZU91dHB1dFN0cmVhbShvcHRpb25zKTtcbiAgfVxuXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMub2Zmc2V0ID0gMDtcbiAgdGhpcy5fYXJjaGl2ZSA9IHtcbiAgICBmaW5pc2g6IGZhbHNlLFxuICAgIGZpbmlzaGVkOiBmYWxzZSxcbiAgICBwcm9jZXNzaW5nOiBmYWxzZVxuICB9O1xufTtcblxuaW5oZXJpdHMoQXJjaGl2ZU91dHB1dFN0cmVhbSwgVHJhbnNmb3JtKTtcblxuQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuX2FwcGVuZEJ1ZmZlciA9IGZ1bmN0aW9uKHphZSwgc291cmNlLCBjYWxsYmFjaykge1xuICAvLyBzY2FmZm9sZCBvbmx5XG59O1xuXG5BcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fYXBwZW5kU3RyZWFtID0gZnVuY3Rpb24oemFlLCBzb3VyY2UsIGNhbGxiYWNrKSB7XG4gIC8vIHNjYWZmb2xkIG9ubHlcbn07XG5cbkFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLl9lbWl0RXJyb3JDYWxsYmFjayA9IGZ1bmN0aW9uKGVycikge1xuICBpZiAoZXJyKSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cbn07XG5cbkFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLl9maW5pc2ggPSBmdW5jdGlvbihhZSkge1xuICAvLyBzY2FmZm9sZCBvbmx5XG59O1xuXG5BcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fbm9ybWFsaXplRW50cnkgPSBmdW5jdGlvbihhZSkge1xuICAvLyBzY2FmZm9sZCBvbmx5XG59O1xuXG5BcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICBjYWxsYmFjayhudWxsLCBjaHVuayk7XG59O1xuXG5BcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5lbnRyeSA9IGZ1bmN0aW9uKGFlLCBzb3VyY2UsIGNhbGxiYWNrKSB7XG4gIHNvdXJjZSA9IHNvdXJjZSB8fCBudWxsO1xuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IHRoaXMuX2VtaXRFcnJvckNhbGxiYWNrLmJpbmQodGhpcyk7XG4gIH1cblxuICBpZiAoIShhZSBpbnN0YW5jZW9mIEFyY2hpdmVFbnRyeSkpIHtcbiAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ25vdCBhIHZhbGlkIGluc3RhbmNlIG9mIEFyY2hpdmVFbnRyeScpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodGhpcy5fYXJjaGl2ZS5maW5pc2ggfHwgdGhpcy5fYXJjaGl2ZS5maW5pc2hlZCkge1xuICAgIGNhbGxiYWNrKG5ldyBFcnJvcigndW5hY2NlcHRhYmxlIGVudHJ5IGFmdGVyIGZpbmlzaCcpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodGhpcy5fYXJjaGl2ZS5wcm9jZXNzaW5nKSB7XG4gICAgY2FsbGJhY2sobmV3IEVycm9yKCdhbHJlYWR5IHByb2Nlc3NpbmcgYW4gZW50cnknKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5fYXJjaGl2ZS5wcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdGhpcy5fbm9ybWFsaXplRW50cnkoYWUpO1xuICB0aGlzLl9lbnRyeSA9IGFlO1xuXG4gIHNvdXJjZSA9IHV0aWwubm9ybWFsaXplSW5wdXRTb3VyY2Uoc291cmNlKTtcblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHNvdXJjZSkpIHtcbiAgICB0aGlzLl9hcHBlbmRCdWZmZXIoYWUsIHNvdXJjZSwgY2FsbGJhY2spO1xuICB9IGVsc2UgaWYgKHV0aWwuaXNTdHJlYW0oc291cmNlKSkge1xuICAgIHRoaXMuX2FwcGVuZFN0cmVhbShhZSwgc291cmNlLCBjYWxsYmFjayk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fYXJjaGl2ZS5wcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgY2FsbGJhY2sobmV3IEVycm9yKCdpbnB1dCBzb3VyY2UgbXVzdCBiZSB2YWxpZCBTdHJlYW0gb3IgQnVmZmVyIGluc3RhbmNlJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuZmluaXNoID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLl9hcmNoaXZlLnByb2Nlc3NpbmcpIHtcbiAgICB0aGlzLl9hcmNoaXZlLmZpbmlzaCA9IHRydWU7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5fZmluaXNoKCk7XG59O1xuXG5BcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5nZXRCeXRlc1dyaXR0ZW4gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMub2Zmc2V0O1xufTtcblxuQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihjaHVuaywgY2IpIHtcbiAgaWYgKGNodW5rKSB7XG4gICAgdGhpcy5vZmZzZXQgKz0gY2h1bmsubGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIFRyYW5zZm9ybS5wcm90b3R5cGUud3JpdGUuY2FsbCh0aGlzLCBjaHVuaywgY2IpO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///211\n")},5551:module=>{eval("/**\n * node-compress-commons\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-compress-commons/blob/master/LICENSE-MIT\n */\nmodule.exports = {\n WORD: 4,\n DWORD: 8,\n EMPTY: Buffer.alloc(0),\n\n SHORT: 2,\n SHORT_MASK: 0xffff,\n SHORT_SHIFT: 16,\n SHORT_ZERO: Buffer.from(Array(2)),\n LONG: 4,\n LONG_ZERO: Buffer.from(Array(4)),\n\n MIN_VERSION_INITIAL: 10,\n MIN_VERSION_DATA_DESCRIPTOR: 20,\n MIN_VERSION_ZIP64: 45,\n VERSION_MADEBY: 45,\n\n METHOD_STORED: 0,\n METHOD_DEFLATED: 8,\n\n PLATFORM_UNIX: 3,\n PLATFORM_FAT: 0,\n\n SIG_LFH: 0x04034b50,\n SIG_DD: 0x08074b50,\n SIG_CFH: 0x02014b50,\n SIG_EOCD: 0x06054b50,\n SIG_ZIP64_EOCD: 0x06064B50,\n SIG_ZIP64_EOCD_LOC: 0x07064B50,\n\n ZIP64_MAGIC_SHORT: 0xffff,\n ZIP64_MAGIC: 0xffffffff,\n ZIP64_EXTRA_ID: 0x0001,\n\n ZLIB_NO_COMPRESSION: 0,\n ZLIB_BEST_SPEED: 1,\n ZLIB_BEST_COMPRESSION: 9,\n ZLIB_DEFAULT_COMPRESSION: -1,\n\n MODE_MASK: 0xFFF,\n DEFAULT_FILE_MODE: 33188, // 010644 = -rw-r--r-- = S_IFREG | S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH\n DEFAULT_DIR_MODE: 16877, // 040755 = drwxr-xr-x = S_IFDIR | S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH\n\n EXT_FILE_ATTR_DIR: 1106051088, // 010173200020 = drwxr-xr-x = (((S_IFDIR | 0755) << 16) | S_DOS_D)\n EXT_FILE_ATTR_FILE: 2175008800, // 020151000040 = -rw-r--r-- = (((S_IFREG | 0644) << 16) | S_DOS_A) >>> 0\n\n // Unix file types\n S_IFMT: 61440, // 0170000 type of file mask\n S_IFIFO: 4096, // 010000 named pipe (fifo)\n S_IFCHR: 8192, // 020000 character special\n S_IFDIR: 16384, // 040000 directory\n S_IFBLK: 24576, // 060000 block special\n S_IFREG: 32768, // 0100000 regular\n S_IFLNK: 40960, // 0120000 symbolic link\n S_IFSOCK: 49152, // 0140000 socket\n\n // DOS file type flags\n S_DOS_A: 32, // 040 Archive\n S_DOS_D: 16, // 020 Directory\n S_DOS_V: 8, // 010 Volume\n S_DOS_S: 4, // 04 System\n S_DOS_H: 2, // 02 Hidden\n S_DOS_R: 1 // 01 Read Only\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU1MS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2NvbXByZXNzLWNvbW1vbnMvbGliL2FyY2hpdmVycy96aXAvY29uc3RhbnRzLmpzPzY1NTciXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBub2RlLWNvbXByZXNzLWNvbW1vbnNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgQ2hyaXMgVGFsa2luZ3RvbiwgY29udHJpYnV0b3JzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICogaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1jb21wcmVzcy1jb21tb25zL2Jsb2IvbWFzdGVyL0xJQ0VOU0UtTUlUXG4gKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuICBXT1JEOiA0LFxuICBEV09SRDogOCxcbiAgRU1QVFk6IEJ1ZmZlci5hbGxvYygwKSxcblxuICBTSE9SVDogMixcbiAgU0hPUlRfTUFTSzogMHhmZmZmLFxuICBTSE9SVF9TSElGVDogMTYsXG4gIFNIT1JUX1pFUk86IEJ1ZmZlci5mcm9tKEFycmF5KDIpKSxcbiAgTE9ORzogNCxcbiAgTE9OR19aRVJPOiBCdWZmZXIuZnJvbShBcnJheSg0KSksXG5cbiAgTUlOX1ZFUlNJT05fSU5JVElBTDogMTAsXG4gIE1JTl9WRVJTSU9OX0RBVEFfREVTQ1JJUFRPUjogMjAsXG4gIE1JTl9WRVJTSU9OX1pJUDY0OiA0NSxcbiAgVkVSU0lPTl9NQURFQlk6IDQ1LFxuXG4gIE1FVEhPRF9TVE9SRUQ6IDAsXG4gIE1FVEhPRF9ERUZMQVRFRDogOCxcblxuICBQTEFURk9STV9VTklYOiAzLFxuICBQTEFURk9STV9GQVQ6IDAsXG5cbiAgU0lHX0xGSDogMHgwNDAzNGI1MCxcbiAgU0lHX0REOiAweDA4MDc0YjUwLFxuICBTSUdfQ0ZIOiAweDAyMDE0YjUwLFxuICBTSUdfRU9DRDogMHgwNjA1NGI1MCxcbiAgU0lHX1pJUDY0X0VPQ0Q6IDB4MDYwNjRCNTAsXG4gIFNJR19aSVA2NF9FT0NEX0xPQzogMHgwNzA2NEI1MCxcblxuICBaSVA2NF9NQUdJQ19TSE9SVDogMHhmZmZmLFxuICBaSVA2NF9NQUdJQzogMHhmZmZmZmZmZixcbiAgWklQNjRfRVhUUkFfSUQ6IDB4MDAwMSxcblxuICBaTElCX05PX0NPTVBSRVNTSU9OOiAwLFxuICBaTElCX0JFU1RfU1BFRUQ6IDEsXG4gIFpMSUJfQkVTVF9DT01QUkVTU0lPTjogOSxcbiAgWkxJQl9ERUZBVUxUX0NPTVBSRVNTSU9OOiAtMSxcblxuICBNT0RFX01BU0s6IDB4RkZGLFxuICBERUZBVUxUX0ZJTEVfTU9ERTogMzMxODgsIC8vIDAxMDY0NCA9IC1ydy1yLS1yLS0gPSBTX0lGUkVHIHwgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USFxuICBERUZBVUxUX0RJUl9NT0RFOiAxNjg3NywgIC8vIDA0MDc1NSA9IGRyd3hyLXhyLXggPSBTX0lGRElSIHwgU19JUldYVSB8IFNfSVJHUlAgfCBTX0lYR1JQIHwgU19JUk9USCB8IFNfSVhPVEhcblxuICBFWFRfRklMRV9BVFRSX0RJUjogMTEwNjA1MTA4OCwgIC8vIDAxMDE3MzIwMDAyMCA9IGRyd3hyLXhyLXggPSAoKChTX0lGRElSIHwgMDc1NSkgPDwgMTYpIHwgU19ET1NfRClcbiAgRVhUX0ZJTEVfQVRUUl9GSUxFOiAyMTc1MDA4ODAwLCAvLyAwMjAxNTEwMDAwNDAgPSAtcnctci0tci0tID0gKCgoU19JRlJFRyB8IDA2NDQpIDw8IDE2KSB8IFNfRE9TX0EpID4+PiAwXG5cbiAgLy8gVW5peCBmaWxlIHR5cGVzXG4gIFNfSUZNVDogNjE0NDAsICAgLy8gMDE3MDAwMCB0eXBlIG9mIGZpbGUgbWFza1xuICBTX0lGSUZPOiA0MDk2LCAgIC8vIDAxMDAwMCBuYW1lZCBwaXBlIChmaWZvKVxuICBTX0lGQ0hSOiA4MTkyLCAgIC8vIDAyMDAwMCBjaGFyYWN0ZXIgc3BlY2lhbFxuICBTX0lGRElSOiAxNjM4NCwgIC8vIDA0MDAwMCBkaXJlY3RvcnlcbiAgU19JRkJMSzogMjQ1NzYsICAvLyAwNjAwMDAgYmxvY2sgc3BlY2lhbFxuICBTX0lGUkVHOiAzMjc2OCwgIC8vIDAxMDAwMDAgcmVndWxhclxuICBTX0lGTE5LOiA0MDk2MCwgIC8vIDAxMjAwMDAgc3ltYm9saWMgbGlua1xuICBTX0lGU09DSzogNDkxNTIsIC8vIDAxNDAwMDAgc29ja2V0XG5cbiAgLy8gRE9TIGZpbGUgdHlwZSBmbGFnc1xuICBTX0RPU19BOiAzMiwgLy8gMDQwIEFyY2hpdmVcbiAgU19ET1NfRDogMTYsIC8vIDAyMCBEaXJlY3RvcnlcbiAgU19ET1NfVjogOCwgIC8vIDAxMCBWb2x1bWVcbiAgU19ET1NfUzogNCwgIC8vIDA0IFN5c3RlbVxuICBTX0RPU19IOiAyLCAgLy8gMDIgSGlkZGVuXG4gIFNfRE9TX1I6IDEgICAvLyAwMSBSZWFkIE9ubHlcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5551\n")},7622:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * node-compress-commons\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-compress-commons/blob/master/LICENSE-MIT\n */\nvar zipUtil = __webpack_require__(931);\n\nvar DATA_DESCRIPTOR_FLAG = 1 << 3;\nvar ENCRYPTION_FLAG = 1 << 0;\nvar NUMBER_OF_SHANNON_FANO_TREES_FLAG = 1 << 2;\nvar SLIDING_DICTIONARY_SIZE_FLAG = 1 << 1;\nvar STRONG_ENCRYPTION_FLAG = 1 << 6;\nvar UFT8_NAMES_FLAG = 1 << 11;\n\nvar GeneralPurposeBit = module.exports = function() {\n if (!(this instanceof GeneralPurposeBit)) {\n return new GeneralPurposeBit();\n }\n\n this.descriptor = false;\n this.encryption = false;\n this.utf8 = false;\n this.numberOfShannonFanoTrees = 0;\n this.strongEncryption = false;\n this.slidingDictionarySize = 0;\n\n return this;\n};\n\nGeneralPurposeBit.prototype.encode = function() {\n return zipUtil.getShortBytes(\n (this.descriptor ? DATA_DESCRIPTOR_FLAG : 0) |\n (this.utf8 ? UFT8_NAMES_FLAG : 0) |\n (this.encryption ? ENCRYPTION_FLAG : 0) |\n (this.strongEncryption ? STRONG_ENCRYPTION_FLAG : 0)\n );\n};\n\nGeneralPurposeBit.prototype.parse = function(buf, offset) {\n var flag = zipUtil.getShortBytesValue(buf, offset);\n var gbp = new GeneralPurposeBit();\n\n gbp.useDataDescriptor((flag & DATA_DESCRIPTOR_FLAG) !== 0);\n gbp.useUTF8ForNames((flag & UFT8_NAMES_FLAG) !== 0);\n gbp.useStrongEncryption((flag & STRONG_ENCRYPTION_FLAG) !== 0);\n gbp.useEncryption((flag & ENCRYPTION_FLAG) !== 0);\n gbp.setSlidingDictionarySize((flag & SLIDING_DICTIONARY_SIZE_FLAG) !== 0 ? 8192 : 4096);\n gbp.setNumberOfShannonFanoTrees((flag & NUMBER_OF_SHANNON_FANO_TREES_FLAG) !== 0 ? 3 : 2);\n\n return gbp;\n};\n\nGeneralPurposeBit.prototype.setNumberOfShannonFanoTrees = function(n) {\n this.numberOfShannonFanoTrees = n;\n};\n\nGeneralPurposeBit.prototype.getNumberOfShannonFanoTrees = function() {\n return this.numberOfShannonFanoTrees;\n};\n\nGeneralPurposeBit.prototype.setSlidingDictionarySize = function(n) {\n this.slidingDictionarySize = n;\n};\n\nGeneralPurposeBit.prototype.getSlidingDictionarySize = function() {\n return this.slidingDictionarySize;\n};\n\nGeneralPurposeBit.prototype.useDataDescriptor = function(b) {\n this.descriptor = b;\n};\n\nGeneralPurposeBit.prototype.usesDataDescriptor = function() {\n return this.descriptor;\n};\n\nGeneralPurposeBit.prototype.useEncryption = function(b) {\n this.encryption = b;\n};\n\nGeneralPurposeBit.prototype.usesEncryption = function() {\n return this.encryption;\n};\n\nGeneralPurposeBit.prototype.useStrongEncryption = function(b) {\n this.strongEncryption = b;\n};\n\nGeneralPurposeBit.prototype.usesStrongEncryption = function() {\n return this.strongEncryption;\n};\n\nGeneralPurposeBit.prototype.useUTF8ForNames = function(b) {\n this.utf8 = b;\n};\n\nGeneralPurposeBit.prototype.usesUTF8ForNames = function() {\n return this.utf8;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzYyMi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsbUJBQU8sQ0FBQyxHQUFROztBQUU5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9jb21wcmVzcy1jb21tb25zL2xpYi9hcmNoaXZlcnMvemlwL2dlbmVyYWwtcHVycG9zZS1iaXQuanM/M2Q1YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG5vZGUtY29tcHJlc3MtY29tbW9uc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWNvbXByZXNzLWNvbW1vbnMvYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVRcbiAqL1xudmFyIHppcFV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxudmFyIERBVEFfREVTQ1JJUFRPUl9GTEFHID0gMSA8PCAzO1xudmFyIEVOQ1JZUFRJT05fRkxBRyA9IDEgPDwgMDtcbnZhciBOVU1CRVJfT0ZfU0hBTk5PTl9GQU5PX1RSRUVTX0ZMQUcgPSAxIDw8IDI7XG52YXIgU0xJRElOR19ESUNUSU9OQVJZX1NJWkVfRkxBRyA9IDEgPDwgMTtcbnZhciBTVFJPTkdfRU5DUllQVElPTl9GTEFHID0gMSA8PCA2O1xudmFyIFVGVDhfTkFNRVNfRkxBRyA9IDEgPDwgMTE7XG5cbnZhciBHZW5lcmFsUHVycG9zZUJpdCA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBHZW5lcmFsUHVycG9zZUJpdCkpIHtcbiAgICByZXR1cm4gbmV3IEdlbmVyYWxQdXJwb3NlQml0KCk7XG4gIH1cblxuICB0aGlzLmRlc2NyaXB0b3IgPSBmYWxzZTtcbiAgdGhpcy5lbmNyeXB0aW9uID0gZmFsc2U7XG4gIHRoaXMudXRmOCA9IGZhbHNlO1xuICB0aGlzLm51bWJlck9mU2hhbm5vbkZhbm9UcmVlcyA9IDA7XG4gIHRoaXMuc3Ryb25nRW5jcnlwdGlvbiA9IGZhbHNlO1xuICB0aGlzLnNsaWRpbmdEaWN0aW9uYXJ5U2l6ZSA9IDA7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HZW5lcmFsUHVycG9zZUJpdC5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB6aXBVdGlsLmdldFNob3J0Qnl0ZXMoXG4gICAgKHRoaXMuZGVzY3JpcHRvciA/IERBVEFfREVTQ1JJUFRPUl9GTEFHIDogMCkgfFxuICAgICh0aGlzLnV0ZjggPyBVRlQ4X05BTUVTX0ZMQUcgOiAwKSB8XG4gICAgKHRoaXMuZW5jcnlwdGlvbiA/IEVOQ1JZUFRJT05fRkxBRyA6IDApIHxcbiAgICAodGhpcy5zdHJvbmdFbmNyeXB0aW9uID8gU1RST05HX0VOQ1JZUFRJT05fRkxBRyA6IDApXG4gICk7XG59O1xuXG5HZW5lcmFsUHVycG9zZUJpdC5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbihidWYsIG9mZnNldCkge1xuICB2YXIgZmxhZyA9IHppcFV0aWwuZ2V0U2hvcnRCeXRlc1ZhbHVlKGJ1Ziwgb2Zmc2V0KTtcbiAgdmFyIGdicCA9IG5ldyBHZW5lcmFsUHVycG9zZUJpdCgpO1xuXG4gIGdicC51c2VEYXRhRGVzY3JpcHRvcigoZmxhZyAmIERBVEFfREVTQ1JJUFRPUl9GTEFHKSAhPT0gMCk7XG4gIGdicC51c2VVVEY4Rm9yTmFtZXMoKGZsYWcgJiBVRlQ4X05BTUVTX0ZMQUcpICE9PSAwKTtcbiAgZ2JwLnVzZVN0cm9uZ0VuY3J5cHRpb24oKGZsYWcgJiBTVFJPTkdfRU5DUllQVElPTl9GTEFHKSAhPT0gMCk7XG4gIGdicC51c2VFbmNyeXB0aW9uKChmbGFnICYgRU5DUllQVElPTl9GTEFHKSAhPT0gMCk7XG4gIGdicC5zZXRTbGlkaW5nRGljdGlvbmFyeVNpemUoKGZsYWcgJiBTTElESU5HX0RJQ1RJT05BUllfU0laRV9GTEFHKSAhPT0gMCA/IDgxOTIgOiA0MDk2KTtcbiAgZ2JwLnNldE51bWJlck9mU2hhbm5vbkZhbm9UcmVlcygoZmxhZyAmIE5VTUJFUl9PRl9TSEFOTk9OX0ZBTk9fVFJFRVNfRkxBRykgIT09IDAgPyAzIDogMik7XG5cbiAgcmV0dXJuIGdicDtcbn07XG5cbkdlbmVyYWxQdXJwb3NlQml0LnByb3RvdHlwZS5zZXROdW1iZXJPZlNoYW5ub25GYW5vVHJlZXMgPSBmdW5jdGlvbihuKSB7XG4gIHRoaXMubnVtYmVyT2ZTaGFubm9uRmFub1RyZWVzID0gbjtcbn07XG5cbkdlbmVyYWxQdXJwb3NlQml0LnByb3RvdHlwZS5nZXROdW1iZXJPZlNoYW5ub25GYW5vVHJlZXMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMubnVtYmVyT2ZTaGFubm9uRmFub1RyZWVzO1xufTtcblxuR2VuZXJhbFB1cnBvc2VCaXQucHJvdG90eXBlLnNldFNsaWRpbmdEaWN0aW9uYXJ5U2l6ZSA9IGZ1bmN0aW9uKG4pIHtcbiAgdGhpcy5zbGlkaW5nRGljdGlvbmFyeVNpemUgPSBuO1xufTtcblxuR2VuZXJhbFB1cnBvc2VCaXQucHJvdG90eXBlLmdldFNsaWRpbmdEaWN0aW9uYXJ5U2l6ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5zbGlkaW5nRGljdGlvbmFyeVNpemU7XG59O1xuXG5HZW5lcmFsUHVycG9zZUJpdC5wcm90b3R5cGUudXNlRGF0YURlc2NyaXB0b3IgPSBmdW5jdGlvbihiKSB7XG4gIHRoaXMuZGVzY3JpcHRvciA9IGI7XG59O1xuXG5HZW5lcmFsUHVycG9zZUJpdC5wcm90b3R5cGUudXNlc0RhdGFEZXNjcmlwdG9yID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmRlc2NyaXB0b3I7XG59O1xuXG5HZW5lcmFsUHVycG9zZUJpdC5wcm90b3R5cGUudXNlRW5jcnlwdGlvbiA9IGZ1bmN0aW9uKGIpIHtcbiAgdGhpcy5lbmNyeXB0aW9uID0gYjtcbn07XG5cbkdlbmVyYWxQdXJwb3NlQml0LnByb3RvdHlwZS51c2VzRW5jcnlwdGlvbiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lbmNyeXB0aW9uO1xufTtcblxuR2VuZXJhbFB1cnBvc2VCaXQucHJvdG90eXBlLnVzZVN0cm9uZ0VuY3J5cHRpb24gPSBmdW5jdGlvbihiKSB7XG4gIHRoaXMuc3Ryb25nRW5jcnlwdGlvbiA9IGI7XG59O1xuXG5HZW5lcmFsUHVycG9zZUJpdC5wcm90b3R5cGUudXNlc1N0cm9uZ0VuY3J5cHRpb24gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuc3Ryb25nRW5jcnlwdGlvbjtcbn07XG5cbkdlbmVyYWxQdXJwb3NlQml0LnByb3RvdHlwZS51c2VVVEY4Rm9yTmFtZXMgPSBmdW5jdGlvbihiKSB7XG4gIHRoaXMudXRmOCA9IGI7XG59O1xuXG5HZW5lcmFsUHVycG9zZUJpdC5wcm90b3R5cGUudXNlc1VURjhGb3JOYW1lcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy51dGY4O1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7622\n")},5557:module=>{eval("/**\n * node-compress-commons\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-compress-commons/blob/master/LICENSE-MIT\n */\nmodule.exports = {\n /**\n * Bits used for permissions (and sticky bit)\n */\n PERM_MASK: 4095, // 07777\n\n /**\n * Bits used to indicate the filesystem object type.\n */\n FILE_TYPE_FLAG: 61440, // 0170000\n\n /**\n * Indicates symbolic links.\n */\n LINK_FLAG: 40960, // 0120000\n\n /**\n * Indicates plain files.\n */\n FILE_FLAG: 32768, // 0100000\n\n /**\n * Indicates directories.\n */\n DIR_FLAG: 16384, // 040000\n\n // ----------------------------------------------------------\n // somewhat arbitrary choices that are quite common for shared\n // installations\n // -----------------------------------------------------------\n\n /**\n * Default permissions for symbolic links.\n */\n DEFAULT_LINK_PERM: 511, // 0777\n\n /**\n * Default permissions for directories.\n */\n DEFAULT_DIR_PERM: 493, // 0755\n\n /**\n * Default permissions for plain files.\n */\n DEFAULT_FILE_PERM: 420 // 0644\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU1Ny5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2NvbXByZXNzLWNvbW1vbnMvbGliL2FyY2hpdmVycy96aXAvdW5peC1zdGF0LmpzP2I4OWQiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBub2RlLWNvbXByZXNzLWNvbW1vbnNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgQ2hyaXMgVGFsa2luZ3RvbiwgY29udHJpYnV0b3JzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICogaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1jb21wcmVzcy1jb21tb25zL2Jsb2IvbWFzdGVyL0xJQ0VOU0UtTUlUXG4gKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIC8qKlxuICAgICAqIEJpdHMgdXNlZCBmb3IgcGVybWlzc2lvbnMgKGFuZCBzdGlja3kgYml0KVxuICAgICAqL1xuICAgIFBFUk1fTUFTSzogNDA5NSwgLy8gMDc3NzdcblxuICAgIC8qKlxuICAgICAqIEJpdHMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgZmlsZXN5c3RlbSBvYmplY3QgdHlwZS5cbiAgICAgKi9cbiAgICBGSUxFX1RZUEVfRkxBRzogNjE0NDAsIC8vIDAxNzAwMDBcblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBzeW1ib2xpYyBsaW5rcy5cbiAgICAgKi9cbiAgICBMSU5LX0ZMQUc6IDQwOTYwLCAvLyAwMTIwMDAwXG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgcGxhaW4gZmlsZXMuXG4gICAgICovXG4gICAgRklMRV9GTEFHOiAzMjc2OCwgLy8gMDEwMDAwMFxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGRpcmVjdG9yaWVzLlxuICAgICAqL1xuICAgIERJUl9GTEFHOiAxNjM4NCwgLy8gMDQwMDAwXG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gc29tZXdoYXQgYXJiaXRyYXJ5IGNob2ljZXMgdGhhdCBhcmUgcXVpdGUgY29tbW9uIGZvciBzaGFyZWRcbiAgICAvLyBpbnN0YWxsYXRpb25zXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgcGVybWlzc2lvbnMgZm9yIHN5bWJvbGljIGxpbmtzLlxuICAgICAqL1xuICAgIERFRkFVTFRfTElOS19QRVJNOiA1MTEsIC8vIDA3NzdcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgcGVybWlzc2lvbnMgZm9yIGRpcmVjdG9yaWVzLlxuICAgICAqL1xuICAgIERFRkFVTFRfRElSX1BFUk06IDQ5MywgLy8gMDc1NVxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBwZXJtaXNzaW9ucyBmb3IgcGxhaW4gZmlsZXMuXG4gICAgICovXG4gICAgREVGQVVMVF9GSUxFX1BFUk06IDQyMCAvLyAwNjQ0XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5557\n")},931:module=>{eval("/**\n * node-compress-commons\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-compress-commons/blob/master/LICENSE-MIT\n */\nvar util = module.exports = {};\n\nutil.dateToDos = function(d, forceLocalTime) {\n forceLocalTime = forceLocalTime || false;\n\n var year = forceLocalTime ? d.getFullYear() : d.getUTCFullYear();\n\n if (year < 1980) {\n return 2162688; // 1980-1-1 00:00:00\n } else if (year >= 2044) {\n return 2141175677; // 2043-12-31 23:59:58\n }\n\n var val = {\n year: year,\n month: forceLocalTime ? d.getMonth() : d.getUTCMonth(),\n date: forceLocalTime ? d.getDate() : d.getUTCDate(),\n hours: forceLocalTime ? d.getHours() : d.getUTCHours(),\n minutes: forceLocalTime ? d.getMinutes() : d.getUTCMinutes(),\n seconds: forceLocalTime ? d.getSeconds() : d.getUTCSeconds()\n };\n\n return ((val.year - 1980) << 25) | ((val.month + 1) << 21) | (val.date << 16) |\n (val.hours << 11) | (val.minutes << 5) | (val.seconds / 2);\n};\n\nutil.dosToDate = function(dos) {\n return new Date(((dos >> 25) & 0x7f) + 1980, ((dos >> 21) & 0x0f) - 1, (dos >> 16) & 0x1f, (dos >> 11) & 0x1f, (dos >> 5) & 0x3f, (dos & 0x1f) << 1);\n};\n\nutil.fromDosTime = function(buf) {\n return util.dosToDate(buf.readUInt32LE(0));\n};\n\nutil.getEightBytes = function(v) {\n var buf = Buffer.alloc(8);\n buf.writeUInt32LE(v % 0x0100000000, 0);\n buf.writeUInt32LE((v / 0x0100000000) | 0, 4);\n\n return buf;\n};\n\nutil.getShortBytes = function(v) {\n var buf = Buffer.alloc(2);\n buf.writeUInt16LE((v & 0xFFFF) >>> 0, 0);\n\n return buf;\n};\n\nutil.getShortBytesValue = function(buf, offset) {\n return buf.readUInt16LE(offset);\n};\n\nutil.getLongBytes = function(v) {\n var buf = Buffer.alloc(4);\n buf.writeUInt32LE((v & 0xFFFFFFFF) >>> 0, 0);\n\n return buf;\n};\n\nutil.getLongBytesValue = function(buf, offset) {\n return buf.readUInt32LE(offset);\n};\n\nutil.toDosTime = function(d) {\n return util.getLongBytes(util.dateToDos(d));\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTMxLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLG9CQUFvQjtBQUNwQixJQUFJO0FBQ0osdUJBQXVCO0FBQ3ZCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2NvbXByZXNzLWNvbW1vbnMvbGliL2FyY2hpdmVycy96aXAvdXRpbC5qcz8zZjYxIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogbm9kZS1jb21wcmVzcy1jb21tb25zXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IENocmlzIFRhbGtpbmd0b24sIGNvbnRyaWJ1dG9ycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcmNoaXZlcmpzL25vZGUtY29tcHJlc3MtY29tbW9ucy9ibG9iL21hc3Rlci9MSUNFTlNFLU1JVFxuICovXG52YXIgdXRpbCA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbnV0aWwuZGF0ZVRvRG9zID0gZnVuY3Rpb24oZCwgZm9yY2VMb2NhbFRpbWUpIHtcbiAgZm9yY2VMb2NhbFRpbWUgPSBmb3JjZUxvY2FsVGltZSB8fCBmYWxzZTtcblxuICB2YXIgeWVhciA9IGZvcmNlTG9jYWxUaW1lID8gZC5nZXRGdWxsWWVhcigpIDogZC5nZXRVVENGdWxsWWVhcigpO1xuXG4gIGlmICh5ZWFyIDwgMTk4MCkge1xuICAgIHJldHVybiAyMTYyNjg4OyAvLyAxOTgwLTEtMSAwMDowMDowMFxuICB9IGVsc2UgaWYgKHllYXIgPj0gMjA0NCkge1xuICAgIHJldHVybiAyMTQxMTc1Njc3OyAvLyAyMDQzLTEyLTMxIDIzOjU5OjU4XG4gIH1cblxuICB2YXIgdmFsID0ge1xuICAgIHllYXI6IHllYXIsXG4gICAgbW9udGg6IGZvcmNlTG9jYWxUaW1lID8gZC5nZXRNb250aCgpIDogZC5nZXRVVENNb250aCgpLFxuICAgIGRhdGU6IGZvcmNlTG9jYWxUaW1lID8gZC5nZXREYXRlKCkgOiBkLmdldFVUQ0RhdGUoKSxcbiAgICBob3VyczogZm9yY2VMb2NhbFRpbWUgPyBkLmdldEhvdXJzKCkgOiBkLmdldFVUQ0hvdXJzKCksXG4gICAgbWludXRlczogZm9yY2VMb2NhbFRpbWUgPyBkLmdldE1pbnV0ZXMoKSA6IGQuZ2V0VVRDTWludXRlcygpLFxuICAgIHNlY29uZHM6IGZvcmNlTG9jYWxUaW1lID8gZC5nZXRTZWNvbmRzKCkgOiBkLmdldFVUQ1NlY29uZHMoKVxuICB9O1xuXG4gIHJldHVybiAoKHZhbC55ZWFyIC0gMTk4MCkgPDwgMjUpIHwgKCh2YWwubW9udGggKyAxKSA8PCAyMSkgfCAodmFsLmRhdGUgPDwgMTYpIHxcbiAgICAodmFsLmhvdXJzIDw8IDExKSB8ICh2YWwubWludXRlcyA8PCA1KSB8ICh2YWwuc2Vjb25kcyAvIDIpO1xufTtcblxudXRpbC5kb3NUb0RhdGUgPSBmdW5jdGlvbihkb3MpIHtcbiAgcmV0dXJuIG5ldyBEYXRlKCgoZG9zID4+IDI1KSAmIDB4N2YpICsgMTk4MCwgKChkb3MgPj4gMjEpICYgMHgwZikgLSAxLCAoZG9zID4+IDE2KSAmIDB4MWYsIChkb3MgPj4gMTEpICYgMHgxZiwgKGRvcyA+PiA1KSAmIDB4M2YsIChkb3MgJiAweDFmKSA8PCAxKTtcbn07XG5cbnV0aWwuZnJvbURvc1RpbWUgPSBmdW5jdGlvbihidWYpIHtcbiAgcmV0dXJuIHV0aWwuZG9zVG9EYXRlKGJ1Zi5yZWFkVUludDMyTEUoMCkpO1xufTtcblxudXRpbC5nZXRFaWdodEJ5dGVzID0gZnVuY3Rpb24odikge1xuICB2YXIgYnVmID0gQnVmZmVyLmFsbG9jKDgpO1xuICBidWYud3JpdGVVSW50MzJMRSh2ICUgMHgwMTAwMDAwMDAwLCAwKTtcbiAgYnVmLndyaXRlVUludDMyTEUoKHYgLyAweDAxMDAwMDAwMDApIHwgMCwgNCk7XG5cbiAgcmV0dXJuIGJ1Zjtcbn07XG5cbnV0aWwuZ2V0U2hvcnRCeXRlcyA9IGZ1bmN0aW9uKHYpIHtcbiAgdmFyIGJ1ZiA9IEJ1ZmZlci5hbGxvYygyKTtcbiAgYnVmLndyaXRlVUludDE2TEUoKHYgJiAweEZGRkYpID4+PiAwLCAwKTtcblxuICByZXR1cm4gYnVmO1xufTtcblxudXRpbC5nZXRTaG9ydEJ5dGVzVmFsdWUgPSBmdW5jdGlvbihidWYsIG9mZnNldCkge1xuICByZXR1cm4gYnVmLnJlYWRVSW50MTZMRShvZmZzZXQpO1xufTtcblxudXRpbC5nZXRMb25nQnl0ZXMgPSBmdW5jdGlvbih2KSB7XG4gIHZhciBidWYgPSBCdWZmZXIuYWxsb2MoNCk7XG4gIGJ1Zi53cml0ZVVJbnQzMkxFKCh2ICYgMHhGRkZGRkZGRikgPj4+IDAsIDApO1xuXG4gIHJldHVybiBidWY7XG59O1xuXG51dGlsLmdldExvbmdCeXRlc1ZhbHVlID0gZnVuY3Rpb24oYnVmLCBvZmZzZXQpIHtcbiAgcmV0dXJuIGJ1Zi5yZWFkVUludDMyTEUob2Zmc2V0KTtcbn07XG5cbnV0aWwudG9Eb3NUaW1lID0gZnVuY3Rpb24oZCkge1xuICByZXR1cm4gdXRpbC5nZXRMb25nQnl0ZXModXRpbC5kYXRlVG9Eb3MoZCkpO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///931\n")},8691:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * node-compress-commons\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-compress-commons/blob/master/LICENSE-MIT\n */\nvar inherits = (__webpack_require__(3837).inherits);\nvar normalizePath = __webpack_require__(3171);\n\nvar ArchiveEntry = __webpack_require__(8919);\nvar GeneralPurposeBit = __webpack_require__(7622);\nvar UnixStat = __webpack_require__(5557);\n\nvar constants = __webpack_require__(5551);\nvar zipUtil = __webpack_require__(931);\n\nvar ZipArchiveEntry = module.exports = function(name) {\n if (!(this instanceof ZipArchiveEntry)) {\n return new ZipArchiveEntry(name);\n }\n\n ArchiveEntry.call(this);\n\n this.platform = constants.PLATFORM_FAT;\n this.method = -1;\n\n this.name = null;\n this.size = 0;\n this.csize = 0;\n this.gpb = new GeneralPurposeBit();\n this.crc = 0;\n this.time = -1;\n\n this.minver = constants.MIN_VERSION_INITIAL;\n this.mode = -1;\n this.extra = null;\n this.exattr = 0;\n this.inattr = 0;\n this.comment = null;\n\n if (name) {\n this.setName(name);\n }\n};\n\ninherits(ZipArchiveEntry, ArchiveEntry);\n\n/**\n * Returns the extra fields related to the entry.\n *\n * @returns {Buffer}\n */\nZipArchiveEntry.prototype.getCentralDirectoryExtra = function() {\n return this.getExtra();\n};\n\n/**\n * Returns the comment set for the entry.\n *\n * @returns {string}\n */\nZipArchiveEntry.prototype.getComment = function() {\n return this.comment !== null ? this.comment : '';\n};\n\n/**\n * Returns the compressed size of the entry.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getCompressedSize = function() {\n return this.csize;\n};\n\n/**\n * Returns the CRC32 digest for the entry.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getCrc = function() {\n return this.crc;\n};\n\n/**\n * Returns the external file attributes for the entry.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getExternalAttributes = function() {\n return this.exattr;\n};\n\n/**\n * Returns the extra fields related to the entry.\n *\n * @returns {Buffer}\n */\nZipArchiveEntry.prototype.getExtra = function() {\n return this.extra !== null ? this.extra : constants.EMPTY;\n};\n\n/**\n * Returns the general purpose bits related to the entry.\n *\n * @returns {GeneralPurposeBit}\n */\nZipArchiveEntry.prototype.getGeneralPurposeBit = function() {\n return this.gpb;\n};\n\n/**\n * Returns the internal file attributes for the entry.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getInternalAttributes = function() {\n return this.inattr;\n};\n\n/**\n * Returns the last modified date of the entry.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getLastModifiedDate = function() {\n return this.getTime();\n};\n\n/**\n * Returns the extra fields related to the entry.\n *\n * @returns {Buffer}\n */\nZipArchiveEntry.prototype.getLocalFileDataExtra = function() {\n return this.getExtra();\n};\n\n/**\n * Returns the compression method used on the entry.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getMethod = function() {\n return this.method;\n};\n\n/**\n * Returns the filename of the entry.\n *\n * @returns {string}\n */\nZipArchiveEntry.prototype.getName = function() {\n return this.name;\n};\n\n/**\n * Returns the platform on which the entry was made.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getPlatform = function() {\n return this.platform;\n};\n\n/**\n * Returns the size of the entry.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getSize = function() {\n return this.size;\n};\n\n/**\n * Returns a date object representing the last modified date of the entry.\n *\n * @returns {number|Date}\n */\nZipArchiveEntry.prototype.getTime = function() {\n return this.time !== -1 ? zipUtil.dosToDate(this.time) : -1;\n};\n\n/**\n * Returns the DOS timestamp for the entry.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getTimeDos = function() {\n return this.time !== -1 ? this.time : 0;\n};\n\n/**\n * Returns the UNIX file permissions for the entry.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getUnixMode = function() {\n return this.platform !== constants.PLATFORM_UNIX ? 0 : ((this.getExternalAttributes() >> constants.SHORT_SHIFT) & constants.SHORT_MASK);\n};\n\n/**\n * Returns the version of ZIP needed to extract the entry.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getVersionNeededToExtract = function() {\n return this.minver;\n};\n\n/**\n * Sets the comment of the entry.\n *\n * @param comment\n */\nZipArchiveEntry.prototype.setComment = function(comment) {\n if (Buffer.byteLength(comment) !== comment.length) {\n this.getGeneralPurposeBit().useUTF8ForNames(true);\n }\n\n this.comment = comment;\n};\n\n/**\n * Sets the compressed size of the entry.\n *\n * @param size\n */\nZipArchiveEntry.prototype.setCompressedSize = function(size) {\n if (size < 0) {\n throw new Error('invalid entry compressed size');\n }\n\n this.csize = size;\n};\n\n/**\n * Sets the checksum of the entry.\n *\n * @param crc\n */\nZipArchiveEntry.prototype.setCrc = function(crc) {\n if (crc < 0) {\n throw new Error('invalid entry crc32');\n }\n\n this.crc = crc;\n};\n\n/**\n * Sets the external file attributes of the entry.\n *\n * @param attr\n */\nZipArchiveEntry.prototype.setExternalAttributes = function(attr) {\n this.exattr = attr >>> 0;\n};\n\n/**\n * Sets the extra fields related to the entry.\n *\n * @param extra\n */\nZipArchiveEntry.prototype.setExtra = function(extra) {\n this.extra = extra;\n};\n\n/**\n * Sets the general purpose bits related to the entry.\n *\n * @param gpb\n */\nZipArchiveEntry.prototype.setGeneralPurposeBit = function(gpb) {\n if (!(gpb instanceof GeneralPurposeBit)) {\n throw new Error('invalid entry GeneralPurposeBit');\n }\n\n this.gpb = gpb;\n};\n\n/**\n * Sets the internal file attributes of the entry.\n *\n * @param attr\n */\nZipArchiveEntry.prototype.setInternalAttributes = function(attr) {\n this.inattr = attr;\n};\n\n/**\n * Sets the compression method of the entry.\n *\n * @param method\n */\nZipArchiveEntry.prototype.setMethod = function(method) {\n if (method < 0) {\n throw new Error('invalid entry compression method');\n }\n\n this.method = method;\n};\n\n/**\n * Sets the name of the entry.\n *\n * @param name\n * @param prependSlash\n */\nZipArchiveEntry.prototype.setName = function(name, prependSlash = false) {\n name = normalizePath(name, false)\n .replace(/^\\w+:/, '')\n .replace(/^(\\.\\.\\/|\\/)+/, '');\n\n if (prependSlash) {\n name = `/${name}`;\n }\n\n if (Buffer.byteLength(name) !== name.length) {\n this.getGeneralPurposeBit().useUTF8ForNames(true);\n }\n\n this.name = name;\n};\n\n/**\n * Sets the platform on which the entry was made.\n *\n * @param platform\n */\nZipArchiveEntry.prototype.setPlatform = function(platform) {\n this.platform = platform;\n};\n\n/**\n * Sets the size of the entry.\n *\n * @param size\n */\nZipArchiveEntry.prototype.setSize = function(size) {\n if (size < 0) {\n throw new Error('invalid entry size');\n }\n\n this.size = size;\n};\n\n/**\n * Sets the time of the entry.\n *\n * @param time\n * @param forceLocalTime\n */\nZipArchiveEntry.prototype.setTime = function(time, forceLocalTime) {\n if (!(time instanceof Date)) {\n throw new Error('invalid entry time');\n }\n\n this.time = zipUtil.dateToDos(time, forceLocalTime);\n};\n\n/**\n * Sets the UNIX file permissions for the entry.\n *\n * @param mode\n */\nZipArchiveEntry.prototype.setUnixMode = function(mode) {\n mode |= this.isDirectory() ? constants.S_IFDIR : constants.S_IFREG;\n\n var extattr = 0;\n extattr |= (mode << constants.SHORT_SHIFT) | (this.isDirectory() ? constants.S_DOS_D : constants.S_DOS_A);\n\n this.setExternalAttributes(extattr);\n this.mode = mode & constants.MODE_MASK;\n this.platform = constants.PLATFORM_UNIX;\n};\n\n/**\n * Sets the version of ZIP needed to extract this entry.\n *\n * @param minver\n */\nZipArchiveEntry.prototype.setVersionNeededToExtract = function(minver) {\n this.minver = minver;\n};\n\n/**\n * Returns true if this entry represents a directory.\n *\n * @returns {boolean}\n */\nZipArchiveEntry.prototype.isDirectory = function() {\n return this.getName().slice(-1) === '/';\n};\n\n/**\n * Returns true if this entry represents a unix symlink,\n * in which case the entry's content contains the target path\n * for the symlink.\n *\n * @returns {boolean}\n */\nZipArchiveEntry.prototype.isUnixSymlink = function() {\n return (this.getUnixMode() & UnixStat.FILE_TYPE_FLAG) === UnixStat.LINK_FLAG;\n};\n\n/**\n * Returns true if this entry is using the ZIP64 extension of ZIP.\n *\n * @returns {boolean}\n */\nZipArchiveEntry.prototype.isZip64 = function() {\n return this.csize > constants.ZIP64_MAGIC || this.size > constants.ZIP64_MAGIC;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODY5MS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQXdCO0FBQ3ZDLG9CQUFvQixtQkFBTyxDQUFDLElBQWdCOztBQUU1QyxtQkFBbUIsbUJBQU8sQ0FBQyxJQUFrQjtBQUM3Qyx3QkFBd0IsbUJBQU8sQ0FBQyxJQUF1QjtBQUN2RCxlQUFlLG1CQUFPLENBQUMsSUFBYTs7QUFFcEMsZ0JBQWdCLG1CQUFPLENBQUMsSUFBYTtBQUNyQyxjQUFjLG1CQUFPLENBQUMsR0FBUTs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvY29tcHJlc3MtY29tbW9ucy9saWIvYXJjaGl2ZXJzL3ppcC96aXAtYXJjaGl2ZS1lbnRyeS5qcz9mYTU4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogbm9kZS1jb21wcmVzcy1jb21tb25zXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IENocmlzIFRhbGtpbmd0b24sIGNvbnRyaWJ1dG9ycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcmNoaXZlcmpzL25vZGUtY29tcHJlc3MtY29tbW9ucy9ibG9iL21hc3Rlci9MSUNFTlNFLU1JVFxuICovXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCd1dGlsJykuaW5oZXJpdHM7XG52YXIgbm9ybWFsaXplUGF0aCA9IHJlcXVpcmUoJ25vcm1hbGl6ZS1wYXRoJyk7XG5cbnZhciBBcmNoaXZlRW50cnkgPSByZXF1aXJlKCcuLi9hcmNoaXZlLWVudHJ5Jyk7XG52YXIgR2VuZXJhbFB1cnBvc2VCaXQgPSByZXF1aXJlKCcuL2dlbmVyYWwtcHVycG9zZS1iaXQnKTtcbnZhciBVbml4U3RhdCA9IHJlcXVpcmUoJy4vdW5peC1zdGF0Jyk7XG5cbnZhciBjb25zdGFudHMgPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xudmFyIHppcFV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxudmFyIFppcEFyY2hpdmVFbnRyeSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obmFtZSkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgWmlwQXJjaGl2ZUVudHJ5KSkge1xuICAgIHJldHVybiBuZXcgWmlwQXJjaGl2ZUVudHJ5KG5hbWUpO1xuICB9XG5cbiAgQXJjaGl2ZUVudHJ5LmNhbGwodGhpcyk7XG5cbiAgdGhpcy5wbGF0Zm9ybSA9IGNvbnN0YW50cy5QTEFURk9STV9GQVQ7XG4gIHRoaXMubWV0aG9kID0gLTE7XG5cbiAgdGhpcy5uYW1lID0gbnVsbDtcbiAgdGhpcy5zaXplID0gMDtcbiAgdGhpcy5jc2l6ZSA9IDA7XG4gIHRoaXMuZ3BiID0gbmV3IEdlbmVyYWxQdXJwb3NlQml0KCk7XG4gIHRoaXMuY3JjID0gMDtcbiAgdGhpcy50aW1lID0gLTE7XG5cbiAgdGhpcy5taW52ZXIgPSBjb25zdGFudHMuTUlOX1ZFUlNJT05fSU5JVElBTDtcbiAgdGhpcy5tb2RlID0gLTE7XG4gIHRoaXMuZXh0cmEgPSBudWxsO1xuICB0aGlzLmV4YXR0ciA9IDA7XG4gIHRoaXMuaW5hdHRyID0gMDtcbiAgdGhpcy5jb21tZW50ID0gbnVsbDtcblxuICBpZiAobmFtZSkge1xuICAgIHRoaXMuc2V0TmFtZShuYW1lKTtcbiAgfVxufTtcblxuaW5oZXJpdHMoWmlwQXJjaGl2ZUVudHJ5LCBBcmNoaXZlRW50cnkpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGV4dHJhIGZpZWxkcyByZWxhdGVkIHRvIHRoZSBlbnRyeS5cbiAqXG4gKiBAcmV0dXJucyB7QnVmZmVyfVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLmdldENlbnRyYWxEaXJlY3RvcnlFeHRyYSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5nZXRFeHRyYSgpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb21tZW50IHNldCBmb3IgdGhlIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuZ2V0Q29tbWVudCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5jb21tZW50ICE9PSBudWxsID8gdGhpcy5jb21tZW50IDogJyc7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbXByZXNzZWQgc2l6ZSBvZiB0aGUgZW50cnkuXG4gKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRDb21wcmVzc2VkU2l6ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5jc2l6ZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgQ1JDMzIgZGlnZXN0IGZvciB0aGUgZW50cnkuXG4gKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRDcmMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuY3JjO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBleHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbnRyeS5cbiAqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLmdldEV4dGVybmFsQXR0cmlidXRlcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5leGF0dHI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGV4dHJhIGZpZWxkcyByZWxhdGVkIHRvIHRoZSBlbnRyeS5cbiAqXG4gKiBAcmV0dXJucyB7QnVmZmVyfVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLmdldEV4dHJhID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmV4dHJhICE9PSBudWxsID8gdGhpcy5leHRyYSA6IGNvbnN0YW50cy5FTVBUWTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZ2VuZXJhbCBwdXJwb3NlIGJpdHMgcmVsYXRlZCB0byB0aGUgZW50cnkuXG4gKlxuICogQHJldHVybnMge0dlbmVyYWxQdXJwb3NlQml0fVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLmdldEdlbmVyYWxQdXJwb3NlQml0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmdwYjtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW50ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzIGZvciB0aGUgZW50cnkuXG4gKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRJbnRlcm5hbEF0dHJpYnV0ZXMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuaW5hdHRyO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsYXN0IG1vZGlmaWVkIGRhdGUgb2YgdGhlIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuZ2V0TGFzdE1vZGlmaWVkRGF0ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5nZXRUaW1lKCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGV4dHJhIGZpZWxkcyByZWxhdGVkIHRvIHRoZSBlbnRyeS5cbiAqXG4gKiBAcmV0dXJucyB7QnVmZmVyfVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLmdldExvY2FsRmlsZURhdGFFeHRyYSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5nZXRFeHRyYSgpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgdXNlZCBvbiB0aGUgZW50cnkuXG4gKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRNZXRob2QgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMubWV0aG9kO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaWxlbmFtZSBvZiB0aGUgZW50cnkuXG4gKlxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXROYW1lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLm5hbWU7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHBsYXRmb3JtIG9uIHdoaWNoIHRoZSBlbnRyeSB3YXMgbWFkZS5cbiAqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLmdldFBsYXRmb3JtID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnBsYXRmb3JtO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBlbnRyeS5cbiAqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLmdldFNpemUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuc2l6ZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIGRhdGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgbGFzdCBtb2RpZmllZCBkYXRlIG9mIHRoZSBlbnRyeS5cbiAqXG4gKiBAcmV0dXJucyB7bnVtYmVyfERhdGV9XG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuZ2V0VGltZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy50aW1lICE9PSAtMSA/IHppcFV0aWwuZG9zVG9EYXRlKHRoaXMudGltZSkgOiAtMTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgRE9TIHRpbWVzdGFtcCBmb3IgdGhlIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuZ2V0VGltZURvcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy50aW1lICE9PSAtMSA/IHRoaXMudGltZSA6IDA7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIFVOSVggZmlsZSBwZXJtaXNzaW9ucyBmb3IgdGhlIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuZ2V0VW5peE1vZGUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMucGxhdGZvcm0gIT09IGNvbnN0YW50cy5QTEFURk9STV9VTklYID8gMCA6ICgodGhpcy5nZXRFeHRlcm5hbEF0dHJpYnV0ZXMoKSA+PiBjb25zdGFudHMuU0hPUlRfU0hJRlQpICYgY29uc3RhbnRzLlNIT1JUX01BU0spO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIFpJUCBuZWVkZWQgdG8gZXh0cmFjdCB0aGUgZW50cnkuXG4gKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRWZXJzaW9uTmVlZGVkVG9FeHRyYWN0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLm1pbnZlcjtcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgY29tbWVudCBvZiB0aGUgZW50cnkuXG4gKlxuICogQHBhcmFtIGNvbW1lbnRcbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5zZXRDb21tZW50ID0gZnVuY3Rpb24oY29tbWVudCkge1xuICBpZiAoQnVmZmVyLmJ5dGVMZW5ndGgoY29tbWVudCkgIT09IGNvbW1lbnQubGVuZ3RoKSB7XG4gICAgdGhpcy5nZXRHZW5lcmFsUHVycG9zZUJpdCgpLnVzZVVURjhGb3JOYW1lcyh0cnVlKTtcbiAgfVxuXG4gIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIGNvbXByZXNzZWQgc2l6ZSBvZiB0aGUgZW50cnkuXG4gKlxuICogQHBhcmFtIHNpemVcbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5zZXRDb21wcmVzc2VkU2l6ZSA9IGZ1bmN0aW9uKHNpemUpIHtcbiAgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGVudHJ5IGNvbXByZXNzZWQgc2l6ZScpO1xuICB9XG5cbiAgdGhpcy5jc2l6ZSA9IHNpemU7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIGNoZWNrc3VtIG9mIHRoZSBlbnRyeS5cbiAqXG4gKiBAcGFyYW0gY3JjXG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuc2V0Q3JjID0gZnVuY3Rpb24oY3JjKSB7XG4gIGlmIChjcmMgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGVudHJ5IGNyYzMyJyk7XG4gIH1cblxuICB0aGlzLmNyYyA9IGNyYztcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzIG9mIHRoZSBlbnRyeS5cbiAqXG4gKiBAcGFyYW0gYXR0clxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLnNldEV4dGVybmFsQXR0cmlidXRlcyA9IGZ1bmN0aW9uKGF0dHIpIHtcbiAgdGhpcy5leGF0dHIgPSBhdHRyID4+PiAwO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBleHRyYSBmaWVsZHMgcmVsYXRlZCB0byB0aGUgZW50cnkuXG4gKlxuICogQHBhcmFtIGV4dHJhXG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuc2V0RXh0cmEgPSBmdW5jdGlvbihleHRyYSkge1xuICB0aGlzLmV4dHJhID0gZXh0cmE7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIGdlbmVyYWwgcHVycG9zZSBiaXRzIHJlbGF0ZWQgdG8gdGhlIGVudHJ5LlxuICpcbiAqIEBwYXJhbSBncGJcbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5zZXRHZW5lcmFsUHVycG9zZUJpdCA9IGZ1bmN0aW9uKGdwYikge1xuICBpZiAoIShncGIgaW5zdGFuY2VvZiBHZW5lcmFsUHVycG9zZUJpdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZW50cnkgR2VuZXJhbFB1cnBvc2VCaXQnKTtcbiAgfVxuXG4gIHRoaXMuZ3BiID0gZ3BiO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgb2YgdGhlIGVudHJ5LlxuICpcbiAqIEBwYXJhbSBhdHRyXG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuc2V0SW50ZXJuYWxBdHRyaWJ1dGVzID0gZnVuY3Rpb24oYXR0cikge1xuICB0aGlzLmluYXR0ciA9IGF0dHI7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCBvZiB0aGUgZW50cnkuXG4gKlxuICogQHBhcmFtIG1ldGhvZFxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLnNldE1ldGhvZCA9IGZ1bmN0aW9uKG1ldGhvZCkge1xuICBpZiAobWV0aG9kIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBlbnRyeSBjb21wcmVzc2lvbiBtZXRob2QnKTtcbiAgfVxuXG4gIHRoaXMubWV0aG9kID0gbWV0aG9kO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBlbnRyeS5cbiAqXG4gKiBAcGFyYW0gbmFtZVxuICogQHBhcmFtIHByZXBlbmRTbGFzaFxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLnNldE5hbWUgPSBmdW5jdGlvbihuYW1lLCBwcmVwZW5kU2xhc2ggPSBmYWxzZSkge1xuICBuYW1lID0gbm9ybWFsaXplUGF0aChuYW1lLCBmYWxzZSlcbiAgICAucmVwbGFjZSgvXlxcdys6LywgJycpXG4gICAgLnJlcGxhY2UoL14oXFwuXFwuXFwvfFxcLykrLywgJycpO1xuXG4gIGlmIChwcmVwZW5kU2xhc2gpIHtcbiAgICBuYW1lID0gYC8ke25hbWV9YDtcbiAgfVxuXG4gIGlmIChCdWZmZXIuYnl0ZUxlbmd0aChuYW1lKSAhPT0gbmFtZS5sZW5ndGgpIHtcbiAgICB0aGlzLmdldEdlbmVyYWxQdXJwb3NlQml0KCkudXNlVVRGOEZvck5hbWVzKHRydWUpO1xuICB9XG5cbiAgdGhpcy5uYW1lID0gbmFtZTtcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgcGxhdGZvcm0gb24gd2hpY2ggdGhlIGVudHJ5IHdhcyBtYWRlLlxuICpcbiAqIEBwYXJhbSBwbGF0Zm9ybVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLnNldFBsYXRmb3JtID0gZnVuY3Rpb24ocGxhdGZvcm0pIHtcbiAgdGhpcy5wbGF0Zm9ybSA9IHBsYXRmb3JtO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBlbnRyeS5cbiAqXG4gKiBAcGFyYW0gc2l6ZVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLnNldFNpemUgPSBmdW5jdGlvbihzaXplKSB7XG4gIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBlbnRyeSBzaXplJyk7XG4gIH1cblxuICB0aGlzLnNpemUgPSBzaXplO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSB0aW1lIG9mIHRoZSBlbnRyeS5cbiAqXG4gKiBAcGFyYW0gdGltZVxuICogQHBhcmFtIGZvcmNlTG9jYWxUaW1lXG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuc2V0VGltZSA9IGZ1bmN0aW9uKHRpbWUsIGZvcmNlTG9jYWxUaW1lKSB7XG4gIGlmICghKHRpbWUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBlbnRyeSB0aW1lJyk7XG4gIH1cblxuICB0aGlzLnRpbWUgPSB6aXBVdGlsLmRhdGVUb0Rvcyh0aW1lLCBmb3JjZUxvY2FsVGltZSk7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIFVOSVggZmlsZSBwZXJtaXNzaW9ucyBmb3IgdGhlIGVudHJ5LlxuICpcbiAqIEBwYXJhbSBtb2RlXG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuc2V0VW5peE1vZGUgPSBmdW5jdGlvbihtb2RlKSB7XG4gIG1vZGUgfD0gdGhpcy5pc0RpcmVjdG9yeSgpID8gY29uc3RhbnRzLlNfSUZESVIgOiBjb25zdGFudHMuU19JRlJFRztcblxuICB2YXIgZXh0YXR0ciA9IDA7XG4gIGV4dGF0dHIgfD0gKG1vZGUgPDwgY29uc3RhbnRzLlNIT1JUX1NISUZUKSB8ICh0aGlzLmlzRGlyZWN0b3J5KCkgPyBjb25zdGFudHMuU19ET1NfRCA6IGNvbnN0YW50cy5TX0RPU19BKTtcblxuICB0aGlzLnNldEV4dGVybmFsQXR0cmlidXRlcyhleHRhdHRyKTtcbiAgdGhpcy5tb2RlID0gbW9kZSAmIGNvbnN0YW50cy5NT0RFX01BU0s7XG4gIHRoaXMucGxhdGZvcm0gPSBjb25zdGFudHMuUExBVEZPUk1fVU5JWDtcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgdmVyc2lvbiBvZiBaSVAgbmVlZGVkIHRvIGV4dHJhY3QgdGhpcyBlbnRyeS5cbiAqXG4gKiBAcGFyYW0gbWludmVyXG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuc2V0VmVyc2lvbk5lZWRlZFRvRXh0cmFjdCA9IGZ1bmN0aW9uKG1pbnZlcikge1xuICB0aGlzLm1pbnZlciA9IG1pbnZlcjtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZW50cnkgcmVwcmVzZW50cyBhIGRpcmVjdG9yeS5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5pc0RpcmVjdG9yeSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5nZXROYW1lKCkuc2xpY2UoLTEpID09PSAnLyc7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGVudHJ5IHJlcHJlc2VudHMgYSB1bml4IHN5bWxpbmssXG4gKiBpbiB3aGljaCBjYXNlIHRoZSBlbnRyeSdzIGNvbnRlbnQgY29udGFpbnMgdGhlIHRhcmdldCBwYXRoXG4gKiBmb3IgdGhlIHN5bWxpbmsuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuaXNVbml4U3ltbGluayA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gKHRoaXMuZ2V0VW5peE1vZGUoKSAmIFVuaXhTdGF0LkZJTEVfVFlQRV9GTEFHKSA9PT0gVW5peFN0YXQuTElOS19GTEFHO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBlbnRyeSBpcyB1c2luZyB0aGUgWklQNjQgZXh0ZW5zaW9uIG9mIFpJUC5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5pc1ppcDY0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmNzaXplID4gY29uc3RhbnRzLlpJUDY0X01BR0lDIHx8IHRoaXMuc2l6ZSA+IGNvbnN0YW50cy5aSVA2NF9NQUdJQztcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8691\n")},2317:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * node-compress-commons\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-compress-commons/blob/master/LICENSE-MIT\n */\nvar inherits = (__webpack_require__(3837).inherits);\nvar crc32 = __webpack_require__(2779);\nvar {CRC32Stream} = __webpack_require__(2519);\nvar {DeflateCRC32Stream} = __webpack_require__(2519);\n\nvar ArchiveOutputStream = __webpack_require__(211);\nvar ZipArchiveEntry = __webpack_require__(8691);\nvar GeneralPurposeBit = __webpack_require__(7622);\n\nvar constants = __webpack_require__(5551);\nvar util = __webpack_require__(5986);\nvar zipUtil = __webpack_require__(931);\n\nvar ZipArchiveOutputStream = module.exports = function(options) {\n if (!(this instanceof ZipArchiveOutputStream)) {\n return new ZipArchiveOutputStream(options);\n }\n\n options = this.options = this._defaults(options);\n\n ArchiveOutputStream.call(this, options);\n\n this._entry = null;\n this._entries = [];\n this._archive = {\n centralLength: 0,\n centralOffset: 0,\n comment: '',\n finish: false,\n finished: false,\n processing: false,\n forceZip64: options.forceZip64,\n forceLocalTime: options.forceLocalTime\n };\n};\n\ninherits(ZipArchiveOutputStream, ArchiveOutputStream);\n\nZipArchiveOutputStream.prototype._afterAppend = function(ae) {\n this._entries.push(ae);\n\n if (ae.getGeneralPurposeBit().usesDataDescriptor()) {\n this._writeDataDescriptor(ae);\n }\n\n this._archive.processing = false;\n this._entry = null;\n\n if (this._archive.finish && !this._archive.finished) {\n this._finish();\n }\n};\n\nZipArchiveOutputStream.prototype._appendBuffer = function(ae, source, callback) {\n if (source.length === 0) {\n ae.setMethod(constants.METHOD_STORED);\n }\n\n var method = ae.getMethod();\n\n if (method === constants.METHOD_STORED) {\n ae.setSize(source.length);\n ae.setCompressedSize(source.length);\n ae.setCrc(crc32.unsigned(source));\n }\n\n this._writeLocalFileHeader(ae);\n\n if (method === constants.METHOD_STORED) {\n this.write(source);\n this._afterAppend(ae);\n callback(null, ae);\n return;\n } else if (method === constants.METHOD_DEFLATED) {\n this._smartStream(ae, callback).end(source);\n return;\n } else {\n callback(new Error('compression method ' + method + ' not implemented'));\n return;\n }\n};\n\nZipArchiveOutputStream.prototype._appendStream = function(ae, source, callback) {\n ae.getGeneralPurposeBit().useDataDescriptor(true);\n ae.setVersionNeededToExtract(constants.MIN_VERSION_DATA_DESCRIPTOR);\n\n this._writeLocalFileHeader(ae);\n\n var smart = this._smartStream(ae, callback);\n source.once('error', function(err) {\n smart.emit('error', err);\n smart.end();\n })\n source.pipe(smart);\n};\n\nZipArchiveOutputStream.prototype._defaults = function(o) {\n if (typeof o !== 'object') {\n o = {};\n }\n\n if (typeof o.zlib !== 'object') {\n o.zlib = {};\n }\n\n if (typeof o.zlib.level !== 'number') {\n o.zlib.level = constants.ZLIB_BEST_SPEED;\n }\n\n o.forceZip64 = !!o.forceZip64;\n o.forceLocalTime = !!o.forceLocalTime;\n\n return o;\n};\n\nZipArchiveOutputStream.prototype._finish = function() {\n this._archive.centralOffset = this.offset;\n\n this._entries.forEach(function(ae) {\n this._writeCentralFileHeader(ae);\n }.bind(this));\n\n this._archive.centralLength = this.offset - this._archive.centralOffset;\n\n if (this.isZip64()) {\n this._writeCentralDirectoryZip64();\n }\n\n this._writeCentralDirectoryEnd();\n\n this._archive.processing = false;\n this._archive.finish = true;\n this._archive.finished = true;\n this.end();\n};\n\nZipArchiveOutputStream.prototype._normalizeEntry = function(ae) {\n if (ae.getMethod() === -1) {\n ae.setMethod(constants.METHOD_DEFLATED);\n }\n\n if (ae.getMethod() === constants.METHOD_DEFLATED) {\n ae.getGeneralPurposeBit().useDataDescriptor(true);\n ae.setVersionNeededToExtract(constants.MIN_VERSION_DATA_DESCRIPTOR);\n }\n\n if (ae.getTime() === -1) {\n ae.setTime(new Date(), this._archive.forceLocalTime);\n }\n\n ae._offsets = {\n file: 0,\n data: 0,\n contents: 0,\n };\n};\n\nZipArchiveOutputStream.prototype._smartStream = function(ae, callback) {\n var deflate = ae.getMethod() === constants.METHOD_DEFLATED;\n var process = deflate ? new DeflateCRC32Stream(this.options.zlib) : new CRC32Stream();\n var error = null;\n\n function handleStuff() {\n var digest = process.digest().readUInt32BE(0);\n ae.setCrc(digest);\n ae.setSize(process.size());\n ae.setCompressedSize(process.size(true));\n this._afterAppend(ae);\n callback(error, ae);\n }\n\n process.once('end', handleStuff.bind(this));\n process.once('error', function(err) {\n error = err;\n });\n\n process.pipe(this, { end: false });\n\n return process;\n};\n\nZipArchiveOutputStream.prototype._writeCentralDirectoryEnd = function() {\n var records = this._entries.length;\n var size = this._archive.centralLength;\n var offset = this._archive.centralOffset;\n\n if (this.isZip64()) {\n records = constants.ZIP64_MAGIC_SHORT;\n size = constants.ZIP64_MAGIC;\n offset = constants.ZIP64_MAGIC;\n }\n\n // signature\n this.write(zipUtil.getLongBytes(constants.SIG_EOCD));\n\n // disk numbers\n this.write(constants.SHORT_ZERO);\n this.write(constants.SHORT_ZERO);\n\n // number of entries\n this.write(zipUtil.getShortBytes(records));\n this.write(zipUtil.getShortBytes(records));\n\n // length and location of CD\n this.write(zipUtil.getLongBytes(size));\n this.write(zipUtil.getLongBytes(offset));\n\n // archive comment\n var comment = this.getComment();\n var commentLength = Buffer.byteLength(comment);\n this.write(zipUtil.getShortBytes(commentLength));\n this.write(comment);\n};\n\nZipArchiveOutputStream.prototype._writeCentralDirectoryZip64 = function() {\n // signature\n this.write(zipUtil.getLongBytes(constants.SIG_ZIP64_EOCD));\n\n // size of the ZIP64 EOCD record\n this.write(zipUtil.getEightBytes(44));\n\n // version made by\n this.write(zipUtil.getShortBytes(constants.MIN_VERSION_ZIP64));\n\n // version to extract\n this.write(zipUtil.getShortBytes(constants.MIN_VERSION_ZIP64));\n\n // disk numbers\n this.write(constants.LONG_ZERO);\n this.write(constants.LONG_ZERO);\n\n // number of entries\n this.write(zipUtil.getEightBytes(this._entries.length));\n this.write(zipUtil.getEightBytes(this._entries.length));\n\n // length and location of CD\n this.write(zipUtil.getEightBytes(this._archive.centralLength));\n this.write(zipUtil.getEightBytes(this._archive.centralOffset));\n\n // extensible data sector\n // not implemented at this time\n\n // end of central directory locator\n this.write(zipUtil.getLongBytes(constants.SIG_ZIP64_EOCD_LOC));\n\n // disk number holding the ZIP64 EOCD record\n this.write(constants.LONG_ZERO);\n\n // relative offset of the ZIP64 EOCD record\n this.write(zipUtil.getEightBytes(this._archive.centralOffset + this._archive.centralLength));\n\n // total number of disks\n this.write(zipUtil.getLongBytes(1));\n};\n\nZipArchiveOutputStream.prototype._writeCentralFileHeader = function(ae) {\n var gpb = ae.getGeneralPurposeBit();\n var method = ae.getMethod();\n var offsets = ae._offsets;\n\n var size = ae.getSize();\n var compressedSize = ae.getCompressedSize();\n\n if (ae.isZip64() || offsets.file > constants.ZIP64_MAGIC) {\n size = constants.ZIP64_MAGIC;\n compressedSize = constants.ZIP64_MAGIC;\n\n ae.setVersionNeededToExtract(constants.MIN_VERSION_ZIP64);\n\n var extraBuf = Buffer.concat([\n zipUtil.getShortBytes(constants.ZIP64_EXTRA_ID),\n zipUtil.getShortBytes(24),\n zipUtil.getEightBytes(ae.getSize()),\n zipUtil.getEightBytes(ae.getCompressedSize()),\n zipUtil.getEightBytes(offsets.file)\n ], 28);\n\n ae.setExtra(extraBuf);\n }\n\n // signature\n this.write(zipUtil.getLongBytes(constants.SIG_CFH));\n\n // version made by\n this.write(zipUtil.getShortBytes((ae.getPlatform() << 8) | constants.VERSION_MADEBY));\n\n // version to extract and general bit flag\n this.write(zipUtil.getShortBytes(ae.getVersionNeededToExtract()));\n this.write(gpb.encode());\n\n // compression method\n this.write(zipUtil.getShortBytes(method));\n\n // datetime\n this.write(zipUtil.getLongBytes(ae.getTimeDos()));\n\n // crc32 checksum\n this.write(zipUtil.getLongBytes(ae.getCrc()));\n\n // sizes\n this.write(zipUtil.getLongBytes(compressedSize));\n this.write(zipUtil.getLongBytes(size));\n\n var name = ae.getName();\n var comment = ae.getComment();\n var extra = ae.getCentralDirectoryExtra();\n\n if (gpb.usesUTF8ForNames()) {\n name = Buffer.from(name);\n comment = Buffer.from(comment);\n }\n\n // name length\n this.write(zipUtil.getShortBytes(name.length));\n\n // extra length\n this.write(zipUtil.getShortBytes(extra.length));\n\n // comments length\n this.write(zipUtil.getShortBytes(comment.length));\n\n // disk number start\n this.write(constants.SHORT_ZERO);\n\n // internal attributes\n this.write(zipUtil.getShortBytes(ae.getInternalAttributes()));\n\n // external attributes\n this.write(zipUtil.getLongBytes(ae.getExternalAttributes()));\n\n // relative offset of LFH\n if (offsets.file > constants.ZIP64_MAGIC) {\n this.write(zipUtil.getLongBytes(constants.ZIP64_MAGIC));\n } else {\n this.write(zipUtil.getLongBytes(offsets.file));\n }\n\n // name\n this.write(name);\n\n // extra\n this.write(extra);\n\n // comment\n this.write(comment);\n};\n\nZipArchiveOutputStream.prototype._writeDataDescriptor = function(ae) {\n // signature\n this.write(zipUtil.getLongBytes(constants.SIG_DD));\n\n // crc32 checksum\n this.write(zipUtil.getLongBytes(ae.getCrc()));\n\n // sizes\n if (ae.isZip64()) {\n this.write(zipUtil.getEightBytes(ae.getCompressedSize()));\n this.write(zipUtil.getEightBytes(ae.getSize()));\n } else {\n this.write(zipUtil.getLongBytes(ae.getCompressedSize()));\n this.write(zipUtil.getLongBytes(ae.getSize()));\n }\n};\n\nZipArchiveOutputStream.prototype._writeLocalFileHeader = function(ae) {\n var gpb = ae.getGeneralPurposeBit();\n var method = ae.getMethod();\n var name = ae.getName();\n var extra = ae.getLocalFileDataExtra();\n\n if (ae.isZip64()) {\n gpb.useDataDescriptor(true);\n ae.setVersionNeededToExtract(constants.MIN_VERSION_ZIP64);\n }\n\n if (gpb.usesUTF8ForNames()) {\n name = Buffer.from(name);\n }\n\n ae._offsets.file = this.offset;\n\n // signature\n this.write(zipUtil.getLongBytes(constants.SIG_LFH));\n\n // version to extract and general bit flag\n this.write(zipUtil.getShortBytes(ae.getVersionNeededToExtract()));\n this.write(gpb.encode());\n\n // compression method\n this.write(zipUtil.getShortBytes(method));\n\n // datetime\n this.write(zipUtil.getLongBytes(ae.getTimeDos()));\n\n ae._offsets.data = this.offset;\n\n // crc32 checksum and sizes\n if (gpb.usesDataDescriptor()) {\n this.write(constants.LONG_ZERO);\n this.write(constants.LONG_ZERO);\n this.write(constants.LONG_ZERO);\n } else {\n this.write(zipUtil.getLongBytes(ae.getCrc()));\n this.write(zipUtil.getLongBytes(ae.getCompressedSize()));\n this.write(zipUtil.getLongBytes(ae.getSize()));\n }\n\n // name length\n this.write(zipUtil.getShortBytes(name.length));\n\n // extra length\n this.write(zipUtil.getShortBytes(extra.length));\n\n // name\n this.write(name);\n\n // extra\n this.write(extra);\n\n ae._offsets.contents = this.offset;\n};\n\nZipArchiveOutputStream.prototype.getComment = function(comment) {\n return this._archive.comment !== null ? this._archive.comment : '';\n};\n\nZipArchiveOutputStream.prototype.isZip64 = function() {\n return this._archive.forceZip64 || this._entries.length > constants.ZIP64_MAGIC_SHORT || this._archive.centralLength > constants.ZIP64_MAGIC || this._archive.centralOffset > constants.ZIP64_MAGIC;\n};\n\nZipArchiveOutputStream.prototype.setComment = function(comment) {\n this._archive.comment = comment;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMxNy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQXdCO0FBQ3ZDLFlBQVksbUJBQU8sQ0FBQyxJQUFjO0FBQ2xDLEtBQUssYUFBYSxFQUFFLG1CQUFPLENBQUMsSUFBYztBQUMxQyxLQUFLLG9CQUFvQixFQUFFLG1CQUFPLENBQUMsSUFBYzs7QUFFakQsMEJBQTBCLG1CQUFPLENBQUMsR0FBMEI7QUFDNUQsc0JBQXNCLG1CQUFPLENBQUMsSUFBcUI7QUFDbkQsd0JBQXdCLG1CQUFPLENBQUMsSUFBdUI7O0FBRXZELGdCQUFnQixtQkFBTyxDQUFDLElBQWE7QUFDckMsV0FBVyxtQkFBTyxDQUFDLElBQVk7QUFDL0IsY0FBYyxtQkFBTyxDQUFDLEdBQVE7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSCx1QkFBdUIsWUFBWTs7QUFFbkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2NvbXByZXNzLWNvbW1vbnMvbGliL2FyY2hpdmVycy96aXAvemlwLWFyY2hpdmUtb3V0cHV0LXN0cmVhbS5qcz9iMmVmIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogbm9kZS1jb21wcmVzcy1jb21tb25zXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IENocmlzIFRhbGtpbmd0b24sIGNvbnRyaWJ1dG9ycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcmNoaXZlcmpzL25vZGUtY29tcHJlc3MtY29tbW9ucy9ibG9iL21hc3Rlci9MSUNFTlNFLU1JVFxuICovXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCd1dGlsJykuaW5oZXJpdHM7XG52YXIgY3JjMzIgPSByZXF1aXJlKCdidWZmZXItY3JjMzInKTtcbnZhciB7Q1JDMzJTdHJlYW19ID0gcmVxdWlyZSgnY3JjMzItc3RyZWFtJyk7XG52YXIge0RlZmxhdGVDUkMzMlN0cmVhbX0gPSByZXF1aXJlKCdjcmMzMi1zdHJlYW0nKTtcblxudmFyIEFyY2hpdmVPdXRwdXRTdHJlYW0gPSByZXF1aXJlKCcuLi9hcmNoaXZlLW91dHB1dC1zdHJlYW0nKTtcbnZhciBaaXBBcmNoaXZlRW50cnkgPSByZXF1aXJlKCcuL3ppcC1hcmNoaXZlLWVudHJ5Jyk7XG52YXIgR2VuZXJhbFB1cnBvc2VCaXQgPSByZXF1aXJlKCcuL2dlbmVyYWwtcHVycG9zZS1iaXQnKTtcblxudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwnKTtcbnZhciB6aXBVdGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbnZhciBaaXBBcmNoaXZlT3V0cHV0U3RyZWFtID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBaaXBBcmNoaXZlT3V0cHV0U3RyZWFtKSkge1xuICAgIHJldHVybiBuZXcgWmlwQXJjaGl2ZU91dHB1dFN0cmVhbShvcHRpb25zKTtcbiAgfVxuXG4gIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMgPSB0aGlzLl9kZWZhdWx0cyhvcHRpb25zKTtcblxuICBBcmNoaXZlT3V0cHV0U3RyZWFtLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgdGhpcy5fZW50cnkgPSBudWxsO1xuICB0aGlzLl9lbnRyaWVzID0gW107XG4gIHRoaXMuX2FyY2hpdmUgPSB7XG4gICAgY2VudHJhbExlbmd0aDogMCxcbiAgICBjZW50cmFsT2Zmc2V0OiAwLFxuICAgIGNvbW1lbnQ6ICcnLFxuICAgIGZpbmlzaDogZmFsc2UsXG4gICAgZmluaXNoZWQ6IGZhbHNlLFxuICAgIHByb2Nlc3Npbmc6IGZhbHNlLFxuICAgIGZvcmNlWmlwNjQ6IG9wdGlvbnMuZm9yY2VaaXA2NCxcbiAgICBmb3JjZUxvY2FsVGltZTogb3B0aW9ucy5mb3JjZUxvY2FsVGltZVxuICB9O1xufTtcblxuaW5oZXJpdHMoWmlwQXJjaGl2ZU91dHB1dFN0cmVhbSwgQXJjaGl2ZU91dHB1dFN0cmVhbSk7XG5cblppcEFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLl9hZnRlckFwcGVuZCA9IGZ1bmN0aW9uKGFlKSB7XG4gIHRoaXMuX2VudHJpZXMucHVzaChhZSk7XG5cbiAgaWYgKGFlLmdldEdlbmVyYWxQdXJwb3NlQml0KCkudXNlc0RhdGFEZXNjcmlwdG9yKCkpIHtcbiAgICB0aGlzLl93cml0ZURhdGFEZXNjcmlwdG9yKGFlKTtcbiAgfVxuXG4gIHRoaXMuX2FyY2hpdmUucHJvY2Vzc2luZyA9IGZhbHNlO1xuICB0aGlzLl9lbnRyeSA9IG51bGw7XG5cbiAgaWYgKHRoaXMuX2FyY2hpdmUuZmluaXNoICYmICF0aGlzLl9hcmNoaXZlLmZpbmlzaGVkKSB7XG4gICAgdGhpcy5fZmluaXNoKCk7XG4gIH1cbn07XG5cblppcEFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLl9hcHBlbmRCdWZmZXIgPSBmdW5jdGlvbihhZSwgc291cmNlLCBjYWxsYmFjaykge1xuICBpZiAoc291cmNlLmxlbmd0aCA9PT0gMCkge1xuICAgIGFlLnNldE1ldGhvZChjb25zdGFudHMuTUVUSE9EX1NUT1JFRCk7XG4gIH1cblxuICB2YXIgbWV0aG9kID0gYWUuZ2V0TWV0aG9kKCk7XG5cbiAgaWYgKG1ldGhvZCA9PT0gY29uc3RhbnRzLk1FVEhPRF9TVE9SRUQpIHtcbiAgICBhZS5zZXRTaXplKHNvdXJjZS5sZW5ndGgpO1xuICAgIGFlLnNldENvbXByZXNzZWRTaXplKHNvdXJjZS5sZW5ndGgpO1xuICAgIGFlLnNldENyYyhjcmMzMi51bnNpZ25lZChzb3VyY2UpKTtcbiAgfVxuXG4gIHRoaXMuX3dyaXRlTG9jYWxGaWxlSGVhZGVyKGFlKTtcblxuICBpZiAobWV0aG9kID09PSBjb25zdGFudHMuTUVUSE9EX1NUT1JFRCkge1xuICAgIHRoaXMud3JpdGUoc291cmNlKTtcbiAgICB0aGlzLl9hZnRlckFwcGVuZChhZSk7XG4gICAgY2FsbGJhY2sobnVsbCwgYWUpO1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmIChtZXRob2QgPT09IGNvbnN0YW50cy5NRVRIT0RfREVGTEFURUQpIHtcbiAgICB0aGlzLl9zbWFydFN0cmVhbShhZSwgY2FsbGJhY2spLmVuZChzb3VyY2UpO1xuICAgIHJldHVybjtcbiAgfSBlbHNlIHtcbiAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ2NvbXByZXNzaW9uIG1ldGhvZCAnICsgbWV0aG9kICsgJyBub3QgaW1wbGVtZW50ZWQnKSk7XG4gICAgcmV0dXJuO1xuICB9XG59O1xuXG5aaXBBcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fYXBwZW5kU3RyZWFtID0gZnVuY3Rpb24oYWUsIHNvdXJjZSwgY2FsbGJhY2spIHtcbiAgYWUuZ2V0R2VuZXJhbFB1cnBvc2VCaXQoKS51c2VEYXRhRGVzY3JpcHRvcih0cnVlKTtcbiAgYWUuc2V0VmVyc2lvbk5lZWRlZFRvRXh0cmFjdChjb25zdGFudHMuTUlOX1ZFUlNJT05fREFUQV9ERVNDUklQVE9SKTtcblxuICB0aGlzLl93cml0ZUxvY2FsRmlsZUhlYWRlcihhZSk7XG5cbiAgdmFyIHNtYXJ0ID0gdGhpcy5fc21hcnRTdHJlYW0oYWUsIGNhbGxiYWNrKTtcbiAgc291cmNlLm9uY2UoJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7XG4gICAgc21hcnQuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgIHNtYXJ0LmVuZCgpO1xuICB9KVxuICBzb3VyY2UucGlwZShzbWFydCk7XG59O1xuXG5aaXBBcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fZGVmYXVsdHMgPSBmdW5jdGlvbihvKSB7XG4gIGlmICh0eXBlb2YgbyAhPT0gJ29iamVjdCcpIHtcbiAgICBvID0ge307XG4gIH1cblxuICBpZiAodHlwZW9mIG8uemxpYiAhPT0gJ29iamVjdCcpIHtcbiAgICBvLnpsaWIgPSB7fTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygby56bGliLmxldmVsICE9PSAnbnVtYmVyJykge1xuICAgIG8uemxpYi5sZXZlbCA9IGNvbnN0YW50cy5aTElCX0JFU1RfU1BFRUQ7XG4gIH1cblxuICBvLmZvcmNlWmlwNjQgPSAhIW8uZm9yY2VaaXA2NDtcbiAgby5mb3JjZUxvY2FsVGltZSA9ICEhby5mb3JjZUxvY2FsVGltZTtcblxuICByZXR1cm4gbztcbn07XG5cblppcEFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLl9maW5pc2ggPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fYXJjaGl2ZS5jZW50cmFsT2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG5cbiAgdGhpcy5fZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGFlKSB7XG4gICAgdGhpcy5fd3JpdGVDZW50cmFsRmlsZUhlYWRlcihhZSk7XG4gIH0uYmluZCh0aGlzKSk7XG5cbiAgdGhpcy5fYXJjaGl2ZS5jZW50cmFsTGVuZ3RoID0gdGhpcy5vZmZzZXQgLSB0aGlzLl9hcmNoaXZlLmNlbnRyYWxPZmZzZXQ7XG5cbiAgaWYgKHRoaXMuaXNaaXA2NCgpKSB7XG4gICAgdGhpcy5fd3JpdGVDZW50cmFsRGlyZWN0b3J5WmlwNjQoKTtcbiAgfVxuXG4gIHRoaXMuX3dyaXRlQ2VudHJhbERpcmVjdG9yeUVuZCgpO1xuXG4gIHRoaXMuX2FyY2hpdmUucHJvY2Vzc2luZyA9IGZhbHNlO1xuICB0aGlzLl9hcmNoaXZlLmZpbmlzaCA9IHRydWU7XG4gIHRoaXMuX2FyY2hpdmUuZmluaXNoZWQgPSB0cnVlO1xuICB0aGlzLmVuZCgpO1xufTtcblxuWmlwQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuX25vcm1hbGl6ZUVudHJ5ID0gZnVuY3Rpb24oYWUpIHtcbiAgaWYgKGFlLmdldE1ldGhvZCgpID09PSAtMSkge1xuICAgIGFlLnNldE1ldGhvZChjb25zdGFudHMuTUVUSE9EX0RFRkxBVEVEKTtcbiAgfVxuXG4gIGlmIChhZS5nZXRNZXRob2QoKSA9PT0gY29uc3RhbnRzLk1FVEhPRF9ERUZMQVRFRCkge1xuICAgIGFlLmdldEdlbmVyYWxQdXJwb3NlQml0KCkudXNlRGF0YURlc2NyaXB0b3IodHJ1ZSk7XG4gICAgYWUuc2V0VmVyc2lvbk5lZWRlZFRvRXh0cmFjdChjb25zdGFudHMuTUlOX1ZFUlNJT05fREFUQV9ERVNDUklQVE9SKTtcbiAgfVxuXG4gIGlmIChhZS5nZXRUaW1lKCkgPT09IC0xKSB7XG4gICAgYWUuc2V0VGltZShuZXcgRGF0ZSgpLCB0aGlzLl9hcmNoaXZlLmZvcmNlTG9jYWxUaW1lKTtcbiAgfVxuXG4gIGFlLl9vZmZzZXRzID0ge1xuICAgIGZpbGU6IDAsXG4gICAgZGF0YTogMCxcbiAgICBjb250ZW50czogMCxcbiAgfTtcbn07XG5cblppcEFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLl9zbWFydFN0cmVhbSA9IGZ1bmN0aW9uKGFlLCBjYWxsYmFjaykge1xuICB2YXIgZGVmbGF0ZSA9IGFlLmdldE1ldGhvZCgpID09PSBjb25zdGFudHMuTUVUSE9EX0RFRkxBVEVEO1xuICB2YXIgcHJvY2VzcyA9IGRlZmxhdGUgPyBuZXcgRGVmbGF0ZUNSQzMyU3RyZWFtKHRoaXMub3B0aW9ucy56bGliKSA6IG5ldyBDUkMzMlN0cmVhbSgpO1xuICB2YXIgZXJyb3IgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGhhbmRsZVN0dWZmKCkge1xuICAgIHZhciBkaWdlc3QgPSBwcm9jZXNzLmRpZ2VzdCgpLnJlYWRVSW50MzJCRSgwKTtcbiAgICBhZS5zZXRDcmMoZGlnZXN0KTtcbiAgICBhZS5zZXRTaXplKHByb2Nlc3Muc2l6ZSgpKTtcbiAgICBhZS5zZXRDb21wcmVzc2VkU2l6ZShwcm9jZXNzLnNpemUodHJ1ZSkpO1xuICAgIHRoaXMuX2FmdGVyQXBwZW5kKGFlKTtcbiAgICBjYWxsYmFjayhlcnJvciwgYWUpO1xuICB9XG5cbiAgcHJvY2Vzcy5vbmNlKCdlbmQnLCBoYW5kbGVTdHVmZi5iaW5kKHRoaXMpKTtcbiAgcHJvY2Vzcy5vbmNlKCdlcnJvcicsIGZ1bmN0aW9uKGVycikge1xuICAgIGVycm9yID0gZXJyO1xuICB9KTtcblxuICBwcm9jZXNzLnBpcGUodGhpcywgeyBlbmQ6IGZhbHNlIH0pO1xuXG4gIHJldHVybiBwcm9jZXNzO1xufTtcblxuWmlwQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuX3dyaXRlQ2VudHJhbERpcmVjdG9yeUVuZCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVjb3JkcyA9IHRoaXMuX2VudHJpZXMubGVuZ3RoO1xuICB2YXIgc2l6ZSA9IHRoaXMuX2FyY2hpdmUuY2VudHJhbExlbmd0aDtcbiAgdmFyIG9mZnNldCA9IHRoaXMuX2FyY2hpdmUuY2VudHJhbE9mZnNldDtcblxuICBpZiAodGhpcy5pc1ppcDY0KCkpIHtcbiAgICByZWNvcmRzID0gY29uc3RhbnRzLlpJUDY0X01BR0lDX1NIT1JUO1xuICAgIHNpemUgPSBjb25zdGFudHMuWklQNjRfTUFHSUM7XG4gICAgb2Zmc2V0ID0gY29uc3RhbnRzLlpJUDY0X01BR0lDO1xuICB9XG5cbiAgLy8gc2lnbmF0dXJlXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRMb25nQnl0ZXMoY29uc3RhbnRzLlNJR19FT0NEKSk7XG5cbiAgLy8gZGlzayBudW1iZXJzXG4gIHRoaXMud3JpdGUoY29uc3RhbnRzLlNIT1JUX1pFUk8pO1xuICB0aGlzLndyaXRlKGNvbnN0YW50cy5TSE9SVF9aRVJPKTtcblxuICAvLyBudW1iZXIgb2YgZW50cmllc1xuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0U2hvcnRCeXRlcyhyZWNvcmRzKSk7XG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRTaG9ydEJ5dGVzKHJlY29yZHMpKTtcblxuICAvLyBsZW5ndGggYW5kIGxvY2F0aW9uIG9mIENEXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRMb25nQnl0ZXMoc2l6ZSkpO1xuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0TG9uZ0J5dGVzKG9mZnNldCkpO1xuXG4gIC8vIGFyY2hpdmUgY29tbWVudFxuICB2YXIgY29tbWVudCA9IHRoaXMuZ2V0Q29tbWVudCgpO1xuICB2YXIgY29tbWVudExlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGNvbW1lbnQpO1xuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0U2hvcnRCeXRlcyhjb21tZW50TGVuZ3RoKSk7XG4gIHRoaXMud3JpdGUoY29tbWVudCk7XG59O1xuXG5aaXBBcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fd3JpdGVDZW50cmFsRGlyZWN0b3J5WmlwNjQgPSBmdW5jdGlvbigpIHtcbiAgLy8gc2lnbmF0dXJlXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRMb25nQnl0ZXMoY29uc3RhbnRzLlNJR19aSVA2NF9FT0NEKSk7XG5cbiAgLy8gc2l6ZSBvZiB0aGUgWklQNjQgRU9DRCByZWNvcmRcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldEVpZ2h0Qnl0ZXMoNDQpKTtcblxuICAvLyB2ZXJzaW9uIG1hZGUgYnlcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldFNob3J0Qnl0ZXMoY29uc3RhbnRzLk1JTl9WRVJTSU9OX1pJUDY0KSk7XG5cbiAgLy8gdmVyc2lvbiB0byBleHRyYWN0XG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRTaG9ydEJ5dGVzKGNvbnN0YW50cy5NSU5fVkVSU0lPTl9aSVA2NCkpO1xuXG4gIC8vIGRpc2sgbnVtYmVyc1xuICB0aGlzLndyaXRlKGNvbnN0YW50cy5MT05HX1pFUk8pO1xuICB0aGlzLndyaXRlKGNvbnN0YW50cy5MT05HX1pFUk8pO1xuXG4gIC8vIG51bWJlciBvZiBlbnRyaWVzXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRFaWdodEJ5dGVzKHRoaXMuX2VudHJpZXMubGVuZ3RoKSk7XG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRFaWdodEJ5dGVzKHRoaXMuX2VudHJpZXMubGVuZ3RoKSk7XG5cbiAgLy8gbGVuZ3RoIGFuZCBsb2NhdGlvbiBvZiBDRFxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0RWlnaHRCeXRlcyh0aGlzLl9hcmNoaXZlLmNlbnRyYWxMZW5ndGgpKTtcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldEVpZ2h0Qnl0ZXModGhpcy5fYXJjaGl2ZS5jZW50cmFsT2Zmc2V0KSk7XG5cbiAgLy8gZXh0ZW5zaWJsZSBkYXRhIHNlY3RvclxuICAvLyBub3QgaW1wbGVtZW50ZWQgYXQgdGhpcyB0aW1lXG5cbiAgLy8gZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3JcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhjb25zdGFudHMuU0lHX1pJUDY0X0VPQ0RfTE9DKSk7XG5cbiAgLy8gZGlzayBudW1iZXIgaG9sZGluZyB0aGUgWklQNjQgRU9DRCByZWNvcmRcbiAgdGhpcy53cml0ZShjb25zdGFudHMuTE9OR19aRVJPKTtcblxuICAvLyByZWxhdGl2ZSBvZmZzZXQgb2YgdGhlIFpJUDY0IEVPQ0QgcmVjb3JkXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRFaWdodEJ5dGVzKHRoaXMuX2FyY2hpdmUuY2VudHJhbE9mZnNldCArIHRoaXMuX2FyY2hpdmUuY2VudHJhbExlbmd0aCkpO1xuXG4gIC8vIHRvdGFsIG51bWJlciBvZiBkaXNrc1xuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0TG9uZ0J5dGVzKDEpKTtcbn07XG5cblppcEFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLl93cml0ZUNlbnRyYWxGaWxlSGVhZGVyID0gZnVuY3Rpb24oYWUpIHtcbiAgdmFyIGdwYiA9IGFlLmdldEdlbmVyYWxQdXJwb3NlQml0KCk7XG4gIHZhciBtZXRob2QgPSBhZS5nZXRNZXRob2QoKTtcbiAgdmFyIG9mZnNldHMgPSBhZS5fb2Zmc2V0cztcblxuICB2YXIgc2l6ZSA9IGFlLmdldFNpemUoKTtcbiAgdmFyIGNvbXByZXNzZWRTaXplID0gYWUuZ2V0Q29tcHJlc3NlZFNpemUoKTtcblxuICBpZiAoYWUuaXNaaXA2NCgpIHx8IG9mZnNldHMuZmlsZSA+IGNvbnN0YW50cy5aSVA2NF9NQUdJQykge1xuICAgIHNpemUgPSBjb25zdGFudHMuWklQNjRfTUFHSUM7XG4gICAgY29tcHJlc3NlZFNpemUgPSBjb25zdGFudHMuWklQNjRfTUFHSUM7XG5cbiAgICBhZS5zZXRWZXJzaW9uTmVlZGVkVG9FeHRyYWN0KGNvbnN0YW50cy5NSU5fVkVSU0lPTl9aSVA2NCk7XG5cbiAgICB2YXIgZXh0cmFCdWYgPSBCdWZmZXIuY29uY2F0KFtcbiAgICAgIHppcFV0aWwuZ2V0U2hvcnRCeXRlcyhjb25zdGFudHMuWklQNjRfRVhUUkFfSUQpLFxuICAgICAgemlwVXRpbC5nZXRTaG9ydEJ5dGVzKDI0KSxcbiAgICAgIHppcFV0aWwuZ2V0RWlnaHRCeXRlcyhhZS5nZXRTaXplKCkpLFxuICAgICAgemlwVXRpbC5nZXRFaWdodEJ5dGVzKGFlLmdldENvbXByZXNzZWRTaXplKCkpLFxuICAgICAgemlwVXRpbC5nZXRFaWdodEJ5dGVzKG9mZnNldHMuZmlsZSlcbiAgICBdLCAyOCk7XG5cbiAgICBhZS5zZXRFeHRyYShleHRyYUJ1Zik7XG4gIH1cblxuICAvLyBzaWduYXR1cmVcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhjb25zdGFudHMuU0lHX0NGSCkpO1xuXG4gIC8vIHZlcnNpb24gbWFkZSBieVxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0U2hvcnRCeXRlcygoYWUuZ2V0UGxhdGZvcm0oKSA8PCA4KSB8IGNvbnN0YW50cy5WRVJTSU9OX01BREVCWSkpO1xuXG4gIC8vIHZlcnNpb24gdG8gZXh0cmFjdCBhbmQgZ2VuZXJhbCBiaXQgZmxhZ1xuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0U2hvcnRCeXRlcyhhZS5nZXRWZXJzaW9uTmVlZGVkVG9FeHRyYWN0KCkpKTtcbiAgdGhpcy53cml0ZShncGIuZW5jb2RlKCkpO1xuXG4gIC8vIGNvbXByZXNzaW9uIG1ldGhvZFxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0U2hvcnRCeXRlcyhtZXRob2QpKTtcblxuICAvLyBkYXRldGltZVxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0TG9uZ0J5dGVzKGFlLmdldFRpbWVEb3MoKSkpO1xuXG4gIC8vIGNyYzMyIGNoZWNrc3VtXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRMb25nQnl0ZXMoYWUuZ2V0Q3JjKCkpKTtcblxuICAvLyBzaXplc1xuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0TG9uZ0J5dGVzKGNvbXByZXNzZWRTaXplKSk7XG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRMb25nQnl0ZXMoc2l6ZSkpO1xuXG4gIHZhciBuYW1lID0gYWUuZ2V0TmFtZSgpO1xuICB2YXIgY29tbWVudCA9IGFlLmdldENvbW1lbnQoKTtcbiAgdmFyIGV4dHJhID0gYWUuZ2V0Q2VudHJhbERpcmVjdG9yeUV4dHJhKCk7XG5cbiAgaWYgKGdwYi51c2VzVVRGOEZvck5hbWVzKCkpIHtcbiAgICBuYW1lID0gQnVmZmVyLmZyb20obmFtZSk7XG4gICAgY29tbWVudCA9IEJ1ZmZlci5mcm9tKGNvbW1lbnQpO1xuICB9XG5cbiAgLy8gbmFtZSBsZW5ndGhcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldFNob3J0Qnl0ZXMobmFtZS5sZW5ndGgpKTtcblxuICAvLyBleHRyYSBsZW5ndGhcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldFNob3J0Qnl0ZXMoZXh0cmEubGVuZ3RoKSk7XG5cbiAgLy8gY29tbWVudHMgbGVuZ3RoXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRTaG9ydEJ5dGVzKGNvbW1lbnQubGVuZ3RoKSk7XG5cbiAgLy8gZGlzayBudW1iZXIgc3RhcnRcbiAgdGhpcy53cml0ZShjb25zdGFudHMuU0hPUlRfWkVSTyk7XG5cbiAgLy8gaW50ZXJuYWwgYXR0cmlidXRlc1xuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0U2hvcnRCeXRlcyhhZS5nZXRJbnRlcm5hbEF0dHJpYnV0ZXMoKSkpO1xuXG4gIC8vIGV4dGVybmFsIGF0dHJpYnV0ZXNcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhhZS5nZXRFeHRlcm5hbEF0dHJpYnV0ZXMoKSkpO1xuXG4gIC8vIHJlbGF0aXZlIG9mZnNldCBvZiBMRkhcbiAgaWYgKG9mZnNldHMuZmlsZSA+IGNvbnN0YW50cy5aSVA2NF9NQUdJQykge1xuICAgIHRoaXMud3JpdGUoemlwVXRpbC5nZXRMb25nQnl0ZXMoY29uc3RhbnRzLlpJUDY0X01BR0lDKSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhvZmZzZXRzLmZpbGUpKTtcbiAgfVxuXG4gIC8vIG5hbWVcbiAgdGhpcy53cml0ZShuYW1lKTtcblxuICAvLyBleHRyYVxuICB0aGlzLndyaXRlKGV4dHJhKTtcblxuICAvLyBjb21tZW50XG4gIHRoaXMud3JpdGUoY29tbWVudCk7XG59O1xuXG5aaXBBcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fd3JpdGVEYXRhRGVzY3JpcHRvciA9IGZ1bmN0aW9uKGFlKSB7XG4gIC8vIHNpZ25hdHVyZVxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0TG9uZ0J5dGVzKGNvbnN0YW50cy5TSUdfREQpKTtcblxuICAvLyBjcmMzMiBjaGVja3N1bVxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0TG9uZ0J5dGVzKGFlLmdldENyYygpKSk7XG5cbiAgLy8gc2l6ZXNcbiAgaWYgKGFlLmlzWmlwNjQoKSkge1xuICAgIHRoaXMud3JpdGUoemlwVXRpbC5nZXRFaWdodEJ5dGVzKGFlLmdldENvbXByZXNzZWRTaXplKCkpKTtcbiAgICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0RWlnaHRCeXRlcyhhZS5nZXRTaXplKCkpKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0TG9uZ0J5dGVzKGFlLmdldENvbXByZXNzZWRTaXplKCkpKTtcbiAgICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0TG9uZ0J5dGVzKGFlLmdldFNpemUoKSkpO1xuICB9XG59O1xuXG5aaXBBcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fd3JpdGVMb2NhbEZpbGVIZWFkZXIgPSBmdW5jdGlvbihhZSkge1xuICB2YXIgZ3BiID0gYWUuZ2V0R2VuZXJhbFB1cnBvc2VCaXQoKTtcbiAgdmFyIG1ldGhvZCA9IGFlLmdldE1ldGhvZCgpO1xuICB2YXIgbmFtZSA9IGFlLmdldE5hbWUoKTtcbiAgdmFyIGV4dHJhID0gYWUuZ2V0TG9jYWxGaWxlRGF0YUV4dHJhKCk7XG5cbiAgaWYgKGFlLmlzWmlwNjQoKSkge1xuICAgIGdwYi51c2VEYXRhRGVzY3JpcHRvcih0cnVlKTtcbiAgICBhZS5zZXRWZXJzaW9uTmVlZGVkVG9FeHRyYWN0KGNvbnN0YW50cy5NSU5fVkVSU0lPTl9aSVA2NCk7XG4gIH1cblxuICBpZiAoZ3BiLnVzZXNVVEY4Rm9yTmFtZXMoKSkge1xuICAgIG5hbWUgPSBCdWZmZXIuZnJvbShuYW1lKTtcbiAgfVxuXG4gIGFlLl9vZmZzZXRzLmZpbGUgPSB0aGlzLm9mZnNldDtcblxuICAvLyBzaWduYXR1cmVcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhjb25zdGFudHMuU0lHX0xGSCkpO1xuXG4gIC8vIHZlcnNpb24gdG8gZXh0cmFjdCBhbmQgZ2VuZXJhbCBiaXQgZmxhZ1xuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0U2hvcnRCeXRlcyhhZS5nZXRWZXJzaW9uTmVlZGVkVG9FeHRyYWN0KCkpKTtcbiAgdGhpcy53cml0ZShncGIuZW5jb2RlKCkpO1xuXG4gIC8vIGNvbXByZXNzaW9uIG1ldGhvZFxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0U2hvcnRCeXRlcyhtZXRob2QpKTtcblxuICAvLyBkYXRldGltZVxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0TG9uZ0J5dGVzKGFlLmdldFRpbWVEb3MoKSkpO1xuXG4gIGFlLl9vZmZzZXRzLmRhdGEgPSB0aGlzLm9mZnNldDtcblxuICAvLyBjcmMzMiBjaGVja3N1bSBhbmQgc2l6ZXNcbiAgaWYgKGdwYi51c2VzRGF0YURlc2NyaXB0b3IoKSkge1xuICAgIHRoaXMud3JpdGUoY29uc3RhbnRzLkxPTkdfWkVSTyk7XG4gICAgdGhpcy53cml0ZShjb25zdGFudHMuTE9OR19aRVJPKTtcbiAgICB0aGlzLndyaXRlKGNvbnN0YW50cy5MT05HX1pFUk8pO1xuICB9IGVsc2Uge1xuICAgIHRoaXMud3JpdGUoemlwVXRpbC5nZXRMb25nQnl0ZXMoYWUuZ2V0Q3JjKCkpKTtcbiAgICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0TG9uZ0J5dGVzKGFlLmdldENvbXByZXNzZWRTaXplKCkpKTtcbiAgICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0TG9uZ0J5dGVzKGFlLmdldFNpemUoKSkpO1xuICB9XG5cbiAgLy8gbmFtZSBsZW5ndGhcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldFNob3J0Qnl0ZXMobmFtZS5sZW5ndGgpKTtcblxuICAvLyBleHRyYSBsZW5ndGhcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldFNob3J0Qnl0ZXMoZXh0cmEubGVuZ3RoKSk7XG5cbiAgLy8gbmFtZVxuICB0aGlzLndyaXRlKG5hbWUpO1xuXG4gIC8vIGV4dHJhXG4gIHRoaXMud3JpdGUoZXh0cmEpO1xuXG4gIGFlLl9vZmZzZXRzLmNvbnRlbnRzID0gdGhpcy5vZmZzZXQ7XG59O1xuXG5aaXBBcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5nZXRDb21tZW50ID0gZnVuY3Rpb24oY29tbWVudCkge1xuICByZXR1cm4gdGhpcy5fYXJjaGl2ZS5jb21tZW50ICE9PSBudWxsID8gdGhpcy5fYXJjaGl2ZS5jb21tZW50IDogJyc7XG59O1xuXG5aaXBBcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5pc1ppcDY0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9hcmNoaXZlLmZvcmNlWmlwNjQgfHwgdGhpcy5fZW50cmllcy5sZW5ndGggPiBjb25zdGFudHMuWklQNjRfTUFHSUNfU0hPUlQgfHwgdGhpcy5fYXJjaGl2ZS5jZW50cmFsTGVuZ3RoID4gY29uc3RhbnRzLlpJUDY0X01BR0lDIHx8IHRoaXMuX2FyY2hpdmUuY2VudHJhbE9mZnNldCA+IGNvbnN0YW50cy5aSVA2NF9NQUdJQztcbn07XG5cblppcEFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLnNldENvbW1lbnQgPSBmdW5jdGlvbihjb21tZW50KSB7XG4gIHRoaXMuX2FyY2hpdmUuY29tbWVudCA9IGNvbW1lbnQ7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2317\n")},6412:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * node-compress-commons\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-compress-commons/blob/master/LICENSE-MIT\n */\nmodule.exports = {\n ArchiveEntry: __webpack_require__(8919),\n ZipArchiveEntry: __webpack_require__(8691),\n ArchiveOutputStream: __webpack_require__(211),\n ZipArchiveOutputStream: __webpack_require__(2317)\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQxMi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLG1CQUFPLENBQUMsSUFBMkI7QUFDbkQsbUJBQW1CLG1CQUFPLENBQUMsSUFBbUM7QUFDOUQsdUJBQXVCLG1CQUFPLENBQUMsR0FBbUM7QUFDbEUsMEJBQTBCLG1CQUFPLENBQUMsSUFBMkM7QUFDN0UiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9jb21wcmVzcy1jb21tb25zL2xpYi9jb21wcmVzcy1jb21tb25zLmpzPzZkMmUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBub2RlLWNvbXByZXNzLWNvbW1vbnNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgQ2hyaXMgVGFsa2luZ3RvbiwgY29udHJpYnV0b3JzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICogaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1jb21wcmVzcy1jb21tb25zL2Jsb2IvbWFzdGVyL0xJQ0VOU0UtTUlUXG4gKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuICBBcmNoaXZlRW50cnk6IHJlcXVpcmUoJy4vYXJjaGl2ZXJzL2FyY2hpdmUtZW50cnknKSxcbiAgWmlwQXJjaGl2ZUVudHJ5OiByZXF1aXJlKCcuL2FyY2hpdmVycy96aXAvemlwLWFyY2hpdmUtZW50cnknKSxcbiAgQXJjaGl2ZU91dHB1dFN0cmVhbTogcmVxdWlyZSgnLi9hcmNoaXZlcnMvYXJjaGl2ZS1vdXRwdXQtc3RyZWFtJyksXG4gIFppcEFyY2hpdmVPdXRwdXRTdHJlYW06IHJlcXVpcmUoJy4vYXJjaGl2ZXJzL3ppcC96aXAtYXJjaGl2ZS1vdXRwdXQtc3RyZWFtJylcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6412\n")},5986:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * node-compress-commons\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-compress-commons/blob/master/LICENSE-MIT\n */\nvar Stream = (__webpack_require__(2781).Stream);\nvar PassThrough = (__webpack_require__(1451).PassThrough);\n\nvar util = module.exports = {};\n\nutil.isStream = function(source) {\n return source instanceof Stream;\n};\n\nutil.normalizeInputSource = function(source) {\n if (source === null) {\n return Buffer.alloc(0);\n } else if (typeof source === 'string') {\n return Buffer.from(source);\n } else if (util.isStream(source) && !source._readableState) {\n var normalized = new PassThrough();\n source.pipe(normalized);\n\n return normalized;\n }\n\n return source;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk4Ni5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsa0NBQXdCO0FBQ3JDLGtCQUFrQix1Q0FBc0M7O0FBRXhEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9jb21wcmVzcy1jb21tb25zL2xpYi91dGlsL2luZGV4LmpzP2RiOTEiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBub2RlLWNvbXByZXNzLWNvbW1vbnNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgQ2hyaXMgVGFsa2luZ3RvbiwgY29udHJpYnV0b3JzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICogaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1jb21wcmVzcy1jb21tb25zL2Jsb2IvbWFzdGVyL0xJQ0VOU0UtTUlUXG4gKi9cbnZhciBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKS5TdHJlYW07XG52YXIgUGFzc1Rocm91Z2ggPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0nKS5QYXNzVGhyb3VnaDtcblxudmFyIHV0aWwgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG51dGlsLmlzU3RyZWFtID0gZnVuY3Rpb24oc291cmNlKSB7XG4gIHJldHVybiBzb3VyY2UgaW5zdGFuY2VvZiBTdHJlYW07XG59O1xuXG51dGlsLm5vcm1hbGl6ZUlucHV0U291cmNlID0gZnVuY3Rpb24oc291cmNlKSB7XG4gIGlmIChzb3VyY2UgPT09IG51bGwpIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHNvdXJjZSk7XG4gIH0gZWxzZSBpZiAodXRpbC5pc1N0cmVhbShzb3VyY2UpICYmICFzb3VyY2UuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICB2YXIgbm9ybWFsaXplZCA9IG5ldyBQYXNzVGhyb3VnaCgpO1xuICAgIHNvdXJjZS5waXBlKG5vcm1hbGl6ZWQpO1xuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gIH1cblxuICByZXR1cm4gc291cmNlO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5986\n")},1048:module=>{eval("module.exports = function (xs, fn) {\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n var x = fn(xs[i], i);\n if (isArray(x)) res.push.apply(res, x);\n else res.push(x);\n }\n return res;\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA0OC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0Esb0JBQW9CLGVBQWU7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2NvbmNhdC1tYXAvaW5kZXguanM/ODljMCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh4cywgZm4pIHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgeCA9IGZuKHhzW2ldLCBpKTtcbiAgICAgICAgaWYgKGlzQXJyYXkoeCkpIHJlcy5wdXNoLmFwcGx5KHJlcywgeCk7XG4gICAgICAgIGVsc2UgcmVzLnB1c2goeCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKHhzKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4cykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1048\n")},6497:(__unused_webpack_module,exports,__webpack_require__)=>{eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\n\nfunction isArray(arg) {\n if (Array.isArray) {\n return Array.isArray(arg);\n }\n return objectToString(arg) === '[object Array]';\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n return (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = __webpack_require__(4300).Buffer.isBuffer;\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQ5Ny5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTs7QUFFZjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTtBQUNBLGNBQWM7O0FBRWQ7QUFDQTtBQUNBO0FBQ0EseUJBQXlCOztBQUV6QjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjs7QUFFaEI7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCOztBQUVoQjtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjs7QUFFaEI7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCOztBQUVoQjtBQUNBO0FBQ0E7QUFDQSxjQUFjOztBQUVkO0FBQ0E7QUFDQTtBQUNBLGVBQWU7O0FBRWY7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCOztBQUVsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1COztBQUVuQiw0REFBb0Q7O0FBRXBEO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2NvcmUtdXRpbC1pcy9saWIvdXRpbC5qcz8zYTdjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuXG5mdW5jdGlvbiBpc0FycmF5KGFyZykge1xuICBpZiAoQXJyYXkuaXNBcnJheSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGFyZyk7XG4gIH1cbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKGFyZykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXIuaXNCdWZmZXI7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6497\n")},4606:(__unused_webpack_module,exports)=>{eval("/*! crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*exported CRC32 */\nvar CRC32;\n(function (factory) {\n\t/*jshint ignore:start */\n\t/*eslint-disable */\n\tif(typeof DO_NOT_EXPORT_CRC === 'undefined') {\n\t\tif(true) {\n\t\t\tfactory(exports);\n\t\t} else {}\n\t} else {\n\t\tfactory(CRC32 = {});\n\t}\n\t/*eslint-enable */\n\t/*jshint ignore:end */\n}(function(CRC32) {\nCRC32.version = '1.2.2';\n/*global Int32Array */\nfunction signed_crc_table() {\n\tvar c = 0, table = new Array(256);\n\n\tfor(var n =0; n != 256; ++n){\n\t\tc = n;\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\ttable[n] = c;\n\t}\n\n\treturn typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;\n}\n\nvar T0 = signed_crc_table();\nfunction slice_by_16_tables(T) {\n\tvar c = 0, v = 0, n = 0, table = typeof Int32Array !== 'undefined' ? new Int32Array(4096) : new Array(4096) ;\n\n\tfor(n = 0; n != 256; ++n) table[n] = T[n];\n\tfor(n = 0; n != 256; ++n) {\n\t\tv = T[n];\n\t\tfor(c = 256 + n; c < 4096; c += 256) v = table[c] = (v >>> 8) ^ T[v & 0xFF];\n\t}\n\tvar out = [];\n\tfor(n = 1; n != 16; ++n) out[n - 1] = typeof Int32Array !== 'undefined' ? table.subarray(n * 256, n * 256 + 256) : table.slice(n * 256, n * 256 + 256);\n\treturn out;\n}\nvar TT = slice_by_16_tables(T0);\nvar T1 = TT[0], T2 = TT[1], T3 = TT[2], T4 = TT[3], T5 = TT[4];\nvar T6 = TT[5], T7 = TT[6], T8 = TT[7], T9 = TT[8], Ta = TT[9];\nvar Tb = TT[10], Tc = TT[11], Td = TT[12], Te = TT[13], Tf = TT[14];\nfunction crc32_bstr(bstr, seed) {\n\tvar C = seed ^ -1;\n\tfor(var i = 0, L = bstr.length; i < L;) C = (C>>>8) ^ T0[(C^bstr.charCodeAt(i++))&0xFF];\n\treturn ~C;\n}\n\nfunction crc32_buf(B, seed) {\n\tvar C = seed ^ -1, L = B.length - 15, i = 0;\n\tfor(; i < L;) C =\n\t\tTf[B[i++] ^ (C & 255)] ^\n\t\tTe[B[i++] ^ ((C >> 8) & 255)] ^\n\t\tTd[B[i++] ^ ((C >> 16) & 255)] ^\n\t\tTc[B[i++] ^ (C >>> 24)] ^\n\t\tTb[B[i++]] ^ Ta[B[i++]] ^ T9[B[i++]] ^ T8[B[i++]] ^\n\t\tT7[B[i++]] ^ T6[B[i++]] ^ T5[B[i++]] ^ T4[B[i++]] ^\n\t\tT3[B[i++]] ^ T2[B[i++]] ^ T1[B[i++]] ^ T0[B[i++]];\n\tL += 15;\n\twhile(i < L) C = (C>>>8) ^ T0[(C^B[i++])&0xFF];\n\treturn ~C;\n}\n\nfunction crc32_str(str, seed) {\n\tvar C = seed ^ -1;\n\tfor(var i = 0, L = str.length, c = 0, d = 0; i < L;) {\n\t\tc = str.charCodeAt(i++);\n\t\tif(c < 0x80) {\n\t\t\tC = (C>>>8) ^ T0[(C^c)&0xFF];\n\t\t} else if(c < 0x800) {\n\t\t\tC = (C>>>8) ^ T0[(C ^ (192|((c>>6)&31)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|(c&63)))&0xFF];\n\t\t} else if(c >= 0xD800 && c < 0xE000) {\n\t\t\tc = (c&1023)+64; d = str.charCodeAt(i++)&1023;\n\t\t\tC = (C>>>8) ^ T0[(C ^ (240|((c>>8)&7)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|((c>>2)&63)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|((d>>6)&15)|((c&3)<<4)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|(d&63)))&0xFF];\n\t\t} else {\n\t\t\tC = (C>>>8) ^ T0[(C ^ (224|((c>>12)&15)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|((c>>6)&63)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|(c&63)))&0xFF];\n\t\t}\n\t}\n\treturn ~C;\n}\nCRC32.table = T0;\n// $FlowIgnore\nCRC32.bstr = crc32_bstr;\n// $FlowIgnore\nCRC32.buf = crc32_buf;\n// $FlowIgnore\nCRC32.str = crc32_str;\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYwNi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxJQUEyQjtBQUNoQztBQUNBLElBQUksS0FBSyxFQVFOO0FBQ0gsR0FBRztBQUNILG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsWUFBWSxVQUFVO0FBQ3RCLFlBQVksVUFBVTtBQUN0QjtBQUNBLG1CQUFtQixVQUFVO0FBQzdCO0FBQ0E7QUFDQSxZQUFZLFNBQVM7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxNQUFNO0FBQ3ZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU8sTUFBTTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhDQUE4QyxNQUFNO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2NyYy0zMi9jcmMzMi5qcz83MDJkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISBjcmMzMi5qcyAoQykgMjAxNC1wcmVzZW50IFNoZWV0SlMgLS0gaHR0cDovL3NoZWV0anMuY29tICovXG4vKiB2aW06IHNldCB0cz0yOiAqL1xuLypleHBvcnRlZCBDUkMzMiAqL1xudmFyIENSQzMyO1xuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG5cdC8qanNoaW50IGlnbm9yZTpzdGFydCAqL1xuXHQvKmVzbGludC1kaXNhYmxlICovXG5cdGlmKHR5cGVvZiBET19OT1RfRVhQT1JUX0NSQyA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRpZignb2JqZWN0JyA9PT0gdHlwZW9mIGV4cG9ydHMpIHtcblx0XHRcdGZhY3RvcnkoZXhwb3J0cyk7XG5cdFx0fSBlbHNlIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgZGVmaW5lICYmIGRlZmluZS5hbWQpIHtcblx0XHRcdGRlZmluZShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHZhciBtb2R1bGUgPSB7fTtcblx0XHRcdFx0ZmFjdG9yeShtb2R1bGUpO1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZhY3RvcnkoQ1JDMzIgPSB7fSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGZhY3RvcnkoQ1JDMzIgPSB7fSk7XG5cdH1cblx0Lyplc2xpbnQtZW5hYmxlICovXG5cdC8qanNoaW50IGlnbm9yZTplbmQgKi9cbn0oZnVuY3Rpb24oQ1JDMzIpIHtcbkNSQzMyLnZlcnNpb24gPSAnMS4yLjInO1xuLypnbG9iYWwgSW50MzJBcnJheSAqL1xuZnVuY3Rpb24gc2lnbmVkX2NyY190YWJsZSgpIHtcblx0dmFyIGMgPSAwLCB0YWJsZSA9IG5ldyBBcnJheSgyNTYpO1xuXG5cdGZvcih2YXIgbiA9MDsgbiAhPSAyNTY7ICsrbil7XG5cdFx0YyA9IG47XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0dGFibGVbbl0gPSBjO1xuXHR9XG5cblx0cmV0dXJuIHR5cGVvZiBJbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyA/IG5ldyBJbnQzMkFycmF5KHRhYmxlKSA6IHRhYmxlO1xufVxuXG52YXIgVDAgPSBzaWduZWRfY3JjX3RhYmxlKCk7XG5mdW5jdGlvbiBzbGljZV9ieV8xNl90YWJsZXMoVCkge1xuXHR2YXIgYyA9IDAsIHYgPSAwLCBuID0gMCwgdGFibGUgPSB0eXBlb2YgSW50MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBuZXcgSW50MzJBcnJheSg0MDk2KSA6IG5ldyBBcnJheSg0MDk2KSA7XG5cblx0Zm9yKG4gPSAwOyBuICE9IDI1NjsgKytuKSB0YWJsZVtuXSA9IFRbbl07XG5cdGZvcihuID0gMDsgbiAhPSAyNTY7ICsrbikge1xuXHRcdHYgPSBUW25dO1xuXHRcdGZvcihjID0gMjU2ICsgbjsgYyA8IDQwOTY7IGMgKz0gMjU2KSB2ID0gdGFibGVbY10gPSAodiA+Pj4gOCkgXiBUW3YgJiAweEZGXTtcblx0fVxuXHR2YXIgb3V0ID0gW107XG5cdGZvcihuID0gMTsgbiAhPSAxNjsgKytuKSBvdXRbbiAtIDFdID0gdHlwZW9mIEludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnID8gdGFibGUuc3ViYXJyYXkobiAqIDI1NiwgbiAqIDI1NiArIDI1NikgOiB0YWJsZS5zbGljZShuICogMjU2LCBuICogMjU2ICsgMjU2KTtcblx0cmV0dXJuIG91dDtcbn1cbnZhciBUVCA9IHNsaWNlX2J5XzE2X3RhYmxlcyhUMCk7XG52YXIgVDEgPSBUVFswXSwgIFQyID0gVFRbMV0sICBUMyA9IFRUWzJdLCAgVDQgPSBUVFszXSwgIFQ1ID0gVFRbNF07XG52YXIgVDYgPSBUVFs1XSwgIFQ3ID0gVFRbNl0sICBUOCA9IFRUWzddLCAgVDkgPSBUVFs4XSwgIFRhID0gVFRbOV07XG52YXIgVGIgPSBUVFsxMF0sIFRjID0gVFRbMTFdLCBUZCA9IFRUWzEyXSwgVGUgPSBUVFsxM10sIFRmID0gVFRbMTRdO1xuZnVuY3Rpb24gY3JjMzJfYnN0cihic3RyLCBzZWVkKSB7XG5cdHZhciBDID0gc2VlZCBeIC0xO1xuXHRmb3IodmFyIGkgPSAwLCBMID0gYnN0ci5sZW5ndGg7IGkgPCBMOykgQyA9IChDPj4+OCkgXiBUMFsoQ15ic3RyLmNoYXJDb2RlQXQoaSsrKSkmMHhGRl07XG5cdHJldHVybiB+Qztcbn1cblxuZnVuY3Rpb24gY3JjMzJfYnVmKEIsIHNlZWQpIHtcblx0dmFyIEMgPSBzZWVkIF4gLTEsIEwgPSBCLmxlbmd0aCAtIDE1LCBpID0gMDtcblx0Zm9yKDsgaSA8IEw7KSBDID1cblx0XHRUZltCW2krK10gXiAoQyAmIDI1NSldIF5cblx0XHRUZVtCW2krK10gXiAoKEMgPj4gOCkgJiAyNTUpXSBeXG5cdFx0VGRbQltpKytdIF4gKChDID4+IDE2KSAmIDI1NSldIF5cblx0XHRUY1tCW2krK10gXiAoQyA+Pj4gMjQpXSBeXG5cdFx0VGJbQltpKytdXSBeIFRhW0JbaSsrXV0gXiBUOVtCW2krK11dIF4gVDhbQltpKytdXSBeXG5cdFx0VDdbQltpKytdXSBeIFQ2W0JbaSsrXV0gXiBUNVtCW2krK11dIF4gVDRbQltpKytdXSBeXG5cdFx0VDNbQltpKytdXSBeIFQyW0JbaSsrXV0gXiBUMVtCW2krK11dIF4gVDBbQltpKytdXTtcblx0TCArPSAxNTtcblx0d2hpbGUoaSA8IEwpIEMgPSAoQz4+PjgpIF4gVDBbKENeQltpKytdKSYweEZGXTtcblx0cmV0dXJuIH5DO1xufVxuXG5mdW5jdGlvbiBjcmMzMl9zdHIoc3RyLCBzZWVkKSB7XG5cdHZhciBDID0gc2VlZCBeIC0xO1xuXHRmb3IodmFyIGkgPSAwLCBMID0gc3RyLmxlbmd0aCwgYyA9IDAsIGQgPSAwOyBpIDwgTDspIHtcblx0XHRjID0gc3RyLmNoYXJDb2RlQXQoaSsrKTtcblx0XHRpZihjIDwgMHg4MCkge1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUMFsoQ15jKSYweEZGXTtcblx0XHR9IGVsc2UgaWYoYyA8IDB4ODAwKSB7XG5cdFx0XHRDID0gKEM+Pj44KSBeIFQwWyhDIF4gKDE5MnwoKGM+PjYpJjMxKSkpJjB4RkZdO1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUMFsoQyBeICgxMjh8KGMmNjMpKSkmMHhGRl07XG5cdFx0fSBlbHNlIGlmKGMgPj0gMHhEODAwICYmIGMgPCAweEUwMDApIHtcblx0XHRcdGMgPSAoYyYxMDIzKSs2NDsgZCA9IHN0ci5jaGFyQ29kZUF0KGkrKykmMTAyMztcblx0XHRcdEMgPSAoQz4+PjgpIF4gVDBbKEMgXiAoMjQwfCgoYz4+OCkmNykpKSYweEZGXTtcblx0XHRcdEMgPSAoQz4+PjgpIF4gVDBbKEMgXiAoMTI4fCgoYz4+MikmNjMpKSkmMHhGRl07XG5cdFx0XHRDID0gKEM+Pj44KSBeIFQwWyhDIF4gKDEyOHwoKGQ+PjYpJjE1KXwoKGMmMyk8PDQpKSkmMHhGRl07XG5cdFx0XHRDID0gKEM+Pj44KSBeIFQwWyhDIF4gKDEyOHwoZCY2MykpKSYweEZGXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUMFsoQyBeICgyMjR8KChjPj4xMikmMTUpKSkmMHhGRl07XG5cdFx0XHRDID0gKEM+Pj44KSBeIFQwWyhDIF4gKDEyOHwoKGM+PjYpJjYzKSkpJjB4RkZdO1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUMFsoQyBeICgxMjh8KGMmNjMpKSkmMHhGRl07XG5cdFx0fVxuXHR9XG5cdHJldHVybiB+Qztcbn1cbkNSQzMyLnRhYmxlID0gVDA7XG4vLyAkRmxvd0lnbm9yZVxuQ1JDMzIuYnN0ciA9IGNyYzMyX2JzdHI7XG4vLyAkRmxvd0lnbm9yZVxuQ1JDMzIuYnVmID0gY3JjMzJfYnVmO1xuLy8gJEZsb3dJZ25vcmVcbkNSQzMyLnN0ciA9IGNyYzMyX3N0cjtcbn0pKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4606\n")},8606:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("/**\n * node-crc32-stream\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-crc32-stream/blob/master/LICENSE-MIT\n */\n\n \n\nconst {Transform} = __webpack_require__(1451);\n\nconst crc32 = __webpack_require__(4606);\n\nclass CRC32Stream extends Transform {\n constructor(options) {\n super(options);\n this.checksum = Buffer.allocUnsafe(4);\n this.checksum.writeInt32BE(0, 0);\n\n this.rawSize = 0;\n }\n\n _transform(chunk, encoding, callback) {\n if (chunk) {\n this.checksum = crc32.buf(chunk, this.checksum) >>> 0;\n this.rawSize += chunk.length;\n }\n\n callback(null, chunk);\n }\n\n digest(encoding) {\n const checksum = Buffer.allocUnsafe(4);\n checksum.writeUInt32BE(this.checksum >>> 0, 0);\n return encoding ? checksum.toString(encoding) : checksum;\n }\n\n hex() {\n return this.digest('hex').toUpperCase();\n }\n\n size() {\n return this.rawSize;\n }\n}\n\nmodule.exports = CRC32Stream;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODYwNi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFjOztBQUVkLE9BQU8sV0FBVyxFQUFFLG1CQUFPLENBQUMsSUFBaUI7O0FBRTdDLGNBQWMsbUJBQU8sQ0FBQyxJQUFROztBQUU5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvY3JjMzItc3RyZWFtL2xpYi9jcmMzMi1zdHJlYW0uanM/ZTk0ZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG5vZGUtY3JjMzItc3RyZWFtXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IENocmlzIFRhbGtpbmd0b24sIGNvbnRyaWJ1dG9ycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcmNoaXZlcmpzL25vZGUtY3JjMzItc3RyZWFtL2Jsb2IvbWFzdGVyL0xJQ0VOU0UtTUlUXG4gKi9cblxuICd1c2Ugc3RyaWN0JztcblxuY29uc3Qge1RyYW5zZm9ybX0gPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0nKTtcblxuY29uc3QgY3JjMzIgPSByZXF1aXJlKCdjcmMtMzInKTtcblxuY2xhc3MgQ1JDMzJTdHJlYW0gZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy5jaGVja3N1bSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSg0KTtcbiAgICB0aGlzLmNoZWNrc3VtLndyaXRlSW50MzJCRSgwLCAwKTtcblxuICAgIHRoaXMucmF3U2l6ZSA9IDA7XG4gIH1cblxuICBfdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICBpZiAoY2h1bmspIHtcbiAgICAgIHRoaXMuY2hlY2tzdW0gPSBjcmMzMi5idWYoY2h1bmssIHRoaXMuY2hlY2tzdW0pID4+PiAwO1xuICAgICAgdGhpcy5yYXdTaXplICs9IGNodW5rLmxlbmd0aDtcbiAgICB9XG5cbiAgICBjYWxsYmFjayhudWxsLCBjaHVuayk7XG4gIH1cblxuICBkaWdlc3QoZW5jb2RpbmcpIHtcbiAgICBjb25zdCBjaGVja3N1bSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSg0KTtcbiAgICBjaGVja3N1bS53cml0ZVVJbnQzMkJFKHRoaXMuY2hlY2tzdW0gPj4+IDAsIDApO1xuICAgIHJldHVybiBlbmNvZGluZyA/IGNoZWNrc3VtLnRvU3RyaW5nKGVuY29kaW5nKSA6IGNoZWNrc3VtO1xuICB9XG5cbiAgaGV4KCkge1xuICAgIHJldHVybiB0aGlzLmRpZ2VzdCgnaGV4JykudG9VcHBlckNhc2UoKTtcbiAgfVxuXG4gIHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMucmF3U2l6ZTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENSQzMyU3RyZWFtO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8606\n")},791:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("/**\n * node-crc32-stream\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-crc32-stream/blob/master/LICENSE-MIT\n */\n\n\n\nconst {DeflateRaw} = __webpack_require__(9796);\n\nconst crc32 = __webpack_require__(4606);\n\nclass DeflateCRC32Stream extends DeflateRaw {\n constructor(options) {\n super(options);\n\n this.checksum = Buffer.allocUnsafe(4);\n this.checksum.writeInt32BE(0, 0);\n\n this.rawSize = 0;\n this.compressedSize = 0;\n }\n\n push(chunk, encoding) {\n if (chunk) {\n this.compressedSize += chunk.length;\n }\n\n return super.push(chunk, encoding);\n }\n\n _transform(chunk, encoding, callback) {\n if (chunk) {\n this.checksum = crc32.buf(chunk, this.checksum) >>> 0;\n this.rawSize += chunk.length;\n }\n\n super._transform(chunk, encoding, callback)\n }\n\n digest(encoding) {\n const checksum = Buffer.allocUnsafe(4);\n checksum.writeUInt32BE(this.checksum >>> 0, 0);\n return encoding ? checksum.toString(encoding) : checksum;\n }\n\n hex() {\n return this.digest('hex').toUpperCase();\n }\n\n size(compressed = false) {\n if (compressed) {\n return this.compressedSize;\n } else {\n return this.rawSize;\n }\n }\n}\n\nmodule.exports = DeflateCRC32Stream;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzkxLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViLE9BQU8sWUFBWSxFQUFFLG1CQUFPLENBQUMsSUFBTTs7QUFFbkMsY0FBYyxtQkFBTyxDQUFDLElBQVE7O0FBRTlCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9jcmMzMi1zdHJlYW0vbGliL2RlZmxhdGUtY3JjMzItc3RyZWFtLmpzPzAxNDgiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBub2RlLWNyYzMyLXN0cmVhbVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWNyYzMyLXN0cmVhbS9ibG9iL21hc3Rlci9MSUNFTlNFLU1JVFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3Qge0RlZmxhdGVSYXd9ID0gcmVxdWlyZSgnemxpYicpO1xuXG5jb25zdCBjcmMzMiA9IHJlcXVpcmUoJ2NyYy0zMicpO1xuXG5jbGFzcyBEZWZsYXRlQ1JDMzJTdHJlYW0gZXh0ZW5kcyBEZWZsYXRlUmF3IHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgdGhpcy5jaGVja3N1bSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSg0KTtcbiAgICB0aGlzLmNoZWNrc3VtLndyaXRlSW50MzJCRSgwLCAwKTtcblxuICAgIHRoaXMucmF3U2l6ZSA9IDA7XG4gICAgdGhpcy5jb21wcmVzc2VkU2l6ZSA9IDA7XG4gIH1cblxuICBwdXNoKGNodW5rLCBlbmNvZGluZykge1xuICAgIGlmIChjaHVuaykge1xuICAgICAgdGhpcy5jb21wcmVzc2VkU2l6ZSArPSBjaHVuay5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLnB1c2goY2h1bmssIGVuY29kaW5nKTtcbiAgfVxuXG4gIF90cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAgIGlmIChjaHVuaykge1xuICAgICAgdGhpcy5jaGVja3N1bSA9IGNyYzMyLmJ1ZihjaHVuaywgdGhpcy5jaGVja3N1bSkgPj4+IDA7XG4gICAgICB0aGlzLnJhd1NpemUgKz0gY2h1bmsubGVuZ3RoO1xuICAgIH1cblxuICAgIHN1cGVyLl90cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaylcbiAgfVxuXG4gIGRpZ2VzdChlbmNvZGluZykge1xuICAgIGNvbnN0IGNoZWNrc3VtID0gQnVmZmVyLmFsbG9jVW5zYWZlKDQpO1xuICAgIGNoZWNrc3VtLndyaXRlVUludDMyQkUodGhpcy5jaGVja3N1bSA+Pj4gMCwgMCk7XG4gICAgcmV0dXJuIGVuY29kaW5nID8gY2hlY2tzdW0udG9TdHJpbmcoZW5jb2RpbmcpIDogY2hlY2tzdW07XG4gIH1cblxuICBoZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlnZXN0KCdoZXgnKS50b1VwcGVyQ2FzZSgpO1xuICB9XG5cbiAgc2l6ZShjb21wcmVzc2VkID0gZmFsc2UpIHtcbiAgICBpZiAoY29tcHJlc3NlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcHJlc3NlZFNpemU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnJhd1NpemU7XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRGVmbGF0ZUNSQzMyU3RyZWFtO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///791\n")},2519:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("/**\n * node-crc32-stream\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-crc32-stream/blob/master/LICENSE-MIT\n */\n\n\n\nmodule.exports = {\n CRC32Stream: __webpack_require__(8606),\n DeflateCRC32Stream: __webpack_require__(791)\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUxOS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYjtBQUNBLGVBQWUsbUJBQU8sQ0FBQyxJQUFnQjtBQUN2QyxzQkFBc0IsbUJBQU8sQ0FBQyxHQUF3QjtBQUN0RCIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2NyYzMyLXN0cmVhbS9saWIvaW5kZXguanM/ODQyMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG5vZGUtY3JjMzItc3RyZWFtXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IENocmlzIFRhbGtpbmd0b24sIGNvbnRyaWJ1dG9ycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcmNoaXZlcmpzL25vZGUtY3JjMzItc3RyZWFtL2Jsb2IvbWFzdGVyL0xJQ0VOU0UtTUlUXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQ1JDMzJTdHJlYW06IHJlcXVpcmUoJy4vY3JjMzItc3RyZWFtJyksXG4gIERlZmxhdGVDUkMzMlN0cmVhbTogcmVxdWlyZSgnLi9kZWZsYXRlLWNyYzMyLXN0cmVhbScpXG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2519\n")},3463:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var Stream = (__webpack_require__(2781).Stream);\nvar util = __webpack_require__(3837);\n\nmodule.exports = DelayedStream;\nfunction DelayedStream() {\n this.source = null;\n this.dataSize = 0;\n this.maxDataSize = 1024 * 1024;\n this.pauseStream = true;\n\n this._maxDataSizeExceeded = false;\n this._released = false;\n this._bufferedEvents = [];\n}\nutil.inherits(DelayedStream, Stream);\n\nDelayedStream.create = function(source, options) {\n var delayedStream = new this();\n\n options = options || {};\n for (var option in options) {\n delayedStream[option] = options[option];\n }\n\n delayedStream.source = source;\n\n var realEmit = source.emit;\n source.emit = function() {\n delayedStream._handleEmit(arguments);\n return realEmit.apply(source, arguments);\n };\n\n source.on('error', function() {});\n if (delayedStream.pauseStream) {\n source.pause();\n }\n\n return delayedStream;\n};\n\nObject.defineProperty(DelayedStream.prototype, 'readable', {\n configurable: true,\n enumerable: true,\n get: function() {\n return this.source.readable;\n }\n});\n\nDelayedStream.prototype.setEncoding = function() {\n return this.source.setEncoding.apply(this.source, arguments);\n};\n\nDelayedStream.prototype.resume = function() {\n if (!this._released) {\n this.release();\n }\n\n this.source.resume();\n};\n\nDelayedStream.prototype.pause = function() {\n this.source.pause();\n};\n\nDelayedStream.prototype.release = function() {\n this._released = true;\n\n this._bufferedEvents.forEach(function(args) {\n this.emit.apply(this, args);\n }.bind(this));\n this._bufferedEvents = [];\n};\n\nDelayedStream.prototype.pipe = function() {\n var r = Stream.prototype.pipe.apply(this, arguments);\n this.resume();\n return r;\n};\n\nDelayedStream.prototype._handleEmit = function(args) {\n if (this._released) {\n this.emit.apply(this, args);\n return;\n }\n\n if (args[0] === 'data') {\n this.dataSize += args[1].length;\n this._checkIfMaxDataSizeExceeded();\n }\n\n this._bufferedEvents.push(args);\n};\n\nDelayedStream.prototype._checkIfMaxDataSizeExceeded = function() {\n if (this._maxDataSizeExceeded) {\n return;\n }\n\n if (this.dataSize <= this.maxDataSize) {\n return;\n }\n\n this._maxDataSizeExceeded = true;\n var message =\n 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.'\n this.emit('error', new Error(message));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ2My5qcyIsIm1hcHBpbmdzIjoiQUFBQSxhQUFhLGtDQUF3QjtBQUNyQyxXQUFXLG1CQUFPLENBQUMsSUFBTTs7QUFFekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2RlbGF5ZWQtc3RyZWFtL2xpYi9kZWxheWVkX3N0cmVhbS5qcz9kOTU2Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKS5TdHJlYW07XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBEZWxheWVkU3RyZWFtO1xuZnVuY3Rpb24gRGVsYXllZFN0cmVhbSgpIHtcbiAgdGhpcy5zb3VyY2UgPSBudWxsO1xuICB0aGlzLmRhdGFTaXplID0gMDtcbiAgdGhpcy5tYXhEYXRhU2l6ZSA9IDEwMjQgKiAxMDI0O1xuICB0aGlzLnBhdXNlU3RyZWFtID0gdHJ1ZTtcblxuICB0aGlzLl9tYXhEYXRhU2l6ZUV4Y2VlZGVkID0gZmFsc2U7XG4gIHRoaXMuX3JlbGVhc2VkID0gZmFsc2U7XG4gIHRoaXMuX2J1ZmZlcmVkRXZlbnRzID0gW107XG59XG51dGlsLmluaGVyaXRzKERlbGF5ZWRTdHJlYW0sIFN0cmVhbSk7XG5cbkRlbGF5ZWRTdHJlYW0uY3JlYXRlID0gZnVuY3Rpb24oc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBkZWxheWVkU3RyZWFtID0gbmV3IHRoaXMoKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgZm9yICh2YXIgb3B0aW9uIGluIG9wdGlvbnMpIHtcbiAgICBkZWxheWVkU3RyZWFtW29wdGlvbl0gPSBvcHRpb25zW29wdGlvbl07XG4gIH1cblxuICBkZWxheWVkU3RyZWFtLnNvdXJjZSA9IHNvdXJjZTtcblxuICB2YXIgcmVhbEVtaXQgPSBzb3VyY2UuZW1pdDtcbiAgc291cmNlLmVtaXQgPSBmdW5jdGlvbigpIHtcbiAgICBkZWxheWVkU3RyZWFtLl9oYW5kbGVFbWl0KGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHJlYWxFbWl0LmFwcGx5KHNvdXJjZSwgYXJndW1lbnRzKTtcbiAgfTtcblxuICBzb3VyY2Uub24oJ2Vycm9yJywgZnVuY3Rpb24oKSB7fSk7XG4gIGlmIChkZWxheWVkU3RyZWFtLnBhdXNlU3RyZWFtKSB7XG4gICAgc291cmNlLnBhdXNlKCk7XG4gIH1cblxuICByZXR1cm4gZGVsYXllZFN0cmVhbTtcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWxheWVkU3RyZWFtLnByb3RvdHlwZSwgJ3JlYWRhYmxlJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlLnJlYWRhYmxlO1xuICB9XG59KTtcblxuRGVsYXllZFN0cmVhbS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuc291cmNlLnNldEVuY29kaW5nLmFwcGx5KHRoaXMuc291cmNlLCBhcmd1bWVudHMpO1xufTtcblxuRGVsYXllZFN0cmVhbS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24oKSB7XG4gIGlmICghdGhpcy5fcmVsZWFzZWQpIHtcbiAgICB0aGlzLnJlbGVhc2UoKTtcbiAgfVxuXG4gIHRoaXMuc291cmNlLnJlc3VtZSgpO1xufTtcblxuRGVsYXllZFN0cmVhbS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zb3VyY2UucGF1c2UoKTtcbn07XG5cbkRlbGF5ZWRTdHJlYW0ucHJvdG90eXBlLnJlbGVhc2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fcmVsZWFzZWQgPSB0cnVlO1xuXG4gIHRoaXMuX2J1ZmZlcmVkRXZlbnRzLmZvckVhY2goZnVuY3Rpb24oYXJncykge1xuICAgIHRoaXMuZW1pdC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfS5iaW5kKHRoaXMpKTtcbiAgdGhpcy5fYnVmZmVyZWRFdmVudHMgPSBbXTtcbn07XG5cbkRlbGF5ZWRTdHJlYW0ucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHIgPSBTdHJlYW0ucHJvdG90eXBlLnBpcGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgdGhpcy5yZXN1bWUoKTtcbiAgcmV0dXJuIHI7XG59O1xuXG5EZWxheWVkU3RyZWFtLnByb3RvdHlwZS5faGFuZGxlRW1pdCA9IGZ1bmN0aW9uKGFyZ3MpIHtcbiAgaWYgKHRoaXMuX3JlbGVhc2VkKSB7XG4gICAgdGhpcy5lbWl0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChhcmdzWzBdID09PSAnZGF0YScpIHtcbiAgICB0aGlzLmRhdGFTaXplICs9IGFyZ3NbMV0ubGVuZ3RoO1xuICAgIHRoaXMuX2NoZWNrSWZNYXhEYXRhU2l6ZUV4Y2VlZGVkKCk7XG4gIH1cblxuICB0aGlzLl9idWZmZXJlZEV2ZW50cy5wdXNoKGFyZ3MpO1xufTtcblxuRGVsYXllZFN0cmVhbS5wcm90b3R5cGUuX2NoZWNrSWZNYXhEYXRhU2l6ZUV4Y2VlZGVkID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLl9tYXhEYXRhU2l6ZUV4Y2VlZGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHRoaXMuZGF0YVNpemUgPD0gdGhpcy5tYXhEYXRhU2l6ZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuX21heERhdGFTaXplRXhjZWVkZWQgPSB0cnVlO1xuICB2YXIgbWVzc2FnZSA9XG4gICAgJ0RlbGF5ZWRTdHJlYW0jbWF4RGF0YVNpemUgb2YgJyArIHRoaXMubWF4RGF0YVNpemUgKyAnIGJ5dGVzIGV4Y2VlZGVkLidcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcihtZXNzYWdlKSk7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3463\n")},2327:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ $: () => (/* binding */ Deprecation)\n/* harmony export */ });\nclass Deprecation extends Error {\n constructor(message) {\n super(message); // Maintains proper stack trace (only available on V8)\n\n /* istanbul ignore next */\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n\n this.name = 'Deprecation';\n }\n\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMyNy5qcyIsIm1hcHBpbmdzIjoiOzs7QUFBQTtBQUNBO0FBQ0Esb0JBQW9COztBQUVwQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFdUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9kZXByZWNhdGlvbi9kaXN0LXdlYi9pbmRleC5qcz9jZTI0Il0sInNvdXJjZXNDb250ZW50IjpbImNsYXNzIERlcHJlY2F0aW9uIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7IC8vIE1haW50YWlucyBwcm9wZXIgc3RhY2sgdHJhY2UgKG9ubHkgYXZhaWxhYmxlIG9uIFY4KVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuXG4gICAgdGhpcy5uYW1lID0gJ0RlcHJlY2F0aW9uJztcbiAgfVxuXG59XG5cbmV4cG9ydCB7IERlcHJlY2F0aW9uIH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2327\n")},8293:module=>{"use strict";eval("\n\nfunction _process (v, mod) {\n var i\n var r\n\n if (typeof mod === 'function') {\n r = mod(v)\n if (r !== undefined) {\n v = r\n }\n } else if (Array.isArray(mod)) {\n for (i = 0; i < mod.length; i++) {\n r = mod[i](v)\n if (r !== undefined) {\n v = r\n }\n }\n }\n\n return v\n}\n\nfunction parseKey (key, val) {\n // detect negative index notation\n if (key[0] === '-' && Array.isArray(val) && /^-\\d+$/.test(key)) {\n return val.length + parseInt(key, 10)\n }\n return key\n}\n\nfunction isIndex (k) {\n return /^\\d+$/.test(k)\n}\n\nfunction isObject (val) {\n return Object.prototype.toString.call(val) === '[object Object]'\n}\n\nfunction isArrayOrObject (val) {\n return Object(val) === val\n}\n\nfunction isEmptyObject (val) {\n return Object.keys(val).length === 0\n}\n\nvar blacklist = ['__proto__', 'prototype', 'constructor']\nvar blacklistFilter = function (part) { return blacklist.indexOf(part) === -1 }\n\nfunction parsePath (path, sep) {\n if (path.indexOf('[') >= 0) {\n path = path.replace(/\\[/g, sep).replace(/]/g, '')\n }\n\n var parts = path.split(sep)\n\n var check = parts.filter(blacklistFilter)\n\n if (check.length !== parts.length) {\n throw Error('Refusing to update blacklisted property ' + path)\n }\n\n return parts\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty\n\nfunction DotObject (separator, override, useArray, useBrackets) {\n if (!(this instanceof DotObject)) {\n return new DotObject(separator, override, useArray, useBrackets)\n }\n\n if (typeof override === 'undefined') override = false\n if (typeof useArray === 'undefined') useArray = true\n if (typeof useBrackets === 'undefined') useBrackets = true\n this.separator = separator || '.'\n this.override = override\n this.useArray = useArray\n this.useBrackets = useBrackets\n this.keepArray = false\n\n // contains touched arrays\n this.cleanup = []\n}\n\nvar dotDefault = new DotObject('.', false, true, true)\nfunction wrap (method) {\n return function () {\n return dotDefault[method].apply(dotDefault, arguments)\n }\n}\n\nDotObject.prototype._fill = function (a, obj, v, mod) {\n var k = a.shift()\n\n if (a.length > 0) {\n obj[k] = obj[k] || (this.useArray && isIndex(a[0]) ? [] : {})\n\n if (!isArrayOrObject(obj[k])) {\n if (this.override) {\n obj[k] = {}\n } else {\n if (!(isArrayOrObject(v) && isEmptyObject(v))) {\n throw new Error(\n 'Trying to redefine `' + k + '` which is a ' + typeof obj[k]\n )\n }\n\n return\n }\n }\n\n this._fill(a, obj[k], v, mod)\n } else {\n if (!this.override && isArrayOrObject(obj[k]) && !isEmptyObject(obj[k])) {\n if (!(isArrayOrObject(v) && isEmptyObject(v))) {\n throw new Error(\"Trying to redefine non-empty obj['\" + k + \"']\")\n }\n\n return\n }\n\n obj[k] = _process(v, mod)\n }\n}\n\n/**\n *\n * Converts an object with dotted-key/value pairs to it's expanded version\n *\n * Optionally transformed by a set of modifiers.\n *\n * Usage:\n *\n * var row = {\n * 'nr': 200,\n * 'doc.name': ' My Document '\n * }\n *\n * var mods = {\n * 'doc.name': [_s.trim, _s.underscored]\n * }\n *\n * dot.object(row, mods)\n *\n * @param {Object} obj\n * @param {Object} mods\n */\nDotObject.prototype.object = function (obj, mods) {\n var self = this\n\n Object.keys(obj).forEach(function (k) {\n var mod = mods === undefined ? null : mods[k]\n // normalize array notation.\n var ok = parsePath(k, self.separator).join(self.separator)\n\n if (ok.indexOf(self.separator) !== -1) {\n self._fill(ok.split(self.separator), obj, obj[k], mod)\n delete obj[k]\n } else {\n obj[k] = _process(obj[k], mod)\n }\n })\n\n return obj\n}\n\n/**\n * @param {String} path dotted path\n * @param {String} v value to be set\n * @param {Object} obj object to be modified\n * @param {Function|Array} mod optional modifier\n */\nDotObject.prototype.str = function (path, v, obj, mod) {\n var ok = parsePath(path, this.separator).join(this.separator)\n\n if (path.indexOf(this.separator) !== -1) {\n this._fill(ok.split(this.separator), obj, v, mod)\n } else {\n obj[path] = _process(v, mod)\n }\n\n return obj\n}\n\n/**\n *\n * Pick a value from an object using dot notation.\n *\n * Optionally remove the value\n *\n * @param {String} path\n * @param {Object} obj\n * @param {Boolean} remove\n */\nDotObject.prototype.pick = function (path, obj, remove, reindexArray) {\n var i\n var keys\n var val\n var key\n var cp\n\n keys = parsePath(path, this.separator)\n for (i = 0; i < keys.length; i++) {\n key = parseKey(keys[i], obj)\n if (obj && typeof obj === 'object' && key in obj) {\n if (i === keys.length - 1) {\n if (remove) {\n val = obj[key]\n if (reindexArray && Array.isArray(obj)) {\n obj.splice(key, 1)\n } else {\n delete obj[key]\n }\n if (Array.isArray(obj)) {\n cp = keys.slice(0, -1).join('.')\n if (this.cleanup.indexOf(cp) === -1) {\n this.cleanup.push(cp)\n }\n }\n return val\n } else {\n return obj[key]\n }\n } else {\n obj = obj[key]\n }\n } else {\n return undefined\n }\n }\n if (remove && Array.isArray(obj)) {\n obj = obj.filter(function (n) {\n return n !== undefined\n })\n }\n return obj\n}\n/**\n *\n * Delete value from an object using dot notation.\n *\n * @param {String} path\n * @param {Object} obj\n * @return {any} The removed value\n */\nDotObject.prototype.delete = function (path, obj) {\n return this.remove(path, obj, true)\n}\n\n/**\n *\n * Remove value from an object using dot notation.\n *\n * Will remove multiple items if path is an array.\n * In this case array indexes will be retained until all\n * removals have been processed.\n *\n * Use dot.delete() to automatically re-index arrays.\n *\n * @param {String|Array} path\n * @param {Object} obj\n * @param {Boolean} reindexArray\n * @return {any} The removed value\n */\nDotObject.prototype.remove = function (path, obj, reindexArray) {\n var i\n\n this.cleanup = []\n if (Array.isArray(path)) {\n for (i = 0; i < path.length; i++) {\n this.pick(path[i], obj, true, reindexArray)\n }\n if (!reindexArray) {\n this._cleanup(obj)\n }\n return obj\n } else {\n return this.pick(path, obj, true, reindexArray)\n }\n}\n\nDotObject.prototype._cleanup = function (obj) {\n var ret\n var i\n var keys\n var root\n if (this.cleanup.length) {\n for (i = 0; i < this.cleanup.length; i++) {\n keys = this.cleanup[i].split('.')\n root = keys.splice(0, -1).join('.')\n ret = root ? this.pick(root, obj) : obj\n ret = ret[keys[0]].filter(function (v) {\n return v !== undefined\n })\n this.set(this.cleanup[i], ret, obj)\n }\n this.cleanup = []\n }\n}\n\n/**\n * Alias method for `dot.remove`\n *\n * Note: this is not an alias for dot.delete()\n *\n * @param {String|Array} path\n * @param {Object} obj\n * @param {Boolean} reindexArray\n * @return {any} The removed value\n */\nDotObject.prototype.del = DotObject.prototype.remove\n\n/**\n *\n * Move a property from one place to the other.\n *\n * If the source path does not exist (undefined)\n * the target property will not be set.\n *\n * @param {String} source\n * @param {String} target\n * @param {Object} obj\n * @param {Function|Array} mods\n * @param {Boolean} merge\n */\nDotObject.prototype.move = function (source, target, obj, mods, merge) {\n if (typeof mods === 'function' || Array.isArray(mods)) {\n this.set(target, _process(this.pick(source, obj, true), mods), obj, merge)\n } else {\n merge = mods\n this.set(target, this.pick(source, obj, true), obj, merge)\n }\n\n return obj\n}\n\n/**\n *\n * Transfer a property from one object to another object.\n *\n * If the source path does not exist (undefined)\n * the property on the other object will not be set.\n *\n * @param {String} source\n * @param {String} target\n * @param {Object} obj1\n * @param {Object} obj2\n * @param {Function|Array} mods\n * @param {Boolean} merge\n */\nDotObject.prototype.transfer = function (\n source,\n target,\n obj1,\n obj2,\n mods,\n merge\n) {\n if (typeof mods === 'function' || Array.isArray(mods)) {\n this.set(\n target,\n _process(this.pick(source, obj1, true), mods),\n obj2,\n merge\n )\n } else {\n merge = mods\n this.set(target, this.pick(source, obj1, true), obj2, merge)\n }\n\n return obj2\n}\n\n/**\n *\n * Copy a property from one object to another object.\n *\n * If the source path does not exist (undefined)\n * the property on the other object will not be set.\n *\n * @param {String} source\n * @param {String} target\n * @param {Object} obj1\n * @param {Object} obj2\n * @param {Function|Array} mods\n * @param {Boolean} merge\n */\nDotObject.prototype.copy = function (source, target, obj1, obj2, mods, merge) {\n if (typeof mods === 'function' || Array.isArray(mods)) {\n this.set(\n target,\n _process(\n // clone what is picked\n JSON.parse(JSON.stringify(this.pick(source, obj1, false))),\n mods\n ),\n obj2,\n merge\n )\n } else {\n merge = mods\n this.set(target, this.pick(source, obj1, false), obj2, merge)\n }\n\n return obj2\n}\n\n/**\n *\n * Set a property on an object using dot notation.\n *\n * @param {String} path\n * @param {any} val\n * @param {Object} obj\n * @param {Boolean} merge\n */\nDotObject.prototype.set = function (path, val, obj, merge) {\n var i\n var k\n var keys\n var key\n\n // Do not operate if the value is undefined.\n if (typeof val === 'undefined') {\n return obj\n }\n keys = parsePath(path, this.separator)\n\n for (i = 0; i < keys.length; i++) {\n key = keys[i]\n if (i === keys.length - 1) {\n if (merge && isObject(val) && isObject(obj[key])) {\n for (k in val) {\n if (hasOwnProperty.call(val, k)) {\n obj[key][k] = val[k]\n }\n }\n } else if (merge && Array.isArray(obj[key]) && Array.isArray(val)) {\n for (var j = 0; j < val.length; j++) {\n obj[keys[i]].push(val[j])\n }\n } else {\n obj[key] = val\n }\n } else if (\n // force the value to be an object\n !hasOwnProperty.call(obj, key) ||\n (!isObject(obj[key]) && !Array.isArray(obj[key]))\n ) {\n // initialize as array if next key is numeric\n if (/^\\d+$/.test(keys[i + 1])) {\n obj[key] = []\n } else {\n obj[key] = {}\n }\n }\n obj = obj[key]\n }\n return obj\n}\n\n/**\n *\n * Transform an object\n *\n * Usage:\n *\n * var obj = {\n * \"id\": 1,\n * \"some\": {\n * \"thing\": \"else\"\n * }\n * }\n *\n * var transform = {\n * \"id\": \"nr\",\n * \"some.thing\": \"name\"\n * }\n *\n * var tgt = dot.transform(transform, obj)\n *\n * @param {Object} recipe Transform recipe\n * @param {Object} obj Object to be transformed\n * @param {Array} mods modifiers for the target\n */\nDotObject.prototype.transform = function (recipe, obj, tgt) {\n obj = obj || {}\n tgt = tgt || {}\n Object.keys(recipe).forEach(\n function (key) {\n this.set(recipe[key], this.pick(key, obj), tgt)\n }.bind(this)\n )\n return tgt\n}\n\n/**\n *\n * Convert object to dotted-key/value pair\n *\n * Usage:\n *\n * var tgt = dot.dot(obj)\n *\n * or\n *\n * var tgt = {}\n * dot.dot(obj, tgt)\n *\n * @param {Object} obj source object\n * @param {Object} tgt target object\n * @param {Array} path path array (internal)\n */\nDotObject.prototype.dot = function (obj, tgt, path) {\n tgt = tgt || {}\n path = path || []\n var isArray = Array.isArray(obj)\n\n Object.keys(obj).forEach(\n function (key) {\n var index = isArray && this.useBrackets ? '[' + key + ']' : key\n if (\n isArrayOrObject(obj[key]) &&\n ((isObject(obj[key]) && !isEmptyObject(obj[key])) ||\n (Array.isArray(obj[key]) && !this.keepArray && obj[key].length !== 0))\n ) {\n if (isArray && this.useBrackets) {\n var previousKey = path[path.length - 1] || ''\n return this.dot(\n obj[key],\n tgt,\n path.slice(0, -1).concat(previousKey + index)\n )\n } else {\n return this.dot(obj[key], tgt, path.concat(index))\n }\n } else {\n if (isArray && this.useBrackets) {\n tgt[path.join(this.separator).concat('[' + key + ']')] = obj[key]\n } else {\n tgt[path.concat(index).join(this.separator)] = obj[key]\n }\n }\n }.bind(this)\n )\n return tgt\n}\n\nDotObject.pick = wrap('pick')\nDotObject.move = wrap('move')\nDotObject.transfer = wrap('transfer')\nDotObject.transform = wrap('transform')\nDotObject.copy = wrap('copy')\nDotObject.object = wrap('object')\nDotObject.str = wrap('str')\nDotObject.set = wrap('set')\nDotObject.delete = wrap('delete')\nDotObject.del = DotObject.remove = wrap('remove')\nDotObject.dot = wrap('dot');\n['override', 'overwrite'].forEach(function (prop) {\n Object.defineProperty(DotObject, prop, {\n get: function () {\n return dotDefault.override\n },\n set: function (val) {\n dotDefault.override = !!val\n }\n })\n});\n['useArray', 'keepArray', 'useBrackets'].forEach(function (prop) {\n Object.defineProperty(DotObject, prop, {\n get: function () {\n return dotDefault[prop]\n },\n set: function (val) {\n dotDefault[prop] = val\n }\n })\n})\n\nDotObject._process = _process\n\nmodule.exports = DotObject\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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ZWN0L2luZGV4LmpzPzg0YjUiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbmZ1bmN0aW9uIF9wcm9jZXNzICh2LCBtb2QpIHtcbiAgdmFyIGlcbiAgdmFyIHJcblxuICBpZiAodHlwZW9mIG1vZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHIgPSBtb2QodilcbiAgICBpZiAociAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2ID0gclxuICAgIH1cbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG1vZCkpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbW9kLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gbW9kW2ldKHYpXG4gICAgICBpZiAociAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHYgPSByXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZcbn1cblxuZnVuY3Rpb24gcGFyc2VLZXkgKGtleSwgdmFsKSB7XG4gIC8vIGRldGVjdCBuZWdhdGl2ZSBpbmRleCBub3RhdGlvblxuICBpZiAoa2V5WzBdID09PSAnLScgJiYgQXJyYXkuaXNBcnJheSh2YWwpICYmIC9eLVxcZCskLy50ZXN0KGtleSkpIHtcbiAgICByZXR1cm4gdmFsLmxlbmd0aCArIHBhcnNlSW50KGtleSwgMTApXG4gIH1cbiAgcmV0dXJuIGtleVxufVxuXG5mdW5jdGlvbiBpc0luZGV4IChrKSB7XG4gIHJldHVybiAvXlxcZCskLy50ZXN0KGspXG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0ICh2YWwpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBPYmplY3RdJ1xufVxuXG5mdW5jdGlvbiBpc0FycmF5T3JPYmplY3QgKHZhbCkge1xuICByZXR1cm4gT2JqZWN0KHZhbCkgPT09IHZhbFxufVxuXG5mdW5jdGlvbiBpc0VtcHR5T2JqZWN0ICh2YWwpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHZhbCkubGVuZ3RoID09PSAwXG59XG5cbnZhciBibGFja2xpc3QgPSBbJ19fcHJvdG9fXycsICdwcm90b3R5cGUnLCAnY29uc3RydWN0b3InXVxudmFyIGJsYWNrbGlzdEZpbHRlciA9IGZ1bmN0aW9uIChwYXJ0KSB7IHJldHVybiBibGFja2xpc3QuaW5kZXhPZihwYXJ0KSA9PT0gLTEgfVxuXG5mdW5jdGlvbiBwYXJzZVBhdGggKHBhdGgsIHNlcCkge1xuICBpZiAocGF0aC5pbmRleE9mKCdbJykgPj0gMCkge1xuICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcWy9nLCBzZXApLnJlcGxhY2UoL10vZywgJycpXG4gIH1cblxuICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KHNlcClcblxuICB2YXIgY2hlY2sgPSBwYXJ0cy5maWx0ZXIoYmxhY2tsaXN0RmlsdGVyKVxuXG4gIGlmIChjaGVjay5sZW5ndGggIT09IHBhcnRzLmxlbmd0aCkge1xuICAgIHRocm93IEVycm9yKCdSZWZ1c2luZyB0byB1cGRhdGUgYmxhY2tsaXN0ZWQgcHJvcGVydHkgJyArIHBhdGgpXG4gIH1cblxuICByZXR1cm4gcGFydHNcbn1cblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eVxuXG5mdW5jdGlvbiBEb3RPYmplY3QgKHNlcGFyYXRvciwgb3ZlcnJpZGUsIHVzZUFycmF5LCB1c2VCcmFja2V0cykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRG90T2JqZWN0KSkge1xuICAgIHJldHVybiBuZXcgRG90T2JqZWN0KHNlcGFyYXRvciwgb3ZlcnJpZGUsIHVzZUFycmF5LCB1c2VCcmFja2V0cylcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3ZlcnJpZGUgPT09ICd1bmRlZmluZWQnKSBvdmVycmlkZSA9IGZhbHNlXG4gIGlmICh0eXBlb2YgdXNlQXJyYXkgPT09ICd1bmRlZmluZWQnKSB1c2VBcnJheSA9IHRydWVcbiAgaWYgKHR5cGVvZiB1c2VCcmFja2V0cyA9PT0gJ3VuZGVmaW5lZCcpIHVzZUJyYWNrZXRzID0gdHJ1ZVxuICB0aGlzLnNlcGFyYXRvciA9IHNlcGFyYXRvciB8fCAnLidcbiAgdGhpcy5vdmVycmlkZSA9IG92ZXJyaWRlXG4gIHRoaXMudXNlQXJyYXkgPSB1c2VBcnJheVxuICB0aGlzLnVzZUJyYWNrZXRzID0gdXNlQnJhY2tldHNcbiAgdGhpcy5rZWVwQXJyYXkgPSBmYWxzZVxuXG4gIC8vIGNvbnRhaW5zIHRvdWNoZWQgYXJyYXlzXG4gIHRoaXMuY2xlYW51cCA9IFtdXG59XG5cbnZhciBkb3REZWZhdWx0ID0gbmV3IERvdE9iamVjdCgnLicsIGZhbHNlLCB0cnVlLCB0cnVlKVxuZnVuY3Rpb24gd3JhcCAobWV0aG9kKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGRvdERlZmF1bHRbbWV0aG9kXS5hcHBseShkb3REZWZhdWx0LCBhcmd1bWVudHMpXG4gIH1cbn1cblxuRG90T2JqZWN0LnByb3RvdHlwZS5fZmlsbCA9IGZ1bmN0aW9uIChhLCBvYmosIHYsIG1vZCkge1xuICB2YXIgayA9IGEuc2hpZnQoKVxuXG4gIGlmIChhLmxlbmd0aCA+IDApIHtcbiAgICBvYmpba10gPSBvYmpba10gfHwgKHRoaXMudXNlQXJyYXkgJiYgaXNJbmRleChhWzBdKSA/IFtdIDoge30pXG5cbiAgICBpZiAoIWlzQXJyYXlPck9iamVjdChvYmpba10pKSB7XG4gICAgICBpZiAodGhpcy5vdmVycmlkZSkge1xuICAgICAgICBvYmpba10gPSB7fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCEoaXNBcnJheU9yT2JqZWN0KHYpICYmIGlzRW1wdHlPYmplY3QodikpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ1RyeWluZyB0byByZWRlZmluZSBgJyArIGsgKyAnYCB3aGljaCBpcyBhICcgKyB0eXBlb2Ygb2JqW2tdXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fZmlsbChhLCBvYmpba10sIHYsIG1vZClcbiAgfSBlbHNlIHtcbiAgICBpZiAoIXRoaXMub3ZlcnJpZGUgJiYgaXNBcnJheU9yT2JqZWN0KG9ialtrXSkgJiYgIWlzRW1wdHlPYmplY3Qob2JqW2tdKSkge1xuICAgICAgaWYgKCEoaXNBcnJheU9yT2JqZWN0KHYpICYmIGlzRW1wdHlPYmplY3QodikpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRyeWluZyB0byByZWRlZmluZSBub24tZW1wdHkgb2JqWydcIiArIGsgKyBcIiddXCIpXG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIG9ialtrXSA9IF9wcm9jZXNzKHYsIG1vZClcbiAgfVxufVxuXG4vKipcbiAqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgd2l0aCBkb3R0ZWQta2V5L3ZhbHVlIHBhaXJzIHRvIGl0J3MgZXhwYW5kZWQgdmVyc2lvblxuICpcbiAqIE9wdGlvbmFsbHkgdHJhbnNmb3JtZWQgYnkgYSBzZXQgb2YgbW9kaWZpZXJzLlxuICpcbiAqIFVzYWdlOlxuICpcbiAqICAgdmFyIHJvdyA9IHtcbiAqICAgICAnbnInOiAyMDAsXG4gKiAgICAgJ2RvYy5uYW1lJzogJyAgTXkgRG9jdW1lbnQgICdcbiAqICAgfVxuICpcbiAqICAgdmFyIG1vZHMgPSB7XG4gKiAgICAgJ2RvYy5uYW1lJzogW19zLnRyaW0sIF9zLnVuZGVyc2NvcmVkXVxuICogICB9XG4gKlxuICogICBkb3Qub2JqZWN0KHJvdywgbW9kcylcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0ge09iamVjdH0gbW9kc1xuICovXG5Eb3RPYmplY3QucHJvdG90eXBlLm9iamVjdCA9IGZ1bmN0aW9uIChvYmosIG1vZHMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgdmFyIG1vZCA9IG1vZHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBtb2RzW2tdXG4gICAgLy8gbm9ybWFsaXplIGFycmF5IG5vdGF0aW9uLlxuICAgIHZhciBvayA9IHBhcnNlUGF0aChrLCBzZWxmLnNlcGFyYXRvcikuam9pbihzZWxmLnNlcGFyYXRvcilcblxuICAgIGlmIChvay5pbmRleE9mKHNlbGYuc2VwYXJhdG9yKSAhPT0gLTEpIHtcbiAgICAgIHNlbGYuX2ZpbGwob2suc3BsaXQoc2VsZi5zZXBhcmF0b3IpLCBvYmosIG9ialtrXSwgbW9kKVxuICAgICAgZGVsZXRlIG9ialtrXVxuICAgIH0gZWxzZSB7XG4gICAgICBvYmpba10gPSBfcHJvY2VzcyhvYmpba10sIG1vZClcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIG9ialxufVxuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIGRvdHRlZCBwYXRoXG4gKiBAcGFyYW0ge1N0cmluZ30gdiB2YWx1ZSB0byBiZSBzZXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogb2JqZWN0IHRvIGJlIG1vZGlmaWVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufEFycmF5fSBtb2Qgb3B0aW9uYWwgbW9kaWZpZXJcbiAqL1xuRG90T2JqZWN0LnByb3RvdHlwZS5zdHIgPSBmdW5jdGlvbiAocGF0aCwgdiwgb2JqLCBtb2QpIHtcbiAgdmFyIG9rID0gcGFyc2VQYXRoKHBhdGgsIHRoaXMuc2VwYXJhdG9yKS5qb2luKHRoaXMuc2VwYXJhdG9yKVxuXG4gIGlmIChwYXRoLmluZGV4T2YodGhpcy5zZXBhcmF0b3IpICE9PSAtMSkge1xuICAgIHRoaXMuX2ZpbGwob2suc3BsaXQodGhpcy5zZXBhcmF0b3IpLCBvYmosIHYsIG1vZClcbiAgfSBlbHNlIHtcbiAgICBvYmpbcGF0aF0gPSBfcHJvY2Vzcyh2LCBtb2QpXG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbi8qKlxuICpcbiAqIFBpY2sgYSB2YWx1ZSBmcm9tIGFuIG9iamVjdCB1c2luZyBkb3Qgbm90YXRpb24uXG4gKlxuICogT3B0aW9uYWxseSByZW1vdmUgdGhlIHZhbHVlXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVtb3ZlXG4gKi9cbkRvdE9iamVjdC5wcm90b3R5cGUucGljayA9IGZ1bmN0aW9uIChwYXRoLCBvYmosIHJlbW92ZSwgcmVpbmRleEFycmF5KSB7XG4gIHZhciBpXG4gIHZhciBrZXlzXG4gIHZhciB2YWxcbiAgdmFyIGtleVxuICB2YXIgY3BcblxuICBrZXlzID0gcGFyc2VQYXRoKHBhdGgsIHRoaXMuc2VwYXJhdG9yKVxuICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHBhcnNlS2V5KGtleXNbaV0sIG9iailcbiAgICBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChpID09PSBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgaWYgKHJlbW92ZSkge1xuICAgICAgICAgIHZhbCA9IG9ialtrZXldXG4gICAgICAgICAgaWYgKHJlaW5kZXhBcnJheSAmJiBBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIG9iai5zcGxpY2Uoa2V5LCAxKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgb2JqW2tleV1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgY3AgPSBrZXlzLnNsaWNlKDAsIC0xKS5qb2luKCcuJylcbiAgICAgICAgICAgIGlmICh0aGlzLmNsZWFudXAuaW5kZXhPZihjcCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgIHRoaXMuY2xlYW51cC5wdXNoKGNwKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG9ialtrZXldXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9iaiA9IG9ialtrZXldXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gIH1cbiAgaWYgKHJlbW92ZSAmJiBBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICBvYmogPSBvYmouZmlsdGVyKGZ1bmN0aW9uIChuKSB7XG4gICAgICByZXR1cm4gbiAhPT0gdW5kZWZpbmVkXG4gICAgfSlcbiAgfVxuICByZXR1cm4gb2JqXG59XG4vKipcbiAqXG4gKiBEZWxldGUgdmFsdWUgZnJvbSBhbiBvYmplY3QgdXNpbmcgZG90IG5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHthbnl9IFRoZSByZW1vdmVkIHZhbHVlXG4gKi9cbkRvdE9iamVjdC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHBhdGgsIG9iaikge1xuICByZXR1cm4gdGhpcy5yZW1vdmUocGF0aCwgb2JqLCB0cnVlKVxufVxuXG4vKipcbiAqXG4gKiBSZW1vdmUgdmFsdWUgZnJvbSBhbiBvYmplY3QgdXNpbmcgZG90IG5vdGF0aW9uLlxuICpcbiAqIFdpbGwgcmVtb3ZlIG11bHRpcGxlIGl0ZW1zIGlmIHBhdGggaXMgYW4gYXJyYXkuXG4gKiBJbiB0aGlzIGNhc2UgYXJyYXkgaW5kZXhlcyB3aWxsIGJlIHJldGFpbmVkIHVudGlsIGFsbFxuICogcmVtb3ZhbHMgaGF2ZSBiZWVuIHByb2Nlc3NlZC5cbiAqXG4gKiBVc2UgZG90LmRlbGV0ZSgpIHRvIGF1dG9tYXRpY2FsbHkgIHJlLWluZGV4IGFycmF5cy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheTxTdHJpbmc+fSBwYXRoXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHJlaW5kZXhBcnJheVxuICogQHJldHVybiB7YW55fSBUaGUgcmVtb3ZlZCB2YWx1ZVxuICovXG5Eb3RPYmplY3QucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChwYXRoLCBvYmosIHJlaW5kZXhBcnJheSkge1xuICB2YXIgaVxuXG4gIHRoaXMuY2xlYW51cCA9IFtdXG4gIGlmIChBcnJheS5pc0FycmF5KHBhdGgpKSB7XG4gICAgZm9yIChpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGljayhwYXRoW2ldLCBvYmosIHRydWUsIHJlaW5kZXhBcnJheSlcbiAgICB9XG4gICAgaWYgKCFyZWluZGV4QXJyYXkpIHtcbiAgICAgIHRoaXMuX2NsZWFudXAob2JqKVxuICAgIH1cbiAgICByZXR1cm4gb2JqXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMucGljayhwYXRoLCBvYmosIHRydWUsIHJlaW5kZXhBcnJheSlcbiAgfVxufVxuXG5Eb3RPYmplY3QucHJvdG90eXBlLl9jbGVhbnVwID0gZnVuY3Rpb24gKG9iaikge1xuICB2YXIgcmV0XG4gIHZhciBpXG4gIHZhciBrZXlzXG4gIHZhciByb290XG4gIGlmICh0aGlzLmNsZWFudXAubGVuZ3RoKSB7XG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuY2xlYW51cC5sZW5ndGg7IGkrKykge1xuICAgICAga2V5cyA9IHRoaXMuY2xlYW51cFtpXS5zcGxpdCgnLicpXG4gICAgICByb290ID0ga2V5cy5zcGxpY2UoMCwgLTEpLmpvaW4oJy4nKVxuICAgICAgcmV0ID0gcm9vdCA/IHRoaXMucGljayhyb290LCBvYmopIDogb2JqXG4gICAgICByZXQgPSByZXRba2V5c1swXV0uZmlsdGVyKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHJldHVybiB2ICE9PSB1bmRlZmluZWRcbiAgICAgIH0pXG4gICAgICB0aGlzLnNldCh0aGlzLmNsZWFudXBbaV0sIHJldCwgb2JqKVxuICAgIH1cbiAgICB0aGlzLmNsZWFudXAgPSBbXVxuICB9XG59XG5cbi8qKlxuICogQWxpYXMgbWV0aG9kICBmb3IgYGRvdC5yZW1vdmVgXG4gKlxuICogTm90ZTogdGhpcyBpcyBub3QgYW4gYWxpYXMgZm9yIGRvdC5kZWxldGUoKVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5PFN0cmluZz59IHBhdGhcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVpbmRleEFycmF5XG4gKiBAcmV0dXJuIHthbnl9IFRoZSByZW1vdmVkIHZhbHVlXG4gKi9cbkRvdE9iamVjdC5wcm90b3R5cGUuZGVsID0gRG90T2JqZWN0LnByb3RvdHlwZS5yZW1vdmVcblxuLyoqXG4gKlxuICogTW92ZSBhIHByb3BlcnR5IGZyb20gb25lIHBsYWNlIHRvIHRoZSBvdGhlci5cbiAqXG4gKiBJZiB0aGUgc291cmNlIHBhdGggZG9lcyBub3QgZXhpc3QgKHVuZGVmaW5lZClcbiAqIHRoZSB0YXJnZXQgcHJvcGVydHkgd2lsbCBub3QgYmUgc2V0LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzb3VyY2VcbiAqIEBwYXJhbSB7U3RyaW5nfSB0YXJnZXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7RnVuY3Rpb258QXJyYXl9IG1vZHNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gbWVyZ2VcbiAqL1xuRG90T2JqZWN0LnByb3RvdHlwZS5tb3ZlID0gZnVuY3Rpb24gKHNvdXJjZSwgdGFyZ2V0LCBvYmosIG1vZHMsIG1lcmdlKSB7XG4gIGlmICh0eXBlb2YgbW9kcyA9PT0gJ2Z1bmN0aW9uJyB8fCBBcnJheS5pc0FycmF5KG1vZHMpKSB7XG4gICAgdGhpcy5zZXQodGFyZ2V0LCBfcHJvY2Vzcyh0aGlzLnBpY2soc291cmNlLCBvYmosIHRydWUpLCBtb2RzKSwgb2JqLCBtZXJnZSlcbiAgfSBlbHNlIHtcbiAgICBtZXJnZSA9IG1vZHNcbiAgICB0aGlzLnNldCh0YXJnZXQsIHRoaXMucGljayhzb3VyY2UsIG9iaiwgdHJ1ZSksIG9iaiwgbWVyZ2UpXG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbi8qKlxuICpcbiAqIFRyYW5zZmVyIGEgcHJvcGVydHkgZnJvbSBvbmUgb2JqZWN0IHRvIGFub3RoZXIgb2JqZWN0LlxuICpcbiAqIElmIHRoZSBzb3VyY2UgcGF0aCBkb2VzIG5vdCBleGlzdCAodW5kZWZpbmVkKVxuICogdGhlIHByb3BlcnR5IG9uIHRoZSBvdGhlciBvYmplY3Qgd2lsbCBub3QgYmUgc2V0LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzb3VyY2VcbiAqIEBwYXJhbSB7U3RyaW5nfSB0YXJnZXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMlxuICogQHBhcmFtIHtGdW5jdGlvbnxBcnJheX0gbW9kc1xuICogQHBhcmFtIHtCb29sZWFufSBtZXJnZVxuICovXG5Eb3RPYmplY3QucHJvdG90eXBlLnRyYW5zZmVyID0gZnVuY3Rpb24gKFxuICBzb3VyY2UsXG4gIHRhcmdldCxcbiAgb2JqMSxcbiAgb2JqMixcbiAgbW9kcyxcbiAgbWVyZ2Vcbikge1xuICBpZiAodHlwZW9mIG1vZHMgPT09ICdmdW5jdGlvbicgfHwgQXJyYXkuaXNBcnJheShtb2RzKSkge1xuICAgIHRoaXMuc2V0KFxuICAgICAgdGFyZ2V0LFxuICAgICAgX3Byb2Nlc3ModGhpcy5waWNrKHNvdXJjZSwgb2JqMSwgdHJ1ZSksIG1vZHMpLFxuICAgICAgb2JqMixcbiAgICAgIG1lcmdlXG4gICAgKVxuICB9IGVsc2Uge1xuICAgIG1lcmdlID0gbW9kc1xuICAgIHRoaXMuc2V0KHRhcmdldCwgdGhpcy5waWNrKHNvdXJjZSwgb2JqMSwgdHJ1ZSksIG9iajIsIG1lcmdlKVxuICB9XG5cbiAgcmV0dXJuIG9iajJcbn1cblxuLyoqXG4gKlxuICogQ29weSBhIHByb3BlcnR5IGZyb20gb25lIG9iamVjdCB0byBhbm90aGVyIG9iamVjdC5cbiAqXG4gKiBJZiB0aGUgc291cmNlIHBhdGggZG9lcyBub3QgZXhpc3QgKHVuZGVmaW5lZClcbiAqIHRoZSBwcm9wZXJ0eSBvbiB0aGUgb3RoZXIgb2JqZWN0IHdpbGwgbm90IGJlIHNldC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc291cmNlXG4gKiBAcGFyYW0ge1N0cmluZ30gdGFyZ2V0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMVxuICogQHBhcmFtIHtPYmplY3R9IG9iajJcbiAqIEBwYXJhbSB7RnVuY3Rpb258QXJyYXl9IG1vZHNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gbWVyZ2VcbiAqL1xuRG90T2JqZWN0LnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKHNvdXJjZSwgdGFyZ2V0LCBvYmoxLCBvYmoyLCBtb2RzLCBtZXJnZSkge1xuICBpZiAodHlwZW9mIG1vZHMgPT09ICdmdW5jdGlvbicgfHwgQXJyYXkuaXNBcnJheShtb2RzKSkge1xuICAgIHRoaXMuc2V0KFxuICAgICAgdGFyZ2V0LFxuICAgICAgX3Byb2Nlc3MoXG4gICAgICAgIC8vIGNsb25lIHdoYXQgaXMgcGlja2VkXG4gICAgICAgIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5waWNrKHNvdXJjZSwgb2JqMSwgZmFsc2UpKSksXG4gICAgICAgIG1vZHNcbiAgICAgICksXG4gICAgICBvYmoyLFxuICAgICAgbWVyZ2VcbiAgICApXG4gIH0gZWxzZSB7XG4gICAgbWVyZ2UgPSBtb2RzXG4gICAgdGhpcy5zZXQodGFyZ2V0LCB0aGlzLnBpY2soc291cmNlLCBvYmoxLCBmYWxzZSksIG9iajIsIG1lcmdlKVxuICB9XG5cbiAgcmV0dXJuIG9iajJcbn1cblxuLyoqXG4gKlxuICogU2V0IGEgcHJvcGVydHkgb24gYW4gb2JqZWN0IHVzaW5nIGRvdCBub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtCb29sZWFufSBtZXJnZVxuICovXG5Eb3RPYmplY3QucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChwYXRoLCB2YWwsIG9iaiwgbWVyZ2UpIHtcbiAgdmFyIGlcbiAgdmFyIGtcbiAgdmFyIGtleXNcbiAgdmFyIGtleVxuXG4gIC8vIERvIG5vdCBvcGVyYXRlIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWQuXG4gIGlmICh0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBvYmpcbiAgfVxuICBrZXlzID0gcGFyc2VQYXRoKHBhdGgsIHRoaXMuc2VwYXJhdG9yKVxuXG4gIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0ga2V5c1tpXVxuICAgIGlmIChpID09PSBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgIGlmIChtZXJnZSAmJiBpc09iamVjdCh2YWwpICYmIGlzT2JqZWN0KG9ialtrZXldKSkge1xuICAgICAgICBmb3IgKGsgaW4gdmFsKSB7XG4gICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsLCBrKSkge1xuICAgICAgICAgICAgb2JqW2tleV1ba10gPSB2YWxba11cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobWVyZ2UgJiYgQXJyYXkuaXNBcnJheShvYmpba2V5XSkgJiYgQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgb2JqW2tleXNbaV1dLnB1c2godmFsW2pdKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmpba2V5XSA9IHZhbFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICAvLyBmb3JjZSB0aGUgdmFsdWUgdG8gYmUgYW4gb2JqZWN0XG4gICAgICAhaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkgfHxcbiAgICAgICghaXNPYmplY3Qob2JqW2tleV0pICYmICFBcnJheS5pc0FycmF5KG9ialtrZXldKSlcbiAgICApIHtcbiAgICAgIC8vIGluaXRpYWxpemUgYXMgYXJyYXkgaWYgbmV4dCBrZXkgaXMgbnVtZXJpY1xuICAgICAgaWYgKC9eXFxkKyQvLnRlc3Qoa2V5c1tpICsgMV0pKSB7XG4gICAgICAgIG9ialtrZXldID0gW11cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialtrZXldID0ge31cbiAgICAgIH1cbiAgICB9XG4gICAgb2JqID0gb2JqW2tleV1cbiAgfVxuICByZXR1cm4gb2JqXG59XG5cbi8qKlxuICpcbiAqIFRyYW5zZm9ybSBhbiBvYmplY3RcbiAqXG4gKiBVc2FnZTpcbiAqXG4gKiAgIHZhciBvYmogPSB7XG4gKiAgICAgXCJpZFwiOiAxLFxuICogICAgXCJzb21lXCI6IHtcbiAqICAgICAgXCJ0aGluZ1wiOiBcImVsc2VcIlxuICogICAgfVxuICogICB9XG4gKlxuICogICB2YXIgdHJhbnNmb3JtID0ge1xuICogICAgIFwiaWRcIjogXCJuclwiLFxuICogICAgXCJzb21lLnRoaW5nXCI6IFwibmFtZVwiXG4gKiAgIH1cbiAqXG4gKiAgIHZhciB0Z3QgPSBkb3QudHJhbnNmb3JtKHRyYW5zZm9ybSwgb2JqKVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWNpcGUgVHJhbnNmb3JtIHJlY2lwZVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBPYmplY3QgdG8gYmUgdHJhbnNmb3JtZWRcbiAqIEBwYXJhbSB7QXJyYXl9IG1vZHMgbW9kaWZpZXJzIGZvciB0aGUgdGFyZ2V0XG4gKi9cbkRvdE9iamVjdC5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKHJlY2lwZSwgb2JqLCB0Z3QpIHtcbiAgb2JqID0gb2JqIHx8IHt9XG4gIHRndCA9IHRndCB8fCB7fVxuICBPYmplY3Qua2V5cyhyZWNpcGUpLmZvckVhY2goXG4gICAgZnVuY3Rpb24gKGtleSkge1xuICAgICAgdGhpcy5zZXQocmVjaXBlW2tleV0sIHRoaXMucGljayhrZXksIG9iaiksIHRndClcbiAgICB9LmJpbmQodGhpcylcbiAgKVxuICByZXR1cm4gdGd0XG59XG5cbi8qKlxuICpcbiAqIENvbnZlcnQgb2JqZWN0IHRvIGRvdHRlZC1rZXkvdmFsdWUgcGFpclxuICpcbiAqIFVzYWdlOlxuICpcbiAqICAgdmFyIHRndCA9IGRvdC5kb3Qob2JqKVxuICpcbiAqICAgb3JcbiAqXG4gKiAgIHZhciB0Z3QgPSB7fVxuICogICBkb3QuZG90KG9iaiwgdGd0KVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogc291cmNlIG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IHRndCB0YXJnZXQgb2JqZWN0XG4gKiBAcGFyYW0ge0FycmF5fSBwYXRoIHBhdGggYXJyYXkgKGludGVybmFsKVxuICovXG5Eb3RPYmplY3QucHJvdG90eXBlLmRvdCA9IGZ1bmN0aW9uIChvYmosIHRndCwgcGF0aCkge1xuICB0Z3QgPSB0Z3QgfHwge31cbiAgcGF0aCA9IHBhdGggfHwgW11cbiAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KG9iailcblxuICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goXG4gICAgZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIGluZGV4ID0gaXNBcnJheSAmJiB0aGlzLnVzZUJyYWNrZXRzID8gJ1snICsga2V5ICsgJ10nIDoga2V5XG4gICAgICBpZiAoXG4gICAgICAgIGlzQXJyYXlPck9iamVjdChvYmpba2V5XSkgJiZcbiAgICAgICAgKChpc09iamVjdChvYmpba2V5XSkgJiYgIWlzRW1wdHlPYmplY3Qob2JqW2tleV0pKSB8fFxuICAgICAgICAgIChBcnJheS5pc0FycmF5KG9ialtrZXldKSAmJiAhdGhpcy5rZWVwQXJyYXkgJiYgb2JqW2tleV0ubGVuZ3RoICE9PSAwKSlcbiAgICAgICkge1xuICAgICAgICBpZiAoaXNBcnJheSAmJiB0aGlzLnVzZUJyYWNrZXRzKSB7XG4gICAgICAgICAgdmFyIHByZXZpb3VzS2V5ID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdIHx8ICcnXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZG90KFxuICAgICAgICAgICAgb2JqW2tleV0sXG4gICAgICAgICAgICB0Z3QsXG4gICAgICAgICAgICBwYXRoLnNsaWNlKDAsIC0xKS5jb25jYXQocHJldmlvdXNLZXkgKyBpbmRleClcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZG90KG9ialtrZXldLCB0Z3QsIHBhdGguY29uY2F0KGluZGV4KSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzQXJyYXkgJiYgdGhpcy51c2VCcmFja2V0cykge1xuICAgICAgICAgIHRndFtwYXRoLmpvaW4odGhpcy5zZXBhcmF0b3IpLmNvbmNhdCgnWycgKyBrZXkgKyAnXScpXSA9IG9ialtrZXldXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGd0W3BhdGguY29uY2F0KGluZGV4KS5qb2luKHRoaXMuc2VwYXJhdG9yKV0gPSBvYmpba2V5XVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfS5iaW5kKHRoaXMpXG4gIClcbiAgcmV0dXJuIHRndFxufVxuXG5Eb3RPYmplY3QucGljayA9IHdyYXAoJ3BpY2snKVxuRG90T2JqZWN0Lm1vdmUgPSB3cmFwKCdtb3ZlJylcbkRvdE9iamVjdC50cmFuc2ZlciA9IHdyYXAoJ3RyYW5zZmVyJylcbkRvdE9iamVjdC50cmFuc2Zvcm0gPSB3cmFwKCd0cmFuc2Zvcm0nKVxuRG90T2JqZWN0LmNvcHkgPSB3cmFwKCdjb3B5JylcbkRvdE9iamVjdC5vYmplY3QgPSB3cmFwKCdvYmplY3QnKVxuRG90T2JqZWN0LnN0ciA9IHdyYXAoJ3N0cicpXG5Eb3RPYmplY3Quc2V0ID0gd3JhcCgnc2V0JylcbkRvdE9iamVjdC5kZWxldGUgPSB3cmFwKCdkZWxldGUnKVxuRG90T2JqZWN0LmRlbCA9IERvdE9iamVjdC5yZW1vdmUgPSB3cmFwKCdyZW1vdmUnKVxuRG90T2JqZWN0LmRvdCA9IHdyYXAoJ2RvdCcpO1xuWydvdmVycmlkZScsICdvdmVyd3JpdGUnXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEb3RPYmplY3QsIHByb3AsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBkb3REZWZhdWx0Lm92ZXJyaWRlXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIGRvdERlZmF1bHQub3ZlcnJpZGUgPSAhIXZhbFxuICAgIH1cbiAgfSlcbn0pO1xuWyd1c2VBcnJheScsICdrZWVwQXJyYXknLCAndXNlQnJhY2tldHMnXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEb3RPYmplY3QsIHByb3AsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBkb3REZWZhdWx0W3Byb3BdXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIGRvdERlZmF1bHRbcHJvcF0gPSB2YWxcbiAgICB9XG4gIH0pXG59KVxuXG5Eb3RPYmplY3QuX3Byb2Nlc3MgPSBfcHJvY2Vzc1xuXG5tb2R1bGUuZXhwb3J0cyA9IERvdE9iamVjdFxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8293\n")},2840:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var once = __webpack_require__(778);\n\nvar noop = function() {};\n\nvar isRequest = function(stream) {\n\treturn stream.setHeader && typeof stream.abort === 'function';\n};\n\nvar isChildProcess = function(stream) {\n\treturn stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3\n};\n\nvar eos = function(stream, opts, callback) {\n\tif (typeof opts === 'function') return eos(stream, null, opts);\n\tif (!opts) opts = {};\n\n\tcallback = once(callback || noop);\n\n\tvar ws = stream._writableState;\n\tvar rs = stream._readableState;\n\tvar readable = opts.readable || (opts.readable !== false && stream.readable);\n\tvar writable = opts.writable || (opts.writable !== false && stream.writable);\n\tvar cancelled = false;\n\n\tvar onlegacyfinish = function() {\n\t\tif (!stream.writable) onfinish();\n\t};\n\n\tvar onfinish = function() {\n\t\twritable = false;\n\t\tif (!readable) callback.call(stream);\n\t};\n\n\tvar onend = function() {\n\t\treadable = false;\n\t\tif (!writable) callback.call(stream);\n\t};\n\n\tvar onexit = function(exitCode) {\n\t\tcallback.call(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null);\n\t};\n\n\tvar onerror = function(err) {\n\t\tcallback.call(stream, err);\n\t};\n\n\tvar onclose = function() {\n\t\tprocess.nextTick(onclosenexttick);\n\t};\n\n\tvar onclosenexttick = function() {\n\t\tif (cancelled) return;\n\t\tif (readable && !(rs && (rs.ended && !rs.destroyed))) return callback.call(stream, new Error('premature close'));\n\t\tif (writable && !(ws && (ws.ended && !ws.destroyed))) return callback.call(stream, new Error('premature close'));\n\t};\n\n\tvar onrequest = function() {\n\t\tstream.req.on('finish', onfinish);\n\t};\n\n\tif (isRequest(stream)) {\n\t\tstream.on('complete', onfinish);\n\t\tstream.on('abort', onclose);\n\t\tif (stream.req) onrequest();\n\t\telse stream.on('request', onrequest);\n\t} else if (writable && !ws) { // legacy streams\n\t\tstream.on('end', onlegacyfinish);\n\t\tstream.on('close', onlegacyfinish);\n\t}\n\n\tif (isChildProcess(stream)) stream.on('exit', onexit);\n\n\tstream.on('end', onend);\n\tstream.on('finish', onfinish);\n\tif (opts.error !== false) stream.on('error', onerror);\n\tstream.on('close', onclose);\n\n\treturn function() {\n\t\tcancelled = true;\n\t\tstream.removeListener('complete', onfinish);\n\t\tstream.removeListener('abort', onclose);\n\t\tstream.removeListener('request', onrequest);\n\t\tif (stream.req) stream.req.removeListener('finish', onfinish);\n\t\tstream.removeListener('end', onlegacyfinish);\n\t\tstream.removeListener('close', onlegacyfinish);\n\t\tstream.removeListener('finish', onfinish);\n\t\tstream.removeListener('exit', onexit);\n\t\tstream.removeListener('end', onend);\n\t\tstream.removeListener('error', onerror);\n\t\tstream.removeListener('close', onclose);\n\t};\n};\n\nmodule.exports = eos;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg0MC5qcyIsIm1hcHBpbmdzIjoiQUFBQSxXQUFXLG1CQUFPLENBQUMsR0FBTTs7QUFFekI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsNEJBQTRCO0FBQy9CO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9lbmQtb2Ytc3RyZWFtL2luZGV4LmpzP2FiNTIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIG9uY2UgPSByZXF1aXJlKCdvbmNlJyk7XG5cbnZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcblxudmFyIGlzUmVxdWVzdCA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuXHRyZXR1cm4gc3RyZWFtLnNldEhlYWRlciAmJiB0eXBlb2Ygc3RyZWFtLmFib3J0ID09PSAnZnVuY3Rpb24nO1xufTtcblxudmFyIGlzQ2hpbGRQcm9jZXNzID0gZnVuY3Rpb24oc3RyZWFtKSB7XG5cdHJldHVybiBzdHJlYW0uc3RkaW8gJiYgQXJyYXkuaXNBcnJheShzdHJlYW0uc3RkaW8pICYmIHN0cmVhbS5zdGRpby5sZW5ndGggPT09IDNcbn07XG5cbnZhciBlb3MgPSBmdW5jdGlvbihzdHJlYW0sIG9wdHMsIGNhbGxiYWNrKSB7XG5cdGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGVvcyhzdHJlYW0sIG51bGwsIG9wdHMpO1xuXHRpZiAoIW9wdHMpIG9wdHMgPSB7fTtcblxuXHRjYWxsYmFjayA9IG9uY2UoY2FsbGJhY2sgfHwgbm9vcCk7XG5cblx0dmFyIHdzID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuXHR2YXIgcnMgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cdHZhciByZWFkYWJsZSA9IG9wdHMucmVhZGFibGUgfHwgKG9wdHMucmVhZGFibGUgIT09IGZhbHNlICYmIHN0cmVhbS5yZWFkYWJsZSk7XG5cdHZhciB3cml0YWJsZSA9IG9wdHMud3JpdGFibGUgfHwgKG9wdHMud3JpdGFibGUgIT09IGZhbHNlICYmIHN0cmVhbS53cml0YWJsZSk7XG5cdHZhciBjYW5jZWxsZWQgPSBmYWxzZTtcblxuXHR2YXIgb25sZWdhY3lmaW5pc2ggPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXN0cmVhbS53cml0YWJsZSkgb25maW5pc2goKTtcblx0fTtcblxuXHR2YXIgb25maW5pc2ggPSBmdW5jdGlvbigpIHtcblx0XHR3cml0YWJsZSA9IGZhbHNlO1xuXHRcdGlmICghcmVhZGFibGUpIGNhbGxiYWNrLmNhbGwoc3RyZWFtKTtcblx0fTtcblxuXHR2YXIgb25lbmQgPSBmdW5jdGlvbigpIHtcblx0XHRyZWFkYWJsZSA9IGZhbHNlO1xuXHRcdGlmICghd3JpdGFibGUpIGNhbGxiYWNrLmNhbGwoc3RyZWFtKTtcblx0fTtcblxuXHR2YXIgb25leGl0ID0gZnVuY3Rpb24oZXhpdENvZGUpIHtcblx0XHRjYWxsYmFjay5jYWxsKHN0cmVhbSwgZXhpdENvZGUgPyBuZXcgRXJyb3IoJ2V4aXRlZCB3aXRoIGVycm9yIGNvZGU6ICcgKyBleGl0Q29kZSkgOiBudWxsKTtcblx0fTtcblxuXHR2YXIgb25lcnJvciA9IGZ1bmN0aW9uKGVycikge1xuXHRcdGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBlcnIpO1xuXHR9O1xuXG5cdHZhciBvbmNsb3NlID0gZnVuY3Rpb24oKSB7XG5cdFx0cHJvY2Vzcy5uZXh0VGljayhvbmNsb3NlbmV4dHRpY2spO1xuXHR9O1xuXG5cdHZhciBvbmNsb3NlbmV4dHRpY2sgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoY2FuY2VsbGVkKSByZXR1cm47XG5cdFx0aWYgKHJlYWRhYmxlICYmICEocnMgJiYgKHJzLmVuZGVkICYmICFycy5kZXN0cm95ZWQpKSkgcmV0dXJuIGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBuZXcgRXJyb3IoJ3ByZW1hdHVyZSBjbG9zZScpKTtcblx0XHRpZiAod3JpdGFibGUgJiYgISh3cyAmJiAod3MuZW5kZWQgJiYgIXdzLmRlc3Ryb3llZCkpKSByZXR1cm4gY2FsbGJhY2suY2FsbChzdHJlYW0sIG5ldyBFcnJvcigncHJlbWF0dXJlIGNsb3NlJykpO1xuXHR9O1xuXG5cdHZhciBvbnJlcXVlc3QgPSBmdW5jdGlvbigpIHtcblx0XHRzdHJlYW0ucmVxLm9uKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cdH07XG5cblx0aWYgKGlzUmVxdWVzdChzdHJlYW0pKSB7XG5cdFx0c3RyZWFtLm9uKCdjb21wbGV0ZScsIG9uZmluaXNoKTtcblx0XHRzdHJlYW0ub24oJ2Fib3J0Jywgb25jbG9zZSk7XG5cdFx0aWYgKHN0cmVhbS5yZXEpIG9ucmVxdWVzdCgpO1xuXHRcdGVsc2Ugc3RyZWFtLm9uKCdyZXF1ZXN0Jywgb25yZXF1ZXN0KTtcblx0fSBlbHNlIGlmICh3cml0YWJsZSAmJiAhd3MpIHsgLy8gbGVnYWN5IHN0cmVhbXNcblx0XHRzdHJlYW0ub24oJ2VuZCcsIG9ubGVnYWN5ZmluaXNoKTtcblx0XHRzdHJlYW0ub24oJ2Nsb3NlJywgb25sZWdhY3lmaW5pc2gpO1xuXHR9XG5cblx0aWYgKGlzQ2hpbGRQcm9jZXNzKHN0cmVhbSkpIHN0cmVhbS5vbignZXhpdCcsIG9uZXhpdCk7XG5cblx0c3RyZWFtLm9uKCdlbmQnLCBvbmVuZCk7XG5cdHN0cmVhbS5vbignZmluaXNoJywgb25maW5pc2gpO1xuXHRpZiAob3B0cy5lcnJvciAhPT0gZmFsc2UpIHN0cmVhbS5vbignZXJyb3InLCBvbmVycm9yKTtcblx0c3RyZWFtLm9uKCdjbG9zZScsIG9uY2xvc2UpO1xuXG5cdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRjYW5jZWxsZWQgPSB0cnVlO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignY29tcGxldGUnLCBvbmZpbmlzaCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdhYm9ydCcsIG9uY2xvc2UpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcigncmVxdWVzdCcsIG9ucmVxdWVzdCk7XG5cdFx0aWYgKHN0cmVhbS5yZXEpIHN0cmVhbS5yZXEucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9ubGVnYWN5ZmluaXNoKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25sZWdhY3lmaW5pc2gpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZXhpdCcsIG9uZXhpdCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcblx0fTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZW9zO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2840\n")},6882:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var CombinedStream = __webpack_require__(9779);\nvar util = __webpack_require__(3837);\nvar path = __webpack_require__(1017);\nvar http = __webpack_require__(3685);\nvar https = __webpack_require__(5687);\nvar parseUrl = (__webpack_require__(7310).parse);\nvar fs = __webpack_require__(7147);\nvar Stream = (__webpack_require__(2781).Stream);\nvar mime = __webpack_require__(983);\nvar asynckit = __webpack_require__(9118);\nvar populate = __webpack_require__(2275);\n\n// Public API\nmodule.exports = FormData;\n\n// make it a Stream\nutil.inherits(FormData, CombinedStream);\n\n/**\n * Create readable \"multipart/form-data\" streams.\n * Can be used to submit forms\n * and file uploads to other web applications.\n *\n * @constructor\n * @param {Object} options - Properties to be added/overriden for FormData and CombinedStream\n */\nfunction FormData(options) {\n if (!(this instanceof FormData)) {\n return new FormData(options);\n }\n\n this._overheadLength = 0;\n this._valueLength = 0;\n this._valuesToMeasure = [];\n\n CombinedStream.call(this);\n\n options = options || {};\n for (var option in options) {\n this[option] = options[option];\n }\n}\n\nFormData.LINE_BREAK = '\\r\\n';\nFormData.DEFAULT_CONTENT_TYPE = 'application/octet-stream';\n\nFormData.prototype.append = function(field, value, options) {\n\n options = options || {};\n\n // allow filename as single option\n if (typeof options == 'string') {\n options = {filename: options};\n }\n\n var append = CombinedStream.prototype.append.bind(this);\n\n // all that streamy business can't handle numbers\n if (typeof value == 'number') {\n value = '' + value;\n }\n\n // https://github.com/felixge/node-form-data/issues/38\n if (util.isArray(value)) {\n // Please convert your array into string\n // the way web server expects it\n this._error(new Error('Arrays are not supported.'));\n return;\n }\n\n var header = this._multiPartHeader(field, value, options);\n var footer = this._multiPartFooter();\n\n append(header);\n append(value);\n append(footer);\n\n // pass along options.knownLength\n this._trackLength(header, value, options);\n};\n\nFormData.prototype._trackLength = function(header, value, options) {\n var valueLength = 0;\n\n // used w/ getLengthSync(), when length is known.\n // e.g. for streaming directly from a remote server,\n // w/ a known file a size, and not wanting to wait for\n // incoming file to finish to get its size.\n if (options.knownLength != null) {\n valueLength += +options.knownLength;\n } else if (Buffer.isBuffer(value)) {\n valueLength = value.length;\n } else if (typeof value === 'string') {\n valueLength = Buffer.byteLength(value);\n }\n\n this._valueLength += valueLength;\n\n // @check why add CRLF? does this account for custom/multiple CRLFs?\n this._overheadLength +=\n Buffer.byteLength(header) +\n FormData.LINE_BREAK.length;\n\n // empty or either doesn't have path or not an http response or not a stream\n if (!value || ( !value.path && !(value.readable && value.hasOwnProperty('httpVersion')) && !(value instanceof Stream))) {\n return;\n }\n\n // no need to bother with the length\n if (!options.knownLength) {\n this._valuesToMeasure.push(value);\n }\n};\n\nFormData.prototype._lengthRetriever = function(value, callback) {\n\n if (value.hasOwnProperty('fd')) {\n\n // take read range into a account\n // `end` = Infinity –> read file till the end\n //\n // TODO: Looks like there is bug in Node fs.createReadStream\n // it doesn't respect `end` options without `start` options\n // Fix it when node fixes it.\n // https://github.com/joyent/node/issues/7819\n if (value.end != undefined && value.end != Infinity && value.start != undefined) {\n\n // when end specified\n // no need to calculate range\n // inclusive, starts with 0\n callback(null, value.end + 1 - (value.start ? value.start : 0));\n\n // not that fast snoopy\n } else {\n // still need to fetch file size from fs\n fs.stat(value.path, function(err, stat) {\n\n var fileSize;\n\n if (err) {\n callback(err);\n return;\n }\n\n // update final size based on the range options\n fileSize = stat.size - (value.start ? value.start : 0);\n callback(null, fileSize);\n });\n }\n\n // or http response\n } else if (value.hasOwnProperty('httpVersion')) {\n callback(null, +value.headers['content-length']);\n\n // or request stream http://github.com/mikeal/request\n } else if (value.hasOwnProperty('httpModule')) {\n // wait till response come back\n value.on('response', function(response) {\n value.pause();\n callback(null, +response.headers['content-length']);\n });\n value.resume();\n\n // something else\n } else {\n callback('Unknown stream');\n }\n};\n\nFormData.prototype._multiPartHeader = function(field, value, options) {\n // custom header specified (as string)?\n // it becomes responsible for boundary\n // (e.g. to handle extra CRLFs on .NET servers)\n if (typeof options.header == 'string') {\n return options.header;\n }\n\n var contentDisposition = this._getContentDisposition(value, options);\n var contentType = this._getContentType(value, options);\n\n var contents = '';\n var headers = {\n // add custom disposition as third element or keep it two elements if not\n 'Content-Disposition': ['form-data', 'name=\"' + field + '\"'].concat(contentDisposition || []),\n // if no content type. allow it to be empty array\n 'Content-Type': [].concat(contentType || [])\n };\n\n // allow custom headers.\n if (typeof options.header == 'object') {\n populate(headers, options.header);\n }\n\n var header;\n for (var prop in headers) {\n if (!headers.hasOwnProperty(prop)) continue;\n header = headers[prop];\n\n // skip nullish headers.\n if (header == null) {\n continue;\n }\n\n // convert all headers to arrays.\n if (!Array.isArray(header)) {\n header = [header];\n }\n\n // add non-empty headers.\n if (header.length) {\n contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK;\n }\n }\n\n return '--' + this.getBoundary() + FormData.LINE_BREAK + contents + FormData.LINE_BREAK;\n};\n\nFormData.prototype._getContentDisposition = function(value, options) {\n\n var filename\n , contentDisposition\n ;\n\n if (typeof options.filepath === 'string') {\n // custom filepath for relative paths\n filename = path.normalize(options.filepath).replace(/\\\\/g, '/');\n } else if (options.filename || value.name || value.path) {\n // custom filename take precedence\n // formidable and the browser add a name property\n // fs- and request- streams have path property\n filename = path.basename(options.filename || value.name || value.path);\n } else if (value.readable && value.hasOwnProperty('httpVersion')) {\n // or try http response\n filename = path.basename(value.client._httpMessage.path || '');\n }\n\n if (filename) {\n contentDisposition = 'filename=\"' + filename + '\"';\n }\n\n return contentDisposition;\n};\n\nFormData.prototype._getContentType = function(value, options) {\n\n // use custom content-type above all\n var contentType = options.contentType;\n\n // or try `name` from formidable, browser\n if (!contentType && value.name) {\n contentType = mime.lookup(value.name);\n }\n\n // or try `path` from fs-, request- streams\n if (!contentType && value.path) {\n contentType = mime.lookup(value.path);\n }\n\n // or if it's http-reponse\n if (!contentType && value.readable && value.hasOwnProperty('httpVersion')) {\n contentType = value.headers['content-type'];\n }\n\n // or guess it from the filepath or filename\n if (!contentType && (options.filepath || options.filename)) {\n contentType = mime.lookup(options.filepath || options.filename);\n }\n\n // fallback to the default content type if `value` is not simple value\n if (!contentType && typeof value == 'object') {\n contentType = FormData.DEFAULT_CONTENT_TYPE;\n }\n\n return contentType;\n};\n\nFormData.prototype._multiPartFooter = function() {\n return function(next) {\n var footer = FormData.LINE_BREAK;\n\n var lastPart = (this._streams.length === 0);\n if (lastPart) {\n footer += this._lastBoundary();\n }\n\n next(footer);\n }.bind(this);\n};\n\nFormData.prototype._lastBoundary = function() {\n return '--' + this.getBoundary() + '--' + FormData.LINE_BREAK;\n};\n\nFormData.prototype.getHeaders = function(userHeaders) {\n var header;\n var formHeaders = {\n 'content-type': 'multipart/form-data; boundary=' + this.getBoundary()\n };\n\n for (header in userHeaders) {\n if (userHeaders.hasOwnProperty(header)) {\n formHeaders[header.toLowerCase()] = userHeaders[header];\n }\n }\n\n return formHeaders;\n};\n\nFormData.prototype.setBoundary = function(boundary) {\n this._boundary = boundary;\n};\n\nFormData.prototype.getBoundary = function() {\n if (!this._boundary) {\n this._generateBoundary();\n }\n\n return this._boundary;\n};\n\nFormData.prototype.getBuffer = function() {\n var dataBuffer = new Buffer.alloc( 0 );\n var boundary = this.getBoundary();\n\n // Create the form content. Add Line breaks to the end of data.\n for (var i = 0, len = this._streams.length; i < len; i++) {\n if (typeof this._streams[i] !== 'function') {\n\n // Add content to the buffer.\n if(Buffer.isBuffer(this._streams[i])) {\n dataBuffer = Buffer.concat( [dataBuffer, this._streams[i]]);\n }else {\n dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(this._streams[i])]);\n }\n\n // Add break after content.\n if (typeof this._streams[i] !== 'string' || this._streams[i].substring( 2, boundary.length + 2 ) !== boundary) {\n dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(FormData.LINE_BREAK)] );\n }\n }\n }\n\n // Add the footer and return the Buffer object.\n return Buffer.concat( [dataBuffer, Buffer.from(this._lastBoundary())] );\n};\n\nFormData.prototype._generateBoundary = function() {\n // This generates a 50 character boundary similar to those used by Firefox.\n // They are optimized for boyer-moore parsing.\n var boundary = '--------------------------';\n for (var i = 0; i < 24; i++) {\n boundary += Math.floor(Math.random() * 10).toString(16);\n }\n\n this._boundary = boundary;\n};\n\n// Note: getLengthSync DOESN'T calculate streams length\n// As workaround one can calculate file size manually\n// and add it as knownLength option\nFormData.prototype.getLengthSync = function() {\n var knownLength = this._overheadLength + this._valueLength;\n\n // Don't get confused, there are 3 \"internal\" streams for each keyval pair\n // so it basically checks if there is any value added to the form\n if (this._streams.length) {\n knownLength += this._lastBoundary().length;\n }\n\n // https://github.com/form-data/form-data/issues/40\n if (!this.hasKnownLength()) {\n // Some async length retrievers are present\n // therefore synchronous length calculation is false.\n // Please use getLength(callback) to get proper length\n this._error(new Error('Cannot calculate proper length in synchronous way.'));\n }\n\n return knownLength;\n};\n\n// Public API to check if length of added values is known\n// https://github.com/form-data/form-data/issues/196\n// https://github.com/form-data/form-data/issues/262\nFormData.prototype.hasKnownLength = function() {\n var hasKnownLength = true;\n\n if (this._valuesToMeasure.length) {\n hasKnownLength = false;\n }\n\n return hasKnownLength;\n};\n\nFormData.prototype.getLength = function(cb) {\n var knownLength = this._overheadLength + this._valueLength;\n\n if (this._streams.length) {\n knownLength += this._lastBoundary().length;\n }\n\n if (!this._valuesToMeasure.length) {\n process.nextTick(cb.bind(this, null, knownLength));\n return;\n }\n\n asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function(err, values) {\n if (err) {\n cb(err);\n return;\n }\n\n values.forEach(function(length) {\n knownLength += length;\n });\n\n cb(null, knownLength);\n });\n};\n\nFormData.prototype.submit = function(params, cb) {\n var request\n , options\n , defaults = {method: 'post'}\n ;\n\n // parse provided url if it's string\n // or treat it as options object\n if (typeof params == 'string') {\n\n params = parseUrl(params);\n options = populate({\n port: params.port,\n path: params.pathname,\n host: params.hostname,\n protocol: params.protocol\n }, defaults);\n\n // use custom params\n } else {\n\n options = populate(params, defaults);\n // if no port provided use default one\n if (!options.port) {\n options.port = options.protocol == 'https:' ? 443 : 80;\n }\n }\n\n // put that good code in getHeaders to some use\n options.headers = this.getHeaders(params.headers);\n\n // https if specified, fallback to http in any other case\n if (options.protocol == 'https:') {\n request = https.request(options);\n } else {\n request = http.request(options);\n }\n\n // get content length and fire away\n this.getLength(function(err, length) {\n if (err && err !== 'Unknown stream') {\n this._error(err);\n return;\n }\n\n // add content length\n if (length) {\n request.setHeader('Content-Length', length);\n }\n\n this.pipe(request);\n if (cb) {\n var onResponse;\n\n var callback = function (error, responce) {\n request.removeListener('error', callback);\n request.removeListener('response', onResponse);\n\n return cb.call(this, error, responce);\n };\n\n onResponse = callback.bind(this, null);\n\n request.on('error', callback);\n request.on('response', onResponse);\n }\n }.bind(this));\n\n return request;\n};\n\nFormData.prototype._error = function(err) {\n if (!this.error) {\n this.error = err;\n this.pause();\n this.emit('error', err);\n }\n};\n\nFormData.prototype.toString = function () {\n return '[object FormData]';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjg4Mi5qcyIsIm1hcHBpbmdzIjoiQUFBQSxxQkFBcUIsbUJBQU8sQ0FBQyxJQUFpQjtBQUM5QyxXQUFXLG1CQUFPLENBQUMsSUFBTTtBQUN6QixXQUFXLG1CQUFPLENBQUMsSUFBTTtBQUN6QixXQUFXLG1CQUFPLENBQUMsSUFBTTtBQUN6QixZQUFZLG1CQUFPLENBQUMsSUFBTztBQUMzQixlQUFlLGlDQUFvQjtBQUNuQyxTQUFTLG1CQUFPLENBQUMsSUFBSTtBQUNyQixhQUFhLGtDQUF3QjtBQUNyQyxXQUFXLG1CQUFPLENBQUMsR0FBWTtBQUMvQixlQUFlLG1CQUFPLENBQUMsSUFBVTtBQUNqQyxlQUFlLG1CQUFPLENBQUMsSUFBZTs7QUFFdEM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGVBQWU7QUFDZjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4Q0FBOEMsU0FBUztBQUN2RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2Zvcm0tZGF0YS9saWIvZm9ybV9kYXRhLmpzPzJiMjciXSwic291cmNlc0NvbnRlbnQiOlsidmFyIENvbWJpbmVkU3RyZWFtID0gcmVxdWlyZSgnY29tYmluZWQtc3RyZWFtJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG52YXIgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpO1xudmFyIHBhcnNlVXJsID0gcmVxdWlyZSgndXJsJykucGFyc2U7XG52YXIgZnMgPSByZXF1aXJlKCdmcycpO1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbTtcbnZhciBtaW1lID0gcmVxdWlyZSgnbWltZS10eXBlcycpO1xudmFyIGFzeW5ja2l0ID0gcmVxdWlyZSgnYXN5bmNraXQnKTtcbnZhciBwb3B1bGF0ZSA9IHJlcXVpcmUoJy4vcG9wdWxhdGUuanMnKTtcblxuLy8gUHVibGljIEFQSVxubW9kdWxlLmV4cG9ydHMgPSBGb3JtRGF0YTtcblxuLy8gbWFrZSBpdCBhIFN0cmVhbVxudXRpbC5pbmhlcml0cyhGb3JtRGF0YSwgQ29tYmluZWRTdHJlYW0pO1xuXG4vKipcbiAqIENyZWF0ZSByZWFkYWJsZSBcIm11bHRpcGFydC9mb3JtLWRhdGFcIiBzdHJlYW1zLlxuICogQ2FuIGJlIHVzZWQgdG8gc3VibWl0IGZvcm1zXG4gKiBhbmQgZmlsZSB1cGxvYWRzIHRvIG90aGVyIHdlYiBhcHBsaWNhdGlvbnMuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFByb3BlcnRpZXMgdG8gYmUgYWRkZWQvb3ZlcnJpZGVuIGZvciBGb3JtRGF0YSBhbmQgQ29tYmluZWRTdHJlYW1cbiAqL1xuZnVuY3Rpb24gRm9ybURhdGEob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRm9ybURhdGEpKSB7XG4gICAgcmV0dXJuIG5ldyBGb3JtRGF0YShvcHRpb25zKTtcbiAgfVxuXG4gIHRoaXMuX292ZXJoZWFkTGVuZ3RoID0gMDtcbiAgdGhpcy5fdmFsdWVMZW5ndGggPSAwO1xuICB0aGlzLl92YWx1ZXNUb01lYXN1cmUgPSBbXTtcblxuICBDb21iaW5lZFN0cmVhbS5jYWxsKHRoaXMpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBmb3IgKHZhciBvcHRpb24gaW4gb3B0aW9ucykge1xuICAgIHRoaXNbb3B0aW9uXSA9IG9wdGlvbnNbb3B0aW9uXTtcbiAgfVxufVxuXG5Gb3JtRGF0YS5MSU5FX0JSRUFLID0gJ1xcclxcbic7XG5Gb3JtRGF0YS5ERUZBVUxUX0NPTlRFTlRfVFlQRSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xuXG5Gb3JtRGF0YS5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24oZmllbGQsIHZhbHVlLCBvcHRpb25zKSB7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gYWxsb3cgZmlsZW5hbWUgYXMgc2luZ2xlIG9wdGlvblxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zID0ge2ZpbGVuYW1lOiBvcHRpb25zfTtcbiAgfVxuXG4gIHZhciBhcHBlbmQgPSBDb21iaW5lZFN0cmVhbS5wcm90b3R5cGUuYXBwZW5kLmJpbmQodGhpcyk7XG5cbiAgLy8gYWxsIHRoYXQgc3RyZWFteSBidXNpbmVzcyBjYW4ndCBoYW5kbGUgbnVtYmVyc1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgdmFsdWUgPSAnJyArIHZhbHVlO1xuICB9XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZlbGl4Z2Uvbm9kZS1mb3JtLWRhdGEvaXNzdWVzLzM4XG4gIGlmICh1dGlsLmlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gUGxlYXNlIGNvbnZlcnQgeW91ciBhcnJheSBpbnRvIHN0cmluZ1xuICAgIC8vIHRoZSB3YXkgd2ViIHNlcnZlciBleHBlY3RzIGl0XG4gICAgdGhpcy5fZXJyb3IobmV3IEVycm9yKCdBcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBoZWFkZXIgPSB0aGlzLl9tdWx0aVBhcnRIZWFkZXIoZmllbGQsIHZhbHVlLCBvcHRpb25zKTtcbiAgdmFyIGZvb3RlciA9IHRoaXMuX211bHRpUGFydEZvb3RlcigpO1xuXG4gIGFwcGVuZChoZWFkZXIpO1xuICBhcHBlbmQodmFsdWUpO1xuICBhcHBlbmQoZm9vdGVyKTtcblxuICAvLyBwYXNzIGFsb25nIG9wdGlvbnMua25vd25MZW5ndGhcbiAgdGhpcy5fdHJhY2tMZW5ndGgoaGVhZGVyLCB2YWx1ZSwgb3B0aW9ucyk7XG59O1xuXG5Gb3JtRGF0YS5wcm90b3R5cGUuX3RyYWNrTGVuZ3RoID0gZnVuY3Rpb24oaGVhZGVyLCB2YWx1ZSwgb3B0aW9ucykge1xuICB2YXIgdmFsdWVMZW5ndGggPSAwO1xuXG4gIC8vIHVzZWQgdy8gZ2V0TGVuZ3RoU3luYygpLCB3aGVuIGxlbmd0aCBpcyBrbm93bi5cbiAgLy8gZS5nLiBmb3Igc3RyZWFtaW5nIGRpcmVjdGx5IGZyb20gYSByZW1vdGUgc2VydmVyLFxuICAvLyB3LyBhIGtub3duIGZpbGUgYSBzaXplLCBhbmQgbm90IHdhbnRpbmcgdG8gd2FpdCBmb3JcbiAgLy8gaW5jb21pbmcgZmlsZSB0byBmaW5pc2ggdG8gZ2V0IGl0cyBzaXplLlxuICBpZiAob3B0aW9ucy5rbm93bkxlbmd0aCAhPSBudWxsKSB7XG4gICAgdmFsdWVMZW5ndGggKz0gK29wdGlvbnMua25vd25MZW5ndGg7XG4gIH0gZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSkge1xuICAgIHZhbHVlTGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWx1ZUxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHZhbHVlKTtcbiAgfVxuXG4gIHRoaXMuX3ZhbHVlTGVuZ3RoICs9IHZhbHVlTGVuZ3RoO1xuXG4gIC8vIEBjaGVjayB3aHkgYWRkIENSTEY/IGRvZXMgdGhpcyBhY2NvdW50IGZvciBjdXN0b20vbXVsdGlwbGUgQ1JMRnM/XG4gIHRoaXMuX292ZXJoZWFkTGVuZ3RoICs9XG4gICAgQnVmZmVyLmJ5dGVMZW5ndGgoaGVhZGVyKSArXG4gICAgRm9ybURhdGEuTElORV9CUkVBSy5sZW5ndGg7XG5cbiAgLy8gZW1wdHkgb3IgZWl0aGVyIGRvZXNuJ3QgaGF2ZSBwYXRoIG9yIG5vdCBhbiBodHRwIHJlc3BvbnNlIG9yIG5vdCBhIHN0cmVhbVxuICBpZiAoIXZhbHVlIHx8ICggIXZhbHVlLnBhdGggJiYgISh2YWx1ZS5yZWFkYWJsZSAmJiB2YWx1ZS5oYXNPd25Qcm9wZXJ0eSgnaHR0cFZlcnNpb24nKSkgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIFN0cmVhbSkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gbm8gbmVlZCB0byBib3RoZXIgd2l0aCB0aGUgbGVuZ3RoXG4gIGlmICghb3B0aW9ucy5rbm93bkxlbmd0aCkge1xuICAgIHRoaXMuX3ZhbHVlc1RvTWVhc3VyZS5wdXNoKHZhbHVlKTtcbiAgfVxufTtcblxuRm9ybURhdGEucHJvdG90eXBlLl9sZW5ndGhSZXRyaWV2ZXIgPSBmdW5jdGlvbih2YWx1ZSwgY2FsbGJhY2spIHtcblxuICBpZiAodmFsdWUuaGFzT3duUHJvcGVydHkoJ2ZkJykpIHtcblxuICAgIC8vIHRha2UgcmVhZCByYW5nZSBpbnRvIGEgYWNjb3VudFxuICAgIC8vIGBlbmRgID0gSW5maW5pdHkg4oCTPiByZWFkIGZpbGUgdGlsbCB0aGUgZW5kXG4gICAgLy9cbiAgICAvLyBUT0RPOiBMb29rcyBsaWtlIHRoZXJlIGlzIGJ1ZyBpbiBOb2RlIGZzLmNyZWF0ZVJlYWRTdHJlYW1cbiAgICAvLyBpdCBkb2Vzbid0IHJlc3BlY3QgYGVuZGAgb3B0aW9ucyB3aXRob3V0IGBzdGFydGAgb3B0aW9uc1xuICAgIC8vIEZpeCBpdCB3aGVuIG5vZGUgZml4ZXMgaXQuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL2lzc3Vlcy83ODE5XG4gICAgaWYgKHZhbHVlLmVuZCAhPSB1bmRlZmluZWQgJiYgdmFsdWUuZW5kICE9IEluZmluaXR5ICYmIHZhbHVlLnN0YXJ0ICE9IHVuZGVmaW5lZCkge1xuXG4gICAgICAvLyB3aGVuIGVuZCBzcGVjaWZpZWRcbiAgICAgIC8vIG5vIG5lZWQgdG8gY2FsY3VsYXRlIHJhbmdlXG4gICAgICAvLyBpbmNsdXNpdmUsIHN0YXJ0cyB3aXRoIDBcbiAgICAgIGNhbGxiYWNrKG51bGwsIHZhbHVlLmVuZCArIDEgLSAodmFsdWUuc3RhcnQgPyB2YWx1ZS5zdGFydCA6IDApKTtcblxuICAgIC8vIG5vdCB0aGF0IGZhc3Qgc25vb3B5XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHN0aWxsIG5lZWQgdG8gZmV0Y2ggZmlsZSBzaXplIGZyb20gZnNcbiAgICAgIGZzLnN0YXQodmFsdWUucGF0aCwgZnVuY3Rpb24oZXJyLCBzdGF0KSB7XG5cbiAgICAgICAgdmFyIGZpbGVTaXplO1xuXG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVwZGF0ZSBmaW5hbCBzaXplIGJhc2VkIG9uIHRoZSByYW5nZSBvcHRpb25zXG4gICAgICAgIGZpbGVTaXplID0gc3RhdC5zaXplIC0gKHZhbHVlLnN0YXJ0ID8gdmFsdWUuc3RhcnQgOiAwKTtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgZmlsZVNpemUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gIC8vIG9yIGh0dHAgcmVzcG9uc2VcbiAgfSBlbHNlIGlmICh2YWx1ZS5oYXNPd25Qcm9wZXJ0eSgnaHR0cFZlcnNpb24nKSkge1xuICAgIGNhbGxiYWNrKG51bGwsICt2YWx1ZS5oZWFkZXJzWydjb250ZW50LWxlbmd0aCddKTtcblxuICAvLyBvciByZXF1ZXN0IHN0cmVhbSBodHRwOi8vZ2l0aHViLmNvbS9taWtlYWwvcmVxdWVzdFxuICB9IGVsc2UgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KCdodHRwTW9kdWxlJykpIHtcbiAgICAvLyB3YWl0IHRpbGwgcmVzcG9uc2UgY29tZSBiYWNrXG4gICAgdmFsdWUub24oJ3Jlc3BvbnNlJywgZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgIHZhbHVlLnBhdXNlKCk7XG4gICAgICBjYWxsYmFjayhudWxsLCArcmVzcG9uc2UuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSk7XG4gICAgfSk7XG4gICAgdmFsdWUucmVzdW1lKCk7XG5cbiAgLy8gc29tZXRoaW5nIGVsc2VcbiAgfSBlbHNlIHtcbiAgICBjYWxsYmFjaygnVW5rbm93biBzdHJlYW0nKTtcbiAgfVxufTtcblxuRm9ybURhdGEucHJvdG90eXBlLl9tdWx0aVBhcnRIZWFkZXIgPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgLy8gY3VzdG9tIGhlYWRlciBzcGVjaWZpZWQgKGFzIHN0cmluZyk/XG4gIC8vIGl0IGJlY29tZXMgcmVzcG9uc2libGUgZm9yIGJvdW5kYXJ5XG4gIC8vIChlLmcuIHRvIGhhbmRsZSBleHRyYSBDUkxGcyBvbiAuTkVUIHNlcnZlcnMpXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5oZWFkZXIgPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5oZWFkZXI7XG4gIH1cblxuICB2YXIgY29udGVudERpc3Bvc2l0aW9uID0gdGhpcy5fZ2V0Q29udGVudERpc3Bvc2l0aW9uKHZhbHVlLCBvcHRpb25zKTtcbiAgdmFyIGNvbnRlbnRUeXBlID0gdGhpcy5fZ2V0Q29udGVudFR5cGUodmFsdWUsIG9wdGlvbnMpO1xuXG4gIHZhciBjb250ZW50cyA9ICcnO1xuICB2YXIgaGVhZGVycyAgPSB7XG4gICAgLy8gYWRkIGN1c3RvbSBkaXNwb3NpdGlvbiBhcyB0aGlyZCBlbGVtZW50IG9yIGtlZXAgaXQgdHdvIGVsZW1lbnRzIGlmIG5vdFxuICAgICdDb250ZW50LURpc3Bvc2l0aW9uJzogWydmb3JtLWRhdGEnLCAnbmFtZT1cIicgKyBmaWVsZCArICdcIiddLmNvbmNhdChjb250ZW50RGlzcG9zaXRpb24gfHwgW10pLFxuICAgIC8vIGlmIG5vIGNvbnRlbnQgdHlwZS4gYWxsb3cgaXQgdG8gYmUgZW1wdHkgYXJyYXlcbiAgICAnQ29udGVudC1UeXBlJzogW10uY29uY2F0KGNvbnRlbnRUeXBlIHx8IFtdKVxuICB9O1xuXG4gIC8vIGFsbG93IGN1c3RvbSBoZWFkZXJzLlxuICBpZiAodHlwZW9mIG9wdGlvbnMuaGVhZGVyID09ICdvYmplY3QnKSB7XG4gICAgcG9wdWxhdGUoaGVhZGVycywgb3B0aW9ucy5oZWFkZXIpO1xuICB9XG5cbiAgdmFyIGhlYWRlcjtcbiAgZm9yICh2YXIgcHJvcCBpbiBoZWFkZXJzKSB7XG4gICAgaWYgKCFoZWFkZXJzLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTtcbiAgICBoZWFkZXIgPSBoZWFkZXJzW3Byb3BdO1xuXG4gICAgLy8gc2tpcCBudWxsaXNoIGhlYWRlcnMuXG4gICAgaWYgKGhlYWRlciA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0IGFsbCBoZWFkZXJzIHRvIGFycmF5cy5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaGVhZGVyKSkge1xuICAgICAgaGVhZGVyID0gW2hlYWRlcl07XG4gICAgfVxuXG4gICAgLy8gYWRkIG5vbi1lbXB0eSBoZWFkZXJzLlxuICAgIGlmIChoZWFkZXIubGVuZ3RoKSB7XG4gICAgICBjb250ZW50cyArPSBwcm9wICsgJzogJyArIGhlYWRlci5qb2luKCc7ICcpICsgRm9ybURhdGEuTElORV9CUkVBSztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJy0tJyArIHRoaXMuZ2V0Qm91bmRhcnkoKSArIEZvcm1EYXRhLkxJTkVfQlJFQUsgKyBjb250ZW50cyArIEZvcm1EYXRhLkxJTkVfQlJFQUs7XG59O1xuXG5Gb3JtRGF0YS5wcm90b3R5cGUuX2dldENvbnRlbnREaXNwb3NpdGlvbiA9IGZ1bmN0aW9uKHZhbHVlLCBvcHRpb25zKSB7XG5cbiAgdmFyIGZpbGVuYW1lXG4gICAgLCBjb250ZW50RGlzcG9zaXRpb25cbiAgICA7XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbGVwYXRoID09PSAnc3RyaW5nJykge1xuICAgIC8vIGN1c3RvbSBmaWxlcGF0aCBmb3IgcmVsYXRpdmUgcGF0aHNcbiAgICBmaWxlbmFtZSA9IHBhdGgubm9ybWFsaXplKG9wdGlvbnMuZmlsZXBhdGgpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgfSBlbHNlIGlmIChvcHRpb25zLmZpbGVuYW1lIHx8IHZhbHVlLm5hbWUgfHwgdmFsdWUucGF0aCkge1xuICAgIC8vIGN1c3RvbSBmaWxlbmFtZSB0YWtlIHByZWNlZGVuY2VcbiAgICAvLyBmb3JtaWRhYmxlIGFuZCB0aGUgYnJvd3NlciBhZGQgYSBuYW1lIHByb3BlcnR5XG4gICAgLy8gZnMtIGFuZCByZXF1ZXN0LSBzdHJlYW1zIGhhdmUgcGF0aCBwcm9wZXJ0eVxuICAgIGZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZShvcHRpb25zLmZpbGVuYW1lIHx8IHZhbHVlLm5hbWUgfHwgdmFsdWUucGF0aCk7XG4gIH0gZWxzZSBpZiAodmFsdWUucmVhZGFibGUgJiYgdmFsdWUuaGFzT3duUHJvcGVydHkoJ2h0dHBWZXJzaW9uJykpIHtcbiAgICAvLyBvciB0cnkgaHR0cCByZXNwb25zZVxuICAgIGZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZSh2YWx1ZS5jbGllbnQuX2h0dHBNZXNzYWdlLnBhdGggfHwgJycpO1xuICB9XG5cbiAgaWYgKGZpbGVuYW1lKSB7XG4gICAgY29udGVudERpc3Bvc2l0aW9uID0gJ2ZpbGVuYW1lPVwiJyArIGZpbGVuYW1lICsgJ1wiJztcbiAgfVxuXG4gIHJldHVybiBjb250ZW50RGlzcG9zaXRpb247XG59O1xuXG5Gb3JtRGF0YS5wcm90b3R5cGUuX2dldENvbnRlbnRUeXBlID0gZnVuY3Rpb24odmFsdWUsIG9wdGlvbnMpIHtcblxuICAvLyB1c2UgY3VzdG9tIGNvbnRlbnQtdHlwZSBhYm92ZSBhbGxcbiAgdmFyIGNvbnRlbnRUeXBlID0gb3B0aW9ucy5jb250ZW50VHlwZTtcblxuICAvLyBvciB0cnkgYG5hbWVgIGZyb20gZm9ybWlkYWJsZSwgYnJvd3NlclxuICBpZiAoIWNvbnRlbnRUeXBlICYmIHZhbHVlLm5hbWUpIHtcbiAgICBjb250ZW50VHlwZSA9IG1pbWUubG9va3VwKHZhbHVlLm5hbWUpO1xuICB9XG5cbiAgLy8gb3IgdHJ5IGBwYXRoYCBmcm9tIGZzLSwgcmVxdWVzdC0gc3RyZWFtc1xuICBpZiAoIWNvbnRlbnRUeXBlICYmIHZhbHVlLnBhdGgpIHtcbiAgICBjb250ZW50VHlwZSA9IG1pbWUubG9va3VwKHZhbHVlLnBhdGgpO1xuICB9XG5cbiAgLy8gb3IgaWYgaXQncyBodHRwLXJlcG9uc2VcbiAgaWYgKCFjb250ZW50VHlwZSAmJiB2YWx1ZS5yZWFkYWJsZSAmJiB2YWx1ZS5oYXNPd25Qcm9wZXJ0eSgnaHR0cFZlcnNpb24nKSkge1xuICAgIGNvbnRlbnRUeXBlID0gdmFsdWUuaGVhZGVyc1snY29udGVudC10eXBlJ107XG4gIH1cblxuICAvLyBvciBndWVzcyBpdCBmcm9tIHRoZSBmaWxlcGF0aCBvciBmaWxlbmFtZVxuICBpZiAoIWNvbnRlbnRUeXBlICYmIChvcHRpb25zLmZpbGVwYXRoIHx8IG9wdGlvbnMuZmlsZW5hbWUpKSB7XG4gICAgY29udGVudFR5cGUgPSBtaW1lLmxvb2t1cChvcHRpb25zLmZpbGVwYXRoIHx8IG9wdGlvbnMuZmlsZW5hbWUpO1xuICB9XG5cbiAgLy8gZmFsbGJhY2sgdG8gdGhlIGRlZmF1bHQgY29udGVudCB0eXBlIGlmIGB2YWx1ZWAgaXMgbm90IHNpbXBsZSB2YWx1ZVxuICBpZiAoIWNvbnRlbnRUeXBlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgIGNvbnRlbnRUeXBlID0gRm9ybURhdGEuREVGQVVMVF9DT05URU5UX1RZUEU7XG4gIH1cblxuICByZXR1cm4gY29udGVudFR5cGU7XG59O1xuXG5Gb3JtRGF0YS5wcm90b3R5cGUuX211bHRpUGFydEZvb3RlciA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gZnVuY3Rpb24obmV4dCkge1xuICAgIHZhciBmb290ZXIgPSBGb3JtRGF0YS5MSU5FX0JSRUFLO1xuXG4gICAgdmFyIGxhc3RQYXJ0ID0gKHRoaXMuX3N0cmVhbXMubGVuZ3RoID09PSAwKTtcbiAgICBpZiAobGFzdFBhcnQpIHtcbiAgICAgIGZvb3RlciArPSB0aGlzLl9sYXN0Qm91bmRhcnkoKTtcbiAgICB9XG5cbiAgICBuZXh0KGZvb3Rlcik7XG4gIH0uYmluZCh0aGlzKTtcbn07XG5cbkZvcm1EYXRhLnByb3RvdHlwZS5fbGFzdEJvdW5kYXJ5ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAnLS0nICsgdGhpcy5nZXRCb3VuZGFyeSgpICsgJy0tJyArIEZvcm1EYXRhLkxJTkVfQlJFQUs7XG59O1xuXG5Gb3JtRGF0YS5wcm90b3R5cGUuZ2V0SGVhZGVycyA9IGZ1bmN0aW9uKHVzZXJIZWFkZXJzKSB7XG4gIHZhciBoZWFkZXI7XG4gIHZhciBmb3JtSGVhZGVycyA9IHtcbiAgICAnY29udGVudC10eXBlJzogJ211bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PScgKyB0aGlzLmdldEJvdW5kYXJ5KClcbiAgfTtcblxuICBmb3IgKGhlYWRlciBpbiB1c2VySGVhZGVycykge1xuICAgIGlmICh1c2VySGVhZGVycy5oYXNPd25Qcm9wZXJ0eShoZWFkZXIpKSB7XG4gICAgICBmb3JtSGVhZGVyc1toZWFkZXIudG9Mb3dlckNhc2UoKV0gPSB1c2VySGVhZGVyc1toZWFkZXJdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmb3JtSGVhZGVycztcbn07XG5cbkZvcm1EYXRhLnByb3RvdHlwZS5zZXRCb3VuZGFyeSA9IGZ1bmN0aW9uKGJvdW5kYXJ5KSB7XG4gIHRoaXMuX2JvdW5kYXJ5ID0gYm91bmRhcnk7XG59O1xuXG5Gb3JtRGF0YS5wcm90b3R5cGUuZ2V0Qm91bmRhcnkgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLl9ib3VuZGFyeSkge1xuICAgIHRoaXMuX2dlbmVyYXRlQm91bmRhcnkoKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9ib3VuZGFyeTtcbn07XG5cbkZvcm1EYXRhLnByb3RvdHlwZS5nZXRCdWZmZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGRhdGFCdWZmZXIgPSBuZXcgQnVmZmVyLmFsbG9jKCAwICk7XG4gIHZhciBib3VuZGFyeSA9IHRoaXMuZ2V0Qm91bmRhcnkoKTtcblxuICAvLyBDcmVhdGUgdGhlIGZvcm0gY29udGVudC4gQWRkIExpbmUgYnJlYWtzIHRvIHRoZSBlbmQgb2YgZGF0YS5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuX3N0cmVhbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3N0cmVhbXNbaV0gIT09ICdmdW5jdGlvbicpIHtcblxuICAgICAgLy8gQWRkIGNvbnRlbnQgdG8gdGhlIGJ1ZmZlci5cbiAgICAgIGlmKEJ1ZmZlci5pc0J1ZmZlcih0aGlzLl9zdHJlYW1zW2ldKSkge1xuICAgICAgICBkYXRhQnVmZmVyID0gQnVmZmVyLmNvbmNhdCggW2RhdGFCdWZmZXIsIHRoaXMuX3N0cmVhbXNbaV1dKTtcbiAgICAgIH1lbHNlIHtcbiAgICAgICAgZGF0YUJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoIFtkYXRhQnVmZmVyLCBCdWZmZXIuZnJvbSh0aGlzLl9zdHJlYW1zW2ldKV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgYnJlYWsgYWZ0ZXIgY29udGVudC5cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5fc3RyZWFtc1tpXSAhPT0gJ3N0cmluZycgfHwgdGhpcy5fc3RyZWFtc1tpXS5zdWJzdHJpbmcoIDIsIGJvdW5kYXJ5Lmxlbmd0aCArIDIgKSAhPT0gYm91bmRhcnkpIHtcbiAgICAgICAgZGF0YUJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoIFtkYXRhQnVmZmVyLCBCdWZmZXIuZnJvbShGb3JtRGF0YS5MSU5FX0JSRUFLKV0gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBBZGQgdGhlIGZvb3RlciBhbmQgcmV0dXJuIHRoZSBCdWZmZXIgb2JqZWN0LlxuICByZXR1cm4gQnVmZmVyLmNvbmNhdCggW2RhdGFCdWZmZXIsIEJ1ZmZlci5mcm9tKHRoaXMuX2xhc3RCb3VuZGFyeSgpKV0gKTtcbn07XG5cbkZvcm1EYXRhLnByb3RvdHlwZS5fZ2VuZXJhdGVCb3VuZGFyeSA9IGZ1bmN0aW9uKCkge1xuICAvLyBUaGlzIGdlbmVyYXRlcyBhIDUwIGNoYXJhY3RlciBib3VuZGFyeSBzaW1pbGFyIHRvIHRob3NlIHVzZWQgYnkgRmlyZWZveC5cbiAgLy8gVGhleSBhcmUgb3B0aW1pemVkIGZvciBib3llci1tb29yZSBwYXJzaW5nLlxuICB2YXIgYm91bmRhcnkgPSAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IDI0OyBpKyspIHtcbiAgICBib3VuZGFyeSArPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMCkudG9TdHJpbmcoMTYpO1xuICB9XG5cbiAgdGhpcy5fYm91bmRhcnkgPSBib3VuZGFyeTtcbn07XG5cbi8vIE5vdGU6IGdldExlbmd0aFN5bmMgRE9FU04nVCBjYWxjdWxhdGUgc3RyZWFtcyBsZW5ndGhcbi8vIEFzIHdvcmthcm91bmQgb25lIGNhbiBjYWxjdWxhdGUgZmlsZSBzaXplIG1hbnVhbGx5XG4vLyBhbmQgYWRkIGl0IGFzIGtub3duTGVuZ3RoIG9wdGlvblxuRm9ybURhdGEucHJvdG90eXBlLmdldExlbmd0aFN5bmMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGtub3duTGVuZ3RoID0gdGhpcy5fb3ZlcmhlYWRMZW5ndGggKyB0aGlzLl92YWx1ZUxlbmd0aDtcblxuICAvLyBEb24ndCBnZXQgY29uZnVzZWQsIHRoZXJlIGFyZSAzIFwiaW50ZXJuYWxcIiBzdHJlYW1zIGZvciBlYWNoIGtleXZhbCBwYWlyXG4gIC8vIHNvIGl0IGJhc2ljYWxseSBjaGVja3MgaWYgdGhlcmUgaXMgYW55IHZhbHVlIGFkZGVkIHRvIHRoZSBmb3JtXG4gIGlmICh0aGlzLl9zdHJlYW1zLmxlbmd0aCkge1xuICAgIGtub3duTGVuZ3RoICs9IHRoaXMuX2xhc3RCb3VuZGFyeSgpLmxlbmd0aDtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mb3JtLWRhdGEvZm9ybS1kYXRhL2lzc3Vlcy80MFxuICBpZiAoIXRoaXMuaGFzS25vd25MZW5ndGgoKSkge1xuICAgIC8vIFNvbWUgYXN5bmMgbGVuZ3RoIHJldHJpZXZlcnMgYXJlIHByZXNlbnRcbiAgICAvLyB0aGVyZWZvcmUgc3luY2hyb25vdXMgbGVuZ3RoIGNhbGN1bGF0aW9uIGlzIGZhbHNlLlxuICAgIC8vIFBsZWFzZSB1c2UgZ2V0TGVuZ3RoKGNhbGxiYWNrKSB0byBnZXQgcHJvcGVyIGxlbmd0aFxuICAgIHRoaXMuX2Vycm9yKG5ldyBFcnJvcignQ2Fubm90IGNhbGN1bGF0ZSBwcm9wZXIgbGVuZ3RoIGluIHN5bmNocm9ub3VzIHdheS4nKSk7XG4gIH1cblxuICByZXR1cm4ga25vd25MZW5ndGg7XG59O1xuXG4vLyBQdWJsaWMgQVBJIHRvIGNoZWNrIGlmIGxlbmd0aCBvZiBhZGRlZCB2YWx1ZXMgaXMga25vd25cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mb3JtLWRhdGEvZm9ybS1kYXRhL2lzc3Vlcy8xOTZcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mb3JtLWRhdGEvZm9ybS1kYXRhL2lzc3Vlcy8yNjJcbkZvcm1EYXRhLnByb3RvdHlwZS5oYXNLbm93bkxlbmd0aCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaGFzS25vd25MZW5ndGggPSB0cnVlO1xuXG4gIGlmICh0aGlzLl92YWx1ZXNUb01lYXN1cmUubGVuZ3RoKSB7XG4gICAgaGFzS25vd25MZW5ndGggPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBoYXNLbm93bkxlbmd0aDtcbn07XG5cbkZvcm1EYXRhLnByb3RvdHlwZS5nZXRMZW5ndGggPSBmdW5jdGlvbihjYikge1xuICB2YXIga25vd25MZW5ndGggPSB0aGlzLl9vdmVyaGVhZExlbmd0aCArIHRoaXMuX3ZhbHVlTGVuZ3RoO1xuXG4gIGlmICh0aGlzLl9zdHJlYW1zLmxlbmd0aCkge1xuICAgIGtub3duTGVuZ3RoICs9IHRoaXMuX2xhc3RCb3VuZGFyeSgpLmxlbmd0aDtcbiAgfVxuXG4gIGlmICghdGhpcy5fdmFsdWVzVG9NZWFzdXJlLmxlbmd0aCkge1xuICAgIHByb2Nlc3MubmV4dFRpY2soY2IuYmluZCh0aGlzLCBudWxsLCBrbm93bkxlbmd0aCkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFzeW5ja2l0LnBhcmFsbGVsKHRoaXMuX3ZhbHVlc1RvTWVhc3VyZSwgdGhpcy5fbGVuZ3RoUmV0cmlldmVyLCBmdW5jdGlvbihlcnIsIHZhbHVlcykge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGNiKGVycik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24obGVuZ3RoKSB7XG4gICAgICBrbm93bkxlbmd0aCArPSBsZW5ndGg7XG4gICAgfSk7XG5cbiAgICBjYihudWxsLCBrbm93bkxlbmd0aCk7XG4gIH0pO1xufTtcblxuRm9ybURhdGEucHJvdG90eXBlLnN1Ym1pdCA9IGZ1bmN0aW9uKHBhcmFtcywgY2IpIHtcbiAgdmFyIHJlcXVlc3RcbiAgICAsIG9wdGlvbnNcbiAgICAsIGRlZmF1bHRzID0ge21ldGhvZDogJ3Bvc3QnfVxuICAgIDtcblxuICAvLyBwYXJzZSBwcm92aWRlZCB1cmwgaWYgaXQncyBzdHJpbmdcbiAgLy8gb3IgdHJlYXQgaXQgYXMgb3B0aW9ucyBvYmplY3RcbiAgaWYgKHR5cGVvZiBwYXJhbXMgPT0gJ3N0cmluZycpIHtcblxuICAgIHBhcmFtcyA9IHBhcnNlVXJsKHBhcmFtcyk7XG4gICAgb3B0aW9ucyA9IHBvcHVsYXRlKHtcbiAgICAgIHBvcnQ6IHBhcmFtcy5wb3J0LFxuICAgICAgcGF0aDogcGFyYW1zLnBhdGhuYW1lLFxuICAgICAgaG9zdDogcGFyYW1zLmhvc3RuYW1lLFxuICAgICAgcHJvdG9jb2w6IHBhcmFtcy5wcm90b2NvbFxuICAgIH0sIGRlZmF1bHRzKTtcblxuICAvLyB1c2UgY3VzdG9tIHBhcmFtc1xuICB9IGVsc2Uge1xuXG4gICAgb3B0aW9ucyA9IHBvcHVsYXRlKHBhcmFtcywgZGVmYXVsdHMpO1xuICAgIC8vIGlmIG5vIHBvcnQgcHJvdmlkZWQgdXNlIGRlZmF1bHQgb25lXG4gICAgaWYgKCFvcHRpb25zLnBvcnQpIHtcbiAgICAgIG9wdGlvbnMucG9ydCA9IG9wdGlvbnMucHJvdG9jb2wgPT0gJ2h0dHBzOicgPyA0NDMgOiA4MDtcbiAgICB9XG4gIH1cblxuICAvLyBwdXQgdGhhdCBnb29kIGNvZGUgaW4gZ2V0SGVhZGVycyB0byBzb21lIHVzZVxuICBvcHRpb25zLmhlYWRlcnMgPSB0aGlzLmdldEhlYWRlcnMocGFyYW1zLmhlYWRlcnMpO1xuXG4gIC8vIGh0dHBzIGlmIHNwZWNpZmllZCwgZmFsbGJhY2sgdG8gaHR0cCBpbiBhbnkgb3RoZXIgY2FzZVxuICBpZiAob3B0aW9ucy5wcm90b2NvbCA9PSAnaHR0cHM6Jykge1xuICAgIHJlcXVlc3QgPSBodHRwcy5yZXF1ZXN0KG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHJlcXVlc3QgPSBodHRwLnJlcXVlc3Qob3B0aW9ucyk7XG4gIH1cblxuICAvLyBnZXQgY29udGVudCBsZW5ndGggYW5kIGZpcmUgYXdheVxuICB0aGlzLmdldExlbmd0aChmdW5jdGlvbihlcnIsIGxlbmd0aCkge1xuICAgIGlmIChlcnIgJiYgZXJyICE9PSAnVW5rbm93biBzdHJlYW0nKSB7XG4gICAgICB0aGlzLl9lcnJvcihlcnIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGFkZCBjb250ZW50IGxlbmd0aFxuICAgIGlmIChsZW5ndGgpIHtcbiAgICAgIHJlcXVlc3Quc2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgdGhpcy5waXBlKHJlcXVlc3QpO1xuICAgIGlmIChjYikge1xuICAgICAgdmFyIG9uUmVzcG9uc2U7XG5cbiAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uY2UpIHtcbiAgICAgICAgcmVxdWVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBjYWxsYmFjayk7XG4gICAgICAgIHJlcXVlc3QucmVtb3ZlTGlzdGVuZXIoJ3Jlc3BvbnNlJywgb25SZXNwb25zZSk7XG5cbiAgICAgICAgcmV0dXJuIGNiLmNhbGwodGhpcywgZXJyb3IsIHJlc3BvbmNlKTtcbiAgICAgIH07XG5cbiAgICAgIG9uUmVzcG9uc2UgPSBjYWxsYmFjay5iaW5kKHRoaXMsIG51bGwpO1xuXG4gICAgICByZXF1ZXN0Lm9uKCdlcnJvcicsIGNhbGxiYWNrKTtcbiAgICAgIHJlcXVlc3Qub24oJ3Jlc3BvbnNlJywgb25SZXNwb25zZSk7XG4gICAgfVxuICB9LmJpbmQodGhpcykpO1xuXG4gIHJldHVybiByZXF1ZXN0O1xufTtcblxuRm9ybURhdGEucHJvdG90eXBlLl9lcnJvciA9IGZ1bmN0aW9uKGVycikge1xuICBpZiAoIXRoaXMuZXJyb3IpIHtcbiAgICB0aGlzLmVycm9yID0gZXJyO1xuICAgIHRoaXMucGF1c2UoKTtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgfVxufTtcblxuRm9ybURhdGEucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ1tvYmplY3QgRm9ybURhdGFdJztcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6882\n")},2275:module=>{eval("// populates missing values\nmodule.exports = function(dst, src) {\n\n Object.keys(src).forEach(function(prop)\n {\n dst[prop] = dst[prop] || src[prop];\n });\n\n return dst;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI3NS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2Zvcm0tZGF0YS9saWIvcG9wdWxhdGUuanM/MTIxMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwb3B1bGF0ZXMgbWlzc2luZyB2YWx1ZXNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZHN0LCBzcmMpIHtcblxuICBPYmplY3Qua2V5cyhzcmMpLmZvckVhY2goZnVuY3Rpb24ocHJvcClcbiAge1xuICAgIGRzdFtwcm9wXSA9IGRzdFtwcm9wXSB8fCBzcmNbcHJvcF07XG4gIH0pO1xuXG4gIHJldHVybiBkc3Q7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2275\n")},7268:(module,__unused_webpack_exports,__webpack_require__)=>{eval("module.exports = (__webpack_require__(7147).constants) || __webpack_require__(2057)\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzI2OC5qcyIsIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIscUNBQXVCLElBQUksbUJBQU8sQ0FBQyxJQUFXIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvZnMtY29uc3RhbnRzL2luZGV4LmpzPzliMDEiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdmcycpLmNvbnN0YW50cyB8fCByZXF1aXJlKCdjb25zdGFudHMnKVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7268\n")},7334:(module,__unused_webpack_exports,__webpack_require__)=>{eval("module.exports = realpath\nrealpath.realpath = realpath\nrealpath.sync = realpathSync\nrealpath.realpathSync = realpathSync\nrealpath.monkeypatch = monkeypatch\nrealpath.unmonkeypatch = unmonkeypatch\n\nvar fs = __webpack_require__(7147)\nvar origRealpath = fs.realpath\nvar origRealpathSync = fs.realpathSync\n\nvar version = process.version\nvar ok = /^v[0-5]\\./.test(version)\nvar old = __webpack_require__(7059)\n\nfunction newError (er) {\n return er && er.syscall === 'realpath' && (\n er.code === 'ELOOP' ||\n er.code === 'ENOMEM' ||\n er.code === 'ENAMETOOLONG'\n )\n}\n\nfunction realpath (p, cache, cb) {\n if (ok) {\n return origRealpath(p, cache, cb)\n }\n\n if (typeof cache === 'function') {\n cb = cache\n cache = null\n }\n origRealpath(p, cache, function (er, result) {\n if (newError(er)) {\n old.realpath(p, cache, cb)\n } else {\n cb(er, result)\n }\n })\n}\n\nfunction realpathSync (p, cache) {\n if (ok) {\n return origRealpathSync(p, cache)\n }\n\n try {\n return origRealpathSync(p, cache)\n } catch (er) {\n if (newError(er)) {\n return old.realpathSync(p, cache)\n } else {\n throw er\n }\n }\n}\n\nfunction monkeypatch () {\n fs.realpath = realpath\n fs.realpathSync = realpathSync\n}\n\nfunction unmonkeypatch () {\n fs.realpath = origRealpath\n fs.realpathSync = origRealpathSync\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzMzNC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUyxtQkFBTyxDQUFDLElBQUk7QUFDckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVSxtQkFBTyxDQUFDLElBQVU7O0FBRTVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvZnMucmVhbHBhdGgvaW5kZXguanM/NjkzMiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHJlYWxwYXRoXG5yZWFscGF0aC5yZWFscGF0aCA9IHJlYWxwYXRoXG5yZWFscGF0aC5zeW5jID0gcmVhbHBhdGhTeW5jXG5yZWFscGF0aC5yZWFscGF0aFN5bmMgPSByZWFscGF0aFN5bmNcbnJlYWxwYXRoLm1vbmtleXBhdGNoID0gbW9ua2V5cGF0Y2hcbnJlYWxwYXRoLnVubW9ua2V5cGF0Y2ggPSB1bm1vbmtleXBhdGNoXG5cbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJylcbnZhciBvcmlnUmVhbHBhdGggPSBmcy5yZWFscGF0aFxudmFyIG9yaWdSZWFscGF0aFN5bmMgPSBmcy5yZWFscGF0aFN5bmNcblxudmFyIHZlcnNpb24gPSBwcm9jZXNzLnZlcnNpb25cbnZhciBvayA9IC9edlswLTVdXFwuLy50ZXN0KHZlcnNpb24pXG52YXIgb2xkID0gcmVxdWlyZSgnLi9vbGQuanMnKVxuXG5mdW5jdGlvbiBuZXdFcnJvciAoZXIpIHtcbiAgcmV0dXJuIGVyICYmIGVyLnN5c2NhbGwgPT09ICdyZWFscGF0aCcgJiYgKFxuICAgIGVyLmNvZGUgPT09ICdFTE9PUCcgfHxcbiAgICBlci5jb2RlID09PSAnRU5PTUVNJyB8fFxuICAgIGVyLmNvZGUgPT09ICdFTkFNRVRPT0xPTkcnXG4gIClcbn1cblxuZnVuY3Rpb24gcmVhbHBhdGggKHAsIGNhY2hlLCBjYikge1xuICBpZiAob2spIHtcbiAgICByZXR1cm4gb3JpZ1JlYWxwYXRoKHAsIGNhY2hlLCBjYilcbiAgfVxuXG4gIGlmICh0eXBlb2YgY2FjaGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGNhY2hlXG4gICAgY2FjaGUgPSBudWxsXG4gIH1cbiAgb3JpZ1JlYWxwYXRoKHAsIGNhY2hlLCBmdW5jdGlvbiAoZXIsIHJlc3VsdCkge1xuICAgIGlmIChuZXdFcnJvcihlcikpIHtcbiAgICAgIG9sZC5yZWFscGF0aChwLCBjYWNoZSwgY2IpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNiKGVyLCByZXN1bHQpXG4gICAgfVxuICB9KVxufVxuXG5mdW5jdGlvbiByZWFscGF0aFN5bmMgKHAsIGNhY2hlKSB7XG4gIGlmIChvaykge1xuICAgIHJldHVybiBvcmlnUmVhbHBhdGhTeW5jKHAsIGNhY2hlKVxuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gb3JpZ1JlYWxwYXRoU3luYyhwLCBjYWNoZSlcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICBpZiAobmV3RXJyb3IoZXIpKSB7XG4gICAgICByZXR1cm4gb2xkLnJlYWxwYXRoU3luYyhwLCBjYWNoZSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZXJcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW9ua2V5cGF0Y2ggKCkge1xuICBmcy5yZWFscGF0aCA9IHJlYWxwYXRoXG4gIGZzLnJlYWxwYXRoU3luYyA9IHJlYWxwYXRoU3luY1xufVxuXG5mdW5jdGlvbiB1bm1vbmtleXBhdGNoICgpIHtcbiAgZnMucmVhbHBhdGggPSBvcmlnUmVhbHBhdGhcbiAgZnMucmVhbHBhdGhTeW5jID0gb3JpZ1JlYWxwYXRoU3luY1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7334\n")},7059:(__unused_webpack_module,exports,__webpack_require__)=>{eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar pathModule = __webpack_require__(1017);\nvar isWindows = process.platform === 'win32';\nvar fs = __webpack_require__(7147);\n\n// JavaScript implementation of realpath, ported from node pre-v6\n\nvar DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG);\n\nfunction rethrow() {\n // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and\n // is fairly slow to generate.\n var callback;\n if (DEBUG) {\n var backtrace = new Error;\n callback = debugCallback;\n } else\n callback = missingCallback;\n\n return callback;\n\n function debugCallback(err) {\n if (err) {\n backtrace.message = err.message;\n err = backtrace;\n missingCallback(err);\n }\n }\n\n function missingCallback(err) {\n if (err) {\n if (process.throwDeprecation)\n throw err; // Forgot a callback but don't know where? Use NODE_DEBUG=fs\n else if (!process.noDeprecation) {\n var msg = 'fs: missing callback ' + (err.stack || err.message);\n if (process.traceDeprecation)\n console.trace(msg);\n else\n console.error(msg);\n }\n }\n }\n}\n\nfunction maybeCallback(cb) {\n return typeof cb === 'function' ? cb : rethrow();\n}\n\nvar normalize = pathModule.normalize;\n\n// Regexp that finds the next partion of a (partial) path\n// result is [base_with_slash, base], e.g. ['somedir/', 'somedir']\nif (isWindows) {\n var nextPartRe = /(.*?)(?:[\\/\\\\]+|$)/g;\n} else {\n var nextPartRe = /(.*?)(?:[\\/]+|$)/g;\n}\n\n// Regex to find the device root, including trailing slash. E.g. 'c:\\\\'.\nif (isWindows) {\n var splitRootRe = /^(?:[a-zA-Z]:|[\\\\\\/]{2}[^\\\\\\/]+[\\\\\\/][^\\\\\\/]+)?[\\\\\\/]*/;\n} else {\n var splitRootRe = /^[\\/]*/;\n}\n\nexports.realpathSync = function realpathSync(p, cache) {\n // make p is absolute\n p = pathModule.resolve(p);\n\n if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {\n return cache[p];\n }\n\n var original = p,\n seenLinks = {},\n knownHard = {};\n\n // current character position in p\n var pos;\n // the partial path so far, including a trailing slash if any\n var current;\n // the partial path without a trailing slash (except when pointing at a root)\n var base;\n // the partial path scanned in the previous round, with slash\n var previous;\n\n start();\n\n function start() {\n // Skip over roots\n var m = splitRootRe.exec(p);\n pos = m[0].length;\n current = m[0];\n base = m[0];\n previous = '';\n\n // On windows, check that the root exists. On unix there is no need.\n if (isWindows && !knownHard[base]) {\n fs.lstatSync(base);\n knownHard[base] = true;\n }\n }\n\n // walk down the path, swapping out linked pathparts for their real\n // values\n // NB: p.length changes.\n while (pos < p.length) {\n // find the next part\n nextPartRe.lastIndex = pos;\n var result = nextPartRe.exec(p);\n previous = current;\n current += result[0];\n base = previous + result[1];\n pos = nextPartRe.lastIndex;\n\n // continue if not a symlink\n if (knownHard[base] || (cache && cache[base] === base)) {\n continue;\n }\n\n var resolvedLink;\n if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {\n // some known symbolic link. no need to stat again.\n resolvedLink = cache[base];\n } else {\n var stat = fs.lstatSync(base);\n if (!stat.isSymbolicLink()) {\n knownHard[base] = true;\n if (cache) cache[base] = base;\n continue;\n }\n\n // read the link if it wasn't read before\n // dev/ino always return 0 on windows, so skip the check.\n var linkTarget = null;\n if (!isWindows) {\n var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);\n if (seenLinks.hasOwnProperty(id)) {\n linkTarget = seenLinks[id];\n }\n }\n if (linkTarget === null) {\n fs.statSync(base);\n linkTarget = fs.readlinkSync(base);\n }\n resolvedLink = pathModule.resolve(previous, linkTarget);\n // track this, if given a cache.\n if (cache) cache[base] = resolvedLink;\n if (!isWindows) seenLinks[id] = linkTarget;\n }\n\n // resolve the link, then start over\n p = pathModule.resolve(resolvedLink, p.slice(pos));\n start();\n }\n\n if (cache) cache[original] = p;\n\n return p;\n};\n\n\nexports.realpath = function realpath(p, cache, cb) {\n if (typeof cb !== 'function') {\n cb = maybeCallback(cache);\n cache = null;\n }\n\n // make p is absolute\n p = pathModule.resolve(p);\n\n if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {\n return process.nextTick(cb.bind(null, null, cache[p]));\n }\n\n var original = p,\n seenLinks = {},\n knownHard = {};\n\n // current character position in p\n var pos;\n // the partial path so far, including a trailing slash if any\n var current;\n // the partial path without a trailing slash (except when pointing at a root)\n var base;\n // the partial path scanned in the previous round, with slash\n var previous;\n\n start();\n\n function start() {\n // Skip over roots\n var m = splitRootRe.exec(p);\n pos = m[0].length;\n current = m[0];\n base = m[0];\n previous = '';\n\n // On windows, check that the root exists. On unix there is no need.\n if (isWindows && !knownHard[base]) {\n fs.lstat(base, function(err) {\n if (err) return cb(err);\n knownHard[base] = true;\n LOOP();\n });\n } else {\n process.nextTick(LOOP);\n }\n }\n\n // walk down the path, swapping out linked pathparts for their real\n // values\n function LOOP() {\n // stop if scanned past end of path\n if (pos >= p.length) {\n if (cache) cache[original] = p;\n return cb(null, p);\n }\n\n // find the next part\n nextPartRe.lastIndex = pos;\n var result = nextPartRe.exec(p);\n previous = current;\n current += result[0];\n base = previous + result[1];\n pos = nextPartRe.lastIndex;\n\n // continue if not a symlink\n if (knownHard[base] || (cache && cache[base] === base)) {\n return process.nextTick(LOOP);\n }\n\n if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {\n // known symbolic link. no need to stat again.\n return gotResolvedLink(cache[base]);\n }\n\n return fs.lstat(base, gotStat);\n }\n\n function gotStat(err, stat) {\n if (err) return cb(err);\n\n // if not a symlink, skip to the next path part\n if (!stat.isSymbolicLink()) {\n knownHard[base] = true;\n if (cache) cache[base] = base;\n return process.nextTick(LOOP);\n }\n\n // stat & read the link if not read before\n // call gotTarget as soon as the link target is known\n // dev/ino always return 0 on windows, so skip the check.\n if (!isWindows) {\n var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);\n if (seenLinks.hasOwnProperty(id)) {\n return gotTarget(null, seenLinks[id], base);\n }\n }\n fs.stat(base, function(err) {\n if (err) return cb(err);\n\n fs.readlink(base, function(err, target) {\n if (!isWindows) seenLinks[id] = target;\n gotTarget(err, target);\n });\n });\n }\n\n function gotTarget(err, target, base) {\n if (err) return cb(err);\n\n var resolvedLink = pathModule.resolve(previous, target);\n if (cache) cache[base] = resolvedLink;\n gotResolvedLink(resolvedLink);\n }\n\n function gotResolvedLink(resolvedLink) {\n // resolve the link, then start over\n p = pathModule.resolve(resolvedLink, p.slice(pos));\n start();\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzA1OS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLElBQU07QUFDL0I7QUFDQSxTQUFTLG1CQUFPLENBQUMsSUFBSTs7QUFFckI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwQ0FBMEMsRUFBRTtBQUM1QyxFQUFFO0FBQ0Y7QUFDQTs7QUFFQSxvQkFBb0I7QUFDcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0I7QUFDcEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7OztBQUdBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQjtBQUNwQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9mcy5yZWFscGF0aC9vbGQuanM/NzBiMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIHBhdGhNb2R1bGUgPSByZXF1aXJlKCdwYXRoJyk7XG52YXIgaXNXaW5kb3dzID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5cbi8vIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgcmVhbHBhdGgsIHBvcnRlZCBmcm9tIG5vZGUgcHJlLXY2XG5cbnZhciBERUJVRyA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgJiYgL2ZzLy50ZXN0KHByb2Nlc3MuZW52Lk5PREVfREVCVUcpO1xuXG5mdW5jdGlvbiByZXRocm93KCkge1xuICAvLyBPbmx5IGVuYWJsZSBpbiBkZWJ1ZyBtb2RlLiBBIGJhY2t0cmFjZSB1c2VzIH4xMDAwIGJ5dGVzIG9mIGhlYXAgc3BhY2UgYW5kXG4gIC8vIGlzIGZhaXJseSBzbG93IHRvIGdlbmVyYXRlLlxuICB2YXIgY2FsbGJhY2s7XG4gIGlmIChERUJVRykge1xuICAgIHZhciBiYWNrdHJhY2UgPSBuZXcgRXJyb3I7XG4gICAgY2FsbGJhY2sgPSBkZWJ1Z0NhbGxiYWNrO1xuICB9IGVsc2VcbiAgICBjYWxsYmFjayA9IG1pc3NpbmdDYWxsYmFjaztcblxuICByZXR1cm4gY2FsbGJhY2s7XG5cbiAgZnVuY3Rpb24gZGVidWdDYWxsYmFjayhlcnIpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBiYWNrdHJhY2UubWVzc2FnZSA9IGVyci5tZXNzYWdlO1xuICAgICAgZXJyID0gYmFja3RyYWNlO1xuICAgICAgbWlzc2luZ0NhbGxiYWNrKGVycik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWlzc2luZ0NhbGxiYWNrKGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGlmIChwcm9jZXNzLnRocm93RGVwcmVjYXRpb24pXG4gICAgICAgIHRocm93IGVycjsgIC8vIEZvcmdvdCBhIGNhbGxiYWNrIGJ1dCBkb24ndCBrbm93IHdoZXJlPyBVc2UgTk9ERV9ERUJVRz1mc1xuICAgICAgZWxzZSBpZiAoIXByb2Nlc3Mubm9EZXByZWNhdGlvbikge1xuICAgICAgICB2YXIgbXNnID0gJ2ZzOiBtaXNzaW5nIGNhbGxiYWNrICcgKyAoZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlKTtcbiAgICAgICAgaWYgKHByb2Nlc3MudHJhY2VEZXByZWNhdGlvbilcbiAgICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1heWJlQ2FsbGJhY2soY2IpIHtcbiAgcmV0dXJuIHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJyA/IGNiIDogcmV0aHJvdygpO1xufVxuXG52YXIgbm9ybWFsaXplID0gcGF0aE1vZHVsZS5ub3JtYWxpemU7XG5cbi8vIFJlZ2V4cCB0aGF0IGZpbmRzIHRoZSBuZXh0IHBhcnRpb24gb2YgYSAocGFydGlhbCkgcGF0aFxuLy8gcmVzdWx0IGlzIFtiYXNlX3dpdGhfc2xhc2gsIGJhc2VdLCBlLmcuIFsnc29tZWRpci8nLCAnc29tZWRpciddXG5pZiAoaXNXaW5kb3dzKSB7XG4gIHZhciBuZXh0UGFydFJlID0gLyguKj8pKD86W1xcL1xcXFxdK3wkKS9nO1xufSBlbHNlIHtcbiAgdmFyIG5leHRQYXJ0UmUgPSAvKC4qPykoPzpbXFwvXSt8JCkvZztcbn1cblxuLy8gUmVnZXggdG8gZmluZCB0aGUgZGV2aWNlIHJvb3QsIGluY2x1ZGluZyB0cmFpbGluZyBzbGFzaC4gRS5nLiAnYzpcXFxcJy5cbmlmIChpc1dpbmRvd3MpIHtcbiAgdmFyIHNwbGl0Um9vdFJlID0gL14oPzpbYS16QS1aXTp8W1xcXFxcXC9dezJ9W15cXFxcXFwvXStbXFxcXFxcL11bXlxcXFxcXC9dKyk/W1xcXFxcXC9dKi87XG59IGVsc2Uge1xuICB2YXIgc3BsaXRSb290UmUgPSAvXltcXC9dKi87XG59XG5cbmV4cG9ydHMucmVhbHBhdGhTeW5jID0gZnVuY3Rpb24gcmVhbHBhdGhTeW5jKHAsIGNhY2hlKSB7XG4gIC8vIG1ha2UgcCBpcyBhYnNvbHV0ZVxuICBwID0gcGF0aE1vZHVsZS5yZXNvbHZlKHApO1xuXG4gIGlmIChjYWNoZSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY2FjaGUsIHApKSB7XG4gICAgcmV0dXJuIGNhY2hlW3BdO1xuICB9XG5cbiAgdmFyIG9yaWdpbmFsID0gcCxcbiAgICAgIHNlZW5MaW5rcyA9IHt9LFxuICAgICAga25vd25IYXJkID0ge307XG5cbiAgLy8gY3VycmVudCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gcFxuICB2YXIgcG9zO1xuICAvLyB0aGUgcGFydGlhbCBwYXRoIHNvIGZhciwgaW5jbHVkaW5nIGEgdHJhaWxpbmcgc2xhc2ggaWYgYW55XG4gIHZhciBjdXJyZW50O1xuICAvLyB0aGUgcGFydGlhbCBwYXRoIHdpdGhvdXQgYSB0cmFpbGluZyBzbGFzaCAoZXhjZXB0IHdoZW4gcG9pbnRpbmcgYXQgYSByb290KVxuICB2YXIgYmFzZTtcbiAgLy8gdGhlIHBhcnRpYWwgcGF0aCBzY2FubmVkIGluIHRoZSBwcmV2aW91cyByb3VuZCwgd2l0aCBzbGFzaFxuICB2YXIgcHJldmlvdXM7XG5cbiAgc3RhcnQoKTtcblxuICBmdW5jdGlvbiBzdGFydCgpIHtcbiAgICAvLyBTa2lwIG92ZXIgcm9vdHNcbiAgICB2YXIgbSA9IHNwbGl0Um9vdFJlLmV4ZWMocCk7XG4gICAgcG9zID0gbVswXS5sZW5ndGg7XG4gICAgY3VycmVudCA9IG1bMF07XG4gICAgYmFzZSA9IG1bMF07XG4gICAgcHJldmlvdXMgPSAnJztcblxuICAgIC8vIE9uIHdpbmRvd3MsIGNoZWNrIHRoYXQgdGhlIHJvb3QgZXhpc3RzLiBPbiB1bml4IHRoZXJlIGlzIG5vIG5lZWQuXG4gICAgaWYgKGlzV2luZG93cyAmJiAha25vd25IYXJkW2Jhc2VdKSB7XG4gICAgICBmcy5sc3RhdFN5bmMoYmFzZSk7XG4gICAgICBrbm93bkhhcmRbYmFzZV0gPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIHdhbGsgZG93biB0aGUgcGF0aCwgc3dhcHBpbmcgb3V0IGxpbmtlZCBwYXRocGFydHMgZm9yIHRoZWlyIHJlYWxcbiAgLy8gdmFsdWVzXG4gIC8vIE5COiBwLmxlbmd0aCBjaGFuZ2VzLlxuICB3aGlsZSAocG9zIDwgcC5sZW5ndGgpIHtcbiAgICAvLyBmaW5kIHRoZSBuZXh0IHBhcnRcbiAgICBuZXh0UGFydFJlLmxhc3RJbmRleCA9IHBvcztcbiAgICB2YXIgcmVzdWx0ID0gbmV4dFBhcnRSZS5leGVjKHApO1xuICAgIHByZXZpb3VzID0gY3VycmVudDtcbiAgICBjdXJyZW50ICs9IHJlc3VsdFswXTtcbiAgICBiYXNlID0gcHJldmlvdXMgKyByZXN1bHRbMV07XG4gICAgcG9zID0gbmV4dFBhcnRSZS5sYXN0SW5kZXg7XG5cbiAgICAvLyBjb250aW51ZSBpZiBub3QgYSBzeW1saW5rXG4gICAgaWYgKGtub3duSGFyZFtiYXNlXSB8fCAoY2FjaGUgJiYgY2FjaGVbYmFzZV0gPT09IGJhc2UpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgcmVzb2x2ZWRMaW5rO1xuICAgIGlmIChjYWNoZSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY2FjaGUsIGJhc2UpKSB7XG4gICAgICAvLyBzb21lIGtub3duIHN5bWJvbGljIGxpbmsuICBubyBuZWVkIHRvIHN0YXQgYWdhaW4uXG4gICAgICByZXNvbHZlZExpbmsgPSBjYWNoZVtiYXNlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHN0YXQgPSBmcy5sc3RhdFN5bmMoYmFzZSk7XG4gICAgICBpZiAoIXN0YXQuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgICBrbm93bkhhcmRbYmFzZV0gPSB0cnVlO1xuICAgICAgICBpZiAoY2FjaGUpIGNhY2hlW2Jhc2VdID0gYmFzZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHJlYWQgdGhlIGxpbmsgaWYgaXQgd2Fzbid0IHJlYWQgYmVmb3JlXG4gICAgICAvLyBkZXYvaW5vIGFsd2F5cyByZXR1cm4gMCBvbiB3aW5kb3dzLCBzbyBza2lwIHRoZSBjaGVjay5cbiAgICAgIHZhciBsaW5rVGFyZ2V0ID0gbnVsbDtcbiAgICAgIGlmICghaXNXaW5kb3dzKSB7XG4gICAgICAgIHZhciBpZCA9IHN0YXQuZGV2LnRvU3RyaW5nKDMyKSArICc6JyArIHN0YXQuaW5vLnRvU3RyaW5nKDMyKTtcbiAgICAgICAgaWYgKHNlZW5MaW5rcy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICBsaW5rVGFyZ2V0ID0gc2VlbkxpbmtzW2lkXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxpbmtUYXJnZXQgPT09IG51bGwpIHtcbiAgICAgICAgZnMuc3RhdFN5bmMoYmFzZSk7XG4gICAgICAgIGxpbmtUYXJnZXQgPSBmcy5yZWFkbGlua1N5bmMoYmFzZSk7XG4gICAgICB9XG4gICAgICByZXNvbHZlZExpbmsgPSBwYXRoTW9kdWxlLnJlc29sdmUocHJldmlvdXMsIGxpbmtUYXJnZXQpO1xuICAgICAgLy8gdHJhY2sgdGhpcywgaWYgZ2l2ZW4gYSBjYWNoZS5cbiAgICAgIGlmIChjYWNoZSkgY2FjaGVbYmFzZV0gPSByZXNvbHZlZExpbms7XG4gICAgICBpZiAoIWlzV2luZG93cykgc2VlbkxpbmtzW2lkXSA9IGxpbmtUYXJnZXQ7XG4gICAgfVxuXG4gICAgLy8gcmVzb2x2ZSB0aGUgbGluaywgdGhlbiBzdGFydCBvdmVyXG4gICAgcCA9IHBhdGhNb2R1bGUucmVzb2x2ZShyZXNvbHZlZExpbmssIHAuc2xpY2UocG9zKSk7XG4gICAgc3RhcnQoKTtcbiAgfVxuXG4gIGlmIChjYWNoZSkgY2FjaGVbb3JpZ2luYWxdID0gcDtcblxuICByZXR1cm4gcDtcbn07XG5cblxuZXhwb3J0cy5yZWFscGF0aCA9IGZ1bmN0aW9uIHJlYWxwYXRoKHAsIGNhY2hlLCBjYikge1xuICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBtYXliZUNhbGxiYWNrKGNhY2hlKTtcbiAgICBjYWNoZSA9IG51bGw7XG4gIH1cblxuICAvLyBtYWtlIHAgaXMgYWJzb2x1dGVcbiAgcCA9IHBhdGhNb2R1bGUucmVzb2x2ZShwKTtcblxuICBpZiAoY2FjaGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNhY2hlLCBwKSkge1xuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGNiLmJpbmQobnVsbCwgbnVsbCwgY2FjaGVbcF0pKTtcbiAgfVxuXG4gIHZhciBvcmlnaW5hbCA9IHAsXG4gICAgICBzZWVuTGlua3MgPSB7fSxcbiAgICAgIGtub3duSGFyZCA9IHt9O1xuXG4gIC8vIGN1cnJlbnQgY2hhcmFjdGVyIHBvc2l0aW9uIGluIHBcbiAgdmFyIHBvcztcbiAgLy8gdGhlIHBhcnRpYWwgcGF0aCBzbyBmYXIsIGluY2x1ZGluZyBhIHRyYWlsaW5nIHNsYXNoIGlmIGFueVxuICB2YXIgY3VycmVudDtcbiAgLy8gdGhlIHBhcnRpYWwgcGF0aCB3aXRob3V0IGEgdHJhaWxpbmcgc2xhc2ggKGV4Y2VwdCB3aGVuIHBvaW50aW5nIGF0IGEgcm9vdClcbiAgdmFyIGJhc2U7XG4gIC8vIHRoZSBwYXJ0aWFsIHBhdGggc2Nhbm5lZCBpbiB0aGUgcHJldmlvdXMgcm91bmQsIHdpdGggc2xhc2hcbiAgdmFyIHByZXZpb3VzO1xuXG4gIHN0YXJ0KCk7XG5cbiAgZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgLy8gU2tpcCBvdmVyIHJvb3RzXG4gICAgdmFyIG0gPSBzcGxpdFJvb3RSZS5leGVjKHApO1xuICAgIHBvcyA9IG1bMF0ubGVuZ3RoO1xuICAgIGN1cnJlbnQgPSBtWzBdO1xuICAgIGJhc2UgPSBtWzBdO1xuICAgIHByZXZpb3VzID0gJyc7XG5cbiAgICAvLyBPbiB3aW5kb3dzLCBjaGVjayB0aGF0IHRoZSByb290IGV4aXN0cy4gT24gdW5peCB0aGVyZSBpcyBubyBuZWVkLlxuICAgIGlmIChpc1dpbmRvd3MgJiYgIWtub3duSGFyZFtiYXNlXSkge1xuICAgICAgZnMubHN0YXQoYmFzZSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpO1xuICAgICAgICBrbm93bkhhcmRbYmFzZV0gPSB0cnVlO1xuICAgICAgICBMT09QKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhMT09QKTtcbiAgICB9XG4gIH1cblxuICAvLyB3YWxrIGRvd24gdGhlIHBhdGgsIHN3YXBwaW5nIG91dCBsaW5rZWQgcGF0aHBhcnRzIGZvciB0aGVpciByZWFsXG4gIC8vIHZhbHVlc1xuICBmdW5jdGlvbiBMT09QKCkge1xuICAgIC8vIHN0b3AgaWYgc2Nhbm5lZCBwYXN0IGVuZCBvZiBwYXRoXG4gICAgaWYgKHBvcyA+PSBwLmxlbmd0aCkge1xuICAgICAgaWYgKGNhY2hlKSBjYWNoZVtvcmlnaW5hbF0gPSBwO1xuICAgICAgcmV0dXJuIGNiKG51bGwsIHApO1xuICAgIH1cblxuICAgIC8vIGZpbmQgdGhlIG5leHQgcGFydFxuICAgIG5leHRQYXJ0UmUubGFzdEluZGV4ID0gcG9zO1xuICAgIHZhciByZXN1bHQgPSBuZXh0UGFydFJlLmV4ZWMocCk7XG4gICAgcHJldmlvdXMgPSBjdXJyZW50O1xuICAgIGN1cnJlbnQgKz0gcmVzdWx0WzBdO1xuICAgIGJhc2UgPSBwcmV2aW91cyArIHJlc3VsdFsxXTtcbiAgICBwb3MgPSBuZXh0UGFydFJlLmxhc3RJbmRleDtcblxuICAgIC8vIGNvbnRpbnVlIGlmIG5vdCBhIHN5bWxpbmtcbiAgICBpZiAoa25vd25IYXJkW2Jhc2VdIHx8IChjYWNoZSAmJiBjYWNoZVtiYXNlXSA9PT0gYmFzZSkpIHtcbiAgICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKExPT1ApO1xuICAgIH1cblxuICAgIGlmIChjYWNoZSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY2FjaGUsIGJhc2UpKSB7XG4gICAgICAvLyBrbm93biBzeW1ib2xpYyBsaW5rLiAgbm8gbmVlZCB0byBzdGF0IGFnYWluLlxuICAgICAgcmV0dXJuIGdvdFJlc29sdmVkTGluayhjYWNoZVtiYXNlXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZzLmxzdGF0KGJhc2UsIGdvdFN0YXQpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ290U3RhdChlcnIsIHN0YXQpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKTtcblxuICAgIC8vIGlmIG5vdCBhIHN5bWxpbmssIHNraXAgdG8gdGhlIG5leHQgcGF0aCBwYXJ0XG4gICAgaWYgKCFzdGF0LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgIGtub3duSGFyZFtiYXNlXSA9IHRydWU7XG4gICAgICBpZiAoY2FjaGUpIGNhY2hlW2Jhc2VdID0gYmFzZTtcbiAgICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKExPT1ApO1xuICAgIH1cblxuICAgIC8vIHN0YXQgJiByZWFkIHRoZSBsaW5rIGlmIG5vdCByZWFkIGJlZm9yZVxuICAgIC8vIGNhbGwgZ290VGFyZ2V0IGFzIHNvb24gYXMgdGhlIGxpbmsgdGFyZ2V0IGlzIGtub3duXG4gICAgLy8gZGV2L2lubyBhbHdheXMgcmV0dXJuIDAgb24gd2luZG93cywgc28gc2tpcCB0aGUgY2hlY2suXG4gICAgaWYgKCFpc1dpbmRvd3MpIHtcbiAgICAgIHZhciBpZCA9IHN0YXQuZGV2LnRvU3RyaW5nKDMyKSArICc6JyArIHN0YXQuaW5vLnRvU3RyaW5nKDMyKTtcbiAgICAgIGlmIChzZWVuTGlua3MuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgICAgIHJldHVybiBnb3RUYXJnZXQobnVsbCwgc2VlbkxpbmtzW2lkXSwgYmFzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZzLnN0YXQoYmFzZSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKTtcblxuICAgICAgZnMucmVhZGxpbmsoYmFzZSwgZnVuY3Rpb24oZXJyLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKCFpc1dpbmRvd3MpIHNlZW5MaW5rc1tpZF0gPSB0YXJnZXQ7XG4gICAgICAgIGdvdFRhcmdldChlcnIsIHRhcmdldCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdvdFRhcmdldChlcnIsIHRhcmdldCwgYmFzZSkge1xuICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpO1xuXG4gICAgdmFyIHJlc29sdmVkTGluayA9IHBhdGhNb2R1bGUucmVzb2x2ZShwcmV2aW91cywgdGFyZ2V0KTtcbiAgICBpZiAoY2FjaGUpIGNhY2hlW2Jhc2VdID0gcmVzb2x2ZWRMaW5rO1xuICAgIGdvdFJlc29sdmVkTGluayhyZXNvbHZlZExpbmspO1xuICB9XG5cbiAgZnVuY3Rpb24gZ290UmVzb2x2ZWRMaW5rKHJlc29sdmVkTGluaykge1xuICAgIC8vIHJlc29sdmUgdGhlIGxpbmssIHRoZW4gc3RhcnQgb3ZlclxuICAgIHAgPSBwYXRoTW9kdWxlLnJlc29sdmUocmVzb2x2ZWRMaW5rLCBwLnNsaWNlKHBvcykpO1xuICAgIHN0YXJ0KCk7XG4gIH1cbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7059\n")},6772:(__unused_webpack_module,exports,__webpack_require__)=>{eval("exports.setopts = setopts\nexports.ownProp = ownProp\nexports.makeAbs = makeAbs\nexports.finish = finish\nexports.mark = mark\nexports.isIgnored = isIgnored\nexports.childrenIgnored = childrenIgnored\n\nfunction ownProp (obj, field) {\n return Object.prototype.hasOwnProperty.call(obj, field)\n}\n\nvar fs = __webpack_require__(7147)\nvar path = __webpack_require__(1017)\nvar minimatch = __webpack_require__(1171)\nvar isAbsolute = __webpack_require__(4095)\nvar Minimatch = minimatch.Minimatch\n\nfunction alphasort (a, b) {\n return a.localeCompare(b, 'en')\n}\n\nfunction setupIgnores (self, options) {\n self.ignore = options.ignore || []\n\n if (!Array.isArray(self.ignore))\n self.ignore = [self.ignore]\n\n if (self.ignore.length) {\n self.ignore = self.ignore.map(ignoreMap)\n }\n}\n\n// ignore patterns are always in dot:true mode.\nfunction ignoreMap (pattern) {\n var gmatcher = null\n if (pattern.slice(-3) === '/**') {\n var gpattern = pattern.replace(/(\\/\\*\\*)+$/, '')\n gmatcher = new Minimatch(gpattern, { dot: true })\n }\n\n return {\n matcher: new Minimatch(pattern, { dot: true }),\n gmatcher: gmatcher\n }\n}\n\nfunction setopts (self, pattern, options) {\n if (!options)\n options = {}\n\n // base-matching: just use globstar for that.\n if (options.matchBase && -1 === pattern.indexOf(\"/\")) {\n if (options.noglobstar) {\n throw new Error(\"base matching requires globstar\")\n }\n pattern = \"**/\" + pattern\n }\n\n self.silent = !!options.silent\n self.pattern = pattern\n self.strict = options.strict !== false\n self.realpath = !!options.realpath\n self.realpathCache = options.realpathCache || Object.create(null)\n self.follow = !!options.follow\n self.dot = !!options.dot\n self.mark = !!options.mark\n self.nodir = !!options.nodir\n if (self.nodir)\n self.mark = true\n self.sync = !!options.sync\n self.nounique = !!options.nounique\n self.nonull = !!options.nonull\n self.nosort = !!options.nosort\n self.nocase = !!options.nocase\n self.stat = !!options.stat\n self.noprocess = !!options.noprocess\n self.absolute = !!options.absolute\n self.fs = options.fs || fs\n\n self.maxLength = options.maxLength || Infinity\n self.cache = options.cache || Object.create(null)\n self.statCache = options.statCache || Object.create(null)\n self.symlinks = options.symlinks || Object.create(null)\n\n setupIgnores(self, options)\n\n self.changedCwd = false\n var cwd = process.cwd()\n if (!ownProp(options, \"cwd\"))\n self.cwd = cwd\n else {\n self.cwd = path.resolve(options.cwd)\n self.changedCwd = self.cwd !== cwd\n }\n\n self.root = options.root || path.resolve(self.cwd, \"/\")\n self.root = path.resolve(self.root)\n if (process.platform === \"win32\")\n self.root = self.root.replace(/\\\\/g, \"/\")\n\n // TODO: is an absolute `cwd` supposed to be resolved against `root`?\n // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test')\n self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd)\n if (process.platform === \"win32\")\n self.cwdAbs = self.cwdAbs.replace(/\\\\/g, \"/\")\n self.nomount = !!options.nomount\n\n // disable comments and negation in Minimatch.\n // Note that they are not supported in Glob itself anyway.\n options.nonegate = true\n options.nocomment = true\n // always treat \\ in patterns as escapes, not path separators\n options.allowWindowsEscape = false\n\n self.minimatch = new Minimatch(pattern, options)\n self.options = self.minimatch.options\n}\n\nfunction finish (self) {\n var nou = self.nounique\n var all = nou ? [] : Object.create(null)\n\n for (var i = 0, l = self.matches.length; i < l; i ++) {\n var matches = self.matches[i]\n if (!matches || Object.keys(matches).length === 0) {\n if (self.nonull) {\n // do like the shell, and spit out the literal glob\n var literal = self.minimatch.globSet[i]\n if (nou)\n all.push(literal)\n else\n all[literal] = true\n }\n } else {\n // had matches\n var m = Object.keys(matches)\n if (nou)\n all.push.apply(all, m)\n else\n m.forEach(function (m) {\n all[m] = true\n })\n }\n }\n\n if (!nou)\n all = Object.keys(all)\n\n if (!self.nosort)\n all = all.sort(alphasort)\n\n // at *some* point we statted all of these\n if (self.mark) {\n for (var i = 0; i < all.length; i++) {\n all[i] = self._mark(all[i])\n }\n if (self.nodir) {\n all = all.filter(function (e) {\n var notDir = !(/\\/$/.test(e))\n var c = self.cache[e] || self.cache[makeAbs(self, e)]\n if (notDir && c)\n notDir = c !== 'DIR' && !Array.isArray(c)\n return notDir\n })\n }\n }\n\n if (self.ignore.length)\n all = all.filter(function(m) {\n return !isIgnored(self, m)\n })\n\n self.found = all\n}\n\nfunction mark (self, p) {\n var abs = makeAbs(self, p)\n var c = self.cache[abs]\n var m = p\n if (c) {\n var isDir = c === 'DIR' || Array.isArray(c)\n var slash = p.slice(-1) === '/'\n\n if (isDir && !slash)\n m += '/'\n else if (!isDir && slash)\n m = m.slice(0, -1)\n\n if (m !== p) {\n var mabs = makeAbs(self, m)\n self.statCache[mabs] = self.statCache[abs]\n self.cache[mabs] = self.cache[abs]\n }\n }\n\n return m\n}\n\n// lotta situps...\nfunction makeAbs (self, f) {\n var abs = f\n if (f.charAt(0) === '/') {\n abs = path.join(self.root, f)\n } else if (isAbsolute(f) || f === '') {\n abs = f\n } else if (self.changedCwd) {\n abs = path.resolve(self.cwd, f)\n } else {\n abs = path.resolve(f)\n }\n\n if (process.platform === 'win32')\n abs = abs.replace(/\\\\/g, '/')\n\n return abs\n}\n\n\n// Return true, if pattern ends with globstar '**', for the accompanying parent directory.\n// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents\nfunction isIgnored (self, path) {\n if (!self.ignore.length)\n return false\n\n return self.ignore.some(function(item) {\n return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))\n })\n}\n\nfunction childrenIgnored (self, path) {\n if (!self.ignore.length)\n return false\n\n return self.ignore.some(function(item) {\n return !!(item.gmatcher && item.gmatcher.match(path))\n })\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjc3Mi5qcyIsIm1hcHBpbmdzIjoiQUFBQSxlQUFlO0FBQ2YsZUFBZTtBQUNmLGVBQWU7QUFDZixjQUFjO0FBQ2QsWUFBWTtBQUNaLGlCQUFpQjtBQUNqQix1QkFBdUI7O0FBRXZCO0FBQ0E7QUFDQTs7QUFFQSxTQUFTLG1CQUFPLENBQUMsSUFBSTtBQUNyQixXQUFXLG1CQUFPLENBQUMsSUFBTTtBQUN6QixnQkFBZ0IsbUJBQU8sQ0FBQyxJQUFXO0FBQ25DLGlCQUFpQixtQkFBTyxDQUFDLElBQWtCO0FBQzNDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxXQUFXO0FBQ3BEOztBQUVBO0FBQ0Esc0NBQXNDLFdBQVc7QUFDakQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZLGdDQUFnQztBQUM1QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwyQ0FBMkMsT0FBTztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvZ2xvYi9jb21tb24uanM/ZGZmYyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzLnNldG9wdHMgPSBzZXRvcHRzXG5leHBvcnRzLm93blByb3AgPSBvd25Qcm9wXG5leHBvcnRzLm1ha2VBYnMgPSBtYWtlQWJzXG5leHBvcnRzLmZpbmlzaCA9IGZpbmlzaFxuZXhwb3J0cy5tYXJrID0gbWFya1xuZXhwb3J0cy5pc0lnbm9yZWQgPSBpc0lnbm9yZWRcbmV4cG9ydHMuY2hpbGRyZW5JZ25vcmVkID0gY2hpbGRyZW5JZ25vcmVkXG5cbmZ1bmN0aW9uIG93blByb3AgKG9iaiwgZmllbGQpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGZpZWxkKVxufVxuXG52YXIgZnMgPSByZXF1aXJlKFwiZnNcIilcbnZhciBwYXRoID0gcmVxdWlyZShcInBhdGhcIilcbnZhciBtaW5pbWF0Y2ggPSByZXF1aXJlKFwibWluaW1hdGNoXCIpXG52YXIgaXNBYnNvbHV0ZSA9IHJlcXVpcmUoXCJwYXRoLWlzLWFic29sdXRlXCIpXG52YXIgTWluaW1hdGNoID0gbWluaW1hdGNoLk1pbmltYXRjaFxuXG5mdW5jdGlvbiBhbHBoYXNvcnQgKGEsIGIpIHtcbiAgcmV0dXJuIGEubG9jYWxlQ29tcGFyZShiLCAnZW4nKVxufVxuXG5mdW5jdGlvbiBzZXR1cElnbm9yZXMgKHNlbGYsIG9wdGlvbnMpIHtcbiAgc2VsZi5pZ25vcmUgPSBvcHRpb25zLmlnbm9yZSB8fCBbXVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShzZWxmLmlnbm9yZSkpXG4gICAgc2VsZi5pZ25vcmUgPSBbc2VsZi5pZ25vcmVdXG5cbiAgaWYgKHNlbGYuaWdub3JlLmxlbmd0aCkge1xuICAgIHNlbGYuaWdub3JlID0gc2VsZi5pZ25vcmUubWFwKGlnbm9yZU1hcClcbiAgfVxufVxuXG4vLyBpZ25vcmUgcGF0dGVybnMgYXJlIGFsd2F5cyBpbiBkb3Q6dHJ1ZSBtb2RlLlxuZnVuY3Rpb24gaWdub3JlTWFwIChwYXR0ZXJuKSB7XG4gIHZhciBnbWF0Y2hlciA9IG51bGxcbiAgaWYgKHBhdHRlcm4uc2xpY2UoLTMpID09PSAnLyoqJykge1xuICAgIHZhciBncGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZSgvKFxcL1xcKlxcKikrJC8sICcnKVxuICAgIGdtYXRjaGVyID0gbmV3IE1pbmltYXRjaChncGF0dGVybiwgeyBkb3Q6IHRydWUgfSlcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWF0Y2hlcjogbmV3IE1pbmltYXRjaChwYXR0ZXJuLCB7IGRvdDogdHJ1ZSB9KSxcbiAgICBnbWF0Y2hlcjogZ21hdGNoZXJcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRvcHRzIChzZWxmLCBwYXR0ZXJuLCBvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucylcbiAgICBvcHRpb25zID0ge31cblxuICAvLyBiYXNlLW1hdGNoaW5nOiBqdXN0IHVzZSBnbG9ic3RhciBmb3IgdGhhdC5cbiAgaWYgKG9wdGlvbnMubWF0Y2hCYXNlICYmIC0xID09PSBwYXR0ZXJuLmluZGV4T2YoXCIvXCIpKSB7XG4gICAgaWYgKG9wdGlvbnMubm9nbG9ic3Rhcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYmFzZSBtYXRjaGluZyByZXF1aXJlcyBnbG9ic3RhclwiKVxuICAgIH1cbiAgICBwYXR0ZXJuID0gXCIqKi9cIiArIHBhdHRlcm5cbiAgfVxuXG4gIHNlbGYuc2lsZW50ID0gISFvcHRpb25zLnNpbGVudFxuICBzZWxmLnBhdHRlcm4gPSBwYXR0ZXJuXG4gIHNlbGYuc3RyaWN0ID0gb3B0aW9ucy5zdHJpY3QgIT09IGZhbHNlXG4gIHNlbGYucmVhbHBhdGggPSAhIW9wdGlvbnMucmVhbHBhdGhcbiAgc2VsZi5yZWFscGF0aENhY2hlID0gb3B0aW9ucy5yZWFscGF0aENhY2hlIHx8IE9iamVjdC5jcmVhdGUobnVsbClcbiAgc2VsZi5mb2xsb3cgPSAhIW9wdGlvbnMuZm9sbG93XG4gIHNlbGYuZG90ID0gISFvcHRpb25zLmRvdFxuICBzZWxmLm1hcmsgPSAhIW9wdGlvbnMubWFya1xuICBzZWxmLm5vZGlyID0gISFvcHRpb25zLm5vZGlyXG4gIGlmIChzZWxmLm5vZGlyKVxuICAgIHNlbGYubWFyayA9IHRydWVcbiAgc2VsZi5zeW5jID0gISFvcHRpb25zLnN5bmNcbiAgc2VsZi5ub3VuaXF1ZSA9ICEhb3B0aW9ucy5ub3VuaXF1ZVxuICBzZWxmLm5vbnVsbCA9ICEhb3B0aW9ucy5ub251bGxcbiAgc2VsZi5ub3NvcnQgPSAhIW9wdGlvbnMubm9zb3J0XG4gIHNlbGYubm9jYXNlID0gISFvcHRpb25zLm5vY2FzZVxuICBzZWxmLnN0YXQgPSAhIW9wdGlvbnMuc3RhdFxuICBzZWxmLm5vcHJvY2VzcyA9ICEhb3B0aW9ucy5ub3Byb2Nlc3NcbiAgc2VsZi5hYnNvbHV0ZSA9ICEhb3B0aW9ucy5hYnNvbHV0ZVxuICBzZWxmLmZzID0gb3B0aW9ucy5mcyB8fCBmc1xuXG4gIHNlbGYubWF4TGVuZ3RoID0gb3B0aW9ucy5tYXhMZW5ndGggfHwgSW5maW5pdHlcbiAgc2VsZi5jYWNoZSA9IG9wdGlvbnMuY2FjaGUgfHwgT2JqZWN0LmNyZWF0ZShudWxsKVxuICBzZWxmLnN0YXRDYWNoZSA9IG9wdGlvbnMuc3RhdENhY2hlIHx8IE9iamVjdC5jcmVhdGUobnVsbClcbiAgc2VsZi5zeW1saW5rcyA9IG9wdGlvbnMuc3ltbGlua3MgfHwgT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gIHNldHVwSWdub3JlcyhzZWxmLCBvcHRpb25zKVxuXG4gIHNlbGYuY2hhbmdlZEN3ZCA9IGZhbHNlXG4gIHZhciBjd2QgPSBwcm9jZXNzLmN3ZCgpXG4gIGlmICghb3duUHJvcChvcHRpb25zLCBcImN3ZFwiKSlcbiAgICBzZWxmLmN3ZCA9IGN3ZFxuICBlbHNlIHtcbiAgICBzZWxmLmN3ZCA9IHBhdGgucmVzb2x2ZShvcHRpb25zLmN3ZClcbiAgICBzZWxmLmNoYW5nZWRDd2QgPSBzZWxmLmN3ZCAhPT0gY3dkXG4gIH1cblxuICBzZWxmLnJvb3QgPSBvcHRpb25zLnJvb3QgfHwgcGF0aC5yZXNvbHZlKHNlbGYuY3dkLCBcIi9cIilcbiAgc2VsZi5yb290ID0gcGF0aC5yZXNvbHZlKHNlbGYucm9vdClcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIilcbiAgICBzZWxmLnJvb3QgPSBzZWxmLnJvb3QucmVwbGFjZSgvXFxcXC9nLCBcIi9cIilcblxuICAvLyBUT0RPOiBpcyBhbiBhYnNvbHV0ZSBgY3dkYCBzdXBwb3NlZCB0byBiZSByZXNvbHZlZCBhZ2FpbnN0IGByb290YD9cbiAgLy8gZS5nLiB7IGN3ZDogJy90ZXN0Jywgcm9vdDogX19kaXJuYW1lIH0gPT09IHBhdGguam9pbihfX2Rpcm5hbWUsICcvdGVzdCcpXG4gIHNlbGYuY3dkQWJzID0gaXNBYnNvbHV0ZShzZWxmLmN3ZCkgPyBzZWxmLmN3ZCA6IG1ha2VBYnMoc2VsZiwgc2VsZi5jd2QpXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCIpXG4gICAgc2VsZi5jd2RBYnMgPSBzZWxmLmN3ZEFicy5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKVxuICBzZWxmLm5vbW91bnQgPSAhIW9wdGlvbnMubm9tb3VudFxuXG4gIC8vIGRpc2FibGUgY29tbWVudHMgYW5kIG5lZ2F0aW9uIGluIE1pbmltYXRjaC5cbiAgLy8gTm90ZSB0aGF0IHRoZXkgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gR2xvYiBpdHNlbGYgYW55d2F5LlxuICBvcHRpb25zLm5vbmVnYXRlID0gdHJ1ZVxuICBvcHRpb25zLm5vY29tbWVudCA9IHRydWVcbiAgLy8gYWx3YXlzIHRyZWF0IFxcIGluIHBhdHRlcm5zIGFzIGVzY2FwZXMsIG5vdCBwYXRoIHNlcGFyYXRvcnNcbiAgb3B0aW9ucy5hbGxvd1dpbmRvd3NFc2NhcGUgPSBmYWxzZVxuXG4gIHNlbGYubWluaW1hdGNoID0gbmV3IE1pbmltYXRjaChwYXR0ZXJuLCBvcHRpb25zKVxuICBzZWxmLm9wdGlvbnMgPSBzZWxmLm1pbmltYXRjaC5vcHRpb25zXG59XG5cbmZ1bmN0aW9uIGZpbmlzaCAoc2VsZikge1xuICB2YXIgbm91ID0gc2VsZi5ub3VuaXF1ZVxuICB2YXIgYWxsID0gbm91ID8gW10gOiBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBzZWxmLm1hdGNoZXMubGVuZ3RoOyBpIDwgbDsgaSArKykge1xuICAgIHZhciBtYXRjaGVzID0gc2VsZi5tYXRjaGVzW2ldXG4gICAgaWYgKCFtYXRjaGVzIHx8IE9iamVjdC5rZXlzKG1hdGNoZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKHNlbGYubm9udWxsKSB7XG4gICAgICAgIC8vIGRvIGxpa2UgdGhlIHNoZWxsLCBhbmQgc3BpdCBvdXQgdGhlIGxpdGVyYWwgZ2xvYlxuICAgICAgICB2YXIgbGl0ZXJhbCA9IHNlbGYubWluaW1hdGNoLmdsb2JTZXRbaV1cbiAgICAgICAgaWYgKG5vdSlcbiAgICAgICAgICBhbGwucHVzaChsaXRlcmFsKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgYWxsW2xpdGVyYWxdID0gdHJ1ZVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBoYWQgbWF0Y2hlc1xuICAgICAgdmFyIG0gPSBPYmplY3Qua2V5cyhtYXRjaGVzKVxuICAgICAgaWYgKG5vdSlcbiAgICAgICAgYWxsLnB1c2guYXBwbHkoYWxsLCBtKVxuICAgICAgZWxzZVxuICAgICAgICBtLmZvckVhY2goZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgICBhbGxbbV0gPSB0cnVlXG4gICAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaWYgKCFub3UpXG4gICAgYWxsID0gT2JqZWN0LmtleXMoYWxsKVxuXG4gIGlmICghc2VsZi5ub3NvcnQpXG4gICAgYWxsID0gYWxsLnNvcnQoYWxwaGFzb3J0KVxuXG4gIC8vIGF0ICpzb21lKiBwb2ludCB3ZSBzdGF0dGVkIGFsbCBvZiB0aGVzZVxuICBpZiAoc2VsZi5tYXJrKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFsbFtpXSA9IHNlbGYuX21hcmsoYWxsW2ldKVxuICAgIH1cbiAgICBpZiAoc2VsZi5ub2Rpcikge1xuICAgICAgYWxsID0gYWxsLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgbm90RGlyID0gISgvXFwvJC8udGVzdChlKSlcbiAgICAgICAgdmFyIGMgPSBzZWxmLmNhY2hlW2VdIHx8IHNlbGYuY2FjaGVbbWFrZUFicyhzZWxmLCBlKV1cbiAgICAgICAgaWYgKG5vdERpciAmJiBjKVxuICAgICAgICAgIG5vdERpciA9IGMgIT09ICdESVInICYmICFBcnJheS5pc0FycmF5KGMpXG4gICAgICAgIHJldHVybiBub3REaXJcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaWYgKHNlbGYuaWdub3JlLmxlbmd0aClcbiAgICBhbGwgPSBhbGwuZmlsdGVyKGZ1bmN0aW9uKG0pIHtcbiAgICAgIHJldHVybiAhaXNJZ25vcmVkKHNlbGYsIG0pXG4gICAgfSlcblxuICBzZWxmLmZvdW5kID0gYWxsXG59XG5cbmZ1bmN0aW9uIG1hcmsgKHNlbGYsIHApIHtcbiAgdmFyIGFicyA9IG1ha2VBYnMoc2VsZiwgcClcbiAgdmFyIGMgPSBzZWxmLmNhY2hlW2Fic11cbiAgdmFyIG0gPSBwXG4gIGlmIChjKSB7XG4gICAgdmFyIGlzRGlyID0gYyA9PT0gJ0RJUicgfHwgQXJyYXkuaXNBcnJheShjKVxuICAgIHZhciBzbGFzaCA9IHAuc2xpY2UoLTEpID09PSAnLydcblxuICAgIGlmIChpc0RpciAmJiAhc2xhc2gpXG4gICAgICBtICs9ICcvJ1xuICAgIGVsc2UgaWYgKCFpc0RpciAmJiBzbGFzaClcbiAgICAgIG0gPSBtLnNsaWNlKDAsIC0xKVxuXG4gICAgaWYgKG0gIT09IHApIHtcbiAgICAgIHZhciBtYWJzID0gbWFrZUFicyhzZWxmLCBtKVxuICAgICAgc2VsZi5zdGF0Q2FjaGVbbWFic10gPSBzZWxmLnN0YXRDYWNoZVthYnNdXG4gICAgICBzZWxmLmNhY2hlW21hYnNdID0gc2VsZi5jYWNoZVthYnNdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1cbn1cblxuLy8gbG90dGEgc2l0dXBzLi4uXG5mdW5jdGlvbiBtYWtlQWJzIChzZWxmLCBmKSB7XG4gIHZhciBhYnMgPSBmXG4gIGlmIChmLmNoYXJBdCgwKSA9PT0gJy8nKSB7XG4gICAgYWJzID0gcGF0aC5qb2luKHNlbGYucm9vdCwgZilcbiAgfSBlbHNlIGlmIChpc0Fic29sdXRlKGYpIHx8IGYgPT09ICcnKSB7XG4gICAgYWJzID0gZlxuICB9IGVsc2UgaWYgKHNlbGYuY2hhbmdlZEN3ZCkge1xuICAgIGFicyA9IHBhdGgucmVzb2x2ZShzZWxmLmN3ZCwgZilcbiAgfSBlbHNlIHtcbiAgICBhYnMgPSBwYXRoLnJlc29sdmUoZilcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKVxuICAgIGFicyA9IGFicy5yZXBsYWNlKC9cXFxcL2csICcvJylcblxuICByZXR1cm4gYWJzXG59XG5cblxuLy8gUmV0dXJuIHRydWUsIGlmIHBhdHRlcm4gZW5kcyB3aXRoIGdsb2JzdGFyICcqKicsIGZvciB0aGUgYWNjb21wYW55aW5nIHBhcmVudCBkaXJlY3RvcnkuXG4vLyBFeDotIElmIG5vZGVfbW9kdWxlcy8qKiBpcyB0aGUgcGF0dGVybiwgYWRkICdub2RlX21vZHVsZXMnIHRvIGlnbm9yZSBsaXN0IGFsb25nIHdpdGggaXQncyBjb250ZW50c1xuZnVuY3Rpb24gaXNJZ25vcmVkIChzZWxmLCBwYXRoKSB7XG4gIGlmICghc2VsZi5pZ25vcmUubGVuZ3RoKVxuICAgIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiBzZWxmLmlnbm9yZS5zb21lKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbS5tYXRjaGVyLm1hdGNoKHBhdGgpIHx8ICEhKGl0ZW0uZ21hdGNoZXIgJiYgaXRlbS5nbWF0Y2hlci5tYXRjaChwYXRoKSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gY2hpbGRyZW5JZ25vcmVkIChzZWxmLCBwYXRoKSB7XG4gIGlmICghc2VsZi5pZ25vcmUubGVuZ3RoKVxuICAgIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiBzZWxmLmlnbm9yZS5zb21lKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICByZXR1cm4gISEoaXRlbS5nbWF0Y2hlciAmJiBpdGVtLmdtYXRjaGVyLm1hdGNoKHBhdGgpKVxuICB9KVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6772\n")},2884:(module,__unused_webpack_exports,__webpack_require__)=>{eval("// Approach:\n//\n// 1. Get the minimatch set\n// 2. For each pattern in the set, PROCESS(pattern, false)\n// 3. Store matches per-set, then uniq them\n//\n// PROCESS(pattern, inGlobStar)\n// Get the first [n] items from pattern that are all strings\n// Join these together. This is PREFIX.\n// If there is no more remaining, then stat(PREFIX) and\n// add to matches if it succeeds. END.\n//\n// If inGlobStar and PREFIX is symlink and points to dir\n// set ENTRIES = []\n// else readdir(PREFIX) as ENTRIES\n// If fail, END\n//\n// with ENTRIES\n// If pattern[n] is GLOBSTAR\n// // handle the case where the globstar match is empty\n// // by pruning it out, and testing the resulting pattern\n// PROCESS(pattern[0..n] + pattern[n+1 .. $], false)\n// // handle other cases.\n// for ENTRY in ENTRIES (not dotfiles)\n// // attach globstar + tail onto the entry\n// // Mark that this entry is a globstar match\n// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)\n//\n// else // not globstar\n// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)\n// Test ENTRY against pattern[n]\n// If fails, continue\n// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])\n//\n// Caveat:\n// Cache all stats and readdirs results to minimize syscall. Since all\n// we ever care about is existence and directory-ness, we can just keep\n// `true` for files, and [children,...] for directories, or `false` for\n// things that don't exist.\n\nmodule.exports = glob\n\nvar rp = __webpack_require__(7334)\nvar minimatch = __webpack_require__(1171)\nvar Minimatch = minimatch.Minimatch\nvar inherits = __webpack_require__(4378)\nvar EE = (__webpack_require__(2361).EventEmitter)\nvar path = __webpack_require__(1017)\nvar assert = __webpack_require__(9491)\nvar isAbsolute = __webpack_require__(4095)\nvar globSync = __webpack_require__(4751)\nvar common = __webpack_require__(6772)\nvar setopts = common.setopts\nvar ownProp = common.ownProp\nvar inflight = __webpack_require__(7844)\nvar util = __webpack_require__(3837)\nvar childrenIgnored = common.childrenIgnored\nvar isIgnored = common.isIgnored\n\nvar once = __webpack_require__(778)\n\nfunction glob (pattern, options, cb) {\n if (typeof options === 'function') cb = options, options = {}\n if (!options) options = {}\n\n if (options.sync) {\n if (cb)\n throw new TypeError('callback provided to sync glob')\n return globSync(pattern, options)\n }\n\n return new Glob(pattern, options, cb)\n}\n\nglob.sync = globSync\nvar GlobSync = glob.GlobSync = globSync.GlobSync\n\n// old api surface\nglob.glob = glob\n\nfunction extend (origin, add) {\n if (add === null || typeof add !== 'object') {\n return origin\n }\n\n var keys = Object.keys(add)\n var i = keys.length\n while (i--) {\n origin[keys[i]] = add[keys[i]]\n }\n return origin\n}\n\nglob.hasMagic = function (pattern, options_) {\n var options = extend({}, options_)\n options.noprocess = true\n\n var g = new Glob(pattern, options)\n var set = g.minimatch.set\n\n if (!pattern)\n return false\n\n if (set.length > 1)\n return true\n\n for (var j = 0; j < set[0].length; j++) {\n if (typeof set[0][j] !== 'string')\n return true\n }\n\n return false\n}\n\nglob.Glob = Glob\ninherits(Glob, EE)\nfunction Glob (pattern, options, cb) {\n if (typeof options === 'function') {\n cb = options\n options = null\n }\n\n if (options && options.sync) {\n if (cb)\n throw new TypeError('callback provided to sync glob')\n return new GlobSync(pattern, options)\n }\n\n if (!(this instanceof Glob))\n return new Glob(pattern, options, cb)\n\n setopts(this, pattern, options)\n this._didRealPath = false\n\n // process each pattern in the minimatch set\n var n = this.minimatch.set.length\n\n // The matches are stored as {: true,...} so that\n // duplicates are automagically pruned.\n // Later, we do an Object.keys() on these.\n // Keep them as a list so we can fill in when nonull is set.\n this.matches = new Array(n)\n\n if (typeof cb === 'function') {\n cb = once(cb)\n this.on('error', cb)\n this.on('end', function (matches) {\n cb(null, matches)\n })\n }\n\n var self = this\n this._processing = 0\n\n this._emitQueue = []\n this._processQueue = []\n this.paused = false\n\n if (this.noprocess)\n return this\n\n if (n === 0)\n return done()\n\n var sync = true\n for (var i = 0; i < n; i ++) {\n this._process(this.minimatch.set[i], i, false, done)\n }\n sync = false\n\n function done () {\n --self._processing\n if (self._processing <= 0) {\n if (sync) {\n process.nextTick(function () {\n self._finish()\n })\n } else {\n self._finish()\n }\n }\n }\n}\n\nGlob.prototype._finish = function () {\n assert(this instanceof Glob)\n if (this.aborted)\n return\n\n if (this.realpath && !this._didRealpath)\n return this._realpath()\n\n common.finish(this)\n this.emit('end', this.found)\n}\n\nGlob.prototype._realpath = function () {\n if (this._didRealpath)\n return\n\n this._didRealpath = true\n\n var n = this.matches.length\n if (n === 0)\n return this._finish()\n\n var self = this\n for (var i = 0; i < this.matches.length; i++)\n this._realpathSet(i, next)\n\n function next () {\n if (--n === 0)\n self._finish()\n }\n}\n\nGlob.prototype._realpathSet = function (index, cb) {\n var matchset = this.matches[index]\n if (!matchset)\n return cb()\n\n var found = Object.keys(matchset)\n var self = this\n var n = found.length\n\n if (n === 0)\n return cb()\n\n var set = this.matches[index] = Object.create(null)\n found.forEach(function (p, i) {\n // If there's a problem with the stat, then it means that\n // one or more of the links in the realpath couldn't be\n // resolved. just return the abs value in that case.\n p = self._makeAbs(p)\n rp.realpath(p, self.realpathCache, function (er, real) {\n if (!er)\n set[real] = true\n else if (er.syscall === 'stat')\n set[p] = true\n else\n self.emit('error', er) // srsly wtf right here\n\n if (--n === 0) {\n self.matches[index] = set\n cb()\n }\n })\n })\n}\n\nGlob.prototype._mark = function (p) {\n return common.mark(this, p)\n}\n\nGlob.prototype._makeAbs = function (f) {\n return common.makeAbs(this, f)\n}\n\nGlob.prototype.abort = function () {\n this.aborted = true\n this.emit('abort')\n}\n\nGlob.prototype.pause = function () {\n if (!this.paused) {\n this.paused = true\n this.emit('pause')\n }\n}\n\nGlob.prototype.resume = function () {\n if (this.paused) {\n this.emit('resume')\n this.paused = false\n if (this._emitQueue.length) {\n var eq = this._emitQueue.slice(0)\n this._emitQueue.length = 0\n for (var i = 0; i < eq.length; i ++) {\n var e = eq[i]\n this._emitMatch(e[0], e[1])\n }\n }\n if (this._processQueue.length) {\n var pq = this._processQueue.slice(0)\n this._processQueue.length = 0\n for (var i = 0; i < pq.length; i ++) {\n var p = pq[i]\n this._processing--\n this._process(p[0], p[1], p[2], p[3])\n }\n }\n }\n}\n\nGlob.prototype._process = function (pattern, index, inGlobStar, cb) {\n assert(this instanceof Glob)\n assert(typeof cb === 'function')\n\n if (this.aborted)\n return\n\n this._processing++\n if (this.paused) {\n this._processQueue.push([pattern, index, inGlobStar, cb])\n return\n }\n\n //console.error('PROCESS %d', this._processing, pattern)\n\n // Get the first [n] parts of pattern that are all strings.\n var n = 0\n while (typeof pattern[n] === 'string') {\n n ++\n }\n // now n is the index of the first one that is *not* a string.\n\n // see if there's anything else\n var prefix\n switch (n) {\n // if not, then this is rather simple\n case pattern.length:\n this._processSimple(pattern.join('/'), index, cb)\n return\n\n case 0:\n // pattern *starts* with some non-trivial item.\n // going to readdir(cwd), but not include the prefix in matches.\n prefix = null\n break\n\n default:\n // pattern has some string bits in the front.\n // whatever it starts with, whether that's 'absolute' like /foo/bar,\n // or 'relative' like '../baz'\n prefix = pattern.slice(0, n).join('/')\n break\n }\n\n var remain = pattern.slice(n)\n\n // get the list of entries.\n var read\n if (prefix === null)\n read = '.'\n else if (isAbsolute(prefix) ||\n isAbsolute(pattern.map(function (p) {\n return typeof p === 'string' ? p : '[*]'\n }).join('/'))) {\n if (!prefix || !isAbsolute(prefix))\n prefix = '/' + prefix\n read = prefix\n } else\n read = prefix\n\n var abs = this._makeAbs(read)\n\n //if ignored, skip _processing\n if (childrenIgnored(this, read))\n return cb()\n\n var isGlobStar = remain[0] === minimatch.GLOBSTAR\n if (isGlobStar)\n this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)\n else\n this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)\n}\n\nGlob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {\n var self = this\n this._readdir(abs, inGlobStar, function (er, entries) {\n return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)\n })\n}\n\nGlob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {\n\n // if the abs isn't a dir, then nothing can match!\n if (!entries)\n return cb()\n\n // It will only match dot entries if it starts with a dot, or if\n // dot is set. Stuff like @(.foo|.bar) isn't allowed.\n var pn = remain[0]\n var negate = !!this.minimatch.negate\n var rawGlob = pn._glob\n var dotOk = this.dot || rawGlob.charAt(0) === '.'\n\n var matchedEntries = []\n for (var i = 0; i < entries.length; i++) {\n var e = entries[i]\n if (e.charAt(0) !== '.' || dotOk) {\n var m\n if (negate && !prefix) {\n m = !e.match(pn)\n } else {\n m = e.match(pn)\n }\n if (m)\n matchedEntries.push(e)\n }\n }\n\n //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)\n\n var len = matchedEntries.length\n // If there are no matched entries, then nothing matches.\n if (len === 0)\n return cb()\n\n // if this is the last remaining pattern bit, then no need for\n // an additional stat *unless* the user has specified mark or\n // stat explicitly. We know they exist, since readdir returned\n // them.\n\n if (remain.length === 1 && !this.mark && !this.stat) {\n if (!this.matches[index])\n this.matches[index] = Object.create(null)\n\n for (var i = 0; i < len; i ++) {\n var e = matchedEntries[i]\n if (prefix) {\n if (prefix !== '/')\n e = prefix + '/' + e\n else\n e = prefix + e\n }\n\n if (e.charAt(0) === '/' && !this.nomount) {\n e = path.join(this.root, e)\n }\n this._emitMatch(index, e)\n }\n // This was the last one, and no stats were needed\n return cb()\n }\n\n // now test all matched entries as stand-ins for that part\n // of the pattern.\n remain.shift()\n for (var i = 0; i < len; i ++) {\n var e = matchedEntries[i]\n var newPattern\n if (prefix) {\n if (prefix !== '/')\n e = prefix + '/' + e\n else\n e = prefix + e\n }\n this._process([e].concat(remain), index, inGlobStar, cb)\n }\n cb()\n}\n\nGlob.prototype._emitMatch = function (index, e) {\n if (this.aborted)\n return\n\n if (isIgnored(this, e))\n return\n\n if (this.paused) {\n this._emitQueue.push([index, e])\n return\n }\n\n var abs = isAbsolute(e) ? e : this._makeAbs(e)\n\n if (this.mark)\n e = this._mark(e)\n\n if (this.absolute)\n e = abs\n\n if (this.matches[index][e])\n return\n\n if (this.nodir) {\n var c = this.cache[abs]\n if (c === 'DIR' || Array.isArray(c))\n return\n }\n\n this.matches[index][e] = true\n\n var st = this.statCache[abs]\n if (st)\n this.emit('stat', e, st)\n\n this.emit('match', e)\n}\n\nGlob.prototype._readdirInGlobStar = function (abs, cb) {\n if (this.aborted)\n return\n\n // follow all symlinked directories forever\n // just proceed as if this is a non-globstar situation\n if (this.follow)\n return this._readdir(abs, false, cb)\n\n var lstatkey = 'lstat\\0' + abs\n var self = this\n var lstatcb = inflight(lstatkey, lstatcb_)\n\n if (lstatcb)\n self.fs.lstat(abs, lstatcb)\n\n function lstatcb_ (er, lstat) {\n if (er && er.code === 'ENOENT')\n return cb()\n\n var isSym = lstat && lstat.isSymbolicLink()\n self.symlinks[abs] = isSym\n\n // If it's not a symlink or a dir, then it's definitely a regular file.\n // don't bother doing a readdir in that case.\n if (!isSym && lstat && !lstat.isDirectory()) {\n self.cache[abs] = 'FILE'\n cb()\n } else\n self._readdir(abs, false, cb)\n }\n}\n\nGlob.prototype._readdir = function (abs, inGlobStar, cb) {\n if (this.aborted)\n return\n\n cb = inflight('readdir\\0'+abs+'\\0'+inGlobStar, cb)\n if (!cb)\n return\n\n //console.error('RD %j %j', +inGlobStar, abs)\n if (inGlobStar && !ownProp(this.symlinks, abs))\n return this._readdirInGlobStar(abs, cb)\n\n if (ownProp(this.cache, abs)) {\n var c = this.cache[abs]\n if (!c || c === 'FILE')\n return cb()\n\n if (Array.isArray(c))\n return cb(null, c)\n }\n\n var self = this\n self.fs.readdir(abs, readdirCb(this, abs, cb))\n}\n\nfunction readdirCb (self, abs, cb) {\n return function (er, entries) {\n if (er)\n self._readdirError(abs, er, cb)\n else\n self._readdirEntries(abs, entries, cb)\n }\n}\n\nGlob.prototype._readdirEntries = function (abs, entries, cb) {\n if (this.aborted)\n return\n\n // if we haven't asked to stat everything, then just\n // assume that everything in there exists, so we can avoid\n // having to stat it a second time.\n if (!this.mark && !this.stat) {\n for (var i = 0; i < entries.length; i ++) {\n var e = entries[i]\n if (abs === '/')\n e = abs + e\n else\n e = abs + '/' + e\n this.cache[e] = true\n }\n }\n\n this.cache[abs] = entries\n return cb(null, entries)\n}\n\nGlob.prototype._readdirError = function (f, er, cb) {\n if (this.aborted)\n return\n\n // handle errors, and cache the information\n switch (er.code) {\n case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205\n case 'ENOTDIR': // totally normal. means it *does* exist.\n var abs = this._makeAbs(f)\n this.cache[abs] = 'FILE'\n if (abs === this.cwdAbs) {\n var error = new Error(er.code + ' invalid cwd ' + this.cwd)\n error.path = this.cwd\n error.code = er.code\n this.emit('error', error)\n this.abort()\n }\n break\n\n case 'ENOENT': // not terribly unusual\n case 'ELOOP':\n case 'ENAMETOOLONG':\n case 'UNKNOWN':\n this.cache[this._makeAbs(f)] = false\n break\n\n default: // some unusual error. Treat as failure.\n this.cache[this._makeAbs(f)] = false\n if (this.strict) {\n this.emit('error', er)\n // If the error is handled, then we abort\n // if not, we threw out of here\n this.abort()\n }\n if (!this.silent)\n console.error('glob error', er)\n break\n }\n\n return cb()\n}\n\nGlob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {\n var self = this\n this._readdir(abs, inGlobStar, function (er, entries) {\n self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)\n })\n}\n\n\nGlob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {\n //console.error('pgs2', prefix, remain[0], entries)\n\n // no entries means not a dir, so it can never have matches\n // foo.txt/** doesn't match foo.txt\n if (!entries)\n return cb()\n\n // test without the globstar, and with every child both below\n // and replacing the globstar.\n var remainWithoutGlobStar = remain.slice(1)\n var gspref = prefix ? [ prefix ] : []\n var noGlobStar = gspref.concat(remainWithoutGlobStar)\n\n // the noGlobStar pattern exits the inGlobStar state\n this._process(noGlobStar, index, false, cb)\n\n var isSym = this.symlinks[abs]\n var len = entries.length\n\n // If it's a symlink, and we're in a globstar, then stop\n if (isSym && inGlobStar)\n return cb()\n\n for (var i = 0; i < len; i++) {\n var e = entries[i]\n if (e.charAt(0) === '.' && !this.dot)\n continue\n\n // these two cases enter the inGlobStar state\n var instead = gspref.concat(entries[i], remainWithoutGlobStar)\n this._process(instead, index, true, cb)\n\n var below = gspref.concat(entries[i], remain)\n this._process(below, index, true, cb)\n }\n\n cb()\n}\n\nGlob.prototype._processSimple = function (prefix, index, cb) {\n // XXX review this. Shouldn't it be doing the mounting etc\n // before doing stat? kinda weird?\n var self = this\n this._stat(prefix, function (er, exists) {\n self._processSimple2(prefix, index, er, exists, cb)\n })\n}\nGlob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {\n\n //console.error('ps2', prefix, exists)\n\n if (!this.matches[index])\n this.matches[index] = Object.create(null)\n\n // If it doesn't exist, then just mark the lack of results\n if (!exists)\n return cb()\n\n if (prefix && isAbsolute(prefix) && !this.nomount) {\n var trail = /[\\/\\\\]$/.test(prefix)\n if (prefix.charAt(0) === '/') {\n prefix = path.join(this.root, prefix)\n } else {\n prefix = path.resolve(this.root, prefix)\n if (trail)\n prefix += '/'\n }\n }\n\n if (process.platform === 'win32')\n prefix = prefix.replace(/\\\\/g, '/')\n\n // Mark this as a match\n this._emitMatch(index, prefix)\n cb()\n}\n\n// Returns either 'DIR', 'FILE', or false\nGlob.prototype._stat = function (f, cb) {\n var abs = this._makeAbs(f)\n var needDir = f.slice(-1) === '/'\n\n if (f.length > this.maxLength)\n return cb()\n\n if (!this.stat && ownProp(this.cache, abs)) {\n var c = this.cache[abs]\n\n if (Array.isArray(c))\n c = 'DIR'\n\n // It exists, but maybe not how we need it\n if (!needDir || c === 'DIR')\n return cb(null, c)\n\n if (needDir && c === 'FILE')\n return cb()\n\n // otherwise we have to stat, because maybe c=true\n // if we know it exists, but not what it is.\n }\n\n var exists\n var stat = this.statCache[abs]\n if (stat !== undefined) {\n if (stat === false)\n return cb(null, stat)\n else {\n var type = stat.isDirectory() ? 'DIR' : 'FILE'\n if (needDir && type === 'FILE')\n return cb()\n else\n return cb(null, type, stat)\n }\n }\n\n var self = this\n var statcb = inflight('stat\\0' + abs, lstatcb_)\n if (statcb)\n self.fs.lstat(abs, statcb)\n\n function lstatcb_ (er, lstat) {\n if (lstat && lstat.isSymbolicLink()) {\n // If it's a symlink, then treat it as the target, unless\n // the target does not exist, then treat it as a file.\n return self.fs.stat(abs, function (er, stat) {\n if (er)\n self._stat2(f, abs, null, lstat, cb)\n else\n self._stat2(f, abs, er, stat, cb)\n })\n } else {\n self._stat2(f, abs, er, lstat, cb)\n }\n }\n}\n\nGlob.prototype._stat2 = function (f, abs, er, stat, cb) {\n if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {\n this.statCache[abs] = false\n return cb()\n }\n\n var needDir = f.slice(-1) === '/'\n this.statCache[abs] = stat\n\n if (abs.slice(-1) === '/' && stat && !stat.isDirectory())\n return cb(null, false, stat)\n\n var c = true\n if (stat)\n c = stat.isDirectory() ? 'DIR' : 'FILE'\n this.cache[abs] = this.cache[abs] || c\n\n if (needDir && c === 'FILE')\n return cb()\n\n return cb(null, c, stat)\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isb0JBQW9CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLFNBQVM7QUFDM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvZ2xvYi9nbG9iLmpzP2UxNDAiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQXBwcm9hY2g6XG4vL1xuLy8gMS4gR2V0IHRoZSBtaW5pbWF0Y2ggc2V0XG4vLyAyLiBGb3IgZWFjaCBwYXR0ZXJuIGluIHRoZSBzZXQsIFBST0NFU1MocGF0dGVybiwgZmFsc2UpXG4vLyAzLiBTdG9yZSBtYXRjaGVzIHBlci1zZXQsIHRoZW4gdW5pcSB0aGVtXG4vL1xuLy8gUFJPQ0VTUyhwYXR0ZXJuLCBpbkdsb2JTdGFyKVxuLy8gR2V0IHRoZSBmaXJzdCBbbl0gaXRlbXMgZnJvbSBwYXR0ZXJuIHRoYXQgYXJlIGFsbCBzdHJpbmdzXG4vLyBKb2luIHRoZXNlIHRvZ2V0aGVyLiAgVGhpcyBpcyBQUkVGSVguXG4vLyAgIElmIHRoZXJlIGlzIG5vIG1vcmUgcmVtYWluaW5nLCB0aGVuIHN0YXQoUFJFRklYKSBhbmRcbi8vICAgYWRkIHRvIG1hdGNoZXMgaWYgaXQgc3VjY2VlZHMuICBFTkQuXG4vL1xuLy8gSWYgaW5HbG9iU3RhciBhbmQgUFJFRklYIGlzIHN5bWxpbmsgYW5kIHBvaW50cyB0byBkaXJcbi8vICAgc2V0IEVOVFJJRVMgPSBbXVxuLy8gZWxzZSByZWFkZGlyKFBSRUZJWCkgYXMgRU5UUklFU1xuLy8gICBJZiBmYWlsLCBFTkRcbi8vXG4vLyB3aXRoIEVOVFJJRVNcbi8vICAgSWYgcGF0dGVybltuXSBpcyBHTE9CU1RBUlxuLy8gICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgZ2xvYnN0YXIgbWF0Y2ggaXMgZW1wdHlcbi8vICAgICAvLyBieSBwcnVuaW5nIGl0IG91dCwgYW5kIHRlc3RpbmcgdGhlIHJlc3VsdGluZyBwYXR0ZXJuXG4vLyAgICAgUFJPQ0VTUyhwYXR0ZXJuWzAuLm5dICsgcGF0dGVybltuKzEgLi4gJF0sIGZhbHNlKVxuLy8gICAgIC8vIGhhbmRsZSBvdGhlciBjYXNlcy5cbi8vICAgICBmb3IgRU5UUlkgaW4gRU5UUklFUyAobm90IGRvdGZpbGVzKVxuLy8gICAgICAgLy8gYXR0YWNoIGdsb2JzdGFyICsgdGFpbCBvbnRvIHRoZSBlbnRyeVxuLy8gICAgICAgLy8gTWFyayB0aGF0IHRoaXMgZW50cnkgaXMgYSBnbG9ic3RhciBtYXRjaFxuLy8gICAgICAgUFJPQ0VTUyhwYXR0ZXJuWzAuLm5dICsgRU5UUlkgKyBwYXR0ZXJuW24gLi4gJF0sIHRydWUpXG4vL1xuLy8gICBlbHNlIC8vIG5vdCBnbG9ic3RhclxuLy8gICAgIGZvciBFTlRSWSBpbiBFTlRSSUVTIChub3QgZG90ZmlsZXMsIHVubGVzcyBwYXR0ZXJuW25dIGlzIGRvdClcbi8vICAgICAgIFRlc3QgRU5UUlkgYWdhaW5zdCBwYXR0ZXJuW25dXG4vLyAgICAgICBJZiBmYWlscywgY29udGludWVcbi8vICAgICAgIElmIHBhc3NlcywgUFJPQ0VTUyhwYXR0ZXJuWzAuLm5dICsgaXRlbSArIHBhdHRlcm5bbisxIC4uICRdKVxuLy9cbi8vIENhdmVhdDpcbi8vICAgQ2FjaGUgYWxsIHN0YXRzIGFuZCByZWFkZGlycyByZXN1bHRzIHRvIG1pbmltaXplIHN5c2NhbGwuICBTaW5jZSBhbGxcbi8vICAgd2UgZXZlciBjYXJlIGFib3V0IGlzIGV4aXN0ZW5jZSBhbmQgZGlyZWN0b3J5LW5lc3MsIHdlIGNhbiBqdXN0IGtlZXBcbi8vICAgYHRydWVgIGZvciBmaWxlcywgYW5kIFtjaGlsZHJlbiwuLi5dIGZvciBkaXJlY3Rvcmllcywgb3IgYGZhbHNlYCBmb3Jcbi8vICAgdGhpbmdzIHRoYXQgZG9uJ3QgZXhpc3QuXG5cbm1vZHVsZS5leHBvcnRzID0gZ2xvYlxuXG52YXIgcnAgPSByZXF1aXJlKCdmcy5yZWFscGF0aCcpXG52YXIgbWluaW1hdGNoID0gcmVxdWlyZSgnbWluaW1hdGNoJylcbnZhciBNaW5pbWF0Y2ggPSBtaW5pbWF0Y2guTWluaW1hdGNoXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG52YXIgRUUgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXJcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbnZhciBpc0Fic29sdXRlID0gcmVxdWlyZSgncGF0aC1pcy1hYnNvbHV0ZScpXG52YXIgZ2xvYlN5bmMgPSByZXF1aXJlKCcuL3N5bmMuanMnKVxudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4vY29tbW9uLmpzJylcbnZhciBzZXRvcHRzID0gY29tbW9uLnNldG9wdHNcbnZhciBvd25Qcm9wID0gY29tbW9uLm93blByb3BcbnZhciBpbmZsaWdodCA9IHJlcXVpcmUoJ2luZmxpZ2h0JylcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpXG52YXIgY2hpbGRyZW5JZ25vcmVkID0gY29tbW9uLmNoaWxkcmVuSWdub3JlZFxudmFyIGlzSWdub3JlZCA9IGNvbW1vbi5pc0lnbm9yZWRcblxudmFyIG9uY2UgPSByZXF1aXJlKCdvbmNlJylcblxuZnVuY3Rpb24gZ2xvYiAocGF0dGVybiwgb3B0aW9ucywgY2IpIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSBjYiA9IG9wdGlvbnMsIG9wdGlvbnMgPSB7fVxuICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fVxuXG4gIGlmIChvcHRpb25zLnN5bmMpIHtcbiAgICBpZiAoY2IpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBwcm92aWRlZCB0byBzeW5jIGdsb2InKVxuICAgIHJldHVybiBnbG9iU3luYyhwYXR0ZXJuLCBvcHRpb25zKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBHbG9iKHBhdHRlcm4sIG9wdGlvbnMsIGNiKVxufVxuXG5nbG9iLnN5bmMgPSBnbG9iU3luY1xudmFyIEdsb2JTeW5jID0gZ2xvYi5HbG9iU3luYyA9IGdsb2JTeW5jLkdsb2JTeW5jXG5cbi8vIG9sZCBhcGkgc3VyZmFjZVxuZ2xvYi5nbG9iID0gZ2xvYlxuXG5mdW5jdGlvbiBleHRlbmQgKG9yaWdpbiwgYWRkKSB7XG4gIGlmIChhZGQgPT09IG51bGwgfHwgdHlwZW9mIGFkZCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gb3JpZ2luXG4gIH1cblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFkZClcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aFxuICB3aGlsZSAoaS0tKSB7XG4gICAgb3JpZ2luW2tleXNbaV1dID0gYWRkW2tleXNbaV1dXG4gIH1cbiAgcmV0dXJuIG9yaWdpblxufVxuXG5nbG9iLmhhc01hZ2ljID0gZnVuY3Rpb24gKHBhdHRlcm4sIG9wdGlvbnNfKSB7XG4gIHZhciBvcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zXylcbiAgb3B0aW9ucy5ub3Byb2Nlc3MgPSB0cnVlXG5cbiAgdmFyIGcgPSBuZXcgR2xvYihwYXR0ZXJuLCBvcHRpb25zKVxuICB2YXIgc2V0ID0gZy5taW5pbWF0Y2guc2V0XG5cbiAgaWYgKCFwYXR0ZXJuKVxuICAgIHJldHVybiBmYWxzZVxuXG4gIGlmIChzZXQubGVuZ3RoID4gMSlcbiAgICByZXR1cm4gdHJ1ZVxuXG4gIGZvciAodmFyIGogPSAwOyBqIDwgc2V0WzBdLmxlbmd0aDsgaisrKSB7XG4gICAgaWYgKHR5cGVvZiBzZXRbMF1bal0gIT09ICdzdHJpbmcnKVxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG5nbG9iLkdsb2IgPSBHbG9iXG5pbmhlcml0cyhHbG9iLCBFRSlcbmZ1bmN0aW9uIEdsb2IgKHBhdHRlcm4sIG9wdGlvbnMsIGNiKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gb3B0aW9uc1xuICAgIG9wdGlvbnMgPSBudWxsXG4gIH1cblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnN5bmMpIHtcbiAgICBpZiAoY2IpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBwcm92aWRlZCB0byBzeW5jIGdsb2InKVxuICAgIHJldHVybiBuZXcgR2xvYlN5bmMocGF0dGVybiwgb3B0aW9ucylcbiAgfVxuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBHbG9iKSlcbiAgICByZXR1cm4gbmV3IEdsb2IocGF0dGVybiwgb3B0aW9ucywgY2IpXG5cbiAgc2V0b3B0cyh0aGlzLCBwYXR0ZXJuLCBvcHRpb25zKVxuICB0aGlzLl9kaWRSZWFsUGF0aCA9IGZhbHNlXG5cbiAgLy8gcHJvY2VzcyBlYWNoIHBhdHRlcm4gaW4gdGhlIG1pbmltYXRjaCBzZXRcbiAgdmFyIG4gPSB0aGlzLm1pbmltYXRjaC5zZXQubGVuZ3RoXG5cbiAgLy8gVGhlIG1hdGNoZXMgYXJlIHN0b3JlZCBhcyB7PGZpbGVuYW1lPjogdHJ1ZSwuLi59IHNvIHRoYXRcbiAgLy8gZHVwbGljYXRlcyBhcmUgYXV0b21hZ2ljYWxseSBwcnVuZWQuXG4gIC8vIExhdGVyLCB3ZSBkbyBhbiBPYmplY3Qua2V5cygpIG9uIHRoZXNlLlxuICAvLyBLZWVwIHRoZW0gYXMgYSBsaXN0IHNvIHdlIGNhbiBmaWxsIGluIHdoZW4gbm9udWxsIGlzIHNldC5cbiAgdGhpcy5tYXRjaGVzID0gbmV3IEFycmF5KG4pXG5cbiAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gb25jZShjYilcbiAgICB0aGlzLm9uKCdlcnJvcicsIGNiKVxuICAgIHRoaXMub24oJ2VuZCcsIGZ1bmN0aW9uIChtYXRjaGVzKSB7XG4gICAgICBjYihudWxsLCBtYXRjaGVzKVxuICAgIH0pXG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXNcbiAgdGhpcy5fcHJvY2Vzc2luZyA9IDBcblxuICB0aGlzLl9lbWl0UXVldWUgPSBbXVxuICB0aGlzLl9wcm9jZXNzUXVldWUgPSBbXVxuICB0aGlzLnBhdXNlZCA9IGZhbHNlXG5cbiAgaWYgKHRoaXMubm9wcm9jZXNzKVxuICAgIHJldHVybiB0aGlzXG5cbiAgaWYgKG4gPT09IDApXG4gICAgcmV0dXJuIGRvbmUoKVxuXG4gIHZhciBzeW5jID0gdHJ1ZVxuICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkgKyspIHtcbiAgICB0aGlzLl9wcm9jZXNzKHRoaXMubWluaW1hdGNoLnNldFtpXSwgaSwgZmFsc2UsIGRvbmUpXG4gIH1cbiAgc3luYyA9IGZhbHNlXG5cbiAgZnVuY3Rpb24gZG9uZSAoKSB7XG4gICAgLS1zZWxmLl9wcm9jZXNzaW5nXG4gICAgaWYgKHNlbGYuX3Byb2Nlc3NpbmcgPD0gMCkge1xuICAgICAgaWYgKHN5bmMpIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2VsZi5fZmluaXNoKClcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYuX2ZpbmlzaCgpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbkdsb2IucHJvdG90eXBlLl9maW5pc2ggPSBmdW5jdGlvbiAoKSB7XG4gIGFzc2VydCh0aGlzIGluc3RhbmNlb2YgR2xvYilcbiAgaWYgKHRoaXMuYWJvcnRlZClcbiAgICByZXR1cm5cblxuICBpZiAodGhpcy5yZWFscGF0aCAmJiAhdGhpcy5fZGlkUmVhbHBhdGgpXG4gICAgcmV0dXJuIHRoaXMuX3JlYWxwYXRoKClcblxuICBjb21tb24uZmluaXNoKHRoaXMpXG4gIHRoaXMuZW1pdCgnZW5kJywgdGhpcy5mb3VuZClcbn1cblxuR2xvYi5wcm90b3R5cGUuX3JlYWxwYXRoID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5fZGlkUmVhbHBhdGgpXG4gICAgcmV0dXJuXG5cbiAgdGhpcy5fZGlkUmVhbHBhdGggPSB0cnVlXG5cbiAgdmFyIG4gPSB0aGlzLm1hdGNoZXMubGVuZ3RoXG4gIGlmIChuID09PSAwKVxuICAgIHJldHVybiB0aGlzLl9maW5pc2goKVxuXG4gIHZhciBzZWxmID0gdGhpc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubWF0Y2hlcy5sZW5ndGg7IGkrKylcbiAgICB0aGlzLl9yZWFscGF0aFNldChpLCBuZXh0KVxuXG4gIGZ1bmN0aW9uIG5leHQgKCkge1xuICAgIGlmICgtLW4gPT09IDApXG4gICAgICBzZWxmLl9maW5pc2goKVxuICB9XG59XG5cbkdsb2IucHJvdG90eXBlLl9yZWFscGF0aFNldCA9IGZ1bmN0aW9uIChpbmRleCwgY2IpIHtcbiAgdmFyIG1hdGNoc2V0ID0gdGhpcy5tYXRjaGVzW2luZGV4XVxuICBpZiAoIW1hdGNoc2V0KVxuICAgIHJldHVybiBjYigpXG5cbiAgdmFyIGZvdW5kID0gT2JqZWN0LmtleXMobWF0Y2hzZXQpXG4gIHZhciBzZWxmID0gdGhpc1xuICB2YXIgbiA9IGZvdW5kLmxlbmd0aFxuXG4gIGlmIChuID09PSAwKVxuICAgIHJldHVybiBjYigpXG5cbiAgdmFyIHNldCA9IHRoaXMubWF0Y2hlc1tpbmRleF0gPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gIGZvdW5kLmZvckVhY2goZnVuY3Rpb24gKHAsIGkpIHtcbiAgICAvLyBJZiB0aGVyZSdzIGEgcHJvYmxlbSB3aXRoIHRoZSBzdGF0LCB0aGVuIGl0IG1lYW5zIHRoYXRcbiAgICAvLyBvbmUgb3IgbW9yZSBvZiB0aGUgbGlua3MgaW4gdGhlIHJlYWxwYXRoIGNvdWxkbid0IGJlXG4gICAgLy8gcmVzb2x2ZWQuICBqdXN0IHJldHVybiB0aGUgYWJzIHZhbHVlIGluIHRoYXQgY2FzZS5cbiAgICBwID0gc2VsZi5fbWFrZUFicyhwKVxuICAgIHJwLnJlYWxwYXRoKHAsIHNlbGYucmVhbHBhdGhDYWNoZSwgZnVuY3Rpb24gKGVyLCByZWFsKSB7XG4gICAgICBpZiAoIWVyKVxuICAgICAgICBzZXRbcmVhbF0gPSB0cnVlXG4gICAgICBlbHNlIGlmIChlci5zeXNjYWxsID09PSAnc3RhdCcpXG4gICAgICAgIHNldFtwXSA9IHRydWVcbiAgICAgIGVsc2VcbiAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVyKSAvLyBzcnNseSB3dGYgcmlnaHQgaGVyZVxuXG4gICAgICBpZiAoLS1uID09PSAwKSB7XG4gICAgICAgIHNlbGYubWF0Y2hlc1tpbmRleF0gPSBzZXRcbiAgICAgICAgY2IoKVxuICAgICAgfVxuICAgIH0pXG4gIH0pXG59XG5cbkdsb2IucHJvdG90eXBlLl9tYXJrID0gZnVuY3Rpb24gKHApIHtcbiAgcmV0dXJuIGNvbW1vbi5tYXJrKHRoaXMsIHApXG59XG5cbkdsb2IucHJvdG90eXBlLl9tYWtlQWJzID0gZnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuIGNvbW1vbi5tYWtlQWJzKHRoaXMsIGYpXG59XG5cbkdsb2IucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmFib3J0ZWQgPSB0cnVlXG4gIHRoaXMuZW1pdCgnYWJvcnQnKVxufVxuXG5HbG9iLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLnBhdXNlZCkge1xuICAgIHRoaXMucGF1c2VkID0gdHJ1ZVxuICAgIHRoaXMuZW1pdCgncGF1c2UnKVxuICB9XG59XG5cbkdsb2IucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMucGF1c2VkKSB7XG4gICAgdGhpcy5lbWl0KCdyZXN1bWUnKVxuICAgIHRoaXMucGF1c2VkID0gZmFsc2VcbiAgICBpZiAodGhpcy5fZW1pdFF1ZXVlLmxlbmd0aCkge1xuICAgICAgdmFyIGVxID0gdGhpcy5fZW1pdFF1ZXVlLnNsaWNlKDApXG4gICAgICB0aGlzLl9lbWl0UXVldWUubGVuZ3RoID0gMFxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlcS5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgdmFyIGUgPSBlcVtpXVxuICAgICAgICB0aGlzLl9lbWl0TWF0Y2goZVswXSwgZVsxXSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX3Byb2Nlc3NRdWV1ZS5sZW5ndGgpIHtcbiAgICAgIHZhciBwcSA9IHRoaXMuX3Byb2Nlc3NRdWV1ZS5zbGljZSgwKVxuICAgICAgdGhpcy5fcHJvY2Vzc1F1ZXVlLmxlbmd0aCA9IDBcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHEubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgIHZhciBwID0gcHFbaV1cbiAgICAgICAgdGhpcy5fcHJvY2Vzc2luZy0tXG4gICAgICAgIHRoaXMuX3Byb2Nlc3MocFswXSwgcFsxXSwgcFsyXSwgcFszXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuR2xvYi5wcm90b3R5cGUuX3Byb2Nlc3MgPSBmdW5jdGlvbiAocGF0dGVybiwgaW5kZXgsIGluR2xvYlN0YXIsIGNiKSB7XG4gIGFzc2VydCh0aGlzIGluc3RhbmNlb2YgR2xvYilcbiAgYXNzZXJ0KHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcblxuICBpZiAodGhpcy5hYm9ydGVkKVxuICAgIHJldHVyblxuXG4gIHRoaXMuX3Byb2Nlc3NpbmcrK1xuICBpZiAodGhpcy5wYXVzZWQpIHtcbiAgICB0aGlzLl9wcm9jZXNzUXVldWUucHVzaChbcGF0dGVybiwgaW5kZXgsIGluR2xvYlN0YXIsIGNiXSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vY29uc29sZS5lcnJvcignUFJPQ0VTUyAlZCcsIHRoaXMuX3Byb2Nlc3NpbmcsIHBhdHRlcm4pXG5cbiAgLy8gR2V0IHRoZSBmaXJzdCBbbl0gcGFydHMgb2YgcGF0dGVybiB0aGF0IGFyZSBhbGwgc3RyaW5ncy5cbiAgdmFyIG4gPSAwXG4gIHdoaWxlICh0eXBlb2YgcGF0dGVybltuXSA9PT0gJ3N0cmluZycpIHtcbiAgICBuICsrXG4gIH1cbiAgLy8gbm93IG4gaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvbmUgdGhhdCBpcyAqbm90KiBhIHN0cmluZy5cblxuICAvLyBzZWUgaWYgdGhlcmUncyBhbnl0aGluZyBlbHNlXG4gIHZhciBwcmVmaXhcbiAgc3dpdGNoIChuKSB7XG4gICAgLy8gaWYgbm90LCB0aGVuIHRoaXMgaXMgcmF0aGVyIHNpbXBsZVxuICAgIGNhc2UgcGF0dGVybi5sZW5ndGg6XG4gICAgICB0aGlzLl9wcm9jZXNzU2ltcGxlKHBhdHRlcm4uam9pbignLycpLCBpbmRleCwgY2IpXG4gICAgICByZXR1cm5cblxuICAgIGNhc2UgMDpcbiAgICAgIC8vIHBhdHRlcm4gKnN0YXJ0cyogd2l0aCBzb21lIG5vbi10cml2aWFsIGl0ZW0uXG4gICAgICAvLyBnb2luZyB0byByZWFkZGlyKGN3ZCksIGJ1dCBub3QgaW5jbHVkZSB0aGUgcHJlZml4IGluIG1hdGNoZXMuXG4gICAgICBwcmVmaXggPSBudWxsXG4gICAgICBicmVha1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIHBhdHRlcm4gaGFzIHNvbWUgc3RyaW5nIGJpdHMgaW4gdGhlIGZyb250LlxuICAgICAgLy8gd2hhdGV2ZXIgaXQgc3RhcnRzIHdpdGgsIHdoZXRoZXIgdGhhdCdzICdhYnNvbHV0ZScgbGlrZSAvZm9vL2JhcixcbiAgICAgIC8vIG9yICdyZWxhdGl2ZScgbGlrZSAnLi4vYmF6J1xuICAgICAgcHJlZml4ID0gcGF0dGVybi5zbGljZSgwLCBuKS5qb2luKCcvJylcbiAgICAgIGJyZWFrXG4gIH1cblxuICB2YXIgcmVtYWluID0gcGF0dGVybi5zbGljZShuKVxuXG4gIC8vIGdldCB0aGUgbGlzdCBvZiBlbnRyaWVzLlxuICB2YXIgcmVhZFxuICBpZiAocHJlZml4ID09PSBudWxsKVxuICAgIHJlYWQgPSAnLidcbiAgZWxzZSBpZiAoaXNBYnNvbHV0ZShwcmVmaXgpIHx8XG4gICAgICBpc0Fic29sdXRlKHBhdHRlcm4ubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcCA9PT0gJ3N0cmluZycgPyBwIDogJ1sqXSdcbiAgICAgIH0pLmpvaW4oJy8nKSkpIHtcbiAgICBpZiAoIXByZWZpeCB8fCAhaXNBYnNvbHV0ZShwcmVmaXgpKVxuICAgICAgcHJlZml4ID0gJy8nICsgcHJlZml4XG4gICAgcmVhZCA9IHByZWZpeFxuICB9IGVsc2VcbiAgICByZWFkID0gcHJlZml4XG5cbiAgdmFyIGFicyA9IHRoaXMuX21ha2VBYnMocmVhZClcblxuICAvL2lmIGlnbm9yZWQsIHNraXAgX3Byb2Nlc3NpbmdcbiAgaWYgKGNoaWxkcmVuSWdub3JlZCh0aGlzLCByZWFkKSlcbiAgICByZXR1cm4gY2IoKVxuXG4gIHZhciBpc0dsb2JTdGFyID0gcmVtYWluWzBdID09PSBtaW5pbWF0Y2guR0xPQlNUQVJcbiAgaWYgKGlzR2xvYlN0YXIpXG4gICAgdGhpcy5fcHJvY2Vzc0dsb2JTdGFyKHByZWZpeCwgcmVhZCwgYWJzLCByZW1haW4sIGluZGV4LCBpbkdsb2JTdGFyLCBjYilcbiAgZWxzZVxuICAgIHRoaXMuX3Byb2Nlc3NSZWFkZGlyKHByZWZpeCwgcmVhZCwgYWJzLCByZW1haW4sIGluZGV4LCBpbkdsb2JTdGFyLCBjYilcbn1cblxuR2xvYi5wcm90b3R5cGUuX3Byb2Nlc3NSZWFkZGlyID0gZnVuY3Rpb24gKHByZWZpeCwgcmVhZCwgYWJzLCByZW1haW4sIGluZGV4LCBpbkdsb2JTdGFyLCBjYikge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdGhpcy5fcmVhZGRpcihhYnMsIGluR2xvYlN0YXIsIGZ1bmN0aW9uIChlciwgZW50cmllcykge1xuICAgIHJldHVybiBzZWxmLl9wcm9jZXNzUmVhZGRpcjIocHJlZml4LCByZWFkLCBhYnMsIHJlbWFpbiwgaW5kZXgsIGluR2xvYlN0YXIsIGVudHJpZXMsIGNiKVxuICB9KVxufVxuXG5HbG9iLnByb3RvdHlwZS5fcHJvY2Vzc1JlYWRkaXIyID0gZnVuY3Rpb24gKHByZWZpeCwgcmVhZCwgYWJzLCByZW1haW4sIGluZGV4LCBpbkdsb2JTdGFyLCBlbnRyaWVzLCBjYikge1xuXG4gIC8vIGlmIHRoZSBhYnMgaXNuJ3QgYSBkaXIsIHRoZW4gbm90aGluZyBjYW4gbWF0Y2ghXG4gIGlmICghZW50cmllcylcbiAgICByZXR1cm4gY2IoKVxuXG4gIC8vIEl0IHdpbGwgb25seSBtYXRjaCBkb3QgZW50cmllcyBpZiBpdCBzdGFydHMgd2l0aCBhIGRvdCwgb3IgaWZcbiAgLy8gZG90IGlzIHNldC4gIFN0dWZmIGxpa2UgQCguZm9vfC5iYXIpIGlzbid0IGFsbG93ZWQuXG4gIHZhciBwbiA9IHJlbWFpblswXVxuICB2YXIgbmVnYXRlID0gISF0aGlzLm1pbmltYXRjaC5uZWdhdGVcbiAgdmFyIHJhd0dsb2IgPSBwbi5fZ2xvYlxuICB2YXIgZG90T2sgPSB0aGlzLmRvdCB8fCByYXdHbG9iLmNoYXJBdCgwKSA9PT0gJy4nXG5cbiAgdmFyIG1hdGNoZWRFbnRyaWVzID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGUgPSBlbnRyaWVzW2ldXG4gICAgaWYgKGUuY2hhckF0KDApICE9PSAnLicgfHwgZG90T2spIHtcbiAgICAgIHZhciBtXG4gICAgICBpZiAobmVnYXRlICYmICFwcmVmaXgpIHtcbiAgICAgICAgbSA9ICFlLm1hdGNoKHBuKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbSA9IGUubWF0Y2gocG4pXG4gICAgICB9XG4gICAgICBpZiAobSlcbiAgICAgICAgbWF0Y2hlZEVudHJpZXMucHVzaChlKVxuICAgIH1cbiAgfVxuXG4gIC8vY29uc29sZS5lcnJvcigncHJkMicsIHByZWZpeCwgZW50cmllcywgcmVtYWluWzBdLl9nbG9iLCBtYXRjaGVkRW50cmllcylcblxuICB2YXIgbGVuID0gbWF0Y2hlZEVudHJpZXMubGVuZ3RoXG4gIC8vIElmIHRoZXJlIGFyZSBubyBtYXRjaGVkIGVudHJpZXMsIHRoZW4gbm90aGluZyBtYXRjaGVzLlxuICBpZiAobGVuID09PSAwKVxuICAgIHJldHVybiBjYigpXG5cbiAgLy8gaWYgdGhpcyBpcyB0aGUgbGFzdCByZW1haW5pbmcgcGF0dGVybiBiaXQsIHRoZW4gbm8gbmVlZCBmb3JcbiAgLy8gYW4gYWRkaXRpb25hbCBzdGF0ICp1bmxlc3MqIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgbWFyayBvclxuICAvLyBzdGF0IGV4cGxpY2l0bHkuICBXZSBrbm93IHRoZXkgZXhpc3QsIHNpbmNlIHJlYWRkaXIgcmV0dXJuZWRcbiAgLy8gdGhlbS5cblxuICBpZiAocmVtYWluLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5tYXJrICYmICF0aGlzLnN0YXQpIHtcbiAgICBpZiAoIXRoaXMubWF0Y2hlc1tpbmRleF0pXG4gICAgICB0aGlzLm1hdGNoZXNbaW5kZXhdID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKyspIHtcbiAgICAgIHZhciBlID0gbWF0Y2hlZEVudHJpZXNbaV1cbiAgICAgIGlmIChwcmVmaXgpIHtcbiAgICAgICAgaWYgKHByZWZpeCAhPT0gJy8nKVxuICAgICAgICAgIGUgPSBwcmVmaXggKyAnLycgKyBlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBlID0gcHJlZml4ICsgZVxuICAgICAgfVxuXG4gICAgICBpZiAoZS5jaGFyQXQoMCkgPT09ICcvJyAmJiAhdGhpcy5ub21vdW50KSB7XG4gICAgICAgIGUgPSBwYXRoLmpvaW4odGhpcy5yb290LCBlKVxuICAgICAgfVxuICAgICAgdGhpcy5fZW1pdE1hdGNoKGluZGV4LCBlKVxuICAgIH1cbiAgICAvLyBUaGlzIHdhcyB0aGUgbGFzdCBvbmUsIGFuZCBubyBzdGF0cyB3ZXJlIG5lZWRlZFxuICAgIHJldHVybiBjYigpXG4gIH1cblxuICAvLyBub3cgdGVzdCBhbGwgbWF0Y2hlZCBlbnRyaWVzIGFzIHN0YW5kLWlucyBmb3IgdGhhdCBwYXJ0XG4gIC8vIG9mIHRoZSBwYXR0ZXJuLlxuICByZW1haW4uc2hpZnQoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArKykge1xuICAgIHZhciBlID0gbWF0Y2hlZEVudHJpZXNbaV1cbiAgICB2YXIgbmV3UGF0dGVyblxuICAgIGlmIChwcmVmaXgpIHtcbiAgICAgIGlmIChwcmVmaXggIT09ICcvJylcbiAgICAgICAgZSA9IHByZWZpeCArICcvJyArIGVcbiAgICAgIGVsc2VcbiAgICAgICAgZSA9IHByZWZpeCArIGVcbiAgICB9XG4gICAgdGhpcy5fcHJvY2VzcyhbZV0uY29uY2F0KHJlbWFpbiksIGluZGV4LCBpbkdsb2JTdGFyLCBjYilcbiAgfVxuICBjYigpXG59XG5cbkdsb2IucHJvdG90eXBlLl9lbWl0TWF0Y2ggPSBmdW5jdGlvbiAoaW5kZXgsIGUpIHtcbiAgaWYgKHRoaXMuYWJvcnRlZClcbiAgICByZXR1cm5cblxuICBpZiAoaXNJZ25vcmVkKHRoaXMsIGUpKVxuICAgIHJldHVyblxuXG4gIGlmICh0aGlzLnBhdXNlZCkge1xuICAgIHRoaXMuX2VtaXRRdWV1ZS5wdXNoKFtpbmRleCwgZV0pXG4gICAgcmV0dXJuXG4gIH1cblxuICB2YXIgYWJzID0gaXNBYnNvbHV0ZShlKSA/IGUgOiB0aGlzLl9tYWtlQWJzKGUpXG5cbiAgaWYgKHRoaXMubWFyaylcbiAgICBlID0gdGhpcy5fbWFyayhlKVxuXG4gIGlmICh0aGlzLmFic29sdXRlKVxuICAgIGUgPSBhYnNcblxuICBpZiAodGhpcy5tYXRjaGVzW2luZGV4XVtlXSlcbiAgICByZXR1cm5cblxuICBpZiAodGhpcy5ub2Rpcikge1xuICAgIHZhciBjID0gdGhpcy5jYWNoZVthYnNdXG4gICAgaWYgKGMgPT09ICdESVInIHx8IEFycmF5LmlzQXJyYXkoYykpXG4gICAgICByZXR1cm5cbiAgfVxuXG4gIHRoaXMubWF0Y2hlc1tpbmRleF1bZV0gPSB0cnVlXG5cbiAgdmFyIHN0ID0gdGhpcy5zdGF0Q2FjaGVbYWJzXVxuICBpZiAoc3QpXG4gICAgdGhpcy5lbWl0KCdzdGF0JywgZSwgc3QpXG5cbiAgdGhpcy5lbWl0KCdtYXRjaCcsIGUpXG59XG5cbkdsb2IucHJvdG90eXBlLl9yZWFkZGlySW5HbG9iU3RhciA9IGZ1bmN0aW9uIChhYnMsIGNiKSB7XG4gIGlmICh0aGlzLmFib3J0ZWQpXG4gICAgcmV0dXJuXG5cbiAgLy8gZm9sbG93IGFsbCBzeW1saW5rZWQgZGlyZWN0b3JpZXMgZm9yZXZlclxuICAvLyBqdXN0IHByb2NlZWQgYXMgaWYgdGhpcyBpcyBhIG5vbi1nbG9ic3RhciBzaXR1YXRpb25cbiAgaWYgKHRoaXMuZm9sbG93KVxuICAgIHJldHVybiB0aGlzLl9yZWFkZGlyKGFicywgZmFsc2UsIGNiKVxuXG4gIHZhciBsc3RhdGtleSA9ICdsc3RhdFxcMCcgKyBhYnNcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciBsc3RhdGNiID0gaW5mbGlnaHQobHN0YXRrZXksIGxzdGF0Y2JfKVxuXG4gIGlmIChsc3RhdGNiKVxuICAgIHNlbGYuZnMubHN0YXQoYWJzLCBsc3RhdGNiKVxuXG4gIGZ1bmN0aW9uIGxzdGF0Y2JfIChlciwgbHN0YXQpIHtcbiAgICBpZiAoZXIgJiYgZXIuY29kZSA9PT0gJ0VOT0VOVCcpXG4gICAgICByZXR1cm4gY2IoKVxuXG4gICAgdmFyIGlzU3ltID0gbHN0YXQgJiYgbHN0YXQuaXNTeW1ib2xpY0xpbmsoKVxuICAgIHNlbGYuc3ltbGlua3NbYWJzXSA9IGlzU3ltXG5cbiAgICAvLyBJZiBpdCdzIG5vdCBhIHN5bWxpbmsgb3IgYSBkaXIsIHRoZW4gaXQncyBkZWZpbml0ZWx5IGEgcmVndWxhciBmaWxlLlxuICAgIC8vIGRvbid0IGJvdGhlciBkb2luZyBhIHJlYWRkaXIgaW4gdGhhdCBjYXNlLlxuICAgIGlmICghaXNTeW0gJiYgbHN0YXQgJiYgIWxzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHNlbGYuY2FjaGVbYWJzXSA9ICdGSUxFJ1xuICAgICAgY2IoKVxuICAgIH0gZWxzZVxuICAgICAgc2VsZi5fcmVhZGRpcihhYnMsIGZhbHNlLCBjYilcbiAgfVxufVxuXG5HbG9iLnByb3RvdHlwZS5fcmVhZGRpciA9IGZ1bmN0aW9uIChhYnMsIGluR2xvYlN0YXIsIGNiKSB7XG4gIGlmICh0aGlzLmFib3J0ZWQpXG4gICAgcmV0dXJuXG5cbiAgY2IgPSBpbmZsaWdodCgncmVhZGRpclxcMCcrYWJzKydcXDAnK2luR2xvYlN0YXIsIGNiKVxuICBpZiAoIWNiKVxuICAgIHJldHVyblxuXG4gIC8vY29uc29sZS5lcnJvcignUkQgJWogJWonLCAraW5HbG9iU3RhciwgYWJzKVxuICBpZiAoaW5HbG9iU3RhciAmJiAhb3duUHJvcCh0aGlzLnN5bWxpbmtzLCBhYnMpKVxuICAgIHJldHVybiB0aGlzLl9yZWFkZGlySW5HbG9iU3RhcihhYnMsIGNiKVxuXG4gIGlmIChvd25Qcm9wKHRoaXMuY2FjaGUsIGFicykpIHtcbiAgICB2YXIgYyA9IHRoaXMuY2FjaGVbYWJzXVxuICAgIGlmICghYyB8fCBjID09PSAnRklMRScpXG4gICAgICByZXR1cm4gY2IoKVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYykpXG4gICAgICByZXR1cm4gY2IobnVsbCwgYylcbiAgfVxuXG4gIHZhciBzZWxmID0gdGhpc1xuICBzZWxmLmZzLnJlYWRkaXIoYWJzLCByZWFkZGlyQ2IodGhpcywgYWJzLCBjYikpXG59XG5cbmZ1bmN0aW9uIHJlYWRkaXJDYiAoc2VsZiwgYWJzLCBjYikge1xuICByZXR1cm4gZnVuY3Rpb24gKGVyLCBlbnRyaWVzKSB7XG4gICAgaWYgKGVyKVxuICAgICAgc2VsZi5fcmVhZGRpckVycm9yKGFicywgZXIsIGNiKVxuICAgIGVsc2VcbiAgICAgIHNlbGYuX3JlYWRkaXJFbnRyaWVzKGFicywgZW50cmllcywgY2IpXG4gIH1cbn1cblxuR2xvYi5wcm90b3R5cGUuX3JlYWRkaXJFbnRyaWVzID0gZnVuY3Rpb24gKGFicywgZW50cmllcywgY2IpIHtcbiAgaWYgKHRoaXMuYWJvcnRlZClcbiAgICByZXR1cm5cblxuICAvLyBpZiB3ZSBoYXZlbid0IGFza2VkIHRvIHN0YXQgZXZlcnl0aGluZywgdGhlbiBqdXN0XG4gIC8vIGFzc3VtZSB0aGF0IGV2ZXJ5dGhpbmcgaW4gdGhlcmUgZXhpc3RzLCBzbyB3ZSBjYW4gYXZvaWRcbiAgLy8gaGF2aW5nIHRvIHN0YXQgaXQgYSBzZWNvbmQgdGltZS5cbiAgaWYgKCF0aGlzLm1hcmsgJiYgIXRoaXMuc3RhdCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkgKyspIHtcbiAgICAgIHZhciBlID0gZW50cmllc1tpXVxuICAgICAgaWYgKGFicyA9PT0gJy8nKVxuICAgICAgICBlID0gYWJzICsgZVxuICAgICAgZWxzZVxuICAgICAgICBlID0gYWJzICsgJy8nICsgZVxuICAgICAgdGhpcy5jYWNoZVtlXSA9IHRydWVcbiAgICB9XG4gIH1cblxuICB0aGlzLmNhY2hlW2Fic10gPSBlbnRyaWVzXG4gIHJldHVybiBjYihudWxsLCBlbnRyaWVzKVxufVxuXG5HbG9iLnByb3RvdHlwZS5fcmVhZGRpckVycm9yID0gZnVuY3Rpb24gKGYsIGVyLCBjYikge1xuICBpZiAodGhpcy5hYm9ydGVkKVxuICAgIHJldHVyblxuXG4gIC8vIGhhbmRsZSBlcnJvcnMsIGFuZCBjYWNoZSB0aGUgaW5mb3JtYXRpb25cbiAgc3dpdGNoIChlci5jb2RlKSB7XG4gICAgY2FzZSAnRU5PVFNVUCc6IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9pc2FhY3Mvbm9kZS1nbG9iL2lzc3Vlcy8yMDVcbiAgICBjYXNlICdFTk9URElSJzogLy8gdG90YWxseSBub3JtYWwuIG1lYW5zIGl0ICpkb2VzKiBleGlzdC5cbiAgICAgIHZhciBhYnMgPSB0aGlzLl9tYWtlQWJzKGYpXG4gICAgICB0aGlzLmNhY2hlW2Fic10gPSAnRklMRSdcbiAgICAgIGlmIChhYnMgPT09IHRoaXMuY3dkQWJzKSB7XG4gICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcihlci5jb2RlICsgJyBpbnZhbGlkIGN3ZCAnICsgdGhpcy5jd2QpXG4gICAgICAgIGVycm9yLnBhdGggPSB0aGlzLmN3ZFxuICAgICAgICBlcnJvci5jb2RlID0gZXIuY29kZVxuICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpXG4gICAgICAgIHRoaXMuYWJvcnQoKVxuICAgICAgfVxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgJ0VOT0VOVCc6IC8vIG5vdCB0ZXJyaWJseSB1bnVzdWFsXG4gICAgY2FzZSAnRUxPT1AnOlxuICAgIGNhc2UgJ0VOQU1FVE9PTE9ORyc6XG4gICAgY2FzZSAnVU5LTk9XTic6XG4gICAgICB0aGlzLmNhY2hlW3RoaXMuX21ha2VBYnMoZildID0gZmFsc2VcbiAgICAgIGJyZWFrXG5cbiAgICBkZWZhdWx0OiAvLyBzb21lIHVudXN1YWwgZXJyb3IuICBUcmVhdCBhcyBmYWlsdXJlLlxuICAgICAgdGhpcy5jYWNoZVt0aGlzLl9tYWtlQWJzKGYpXSA9IGZhbHNlXG4gICAgICBpZiAodGhpcy5zdHJpY3QpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVyKVxuICAgICAgICAvLyBJZiB0aGUgZXJyb3IgaXMgaGFuZGxlZCwgdGhlbiB3ZSBhYm9ydFxuICAgICAgICAvLyBpZiBub3QsIHdlIHRocmV3IG91dCBvZiBoZXJlXG4gICAgICAgIHRoaXMuYWJvcnQoKVxuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLnNpbGVudClcbiAgICAgICAgY29uc29sZS5lcnJvcignZ2xvYiBlcnJvcicsIGVyKVxuICAgICAgYnJlYWtcbiAgfVxuXG4gIHJldHVybiBjYigpXG59XG5cbkdsb2IucHJvdG90eXBlLl9wcm9jZXNzR2xvYlN0YXIgPSBmdW5jdGlvbiAocHJlZml4LCByZWFkLCBhYnMsIHJlbWFpbiwgaW5kZXgsIGluR2xvYlN0YXIsIGNiKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICB0aGlzLl9yZWFkZGlyKGFicywgaW5HbG9iU3RhciwgZnVuY3Rpb24gKGVyLCBlbnRyaWVzKSB7XG4gICAgc2VsZi5fcHJvY2Vzc0dsb2JTdGFyMihwcmVmaXgsIHJlYWQsIGFicywgcmVtYWluLCBpbmRleCwgaW5HbG9iU3RhciwgZW50cmllcywgY2IpXG4gIH0pXG59XG5cblxuR2xvYi5wcm90b3R5cGUuX3Byb2Nlc3NHbG9iU3RhcjIgPSBmdW5jdGlvbiAocHJlZml4LCByZWFkLCBhYnMsIHJlbWFpbiwgaW5kZXgsIGluR2xvYlN0YXIsIGVudHJpZXMsIGNiKSB7XG4gIC8vY29uc29sZS5lcnJvcigncGdzMicsIHByZWZpeCwgcmVtYWluWzBdLCBlbnRyaWVzKVxuXG4gIC8vIG5vIGVudHJpZXMgbWVhbnMgbm90IGEgZGlyLCBzbyBpdCBjYW4gbmV2ZXIgaGF2ZSBtYXRjaGVzXG4gIC8vIGZvby50eHQvKiogZG9lc24ndCBtYXRjaCBmb28udHh0XG4gIGlmICghZW50cmllcylcbiAgICByZXR1cm4gY2IoKVxuXG4gIC8vIHRlc3Qgd2l0aG91dCB0aGUgZ2xvYnN0YXIsIGFuZCB3aXRoIGV2ZXJ5IGNoaWxkIGJvdGggYmVsb3dcbiAgLy8gYW5kIHJlcGxhY2luZyB0aGUgZ2xvYnN0YXIuXG4gIHZhciByZW1haW5XaXRob3V0R2xvYlN0YXIgPSByZW1haW4uc2xpY2UoMSlcbiAgdmFyIGdzcHJlZiA9IHByZWZpeCA/IFsgcHJlZml4IF0gOiBbXVxuICB2YXIgbm9HbG9iU3RhciA9IGdzcHJlZi5jb25jYXQocmVtYWluV2l0aG91dEdsb2JTdGFyKVxuXG4gIC8vIHRoZSBub0dsb2JTdGFyIHBhdHRlcm4gZXhpdHMgdGhlIGluR2xvYlN0YXIgc3RhdGVcbiAgdGhpcy5fcHJvY2Vzcyhub0dsb2JTdGFyLCBpbmRleCwgZmFsc2UsIGNiKVxuXG4gIHZhciBpc1N5bSA9IHRoaXMuc3ltbGlua3NbYWJzXVxuICB2YXIgbGVuID0gZW50cmllcy5sZW5ndGhcblxuICAvLyBJZiBpdCdzIGEgc3ltbGluaywgYW5kIHdlJ3JlIGluIGEgZ2xvYnN0YXIsIHRoZW4gc3RvcFxuICBpZiAoaXNTeW0gJiYgaW5HbG9iU3RhcilcbiAgICByZXR1cm4gY2IoKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgZSA9IGVudHJpZXNbaV1cbiAgICBpZiAoZS5jaGFyQXQoMCkgPT09ICcuJyAmJiAhdGhpcy5kb3QpXG4gICAgICBjb250aW51ZVxuXG4gICAgLy8gdGhlc2UgdHdvIGNhc2VzIGVudGVyIHRoZSBpbkdsb2JTdGFyIHN0YXRlXG4gICAgdmFyIGluc3RlYWQgPSBnc3ByZWYuY29uY2F0KGVudHJpZXNbaV0sIHJlbWFpbldpdGhvdXRHbG9iU3RhcilcbiAgICB0aGlzLl9wcm9jZXNzKGluc3RlYWQsIGluZGV4LCB0cnVlLCBjYilcblxuICAgIHZhciBiZWxvdyA9IGdzcHJlZi5jb25jYXQoZW50cmllc1tpXSwgcmVtYWluKVxuICAgIHRoaXMuX3Byb2Nlc3MoYmVsb3csIGluZGV4LCB0cnVlLCBjYilcbiAgfVxuXG4gIGNiKClcbn1cblxuR2xvYi5wcm90b3R5cGUuX3Byb2Nlc3NTaW1wbGUgPSBmdW5jdGlvbiAocHJlZml4LCBpbmRleCwgY2IpIHtcbiAgLy8gWFhYIHJldmlldyB0aGlzLiAgU2hvdWxkbid0IGl0IGJlIGRvaW5nIHRoZSBtb3VudGluZyBldGNcbiAgLy8gYmVmb3JlIGRvaW5nIHN0YXQ/ICBraW5kYSB3ZWlyZD9cbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHRoaXMuX3N0YXQocHJlZml4LCBmdW5jdGlvbiAoZXIsIGV4aXN0cykge1xuICAgIHNlbGYuX3Byb2Nlc3NTaW1wbGUyKHByZWZpeCwgaW5kZXgsIGVyLCBleGlzdHMsIGNiKVxuICB9KVxufVxuR2xvYi5wcm90b3R5cGUuX3Byb2Nlc3NTaW1wbGUyID0gZnVuY3Rpb24gKHByZWZpeCwgaW5kZXgsIGVyLCBleGlzdHMsIGNiKSB7XG5cbiAgLy9jb25zb2xlLmVycm9yKCdwczInLCBwcmVmaXgsIGV4aXN0cylcblxuICBpZiAoIXRoaXMubWF0Y2hlc1tpbmRleF0pXG4gICAgdGhpcy5tYXRjaGVzW2luZGV4XSA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuICAvLyBJZiBpdCBkb2Vzbid0IGV4aXN0LCB0aGVuIGp1c3QgbWFyayB0aGUgbGFjayBvZiByZXN1bHRzXG4gIGlmICghZXhpc3RzKVxuICAgIHJldHVybiBjYigpXG5cbiAgaWYgKHByZWZpeCAmJiBpc0Fic29sdXRlKHByZWZpeCkgJiYgIXRoaXMubm9tb3VudCkge1xuICAgIHZhciB0cmFpbCA9IC9bXFwvXFxcXF0kLy50ZXN0KHByZWZpeClcbiAgICBpZiAocHJlZml4LmNoYXJBdCgwKSA9PT0gJy8nKSB7XG4gICAgICBwcmVmaXggPSBwYXRoLmpvaW4odGhpcy5yb290LCBwcmVmaXgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpeCA9IHBhdGgucmVzb2x2ZSh0aGlzLnJvb3QsIHByZWZpeClcbiAgICAgIGlmICh0cmFpbClcbiAgICAgICAgcHJlZml4ICs9ICcvJ1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKVxuICAgIHByZWZpeCA9IHByZWZpeC5yZXBsYWNlKC9cXFxcL2csICcvJylcblxuICAvLyBNYXJrIHRoaXMgYXMgYSBtYXRjaFxuICB0aGlzLl9lbWl0TWF0Y2goaW5kZXgsIHByZWZpeClcbiAgY2IoKVxufVxuXG4vLyBSZXR1cm5zIGVpdGhlciAnRElSJywgJ0ZJTEUnLCBvciBmYWxzZVxuR2xvYi5wcm90b3R5cGUuX3N0YXQgPSBmdW5jdGlvbiAoZiwgY2IpIHtcbiAgdmFyIGFicyA9IHRoaXMuX21ha2VBYnMoZilcbiAgdmFyIG5lZWREaXIgPSBmLnNsaWNlKC0xKSA9PT0gJy8nXG5cbiAgaWYgKGYubGVuZ3RoID4gdGhpcy5tYXhMZW5ndGgpXG4gICAgcmV0dXJuIGNiKClcblxuICBpZiAoIXRoaXMuc3RhdCAmJiBvd25Qcm9wKHRoaXMuY2FjaGUsIGFicykpIHtcbiAgICB2YXIgYyA9IHRoaXMuY2FjaGVbYWJzXVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYykpXG4gICAgICBjID0gJ0RJUidcblxuICAgIC8vIEl0IGV4aXN0cywgYnV0IG1heWJlIG5vdCBob3cgd2UgbmVlZCBpdFxuICAgIGlmICghbmVlZERpciB8fCBjID09PSAnRElSJylcbiAgICAgIHJldHVybiBjYihudWxsLCBjKVxuXG4gICAgaWYgKG5lZWREaXIgJiYgYyA9PT0gJ0ZJTEUnKVxuICAgICAgcmV0dXJuIGNiKClcblxuICAgIC8vIG90aGVyd2lzZSB3ZSBoYXZlIHRvIHN0YXQsIGJlY2F1c2UgbWF5YmUgYz10cnVlXG4gICAgLy8gaWYgd2Uga25vdyBpdCBleGlzdHMsIGJ1dCBub3Qgd2hhdCBpdCBpcy5cbiAgfVxuXG4gIHZhciBleGlzdHNcbiAgdmFyIHN0YXQgPSB0aGlzLnN0YXRDYWNoZVthYnNdXG4gIGlmIChzdGF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoc3RhdCA9PT0gZmFsc2UpXG4gICAgICByZXR1cm4gY2IobnVsbCwgc3RhdClcbiAgICBlbHNlIHtcbiAgICAgIHZhciB0eXBlID0gc3RhdC5pc0RpcmVjdG9yeSgpID8gJ0RJUicgOiAnRklMRSdcbiAgICAgIGlmIChuZWVkRGlyICYmIHR5cGUgPT09ICdGSUxFJylcbiAgICAgICAgcmV0dXJuIGNiKClcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGNiKG51bGwsIHR5cGUsIHN0YXQpXG4gICAgfVxuICB9XG5cbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciBzdGF0Y2IgPSBpbmZsaWdodCgnc3RhdFxcMCcgKyBhYnMsIGxzdGF0Y2JfKVxuICBpZiAoc3RhdGNiKVxuICAgIHNlbGYuZnMubHN0YXQoYWJzLCBzdGF0Y2IpXG5cbiAgZnVuY3Rpb24gbHN0YXRjYl8gKGVyLCBsc3RhdCkge1xuICAgIGlmIChsc3RhdCAmJiBsc3RhdC5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAvLyBJZiBpdCdzIGEgc3ltbGluaywgdGhlbiB0cmVhdCBpdCBhcyB0aGUgdGFyZ2V0LCB1bmxlc3NcbiAgICAgIC8vIHRoZSB0YXJnZXQgZG9lcyBub3QgZXhpc3QsIHRoZW4gdHJlYXQgaXQgYXMgYSBmaWxlLlxuICAgICAgcmV0dXJuIHNlbGYuZnMuc3RhdChhYnMsIGZ1bmN0aW9uIChlciwgc3RhdCkge1xuICAgICAgICBpZiAoZXIpXG4gICAgICAgICAgc2VsZi5fc3RhdDIoZiwgYWJzLCBudWxsLCBsc3RhdCwgY2IpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBzZWxmLl9zdGF0MihmLCBhYnMsIGVyLCBzdGF0LCBjYilcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuX3N0YXQyKGYsIGFicywgZXIsIGxzdGF0LCBjYilcbiAgICB9XG4gIH1cbn1cblxuR2xvYi5wcm90b3R5cGUuX3N0YXQyID0gZnVuY3Rpb24gKGYsIGFicywgZXIsIHN0YXQsIGNiKSB7XG4gIGlmIChlciAmJiAoZXIuY29kZSA9PT0gJ0VOT0VOVCcgfHwgZXIuY29kZSA9PT0gJ0VOT1RESVInKSkge1xuICAgIHRoaXMuc3RhdENhY2hlW2Fic10gPSBmYWxzZVxuICAgIHJldHVybiBjYigpXG4gIH1cblxuICB2YXIgbmVlZERpciA9IGYuc2xpY2UoLTEpID09PSAnLydcbiAgdGhpcy5zdGF0Q2FjaGVbYWJzXSA9IHN0YXRcblxuICBpZiAoYWJzLnNsaWNlKC0xKSA9PT0gJy8nICYmIHN0YXQgJiYgIXN0YXQuaXNEaXJlY3RvcnkoKSlcbiAgICByZXR1cm4gY2IobnVsbCwgZmFsc2UsIHN0YXQpXG5cbiAgdmFyIGMgPSB0cnVlXG4gIGlmIChzdGF0KVxuICAgIGMgPSBzdGF0LmlzRGlyZWN0b3J5KCkgPyAnRElSJyA6ICdGSUxFJ1xuICB0aGlzLmNhY2hlW2Fic10gPSB0aGlzLmNhY2hlW2Fic10gfHwgY1xuXG4gIGlmIChuZWVkRGlyICYmIGMgPT09ICdGSUxFJylcbiAgICByZXR1cm4gY2IoKVxuXG4gIHJldHVybiBjYihudWxsLCBjLCBzdGF0KVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2884\n")},4751:(module,__unused_webpack_exports,__webpack_require__)=>{eval("module.exports = globSync\nglobSync.GlobSync = GlobSync\n\nvar rp = __webpack_require__(7334)\nvar minimatch = __webpack_require__(1171)\nvar Minimatch = minimatch.Minimatch\nvar Glob = (__webpack_require__(2884).Glob)\nvar util = __webpack_require__(3837)\nvar path = __webpack_require__(1017)\nvar assert = __webpack_require__(9491)\nvar isAbsolute = __webpack_require__(4095)\nvar common = __webpack_require__(6772)\nvar setopts = common.setopts\nvar ownProp = common.ownProp\nvar childrenIgnored = common.childrenIgnored\nvar isIgnored = common.isIgnored\n\nfunction globSync (pattern, options) {\n if (typeof options === 'function' || arguments.length === 3)\n throw new TypeError('callback provided to sync glob\\n'+\n 'See: https://github.com/isaacs/node-glob/issues/167')\n\n return new GlobSync(pattern, options).found\n}\n\nfunction GlobSync (pattern, options) {\n if (!pattern)\n throw new Error('must provide pattern')\n\n if (typeof options === 'function' || arguments.length === 3)\n throw new TypeError('callback provided to sync glob\\n'+\n 'See: https://github.com/isaacs/node-glob/issues/167')\n\n if (!(this instanceof GlobSync))\n return new GlobSync(pattern, options)\n\n setopts(this, pattern, options)\n\n if (this.noprocess)\n return this\n\n var n = this.minimatch.set.length\n this.matches = new Array(n)\n for (var i = 0; i < n; i ++) {\n this._process(this.minimatch.set[i], i, false)\n }\n this._finish()\n}\n\nGlobSync.prototype._finish = function () {\n assert.ok(this instanceof GlobSync)\n if (this.realpath) {\n var self = this\n this.matches.forEach(function (matchset, index) {\n var set = self.matches[index] = Object.create(null)\n for (var p in matchset) {\n try {\n p = self._makeAbs(p)\n var real = rp.realpathSync(p, self.realpathCache)\n set[real] = true\n } catch (er) {\n if (er.syscall === 'stat')\n set[self._makeAbs(p)] = true\n else\n throw er\n }\n }\n })\n }\n common.finish(this)\n}\n\n\nGlobSync.prototype._process = function (pattern, index, inGlobStar) {\n assert.ok(this instanceof GlobSync)\n\n // Get the first [n] parts of pattern that are all strings.\n var n = 0\n while (typeof pattern[n] === 'string') {\n n ++\n }\n // now n is the index of the first one that is *not* a string.\n\n // See if there's anything else\n var prefix\n switch (n) {\n // if not, then this is rather simple\n case pattern.length:\n this._processSimple(pattern.join('/'), index)\n return\n\n case 0:\n // pattern *starts* with some non-trivial item.\n // going to readdir(cwd), but not include the prefix in matches.\n prefix = null\n break\n\n default:\n // pattern has some string bits in the front.\n // whatever it starts with, whether that's 'absolute' like /foo/bar,\n // or 'relative' like '../baz'\n prefix = pattern.slice(0, n).join('/')\n break\n }\n\n var remain = pattern.slice(n)\n\n // get the list of entries.\n var read\n if (prefix === null)\n read = '.'\n else if (isAbsolute(prefix) ||\n isAbsolute(pattern.map(function (p) {\n return typeof p === 'string' ? p : '[*]'\n }).join('/'))) {\n if (!prefix || !isAbsolute(prefix))\n prefix = '/' + prefix\n read = prefix\n } else\n read = prefix\n\n var abs = this._makeAbs(read)\n\n //if ignored, skip processing\n if (childrenIgnored(this, read))\n return\n\n var isGlobStar = remain[0] === minimatch.GLOBSTAR\n if (isGlobStar)\n this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)\n else\n this._processReaddir(prefix, read, abs, remain, index, inGlobStar)\n}\n\n\nGlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {\n var entries = this._readdir(abs, inGlobStar)\n\n // if the abs isn't a dir, then nothing can match!\n if (!entries)\n return\n\n // It will only match dot entries if it starts with a dot, or if\n // dot is set. Stuff like @(.foo|.bar) isn't allowed.\n var pn = remain[0]\n var negate = !!this.minimatch.negate\n var rawGlob = pn._glob\n var dotOk = this.dot || rawGlob.charAt(0) === '.'\n\n var matchedEntries = []\n for (var i = 0; i < entries.length; i++) {\n var e = entries[i]\n if (e.charAt(0) !== '.' || dotOk) {\n var m\n if (negate && !prefix) {\n m = !e.match(pn)\n } else {\n m = e.match(pn)\n }\n if (m)\n matchedEntries.push(e)\n }\n }\n\n var len = matchedEntries.length\n // If there are no matched entries, then nothing matches.\n if (len === 0)\n return\n\n // if this is the last remaining pattern bit, then no need for\n // an additional stat *unless* the user has specified mark or\n // stat explicitly. We know they exist, since readdir returned\n // them.\n\n if (remain.length === 1 && !this.mark && !this.stat) {\n if (!this.matches[index])\n this.matches[index] = Object.create(null)\n\n for (var i = 0; i < len; i ++) {\n var e = matchedEntries[i]\n if (prefix) {\n if (prefix.slice(-1) !== '/')\n e = prefix + '/' + e\n else\n e = prefix + e\n }\n\n if (e.charAt(0) === '/' && !this.nomount) {\n e = path.join(this.root, e)\n }\n this._emitMatch(index, e)\n }\n // This was the last one, and no stats were needed\n return\n }\n\n // now test all matched entries as stand-ins for that part\n // of the pattern.\n remain.shift()\n for (var i = 0; i < len; i ++) {\n var e = matchedEntries[i]\n var newPattern\n if (prefix)\n newPattern = [prefix, e]\n else\n newPattern = [e]\n this._process(newPattern.concat(remain), index, inGlobStar)\n }\n}\n\n\nGlobSync.prototype._emitMatch = function (index, e) {\n if (isIgnored(this, e))\n return\n\n var abs = this._makeAbs(e)\n\n if (this.mark)\n e = this._mark(e)\n\n if (this.absolute) {\n e = abs\n }\n\n if (this.matches[index][e])\n return\n\n if (this.nodir) {\n var c = this.cache[abs]\n if (c === 'DIR' || Array.isArray(c))\n return\n }\n\n this.matches[index][e] = true\n\n if (this.stat)\n this._stat(e)\n}\n\n\nGlobSync.prototype._readdirInGlobStar = function (abs) {\n // follow all symlinked directories forever\n // just proceed as if this is a non-globstar situation\n if (this.follow)\n return this._readdir(abs, false)\n\n var entries\n var lstat\n var stat\n try {\n lstat = this.fs.lstatSync(abs)\n } catch (er) {\n if (er.code === 'ENOENT') {\n // lstat failed, doesn't exist\n return null\n }\n }\n\n var isSym = lstat && lstat.isSymbolicLink()\n this.symlinks[abs] = isSym\n\n // If it's not a symlink or a dir, then it's definitely a regular file.\n // don't bother doing a readdir in that case.\n if (!isSym && lstat && !lstat.isDirectory())\n this.cache[abs] = 'FILE'\n else\n entries = this._readdir(abs, false)\n\n return entries\n}\n\nGlobSync.prototype._readdir = function (abs, inGlobStar) {\n var entries\n\n if (inGlobStar && !ownProp(this.symlinks, abs))\n return this._readdirInGlobStar(abs)\n\n if (ownProp(this.cache, abs)) {\n var c = this.cache[abs]\n if (!c || c === 'FILE')\n return null\n\n if (Array.isArray(c))\n return c\n }\n\n try {\n return this._readdirEntries(abs, this.fs.readdirSync(abs))\n } catch (er) {\n this._readdirError(abs, er)\n return null\n }\n}\n\nGlobSync.prototype._readdirEntries = function (abs, entries) {\n // if we haven't asked to stat everything, then just\n // assume that everything in there exists, so we can avoid\n // having to stat it a second time.\n if (!this.mark && !this.stat) {\n for (var i = 0; i < entries.length; i ++) {\n var e = entries[i]\n if (abs === '/')\n e = abs + e\n else\n e = abs + '/' + e\n this.cache[e] = true\n }\n }\n\n this.cache[abs] = entries\n\n // mark and cache dir-ness\n return entries\n}\n\nGlobSync.prototype._readdirError = function (f, er) {\n // handle errors, and cache the information\n switch (er.code) {\n case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205\n case 'ENOTDIR': // totally normal. means it *does* exist.\n var abs = this._makeAbs(f)\n this.cache[abs] = 'FILE'\n if (abs === this.cwdAbs) {\n var error = new Error(er.code + ' invalid cwd ' + this.cwd)\n error.path = this.cwd\n error.code = er.code\n throw error\n }\n break\n\n case 'ENOENT': // not terribly unusual\n case 'ELOOP':\n case 'ENAMETOOLONG':\n case 'UNKNOWN':\n this.cache[this._makeAbs(f)] = false\n break\n\n default: // some unusual error. Treat as failure.\n this.cache[this._makeAbs(f)] = false\n if (this.strict)\n throw er\n if (!this.silent)\n console.error('glob error', er)\n break\n }\n}\n\nGlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {\n\n var entries = this._readdir(abs, inGlobStar)\n\n // no entries means not a dir, so it can never have matches\n // foo.txt/** doesn't match foo.txt\n if (!entries)\n return\n\n // test without the globstar, and with every child both below\n // and replacing the globstar.\n var remainWithoutGlobStar = remain.slice(1)\n var gspref = prefix ? [ prefix ] : []\n var noGlobStar = gspref.concat(remainWithoutGlobStar)\n\n // the noGlobStar pattern exits the inGlobStar state\n this._process(noGlobStar, index, false)\n\n var len = entries.length\n var isSym = this.symlinks[abs]\n\n // If it's a symlink, and we're in a globstar, then stop\n if (isSym && inGlobStar)\n return\n\n for (var i = 0; i < len; i++) {\n var e = entries[i]\n if (e.charAt(0) === '.' && !this.dot)\n continue\n\n // these two cases enter the inGlobStar state\n var instead = gspref.concat(entries[i], remainWithoutGlobStar)\n this._process(instead, index, true)\n\n var below = gspref.concat(entries[i], remain)\n this._process(below, index, true)\n }\n}\n\nGlobSync.prototype._processSimple = function (prefix, index) {\n // XXX review this. Shouldn't it be doing the mounting etc\n // before doing stat? kinda weird?\n var exists = this._stat(prefix)\n\n if (!this.matches[index])\n this.matches[index] = Object.create(null)\n\n // If it doesn't exist, then just mark the lack of results\n if (!exists)\n return\n\n if (prefix && isAbsolute(prefix) && !this.nomount) {\n var trail = /[\\/\\\\]$/.test(prefix)\n if (prefix.charAt(0) === '/') {\n prefix = path.join(this.root, prefix)\n } else {\n prefix = path.resolve(this.root, prefix)\n if (trail)\n prefix += '/'\n }\n }\n\n if (process.platform === 'win32')\n prefix = prefix.replace(/\\\\/g, '/')\n\n // Mark this as a match\n this._emitMatch(index, prefix)\n}\n\n// Returns either 'DIR', 'FILE', or false\nGlobSync.prototype._stat = function (f) {\n var abs = this._makeAbs(f)\n var needDir = f.slice(-1) === '/'\n\n if (f.length > this.maxLength)\n return false\n\n if (!this.stat && ownProp(this.cache, abs)) {\n var c = this.cache[abs]\n\n if (Array.isArray(c))\n c = 'DIR'\n\n // It exists, but maybe not how we need it\n if (!needDir || c === 'DIR')\n return c\n\n if (needDir && c === 'FILE')\n return false\n\n // otherwise we have to stat, because maybe c=true\n // if we know it exists, but not what it is.\n }\n\n var exists\n var stat = this.statCache[abs]\n if (!stat) {\n var lstat\n try {\n lstat = this.fs.lstatSync(abs)\n } catch (er) {\n if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {\n this.statCache[abs] = false\n return false\n }\n }\n\n if (lstat && lstat.isSymbolicLink()) {\n try {\n stat = this.fs.statSync(abs)\n } catch (er) {\n stat = lstat\n }\n } else {\n stat = lstat\n }\n }\n\n this.statCache[abs] = stat\n\n var c = true\n if (stat)\n c = stat.isDirectory() ? 'DIR' : 'FILE'\n\n this.cache[abs] = this.cache[abs] || c\n\n if (needDir && c === 'FILE')\n return false\n\n return c\n}\n\nGlobSync.prototype._mark = function (p) {\n return common.mark(this, p)\n}\n\nGlobSync.prototype._makeAbs = function (f) {\n return common.makeAbs(this, f)\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDc1MS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBLFNBQVMsbUJBQU8sQ0FBQyxJQUFhO0FBQzlCLGdCQUFnQixtQkFBTyxDQUFDLElBQVc7QUFDbkM7QUFDQSxXQUFXLGdDQUF5QjtBQUNwQyxXQUFXLG1CQUFPLENBQUMsSUFBTTtBQUN6QixXQUFXLG1CQUFPLENBQUMsSUFBTTtBQUN6QixhQUFhLG1CQUFPLENBQUMsSUFBUTtBQUM3QixpQkFBaUIsbUJBQU8sQ0FBQyxJQUFrQjtBQUMzQyxhQUFhLG1CQUFPLENBQUMsSUFBYTtBQUNsQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQixvQkFBb0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFNBQVM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixvQkFBb0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9nbG9iL3N5bmMuanM/MmNiOCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGdsb2JTeW5jXG5nbG9iU3luYy5HbG9iU3luYyA9IEdsb2JTeW5jXG5cbnZhciBycCA9IHJlcXVpcmUoJ2ZzLnJlYWxwYXRoJylcbnZhciBtaW5pbWF0Y2ggPSByZXF1aXJlKCdtaW5pbWF0Y2gnKVxudmFyIE1pbmltYXRjaCA9IG1pbmltYXRjaC5NaW5pbWF0Y2hcbnZhciBHbG9iID0gcmVxdWlyZSgnLi9nbG9iLmpzJykuR2xvYlxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJylcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbnZhciBpc0Fic29sdXRlID0gcmVxdWlyZSgncGF0aC1pcy1hYnNvbHV0ZScpXG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24uanMnKVxudmFyIHNldG9wdHMgPSBjb21tb24uc2V0b3B0c1xudmFyIG93blByb3AgPSBjb21tb24ub3duUHJvcFxudmFyIGNoaWxkcmVuSWdub3JlZCA9IGNvbW1vbi5jaGlsZHJlbklnbm9yZWRcbnZhciBpc0lnbm9yZWQgPSBjb21tb24uaXNJZ25vcmVkXG5cbmZ1bmN0aW9uIGdsb2JTeW5jIChwYXR0ZXJuLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJyB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAzKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHByb3ZpZGVkIHRvIHN5bmMgZ2xvYlxcbicrXG4gICAgICAgICAgICAgICAgICAgICAgICAnU2VlOiBodHRwczovL2dpdGh1Yi5jb20vaXNhYWNzL25vZGUtZ2xvYi9pc3N1ZXMvMTY3JylcblxuICByZXR1cm4gbmV3IEdsb2JTeW5jKHBhdHRlcm4sIG9wdGlvbnMpLmZvdW5kXG59XG5cbmZ1bmN0aW9uIEdsb2JTeW5jIChwYXR0ZXJuLCBvcHRpb25zKSB7XG4gIGlmICghcGF0dGVybilcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgcHJvdmlkZSBwYXR0ZXJuJylcblxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMylcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBwcm92aWRlZCB0byBzeW5jIGdsb2JcXG4nK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1NlZTogaHR0cHM6Ly9naXRodWIuY29tL2lzYWFjcy9ub2RlLWdsb2IvaXNzdWVzLzE2NycpXG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEdsb2JTeW5jKSlcbiAgICByZXR1cm4gbmV3IEdsb2JTeW5jKHBhdHRlcm4sIG9wdGlvbnMpXG5cbiAgc2V0b3B0cyh0aGlzLCBwYXR0ZXJuLCBvcHRpb25zKVxuXG4gIGlmICh0aGlzLm5vcHJvY2VzcylcbiAgICByZXR1cm4gdGhpc1xuXG4gIHZhciBuID0gdGhpcy5taW5pbWF0Y2guc2V0Lmxlbmd0aFxuICB0aGlzLm1hdGNoZXMgPSBuZXcgQXJyYXkobilcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpICsrKSB7XG4gICAgdGhpcy5fcHJvY2Vzcyh0aGlzLm1pbmltYXRjaC5zZXRbaV0sIGksIGZhbHNlKVxuICB9XG4gIHRoaXMuX2ZpbmlzaCgpXG59XG5cbkdsb2JTeW5jLnByb3RvdHlwZS5fZmluaXNoID0gZnVuY3Rpb24gKCkge1xuICBhc3NlcnQub2sodGhpcyBpbnN0YW5jZW9mIEdsb2JTeW5jKVxuICBpZiAodGhpcy5yZWFscGF0aCkge1xuICAgIHZhciBzZWxmID0gdGhpc1xuICAgIHRoaXMubWF0Y2hlcy5mb3JFYWNoKGZ1bmN0aW9uIChtYXRjaHNldCwgaW5kZXgpIHtcbiAgICAgIHZhciBzZXQgPSBzZWxmLm1hdGNoZXNbaW5kZXhdID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgICAgZm9yICh2YXIgcCBpbiBtYXRjaHNldCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHAgPSBzZWxmLl9tYWtlQWJzKHApXG4gICAgICAgICAgdmFyIHJlYWwgPSBycC5yZWFscGF0aFN5bmMocCwgc2VsZi5yZWFscGF0aENhY2hlKVxuICAgICAgICAgIHNldFtyZWFsXSA9IHRydWVcbiAgICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgICBpZiAoZXIuc3lzY2FsbCA9PT0gJ3N0YXQnKVxuICAgICAgICAgICAgc2V0W3NlbGYuX21ha2VBYnMocCldID0gdHJ1ZVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IGVyXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIGNvbW1vbi5maW5pc2godGhpcylcbn1cblxuXG5HbG9iU3luYy5wcm90b3R5cGUuX3Byb2Nlc3MgPSBmdW5jdGlvbiAocGF0dGVybiwgaW5kZXgsIGluR2xvYlN0YXIpIHtcbiAgYXNzZXJ0Lm9rKHRoaXMgaW5zdGFuY2VvZiBHbG9iU3luYylcblxuICAvLyBHZXQgdGhlIGZpcnN0IFtuXSBwYXJ0cyBvZiBwYXR0ZXJuIHRoYXQgYXJlIGFsbCBzdHJpbmdzLlxuICB2YXIgbiA9IDBcbiAgd2hpbGUgKHR5cGVvZiBwYXR0ZXJuW25dID09PSAnc3RyaW5nJykge1xuICAgIG4gKytcbiAgfVxuICAvLyBub3cgbiBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9uZSB0aGF0IGlzICpub3QqIGEgc3RyaW5nLlxuXG4gIC8vIFNlZSBpZiB0aGVyZSdzIGFueXRoaW5nIGVsc2VcbiAgdmFyIHByZWZpeFxuICBzd2l0Y2ggKG4pIHtcbiAgICAvLyBpZiBub3QsIHRoZW4gdGhpcyBpcyByYXRoZXIgc2ltcGxlXG4gICAgY2FzZSBwYXR0ZXJuLmxlbmd0aDpcbiAgICAgIHRoaXMuX3Byb2Nlc3NTaW1wbGUocGF0dGVybi5qb2luKCcvJyksIGluZGV4KVxuICAgICAgcmV0dXJuXG5cbiAgICBjYXNlIDA6XG4gICAgICAvLyBwYXR0ZXJuICpzdGFydHMqIHdpdGggc29tZSBub24tdHJpdmlhbCBpdGVtLlxuICAgICAgLy8gZ29pbmcgdG8gcmVhZGRpcihjd2QpLCBidXQgbm90IGluY2x1ZGUgdGhlIHByZWZpeCBpbiBtYXRjaGVzLlxuICAgICAgcHJlZml4ID0gbnVsbFxuICAgICAgYnJlYWtcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBwYXR0ZXJuIGhhcyBzb21lIHN0cmluZyBiaXRzIGluIHRoZSBmcm9udC5cbiAgICAgIC8vIHdoYXRldmVyIGl0IHN0YXJ0cyB3aXRoLCB3aGV0aGVyIHRoYXQncyAnYWJzb2x1dGUnIGxpa2UgL2Zvby9iYXIsXG4gICAgICAvLyBvciAncmVsYXRpdmUnIGxpa2UgJy4uL2JheidcbiAgICAgIHByZWZpeCA9IHBhdHRlcm4uc2xpY2UoMCwgbikuam9pbignLycpXG4gICAgICBicmVha1xuICB9XG5cbiAgdmFyIHJlbWFpbiA9IHBhdHRlcm4uc2xpY2UobilcblxuICAvLyBnZXQgdGhlIGxpc3Qgb2YgZW50cmllcy5cbiAgdmFyIHJlYWRcbiAgaWYgKHByZWZpeCA9PT0gbnVsbClcbiAgICByZWFkID0gJy4nXG4gIGVsc2UgaWYgKGlzQWJzb2x1dGUocHJlZml4KSB8fFxuICAgICAgaXNBYnNvbHV0ZShwYXR0ZXJuLm1hcChmdW5jdGlvbiAocCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHAgPT09ICdzdHJpbmcnID8gcCA6ICdbKl0nXG4gICAgICB9KS5qb2luKCcvJykpKSB7XG4gICAgaWYgKCFwcmVmaXggfHwgIWlzQWJzb2x1dGUocHJlZml4KSlcbiAgICAgIHByZWZpeCA9ICcvJyArIHByZWZpeFxuICAgIHJlYWQgPSBwcmVmaXhcbiAgfSBlbHNlXG4gICAgcmVhZCA9IHByZWZpeFxuXG4gIHZhciBhYnMgPSB0aGlzLl9tYWtlQWJzKHJlYWQpXG5cbiAgLy9pZiBpZ25vcmVkLCBza2lwIHByb2Nlc3NpbmdcbiAgaWYgKGNoaWxkcmVuSWdub3JlZCh0aGlzLCByZWFkKSlcbiAgICByZXR1cm5cblxuICB2YXIgaXNHbG9iU3RhciA9IHJlbWFpblswXSA9PT0gbWluaW1hdGNoLkdMT0JTVEFSXG4gIGlmIChpc0dsb2JTdGFyKVxuICAgIHRoaXMuX3Byb2Nlc3NHbG9iU3RhcihwcmVmaXgsIHJlYWQsIGFicywgcmVtYWluLCBpbmRleCwgaW5HbG9iU3RhcilcbiAgZWxzZVxuICAgIHRoaXMuX3Byb2Nlc3NSZWFkZGlyKHByZWZpeCwgcmVhZCwgYWJzLCByZW1haW4sIGluZGV4LCBpbkdsb2JTdGFyKVxufVxuXG5cbkdsb2JTeW5jLnByb3RvdHlwZS5fcHJvY2Vzc1JlYWRkaXIgPSBmdW5jdGlvbiAocHJlZml4LCByZWFkLCBhYnMsIHJlbWFpbiwgaW5kZXgsIGluR2xvYlN0YXIpIHtcbiAgdmFyIGVudHJpZXMgPSB0aGlzLl9yZWFkZGlyKGFicywgaW5HbG9iU3RhcilcblxuICAvLyBpZiB0aGUgYWJzIGlzbid0IGEgZGlyLCB0aGVuIG5vdGhpbmcgY2FuIG1hdGNoIVxuICBpZiAoIWVudHJpZXMpXG4gICAgcmV0dXJuXG5cbiAgLy8gSXQgd2lsbCBvbmx5IG1hdGNoIGRvdCBlbnRyaWVzIGlmIGl0IHN0YXJ0cyB3aXRoIGEgZG90LCBvciBpZlxuICAvLyBkb3QgaXMgc2V0LiAgU3R1ZmYgbGlrZSBAKC5mb298LmJhcikgaXNuJ3QgYWxsb3dlZC5cbiAgdmFyIHBuID0gcmVtYWluWzBdXG4gIHZhciBuZWdhdGUgPSAhIXRoaXMubWluaW1hdGNoLm5lZ2F0ZVxuICB2YXIgcmF3R2xvYiA9IHBuLl9nbG9iXG4gIHZhciBkb3RPayA9IHRoaXMuZG90IHx8IHJhd0dsb2IuY2hhckF0KDApID09PSAnLidcblxuICB2YXIgbWF0Y2hlZEVudHJpZXMgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZSA9IGVudHJpZXNbaV1cbiAgICBpZiAoZS5jaGFyQXQoMCkgIT09ICcuJyB8fCBkb3RPaykge1xuICAgICAgdmFyIG1cbiAgICAgIGlmIChuZWdhdGUgJiYgIXByZWZpeCkge1xuICAgICAgICBtID0gIWUubWF0Y2gocG4pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtID0gZS5tYXRjaChwbilcbiAgICAgIH1cbiAgICAgIGlmIChtKVxuICAgICAgICBtYXRjaGVkRW50cmllcy5wdXNoKGUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGxlbiA9IG1hdGNoZWRFbnRyaWVzLmxlbmd0aFxuICAvLyBJZiB0aGVyZSBhcmUgbm8gbWF0Y2hlZCBlbnRyaWVzLCB0aGVuIG5vdGhpbmcgbWF0Y2hlcy5cbiAgaWYgKGxlbiA9PT0gMClcbiAgICByZXR1cm5cblxuICAvLyBpZiB0aGlzIGlzIHRoZSBsYXN0IHJlbWFpbmluZyBwYXR0ZXJuIGJpdCwgdGhlbiBubyBuZWVkIGZvclxuICAvLyBhbiBhZGRpdGlvbmFsIHN0YXQgKnVubGVzcyogdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBtYXJrIG9yXG4gIC8vIHN0YXQgZXhwbGljaXRseS4gIFdlIGtub3cgdGhleSBleGlzdCwgc2luY2UgcmVhZGRpciByZXR1cm5lZFxuICAvLyB0aGVtLlxuXG4gIGlmIChyZW1haW4ubGVuZ3RoID09PSAxICYmICF0aGlzLm1hcmsgJiYgIXRoaXMuc3RhdCkge1xuICAgIGlmICghdGhpcy5tYXRjaGVzW2luZGV4XSlcbiAgICAgIHRoaXMubWF0Y2hlc1tpbmRleF0gPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArKykge1xuICAgICAgdmFyIGUgPSBtYXRjaGVkRW50cmllc1tpXVxuICAgICAgaWYgKHByZWZpeCkge1xuICAgICAgICBpZiAocHJlZml4LnNsaWNlKC0xKSAhPT0gJy8nKVxuICAgICAgICAgIGUgPSBwcmVmaXggKyAnLycgKyBlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBlID0gcHJlZml4ICsgZVxuICAgICAgfVxuXG4gICAgICBpZiAoZS5jaGFyQXQoMCkgPT09ICcvJyAmJiAhdGhpcy5ub21vdW50KSB7XG4gICAgICAgIGUgPSBwYXRoLmpvaW4odGhpcy5yb290LCBlKVxuICAgICAgfVxuICAgICAgdGhpcy5fZW1pdE1hdGNoKGluZGV4LCBlKVxuICAgIH1cbiAgICAvLyBUaGlzIHdhcyB0aGUgbGFzdCBvbmUsIGFuZCBubyBzdGF0cyB3ZXJlIG5lZWRlZFxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gbm93IHRlc3QgYWxsIG1hdGNoZWQgZW50cmllcyBhcyBzdGFuZC1pbnMgZm9yIHRoYXQgcGFydFxuICAvLyBvZiB0aGUgcGF0dGVybi5cbiAgcmVtYWluLnNoaWZ0KClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKyspIHtcbiAgICB2YXIgZSA9IG1hdGNoZWRFbnRyaWVzW2ldXG4gICAgdmFyIG5ld1BhdHRlcm5cbiAgICBpZiAocHJlZml4KVxuICAgICAgbmV3UGF0dGVybiA9IFtwcmVmaXgsIGVdXG4gICAgZWxzZVxuICAgICAgbmV3UGF0dGVybiA9IFtlXVxuICAgIHRoaXMuX3Byb2Nlc3MobmV3UGF0dGVybi5jb25jYXQocmVtYWluKSwgaW5kZXgsIGluR2xvYlN0YXIpXG4gIH1cbn1cblxuXG5HbG9iU3luYy5wcm90b3R5cGUuX2VtaXRNYXRjaCA9IGZ1bmN0aW9uIChpbmRleCwgZSkge1xuICBpZiAoaXNJZ25vcmVkKHRoaXMsIGUpKVxuICAgIHJldHVyblxuXG4gIHZhciBhYnMgPSB0aGlzLl9tYWtlQWJzKGUpXG5cbiAgaWYgKHRoaXMubWFyaylcbiAgICBlID0gdGhpcy5fbWFyayhlKVxuXG4gIGlmICh0aGlzLmFic29sdXRlKSB7XG4gICAgZSA9IGFic1xuICB9XG5cbiAgaWYgKHRoaXMubWF0Y2hlc1tpbmRleF1bZV0pXG4gICAgcmV0dXJuXG5cbiAgaWYgKHRoaXMubm9kaXIpIHtcbiAgICB2YXIgYyA9IHRoaXMuY2FjaGVbYWJzXVxuICAgIGlmIChjID09PSAnRElSJyB8fCBBcnJheS5pc0FycmF5KGMpKVxuICAgICAgcmV0dXJuXG4gIH1cblxuICB0aGlzLm1hdGNoZXNbaW5kZXhdW2VdID0gdHJ1ZVxuXG4gIGlmICh0aGlzLnN0YXQpXG4gICAgdGhpcy5fc3RhdChlKVxufVxuXG5cbkdsb2JTeW5jLnByb3RvdHlwZS5fcmVhZGRpckluR2xvYlN0YXIgPSBmdW5jdGlvbiAoYWJzKSB7XG4gIC8vIGZvbGxvdyBhbGwgc3ltbGlua2VkIGRpcmVjdG9yaWVzIGZvcmV2ZXJcbiAgLy8ganVzdCBwcm9jZWVkIGFzIGlmIHRoaXMgaXMgYSBub24tZ2xvYnN0YXIgc2l0dWF0aW9uXG4gIGlmICh0aGlzLmZvbGxvdylcbiAgICByZXR1cm4gdGhpcy5fcmVhZGRpcihhYnMsIGZhbHNlKVxuXG4gIHZhciBlbnRyaWVzXG4gIHZhciBsc3RhdFxuICB2YXIgc3RhdFxuICB0cnkge1xuICAgIGxzdGF0ID0gdGhpcy5mcy5sc3RhdFN5bmMoYWJzKVxuICB9IGNhdGNoIChlcikge1xuICAgIGlmIChlci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgLy8gbHN0YXQgZmFpbGVkLCBkb2Vzbid0IGV4aXN0XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHZhciBpc1N5bSA9IGxzdGF0ICYmIGxzdGF0LmlzU3ltYm9saWNMaW5rKClcbiAgdGhpcy5zeW1saW5rc1thYnNdID0gaXNTeW1cblxuICAvLyBJZiBpdCdzIG5vdCBhIHN5bWxpbmsgb3IgYSBkaXIsIHRoZW4gaXQncyBkZWZpbml0ZWx5IGEgcmVndWxhciBmaWxlLlxuICAvLyBkb24ndCBib3RoZXIgZG9pbmcgYSByZWFkZGlyIGluIHRoYXQgY2FzZS5cbiAgaWYgKCFpc1N5bSAmJiBsc3RhdCAmJiAhbHN0YXQuaXNEaXJlY3RvcnkoKSlcbiAgICB0aGlzLmNhY2hlW2Fic10gPSAnRklMRSdcbiAgZWxzZVxuICAgIGVudHJpZXMgPSB0aGlzLl9yZWFkZGlyKGFicywgZmFsc2UpXG5cbiAgcmV0dXJuIGVudHJpZXNcbn1cblxuR2xvYlN5bmMucHJvdG90eXBlLl9yZWFkZGlyID0gZnVuY3Rpb24gKGFicywgaW5HbG9iU3Rhcikge1xuICB2YXIgZW50cmllc1xuXG4gIGlmIChpbkdsb2JTdGFyICYmICFvd25Qcm9wKHRoaXMuc3ltbGlua3MsIGFicykpXG4gICAgcmV0dXJuIHRoaXMuX3JlYWRkaXJJbkdsb2JTdGFyKGFicylcblxuICBpZiAob3duUHJvcCh0aGlzLmNhY2hlLCBhYnMpKSB7XG4gICAgdmFyIGMgPSB0aGlzLmNhY2hlW2Fic11cbiAgICBpZiAoIWMgfHwgYyA9PT0gJ0ZJTEUnKVxuICAgICAgcmV0dXJuIG51bGxcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGMpKVxuICAgICAgcmV0dXJuIGNcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRkaXJFbnRyaWVzKGFicywgdGhpcy5mcy5yZWFkZGlyU3luYyhhYnMpKVxuICB9IGNhdGNoIChlcikge1xuICAgIHRoaXMuX3JlYWRkaXJFcnJvcihhYnMsIGVyKVxuICAgIHJldHVybiBudWxsXG4gIH1cbn1cblxuR2xvYlN5bmMucHJvdG90eXBlLl9yZWFkZGlyRW50cmllcyA9IGZ1bmN0aW9uIChhYnMsIGVudHJpZXMpIHtcbiAgLy8gaWYgd2UgaGF2ZW4ndCBhc2tlZCB0byBzdGF0IGV2ZXJ5dGhpbmcsIHRoZW4ganVzdFxuICAvLyBhc3N1bWUgdGhhdCBldmVyeXRoaW5nIGluIHRoZXJlIGV4aXN0cywgc28gd2UgY2FuIGF2b2lkXG4gIC8vIGhhdmluZyB0byBzdGF0IGl0IGEgc2Vjb25kIHRpbWUuXG4gIGlmICghdGhpcy5tYXJrICYmICF0aGlzLnN0YXQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpICsrKSB7XG4gICAgICB2YXIgZSA9IGVudHJpZXNbaV1cbiAgICAgIGlmIChhYnMgPT09ICcvJylcbiAgICAgICAgZSA9IGFicyArIGVcbiAgICAgIGVsc2VcbiAgICAgICAgZSA9IGFicyArICcvJyArIGVcbiAgICAgIHRoaXMuY2FjaGVbZV0gPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgdGhpcy5jYWNoZVthYnNdID0gZW50cmllc1xuXG4gIC8vIG1hcmsgYW5kIGNhY2hlIGRpci1uZXNzXG4gIHJldHVybiBlbnRyaWVzXG59XG5cbkdsb2JTeW5jLnByb3RvdHlwZS5fcmVhZGRpckVycm9yID0gZnVuY3Rpb24gKGYsIGVyKSB7XG4gIC8vIGhhbmRsZSBlcnJvcnMsIGFuZCBjYWNoZSB0aGUgaW5mb3JtYXRpb25cbiAgc3dpdGNoIChlci5jb2RlKSB7XG4gICAgY2FzZSAnRU5PVFNVUCc6IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9pc2FhY3Mvbm9kZS1nbG9iL2lzc3Vlcy8yMDVcbiAgICBjYXNlICdFTk9URElSJzogLy8gdG90YWxseSBub3JtYWwuIG1lYW5zIGl0ICpkb2VzKiBleGlzdC5cbiAgICAgIHZhciBhYnMgPSB0aGlzLl9tYWtlQWJzKGYpXG4gICAgICB0aGlzLmNhY2hlW2Fic10gPSAnRklMRSdcbiAgICAgIGlmIChhYnMgPT09IHRoaXMuY3dkQWJzKSB7XG4gICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcihlci5jb2RlICsgJyBpbnZhbGlkIGN3ZCAnICsgdGhpcy5jd2QpXG4gICAgICAgIGVycm9yLnBhdGggPSB0aGlzLmN3ZFxuICAgICAgICBlcnJvci5jb2RlID0gZXIuY29kZVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgJ0VOT0VOVCc6IC8vIG5vdCB0ZXJyaWJseSB1bnVzdWFsXG4gICAgY2FzZSAnRUxPT1AnOlxuICAgIGNhc2UgJ0VOQU1FVE9PTE9ORyc6XG4gICAgY2FzZSAnVU5LTk9XTic6XG4gICAgICB0aGlzLmNhY2hlW3RoaXMuX21ha2VBYnMoZildID0gZmFsc2VcbiAgICAgIGJyZWFrXG5cbiAgICBkZWZhdWx0OiAvLyBzb21lIHVudXN1YWwgZXJyb3IuICBUcmVhdCBhcyBmYWlsdXJlLlxuICAgICAgdGhpcy5jYWNoZVt0aGlzLl9tYWtlQWJzKGYpXSA9IGZhbHNlXG4gICAgICBpZiAodGhpcy5zdHJpY3QpXG4gICAgICAgIHRocm93IGVyXG4gICAgICBpZiAoIXRoaXMuc2lsZW50KVxuICAgICAgICBjb25zb2xlLmVycm9yKCdnbG9iIGVycm9yJywgZXIpXG4gICAgICBicmVha1xuICB9XG59XG5cbkdsb2JTeW5jLnByb3RvdHlwZS5fcHJvY2Vzc0dsb2JTdGFyID0gZnVuY3Rpb24gKHByZWZpeCwgcmVhZCwgYWJzLCByZW1haW4sIGluZGV4LCBpbkdsb2JTdGFyKSB7XG5cbiAgdmFyIGVudHJpZXMgPSB0aGlzLl9yZWFkZGlyKGFicywgaW5HbG9iU3RhcilcblxuICAvLyBubyBlbnRyaWVzIG1lYW5zIG5vdCBhIGRpciwgc28gaXQgY2FuIG5ldmVyIGhhdmUgbWF0Y2hlc1xuICAvLyBmb28udHh0LyoqIGRvZXNuJ3QgbWF0Y2ggZm9vLnR4dFxuICBpZiAoIWVudHJpZXMpXG4gICAgcmV0dXJuXG5cbiAgLy8gdGVzdCB3aXRob3V0IHRoZSBnbG9ic3RhciwgYW5kIHdpdGggZXZlcnkgY2hpbGQgYm90aCBiZWxvd1xuICAvLyBhbmQgcmVwbGFjaW5nIHRoZSBnbG9ic3Rhci5cbiAgdmFyIHJlbWFpbldpdGhvdXRHbG9iU3RhciA9IHJlbWFpbi5zbGljZSgxKVxuICB2YXIgZ3NwcmVmID0gcHJlZml4ID8gWyBwcmVmaXggXSA6IFtdXG4gIHZhciBub0dsb2JTdGFyID0gZ3NwcmVmLmNvbmNhdChyZW1haW5XaXRob3V0R2xvYlN0YXIpXG5cbiAgLy8gdGhlIG5vR2xvYlN0YXIgcGF0dGVybiBleGl0cyB0aGUgaW5HbG9iU3RhciBzdGF0ZVxuICB0aGlzLl9wcm9jZXNzKG5vR2xvYlN0YXIsIGluZGV4LCBmYWxzZSlcblxuICB2YXIgbGVuID0gZW50cmllcy5sZW5ndGhcbiAgdmFyIGlzU3ltID0gdGhpcy5zeW1saW5rc1thYnNdXG5cbiAgLy8gSWYgaXQncyBhIHN5bWxpbmssIGFuZCB3ZSdyZSBpbiBhIGdsb2JzdGFyLCB0aGVuIHN0b3BcbiAgaWYgKGlzU3ltICYmIGluR2xvYlN0YXIpXG4gICAgcmV0dXJuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBlID0gZW50cmllc1tpXVxuICAgIGlmIChlLmNoYXJBdCgwKSA9PT0gJy4nICYmICF0aGlzLmRvdClcbiAgICAgIGNvbnRpbnVlXG5cbiAgICAvLyB0aGVzZSB0d28gY2FzZXMgZW50ZXIgdGhlIGluR2xvYlN0YXIgc3RhdGVcbiAgICB2YXIgaW5zdGVhZCA9IGdzcHJlZi5jb25jYXQoZW50cmllc1tpXSwgcmVtYWluV2l0aG91dEdsb2JTdGFyKVxuICAgIHRoaXMuX3Byb2Nlc3MoaW5zdGVhZCwgaW5kZXgsIHRydWUpXG5cbiAgICB2YXIgYmVsb3cgPSBnc3ByZWYuY29uY2F0KGVudHJpZXNbaV0sIHJlbWFpbilcbiAgICB0aGlzLl9wcm9jZXNzKGJlbG93LCBpbmRleCwgdHJ1ZSlcbiAgfVxufVxuXG5HbG9iU3luYy5wcm90b3R5cGUuX3Byb2Nlc3NTaW1wbGUgPSBmdW5jdGlvbiAocHJlZml4LCBpbmRleCkge1xuICAvLyBYWFggcmV2aWV3IHRoaXMuICBTaG91bGRuJ3QgaXQgYmUgZG9pbmcgdGhlIG1vdW50aW5nIGV0Y1xuICAvLyBiZWZvcmUgZG9pbmcgc3RhdD8gIGtpbmRhIHdlaXJkP1xuICB2YXIgZXhpc3RzID0gdGhpcy5fc3RhdChwcmVmaXgpXG5cbiAgaWYgKCF0aGlzLm1hdGNoZXNbaW5kZXhdKVxuICAgIHRoaXMubWF0Y2hlc1tpbmRleF0gPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgLy8gSWYgaXQgZG9lc24ndCBleGlzdCwgdGhlbiBqdXN0IG1hcmsgdGhlIGxhY2sgb2YgcmVzdWx0c1xuICBpZiAoIWV4aXN0cylcbiAgICByZXR1cm5cblxuICBpZiAocHJlZml4ICYmIGlzQWJzb2x1dGUocHJlZml4KSAmJiAhdGhpcy5ub21vdW50KSB7XG4gICAgdmFyIHRyYWlsID0gL1tcXC9cXFxcXSQvLnRlc3QocHJlZml4KVxuICAgIGlmIChwcmVmaXguY2hhckF0KDApID09PSAnLycpIHtcbiAgICAgIHByZWZpeCA9IHBhdGguam9pbih0aGlzLnJvb3QsIHByZWZpeClcbiAgICB9IGVsc2Uge1xuICAgICAgcHJlZml4ID0gcGF0aC5yZXNvbHZlKHRoaXMucm9vdCwgcHJlZml4KVxuICAgICAgaWYgKHRyYWlsKVxuICAgICAgICBwcmVmaXggKz0gJy8nXG4gICAgfVxuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpXG4gICAgcHJlZml4ID0gcHJlZml4LnJlcGxhY2UoL1xcXFwvZywgJy8nKVxuXG4gIC8vIE1hcmsgdGhpcyBhcyBhIG1hdGNoXG4gIHRoaXMuX2VtaXRNYXRjaChpbmRleCwgcHJlZml4KVxufVxuXG4vLyBSZXR1cm5zIGVpdGhlciAnRElSJywgJ0ZJTEUnLCBvciBmYWxzZVxuR2xvYlN5bmMucHJvdG90eXBlLl9zdGF0ID0gZnVuY3Rpb24gKGYpIHtcbiAgdmFyIGFicyA9IHRoaXMuX21ha2VBYnMoZilcbiAgdmFyIG5lZWREaXIgPSBmLnNsaWNlKC0xKSA9PT0gJy8nXG5cbiAgaWYgKGYubGVuZ3RoID4gdGhpcy5tYXhMZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKCF0aGlzLnN0YXQgJiYgb3duUHJvcCh0aGlzLmNhY2hlLCBhYnMpKSB7XG4gICAgdmFyIGMgPSB0aGlzLmNhY2hlW2Fic11cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGMpKVxuICAgICAgYyA9ICdESVInXG5cbiAgICAvLyBJdCBleGlzdHMsIGJ1dCBtYXliZSBub3QgaG93IHdlIG5lZWQgaXRcbiAgICBpZiAoIW5lZWREaXIgfHwgYyA9PT0gJ0RJUicpXG4gICAgICByZXR1cm4gY1xuXG4gICAgaWYgKG5lZWREaXIgJiYgYyA9PT0gJ0ZJTEUnKVxuICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICAvLyBvdGhlcndpc2Ugd2UgaGF2ZSB0byBzdGF0LCBiZWNhdXNlIG1heWJlIGM9dHJ1ZVxuICAgIC8vIGlmIHdlIGtub3cgaXQgZXhpc3RzLCBidXQgbm90IHdoYXQgaXQgaXMuXG4gIH1cblxuICB2YXIgZXhpc3RzXG4gIHZhciBzdGF0ID0gdGhpcy5zdGF0Q2FjaGVbYWJzXVxuICBpZiAoIXN0YXQpIHtcbiAgICB2YXIgbHN0YXRcbiAgICB0cnkge1xuICAgICAgbHN0YXQgPSB0aGlzLmZzLmxzdGF0U3luYyhhYnMpXG4gICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgIGlmIChlciAmJiAoZXIuY29kZSA9PT0gJ0VOT0VOVCcgfHwgZXIuY29kZSA9PT0gJ0VOT1RESVInKSkge1xuICAgICAgICB0aGlzLnN0YXRDYWNoZVthYnNdID0gZmFsc2VcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGxzdGF0ICYmIGxzdGF0LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0YXQgPSB0aGlzLmZzLnN0YXRTeW5jKGFicylcbiAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgIHN0YXQgPSBsc3RhdFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ID0gbHN0YXRcbiAgICB9XG4gIH1cblxuICB0aGlzLnN0YXRDYWNoZVthYnNdID0gc3RhdFxuXG4gIHZhciBjID0gdHJ1ZVxuICBpZiAoc3RhdClcbiAgICBjID0gc3RhdC5pc0RpcmVjdG9yeSgpID8gJ0RJUicgOiAnRklMRSdcblxuICB0aGlzLmNhY2hlW2Fic10gPSB0aGlzLmNhY2hlW2Fic10gfHwgY1xuXG4gIGlmIChuZWVkRGlyICYmIGMgPT09ICdGSUxFJylcbiAgICByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gY1xufVxuXG5HbG9iU3luYy5wcm90b3R5cGUuX21hcmsgPSBmdW5jdGlvbiAocCkge1xuICByZXR1cm4gY29tbW9uLm1hcmsodGhpcywgcClcbn1cblxuR2xvYlN5bmMucHJvdG90eXBlLl9tYWtlQWJzID0gZnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuIGNvbW1vbi5tYWtlQWJzKHRoaXMsIGYpXG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4751\n")},6458:module=>{"use strict";eval("\n\nmodule.exports = clone\n\nvar getPrototypeOf = Object.getPrototypeOf || function (obj) {\n return obj.__proto__\n}\n\nfunction clone (obj) {\n if (obj === null || typeof obj !== 'object')\n return obj\n\n if (obj instanceof Object)\n var copy = { __proto__: getPrototypeOf(obj) }\n else\n var copy = Object.create(null)\n\n Object.getOwnPropertyNames(obj).forEach(function (key) {\n Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key))\n })\n\n return copy\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQ1OC5qcyIsIm1hcHBpbmdzIjoiQUFBWTs7QUFFWjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2dyYWNlZnVsLWZzL2Nsb25lLmpzP2VjNmQiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVcblxudmFyIGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iai5fX3Byb3RvX19cbn1cblxuZnVuY3Rpb24gY2xvbmUgKG9iaikge1xuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKVxuICAgIHJldHVybiBvYmpcblxuICBpZiAob2JqIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgIHZhciBjb3B5ID0geyBfX3Byb3RvX186IGdldFByb3RvdHlwZU9mKG9iaikgfVxuICBlbHNlXG4gICAgdmFyIGNvcHkgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29weSwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSlcbiAgfSlcblxuICByZXR1cm4gY29weVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6458\n")},77:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var fs = __webpack_require__(7147)\nvar polyfills = __webpack_require__(1382)\nvar legacy = __webpack_require__(8520)\nvar clone = __webpack_require__(6458)\n\nvar util = __webpack_require__(3837)\n\n/* istanbul ignore next - node 0.x polyfill */\nvar gracefulQueue\nvar previousSymbol\n\n/* istanbul ignore else - node 0.x polyfill */\nif (typeof Symbol === 'function' && typeof Symbol.for === 'function') {\n gracefulQueue = Symbol.for('graceful-fs.queue')\n // This is used in testing by future versions\n previousSymbol = Symbol.for('graceful-fs.previous')\n} else {\n gracefulQueue = '___graceful-fs.queue'\n previousSymbol = '___graceful-fs.previous'\n}\n\nfunction noop () {}\n\nfunction publishQueue(context, queue) {\n Object.defineProperty(context, gracefulQueue, {\n get: function() {\n return queue\n }\n })\n}\n\nvar debug = noop\nif (util.debuglog)\n debug = util.debuglog('gfs4')\nelse if (/\\bgfs4\\b/i.test(process.env.NODE_DEBUG || ''))\n debug = function() {\n var m = util.format.apply(util, arguments)\n m = 'GFS4: ' + m.split(/\\n/).join('\\nGFS4: ')\n console.error(m)\n }\n\n// Once time initialization\nif (!fs[gracefulQueue]) {\n // This queue can be shared by multiple loaded instances\n var queue = global[gracefulQueue] || []\n publishQueue(fs, queue)\n\n // Patch fs.close/closeSync to shared queue version, because we need\n // to retry() whenever a close happens *anywhere* in the program.\n // This is essential when multiple graceful-fs instances are\n // in play at the same time.\n fs.close = (function (fs$close) {\n function close (fd, cb) {\n return fs$close.call(fs, fd, function (err) {\n // This function uses the graceful-fs shared queue\n if (!err) {\n resetQueue()\n }\n\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n })\n }\n\n Object.defineProperty(close, previousSymbol, {\n value: fs$close\n })\n return close\n })(fs.close)\n\n fs.closeSync = (function (fs$closeSync) {\n function closeSync (fd) {\n // This function uses the graceful-fs shared queue\n fs$closeSync.apply(fs, arguments)\n resetQueue()\n }\n\n Object.defineProperty(closeSync, previousSymbol, {\n value: fs$closeSync\n })\n return closeSync\n })(fs.closeSync)\n\n if (/\\bgfs4\\b/i.test(process.env.NODE_DEBUG || '')) {\n process.on('exit', function() {\n debug(fs[gracefulQueue])\n __webpack_require__(9491).equal(fs[gracefulQueue].length, 0)\n })\n }\n}\n\nif (!global[gracefulQueue]) {\n publishQueue(global, fs[gracefulQueue]);\n}\n\nmodule.exports = patch(clone(fs))\nif (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) {\n module.exports = patch(fs)\n fs.__patched = true;\n}\n\nfunction patch (fs) {\n // Everything that references the open() function needs to be in here\n polyfills(fs)\n fs.gracefulify = patch\n\n fs.createReadStream = createReadStream\n fs.createWriteStream = createWriteStream\n var fs$readFile = fs.readFile\n fs.readFile = readFile\n function readFile (path, options, cb) {\n if (typeof options === 'function')\n cb = options, options = null\n\n return go$readFile(path, options, cb)\n\n function go$readFile (path, options, cb, startTime) {\n return fs$readFile(path, options, function (err) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([go$readFile, [path, options, cb], err, startTime || Date.now(), Date.now()])\n else {\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n }\n })\n }\n }\n\n var fs$writeFile = fs.writeFile\n fs.writeFile = writeFile\n function writeFile (path, data, options, cb) {\n if (typeof options === 'function')\n cb = options, options = null\n\n return go$writeFile(path, data, options, cb)\n\n function go$writeFile (path, data, options, cb, startTime) {\n return fs$writeFile(path, data, options, function (err) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([go$writeFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()])\n else {\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n }\n })\n }\n }\n\n var fs$appendFile = fs.appendFile\n if (fs$appendFile)\n fs.appendFile = appendFile\n function appendFile (path, data, options, cb) {\n if (typeof options === 'function')\n cb = options, options = null\n\n return go$appendFile(path, data, options, cb)\n\n function go$appendFile (path, data, options, cb, startTime) {\n return fs$appendFile(path, data, options, function (err) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([go$appendFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()])\n else {\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n }\n })\n }\n }\n\n var fs$copyFile = fs.copyFile\n if (fs$copyFile)\n fs.copyFile = copyFile\n function copyFile (src, dest, flags, cb) {\n if (typeof flags === 'function') {\n cb = flags\n flags = 0\n }\n return go$copyFile(src, dest, flags, cb)\n\n function go$copyFile (src, dest, flags, cb, startTime) {\n return fs$copyFile(src, dest, flags, function (err) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([go$copyFile, [src, dest, flags, cb], err, startTime || Date.now(), Date.now()])\n else {\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n }\n })\n }\n }\n\n var fs$readdir = fs.readdir\n fs.readdir = readdir\n var noReaddirOptionVersions = /^v[0-5]\\./\n function readdir (path, options, cb) {\n if (typeof options === 'function')\n cb = options, options = null\n\n var go$readdir = noReaddirOptionVersions.test(process.version)\n ? function go$readdir (path, options, cb, startTime) {\n return fs$readdir(path, fs$readdirCallback(\n path, options, cb, startTime\n ))\n }\n : function go$readdir (path, options, cb, startTime) {\n return fs$readdir(path, options, fs$readdirCallback(\n path, options, cb, startTime\n ))\n }\n\n return go$readdir(path, options, cb)\n\n function fs$readdirCallback (path, options, cb, startTime) {\n return function (err, files) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([\n go$readdir,\n [path, options, cb],\n err,\n startTime || Date.now(),\n Date.now()\n ])\n else {\n if (files && files.sort)\n files.sort()\n\n if (typeof cb === 'function')\n cb.call(this, err, files)\n }\n }\n }\n }\n\n if (process.version.substr(0, 4) === 'v0.8') {\n var legStreams = legacy(fs)\n ReadStream = legStreams.ReadStream\n WriteStream = legStreams.WriteStream\n }\n\n var fs$ReadStream = fs.ReadStream\n if (fs$ReadStream) {\n ReadStream.prototype = Object.create(fs$ReadStream.prototype)\n ReadStream.prototype.open = ReadStream$open\n }\n\n var fs$WriteStream = fs.WriteStream\n if (fs$WriteStream) {\n WriteStream.prototype = Object.create(fs$WriteStream.prototype)\n WriteStream.prototype.open = WriteStream$open\n }\n\n Object.defineProperty(fs, 'ReadStream', {\n get: function () {\n return ReadStream\n },\n set: function (val) {\n ReadStream = val\n },\n enumerable: true,\n configurable: true\n })\n Object.defineProperty(fs, 'WriteStream', {\n get: function () {\n return WriteStream\n },\n set: function (val) {\n WriteStream = val\n },\n enumerable: true,\n configurable: true\n })\n\n // legacy names\n var FileReadStream = ReadStream\n Object.defineProperty(fs, 'FileReadStream', {\n get: function () {\n return FileReadStream\n },\n set: function (val) {\n FileReadStream = val\n },\n enumerable: true,\n configurable: true\n })\n var FileWriteStream = WriteStream\n Object.defineProperty(fs, 'FileWriteStream', {\n get: function () {\n return FileWriteStream\n },\n set: function (val) {\n FileWriteStream = val\n },\n enumerable: true,\n configurable: true\n })\n\n function ReadStream (path, options) {\n if (this instanceof ReadStream)\n return fs$ReadStream.apply(this, arguments), this\n else\n return ReadStream.apply(Object.create(ReadStream.prototype), arguments)\n }\n\n function ReadStream$open () {\n var that = this\n open(that.path, that.flags, that.mode, function (err, fd) {\n if (err) {\n if (that.autoClose)\n that.destroy()\n\n that.emit('error', err)\n } else {\n that.fd = fd\n that.emit('open', fd)\n that.read()\n }\n })\n }\n\n function WriteStream (path, options) {\n if (this instanceof WriteStream)\n return fs$WriteStream.apply(this, arguments), this\n else\n return WriteStream.apply(Object.create(WriteStream.prototype), arguments)\n }\n\n function WriteStream$open () {\n var that = this\n open(that.path, that.flags, that.mode, function (err, fd) {\n if (err) {\n that.destroy()\n that.emit('error', err)\n } else {\n that.fd = fd\n that.emit('open', fd)\n }\n })\n }\n\n function createReadStream (path, options) {\n return new fs.ReadStream(path, options)\n }\n\n function createWriteStream (path, options) {\n return new fs.WriteStream(path, options)\n }\n\n var fs$open = fs.open\n fs.open = open\n function open (path, flags, mode, cb) {\n if (typeof mode === 'function')\n cb = mode, mode = null\n\n return go$open(path, flags, mode, cb)\n\n function go$open (path, flags, mode, cb, startTime) {\n return fs$open(path, flags, mode, function (err, fd) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([go$open, [path, flags, mode, cb], err, startTime || Date.now(), Date.now()])\n else {\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n }\n })\n }\n }\n\n return fs\n}\n\nfunction enqueue (elem) {\n debug('ENQUEUE', elem[0].name, elem[1])\n fs[gracefulQueue].push(elem)\n retry()\n}\n\n// keep track of the timeout between retry() calls\nvar retryTimer\n\n// reset the startTime and lastTime to now\n// this resets the start of the 60 second overall timeout as well as the\n// delay between attempts so that we'll retry these jobs sooner\nfunction resetQueue () {\n var now = Date.now()\n for (var i = 0; i < fs[gracefulQueue].length; ++i) {\n // entries that are only a length of 2 are from an older version, don't\n // bother modifying those since they'll be retried anyway.\n if (fs[gracefulQueue][i].length > 2) {\n fs[gracefulQueue][i][3] = now // startTime\n fs[gracefulQueue][i][4] = now // lastTime\n }\n }\n // call retry to make sure we're actively processing the queue\n retry()\n}\n\nfunction retry () {\n // clear the timer and remove it to help prevent unintended concurrency\n clearTimeout(retryTimer)\n retryTimer = undefined\n\n if (fs[gracefulQueue].length === 0)\n return\n\n var elem = fs[gracefulQueue].shift()\n var fn = elem[0]\n var args = elem[1]\n // these items may be unset if they were added by an older graceful-fs\n var err = elem[2]\n var startTime = elem[3]\n var lastTime = elem[4]\n\n // if we don't have a startTime we have no way of knowing if we've waited\n // long enough, so go ahead and retry this item now\n if (startTime === undefined) {\n debug('RETRY', fn.name, args)\n fn.apply(null, args)\n } else if (Date.now() - startTime >= 60000) {\n // it's been more than 60 seconds total, bail now\n debug('TIMEOUT', fn.name, args)\n var cb = args.pop()\n if (typeof cb === 'function')\n cb.call(null, err)\n } else {\n // the amount of time between the last attempt and right now\n var sinceAttempt = Date.now() - lastTime\n // the amount of time between when we first tried, and when we last tried\n // rounded up to at least 1\n var sinceStart = Math.max(lastTime - startTime, 1)\n // backoff. wait longer than the total time we've been retrying, but only\n // up to a maximum of 100ms\n var desiredDelay = Math.min(sinceStart * 1.2, 100)\n // it's been long enough since the last retry, do it again\n if (sinceAttempt >= desiredDelay) {\n debug('RETRY', fn.name, args)\n fn.apply(null, args.concat([startTime]))\n } else {\n // if we can't do this job yet, push it to the end of the queue\n // and let the next iteration check again\n fs[gracefulQueue].push(elem)\n }\n }\n\n // schedule our next run if one isn't already scheduled\n if (retryTimer === undefined) {\n retryTimer = setTimeout(retry, 0)\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzcuanMiLCJtYXBwaW5ncyI6IkFBQUEsU0FBUyxtQkFBTyxDQUFDLElBQUk7QUFDckIsZ0JBQWdCLG1CQUFPLENBQUMsSUFBZ0I7QUFDeEMsYUFBYSxtQkFBTyxDQUFDLElBQXFCO0FBQzFDLFlBQVksbUJBQU8sQ0FBQyxJQUFZOztBQUVoQyxXQUFXLG1CQUFPLENBQUMsSUFBTTs7QUFFekI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxNQUFNLCtCQUF1QjtBQUM3QixLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsOEJBQThCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9ncmFjZWZ1bC1mcy9ncmFjZWZ1bC1mcy5qcz8wZGE3Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBmcyA9IHJlcXVpcmUoJ2ZzJylcbnZhciBwb2x5ZmlsbHMgPSByZXF1aXJlKCcuL3BvbHlmaWxscy5qcycpXG52YXIgbGVnYWN5ID0gcmVxdWlyZSgnLi9sZWdhY3ktc3RyZWFtcy5qcycpXG52YXIgY2xvbmUgPSByZXF1aXJlKCcuL2Nsb25lLmpzJylcblxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJylcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgLSBub2RlIDAueCBwb2x5ZmlsbCAqL1xudmFyIGdyYWNlZnVsUXVldWVcbnZhciBwcmV2aW91c1N5bWJvbFxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAtIG5vZGUgMC54IHBvbHlmaWxsICovXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLmZvciA9PT0gJ2Z1bmN0aW9uJykge1xuICBncmFjZWZ1bFF1ZXVlID0gU3ltYm9sLmZvcignZ3JhY2VmdWwtZnMucXVldWUnKVxuICAvLyBUaGlzIGlzIHVzZWQgaW4gdGVzdGluZyBieSBmdXR1cmUgdmVyc2lvbnNcbiAgcHJldmlvdXNTeW1ib2wgPSBTeW1ib2wuZm9yKCdncmFjZWZ1bC1mcy5wcmV2aW91cycpXG59IGVsc2Uge1xuICBncmFjZWZ1bFF1ZXVlID0gJ19fX2dyYWNlZnVsLWZzLnF1ZXVlJ1xuICBwcmV2aW91c1N5bWJvbCA9ICdfX19ncmFjZWZ1bC1mcy5wcmV2aW91cydcbn1cblxuZnVuY3Rpb24gbm9vcCAoKSB7fVxuXG5mdW5jdGlvbiBwdWJsaXNoUXVldWUoY29udGV4dCwgcXVldWUpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRleHQsIGdyYWNlZnVsUXVldWUsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlXG4gICAgfVxuICB9KVxufVxuXG52YXIgZGVidWcgPSBub29wXG5pZiAodXRpbC5kZWJ1Z2xvZylcbiAgZGVidWcgPSB1dGlsLmRlYnVnbG9nKCdnZnM0JylcbmVsc2UgaWYgKC9cXGJnZnM0XFxiL2kudGVzdChwcm9jZXNzLmVudi5OT0RFX0RFQlVHIHx8ICcnKSlcbiAgZGVidWcgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgbSA9IHV0aWwuZm9ybWF0LmFwcGx5KHV0aWwsIGFyZ3VtZW50cylcbiAgICBtID0gJ0dGUzQ6ICcgKyBtLnNwbGl0KC9cXG4vKS5qb2luKCdcXG5HRlM0OiAnKVxuICAgIGNvbnNvbGUuZXJyb3IobSlcbiAgfVxuXG4vLyBPbmNlIHRpbWUgaW5pdGlhbGl6YXRpb25cbmlmICghZnNbZ3JhY2VmdWxRdWV1ZV0pIHtcbiAgLy8gVGhpcyBxdWV1ZSBjYW4gYmUgc2hhcmVkIGJ5IG11bHRpcGxlIGxvYWRlZCBpbnN0YW5jZXNcbiAgdmFyIHF1ZXVlID0gZ2xvYmFsW2dyYWNlZnVsUXVldWVdIHx8IFtdXG4gIHB1Ymxpc2hRdWV1ZShmcywgcXVldWUpXG5cbiAgLy8gUGF0Y2ggZnMuY2xvc2UvY2xvc2VTeW5jIHRvIHNoYXJlZCBxdWV1ZSB2ZXJzaW9uLCBiZWNhdXNlIHdlIG5lZWRcbiAgLy8gdG8gcmV0cnkoKSB3aGVuZXZlciBhIGNsb3NlIGhhcHBlbnMgKmFueXdoZXJlKiBpbiB0aGUgcHJvZ3JhbS5cbiAgLy8gVGhpcyBpcyBlc3NlbnRpYWwgd2hlbiBtdWx0aXBsZSBncmFjZWZ1bC1mcyBpbnN0YW5jZXMgYXJlXG4gIC8vIGluIHBsYXkgYXQgdGhlIHNhbWUgdGltZS5cbiAgZnMuY2xvc2UgPSAoZnVuY3Rpb24gKGZzJGNsb3NlKSB7XG4gICAgZnVuY3Rpb24gY2xvc2UgKGZkLCBjYikge1xuICAgICAgcmV0dXJuIGZzJGNsb3NlLmNhbGwoZnMsIGZkLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgZ3JhY2VmdWwtZnMgc2hhcmVkIHF1ZXVlXG4gICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgcmVzZXRRdWV1ZSgpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsb3NlLCBwcmV2aW91c1N5bWJvbCwge1xuICAgICAgdmFsdWU6IGZzJGNsb3NlXG4gICAgfSlcbiAgICByZXR1cm4gY2xvc2VcbiAgfSkoZnMuY2xvc2UpXG5cbiAgZnMuY2xvc2VTeW5jID0gKGZ1bmN0aW9uIChmcyRjbG9zZVN5bmMpIHtcbiAgICBmdW5jdGlvbiBjbG9zZVN5bmMgKGZkKSB7XG4gICAgICAvLyBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGdyYWNlZnVsLWZzIHNoYXJlZCBxdWV1ZVxuICAgICAgZnMkY2xvc2VTeW5jLmFwcGx5KGZzLCBhcmd1bWVudHMpXG4gICAgICByZXNldFF1ZXVlKClcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xvc2VTeW5jLCBwcmV2aW91c1N5bWJvbCwge1xuICAgICAgdmFsdWU6IGZzJGNsb3NlU3luY1xuICAgIH0pXG4gICAgcmV0dXJuIGNsb3NlU3luY1xuICB9KShmcy5jbG9zZVN5bmMpXG5cbiAgaWYgKC9cXGJnZnM0XFxiL2kudGVzdChwcm9jZXNzLmVudi5OT0RFX0RFQlVHIHx8ICcnKSkge1xuICAgIHByb2Nlc3Mub24oJ2V4aXQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGRlYnVnKGZzW2dyYWNlZnVsUXVldWVdKVxuICAgICAgcmVxdWlyZSgnYXNzZXJ0JykuZXF1YWwoZnNbZ3JhY2VmdWxRdWV1ZV0ubGVuZ3RoLCAwKVxuICAgIH0pXG4gIH1cbn1cblxuaWYgKCFnbG9iYWxbZ3JhY2VmdWxRdWV1ZV0pIHtcbiAgcHVibGlzaFF1ZXVlKGdsb2JhbCwgZnNbZ3JhY2VmdWxRdWV1ZV0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGNoKGNsb25lKGZzKSlcbmlmIChwcm9jZXNzLmVudi5URVNUX0dSQUNFRlVMX0ZTX0dMT0JBTF9QQVRDSCAmJiAhZnMuX19wYXRjaGVkKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBwYXRjaChmcylcbiAgICBmcy5fX3BhdGNoZWQgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBwYXRjaCAoZnMpIHtcbiAgLy8gRXZlcnl0aGluZyB0aGF0IHJlZmVyZW5jZXMgdGhlIG9wZW4oKSBmdW5jdGlvbiBuZWVkcyB0byBiZSBpbiBoZXJlXG4gIHBvbHlmaWxscyhmcylcbiAgZnMuZ3JhY2VmdWxpZnkgPSBwYXRjaFxuXG4gIGZzLmNyZWF0ZVJlYWRTdHJlYW0gPSBjcmVhdGVSZWFkU3RyZWFtXG4gIGZzLmNyZWF0ZVdyaXRlU3RyZWFtID0gY3JlYXRlV3JpdGVTdHJlYW1cbiAgdmFyIGZzJHJlYWRGaWxlID0gZnMucmVhZEZpbGVcbiAgZnMucmVhZEZpbGUgPSByZWFkRmlsZVxuICBmdW5jdGlvbiByZWFkRmlsZSAocGF0aCwgb3B0aW9ucywgY2IpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpXG4gICAgICBjYiA9IG9wdGlvbnMsIG9wdGlvbnMgPSBudWxsXG5cbiAgICByZXR1cm4gZ28kcmVhZEZpbGUocGF0aCwgb3B0aW9ucywgY2IpXG5cbiAgICBmdW5jdGlvbiBnbyRyZWFkRmlsZSAocGF0aCwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgcmV0dXJuIGZzJHJlYWRGaWxlKHBhdGgsIG9wdGlvbnMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciAmJiAoZXJyLmNvZGUgPT09ICdFTUZJTEUnIHx8IGVyci5jb2RlID09PSAnRU5GSUxFJykpXG4gICAgICAgICAgZW5xdWV1ZShbZ28kcmVhZEZpbGUsIFtwYXRoLCBvcHRpb25zLCBjYl0sIGVyciwgc3RhcnRUaW1lIHx8IERhdGUubm93KCksIERhdGUubm93KCldKVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHZhciBmcyR3cml0ZUZpbGUgPSBmcy53cml0ZUZpbGVcbiAgZnMud3JpdGVGaWxlID0gd3JpdGVGaWxlXG4gIGZ1bmN0aW9uIHdyaXRlRmlsZSAocGF0aCwgZGF0YSwgb3B0aW9ucywgY2IpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpXG4gICAgICBjYiA9IG9wdGlvbnMsIG9wdGlvbnMgPSBudWxsXG5cbiAgICByZXR1cm4gZ28kd3JpdGVGaWxlKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGNiKVxuXG4gICAgZnVuY3Rpb24gZ28kd3JpdGVGaWxlIChwYXRoLCBkYXRhLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICByZXR1cm4gZnMkd3JpdGVGaWxlKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciAmJiAoZXJyLmNvZGUgPT09ICdFTUZJTEUnIHx8IGVyci5jb2RlID09PSAnRU5GSUxFJykpXG4gICAgICAgICAgZW5xdWV1ZShbZ28kd3JpdGVGaWxlLCBbcGF0aCwgZGF0YSwgb3B0aW9ucywgY2JdLCBlcnIsIHN0YXJ0VGltZSB8fCBEYXRlLm5vdygpLCBEYXRlLm5vdygpXSlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICB2YXIgZnMkYXBwZW5kRmlsZSA9IGZzLmFwcGVuZEZpbGVcbiAgaWYgKGZzJGFwcGVuZEZpbGUpXG4gICAgZnMuYXBwZW5kRmlsZSA9IGFwcGVuZEZpbGVcbiAgZnVuY3Rpb24gYXBwZW5kRmlsZSAocGF0aCwgZGF0YSwgb3B0aW9ucywgY2IpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpXG4gICAgICBjYiA9IG9wdGlvbnMsIG9wdGlvbnMgPSBudWxsXG5cbiAgICByZXR1cm4gZ28kYXBwZW5kRmlsZShwYXRoLCBkYXRhLCBvcHRpb25zLCBjYilcblxuICAgIGZ1bmN0aW9uIGdvJGFwcGVuZEZpbGUgKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiBmcyRhcHBlbmRGaWxlKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciAmJiAoZXJyLmNvZGUgPT09ICdFTUZJTEUnIHx8IGVyci5jb2RlID09PSAnRU5GSUxFJykpXG4gICAgICAgICAgZW5xdWV1ZShbZ28kYXBwZW5kRmlsZSwgW3BhdGgsIGRhdGEsIG9wdGlvbnMsIGNiXSwgZXJyLCBzdGFydFRpbWUgfHwgRGF0ZS5ub3coKSwgRGF0ZS5ub3coKV0pXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgdmFyIGZzJGNvcHlGaWxlID0gZnMuY29weUZpbGVcbiAgaWYgKGZzJGNvcHlGaWxlKVxuICAgIGZzLmNvcHlGaWxlID0gY29weUZpbGVcbiAgZnVuY3Rpb24gY29weUZpbGUgKHNyYywgZGVzdCwgZmxhZ3MsIGNiKSB7XG4gICAgaWYgKHR5cGVvZiBmbGFncyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IgPSBmbGFnc1xuICAgICAgZmxhZ3MgPSAwXG4gICAgfVxuICAgIHJldHVybiBnbyRjb3B5RmlsZShzcmMsIGRlc3QsIGZsYWdzLCBjYilcblxuICAgIGZ1bmN0aW9uIGdvJGNvcHlGaWxlIChzcmMsIGRlc3QsIGZsYWdzLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICByZXR1cm4gZnMkY29weUZpbGUoc3JjLCBkZXN0LCBmbGFncywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyICYmIChlcnIuY29kZSA9PT0gJ0VNRklMRScgfHwgZXJyLmNvZGUgPT09ICdFTkZJTEUnKSlcbiAgICAgICAgICBlbnF1ZXVlKFtnbyRjb3B5RmlsZSwgW3NyYywgZGVzdCwgZmxhZ3MsIGNiXSwgZXJyLCBzdGFydFRpbWUgfHwgRGF0ZS5ub3coKSwgRGF0ZS5ub3coKV0pXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgdmFyIGZzJHJlYWRkaXIgPSBmcy5yZWFkZGlyXG4gIGZzLnJlYWRkaXIgPSByZWFkZGlyXG4gIHZhciBub1JlYWRkaXJPcHRpb25WZXJzaW9ucyA9IC9edlswLTVdXFwuL1xuICBmdW5jdGlvbiByZWFkZGlyIChwYXRoLCBvcHRpb25zLCBjYikge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIGNiID0gb3B0aW9ucywgb3B0aW9ucyA9IG51bGxcblxuICAgIHZhciBnbyRyZWFkZGlyID0gbm9SZWFkZGlyT3B0aW9uVmVyc2lvbnMudGVzdChwcm9jZXNzLnZlcnNpb24pXG4gICAgICA/IGZ1bmN0aW9uIGdvJHJlYWRkaXIgKHBhdGgsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIGZzJHJlYWRkaXIocGF0aCwgZnMkcmVhZGRpckNhbGxiYWNrKFxuICAgICAgICAgIHBhdGgsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWVcbiAgICAgICAgKSlcbiAgICAgIH1cbiAgICAgIDogZnVuY3Rpb24gZ28kcmVhZGRpciAocGF0aCwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgICByZXR1cm4gZnMkcmVhZGRpcihwYXRoLCBvcHRpb25zLCBmcyRyZWFkZGlyQ2FsbGJhY2soXG4gICAgICAgICAgcGF0aCwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZVxuICAgICAgICApKVxuICAgICAgfVxuXG4gICAgcmV0dXJuIGdvJHJlYWRkaXIocGF0aCwgb3B0aW9ucywgY2IpXG5cbiAgICBmdW5jdGlvbiBmcyRyZWFkZGlyQ2FsbGJhY2sgKHBhdGgsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZXJyLCBmaWxlcykge1xuICAgICAgICBpZiAoZXJyICYmIChlcnIuY29kZSA9PT0gJ0VNRklMRScgfHwgZXJyLmNvZGUgPT09ICdFTkZJTEUnKSlcbiAgICAgICAgICBlbnF1ZXVlKFtcbiAgICAgICAgICAgIGdvJHJlYWRkaXIsXG4gICAgICAgICAgICBbcGF0aCwgb3B0aW9ucywgY2JdLFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgc3RhcnRUaW1lIHx8IERhdGUubm93KCksXG4gICAgICAgICAgICBEYXRlLm5vdygpXG4gICAgICAgICAgXSlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLnNvcnQpXG4gICAgICAgICAgICBmaWxlcy5zb3J0KClcblxuICAgICAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYi5jYWxsKHRoaXMsIGVyciwgZmlsZXMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAocHJvY2Vzcy52ZXJzaW9uLnN1YnN0cigwLCA0KSA9PT0gJ3YwLjgnKSB7XG4gICAgdmFyIGxlZ1N0cmVhbXMgPSBsZWdhY3koZnMpXG4gICAgUmVhZFN0cmVhbSA9IGxlZ1N0cmVhbXMuUmVhZFN0cmVhbVxuICAgIFdyaXRlU3RyZWFtID0gbGVnU3RyZWFtcy5Xcml0ZVN0cmVhbVxuICB9XG5cbiAgdmFyIGZzJFJlYWRTdHJlYW0gPSBmcy5SZWFkU3RyZWFtXG4gIGlmIChmcyRSZWFkU3RyZWFtKSB7XG4gICAgUmVhZFN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGZzJFJlYWRTdHJlYW0ucHJvdG90eXBlKVxuICAgIFJlYWRTdHJlYW0ucHJvdG90eXBlLm9wZW4gPSBSZWFkU3RyZWFtJG9wZW5cbiAgfVxuXG4gIHZhciBmcyRXcml0ZVN0cmVhbSA9IGZzLldyaXRlU3RyZWFtXG4gIGlmIChmcyRXcml0ZVN0cmVhbSkge1xuICAgIFdyaXRlU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZnMkV3JpdGVTdHJlYW0ucHJvdG90eXBlKVxuICAgIFdyaXRlU3RyZWFtLnByb3RvdHlwZS5vcGVuID0gV3JpdGVTdHJlYW0kb3BlblxuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZzLCAnUmVhZFN0cmVhbScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBSZWFkU3RyZWFtXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIFJlYWRTdHJlYW0gPSB2YWxcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmcywgJ1dyaXRlU3RyZWFtJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFdyaXRlU3RyZWFtXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIFdyaXRlU3RyZWFtID0gdmFsXG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxuXG4gIC8vIGxlZ2FjeSBuYW1lc1xuICB2YXIgRmlsZVJlYWRTdHJlYW0gPSBSZWFkU3RyZWFtXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmcywgJ0ZpbGVSZWFkU3RyZWFtJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIEZpbGVSZWFkU3RyZWFtXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIEZpbGVSZWFkU3RyZWFtID0gdmFsXG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxuICB2YXIgRmlsZVdyaXRlU3RyZWFtID0gV3JpdGVTdHJlYW1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZzLCAnRmlsZVdyaXRlU3RyZWFtJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIEZpbGVXcml0ZVN0cmVhbVxuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICBGaWxlV3JpdGVTdHJlYW0gPSB2YWxcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG5cbiAgZnVuY3Rpb24gUmVhZFN0cmVhbSAocGF0aCwgb3B0aW9ucykge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUmVhZFN0cmVhbSlcbiAgICAgIHJldHVybiBmcyRSZWFkU3RyZWFtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRoaXNcbiAgICBlbHNlXG4gICAgICByZXR1cm4gUmVhZFN0cmVhbS5hcHBseShPYmplY3QuY3JlYXRlKFJlYWRTdHJlYW0ucHJvdG90eXBlKSwgYXJndW1lbnRzKVxuICB9XG5cbiAgZnVuY3Rpb24gUmVhZFN0cmVhbSRvcGVuICgpIHtcbiAgICB2YXIgdGhhdCA9IHRoaXNcbiAgICBvcGVuKHRoYXQucGF0aCwgdGhhdC5mbGFncywgdGhhdC5tb2RlLCBmdW5jdGlvbiAoZXJyLCBmZCkge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBpZiAodGhhdC5hdXRvQ2xvc2UpXG4gICAgICAgICAgdGhhdC5kZXN0cm95KClcblxuICAgICAgICB0aGF0LmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhhdC5mZCA9IGZkXG4gICAgICAgIHRoYXQuZW1pdCgnb3BlbicsIGZkKVxuICAgICAgICB0aGF0LnJlYWQoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBXcml0ZVN0cmVhbSAocGF0aCwgb3B0aW9ucykge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgV3JpdGVTdHJlYW0pXG4gICAgICByZXR1cm4gZnMkV3JpdGVTdHJlYW0uYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdGhpc1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBXcml0ZVN0cmVhbS5hcHBseShPYmplY3QuY3JlYXRlKFdyaXRlU3RyZWFtLnByb3RvdHlwZSksIGFyZ3VtZW50cylcbiAgfVxuXG4gIGZ1bmN0aW9uIFdyaXRlU3RyZWFtJG9wZW4gKCkge1xuICAgIHZhciB0aGF0ID0gdGhpc1xuICAgIG9wZW4odGhhdC5wYXRoLCB0aGF0LmZsYWdzLCB0aGF0Lm1vZGUsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHRoYXQuZGVzdHJveSgpXG4gICAgICAgIHRoYXQuZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGF0LmZkID0gZmRcbiAgICAgICAgdGhhdC5lbWl0KCdvcGVuJywgZmQpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVJlYWRTdHJlYW0gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IGZzLlJlYWRTdHJlYW0ocGF0aCwgb3B0aW9ucylcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVdyaXRlU3RyZWFtIChwYXRoLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBmcy5Xcml0ZVN0cmVhbShwYXRoLCBvcHRpb25zKVxuICB9XG5cbiAgdmFyIGZzJG9wZW4gPSBmcy5vcGVuXG4gIGZzLm9wZW4gPSBvcGVuXG4gIGZ1bmN0aW9uIG9wZW4gKHBhdGgsIGZsYWdzLCBtb2RlLCBjYikge1xuICAgIGlmICh0eXBlb2YgbW9kZSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIGNiID0gbW9kZSwgbW9kZSA9IG51bGxcblxuICAgIHJldHVybiBnbyRvcGVuKHBhdGgsIGZsYWdzLCBtb2RlLCBjYilcblxuICAgIGZ1bmN0aW9uIGdvJG9wZW4gKHBhdGgsIGZsYWdzLCBtb2RlLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICByZXR1cm4gZnMkb3BlbihwYXRoLCBmbGFncywgbW9kZSwgZnVuY3Rpb24gKGVyciwgZmQpIHtcbiAgICAgICAgaWYgKGVyciAmJiAoZXJyLmNvZGUgPT09ICdFTUZJTEUnIHx8IGVyci5jb2RlID09PSAnRU5GSUxFJykpXG4gICAgICAgICAgZW5xdWV1ZShbZ28kb3BlbiwgW3BhdGgsIGZsYWdzLCBtb2RlLCBjYl0sIGVyciwgc3RhcnRUaW1lIHx8IERhdGUubm93KCksIERhdGUubm93KCldKVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmc1xufVxuXG5mdW5jdGlvbiBlbnF1ZXVlIChlbGVtKSB7XG4gIGRlYnVnKCdFTlFVRVVFJywgZWxlbVswXS5uYW1lLCBlbGVtWzFdKVxuICBmc1tncmFjZWZ1bFF1ZXVlXS5wdXNoKGVsZW0pXG4gIHJldHJ5KClcbn1cblxuLy8ga2VlcCB0cmFjayBvZiB0aGUgdGltZW91dCBiZXR3ZWVuIHJldHJ5KCkgY2FsbHNcbnZhciByZXRyeVRpbWVyXG5cbi8vIHJlc2V0IHRoZSBzdGFydFRpbWUgYW5kIGxhc3RUaW1lIHRvIG5vd1xuLy8gdGhpcyByZXNldHMgdGhlIHN0YXJ0IG9mIHRoZSA2MCBzZWNvbmQgb3ZlcmFsbCB0aW1lb3V0IGFzIHdlbGwgYXMgdGhlXG4vLyBkZWxheSBiZXR3ZWVuIGF0dGVtcHRzIHNvIHRoYXQgd2UnbGwgcmV0cnkgdGhlc2Ugam9icyBzb29uZXJcbmZ1bmN0aW9uIHJlc2V0UXVldWUgKCkge1xuICB2YXIgbm93ID0gRGF0ZS5ub3coKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGZzW2dyYWNlZnVsUXVldWVdLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gZW50cmllcyB0aGF0IGFyZSBvbmx5IGEgbGVuZ3RoIG9mIDIgYXJlIGZyb20gYW4gb2xkZXIgdmVyc2lvbiwgZG9uJ3RcbiAgICAvLyBib3RoZXIgbW9kaWZ5aW5nIHRob3NlIHNpbmNlIHRoZXknbGwgYmUgcmV0cmllZCBhbnl3YXkuXG4gICAgaWYgKGZzW2dyYWNlZnVsUXVldWVdW2ldLmxlbmd0aCA+IDIpIHtcbiAgICAgIGZzW2dyYWNlZnVsUXVldWVdW2ldWzNdID0gbm93IC8vIHN0YXJ0VGltZVxuICAgICAgZnNbZ3JhY2VmdWxRdWV1ZV1baV1bNF0gPSBub3cgLy8gbGFzdFRpbWVcbiAgICB9XG4gIH1cbiAgLy8gY2FsbCByZXRyeSB0byBtYWtlIHN1cmUgd2UncmUgYWN0aXZlbHkgcHJvY2Vzc2luZyB0aGUgcXVldWVcbiAgcmV0cnkoKVxufVxuXG5mdW5jdGlvbiByZXRyeSAoKSB7XG4gIC8vIGNsZWFyIHRoZSB0aW1lciBhbmQgcmVtb3ZlIGl0IHRvIGhlbHAgcHJldmVudCB1bmludGVuZGVkIGNvbmN1cnJlbmN5XG4gIGNsZWFyVGltZW91dChyZXRyeVRpbWVyKVxuICByZXRyeVRpbWVyID0gdW5kZWZpbmVkXG5cbiAgaWYgKGZzW2dyYWNlZnVsUXVldWVdLmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm5cblxuICB2YXIgZWxlbSA9IGZzW2dyYWNlZnVsUXVldWVdLnNoaWZ0KClcbiAgdmFyIGZuID0gZWxlbVswXVxuICB2YXIgYXJncyA9IGVsZW1bMV1cbiAgLy8gdGhlc2UgaXRlbXMgbWF5IGJlIHVuc2V0IGlmIHRoZXkgd2VyZSBhZGRlZCBieSBhbiBvbGRlciBncmFjZWZ1bC1mc1xuICB2YXIgZXJyID0gZWxlbVsyXVxuICB2YXIgc3RhcnRUaW1lID0gZWxlbVszXVxuICB2YXIgbGFzdFRpbWUgPSBlbGVtWzRdXG5cbiAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhIHN0YXJ0VGltZSB3ZSBoYXZlIG5vIHdheSBvZiBrbm93aW5nIGlmIHdlJ3ZlIHdhaXRlZFxuICAvLyBsb25nIGVub3VnaCwgc28gZ28gYWhlYWQgYW5kIHJldHJ5IHRoaXMgaXRlbSBub3dcbiAgaWYgKHN0YXJ0VGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZGVidWcoJ1JFVFJZJywgZm4ubmFtZSwgYXJncylcbiAgICBmbi5hcHBseShudWxsLCBhcmdzKVxuICB9IGVsc2UgaWYgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPj0gNjAwMDApIHtcbiAgICAvLyBpdCdzIGJlZW4gbW9yZSB0aGFuIDYwIHNlY29uZHMgdG90YWwsIGJhaWwgbm93XG4gICAgZGVidWcoJ1RJTUVPVVQnLCBmbi5uYW1lLCBhcmdzKVxuICAgIHZhciBjYiA9IGFyZ3MucG9wKClcbiAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgY2IuY2FsbChudWxsLCBlcnIpXG4gIH0gZWxzZSB7XG4gICAgLy8gdGhlIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gdGhlIGxhc3QgYXR0ZW1wdCBhbmQgcmlnaHQgbm93XG4gICAgdmFyIHNpbmNlQXR0ZW1wdCA9IERhdGUubm93KCkgLSBsYXN0VGltZVxuICAgIC8vIHRoZSBhbW91bnQgb2YgdGltZSBiZXR3ZWVuIHdoZW4gd2UgZmlyc3QgdHJpZWQsIGFuZCB3aGVuIHdlIGxhc3QgdHJpZWRcbiAgICAvLyByb3VuZGVkIHVwIHRvIGF0IGxlYXN0IDFcbiAgICB2YXIgc2luY2VTdGFydCA9IE1hdGgubWF4KGxhc3RUaW1lIC0gc3RhcnRUaW1lLCAxKVxuICAgIC8vIGJhY2tvZmYuIHdhaXQgbG9uZ2VyIHRoYW4gdGhlIHRvdGFsIHRpbWUgd2UndmUgYmVlbiByZXRyeWluZywgYnV0IG9ubHlcbiAgICAvLyB1cCB0byBhIG1heGltdW0gb2YgMTAwbXNcbiAgICB2YXIgZGVzaXJlZERlbGF5ID0gTWF0aC5taW4oc2luY2VTdGFydCAqIDEuMiwgMTAwKVxuICAgIC8vIGl0J3MgYmVlbiBsb25nIGVub3VnaCBzaW5jZSB0aGUgbGFzdCByZXRyeSwgZG8gaXQgYWdhaW5cbiAgICBpZiAoc2luY2VBdHRlbXB0ID49IGRlc2lyZWREZWxheSkge1xuICAgICAgZGVidWcoJ1JFVFJZJywgZm4ubmFtZSwgYXJncylcbiAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtzdGFydFRpbWVdKSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgd2UgY2FuJ3QgZG8gdGhpcyBqb2IgeWV0LCBwdXNoIGl0IHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlXG4gICAgICAvLyBhbmQgbGV0IHRoZSBuZXh0IGl0ZXJhdGlvbiBjaGVjayBhZ2FpblxuICAgICAgZnNbZ3JhY2VmdWxRdWV1ZV0ucHVzaChlbGVtKVxuICAgIH1cbiAgfVxuXG4gIC8vIHNjaGVkdWxlIG91ciBuZXh0IHJ1biBpZiBvbmUgaXNuJ3QgYWxyZWFkeSBzY2hlZHVsZWRcbiAgaWYgKHJldHJ5VGltZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHJ5VGltZXIgPSBzZXRUaW1lb3V0KHJldHJ5LCAwKVxuICB9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///77\n")},8520:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var Stream = (__webpack_require__(2781).Stream)\n\nmodule.exports = legacy\n\nfunction legacy (fs) {\n return {\n ReadStream: ReadStream,\n WriteStream: WriteStream\n }\n\n function ReadStream (path, options) {\n if (!(this instanceof ReadStream)) return new ReadStream(path, options);\n\n Stream.call(this);\n\n var self = this;\n\n this.path = path;\n this.fd = null;\n this.readable = true;\n this.paused = false;\n\n this.flags = 'r';\n this.mode = 438; /*=0666*/\n this.bufferSize = 64 * 1024;\n\n options = options || {};\n\n // Mixin options into this\n var keys = Object.keys(options);\n for (var index = 0, length = keys.length; index < length; index++) {\n var key = keys[index];\n this[key] = options[key];\n }\n\n if (this.encoding) this.setEncoding(this.encoding);\n\n if (this.start !== undefined) {\n if ('number' !== typeof this.start) {\n throw TypeError('start must be a Number');\n }\n if (this.end === undefined) {\n this.end = Infinity;\n } else if ('number' !== typeof this.end) {\n throw TypeError('end must be a Number');\n }\n\n if (this.start > this.end) {\n throw new Error('start must be <= end');\n }\n\n this.pos = this.start;\n }\n\n if (this.fd !== null) {\n process.nextTick(function() {\n self._read();\n });\n return;\n }\n\n fs.open(this.path, this.flags, this.mode, function (err, fd) {\n if (err) {\n self.emit('error', err);\n self.readable = false;\n return;\n }\n\n self.fd = fd;\n self.emit('open', fd);\n self._read();\n })\n }\n\n function WriteStream (path, options) {\n if (!(this instanceof WriteStream)) return new WriteStream(path, options);\n\n Stream.call(this);\n\n this.path = path;\n this.fd = null;\n this.writable = true;\n\n this.flags = 'w';\n this.encoding = 'binary';\n this.mode = 438; /*=0666*/\n this.bytesWritten = 0;\n\n options = options || {};\n\n // Mixin options into this\n var keys = Object.keys(options);\n for (var index = 0, length = keys.length; index < length; index++) {\n var key = keys[index];\n this[key] = options[key];\n }\n\n if (this.start !== undefined) {\n if ('number' !== typeof this.start) {\n throw TypeError('start must be a Number');\n }\n if (this.start < 0) {\n throw new Error('start must be >= zero');\n }\n\n this.pos = this.start;\n }\n\n this.busy = false;\n this._queue = [];\n\n if (this.fd === null) {\n this._open = fs.open;\n this._queue.push([this._open, this.path, this.flags, this.mode, undefined]);\n this.flush();\n }\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODUyMC5qcyIsIm1hcHBpbmdzIjoiQUFBQSxhQUFhLGtDQUF3Qjs7QUFFckM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBOztBQUVBO0FBQ0E7QUFDQSw4Q0FBOEMsZ0JBQWdCO0FBQzlEO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDhDQUE4QyxnQkFBZ0I7QUFDOUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2dyYWNlZnVsLWZzL2xlZ2FjeS1zdHJlYW1zLmpzP2MwMmYiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxlZ2FjeVxuXG5mdW5jdGlvbiBsZWdhY3kgKGZzKSB7XG4gIHJldHVybiB7XG4gICAgUmVhZFN0cmVhbTogUmVhZFN0cmVhbSxcbiAgICBXcml0ZVN0cmVhbTogV3JpdGVTdHJlYW1cbiAgfVxuXG4gIGZ1bmN0aW9uIFJlYWRTdHJlYW0gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZFN0cmVhbSkpIHJldHVybiBuZXcgUmVhZFN0cmVhbShwYXRoLCBvcHRpb25zKTtcblxuICAgIFN0cmVhbS5jYWxsKHRoaXMpO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICB0aGlzLmZkID0gbnVsbDtcbiAgICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5mbGFncyA9ICdyJztcbiAgICB0aGlzLm1vZGUgPSA0Mzg7IC8qPTA2NjYqL1xuICAgIHRoaXMuYnVmZmVyU2l6ZSA9IDY0ICogMTAyNDtcblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgLy8gTWl4aW4gb3B0aW9ucyBpbnRvIHRoaXNcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICAgIGZvciAodmFyIGluZGV4ID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpbmRleF07XG4gICAgICB0aGlzW2tleV0gPSBvcHRpb25zW2tleV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZW5jb2RpbmcpIHRoaXMuc2V0RW5jb2RpbmcodGhpcy5lbmNvZGluZyk7XG5cbiAgICBpZiAodGhpcy5zdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoJ251bWJlcicgIT09IHR5cGVvZiB0aGlzLnN0YXJ0KSB7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcignc3RhcnQgbXVzdCBiZSBhIE51bWJlcicpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5lbmQgPSBJbmZpbml0eTtcbiAgICAgIH0gZWxzZSBpZiAoJ251bWJlcicgIT09IHR5cGVvZiB0aGlzLmVuZCkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ2VuZCBtdXN0IGJlIGEgTnVtYmVyJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnN0YXJ0ID4gdGhpcy5lbmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdGFydCBtdXN0IGJlIDw9IGVuZCcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmQgIT09IG51bGwpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYuX3JlYWQoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZzLm9wZW4odGhpcy5wYXRoLCB0aGlzLmZsYWdzLCB0aGlzLm1vZGUsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICBzZWxmLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2VsZi5mZCA9IGZkO1xuICAgICAgc2VsZi5lbWl0KCdvcGVuJywgZmQpO1xuICAgICAgc2VsZi5fcmVhZCgpO1xuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBXcml0ZVN0cmVhbSAocGF0aCwgb3B0aW9ucykge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXcml0ZVN0cmVhbSkpIHJldHVybiBuZXcgV3JpdGVTdHJlYW0ocGF0aCwgb3B0aW9ucyk7XG5cbiAgICBTdHJlYW0uY2FsbCh0aGlzKTtcblxuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgdGhpcy5mZCA9IG51bGw7XG4gICAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgICB0aGlzLmZsYWdzID0gJ3cnO1xuICAgIHRoaXMuZW5jb2RpbmcgPSAnYmluYXJ5JztcbiAgICB0aGlzLm1vZGUgPSA0Mzg7IC8qPTA2NjYqL1xuICAgIHRoaXMuYnl0ZXNXcml0dGVuID0gMDtcblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgLy8gTWl4aW4gb3B0aW9ucyBpbnRvIHRoaXNcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICAgIGZvciAodmFyIGluZGV4ID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpbmRleF07XG4gICAgICB0aGlzW2tleV0gPSBvcHRpb25zW2tleV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCdudW1iZXInICE9PSB0eXBlb2YgdGhpcy5zdGFydCkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ3N0YXJ0IG11c3QgYmUgYSBOdW1iZXInKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0YXJ0IDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YXJ0IG11c3QgYmUgPj0gemVybycpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7XG4gICAgfVxuXG4gICAgdGhpcy5idXN5ID0gZmFsc2U7XG4gICAgdGhpcy5fcXVldWUgPSBbXTtcblxuICAgIGlmICh0aGlzLmZkID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9vcGVuID0gZnMub3BlbjtcbiAgICAgIHRoaXMuX3F1ZXVlLnB1c2goW3RoaXMuX29wZW4sIHRoaXMucGF0aCwgdGhpcy5mbGFncywgdGhpcy5tb2RlLCB1bmRlZmluZWRdKTtcbiAgICAgIHRoaXMuZmx1c2goKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8520\n")},1382:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var constants = __webpack_require__(2057)\n\nvar origCwd = process.cwd\nvar cwd = null\n\nvar platform = process.env.GRACEFUL_FS_PLATFORM || process.platform\n\nprocess.cwd = function() {\n if (!cwd)\n cwd = origCwd.call(process)\n return cwd\n}\ntry {\n process.cwd()\n} catch (er) {}\n\n// This check is needed until node.js 12 is required\nif (typeof process.chdir === 'function') {\n var chdir = process.chdir\n process.chdir = function (d) {\n cwd = null\n chdir.call(process, d)\n }\n if (Object.setPrototypeOf) Object.setPrototypeOf(process.chdir, chdir)\n}\n\nmodule.exports = patch\n\nfunction patch (fs) {\n // (re-)implement some things that are known busted or missing.\n\n // lchmod, broken prior to 0.6.2\n // back-port the fix here.\n if (constants.hasOwnProperty('O_SYMLINK') &&\n process.version.match(/^v0\\.6\\.[0-2]|^v0\\.5\\./)) {\n patchLchmod(fs)\n }\n\n // lutimes implementation, or no-op\n if (!fs.lutimes) {\n patchLutimes(fs)\n }\n\n // https://github.com/isaacs/node-graceful-fs/issues/4\n // Chown should not fail on einval or eperm if non-root.\n // It should not fail on enosys ever, as this just indicates\n // that a fs doesn't support the intended operation.\n\n fs.chown = chownFix(fs.chown)\n fs.fchown = chownFix(fs.fchown)\n fs.lchown = chownFix(fs.lchown)\n\n fs.chmod = chmodFix(fs.chmod)\n fs.fchmod = chmodFix(fs.fchmod)\n fs.lchmod = chmodFix(fs.lchmod)\n\n fs.chownSync = chownFixSync(fs.chownSync)\n fs.fchownSync = chownFixSync(fs.fchownSync)\n fs.lchownSync = chownFixSync(fs.lchownSync)\n\n fs.chmodSync = chmodFixSync(fs.chmodSync)\n fs.fchmodSync = chmodFixSync(fs.fchmodSync)\n fs.lchmodSync = chmodFixSync(fs.lchmodSync)\n\n fs.stat = statFix(fs.stat)\n fs.fstat = statFix(fs.fstat)\n fs.lstat = statFix(fs.lstat)\n\n fs.statSync = statFixSync(fs.statSync)\n fs.fstatSync = statFixSync(fs.fstatSync)\n fs.lstatSync = statFixSync(fs.lstatSync)\n\n // if lchmod/lchown do not exist, then make them no-ops\n if (fs.chmod && !fs.lchmod) {\n fs.lchmod = function (path, mode, cb) {\n if (cb) process.nextTick(cb)\n }\n fs.lchmodSync = function () {}\n }\n if (fs.chown && !fs.lchown) {\n fs.lchown = function (path, uid, gid, cb) {\n if (cb) process.nextTick(cb)\n }\n fs.lchownSync = function () {}\n }\n\n // on Windows, A/V software can lock the directory, causing this\n // to fail with an EACCES or EPERM if the directory contains newly\n // created files. Try again on failure, for up to 60 seconds.\n\n // Set the timeout this long because some Windows Anti-Virus, such as Parity\n // bit9, may lock files for up to a minute, causing npm package install\n // failures. Also, take care to yield the scheduler. Windows scheduling gives\n // CPU to a busy looping process, which can cause the program causing the lock\n // contention to be starved of CPU by node, so the contention doesn't resolve.\n if (platform === \"win32\") {\n fs.rename = typeof fs.rename !== 'function' ? fs.rename\n : (function (fs$rename) {\n function rename (from, to, cb) {\n var start = Date.now()\n var backoff = 0;\n fs$rename(from, to, function CB (er) {\n if (er\n && (er.code === \"EACCES\" || er.code === \"EPERM\")\n && Date.now() - start < 60000) {\n setTimeout(function() {\n fs.stat(to, function (stater, st) {\n if (stater && stater.code === \"ENOENT\")\n fs$rename(from, to, CB);\n else\n cb(er)\n })\n }, backoff)\n if (backoff < 100)\n backoff += 10;\n return;\n }\n if (cb) cb(er)\n })\n }\n if (Object.setPrototypeOf) Object.setPrototypeOf(rename, fs$rename)\n return rename\n })(fs.rename)\n }\n\n // if read() returns EAGAIN, then just try it again.\n fs.read = typeof fs.read !== 'function' ? fs.read\n : (function (fs$read) {\n function read (fd, buffer, offset, length, position, callback_) {\n var callback\n if (callback_ && typeof callback_ === 'function') {\n var eagCounter = 0\n callback = function (er, _, __) {\n if (er && er.code === 'EAGAIN' && eagCounter < 10) {\n eagCounter ++\n return fs$read.call(fs, fd, buffer, offset, length, position, callback)\n }\n callback_.apply(this, arguments)\n }\n }\n return fs$read.call(fs, fd, buffer, offset, length, position, callback)\n }\n\n // This ensures `util.promisify` works as it does for native `fs.read`.\n if (Object.setPrototypeOf) Object.setPrototypeOf(read, fs$read)\n return read\n })(fs.read)\n\n fs.readSync = typeof fs.readSync !== 'function' ? fs.readSync\n : (function (fs$readSync) { return function (fd, buffer, offset, length, position) {\n var eagCounter = 0\n while (true) {\n try {\n return fs$readSync.call(fs, fd, buffer, offset, length, position)\n } catch (er) {\n if (er.code === 'EAGAIN' && eagCounter < 10) {\n eagCounter ++\n continue\n }\n throw er\n }\n }\n }})(fs.readSync)\n\n function patchLchmod (fs) {\n fs.lchmod = function (path, mode, callback) {\n fs.open( path\n , constants.O_WRONLY | constants.O_SYMLINK\n , mode\n , function (err, fd) {\n if (err) {\n if (callback) callback(err)\n return\n }\n // prefer to return the chmod error, if one occurs,\n // but still try to close, and report closing errors if they occur.\n fs.fchmod(fd, mode, function (err) {\n fs.close(fd, function(err2) {\n if (callback) callback(err || err2)\n })\n })\n })\n }\n\n fs.lchmodSync = function (path, mode) {\n var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode)\n\n // prefer to return the chmod error, if one occurs,\n // but still try to close, and report closing errors if they occur.\n var threw = true\n var ret\n try {\n ret = fs.fchmodSync(fd, mode)\n threw = false\n } finally {\n if (threw) {\n try {\n fs.closeSync(fd)\n } catch (er) {}\n } else {\n fs.closeSync(fd)\n }\n }\n return ret\n }\n }\n\n function patchLutimes (fs) {\n if (constants.hasOwnProperty(\"O_SYMLINK\") && fs.futimes) {\n fs.lutimes = function (path, at, mt, cb) {\n fs.open(path, constants.O_SYMLINK, function (er, fd) {\n if (er) {\n if (cb) cb(er)\n return\n }\n fs.futimes(fd, at, mt, function (er) {\n fs.close(fd, function (er2) {\n if (cb) cb(er || er2)\n })\n })\n })\n }\n\n fs.lutimesSync = function (path, at, mt) {\n var fd = fs.openSync(path, constants.O_SYMLINK)\n var ret\n var threw = true\n try {\n ret = fs.futimesSync(fd, at, mt)\n threw = false\n } finally {\n if (threw) {\n try {\n fs.closeSync(fd)\n } catch (er) {}\n } else {\n fs.closeSync(fd)\n }\n }\n return ret\n }\n\n } else if (fs.futimes) {\n fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) }\n fs.lutimesSync = function () {}\n }\n }\n\n function chmodFix (orig) {\n if (!orig) return orig\n return function (target, mode, cb) {\n return orig.call(fs, target, mode, function (er) {\n if (chownErOk(er)) er = null\n if (cb) cb.apply(this, arguments)\n })\n }\n }\n\n function chmodFixSync (orig) {\n if (!orig) return orig\n return function (target, mode) {\n try {\n return orig.call(fs, target, mode)\n } catch (er) {\n if (!chownErOk(er)) throw er\n }\n }\n }\n\n\n function chownFix (orig) {\n if (!orig) return orig\n return function (target, uid, gid, cb) {\n return orig.call(fs, target, uid, gid, function (er) {\n if (chownErOk(er)) er = null\n if (cb) cb.apply(this, arguments)\n })\n }\n }\n\n function chownFixSync (orig) {\n if (!orig) return orig\n return function (target, uid, gid) {\n try {\n return orig.call(fs, target, uid, gid)\n } catch (er) {\n if (!chownErOk(er)) throw er\n }\n }\n }\n\n function statFix (orig) {\n if (!orig) return orig\n // Older versions of Node erroneously returned signed integers for\n // uid + gid.\n return function (target, options, cb) {\n if (typeof options === 'function') {\n cb = options\n options = null\n }\n function callback (er, stats) {\n if (stats) {\n if (stats.uid < 0) stats.uid += 0x100000000\n if (stats.gid < 0) stats.gid += 0x100000000\n }\n if (cb) cb.apply(this, arguments)\n }\n return options ? orig.call(fs, target, options, callback)\n : orig.call(fs, target, callback)\n }\n }\n\n function statFixSync (orig) {\n if (!orig) return orig\n // Older versions of Node erroneously returned signed integers for\n // uid + gid.\n return function (target, options) {\n var stats = options ? orig.call(fs, target, options)\n : orig.call(fs, target)\n if (stats) {\n if (stats.uid < 0) stats.uid += 0x100000000\n if (stats.gid < 0) stats.gid += 0x100000000\n }\n return stats;\n }\n }\n\n // ENOSYS means that the fs doesn't support the op. Just ignore\n // that, because it doesn't matter.\n //\n // if there's no getuid, or if getuid() is something other\n // than 0, and the error is EINVAL or EPERM, then just ignore\n // it.\n //\n // This specific case is a silent failure in cp, install, tar,\n // and most other unix tools that manage permissions.\n //\n // When running as root, or if other types of errors are\n // encountered, then it's strict.\n function chownErOk (er) {\n if (!er)\n return true\n\n if (er.code === \"ENOSYS\")\n return true\n\n var nonroot = !process.getuid || process.getuid() !== 0\n if (nonroot) {\n if (er.code === \"EINVAL\" || er.code === \"EPERM\")\n return true\n }\n\n return false\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM4Mi5qcyIsIm1hcHBpbmdzIjoiQUFBQSxnQkFBZ0IsbUJBQU8sQ0FBQyxJQUFXOztBQUVuQztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNULE9BQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWixVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsTUFBTTtBQUNOLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9ncmFjZWZ1bC1mcy9wb2x5ZmlsbHMuanM/YTBhMyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnY29uc3RhbnRzJylcblxudmFyIG9yaWdDd2QgPSBwcm9jZXNzLmN3ZFxudmFyIGN3ZCA9IG51bGxcblxudmFyIHBsYXRmb3JtID0gcHJvY2Vzcy5lbnYuR1JBQ0VGVUxfRlNfUExBVEZPUk0gfHwgcHJvY2Vzcy5wbGF0Zm9ybVxuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIWN3ZClcbiAgICBjd2QgPSBvcmlnQ3dkLmNhbGwocHJvY2VzcylcbiAgcmV0dXJuIGN3ZFxufVxudHJ5IHtcbiAgcHJvY2Vzcy5jd2QoKVxufSBjYXRjaCAoZXIpIHt9XG5cbi8vIFRoaXMgY2hlY2sgaXMgbmVlZGVkIHVudGlsIG5vZGUuanMgMTIgaXMgcmVxdWlyZWRcbmlmICh0eXBlb2YgcHJvY2Vzcy5jaGRpciA9PT0gJ2Z1bmN0aW9uJykge1xuICB2YXIgY2hkaXIgPSBwcm9jZXNzLmNoZGlyXG4gIHByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZCkge1xuICAgIGN3ZCA9IG51bGxcbiAgICBjaGRpci5jYWxsKHByb2Nlc3MsIGQpXG4gIH1cbiAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikgT2JqZWN0LnNldFByb3RvdHlwZU9mKHByb2Nlc3MuY2hkaXIsIGNoZGlyKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGNoXG5cbmZ1bmN0aW9uIHBhdGNoIChmcykge1xuICAvLyAocmUtKWltcGxlbWVudCBzb21lIHRoaW5ncyB0aGF0IGFyZSBrbm93biBidXN0ZWQgb3IgbWlzc2luZy5cblxuICAvLyBsY2htb2QsIGJyb2tlbiBwcmlvciB0byAwLjYuMlxuICAvLyBiYWNrLXBvcnQgdGhlIGZpeCBoZXJlLlxuICBpZiAoY29uc3RhbnRzLmhhc093blByb3BlcnR5KCdPX1NZTUxJTksnKSAmJlxuICAgICAgcHJvY2Vzcy52ZXJzaW9uLm1hdGNoKC9edjBcXC42XFwuWzAtMl18XnYwXFwuNVxcLi8pKSB7XG4gICAgcGF0Y2hMY2htb2QoZnMpXG4gIH1cblxuICAvLyBsdXRpbWVzIGltcGxlbWVudGF0aW9uLCBvciBuby1vcFxuICBpZiAoIWZzLmx1dGltZXMpIHtcbiAgICBwYXRjaEx1dGltZXMoZnMpXG4gIH1cblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vaXNhYWNzL25vZGUtZ3JhY2VmdWwtZnMvaXNzdWVzLzRcbiAgLy8gQ2hvd24gc2hvdWxkIG5vdCBmYWlsIG9uIGVpbnZhbCBvciBlcGVybSBpZiBub24tcm9vdC5cbiAgLy8gSXQgc2hvdWxkIG5vdCBmYWlsIG9uIGVub3N5cyBldmVyLCBhcyB0aGlzIGp1c3QgaW5kaWNhdGVzXG4gIC8vIHRoYXQgYSBmcyBkb2Vzbid0IHN1cHBvcnQgdGhlIGludGVuZGVkIG9wZXJhdGlvbi5cblxuICBmcy5jaG93biA9IGNob3duRml4KGZzLmNob3duKVxuICBmcy5mY2hvd24gPSBjaG93bkZpeChmcy5mY2hvd24pXG4gIGZzLmxjaG93biA9IGNob3duRml4KGZzLmxjaG93bilcblxuICBmcy5jaG1vZCA9IGNobW9kRml4KGZzLmNobW9kKVxuICBmcy5mY2htb2QgPSBjaG1vZEZpeChmcy5mY2htb2QpXG4gIGZzLmxjaG1vZCA9IGNobW9kRml4KGZzLmxjaG1vZClcblxuICBmcy5jaG93blN5bmMgPSBjaG93bkZpeFN5bmMoZnMuY2hvd25TeW5jKVxuICBmcy5mY2hvd25TeW5jID0gY2hvd25GaXhTeW5jKGZzLmZjaG93blN5bmMpXG4gIGZzLmxjaG93blN5bmMgPSBjaG93bkZpeFN5bmMoZnMubGNob3duU3luYylcblxuICBmcy5jaG1vZFN5bmMgPSBjaG1vZEZpeFN5bmMoZnMuY2htb2RTeW5jKVxuICBmcy5mY2htb2RTeW5jID0gY2htb2RGaXhTeW5jKGZzLmZjaG1vZFN5bmMpXG4gIGZzLmxjaG1vZFN5bmMgPSBjaG1vZEZpeFN5bmMoZnMubGNobW9kU3luYylcblxuICBmcy5zdGF0ID0gc3RhdEZpeChmcy5zdGF0KVxuICBmcy5mc3RhdCA9IHN0YXRGaXgoZnMuZnN0YXQpXG4gIGZzLmxzdGF0ID0gc3RhdEZpeChmcy5sc3RhdClcblxuICBmcy5zdGF0U3luYyA9IHN0YXRGaXhTeW5jKGZzLnN0YXRTeW5jKVxuICBmcy5mc3RhdFN5bmMgPSBzdGF0Rml4U3luYyhmcy5mc3RhdFN5bmMpXG4gIGZzLmxzdGF0U3luYyA9IHN0YXRGaXhTeW5jKGZzLmxzdGF0U3luYylcblxuICAvLyBpZiBsY2htb2QvbGNob3duIGRvIG5vdCBleGlzdCwgdGhlbiBtYWtlIHRoZW0gbm8tb3BzXG4gIGlmIChmcy5jaG1vZCAmJiAhZnMubGNobW9kKSB7XG4gICAgZnMubGNobW9kID0gZnVuY3Rpb24gKHBhdGgsIG1vZGUsIGNiKSB7XG4gICAgICBpZiAoY2IpIHByb2Nlc3MubmV4dFRpY2soY2IpXG4gICAgfVxuICAgIGZzLmxjaG1vZFN5bmMgPSBmdW5jdGlvbiAoKSB7fVxuICB9XG4gIGlmIChmcy5jaG93biAmJiAhZnMubGNob3duKSB7XG4gICAgZnMubGNob3duID0gZnVuY3Rpb24gKHBhdGgsIHVpZCwgZ2lkLCBjYikge1xuICAgICAgaWYgKGNiKSBwcm9jZXNzLm5leHRUaWNrKGNiKVxuICAgIH1cbiAgICBmcy5sY2hvd25TeW5jID0gZnVuY3Rpb24gKCkge31cbiAgfVxuXG4gIC8vIG9uIFdpbmRvd3MsIEEvViBzb2Z0d2FyZSBjYW4gbG9jayB0aGUgZGlyZWN0b3J5LCBjYXVzaW5nIHRoaXNcbiAgLy8gdG8gZmFpbCB3aXRoIGFuIEVBQ0NFUyBvciBFUEVSTSBpZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5zIG5ld2x5XG4gIC8vIGNyZWF0ZWQgZmlsZXMuICBUcnkgYWdhaW4gb24gZmFpbHVyZSwgZm9yIHVwIHRvIDYwIHNlY29uZHMuXG5cbiAgLy8gU2V0IHRoZSB0aW1lb3V0IHRoaXMgbG9uZyBiZWNhdXNlIHNvbWUgV2luZG93cyBBbnRpLVZpcnVzLCBzdWNoIGFzIFBhcml0eVxuICAvLyBiaXQ5LCBtYXkgbG9jayBmaWxlcyBmb3IgdXAgdG8gYSBtaW51dGUsIGNhdXNpbmcgbnBtIHBhY2thZ2UgaW5zdGFsbFxuICAvLyBmYWlsdXJlcy4gQWxzbywgdGFrZSBjYXJlIHRvIHlpZWxkIHRoZSBzY2hlZHVsZXIuIFdpbmRvd3Mgc2NoZWR1bGluZyBnaXZlc1xuICAvLyBDUFUgdG8gYSBidXN5IGxvb3BpbmcgcHJvY2Vzcywgd2hpY2ggY2FuIGNhdXNlIHRoZSBwcm9ncmFtIGNhdXNpbmcgdGhlIGxvY2tcbiAgLy8gY29udGVudGlvbiB0byBiZSBzdGFydmVkIG9mIENQVSBieSBub2RlLCBzbyB0aGUgY29udGVudGlvbiBkb2Vzbid0IHJlc29sdmUuXG4gIGlmIChwbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiKSB7XG4gICAgZnMucmVuYW1lID0gdHlwZW9mIGZzLnJlbmFtZSAhPT0gJ2Z1bmN0aW9uJyA/IGZzLnJlbmFtZVxuICAgIDogKGZ1bmN0aW9uIChmcyRyZW5hbWUpIHtcbiAgICAgIGZ1bmN0aW9uIHJlbmFtZSAoZnJvbSwgdG8sIGNiKSB7XG4gICAgICAgIHZhciBzdGFydCA9IERhdGUubm93KClcbiAgICAgICAgdmFyIGJhY2tvZmYgPSAwO1xuICAgICAgICBmcyRyZW5hbWUoZnJvbSwgdG8sIGZ1bmN0aW9uIENCIChlcikge1xuICAgICAgICAgIGlmIChlclxuICAgICAgICAgICAgICAmJiAoZXIuY29kZSA9PT0gXCJFQUNDRVNcIiB8fCBlci5jb2RlID09PSBcIkVQRVJNXCIpXG4gICAgICAgICAgICAgICYmIERhdGUubm93KCkgLSBzdGFydCA8IDYwMDAwKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBmcy5zdGF0KHRvLCBmdW5jdGlvbiAoc3RhdGVyLCBzdCkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZXIgJiYgc3RhdGVyLmNvZGUgPT09IFwiRU5PRU5UXCIpXG4gICAgICAgICAgICAgICAgICBmcyRyZW5hbWUoZnJvbSwgdG8sIENCKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICBjYihlcilcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIGJhY2tvZmYpXG4gICAgICAgICAgICBpZiAoYmFja29mZiA8IDEwMClcbiAgICAgICAgICAgICAgYmFja29mZiArPSAxMDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNiKSBjYihlcilcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIE9iamVjdC5zZXRQcm90b3R5cGVPZihyZW5hbWUsIGZzJHJlbmFtZSlcbiAgICAgIHJldHVybiByZW5hbWVcbiAgICB9KShmcy5yZW5hbWUpXG4gIH1cblxuICAvLyBpZiByZWFkKCkgcmV0dXJucyBFQUdBSU4sIHRoZW4ganVzdCB0cnkgaXQgYWdhaW4uXG4gIGZzLnJlYWQgPSB0eXBlb2YgZnMucmVhZCAhPT0gJ2Z1bmN0aW9uJyA/IGZzLnJlYWRcbiAgOiAoZnVuY3Rpb24gKGZzJHJlYWQpIHtcbiAgICBmdW5jdGlvbiByZWFkIChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrXykge1xuICAgICAgdmFyIGNhbGxiYWNrXG4gICAgICBpZiAoY2FsbGJhY2tfICYmIHR5cGVvZiBjYWxsYmFja18gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIGVhZ0NvdW50ZXIgPSAwXG4gICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKGVyLCBfLCBfXykge1xuICAgICAgICAgIGlmIChlciAmJiBlci5jb2RlID09PSAnRUFHQUlOJyAmJiBlYWdDb3VudGVyIDwgMTApIHtcbiAgICAgICAgICAgIGVhZ0NvdW50ZXIgKytcbiAgICAgICAgICAgIHJldHVybiBmcyRyZWFkLmNhbGwoZnMsIGZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2spXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhbGxiYWNrXy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmcyRyZWFkLmNhbGwoZnMsIGZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2spXG4gICAgfVxuXG4gICAgLy8gVGhpcyBlbnN1cmVzIGB1dGlsLnByb21pc2lmeWAgd29ya3MgYXMgaXQgZG9lcyBmb3IgbmF0aXZlIGBmcy5yZWFkYC5cbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSBPYmplY3Quc2V0UHJvdG90eXBlT2YocmVhZCwgZnMkcmVhZClcbiAgICByZXR1cm4gcmVhZFxuICB9KShmcy5yZWFkKVxuXG4gIGZzLnJlYWRTeW5jID0gdHlwZW9mIGZzLnJlYWRTeW5jICE9PSAnZnVuY3Rpb24nID8gZnMucmVhZFN5bmNcbiAgOiAoZnVuY3Rpb24gKGZzJHJlYWRTeW5jKSB7IHJldHVybiBmdW5jdGlvbiAoZmQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uKSB7XG4gICAgdmFyIGVhZ0NvdW50ZXIgPSAwXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBmcyRyZWFkU3luYy5jYWxsKGZzLCBmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICBpZiAoZXIuY29kZSA9PT0gJ0VBR0FJTicgJiYgZWFnQ291bnRlciA8IDEwKSB7XG4gICAgICAgICAgZWFnQ291bnRlciArK1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJcbiAgICAgIH1cbiAgICB9XG4gIH19KShmcy5yZWFkU3luYylcblxuICBmdW5jdGlvbiBwYXRjaExjaG1vZCAoZnMpIHtcbiAgICBmcy5sY2htb2QgPSBmdW5jdGlvbiAocGF0aCwgbW9kZSwgY2FsbGJhY2spIHtcbiAgICAgIGZzLm9wZW4oIHBhdGhcbiAgICAgICAgICAgICAsIGNvbnN0YW50cy5PX1dST05MWSB8IGNvbnN0YW50cy5PX1NZTUxJTktcbiAgICAgICAgICAgICAsIG1vZGVcbiAgICAgICAgICAgICAsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKGVycilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICAvLyBwcmVmZXIgdG8gcmV0dXJuIHRoZSBjaG1vZCBlcnJvciwgaWYgb25lIG9jY3VycyxcbiAgICAgICAgLy8gYnV0IHN0aWxsIHRyeSB0byBjbG9zZSwgYW5kIHJlcG9ydCBjbG9zaW5nIGVycm9ycyBpZiB0aGV5IG9jY3VyLlxuICAgICAgICBmcy5mY2htb2QoZmQsIG1vZGUsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICBmcy5jbG9zZShmZCwgZnVuY3Rpb24oZXJyMikge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhlcnIgfHwgZXJyMilcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBmcy5sY2htb2RTeW5jID0gZnVuY3Rpb24gKHBhdGgsIG1vZGUpIHtcbiAgICAgIHZhciBmZCA9IGZzLm9wZW5TeW5jKHBhdGgsIGNvbnN0YW50cy5PX1dST05MWSB8IGNvbnN0YW50cy5PX1NZTUxJTkssIG1vZGUpXG5cbiAgICAgIC8vIHByZWZlciB0byByZXR1cm4gdGhlIGNobW9kIGVycm9yLCBpZiBvbmUgb2NjdXJzLFxuICAgICAgLy8gYnV0IHN0aWxsIHRyeSB0byBjbG9zZSwgYW5kIHJlcG9ydCBjbG9zaW5nIGVycm9ycyBpZiB0aGV5IG9jY3VyLlxuICAgICAgdmFyIHRocmV3ID0gdHJ1ZVxuICAgICAgdmFyIHJldFxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0ID0gZnMuZmNobW9kU3luYyhmZCwgbW9kZSlcbiAgICAgICAgdGhyZXcgPSBmYWxzZVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHRocmV3KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICB9IGNhdGNoIChlcikge31cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmcy5jbG9zZVN5bmMoZmQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXRcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXRjaEx1dGltZXMgKGZzKSB7XG4gICAgaWYgKGNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eShcIk9fU1lNTElOS1wiKSAmJiBmcy5mdXRpbWVzKSB7XG4gICAgICBmcy5sdXRpbWVzID0gZnVuY3Rpb24gKHBhdGgsIGF0LCBtdCwgY2IpIHtcbiAgICAgICAgZnMub3BlbihwYXRoLCBjb25zdGFudHMuT19TWU1MSU5LLCBmdW5jdGlvbiAoZXIsIGZkKSB7XG4gICAgICAgICAgaWYgKGVyKSB7XG4gICAgICAgICAgICBpZiAoY2IpIGNiKGVyKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGZzLmZ1dGltZXMoZmQsIGF0LCBtdCwgZnVuY3Rpb24gKGVyKSB7XG4gICAgICAgICAgICBmcy5jbG9zZShmZCwgZnVuY3Rpb24gKGVyMikge1xuICAgICAgICAgICAgICBpZiAoY2IpIGNiKGVyIHx8IGVyMilcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgZnMubHV0aW1lc1N5bmMgPSBmdW5jdGlvbiAocGF0aCwgYXQsIG10KSB7XG4gICAgICAgIHZhciBmZCA9IGZzLm9wZW5TeW5jKHBhdGgsIGNvbnN0YW50cy5PX1NZTUxJTkspXG4gICAgICAgIHZhciByZXRcbiAgICAgICAgdmFyIHRocmV3ID0gdHJ1ZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldCA9IGZzLmZ1dGltZXNTeW5jKGZkLCBhdCwgbXQpXG4gICAgICAgICAgdGhyZXcgPSBmYWxzZVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmICh0aHJldykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZnMuY2xvc2VTeW5jKGZkKVxuICAgICAgICAgICAgfSBjYXRjaCAoZXIpIHt9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFxuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChmcy5mdXRpbWVzKSB7XG4gICAgICBmcy5sdXRpbWVzID0gZnVuY3Rpb24gKF9hLCBfYiwgX2MsIGNiKSB7IGlmIChjYikgcHJvY2Vzcy5uZXh0VGljayhjYikgfVxuICAgICAgZnMubHV0aW1lc1N5bmMgPSBmdW5jdGlvbiAoKSB7fVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNobW9kRml4IChvcmlnKSB7XG4gICAgaWYgKCFvcmlnKSByZXR1cm4gb3JpZ1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBtb2RlLCBjYikge1xuICAgICAgcmV0dXJuIG9yaWcuY2FsbChmcywgdGFyZ2V0LCBtb2RlLCBmdW5jdGlvbiAoZXIpIHtcbiAgICAgICAgaWYgKGNob3duRXJPayhlcikpIGVyID0gbnVsbFxuICAgICAgICBpZiAoY2IpIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2htb2RGaXhTeW5jIChvcmlnKSB7XG4gICAgaWYgKCFvcmlnKSByZXR1cm4gb3JpZ1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBtb2RlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gb3JpZy5jYWxsKGZzLCB0YXJnZXQsIG1vZGUpXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICBpZiAoIWNob3duRXJPayhlcikpIHRocm93IGVyXG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICBmdW5jdGlvbiBjaG93bkZpeCAob3JpZykge1xuICAgIGlmICghb3JpZykgcmV0dXJuIG9yaWdcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgdWlkLCBnaWQsIGNiKSB7XG4gICAgICByZXR1cm4gb3JpZy5jYWxsKGZzLCB0YXJnZXQsIHVpZCwgZ2lkLCBmdW5jdGlvbiAoZXIpIHtcbiAgICAgICAgaWYgKGNob3duRXJPayhlcikpIGVyID0gbnVsbFxuICAgICAgICBpZiAoY2IpIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2hvd25GaXhTeW5jIChvcmlnKSB7XG4gICAgaWYgKCFvcmlnKSByZXR1cm4gb3JpZ1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCB1aWQsIGdpZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG9yaWcuY2FsbChmcywgdGFyZ2V0LCB1aWQsIGdpZClcbiAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgIGlmICghY2hvd25Fck9rKGVyKSkgdGhyb3cgZXJcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGF0Rml4IChvcmlnKSB7XG4gICAgaWYgKCFvcmlnKSByZXR1cm4gb3JpZ1xuICAgIC8vIE9sZGVyIHZlcnNpb25zIG9mIE5vZGUgZXJyb25lb3VzbHkgcmV0dXJuZWQgc2lnbmVkIGludGVnZXJzIGZvclxuICAgIC8vIHVpZCArIGdpZC5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgb3B0aW9ucywgY2IpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYiA9IG9wdGlvbnNcbiAgICAgICAgb3B0aW9ucyA9IG51bGxcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGNhbGxiYWNrIChlciwgc3RhdHMpIHtcbiAgICAgICAgaWYgKHN0YXRzKSB7XG4gICAgICAgICAgaWYgKHN0YXRzLnVpZCA8IDApIHN0YXRzLnVpZCArPSAweDEwMDAwMDAwMFxuICAgICAgICAgIGlmIChzdGF0cy5naWQgPCAwKSBzdGF0cy5naWQgKz0gMHgxMDAwMDAwMDBcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2IpIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb25zID8gb3JpZy5jYWxsKGZzLCB0YXJnZXQsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAgICAgICA6IG9yaWcuY2FsbChmcywgdGFyZ2V0LCBjYWxsYmFjaylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGF0Rml4U3luYyAob3JpZykge1xuICAgIGlmICghb3JpZykgcmV0dXJuIG9yaWdcbiAgICAvLyBPbGRlciB2ZXJzaW9ucyBvZiBOb2RlIGVycm9uZW91c2x5IHJldHVybmVkIHNpZ25lZCBpbnRlZ2VycyBmb3JcbiAgICAvLyB1aWQgKyBnaWQuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBzdGF0cyA9IG9wdGlvbnMgPyBvcmlnLmNhbGwoZnMsIHRhcmdldCwgb3B0aW9ucylcbiAgICAgICAgOiBvcmlnLmNhbGwoZnMsIHRhcmdldClcbiAgICAgIGlmIChzdGF0cykge1xuICAgICAgICBpZiAoc3RhdHMudWlkIDwgMCkgc3RhdHMudWlkICs9IDB4MTAwMDAwMDAwXG4gICAgICAgIGlmIChzdGF0cy5naWQgPCAwKSBzdGF0cy5naWQgKz0gMHgxMDAwMDAwMDBcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGF0cztcbiAgICB9XG4gIH1cblxuICAvLyBFTk9TWVMgbWVhbnMgdGhhdCB0aGUgZnMgZG9lc24ndCBzdXBwb3J0IHRoZSBvcC4gSnVzdCBpZ25vcmVcbiAgLy8gdGhhdCwgYmVjYXVzZSBpdCBkb2Vzbid0IG1hdHRlci5cbiAgLy9cbiAgLy8gaWYgdGhlcmUncyBubyBnZXR1aWQsIG9yIGlmIGdldHVpZCgpIGlzIHNvbWV0aGluZyBvdGhlclxuICAvLyB0aGFuIDAsIGFuZCB0aGUgZXJyb3IgaXMgRUlOVkFMIG9yIEVQRVJNLCB0aGVuIGp1c3QgaWdub3JlXG4gIC8vIGl0LlxuICAvL1xuICAvLyBUaGlzIHNwZWNpZmljIGNhc2UgaXMgYSBzaWxlbnQgZmFpbHVyZSBpbiBjcCwgaW5zdGFsbCwgdGFyLFxuICAvLyBhbmQgbW9zdCBvdGhlciB1bml4IHRvb2xzIHRoYXQgbWFuYWdlIHBlcm1pc3Npb25zLlxuICAvL1xuICAvLyBXaGVuIHJ1bm5pbmcgYXMgcm9vdCwgb3IgaWYgb3RoZXIgdHlwZXMgb2YgZXJyb3JzIGFyZVxuICAvLyBlbmNvdW50ZXJlZCwgdGhlbiBpdCdzIHN0cmljdC5cbiAgZnVuY3Rpb24gY2hvd25Fck9rIChlcikge1xuICAgIGlmICghZXIpXG4gICAgICByZXR1cm4gdHJ1ZVxuXG4gICAgaWYgKGVyLmNvZGUgPT09IFwiRU5PU1lTXCIpXG4gICAgICByZXR1cm4gdHJ1ZVxuXG4gICAgdmFyIG5vbnJvb3QgPSAhcHJvY2Vzcy5nZXR1aWQgfHwgcHJvY2Vzcy5nZXR1aWQoKSAhPT0gMFxuICAgIGlmIChub25yb290KSB7XG4gICAgICBpZiAoZXIuY29kZSA9PT0gXCJFSU5WQUxcIiB8fCBlci5jb2RlID09PSBcIkVQRVJNXCIpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1382\n")},7844:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var wrappy = __webpack_require__(2479)\nvar reqs = Object.create(null)\nvar once = __webpack_require__(778)\n\nmodule.exports = wrappy(inflight)\n\nfunction inflight (key, cb) {\n if (reqs[key]) {\n reqs[key].push(cb)\n return null\n } else {\n reqs[key] = [cb]\n return makeres(key)\n }\n}\n\nfunction makeres (key) {\n return once(function RES () {\n var cbs = reqs[key]\n var len = cbs.length\n var args = slice(arguments)\n\n // XXX It's somewhat ambiguous whether a new callback added in this\n // pass should be queued for later execution if something in the\n // list of callbacks throws, or if it should just be discarded.\n // However, it's such an edge case that it hardly matters, and either\n // choice is likely as surprising as the other.\n // As it happens, we do go ahead and schedule it for later execution.\n try {\n for (var i = 0; i < len; i++) {\n cbs[i].apply(null, args)\n }\n } finally {\n if (cbs.length > len) {\n // added more in the interim.\n // de-zalgo, just in case, but don't call again.\n cbs.splice(0, len)\n process.nextTick(function () {\n RES.apply(null, args)\n })\n } else {\n delete reqs[key]\n }\n }\n })\n}\n\nfunction slice (args) {\n var length = args.length\n var array = []\n\n for (var i = 0; i < length; i++) array[i] = args[i]\n return array\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzg0NC5qcyIsIm1hcHBpbmdzIjoiQUFBQSxhQUFhLG1CQUFPLENBQUMsSUFBUTtBQUM3QjtBQUNBLFdBQVcsbUJBQU8sQ0FBQyxHQUFNOztBQUV6Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLFlBQVk7QUFDOUI7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2luZmxpZ2h0L2luZmxpZ2h0LmpzPzQ0MDYiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHdyYXBweSA9IHJlcXVpcmUoJ3dyYXBweScpXG52YXIgcmVxcyA9IE9iamVjdC5jcmVhdGUobnVsbClcbnZhciBvbmNlID0gcmVxdWlyZSgnb25jZScpXG5cbm1vZHVsZS5leHBvcnRzID0gd3JhcHB5KGluZmxpZ2h0KVxuXG5mdW5jdGlvbiBpbmZsaWdodCAoa2V5LCBjYikge1xuICBpZiAocmVxc1trZXldKSB7XG4gICAgcmVxc1trZXldLnB1c2goY2IpXG4gICAgcmV0dXJuIG51bGxcbiAgfSBlbHNlIHtcbiAgICByZXFzW2tleV0gPSBbY2JdXG4gICAgcmV0dXJuIG1ha2VyZXMoa2V5KVxuICB9XG59XG5cbmZ1bmN0aW9uIG1ha2VyZXMgKGtleSkge1xuICByZXR1cm4gb25jZShmdW5jdGlvbiBSRVMgKCkge1xuICAgIHZhciBjYnMgPSByZXFzW2tleV1cbiAgICB2YXIgbGVuID0gY2JzLmxlbmd0aFxuICAgIHZhciBhcmdzID0gc2xpY2UoYXJndW1lbnRzKVxuXG4gICAgLy8gWFhYIEl0J3Mgc29tZXdoYXQgYW1iaWd1b3VzIHdoZXRoZXIgYSBuZXcgY2FsbGJhY2sgYWRkZWQgaW4gdGhpc1xuICAgIC8vIHBhc3Mgc2hvdWxkIGJlIHF1ZXVlZCBmb3IgbGF0ZXIgZXhlY3V0aW9uIGlmIHNvbWV0aGluZyBpbiB0aGVcbiAgICAvLyBsaXN0IG9mIGNhbGxiYWNrcyB0aHJvd3MsIG9yIGlmIGl0IHNob3VsZCBqdXN0IGJlIGRpc2NhcmRlZC5cbiAgICAvLyBIb3dldmVyLCBpdCdzIHN1Y2ggYW4gZWRnZSBjYXNlIHRoYXQgaXQgaGFyZGx5IG1hdHRlcnMsIGFuZCBlaXRoZXJcbiAgICAvLyBjaG9pY2UgaXMgbGlrZWx5IGFzIHN1cnByaXNpbmcgYXMgdGhlIG90aGVyLlxuICAgIC8vIEFzIGl0IGhhcHBlbnMsIHdlIGRvIGdvIGFoZWFkIGFuZCBzY2hlZHVsZSBpdCBmb3IgbGF0ZXIgZXhlY3V0aW9uLlxuICAgIHRyeSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGNic1tpXS5hcHBseShudWxsLCBhcmdzKVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoY2JzLmxlbmd0aCA+IGxlbikge1xuICAgICAgICAvLyBhZGRlZCBtb3JlIGluIHRoZSBpbnRlcmltLlxuICAgICAgICAvLyBkZS16YWxnbywganVzdCBpbiBjYXNlLCBidXQgZG9uJ3QgY2FsbCBhZ2Fpbi5cbiAgICAgICAgY2JzLnNwbGljZSgwLCBsZW4pXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIFJFUy5hcHBseShudWxsLCBhcmdzKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHJlcXNba2V5XVxuICAgICAgfVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gc2xpY2UgKGFyZ3MpIHtcbiAgdmFyIGxlbmd0aCA9IGFyZ3MubGVuZ3RoXG4gIHZhciBhcnJheSA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgYXJyYXlbaV0gPSBhcmdzW2ldXG4gIHJldHVybiBhcnJheVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7844\n")},4378:(module,__unused_webpack_exports,__webpack_require__)=>{eval("try {\n var util = __webpack_require__(3837);\n /* istanbul ignore next */\n if (typeof util.inherits !== 'function') throw '';\n module.exports = util.inherits;\n} catch (e) {\n /* istanbul ignore next */\n module.exports = __webpack_require__(5717);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDM3OC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBLGFBQWEsbUJBQU8sQ0FBQyxJQUFNO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBLEVBQUUsMENBQWlEO0FBQ25EIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHMuanM/ZDBhZCJdLCJzb3VyY2VzQ29udGVudCI6WyJ0cnkge1xuICB2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKHR5cGVvZiB1dGlsLmluaGVyaXRzICE9PSAnZnVuY3Rpb24nKSB0aHJvdyAnJztcbiAgbW9kdWxlLmV4cG9ydHMgPSB1dGlsLmluaGVyaXRzO1xufSBjYXRjaCAoZSkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vaW5oZXJpdHNfYnJvd3Nlci5qcycpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4378\n")},5717:module=>{eval("if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n })\n }\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTcxNy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcz8zZmI1Il0sInNvdXJjZXNDb250ZW50IjpbImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgICB9XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5717\n")},6245:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ InvalidTokenError: () => (/* binding */ n),\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction e(e){this.message=e}e.prototype=new Error,e.prototype.name="InvalidCharacterError";var r="undefined"!=typeof window&&window.atob&&window.atob.bind(window)||function(r){var t=String(r).replace(/=+$/,"");if(t.length%4==1)throw new e("\'atob\' failed: The string to be decoded is not correctly encoded.");for(var n,o,a=0,i=0,c="";o=t.charAt(i++);~o&&(n=a%4?64*n+o:o,a++%4)?c+=String.fromCharCode(255&n>>(-2*a&6)):0)o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(o);return c};function t(e){var t=e.replace(/-/g,"+").replace(/_/g,"/");switch(t.length%4){case 0:break;case 2:t+="==";break;case 3:t+="=";break;default:throw"Illegal base64url string!"}try{return function(e){return decodeURIComponent(r(e).replace(/(.)/g,(function(e,r){var t=r.charCodeAt(0).toString(16).toUpperCase();return t.length<2&&(t="0"+t),"%"+t})))}(t)}catch(e){return r(t)}}function n(e){this.message=e}function o(e,r){if("string"!=typeof e)throw new n("Invalid token specified");var o=!0===(r=r||{}).header?0:1;try{return JSON.parse(t(e.split(".")[o]))}catch(e){throw new n("Invalid token specified: "+e.message)}}n.prototype=new Error,n.prototype.name="InvalidTokenError";/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (o);\n//# sourceMappingURL=jwt-decode.esm.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjI0NS5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBLGNBQWMsZUFBZSwrREFBK0QscUZBQXFGLGtDQUFrQyxrR0FBa0cseUJBQXlCLGdCQUFnQixzSkFBc0osVUFBVSxjQUFjLDRDQUE0QyxtQkFBbUIsYUFBYSxlQUFlLE1BQU0sY0FBYyxNQUFNLHlDQUF5QyxJQUFJLG1CQUFtQiw2REFBNkQsaURBQWlELG1DQUFtQyxJQUFJLElBQUksU0FBUyxhQUFhLGNBQWMsZUFBZSxnQkFBZ0IsNkRBQTZELG1CQUFtQixhQUFhLElBQUksc0NBQXNDLFNBQVMsb0RBQW9ELDJEQUEyRCxpRUFBZSxDQUFDLEVBQWdDO0FBQzVzQyIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2p3dC1kZWNvZGUvYnVpbGQvand0LWRlY29kZS5lc20uanM/MTIzMiJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBlKGUpe3RoaXMubWVzc2FnZT1lfWUucHJvdG90eXBlPW5ldyBFcnJvcixlLnByb3RvdHlwZS5uYW1lPVwiSW52YWxpZENoYXJhY3RlckVycm9yXCI7dmFyIHI9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93LmF0b2ImJndpbmRvdy5hdG9iLmJpbmQod2luZG93KXx8ZnVuY3Rpb24ocil7dmFyIHQ9U3RyaW5nKHIpLnJlcGxhY2UoLz0rJC8sXCJcIik7aWYodC5sZW5ndGglND09MSl0aHJvdyBuZXcgZShcIidhdG9iJyBmYWlsZWQ6IFRoZSBzdHJpbmcgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuXCIpO2Zvcih2YXIgbixvLGE9MCxpPTAsYz1cIlwiO289dC5jaGFyQXQoaSsrKTt+byYmKG49YSU0PzY0Km4rbzpvLGErKyU0KT9jKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDI1NSZuPj4oLTIqYSY2KSk6MClvPVwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cIi5pbmRleE9mKG8pO3JldHVybiBjfTtmdW5jdGlvbiB0KGUpe3ZhciB0PWUucmVwbGFjZSgvLS9nLFwiK1wiKS5yZXBsYWNlKC9fL2csXCIvXCIpO3N3aXRjaCh0Lmxlbmd0aCU0KXtjYXNlIDA6YnJlYWs7Y2FzZSAyOnQrPVwiPT1cIjticmVhaztjYXNlIDM6dCs9XCI9XCI7YnJlYWs7ZGVmYXVsdDp0aHJvd1wiSWxsZWdhbCBiYXNlNjR1cmwgc3RyaW5nIVwifXRyeXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChyKGUpLnJlcGxhY2UoLyguKS9nLChmdW5jdGlvbihlLHIpe3ZhciB0PXIuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtyZXR1cm4gdC5sZW5ndGg8MiYmKHQ9XCIwXCIrdCksXCIlXCIrdH0pKSl9KHQpfWNhdGNoKGUpe3JldHVybiByKHQpfX1mdW5jdGlvbiBuKGUpe3RoaXMubWVzc2FnZT1lfWZ1bmN0aW9uIG8oZSxyKXtpZihcInN0cmluZ1wiIT10eXBlb2YgZSl0aHJvdyBuZXcgbihcIkludmFsaWQgdG9rZW4gc3BlY2lmaWVkXCIpO3ZhciBvPSEwPT09KHI9cnx8e30pLmhlYWRlcj8wOjE7dHJ5e3JldHVybiBKU09OLnBhcnNlKHQoZS5zcGxpdChcIi5cIilbb10pKX1jYXRjaChlKXt0aHJvdyBuZXcgbihcIkludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBcIitlLm1lc3NhZ2UpfX1uLnByb3RvdHlwZT1uZXcgRXJyb3Isbi5wcm90b3R5cGUubmFtZT1cIkludmFsaWRUb2tlbkVycm9yXCI7ZXhwb3J0IGRlZmF1bHQgbztleHBvcnR7biBhcyBJbnZhbGlkVG9rZW5FcnJvcn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1qd3QtZGVjb2RlLmVzbS5qcy5tYXBcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6245\n')},4150:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var util = __webpack_require__(3837);\nvar PassThrough = __webpack_require__(2209);\n\nmodule.exports = {\n Readable: Readable,\n Writable: Writable\n};\n\nutil.inherits(Readable, PassThrough);\nutil.inherits(Writable, PassThrough);\n\n// Patch the given method of instance so that the callback\n// is executed once, before the actual method is called the\n// first time.\nfunction beforeFirstCall(instance, method, callback) {\n instance[method] = function() {\n delete instance[method];\n callback.apply(this, arguments);\n return this[method].apply(this, arguments);\n };\n}\n\nfunction Readable(fn, options) {\n if (!(this instanceof Readable))\n return new Readable(fn, options);\n\n PassThrough.call(this, options);\n\n beforeFirstCall(this, '_read', function() {\n var source = fn.call(this, options);\n var emit = this.emit.bind(this, 'error');\n source.on('error', emit);\n source.pipe(this);\n });\n\n this.emit('readable');\n}\n\nfunction Writable(fn, options) {\n if (!(this instanceof Writable))\n return new Writable(fn, options);\n\n PassThrough.call(this, options);\n\n beforeFirstCall(this, '_write', function() {\n var destination = fn.call(this, options);\n var emit = this.emit.bind(this, 'error');\n destination.on('error', emit);\n this.pipe(destination);\n });\n\n this.emit('writable');\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE1MC5qcyIsIm1hcHBpbmdzIjoiQUFBQSxXQUFXLG1CQUFPLENBQUMsSUFBTTtBQUN6QixrQkFBa0IsbUJBQU8sQ0FBQyxJQUE2Qjs7QUFFdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2xhenlzdHJlYW0vbGliL2xhenlzdHJlYW0uanM/ZmZiZiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBQYXNzVGhyb3VnaCA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS9wYXNzdGhyb3VnaCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgUmVhZGFibGU6IFJlYWRhYmxlLFxuICBXcml0YWJsZTogV3JpdGFibGVcbn07XG5cbnV0aWwuaW5oZXJpdHMoUmVhZGFibGUsIFBhc3NUaHJvdWdoKTtcbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFBhc3NUaHJvdWdoKTtcblxuLy8gUGF0Y2ggdGhlIGdpdmVuIG1ldGhvZCBvZiBpbnN0YW5jZSBzbyB0aGF0IHRoZSBjYWxsYmFja1xuLy8gaXMgZXhlY3V0ZWQgb25jZSwgYmVmb3JlIHRoZSBhY3R1YWwgbWV0aG9kIGlzIGNhbGxlZCB0aGVcbi8vIGZpcnN0IHRpbWUuXG5mdW5jdGlvbiBiZWZvcmVGaXJzdENhbGwoaW5zdGFuY2UsIG1ldGhvZCwgY2FsbGJhY2spIHtcbiAgaW5zdGFuY2VbbWV0aG9kXSA9IGZ1bmN0aW9uKCkge1xuICAgIGRlbGV0ZSBpbnN0YW5jZVttZXRob2RdO1xuICAgIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHRoaXNbbWV0aG9kXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBSZWFkYWJsZShmbiwgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZGFibGUpKVxuICAgIHJldHVybiBuZXcgUmVhZGFibGUoZm4sIG9wdGlvbnMpO1xuXG4gIFBhc3NUaHJvdWdoLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgYmVmb3JlRmlyc3RDYWxsKHRoaXMsICdfcmVhZCcsIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzb3VyY2UgPSBmbi5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgIHZhciBlbWl0ID0gdGhpcy5lbWl0LmJpbmQodGhpcywgJ2Vycm9yJyk7XG4gICAgc291cmNlLm9uKCdlcnJvcicsIGVtaXQpO1xuICAgIHNvdXJjZS5waXBlKHRoaXMpO1xuICB9KTtcblxuICB0aGlzLmVtaXQoJ3JlYWRhYmxlJyk7XG59XG5cbmZ1bmN0aW9uIFdyaXRhYmxlKGZuLCBvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXcml0YWJsZSkpXG4gICAgcmV0dXJuIG5ldyBXcml0YWJsZShmbiwgb3B0aW9ucyk7XG5cbiAgUGFzc1Rocm91Z2guY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICBiZWZvcmVGaXJzdENhbGwodGhpcywgJ193cml0ZScsIGZ1bmN0aW9uKCkge1xuICAgIHZhciBkZXN0aW5hdGlvbiA9IGZuLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgdmFyIGVtaXQgPSB0aGlzLmVtaXQuYmluZCh0aGlzLCAnZXJyb3InKTtcbiAgICBkZXN0aW5hdGlvbi5vbignZXJyb3InLCBlbWl0KTtcbiAgICB0aGlzLnBpcGUoZGVzdGluYXRpb24pO1xuICB9KTtcblxuICB0aGlzLmVtaXQoJ3dyaXRhYmxlJyk7XG59XG5cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4150\n")},9774:module=>{eval("var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n return toString.call(arr) == '[object Array]';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTc3NC5qcyIsIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2xhenlzdHJlYW0vbm9kZV9tb2R1bGVzL2lzYXJyYXkvaW5kZXguanM/OWUyNSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9774\n")},2836:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a duplex stream is just a stream that is both readable and writable.\n// Since JS doesn't have multiple prototypal inheritance, this class\n// prototypally inherits from Readable, and then parasitically from\n// Writable.\n\n\n\n/**/\n\nvar pna = __webpack_require__(8212);\n/**/\n\n/**/\nvar objectKeys = Object.keys || function (obj) {\n var keys = [];\n for (var key in obj) {\n keys.push(key);\n }return keys;\n};\n/**/\n\nmodule.exports = Duplex;\n\n/**/\nvar util = Object.create(__webpack_require__(6497));\nutil.inherits = __webpack_require__(4378);\n/**/\n\nvar Readable = __webpack_require__(1143);\nvar Writable = __webpack_require__(3494);\n\nutil.inherits(Duplex, Readable);\n\n{\n // avoid scope creep, the keys array can then be collected\n var keys = objectKeys(Writable.prototype);\n for (var v = 0; v < keys.length; v++) {\n var method = keys[v];\n if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];\n }\n}\n\nfunction Duplex(options) {\n if (!(this instanceof Duplex)) return new Duplex(options);\n\n Readable.call(this, options);\n Writable.call(this, options);\n\n if (options && options.readable === false) this.readable = false;\n\n if (options && options.writable === false) this.writable = false;\n\n this.allowHalfOpen = true;\n if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;\n\n this.once('end', onend);\n}\n\nObject.defineProperty(Duplex.prototype, 'writableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function () {\n return this._writableState.highWaterMark;\n }\n});\n\n// the no-half-open enforcer\nfunction onend() {\n // if we allow half-open state, or if the writable side ended,\n // then we're ok.\n if (this.allowHalfOpen || this._writableState.ended) return;\n\n // no more data can be written.\n // But allow more writes to happen in this tick.\n pna.nextTick(onEndNT, this);\n}\n\nfunction onEndNT(self) {\n self.end();\n}\n\nObject.defineProperty(Duplex.prototype, 'destroyed', {\n get: function () {\n if (this._readableState === undefined || this._writableState === undefined) {\n return false;\n }\n return this._readableState.destroyed && this._writableState.destroyed;\n },\n set: function (value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (this._readableState === undefined || this._writableState === undefined) {\n return;\n }\n\n // backward compatibility, the user is explicitly\n // managing destroyed\n this._readableState.destroyed = value;\n this._writableState.destroyed = value;\n }\n});\n\nDuplex.prototype._destroy = function (err, cb) {\n this.push(null);\n this.end();\n\n pna.nextTick(cb, err);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgzNi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViOztBQUVBLFVBQVUsbUJBQU8sQ0FBQyxJQUFzQjtBQUN4Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSx5QkFBeUIsbUJBQU8sQ0FBQyxJQUFjO0FBQy9DLGdCQUFnQixtQkFBTyxDQUFDLElBQVU7QUFDbEM7O0FBRUEsZUFBZSxtQkFBTyxDQUFDLElBQW9CO0FBQzNDLGVBQWUsbUJBQU8sQ0FBQyxJQUFvQjs7QUFFM0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9sYXp5c3RyZWFtL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzPzc1ZTIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgZHVwbGV4IHN0cmVhbSBpcyBqdXN0IGEgc3RyZWFtIHRoYXQgaXMgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUuXG4vLyBTaW5jZSBKUyBkb2Vzbid0IGhhdmUgbXVsdGlwbGUgcHJvdG90eXBhbCBpbmhlcml0YW5jZSwgdGhpcyBjbGFzc1xuLy8gcHJvdG90eXBhbGx5IGluaGVyaXRzIGZyb20gUmVhZGFibGUsIGFuZCB0aGVuIHBhcmFzaXRpY2FsbHkgZnJvbVxuLy8gV3JpdGFibGUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHBuYSA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAga2V5cy5wdXNoKGtleSk7XG4gIH1yZXR1cm4ga2V5cztcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxubW9kdWxlLmV4cG9ydHMgPSBEdXBsZXg7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IE9iamVjdC5jcmVhdGUocmVxdWlyZSgnY29yZS11dGlsLWlzJykpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFJlYWRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3JlYWRhYmxlJyk7XG52YXIgV3JpdGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fd3JpdGFibGUnKTtcblxudXRpbC5pbmhlcml0cyhEdXBsZXgsIFJlYWRhYmxlKTtcblxue1xuICAvLyBhdm9pZCBzY29wZSBjcmVlcCwgdGhlIGtleXMgYXJyYXkgY2FuIHRoZW4gYmUgY29sbGVjdGVkXG4gIHZhciBrZXlzID0gb2JqZWN0S2V5cyhXcml0YWJsZS5wcm90b3R5cGUpO1xuICBmb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgICB2YXIgbWV0aG9kID0ga2V5c1t2XTtcbiAgICBpZiAoIUR1cGxleC5wcm90b3R5cGVbbWV0aG9kXSkgRHVwbGV4LnByb3RvdHlwZVttZXRob2RdID0gV3JpdGFibGUucHJvdG90eXBlW21ldGhvZF07XG4gIH1cbn1cblxuZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgRHVwbGV4KG9wdGlvbnMpO1xuXG4gIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIFdyaXRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZWFkYWJsZSA9PT0gZmFsc2UpIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLndyaXRhYmxlID09PSBmYWxzZSkgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuXG4gIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpIHRoaXMuYWxsb3dIYWxmT3BlbiA9IGZhbHNlO1xuXG4gIHRoaXMub25jZSgnZW5kJywgb25lbmQpO1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4LnByb3RvdHlwZSwgJ3dyaXRhYmxlSGlnaFdhdGVyTWFyaycsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgfVxufSk7XG5cbi8vIHRoZSBuby1oYWxmLW9wZW4gZW5mb3JjZXJcbmZ1bmN0aW9uIG9uZW5kKCkge1xuICAvLyBpZiB3ZSBhbGxvdyBoYWxmLW9wZW4gc3RhdGUsIG9yIGlmIHRoZSB3cml0YWJsZSBzaWRlIGVuZGVkLFxuICAvLyB0aGVuIHdlJ3JlIG9rLlxuICBpZiAodGhpcy5hbGxvd0hhbGZPcGVuIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpIHJldHVybjtcblxuICAvLyBubyBtb3JlIGRhdGEgY2FuIGJlIHdyaXR0ZW4uXG4gIC8vIEJ1dCBhbGxvdyBtb3JlIHdyaXRlcyB0byBoYXBwZW4gaW4gdGhpcyB0aWNrLlxuICBwbmEubmV4dFRpY2sob25FbmROVCwgdGhpcyk7XG59XG5cbmZ1bmN0aW9uIG9uRW5kTlQoc2VsZikge1xuICBzZWxmLmVuZCgpO1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4LnByb3RvdHlwZSwgJ2Rlc3Ryb3llZCcsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAvLyBtYW5hZ2luZyBkZXN0cm95ZWRcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gIH1cbn0pO1xuXG5EdXBsZXgucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdGhpcy5wdXNoKG51bGwpO1xuICB0aGlzLmVuZCgpO1xuXG4gIHBuYS5uZXh0VGljayhjYiwgZXJyKTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2836\n")},8407:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval('// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// "Software"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a passthrough stream.\n// basically just the most minimal sort of Transform stream.\n// Every written chunk gets output as-is.\n\n\n\nmodule.exports = PassThrough;\n\nvar Transform = __webpack_require__(7628);\n\n/**/\nvar util = Object.create(__webpack_require__(6497));\nutil.inherits = __webpack_require__(4378);\n/**/\n\nutil.inherits(PassThrough, Transform);\n\nfunction PassThrough(options) {\n if (!(this instanceof PassThrough)) return new PassThrough(options);\n\n Transform.call(this, options);\n}\n\nPassThrough.prototype._transform = function (chunk, encoding, cb) {\n cb(null, chunk);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQwNy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYjs7QUFFQSxnQkFBZ0IsbUJBQU8sQ0FBQyxJQUFxQjs7QUFFN0M7QUFDQSx5QkFBeUIsbUJBQU8sQ0FBQyxJQUFjO0FBQy9DLGdCQUFnQixtQkFBTyxDQUFDLElBQVU7QUFDbEM7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2xhenlzdHJlYW0vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qcz8xYjQwIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIHBhc3N0aHJvdWdoIHN0cmVhbS5cbi8vIGJhc2ljYWxseSBqdXN0IHRoZSBtb3N0IG1pbmltYWwgc29ydCBvZiBUcmFuc2Zvcm0gc3RyZWFtLlxuLy8gRXZlcnkgd3JpdHRlbiBjaHVuayBnZXRzIG91dHB1dCBhcy1pcy5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBhc3NUaHJvdWdoO1xuXG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZSgnLi9fc3RyZWFtX3RyYW5zZm9ybScpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSBPYmplY3QuY3JlYXRlKHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnV0aWwuaW5oZXJpdHMoUGFzc1Rocm91Z2gsIFRyYW5zZm9ybSk7XG5cbmZ1bmN0aW9uIFBhc3NUaHJvdWdoKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhc3NUaHJvdWdoKSkgcmV0dXJuIG5ldyBQYXNzVGhyb3VnaChvcHRpb25zKTtcblxuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRpb25zKTtcbn1cblxuUGFzc1Rocm91Z2gucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihudWxsLCBjaHVuayk7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8407\n')},1143:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\n/**/\n\nvar pna = __webpack_require__(8212);\n/**/\n\nmodule.exports = Readable;\n\n/**/\nvar isArray = __webpack_require__(9774);\n/**/\n\n/**/\nvar Duplex;\n/**/\n\nReadable.ReadableState = ReadableState;\n\n/**/\nvar EE = (__webpack_require__(2361).EventEmitter);\n\nvar EElistenerCount = function (emitter, type) {\n return emitter.listeners(type).length;\n};\n/**/\n\n/**/\nvar Stream = __webpack_require__(2300);\n/**/\n\n/**/\n\nvar Buffer = (__webpack_require__(6509).Buffer);\nvar OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};\nfunction _uint8ArrayToBuffer(chunk) {\n return Buffer.from(chunk);\n}\nfunction _isUint8Array(obj) {\n return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n\n/**/\n\n/**/\nvar util = Object.create(__webpack_require__(6497));\nutil.inherits = __webpack_require__(4378);\n/**/\n\n/**/\nvar debugUtil = __webpack_require__(3837);\nvar debug = void 0;\nif (debugUtil && debugUtil.debuglog) {\n debug = debugUtil.debuglog('stream');\n} else {\n debug = function () {};\n}\n/**/\n\nvar BufferList = __webpack_require__(8979);\nvar destroyImpl = __webpack_require__(4201);\nvar StringDecoder;\n\nutil.inherits(Readable, Stream);\n\nvar kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];\n\nfunction prependListener(emitter, event, fn) {\n // Sadly this is not cacheable as some libraries bundle their own\n // event emitter implementation with them.\n if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);\n\n // This is a hack to make sure that our error handler is attached before any\n // userland ones. NEVER DO THIS. This is here only because this code needs\n // to continue to work with older versions of Node.js that do not include\n // the prependListener() method. The goal is to eventually remove this hack.\n if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];\n}\n\nfunction ReadableState(options, stream) {\n Duplex = Duplex || __webpack_require__(2836);\n\n options = options || {};\n\n // Duplex streams are both readable and writable, but share\n // the same options object.\n // However, some cases require setting options to different\n // values for the readable and the writable sides of the duplex stream.\n // These options can be provided separately as readableXXX and writableXXX.\n var isDuplex = stream instanceof Duplex;\n\n // object stream flag. Used to make read(n) ignore n and to\n // make all the buffer merging and length checks go away\n this.objectMode = !!options.objectMode;\n\n if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;\n\n // the point at which it stops calling _read() to fill the buffer\n // Note: 0 is a valid value, means \"don't call _read preemptively ever\"\n var hwm = options.highWaterMark;\n var readableHwm = options.readableHighWaterMark;\n var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n\n if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;\n\n // cast to ints.\n this.highWaterMark = Math.floor(this.highWaterMark);\n\n // A linked list is used to store data chunks instead of an array because the\n // linked list can remove elements from the beginning faster than\n // array.shift()\n this.buffer = new BufferList();\n this.length = 0;\n this.pipes = null;\n this.pipesCount = 0;\n this.flowing = null;\n this.ended = false;\n this.endEmitted = false;\n this.reading = false;\n\n // a flag to be able to tell if the event 'readable'/'data' is emitted\n // immediately, or on a later tick. We set this to true at first, because\n // any actions that shouldn't happen until \"later\" should generally also\n // not happen before the first read call.\n this.sync = true;\n\n // whenever we return null, then we set a flag to say\n // that we're awaiting a 'readable' event emission.\n this.needReadable = false;\n this.emittedReadable = false;\n this.readableListening = false;\n this.resumeScheduled = false;\n\n // has it been destroyed\n this.destroyed = false;\n\n // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n // the number of writers that are awaiting a drain event in .pipe()s\n this.awaitDrain = 0;\n\n // if true, a maybeReadMore has been scheduled\n this.readingMore = false;\n\n this.decoder = null;\n this.encoding = null;\n if (options.encoding) {\n if (!StringDecoder) StringDecoder = (__webpack_require__(1067)/* .StringDecoder */ .s);\n this.decoder = new StringDecoder(options.encoding);\n this.encoding = options.encoding;\n }\n}\n\nfunction Readable(options) {\n Duplex = Duplex || __webpack_require__(2836);\n\n if (!(this instanceof Readable)) return new Readable(options);\n\n this._readableState = new ReadableState(options, this);\n\n // legacy\n this.readable = true;\n\n if (options) {\n if (typeof options.read === 'function') this._read = options.read;\n\n if (typeof options.destroy === 'function') this._destroy = options.destroy;\n }\n\n Stream.call(this);\n}\n\nObject.defineProperty(Readable.prototype, 'destroyed', {\n get: function () {\n if (this._readableState === undefined) {\n return false;\n }\n return this._readableState.destroyed;\n },\n set: function (value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (!this._readableState) {\n return;\n }\n\n // backward compatibility, the user is explicitly\n // managing destroyed\n this._readableState.destroyed = value;\n }\n});\n\nReadable.prototype.destroy = destroyImpl.destroy;\nReadable.prototype._undestroy = destroyImpl.undestroy;\nReadable.prototype._destroy = function (err, cb) {\n this.push(null);\n cb(err);\n};\n\n// Manually shove something into the read() buffer.\n// This returns true if the highWaterMark has not been hit yet,\n// similar to how Writable.write() returns true if you should\n// write() some more.\nReadable.prototype.push = function (chunk, encoding) {\n var state = this._readableState;\n var skipChunkCheck;\n\n if (!state.objectMode) {\n if (typeof chunk === 'string') {\n encoding = encoding || state.defaultEncoding;\n if (encoding !== state.encoding) {\n chunk = Buffer.from(chunk, encoding);\n encoding = '';\n }\n skipChunkCheck = true;\n }\n } else {\n skipChunkCheck = true;\n }\n\n return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);\n};\n\n// Unshift should *always* be something directly out of read()\nReadable.prototype.unshift = function (chunk) {\n return readableAddChunk(this, chunk, null, true, false);\n};\n\nfunction readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {\n var state = stream._readableState;\n if (chunk === null) {\n state.reading = false;\n onEofChunk(stream, state);\n } else {\n var er;\n if (!skipChunkCheck) er = chunkInvalid(state, chunk);\n if (er) {\n stream.emit('error', er);\n } else if (state.objectMode || chunk && chunk.length > 0) {\n if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {\n chunk = _uint8ArrayToBuffer(chunk);\n }\n\n if (addToFront) {\n if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);\n } else if (state.ended) {\n stream.emit('error', new Error('stream.push() after EOF'));\n } else {\n state.reading = false;\n if (state.decoder && !encoding) {\n chunk = state.decoder.write(chunk);\n if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);\n } else {\n addChunk(stream, state, chunk, false);\n }\n }\n } else if (!addToFront) {\n state.reading = false;\n }\n }\n\n return needMoreData(state);\n}\n\nfunction addChunk(stream, state, chunk, addToFront) {\n if (state.flowing && state.length === 0 && !state.sync) {\n stream.emit('data', chunk);\n stream.read(0);\n } else {\n // update the buffer info.\n state.length += state.objectMode ? 1 : chunk.length;\n if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);\n\n if (state.needReadable) emitReadable(stream);\n }\n maybeReadMore(stream, state);\n}\n\nfunction chunkInvalid(state, chunk) {\n var er;\n if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n er = new TypeError('Invalid non-string/buffer chunk');\n }\n return er;\n}\n\n// if it's past the high water mark, we can push in some more.\n// Also, if we have no data yet, we can stand some\n// more bytes. This is to work around cases where hwm=0,\n// such as the repl. Also, if the push() triggered a\n// readable event, and the user called read(largeNumber) such that\n// needReadable was set, then we ought to push more, so that another\n// 'readable' event will be triggered.\nfunction needMoreData(state) {\n return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);\n}\n\nReadable.prototype.isPaused = function () {\n return this._readableState.flowing === false;\n};\n\n// backwards compatibility.\nReadable.prototype.setEncoding = function (enc) {\n if (!StringDecoder) StringDecoder = (__webpack_require__(1067)/* .StringDecoder */ .s);\n this._readableState.decoder = new StringDecoder(enc);\n this._readableState.encoding = enc;\n return this;\n};\n\n// Don't raise the hwm > 8MB\nvar MAX_HWM = 0x800000;\nfunction computeNewHighWaterMark(n) {\n if (n >= MAX_HWM) {\n n = MAX_HWM;\n } else {\n // Get the next highest power of 2 to prevent increasing hwm excessively in\n // tiny amounts\n n--;\n n |= n >>> 1;\n n |= n >>> 2;\n n |= n >>> 4;\n n |= n >>> 8;\n n |= n >>> 16;\n n++;\n }\n return n;\n}\n\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction howMuchToRead(n, state) {\n if (n <= 0 || state.length === 0 && state.ended) return 0;\n if (state.objectMode) return 1;\n if (n !== n) {\n // Only flow one buffer at a time\n if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;\n }\n // If we're asking for more than the current hwm, then raise the hwm.\n if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);\n if (n <= state.length) return n;\n // Don't have enough\n if (!state.ended) {\n state.needReadable = true;\n return 0;\n }\n return state.length;\n}\n\n// you can override either this method, or the async _read(n) below.\nReadable.prototype.read = function (n) {\n debug('read', n);\n n = parseInt(n, 10);\n var state = this._readableState;\n var nOrig = n;\n\n if (n !== 0) state.emittedReadable = false;\n\n // if we're doing read(0) to trigger a readable event, but we\n // already have a bunch of data in the buffer, then just trigger\n // the 'readable' event and move on.\n if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {\n debug('read: emitReadable', state.length, state.ended);\n if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);\n return null;\n }\n\n n = howMuchToRead(n, state);\n\n // if we've ended, and we're now clear, then finish it up.\n if (n === 0 && state.ended) {\n if (state.length === 0) endReadable(this);\n return null;\n }\n\n // All the actual chunk generation logic needs to be\n // *below* the call to _read. The reason is that in certain\n // synthetic stream cases, such as passthrough streams, _read\n // may be a completely synchronous operation which may change\n // the state of the read buffer, providing enough data when\n // before there was *not* enough.\n //\n // So, the steps are:\n // 1. Figure out what the state of things will be after we do\n // a read from the buffer.\n //\n // 2. If that resulting state will trigger a _read, then call _read.\n // Note that this may be asynchronous, or synchronous. Yes, it is\n // deeply ugly to write APIs this way, but that still doesn't mean\n // that the Readable class should behave improperly, as streams are\n // designed to be sync/async agnostic.\n // Take note if the _read call is sync or async (ie, if the read call\n // has returned yet), so that we know whether or not it's safe to emit\n // 'readable' etc.\n //\n // 3. Actually pull the requested chunks out of the buffer and return.\n\n // if we need a readable event, then we need to do some reading.\n var doRead = state.needReadable;\n debug('need readable', doRead);\n\n // if we currently have less than the highWaterMark, then also read some\n if (state.length === 0 || state.length - n < state.highWaterMark) {\n doRead = true;\n debug('length less than watermark', doRead);\n }\n\n // however, if we've ended, then there's no point, and if we're already\n // reading, then it's unnecessary.\n if (state.ended || state.reading) {\n doRead = false;\n debug('reading or ended', doRead);\n } else if (doRead) {\n debug('do read');\n state.reading = true;\n state.sync = true;\n // if the length is currently zero, then we *need* a readable event.\n if (state.length === 0) state.needReadable = true;\n // call internal read method\n this._read(state.highWaterMark);\n state.sync = false;\n // If _read pushed data synchronously, then `reading` will be false,\n // and we need to re-evaluate how much data we can return to the user.\n if (!state.reading) n = howMuchToRead(nOrig, state);\n }\n\n var ret;\n if (n > 0) ret = fromList(n, state);else ret = null;\n\n if (ret === null) {\n state.needReadable = true;\n n = 0;\n } else {\n state.length -= n;\n }\n\n if (state.length === 0) {\n // If we have nothing in the buffer, then we want to know\n // as soon as we *do* get something into the buffer.\n if (!state.ended) state.needReadable = true;\n\n // If we tried to read() past the EOF, then emit end on the next tick.\n if (nOrig !== n && state.ended) endReadable(this);\n }\n\n if (ret !== null) this.emit('data', ret);\n\n return ret;\n};\n\nfunction onEofChunk(stream, state) {\n if (state.ended) return;\n if (state.decoder) {\n var chunk = state.decoder.end();\n if (chunk && chunk.length) {\n state.buffer.push(chunk);\n state.length += state.objectMode ? 1 : chunk.length;\n }\n }\n state.ended = true;\n\n // emit 'readable' now to make sure it gets picked up.\n emitReadable(stream);\n}\n\n// Don't emit readable right away in sync mode, because this can trigger\n// another read() call => stack overflow. This way, it might trigger\n// a nextTick recursion warning, but that's not so bad.\nfunction emitReadable(stream) {\n var state = stream._readableState;\n state.needReadable = false;\n if (!state.emittedReadable) {\n debug('emitReadable', state.flowing);\n state.emittedReadable = true;\n if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream);\n }\n}\n\nfunction emitReadable_(stream) {\n debug('emit readable');\n stream.emit('readable');\n flow(stream);\n}\n\n// at this point, the user has presumably seen the 'readable' event,\n// and called read() to consume some data. that may have triggered\n// in turn another _read(n) call, in which case reading = true if\n// it's in progress.\n// However, if we're not ended, or reading, and the length < hwm,\n// then go ahead and try to read some more preemptively.\nfunction maybeReadMore(stream, state) {\n if (!state.readingMore) {\n state.readingMore = true;\n pna.nextTick(maybeReadMore_, stream, state);\n }\n}\n\nfunction maybeReadMore_(stream, state) {\n var len = state.length;\n while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {\n debug('maybeReadMore read 0');\n stream.read(0);\n if (len === state.length)\n // didn't get any data, stop spinning.\n break;else len = state.length;\n }\n state.readingMore = false;\n}\n\n// abstract method. to be overridden in specific implementation classes.\n// call cb(er, data) where data is <= n in length.\n// for virtual (non-string, non-buffer) streams, \"length\" is somewhat\n// arbitrary, and perhaps not very meaningful.\nReadable.prototype._read = function (n) {\n this.emit('error', new Error('_read() is not implemented'));\n};\n\nReadable.prototype.pipe = function (dest, pipeOpts) {\n var src = this;\n var state = this._readableState;\n\n switch (state.pipesCount) {\n case 0:\n state.pipes = dest;\n break;\n case 1:\n state.pipes = [state.pipes, dest];\n break;\n default:\n state.pipes.push(dest);\n break;\n }\n state.pipesCount += 1;\n debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);\n\n var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;\n\n var endFn = doEnd ? onend : unpipe;\n if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn);\n\n dest.on('unpipe', onunpipe);\n function onunpipe(readable, unpipeInfo) {\n debug('onunpipe');\n if (readable === src) {\n if (unpipeInfo && unpipeInfo.hasUnpiped === false) {\n unpipeInfo.hasUnpiped = true;\n cleanup();\n }\n }\n }\n\n function onend() {\n debug('onend');\n dest.end();\n }\n\n // when the dest drains, it reduces the awaitDrain counter\n // on the source. This would be more elegant with a .once()\n // handler in flow(), but adding and removing repeatedly is\n // too slow.\n var ondrain = pipeOnDrain(src);\n dest.on('drain', ondrain);\n\n var cleanedUp = false;\n function cleanup() {\n debug('cleanup');\n // cleanup event handlers once the pipe is broken\n dest.removeListener('close', onclose);\n dest.removeListener('finish', onfinish);\n dest.removeListener('drain', ondrain);\n dest.removeListener('error', onerror);\n dest.removeListener('unpipe', onunpipe);\n src.removeListener('end', onend);\n src.removeListener('end', unpipe);\n src.removeListener('data', ondata);\n\n cleanedUp = true;\n\n // if the reader is waiting for a drain event from this\n // specific writer, then it would cause it to never start\n // flowing again.\n // So, if this is awaiting a drain, then we just call it now.\n // If we don't know, then assume that we are waiting for one.\n if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();\n }\n\n // If the user pushes more data while we're writing to dest then we'll end up\n // in ondata again. However, we only want to increase awaitDrain once because\n // dest will only emit one 'drain' event for the multiple writes.\n // => Introduce a guard on increasing awaitDrain.\n var increasedAwaitDrain = false;\n src.on('data', ondata);\n function ondata(chunk) {\n debug('ondata');\n increasedAwaitDrain = false;\n var ret = dest.write(chunk);\n if (false === ret && !increasedAwaitDrain) {\n // If the user unpiped during `dest.write()`, it is possible\n // to get stuck in a permanently paused state if that write\n // also returned false.\n // => Check whether `dest` is still a piping destination.\n if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {\n debug('false write response, pause', state.awaitDrain);\n state.awaitDrain++;\n increasedAwaitDrain = true;\n }\n src.pause();\n }\n }\n\n // if the dest has an error, then stop piping into it.\n // however, don't suppress the throwing behavior for this.\n function onerror(er) {\n debug('onerror', er);\n unpipe();\n dest.removeListener('error', onerror);\n if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);\n }\n\n // Make sure our error handler is attached before userland ones.\n prependListener(dest, 'error', onerror);\n\n // Both close and finish should trigger unpipe, but only once.\n function onclose() {\n dest.removeListener('finish', onfinish);\n unpipe();\n }\n dest.once('close', onclose);\n function onfinish() {\n debug('onfinish');\n dest.removeListener('close', onclose);\n unpipe();\n }\n dest.once('finish', onfinish);\n\n function unpipe() {\n debug('unpipe');\n src.unpipe(dest);\n }\n\n // tell the dest that it's being piped to\n dest.emit('pipe', src);\n\n // start the flow if it hasn't been started already.\n if (!state.flowing) {\n debug('pipe resume');\n src.resume();\n }\n\n return dest;\n};\n\nfunction pipeOnDrain(src) {\n return function () {\n var state = src._readableState;\n debug('pipeOnDrain', state.awaitDrain);\n if (state.awaitDrain) state.awaitDrain--;\n if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {\n state.flowing = true;\n flow(src);\n }\n };\n}\n\nReadable.prototype.unpipe = function (dest) {\n var state = this._readableState;\n var unpipeInfo = { hasUnpiped: false };\n\n // if we're not piping anywhere, then do nothing.\n if (state.pipesCount === 0) return this;\n\n // just one destination. most common case.\n if (state.pipesCount === 1) {\n // passed in one, but it's not the right one.\n if (dest && dest !== state.pipes) return this;\n\n if (!dest) dest = state.pipes;\n\n // got a match.\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n if (dest) dest.emit('unpipe', this, unpipeInfo);\n return this;\n }\n\n // slow case. multiple pipe destinations.\n\n if (!dest) {\n // remove all.\n var dests = state.pipes;\n var len = state.pipesCount;\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n\n for (var i = 0; i < len; i++) {\n dests[i].emit('unpipe', this, { hasUnpiped: false });\n }return this;\n }\n\n // try to find the right one.\n var index = indexOf(state.pipes, dest);\n if (index === -1) return this;\n\n state.pipes.splice(index, 1);\n state.pipesCount -= 1;\n if (state.pipesCount === 1) state.pipes = state.pipes[0];\n\n dest.emit('unpipe', this, unpipeInfo);\n\n return this;\n};\n\n// set up data events if they are asked for\n// Ensure readable listeners eventually get something\nReadable.prototype.on = function (ev, fn) {\n var res = Stream.prototype.on.call(this, ev, fn);\n\n if (ev === 'data') {\n // Start flowing on next tick if stream isn't explicitly paused\n if (this._readableState.flowing !== false) this.resume();\n } else if (ev === 'readable') {\n var state = this._readableState;\n if (!state.endEmitted && !state.readableListening) {\n state.readableListening = state.needReadable = true;\n state.emittedReadable = false;\n if (!state.reading) {\n pna.nextTick(nReadingNextTick, this);\n } else if (state.length) {\n emitReadable(this);\n }\n }\n }\n\n return res;\n};\nReadable.prototype.addListener = Readable.prototype.on;\n\nfunction nReadingNextTick(self) {\n debug('readable nexttick read 0');\n self.read(0);\n}\n\n// pause() and resume() are remnants of the legacy readable stream API\n// If the user uses them, then switch into old mode.\nReadable.prototype.resume = function () {\n var state = this._readableState;\n if (!state.flowing) {\n debug('resume');\n state.flowing = true;\n resume(this, state);\n }\n return this;\n};\n\nfunction resume(stream, state) {\n if (!state.resumeScheduled) {\n state.resumeScheduled = true;\n pna.nextTick(resume_, stream, state);\n }\n}\n\nfunction resume_(stream, state) {\n if (!state.reading) {\n debug('resume read 0');\n stream.read(0);\n }\n\n state.resumeScheduled = false;\n state.awaitDrain = 0;\n stream.emit('resume');\n flow(stream);\n if (state.flowing && !state.reading) stream.read(0);\n}\n\nReadable.prototype.pause = function () {\n debug('call pause flowing=%j', this._readableState.flowing);\n if (false !== this._readableState.flowing) {\n debug('pause');\n this._readableState.flowing = false;\n this.emit('pause');\n }\n return this;\n};\n\nfunction flow(stream) {\n var state = stream._readableState;\n debug('flow', state.flowing);\n while (state.flowing && stream.read() !== null) {}\n}\n\n// wrap an old-style stream as the async data source.\n// This is *not* part of the readable stream interface.\n// It is an ugly unfortunate mess of history.\nReadable.prototype.wrap = function (stream) {\n var _this = this;\n\n var state = this._readableState;\n var paused = false;\n\n stream.on('end', function () {\n debug('wrapped end');\n if (state.decoder && !state.ended) {\n var chunk = state.decoder.end();\n if (chunk && chunk.length) _this.push(chunk);\n }\n\n _this.push(null);\n });\n\n stream.on('data', function (chunk) {\n debug('wrapped data');\n if (state.decoder) chunk = state.decoder.write(chunk);\n\n // don't skip over falsy values in objectMode\n if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;\n\n var ret = _this.push(chunk);\n if (!ret) {\n paused = true;\n stream.pause();\n }\n });\n\n // proxy all the other methods.\n // important when wrapping filters and duplexes.\n for (var i in stream) {\n if (this[i] === undefined && typeof stream[i] === 'function') {\n this[i] = function (method) {\n return function () {\n return stream[method].apply(stream, arguments);\n };\n }(i);\n }\n }\n\n // proxy certain important events.\n for (var n = 0; n < kProxyEvents.length; n++) {\n stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));\n }\n\n // when we try to consume some more bytes, simply unpause the\n // underlying stream.\n this._read = function (n) {\n debug('wrapped _read', n);\n if (paused) {\n paused = false;\n stream.resume();\n }\n };\n\n return this;\n};\n\nObject.defineProperty(Readable.prototype, 'readableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function () {\n return this._readableState.highWaterMark;\n }\n});\n\n// exposed for testing purposes only.\nReadable._fromList = fromList;\n\n// Pluck off n bytes from an array of buffers.\n// Length is the combined lengths of all the buffers in the list.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromList(n, state) {\n // nothing buffered\n if (state.length === 0) return null;\n\n var ret;\n if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {\n // read it all, truncate the list\n if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);\n state.buffer.clear();\n } else {\n // read part of list\n ret = fromListPartial(n, state.buffer, state.decoder);\n }\n\n return ret;\n}\n\n// Extracts only enough buffered data to satisfy the amount requested.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromListPartial(n, list, hasStrings) {\n var ret;\n if (n < list.head.data.length) {\n // slice is the same for buffers and strings\n ret = list.head.data.slice(0, n);\n list.head.data = list.head.data.slice(n);\n } else if (n === list.head.data.length) {\n // first chunk is a perfect match\n ret = list.shift();\n } else {\n // result spans more than one buffer\n ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);\n }\n return ret;\n}\n\n// Copies a specified amount of characters from the list of buffered data\n// chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBufferString(n, list) {\n var p = list.head;\n var c = 1;\n var ret = p.data;\n n -= ret.length;\n while (p = p.next) {\n var str = p.data;\n var nb = n > str.length ? str.length : n;\n if (nb === str.length) ret += str;else ret += str.slice(0, n);\n n -= nb;\n if (n === 0) {\n if (nb === str.length) {\n ++c;\n if (p.next) list.head = p.next;else list.head = list.tail = null;\n } else {\n list.head = p;\n p.data = str.slice(nb);\n }\n break;\n }\n ++c;\n }\n list.length -= c;\n return ret;\n}\n\n// Copies a specified amount of bytes from the list of buffered data chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBuffer(n, list) {\n var ret = Buffer.allocUnsafe(n);\n var p = list.head;\n var c = 1;\n p.data.copy(ret);\n n -= p.data.length;\n while (p = p.next) {\n var buf = p.data;\n var nb = n > buf.length ? buf.length : n;\n buf.copy(ret, ret.length - n, 0, nb);\n n -= nb;\n if (n === 0) {\n if (nb === buf.length) {\n ++c;\n if (p.next) list.head = p.next;else list.head = list.tail = null;\n } else {\n list.head = p;\n p.data = buf.slice(nb);\n }\n break;\n }\n ++c;\n }\n list.length -= c;\n return ret;\n}\n\nfunction endReadable(stream) {\n var state = stream._readableState;\n\n // If we get here before consuming all the bytes, then that is a\n // bug in node. Should never happen.\n if (state.length > 0) throw new Error('\"endReadable()\" called on non-empty stream');\n\n if (!state.endEmitted) {\n state.ended = true;\n pna.nextTick(endReadableNT, state, stream);\n }\n}\n\nfunction endReadableNT(state, stream) {\n // Check that we didn't get one last unshift.\n if (!state.endEmitted && state.length === 0) {\n state.endEmitted = true;\n stream.readable = false;\n stream.emit('end');\n }\n}\n\nfunction indexOf(xs, x) {\n for (var i = 0, l = xs.length; i < l; i++) {\n if (xs[i] === x) return i;\n }\n return -1;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQ0FBc0Msa0RBQXdDO0FBQzlFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEVBQTRFO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSw0Q0FBNEM7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQjs7QUFFckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsU0FBUztBQUM3QixzQ0FBc0MsbUJBQW1CO0FBQ3pELEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEVBQTRFOztBQUU1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IseUJBQXlCO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBLG1EQUFtRCxpRUFBaUU7QUFDcEg7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQyxPQUFPO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvbGF6eXN0cmVhbS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzP2Q5ZTAiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHBuYSA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFkYWJsZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRHVwbGV4O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblJlYWRhYmxlLlJlYWRhYmxlU3RhdGUgPSBSZWFkYWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuXG52YXIgRUVsaXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aDtcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIE91clVpbnQ4QXJyYXkgPSAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fSkuVWludDhBcnJheSB8fCBmdW5jdGlvbiAoKSB7fTtcbmZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rKTtcbn1cbmZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5O1xufVxuXG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gT2JqZWN0LmNyZWF0ZShyZXF1aXJlKCdjb3JlLXV0aWwtaXMnKSk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGRlYnVnVXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBkZWJ1ZyA9IHZvaWQgMDtcbmlmIChkZWJ1Z1V0aWwgJiYgZGVidWdVdGlsLmRlYnVnbG9nKSB7XG4gIGRlYnVnID0gZGVidWdVdGlsLmRlYnVnbG9nKCdzdHJlYW0nKTtcbn0gZWxzZSB7XG4gIGRlYnVnID0gZnVuY3Rpb24gKCkge307XG59XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlckxpc3QgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvQnVmZmVyTGlzdCcpO1xudmFyIGRlc3Ryb3lJbXBsID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3knKTtcbnZhciBTdHJpbmdEZWNvZGVyO1xuXG51dGlsLmluaGVyaXRzKFJlYWRhYmxlLCBTdHJlYW0pO1xuXG52YXIga1Byb3h5RXZlbnRzID0gWydlcnJvcicsICdjbG9zZScsICdkZXN0cm95JywgJ3BhdXNlJywgJ3Jlc3VtZSddO1xuXG5mdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuKSB7XG4gIC8vIFNhZGx5IHRoaXMgaXMgbm90IGNhY2hlYWJsZSBhcyBzb21lIGxpYnJhcmllcyBidW5kbGUgdGhlaXIgb3duXG4gIC8vIGV2ZW50IGVtaXR0ZXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGVtLlxuICBpZiAodHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIoZXZlbnQsIGZuKTtcblxuICAvLyBUaGlzIGlzIGEgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgYW55XG4gIC8vIHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLiBUaGlzIGlzIGhlcmUgb25seSBiZWNhdXNlIHRoaXMgY29kZSBuZWVkc1xuICAvLyB0byBjb250aW51ZSB0byB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgTm9kZS5qcyB0aGF0IGRvIG5vdCBpbmNsdWRlXG4gIC8vIHRoZSBwcmVwZW5kTGlzdGVuZXIoKSBtZXRob2QuIFRoZSBnb2FsIGlzIHRvIGV2ZW50dWFsbHkgcmVtb3ZlIHRoaXMgaGFjay5cbiAgaWYgKCFlbWl0dGVyLl9ldmVudHMgfHwgIWVtaXR0ZXIuX2V2ZW50c1tldmVudF0pIGVtaXR0ZXIub24oZXZlbnQsIGZuKTtlbHNlIGlmIChpc0FycmF5KGVtaXR0ZXIuX2V2ZW50c1tldmVudF0pKSBlbWl0dGVyLl9ldmVudHNbZXZlbnRdLnVuc2hpZnQoZm4pO2Vsc2UgZW1pdHRlci5fZXZlbnRzW2V2ZW50XSA9IFtmbiwgZW1pdHRlci5fZXZlbnRzW2V2ZW50XV07XG59XG5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gRHVwbGV4IHN0cmVhbXMgYXJlIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLCBidXQgc2hhcmVcbiAgLy8gdGhlIHNhbWUgb3B0aW9ucyBvYmplY3QuXG4gIC8vIEhvd2V2ZXIsIHNvbWUgY2FzZXMgcmVxdWlyZSBzZXR0aW5nIG9wdGlvbnMgdG8gZGlmZmVyZW50XG4gIC8vIHZhbHVlcyBmb3IgdGhlIHJlYWRhYmxlIGFuZCB0aGUgd3JpdGFibGUgc2lkZXMgb2YgdGhlIGR1cGxleCBzdHJlYW0uXG4gIC8vIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkgYXMgcmVhZGFibGVYWFggYW5kIHdyaXRhYmxlWFhYLlxuICB2YXIgaXNEdXBsZXggPSBzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXg7XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnLiBVc2VkIHRvIG1ha2UgcmVhZChuKSBpZ25vcmUgbiBhbmQgdG9cbiAgLy8gbWFrZSBhbGwgdGhlIGJ1ZmZlciBtZXJnaW5nIGFuZCBsZW5ndGggY2hlY2tzIGdvIGF3YXlcbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKGlzRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciByZWFkYWJsZUh3bSA9IG9wdGlvbnMucmVhZGFibGVIaWdoV2F0ZXJNYXJrO1xuICB2YXIgZGVmYXVsdEh3bSA9IHRoaXMub2JqZWN0TW9kZSA/IDE2IDogMTYgKiAxMDI0O1xuXG4gIGlmIChod20gfHwgaHdtID09PSAwKSB0aGlzLmhpZ2hXYXRlck1hcmsgPSBod207ZWxzZSBpZiAoaXNEdXBsZXggJiYgKHJlYWRhYmxlSHdtIHx8IHJlYWRhYmxlSHdtID09PSAwKSkgdGhpcy5oaWdoV2F0ZXJNYXJrID0gcmVhZGFibGVId207ZWxzZSB0aGlzLmhpZ2hXYXRlck1hcmsgPSBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gTWF0aC5mbG9vcih0aGlzLmhpZ2hXYXRlck1hcmspO1xuXG4gIC8vIEEgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBzdG9yZSBkYXRhIGNodW5rcyBpbnN0ZWFkIG9mIGFuIGFycmF5IGJlY2F1c2UgdGhlXG4gIC8vIGxpbmtlZCBsaXN0IGNhbiByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgYmVnaW5uaW5nIGZhc3RlciB0aGFuXG4gIC8vIGFycmF5LnNoaWZ0KClcbiAgdGhpcy5idWZmZXIgPSBuZXcgQnVmZmVyTGlzdCgpO1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucGlwZXMgPSBudWxsO1xuICB0aGlzLnBpcGVzQ291bnQgPSAwO1xuICB0aGlzLmZsb3dpbmcgPSBudWxsO1xuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYWRpbmcgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBldmVudCAncmVhZGFibGUnLydkYXRhJyBpcyBlbWl0dGVkXG4gIC8vIGltbWVkaWF0ZWx5LCBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlXG4gIC8vIGFueSBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCByZWFkIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gd2hlbmV2ZXIgd2UgcmV0dXJuIG51bGwsIHRoZW4gd2Ugc2V0IGEgZmxhZyB0byBzYXlcbiAgLy8gdGhhdCB3ZSdyZSBhd2FpdGluZyBhICdyZWFkYWJsZScgZXZlbnQgZW1pc3Npb24uXG4gIHRoaXMubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZTtcbiAgdGhpcy5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAvLyBoYXMgaXQgYmVlbiBkZXN0cm95ZWRcbiAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JztcblxuICAvLyB0aGUgbnVtYmVyIG9mIHdyaXRlcnMgdGhhdCBhcmUgYXdhaXRpbmcgYSBkcmFpbiBldmVudCBpbiAucGlwZSgpc1xuICB0aGlzLmF3YWl0RHJhaW4gPSAwO1xuXG4gIC8vIGlmIHRydWUsIGEgbWF5YmVSZWFkTW9yZSBoYXMgYmVlbiBzY2hlZHVsZWRcbiAgdGhpcy5yZWFkaW5nTW9yZSA9IGZhbHNlO1xuXG4gIHRoaXMuZGVjb2RlciA9IG51bGw7XG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsO1xuICBpZiAob3B0aW9ucy5lbmNvZGluZykge1xuICAgIGlmICghU3RyaW5nRGVjb2RlcikgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyLycpLlN0cmluZ0RlY29kZXI7XG4gICAgdGhpcy5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIob3B0aW9ucy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2Rpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5yZWFkID09PSAnZnVuY3Rpb24nKSB0aGlzLl9yZWFkID0gb3B0aW9ucy5yZWFkO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHRoaXMuX2Rlc3Ryb3kgPSBvcHRpb25zLmRlc3Ryb3k7XG4gIH1cblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgJ2Rlc3Ryb3llZCcsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgLy8gd2UgaWdub3JlIHRoZSB2YWx1ZSBpZiB0aGUgc3RyZWFtXG4gICAgLy8gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldFxuICAgIGlmICghdGhpcy5fcmVhZGFibGVTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAvLyBtYW5hZ2luZyBkZXN0cm95ZWRcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICB9XG59KTtcblxuUmVhZGFibGUucHJvdG90eXBlLmRlc3Ryb3kgPSBkZXN0cm95SW1wbC5kZXN0cm95O1xuUmVhZGFibGUucHJvdG90eXBlLl91bmRlc3Ryb3kgPSBkZXN0cm95SW1wbC51bmRlc3Ryb3k7XG5SZWFkYWJsZS5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICB0aGlzLnB1c2gobnVsbCk7XG4gIGNiKGVycik7XG59O1xuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHNraXBDaHVua0NoZWNrO1xuXG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuY29kaW5nIHx8IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcbiAgICAgIGlmIChlbmNvZGluZyAhPT0gc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgICBlbmNvZGluZyA9ICcnO1xuICAgICAgfVxuICAgICAgc2tpcENodW5rQ2hlY2sgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBza2lwQ2h1bmtDaGVjayA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBjaHVuaywgZW5jb2RpbmcsIGZhbHNlLCBza2lwQ2h1bmtDaGVjayk7XG59O1xuXG4vLyBVbnNoaWZ0IHNob3VsZCAqYWx3YXlzKiBiZSBzb21ldGhpbmcgZGlyZWN0bHkgb3V0IG9mIHJlYWQoKVxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgY2h1bmssIG51bGwsIHRydWUsIGZhbHNlKTtcbn07XG5cbmZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsoc3RyZWFtLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQsIHNraXBDaHVua0NoZWNrKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGVyO1xuICAgIGlmICghc2tpcENodW5rQ2hlY2spIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gICAgaWYgKGVyKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rICYmIGNodW5rLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmICFzdGF0ZS5vYmplY3RNb2RlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihjaHVuaykgIT09IEJ1ZmZlci5wcm90b3R5cGUpIHtcbiAgICAgICAgY2h1bmsgPSBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFkZFRvRnJvbnQpIHtcbiAgICAgICAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnKSk7ZWxzZSBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgdHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZGVkKSB7XG4gICAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFlbmNvZGluZykge1xuICAgICAgICAgIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG4gICAgICAgICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsubGVuZ3RoICE9PSAwKSBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZmFsc2UpO2Vsc2UgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghYWRkVG9Gcm9udCkge1xuICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkTW9yZURhdGEoc3RhdGUpO1xufVxuXG5mdW5jdGlvbiBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgYWRkVG9Gcm9udCkge1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLnN5bmMpIHtcbiAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB1cGRhdGUgdGhlIGJ1ZmZlciBpbmZvLlxuICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICBpZiAoYWRkVG9Gcm9udCkgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspO2Vsc2Ugc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuXG4gICAgaWYgKHN0YXRlLm5lZWRSZWFkYWJsZSkgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG4gIH1cbiAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXI7XG4gIGlmICghX2lzVWludDhBcnJheShjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgcmV0dXJuIGVyO1xufVxuXG4vLyBpZiBpdCdzIHBhc3QgdGhlIGhpZ2ggd2F0ZXIgbWFyaywgd2UgY2FuIHB1c2ggaW4gc29tZSBtb3JlLlxuLy8gQWxzbywgaWYgd2UgaGF2ZSBubyBkYXRhIHlldCwgd2UgY2FuIHN0YW5kIHNvbWVcbi8vIG1vcmUgYnl0ZXMuICBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGNhc2VzIHdoZXJlIGh3bT0wLFxuLy8gc3VjaCBhcyB0aGUgcmVwbC4gIEFsc28sIGlmIHRoZSBwdXNoKCkgdHJpZ2dlcmVkIGFcbi8vIHJlYWRhYmxlIGV2ZW50LCBhbmQgdGhlIHVzZXIgY2FsbGVkIHJlYWQobGFyZ2VOdW1iZXIpIHN1Y2ggdGhhdFxuLy8gbmVlZFJlYWRhYmxlIHdhcyBzZXQsIHRoZW4gd2Ugb3VnaHQgdG8gcHVzaCBtb3JlLCBzbyB0aGF0IGFub3RoZXJcbi8vICdyZWFkYWJsZScgZXZlbnQgd2lsbCBiZSB0cmlnZ2VyZWQuXG5mdW5jdGlvbiBuZWVkTW9yZURhdGEoc3RhdGUpIHtcbiAgcmV0dXJuICFzdGF0ZS5lbmRlZCAmJiAoc3RhdGUubmVlZFJlYWRhYmxlIHx8IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgc3RhdGUubGVuZ3RoID09PSAwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLmlzUGF1c2VkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID09PSBmYWxzZTtcbn07XG5cbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24gKGVuYykge1xuICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihlbmMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gZW5jO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIERvbid0IHJhaXNlIHRoZSBod20gPiA4TUJcbnZhciBNQVhfSFdNID0gMHg4MDAwMDA7XG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyIHRvIHByZXZlbnQgaW5jcmVhc2luZyBod20gZXhjZXNzaXZlbHkgaW5cbiAgICAvLyB0aW55IGFtb3VudHNcbiAgICBuLS07XG4gICAgbiB8PSBuID4+PiAxO1xuICAgIG4gfD0gbiA+Pj4gMjtcbiAgICBuIHw9IG4gPj4+IDQ7XG4gICAgbiB8PSBuID4+PiA4O1xuICAgIG4gfD0gbiA+Pj4gMTY7XG4gICAgbisrO1xuICB9XG4gIHJldHVybiBuO1xufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKG4gPD0gMCB8fCBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIHJldHVybiAwO1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0dXJuIDE7XG4gIGlmIChuICE9PSBuKSB7XG4gICAgLy8gT25seSBmbG93IG9uZSBidWZmZXIgYXQgYSB0aW1lXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg7ZWxzZSByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICB9XG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSBjdXJyZW50IGh3bSwgdGhlbiByYWlzZSB0aGUgaHdtLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcbiAgaWYgKG4gPD0gc3RhdGUubGVuZ3RoKSByZXR1cm4gbjtcbiAgLy8gRG9uJ3QgaGF2ZSBlbm91Z2hcbiAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbn1cblxuLy8geW91IGNhbiBvdmVycmlkZSBlaXRoZXIgdGhpcyBtZXRob2QsIG9yIHRoZSBhc3luYyBfcmVhZChuKSBiZWxvdy5cblJlYWRhYmxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgZGVidWcoJ3JlYWQnLCBuKTtcbiAgbiA9IHBhcnNlSW50KG4sIDEwKTtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIG5PcmlnID0gbjtcblxuICBpZiAobiAhPT0gMCkgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG5cbiAgLy8gaWYgd2UncmUgZG9pbmcgcmVhZCgwKSB0byB0cmlnZ2VyIGEgcmVhZGFibGUgZXZlbnQsIGJ1dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYSBidW5jaCBvZiBkYXRhIGluIHRoZSBidWZmZXIsIHRoZW4ganVzdCB0cmlnZ2VyXG4gIC8vIHRoZSAncmVhZGFibGUnIGV2ZW50IGFuZCBtb3ZlIG9uLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5uZWVkUmVhZGFibGUgJiYgKHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIGRlYnVnKCdyZWFkOiBlbWl0UmVhZGFibGUnLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLmVuZGVkKTtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSBlbmRSZWFkYWJsZSh0aGlzKTtlbHNlIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBbGwgdGhlIGFjdHVhbCBjaHVuayBnZW5lcmF0aW9uIGxvZ2ljIG5lZWRzIHRvIGJlXG4gIC8vICpiZWxvdyogdGhlIGNhbGwgdG8gX3JlYWQuICBUaGUgcmVhc29uIGlzIHRoYXQgaW4gY2VydGFpblxuICAvLyBzeW50aGV0aWMgc3RyZWFtIGNhc2VzLCBzdWNoIGFzIHBhc3N0aHJvdWdoIHN0cmVhbXMsIF9yZWFkXG4gIC8vIG1heSBiZSBhIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2VcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSByZWFkIGJ1ZmZlciwgcHJvdmlkaW5nIGVub3VnaCBkYXRhIHdoZW5cbiAgLy8gYmVmb3JlIHRoZXJlIHdhcyAqbm90KiBlbm91Z2guXG4gIC8vXG4gIC8vIFNvLCB0aGUgc3RlcHMgYXJlOlxuICAvLyAxLiBGaWd1cmUgb3V0IHdoYXQgdGhlIHN0YXRlIG9mIHRoaW5ncyB3aWxsIGJlIGFmdGVyIHdlIGRvXG4gIC8vIGEgcmVhZCBmcm9tIHRoZSBidWZmZXIuXG4gIC8vXG4gIC8vIDIuIElmIHRoYXQgcmVzdWx0aW5nIHN0YXRlIHdpbGwgdHJpZ2dlciBhIF9yZWFkLCB0aGVuIGNhbGwgX3JlYWQuXG4gIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhc3luY2hyb25vdXMsIG9yIHN5bmNocm9ub3VzLiAgWWVzLCBpdCBpc1xuICAvLyBkZWVwbHkgdWdseSB0byB3cml0ZSBBUElzIHRoaXMgd2F5LCBidXQgdGhhdCBzdGlsbCBkb2Vzbid0IG1lYW5cbiAgLy8gdGhhdCB0aGUgUmVhZGFibGUgY2xhc3Mgc2hvdWxkIGJlaGF2ZSBpbXByb3Blcmx5LCBhcyBzdHJlYW1zIGFyZVxuICAvLyBkZXNpZ25lZCB0byBiZSBzeW5jL2FzeW5jIGFnbm9zdGljLlxuICAvLyBUYWtlIG5vdGUgaWYgdGhlIF9yZWFkIGNhbGwgaXMgc3luYyBvciBhc3luYyAoaWUsIGlmIHRoZSByZWFkIGNhbGxcbiAgLy8gaGFzIHJldHVybmVkIHlldCksIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIG9yIG5vdCBpdCdzIHNhZmUgdG8gZW1pdFxuICAvLyAncmVhZGFibGUnIGV0Yy5cbiAgLy9cbiAgLy8gMy4gQWN0dWFsbHkgcHVsbCB0aGUgcmVxdWVzdGVkIGNodW5rcyBvdXQgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuLlxuXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cbiAgdmFyIGRvUmVhZCA9IHN0YXRlLm5lZWRSZWFkYWJsZTtcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZTtcbiAgICBkZWJ1ZygnbGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsnLCBkb1JlYWQpO1xuICB9XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZykge1xuICAgIGRvUmVhZCA9IGZhbHNlO1xuICAgIGRlYnVnKCdyZWFkaW5nIG9yIGVuZGVkJywgZG9SZWFkKTtcbiAgfSBlbHNlIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpO1xuICAgIHN0YXRlLnJlYWRpbmcgPSB0cnVlO1xuICAgIHN0YXRlLnN5bmMgPSB0cnVlO1xuICAgIC8vIGlmIHRoZSBsZW5ndGggaXMgY3VycmVudGx5IHplcm8sIHRoZW4gd2UgKm5lZWQqIGEgcmVhZGFibGUgZXZlbnQuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gICAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuICB9XG5cbiAgdmFyIHJldDtcbiAgaWYgKG4gPiAwKSByZXQgPSBmcm9tTGlzdChuLCBzdGF0ZSk7ZWxzZSByZXQgPSBudWxsO1xuXG4gIGlmIChyZXQgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIG4gPSAwO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlLmxlbmd0aCAtPSBuO1xuICB9XG5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAgIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgICBpZiAoIXN0YXRlLmVuZGVkKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gICAgLy8gSWYgd2UgdHJpZWQgdG8gcmVhZCgpIHBhc3QgdGhlIEVPRiwgdGhlbiBlbWl0IGVuZCBvbiB0aGUgbmV4dCB0aWNrLlxuICAgIGlmIChuT3JpZyAhPT0gbiAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7XG4gIH1cblxuICBpZiAocmV0ICE9PSBudWxsKSB0aGlzLmVtaXQoJ2RhdGEnLCByZXQpO1xuXG4gIHJldHVybiByZXQ7XG59O1xuXG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmVuZGVkKSByZXR1cm47XG4gIGlmIChzdGF0ZS5kZWNvZGVyKSB7XG4gICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcblxuICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG59XG5cbi8vIERvbid0IGVtaXQgcmVhZGFibGUgcmlnaHQgYXdheSBpbiBzeW5jIG1vZGUsIGJlY2F1c2UgdGhpcyBjYW4gdHJpZ2dlclxuLy8gYW5vdGhlciByZWFkKCkgY2FsbCA9PiBzdGFjayBvdmVyZmxvdy4gIFRoaXMgd2F5LCBpdCBtaWdodCB0cmlnZ2VyXG4vLyBhIG5leHRUaWNrIHJlY3Vyc2lvbiB3YXJuaW5nLCBidXQgdGhhdCdzIG5vdCBzbyBiYWQuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgaWYgKHN0YXRlLnN5bmMpIHBuYS5uZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pO2Vsc2UgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGRlYnVnKCdlbWl0IHJlYWRhYmxlJyk7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICBmbG93KHN0cmVhbSk7XG59XG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgcG5hLm5leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztlbHNlIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ19yZWFkKCkgaXMgbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCwgcGlwZU9wdHMpIHtcbiAgdmFyIHNyYyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgc3dpdGNoIChzdGF0ZS5waXBlc0NvdW50KSB7XG4gICAgY2FzZSAwOlxuICAgICAgc3RhdGUucGlwZXMgPSBkZXN0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgc3RhdGUucGlwZXMgPSBbc3RhdGUucGlwZXMsIGRlc3RdO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN0YXRlLnBpcGVzLnB1c2goZGVzdCk7XG4gICAgICBicmVhaztcbiAgfVxuICBzdGF0ZS5waXBlc0NvdW50ICs9IDE7XG4gIGRlYnVnKCdwaXBlIGNvdW50PSVkIG9wdHM9JWonLCBzdGF0ZS5waXBlc0NvdW50LCBwaXBlT3B0cyk7XG5cbiAgdmFyIGRvRW5kID0gKCFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlKSAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZG91dCAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZGVycjtcblxuICB2YXIgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogdW5waXBlO1xuICBpZiAoc3RhdGUuZW5kRW1pdHRlZCkgcG5hLm5leHRUaWNrKGVuZEZuKTtlbHNlIHNyYy5vbmNlKCdlbmQnLCBlbmRGbik7XG5cbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpO1xuICBmdW5jdGlvbiBvbnVucGlwZShyZWFkYWJsZSwgdW5waXBlSW5mbykge1xuICAgIGRlYnVnKCdvbnVucGlwZScpO1xuICAgIGlmIChyZWFkYWJsZSA9PT0gc3JjKSB7XG4gICAgICBpZiAodW5waXBlSW5mbyAmJiB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHVucGlwZUluZm8uaGFzVW5waXBlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cbiAgLy8gd2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAvLyBvbiB0aGUgc291cmNlLiAgVGhpcyB3b3VsZCBiZSBtb3JlIGVsZWdhbnQgd2l0aCBhIC5vbmNlKClcbiAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgLy8gdG9vIHNsb3cuXG4gIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTtcbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICB2YXIgY2xlYW5lZFVwID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgZGVidWcoJ2NsZWFudXAnKTtcbiAgICAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIHVucGlwZSk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcblxuICAgIGNsZWFuZWRVcCA9IHRydWU7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpIG9uZHJhaW4oKTtcbiAgfVxuXG4gIC8vIElmIHRoZSB1c2VyIHB1c2hlcyBtb3JlIGRhdGEgd2hpbGUgd2UncmUgd3JpdGluZyB0byBkZXN0IHRoZW4gd2UnbGwgZW5kIHVwXG4gIC8vIGluIG9uZGF0YSBhZ2Fpbi4gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIGluY3JlYXNlIGF3YWl0RHJhaW4gb25jZSBiZWNhdXNlXG4gIC8vIGRlc3Qgd2lsbCBvbmx5IGVtaXQgb25lICdkcmFpbicgZXZlbnQgZm9yIHRoZSBtdWx0aXBsZSB3cml0ZXMuXG4gIC8vID0+IEludHJvZHVjZSBhIGd1YXJkIG9uIGluY3JlYXNpbmcgYXdhaXREcmFpbi5cbiAgdmFyIGluY3JlYXNlZEF3YWl0RHJhaW4gPSBmYWxzZTtcbiAgc3JjLm9uKCdkYXRhJywgb25kYXRhKTtcbiAgZnVuY3Rpb24gb25kYXRhKGNodW5rKSB7XG4gICAgZGVidWcoJ29uZGF0YScpO1xuICAgIGluY3JlYXNlZEF3YWl0RHJhaW4gPSBmYWxzZTtcbiAgICB2YXIgcmV0ID0gZGVzdC53cml0ZShjaHVuayk7XG4gICAgaWYgKGZhbHNlID09PSByZXQgJiYgIWluY3JlYXNlZEF3YWl0RHJhaW4pIHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHVucGlwZWQgZHVyaW5nIGBkZXN0LndyaXRlKClgLCBpdCBpcyBwb3NzaWJsZVxuICAgICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAgIC8vIGFsc28gcmV0dXJuZWQgZmFsc2UuXG4gICAgICAvLyA9PiBDaGVjayB3aGV0aGVyIGBkZXN0YCBpcyBzdGlsbCBhIHBpcGluZyBkZXN0aW5hdGlvbi5cbiAgICAgIGlmICgoc3RhdGUucGlwZXNDb3VudCA9PT0gMSAmJiBzdGF0ZS5waXBlcyA9PT0gZGVzdCB8fCBzdGF0ZS5waXBlc0NvdW50ID4gMSAmJiBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KSAhPT0gLTEpICYmICFjbGVhbmVkVXApIHtcbiAgICAgICAgZGVidWcoJ2ZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZScsIHN0YXRlLmF3YWl0RHJhaW4pO1xuICAgICAgICBzdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICAgIGluY3JlYXNlZEF3YWl0RHJhaW4gPSB0cnVlO1xuICAgICAgfVxuICAgICAgc3JjLnBhdXNlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIGRlc3QgaGFzIGFuIGVycm9yLCB0aGVuIHN0b3AgcGlwaW5nIGludG8gaXQuXG4gIC8vIGhvd2V2ZXIsIGRvbid0IHN1cHByZXNzIHRoZSB0aHJvd2luZyBiZWhhdmlvciBmb3IgdGhpcy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGRlYnVnKCdvbmVycm9yJywgZXIpO1xuICAgIHVucGlwZSgpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgaWYgKEVFbGlzdGVuZXJDb3VudChkZXN0LCAnZXJyb3InKSA9PT0gMCkgZGVzdC5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgdXNlcmxhbmQgb25lcy5cbiAgcHJlcGVuZExpc3RlbmVyKGRlc3QsICdlcnJvcicsIG9uZXJyb3IpO1xuXG4gIC8vIEJvdGggY2xvc2UgYW5kIGZpbmlzaCBzaG91bGQgdHJpZ2dlciB1bnBpcGUsIGJ1dCBvbmx5IG9uY2UuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKTtcbiAgZnVuY3Rpb24gb25maW5pc2goKSB7XG4gICAgZGVidWcoJ29uZmluaXNoJyk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblxuICBmdW5jdGlvbiB1bnBpcGUoKSB7XG4gICAgZGVidWcoJ3VucGlwZScpO1xuICAgIHNyYy51bnBpcGUoZGVzdCk7XG4gIH1cblxuICAvLyB0ZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0b1xuICBkZXN0LmVtaXQoJ3BpcGUnLCBzcmMpO1xuXG4gIC8vIHN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BpcGUgcmVzdW1lJyk7XG4gICAgc3JjLnJlc3VtZSgpO1xuICB9XG5cbiAgcmV0dXJuIGRlc3Q7XG59O1xuXG5mdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhdGUgPSBzcmMuX3JlYWRhYmxlU3RhdGU7XG4gICAgZGVidWcoJ3BpcGVPbkRyYWluJywgc3RhdGUuYXdhaXREcmFpbik7XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4pIHN0YXRlLmF3YWl0RHJhaW4tLTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiA9PT0gMCAmJiBFRWxpc3RlbmVyQ291bnQoc3JjLCAnZGF0YScpKSB7XG4gICAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICAgIGZsb3coc3JjKTtcbiAgICB9XG4gIH07XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbiAoZGVzdCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgdW5waXBlSW5mbyA9IHsgaGFzVW5waXBlZDogZmFsc2UgfTtcblxuICAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAwKSByZXR1cm4gdGhpcztcblxuICAvLyBqdXN0IG9uZSBkZXN0aW5hdGlvbi4gIG1vc3QgY29tbW9uIGNhc2UuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSB7XG4gICAgLy8gcGFzc2VkIGluIG9uZSwgYnV0IGl0J3Mgbm90IHRoZSByaWdodCBvbmUuXG4gICAgaWYgKGRlc3QgJiYgZGVzdCAhPT0gc3RhdGUucGlwZXMpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCFkZXN0KSBkZXN0ID0gc3RhdGUucGlwZXM7XG5cbiAgICAvLyBnb3QgYSBtYXRjaC5cbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIGlmIChkZXN0KSBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc2xvdyBjYXNlLiBtdWx0aXBsZSBwaXBlIGRlc3RpbmF0aW9ucy5cblxuICBpZiAoIWRlc3QpIHtcbiAgICAvLyByZW1vdmUgYWxsLlxuICAgIHZhciBkZXN0cyA9IHN0YXRlLnBpcGVzO1xuICAgIHZhciBsZW4gPSBzdGF0ZS5waXBlc0NvdW50O1xuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBkZXN0c1tpXS5lbWl0KCd1bnBpcGUnLCB0aGlzLCB7IGhhc1VucGlwZWQ6IGZhbHNlIH0pO1xuICAgIH1yZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpbmRleCA9IGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gdGhpcztcblxuICBzdGF0ZS5waXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcywgdW5waXBlSW5mbyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBzZXQgdXAgZGF0YSBldmVudHMgaWYgdGhleSBhcmUgYXNrZWQgZm9yXG4vLyBFbnN1cmUgcmVhZGFibGUgbGlzdGVuZXJzIGV2ZW50dWFsbHkgZ2V0IHNvbWV0aGluZ1xuUmVhZGFibGUucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgaWYgKGV2ID09PSAnZGF0YScpIHtcbiAgICAvLyBTdGFydCBmbG93aW5nIG9uIG5leHQgdGljayBpZiBzdHJlYW0gaXNuJ3QgZXhwbGljaXRseSBwYXVzZWRcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nICE9PSBmYWxzZSkgdGhpcy5yZXN1bWUoKTtcbiAgfSBlbHNlIGlmIChldiA9PT0gJ3JlYWRhYmxlJykge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmICFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcG5hLm5leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uO1xuXG5mdW5jdGlvbiBuUmVhZGluZ05leHRUaWNrKHNlbGYpIHtcbiAgZGVidWcoJ3JlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCcpO1xuICBzZWxmLnJlYWQoMCk7XG59XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdyZXN1bWUnKTtcbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICByZXN1bWUodGhpcywgc3RhdGUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZXN1bWVTY2hlZHVsZWQpIHtcbiAgICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHBuYS5uZXh0VGljayhyZXN1bWVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuXG4gIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuICBzdGF0ZS5hd2FpdERyYWluID0gMDtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICBkZWJ1ZygnY2FsbCBwYXVzZSBmbG93aW5nPSVqJywgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKTtcbiAgaWYgKGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGF1c2UnKTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG4gIHdoaWxlIChzdGF0ZS5mbG93aW5nICYmIHN0cmVhbS5yZWFkKCkgIT09IG51bGwpIHt9XG59XG5cbi8vIHdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBwYXVzZWQgPSBmYWxzZTtcblxuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBlbmQnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhc3RhdGUuZW5kZWQpIHtcbiAgICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSBfdGhpcy5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBfdGhpcy5wdXNoKG51bGwpO1xuICB9KTtcblxuICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBkYXRhJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG5cbiAgICAvLyBkb24ndCBza2lwIG92ZXIgZmFsc3kgdmFsdWVzIGluIG9iamVjdE1vZGVcbiAgICBpZiAoc3RhdGUub2JqZWN0TW9kZSAmJiAoY2h1bmsgPT09IG51bGwgfHwgY2h1bmsgPT09IHVuZGVmaW5lZCkpIHJldHVybjtlbHNlIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiAoIWNodW5rIHx8ICFjaHVuay5sZW5ndGgpKSByZXR1cm47XG5cbiAgICB2YXIgcmV0ID0gX3RoaXMucHVzaChjaHVuayk7XG4gICAgaWYgKCFyZXQpIHtcbiAgICAgIHBhdXNlZCA9IHRydWU7XG4gICAgICBzdHJlYW0ucGF1c2UoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIHByb3h5IGFsbCB0aGUgb3RoZXIgbWV0aG9kcy5cbiAgLy8gaW1wb3J0YW50IHdoZW4gd3JhcHBpbmcgZmlsdGVycyBhbmQgZHVwbGV4ZXMuXG4gIGZvciAodmFyIGkgaW4gc3RyZWFtKSB7XG4gICAgaWYgKHRoaXNbaV0gPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygc3RyZWFtW2ldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2ldID0gZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KGkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByb3h5IGNlcnRhaW4gaW1wb3J0YW50IGV2ZW50cy5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCBrUHJveHlFdmVudHMubGVuZ3RoOyBuKyspIHtcbiAgICBzdHJlYW0ub24oa1Byb3h5RXZlbnRzW25dLCB0aGlzLmVtaXQuYmluZCh0aGlzLCBrUHJveHlFdmVudHNbbl0pKTtcbiAgfVxuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHRoaXMuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgJ3JlYWRhYmxlSGlnaFdhdGVyTWFyaycsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgfVxufSk7XG5cbi8vIGV4cG9zZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cblJlYWRhYmxlLl9mcm9tTGlzdCA9IGZyb21MaXN0O1xuXG4vLyBQbHVjayBvZmYgbiBieXRlcyBmcm9tIGFuIGFycmF5IG9mIGJ1ZmZlcnMuXG4vLyBMZW5ndGggaXMgdGhlIGNvbWJpbmVkIGxlbmd0aHMgb2YgYWxsIHRoZSBidWZmZXJzIGluIHRoZSBsaXN0LlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICAvLyBub3RoaW5nIGJ1ZmZlcmVkXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIHZhciByZXQ7XG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKSByZXQgPSBzdGF0ZS5idWZmZXIuc2hpZnQoKTtlbHNlIGlmICghbiB8fCBuID49IHN0YXRlLmxlbmd0aCkge1xuICAgIC8vIHJlYWQgaXQgYWxsLCB0cnVuY2F0ZSB0aGUgbGlzdFxuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSByZXQgPSBzdGF0ZS5idWZmZXIuam9pbignJyk7ZWxzZSBpZiAoc3RhdGUuYnVmZmVyLmxlbmd0aCA9PT0gMSkgcmV0ID0gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YTtlbHNlIHJldCA9IHN0YXRlLmJ1ZmZlci5jb25jYXQoc3RhdGUubGVuZ3RoKTtcbiAgICBzdGF0ZS5idWZmZXIuY2xlYXIoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIHBhcnQgb2YgbGlzdFxuICAgIHJldCA9IGZyb21MaXN0UGFydGlhbChuLCBzdGF0ZS5idWZmZXIsIHN0YXRlLmRlY29kZXIpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gRXh0cmFjdHMgb25seSBlbm91Z2ggYnVmZmVyZWQgZGF0YSB0byBzYXRpc2Z5IHRoZSBhbW91bnQgcmVxdWVzdGVkLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdFBhcnRpYWwobiwgbGlzdCwgaGFzU3RyaW5ncykge1xuICB2YXIgcmV0O1xuICBpZiAobiA8IGxpc3QuaGVhZC5kYXRhLmxlbmd0aCkge1xuICAgIC8vIHNsaWNlIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzXG4gICAgcmV0ID0gbGlzdC5oZWFkLmRhdGEuc2xpY2UoMCwgbik7XG4gICAgbGlzdC5oZWFkLmRhdGEgPSBsaXN0LmhlYWQuZGF0YS5zbGljZShuKTtcbiAgfSBlbHNlIGlmIChuID09PSBsaXN0LmhlYWQuZGF0YS5sZW5ndGgpIHtcbiAgICAvLyBmaXJzdCBjaHVuayBpcyBhIHBlcmZlY3QgbWF0Y2hcbiAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVzdWx0IHNwYW5zIG1vcmUgdGhhbiBvbmUgYnVmZmVyXG4gICAgcmV0ID0gaGFzU3RyaW5ncyA/IGNvcHlGcm9tQnVmZmVyU3RyaW5nKG4sIGxpc3QpIDogY29weUZyb21CdWZmZXIobiwgbGlzdCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxpc3Qgb2YgYnVmZmVyZWQgZGF0YVxuLy8gY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlclN0cmluZyhuLCBsaXN0KSB7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHZhciByZXQgPSBwLmRhdGE7XG4gIG4gLT0gcmV0Lmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgc3RyID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBzdHIubGVuZ3RoID8gc3RyLmxlbmd0aCA6IG47XG4gICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSByZXQgKz0gc3RyO2Vsc2UgcmV0ICs9IHN0ci5zbGljZSgwLCBuKTtcbiAgICBuIC09IG5iO1xuICAgIGlmIChuID09PSAwKSB7XG4gICAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgKytjO1xuICAgICAgICBpZiAocC5uZXh0KSBsaXN0LmhlYWQgPSBwLm5leHQ7ZWxzZSBsaXN0LmhlYWQgPSBsaXN0LnRhaWwgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdC5oZWFkID0gcDtcbiAgICAgICAgcC5kYXRhID0gc3RyLnNsaWNlKG5iKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICArK2M7XG4gIH1cbiAgbGlzdC5sZW5ndGggLT0gYztcbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBieXRlcyBmcm9tIHRoZSBsaXN0IG9mIGJ1ZmZlcmVkIGRhdGEgY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlcihuLCBsaXN0KSB7XG4gIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobik7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHAuZGF0YS5jb3B5KHJldCk7XG4gIG4gLT0gcC5kYXRhLmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgYnVmID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBidWYubGVuZ3RoID8gYnVmLmxlbmd0aCA6IG47XG4gICAgYnVmLmNvcHkocmV0LCByZXQubGVuZ3RoIC0gbiwgMCwgbmIpO1xuICAgIG4gLT0gbmI7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGlmIChuYiA9PT0gYnVmLmxlbmd0aCkge1xuICAgICAgICArK2M7XG4gICAgICAgIGlmIChwLm5leHQpIGxpc3QuaGVhZCA9IHAubmV4dDtlbHNlIGxpc3QuaGVhZCA9IGxpc3QudGFpbCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0LmhlYWQgPSBwO1xuICAgICAgICBwLmRhdGEgPSBidWYuc2xpY2UobmIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgICsrYztcbiAgfVxuICBsaXN0Lmxlbmd0aCAtPSBjO1xuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuXG4gIC8vIElmIHdlIGdldCBoZXJlIGJlZm9yZSBjb25zdW1pbmcgYWxsIHRoZSBieXRlcywgdGhlbiB0aGF0IGlzIGFcbiAgLy8gYnVnIGluIG5vZGUuICBTaG91bGQgbmV2ZXIgaGFwcGVuLlxuICBpZiAoc3RhdGUubGVuZ3RoID4gMCkgdGhyb3cgbmV3IEVycm9yKCdcImVuZFJlYWRhYmxlKClcIiBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO1xuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCkge1xuICAgIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgICBwbmEubmV4dFRpY2soZW5kUmVhZGFibGVOVCwgc3RhdGUsIHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGVOVChzdGF0ZSwgc3RyZWFtKSB7XG4gIC8vIENoZWNrIHRoYXQgd2UgZGlkbid0IGdldCBvbmUgbGFzdCB1bnNoaWZ0LlxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2VuZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1143\n")},7628:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a transform stream is a readable/writable stream where you do\n// something with the data. Sometimes it's called a \"filter\",\n// but that's not a great name for it, since that implies a thing where\n// some bits pass through, and others are simply ignored. (That would\n// be a valid example of a transform, of course.)\n//\n// While the output is causally related to the input, it's not a\n// necessarily symmetric or synchronous transformation. For example,\n// a zlib stream might take multiple plain-text writes(), and then\n// emit a single compressed chunk some time in the future.\n//\n// Here's how this works:\n//\n// The Transform stream has all the aspects of the readable and writable\n// stream classes. When you write(chunk), that calls _write(chunk,cb)\n// internally, and returns false if there's a lot of pending writes\n// buffered up. When you call read(), that calls _read(n) until\n// there's enough pending readable data buffered up.\n//\n// In a transform stream, the written data is placed in a buffer. When\n// _read(n) is called, it transforms the queued up data, calling the\n// buffered _write cb's as it consumes chunks. If consuming a single\n// written chunk would result in multiple output chunks, then the first\n// outputted bit calls the readcb, and subsequent chunks just go into\n// the read buffer, and will cause it to emit 'readable' if necessary.\n//\n// This way, back-pressure is actually determined by the reading side,\n// since _read has to be called to start processing a new chunk. However,\n// a pathological inflate type of transform can cause excessive buffering\n// here. For example, imagine a stream where every byte of input is\n// interpreted as an integer from 0-255, and then results in that many\n// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in\n// 1kb of data being output. In this case, you could write a very small\n// amount of input, and end up with a very large amount of output. In\n// such a pathological inflating mechanism, there'd be no way to tell\n// the system to stop doing the transform. A single 4MB write could\n// cause the system to run out of memory.\n//\n// However, even in such a pathological case, only a single written chunk\n// would be consumed, and then the rest would wait (un-transformed) until\n// the results of the previous transformed chunk were consumed.\n\n\n\nmodule.exports = Transform;\n\nvar Duplex = __webpack_require__(2836);\n\n/**/\nvar util = Object.create(__webpack_require__(6497));\nutil.inherits = __webpack_require__(4378);\n/**/\n\nutil.inherits(Transform, Duplex);\n\nfunction afterTransform(er, data) {\n var ts = this._transformState;\n ts.transforming = false;\n\n var cb = ts.writecb;\n\n if (!cb) {\n return this.emit('error', new Error('write callback called multiple times'));\n }\n\n ts.writechunk = null;\n ts.writecb = null;\n\n if (data != null) // single equals check for both `null` and `undefined`\n this.push(data);\n\n cb(er);\n\n var rs = this._readableState;\n rs.reading = false;\n if (rs.needReadable || rs.length < rs.highWaterMark) {\n this._read(rs.highWaterMark);\n }\n}\n\nfunction Transform(options) {\n if (!(this instanceof Transform)) return new Transform(options);\n\n Duplex.call(this, options);\n\n this._transformState = {\n afterTransform: afterTransform.bind(this),\n needTransform: false,\n transforming: false,\n writecb: null,\n writechunk: null,\n writeencoding: null\n };\n\n // start out asking for a readable event once data is transformed.\n this._readableState.needReadable = true;\n\n // we have implemented the _read method, and done the other things\n // that Readable wants before the first _read call, so unset the\n // sync guard flag.\n this._readableState.sync = false;\n\n if (options) {\n if (typeof options.transform === 'function') this._transform = options.transform;\n\n if (typeof options.flush === 'function') this._flush = options.flush;\n }\n\n // When the writable side finishes, then flush out anything remaining.\n this.on('prefinish', prefinish);\n}\n\nfunction prefinish() {\n var _this = this;\n\n if (typeof this._flush === 'function') {\n this._flush(function (er, data) {\n done(_this, er, data);\n });\n } else {\n done(this, null, null);\n }\n}\n\nTransform.prototype.push = function (chunk, encoding) {\n this._transformState.needTransform = false;\n return Duplex.prototype.push.call(this, chunk, encoding);\n};\n\n// This is the part where you do stuff!\n// override this function in implementation classes.\n// 'chunk' is an input chunk.\n//\n// Call `push(newChunk)` to pass along transformed output\n// to the readable side. You may call 'push' zero or more times.\n//\n// Call `cb(err)` when you are done with this chunk. If you pass\n// an error, then that'll put the hurt on the whole operation. If you\n// never call cb(), then you'll never get another chunk.\nTransform.prototype._transform = function (chunk, encoding, cb) {\n throw new Error('_transform() is not implemented');\n};\n\nTransform.prototype._write = function (chunk, encoding, cb) {\n var ts = this._transformState;\n ts.writecb = cb;\n ts.writechunk = chunk;\n ts.writeencoding = encoding;\n if (!ts.transforming) {\n var rs = this._readableState;\n if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);\n }\n};\n\n// Doesn't matter what the args are here.\n// _transform does all the work.\n// That we got here means that the readable side wants more data.\nTransform.prototype._read = function (n) {\n var ts = this._transformState;\n\n if (ts.writechunk !== null && ts.writecb && !ts.transforming) {\n ts.transforming = true;\n this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);\n } else {\n // mark that we need a transform, so that any data that comes in\n // will get processed, now that we've asked for it.\n ts.needTransform = true;\n }\n};\n\nTransform.prototype._destroy = function (err, cb) {\n var _this2 = this;\n\n Duplex.prototype._destroy.call(this, err, function (err2) {\n cb(err2);\n _this2.emit('close');\n });\n};\n\nfunction done(stream, er, data) {\n if (er) return stream.emit('error', er);\n\n if (data != null) // single equals check for both `null` and `undefined`\n stream.push(data);\n\n // if there's nothing in the write buffer, then that means\n // that nothing more will ever be provided\n if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0');\n\n if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming');\n\n return stream.push(null);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzYyOC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLGFBQWE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViOztBQUVBLGFBQWEsbUJBQU8sQ0FBQyxJQUFrQjs7QUFFdkM7QUFDQSx5QkFBeUIsbUJBQU8sQ0FBQyxJQUFjO0FBQy9DLGdCQUFnQixtQkFBTyxDQUFDLElBQVU7QUFDbEM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2xhenlzdHJlYW0vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanM/YTBhNyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSB0cmFuc2Zvcm0gc3RyZWFtIGlzIGEgcmVhZGFibGUvd3JpdGFibGUgc3RyZWFtIHdoZXJlIHlvdSBkb1xuLy8gc29tZXRoaW5nIHdpdGggdGhlIGRhdGEuICBTb21ldGltZXMgaXQncyBjYWxsZWQgYSBcImZpbHRlclwiLFxuLy8gYnV0IHRoYXQncyBub3QgYSBncmVhdCBuYW1lIGZvciBpdCwgc2luY2UgdGhhdCBpbXBsaWVzIGEgdGhpbmcgd2hlcmVcbi8vIHNvbWUgYml0cyBwYXNzIHRocm91Z2gsIGFuZCBvdGhlcnMgYXJlIHNpbXBseSBpZ25vcmVkLiAgKFRoYXQgd291bGRcbi8vIGJlIGEgdmFsaWQgZXhhbXBsZSBvZiBhIHRyYW5zZm9ybSwgb2YgY291cnNlLilcbi8vXG4vLyBXaGlsZSB0aGUgb3V0cHV0IGlzIGNhdXNhbGx5IHJlbGF0ZWQgdG8gdGhlIGlucHV0LCBpdCdzIG5vdCBhXG4vLyBuZWNlc3NhcmlseSBzeW1tZXRyaWMgb3Igc3luY2hyb25vdXMgdHJhbnNmb3JtYXRpb24uICBGb3IgZXhhbXBsZSxcbi8vIGEgemxpYiBzdHJlYW0gbWlnaHQgdGFrZSBtdWx0aXBsZSBwbGFpbi10ZXh0IHdyaXRlcygpLCBhbmQgdGhlblxuLy8gZW1pdCBhIHNpbmdsZSBjb21wcmVzc2VkIGNodW5rIHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlLlxuLy9cbi8vIEhlcmUncyBob3cgdGhpcyB3b3Jrczpcbi8vXG4vLyBUaGUgVHJhbnNmb3JtIHN0cmVhbSBoYXMgYWxsIHRoZSBhc3BlY3RzIG9mIHRoZSByZWFkYWJsZSBhbmQgd3JpdGFibGVcbi8vIHN0cmVhbSBjbGFzc2VzLiAgV2hlbiB5b3Ugd3JpdGUoY2h1bmspLCB0aGF0IGNhbGxzIF93cml0ZShjaHVuayxjYilcbi8vIGludGVybmFsbHksIGFuZCByZXR1cm5zIGZhbHNlIGlmIHRoZXJlJ3MgYSBsb3Qgb2YgcGVuZGluZyB3cml0ZXNcbi8vIGJ1ZmZlcmVkIHVwLiAgV2hlbiB5b3UgY2FsbCByZWFkKCksIHRoYXQgY2FsbHMgX3JlYWQobikgdW50aWxcbi8vIHRoZXJlJ3MgZW5vdWdoIHBlbmRpbmcgcmVhZGFibGUgZGF0YSBidWZmZXJlZCB1cC5cbi8vXG4vLyBJbiBhIHRyYW5zZm9ybSBzdHJlYW0sIHRoZSB3cml0dGVuIGRhdGEgaXMgcGxhY2VkIGluIGEgYnVmZmVyLiAgV2hlblxuLy8gX3JlYWQobikgaXMgY2FsbGVkLCBpdCB0cmFuc2Zvcm1zIHRoZSBxdWV1ZWQgdXAgZGF0YSwgY2FsbGluZyB0aGVcbi8vIGJ1ZmZlcmVkIF93cml0ZSBjYidzIGFzIGl0IGNvbnN1bWVzIGNodW5rcy4gIElmIGNvbnN1bWluZyBhIHNpbmdsZVxuLy8gd3JpdHRlbiBjaHVuayB3b3VsZCByZXN1bHQgaW4gbXVsdGlwbGUgb3V0cHV0IGNodW5rcywgdGhlbiB0aGUgZmlyc3Rcbi8vIG91dHB1dHRlZCBiaXQgY2FsbHMgdGhlIHJlYWRjYiwgYW5kIHN1YnNlcXVlbnQgY2h1bmtzIGp1c3QgZ28gaW50b1xuLy8gdGhlIHJlYWQgYnVmZmVyLCBhbmQgd2lsbCBjYXVzZSBpdCB0byBlbWl0ICdyZWFkYWJsZScgaWYgbmVjZXNzYXJ5LlxuLy9cbi8vIFRoaXMgd2F5LCBiYWNrLXByZXNzdXJlIGlzIGFjdHVhbGx5IGRldGVybWluZWQgYnkgdGhlIHJlYWRpbmcgc2lkZSxcbi8vIHNpbmNlIF9yZWFkIGhhcyB0byBiZSBjYWxsZWQgdG8gc3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBjaHVuay4gIEhvd2V2ZXIsXG4vLyBhIHBhdGhvbG9naWNhbCBpbmZsYXRlIHR5cGUgb2YgdHJhbnNmb3JtIGNhbiBjYXVzZSBleGNlc3NpdmUgYnVmZmVyaW5nXG4vLyBoZXJlLiAgRm9yIGV4YW1wbGUsIGltYWdpbmUgYSBzdHJlYW0gd2hlcmUgZXZlcnkgYnl0ZSBvZiBpbnB1dCBpc1xuLy8gaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlciBmcm9tIDAtMjU1LCBhbmQgdGhlbiByZXN1bHRzIGluIHRoYXQgbWFueVxuLy8gYnl0ZXMgb2Ygb3V0cHV0LiAgV3JpdGluZyB0aGUgNCBieXRlcyB7ZmYsZmYsZmYsZmZ9IHdvdWxkIHJlc3VsdCBpblxuLy8gMWtiIG9mIGRhdGEgYmVpbmcgb3V0cHV0LiAgSW4gdGhpcyBjYXNlLCB5b3UgY291bGQgd3JpdGUgYSB2ZXJ5IHNtYWxsXG4vLyBhbW91bnQgb2YgaW5wdXQsIGFuZCBlbmQgdXAgd2l0aCBhIHZlcnkgbGFyZ2UgYW1vdW50IG9mIG91dHB1dC4gIEluXG4vLyBzdWNoIGEgcGF0aG9sb2dpY2FsIGluZmxhdGluZyBtZWNoYW5pc20sIHRoZXJlJ2QgYmUgbm8gd2F5IHRvIHRlbGxcbi8vIHRoZSBzeXN0ZW0gdG8gc3RvcCBkb2luZyB0aGUgdHJhbnNmb3JtLiAgQSBzaW5nbGUgNE1CIHdyaXRlIGNvdWxkXG4vLyBjYXVzZSB0aGUgc3lzdGVtIHRvIHJ1biBvdXQgb2YgbWVtb3J5LlxuLy9cbi8vIEhvd2V2ZXIsIGV2ZW4gaW4gc3VjaCBhIHBhdGhvbG9naWNhbCBjYXNlLCBvbmx5IGEgc2luZ2xlIHdyaXR0ZW4gY2h1bmtcbi8vIHdvdWxkIGJlIGNvbnN1bWVkLCBhbmQgdGhlbiB0aGUgcmVzdCB3b3VsZCB3YWl0ICh1bi10cmFuc2Zvcm1lZCkgdW50aWxcbi8vIHRoZSByZXN1bHRzIG9mIHRoZSBwcmV2aW91cyB0cmFuc2Zvcm1lZCBjaHVuayB3ZXJlIGNvbnN1bWVkLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gVHJhbnNmb3JtO1xuXG52YXIgRHVwbGV4ID0gcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSBPYmplY3QuY3JlYXRlKHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnV0aWwuaW5oZXJpdHMoVHJhbnNmb3JtLCBEdXBsZXgpO1xuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShlciwgZGF0YSkge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG5cbiAgdmFyIGNiID0gdHMud3JpdGVjYjtcblxuICBpZiAoIWNiKSB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ3dyaXRlIGNhbGxiYWNrIGNhbGxlZCBtdWx0aXBsZSB0aW1lcycpKTtcbiAgfVxuXG4gIHRzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0cy53cml0ZWNiID0gbnVsbDtcblxuICBpZiAoZGF0YSAhPSBudWxsKSAvLyBzaW5nbGUgZXF1YWxzIGNoZWNrIGZvciBib3RoIGBudWxsYCBhbmQgYHVuZGVmaW5lZGBcbiAgICB0aGlzLnB1c2goZGF0YSk7XG5cbiAgY2IoZXIpO1xuXG4gIHZhciBycyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHJzLnJlYWRpbmcgPSBmYWxzZTtcbiAgaWYgKHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgdGhpcy5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBUcmFuc2Zvcm0ob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVHJhbnNmb3JtKSkgcmV0dXJuIG5ldyBUcmFuc2Zvcm0ob3B0aW9ucyk7XG5cbiAgRHVwbGV4LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUgPSB7XG4gICAgYWZ0ZXJUcmFuc2Zvcm06IGFmdGVyVHJhbnNmb3JtLmJpbmQodGhpcyksXG4gICAgbmVlZFRyYW5zZm9ybTogZmFsc2UsXG4gICAgdHJhbnNmb3JtaW5nOiBmYWxzZSxcbiAgICB3cml0ZWNiOiBudWxsLFxuICAgIHdyaXRlY2h1bms6IG51bGwsXG4gICAgd3JpdGVlbmNvZGluZzogbnVsbFxuICB9O1xuXG4gIC8vIHN0YXJ0IG91dCBhc2tpbmcgZm9yIGEgcmVhZGFibGUgZXZlbnQgb25jZSBkYXRhIGlzIHRyYW5zZm9ybWVkLlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG5cbiAgLy8gd2UgaGF2ZSBpbXBsZW1lbnRlZCB0aGUgX3JlYWQgbWV0aG9kLCBhbmQgZG9uZSB0aGUgb3RoZXIgdGhpbmdzXG4gIC8vIHRoYXQgUmVhZGFibGUgd2FudHMgYmVmb3JlIHRoZSBmaXJzdCBfcmVhZCBjYWxsLCBzbyB1bnNldCB0aGVcbiAgLy8gc3luYyBndWFyZCBmbGFnLlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmMgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHRoaXMuX3RyYW5zZm9ybSA9IG9wdGlvbnMudHJhbnNmb3JtO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZsdXNoID09PSAnZnVuY3Rpb24nKSB0aGlzLl9mbHVzaCA9IG9wdGlvbnMuZmx1c2g7XG4gIH1cblxuICAvLyBXaGVuIHRoZSB3cml0YWJsZSBzaWRlIGZpbmlzaGVzLCB0aGVuIGZsdXNoIG91dCBhbnl0aGluZyByZW1haW5pbmcuXG4gIHRoaXMub24oJ3ByZWZpbmlzaCcsIHByZWZpbmlzaCk7XG59XG5cbmZ1bmN0aW9uIHByZWZpbmlzaCgpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICBpZiAodHlwZW9mIHRoaXMuX2ZsdXNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5fZmx1c2goZnVuY3Rpb24gKGVyLCBkYXRhKSB7XG4gICAgICBkb25lKF90aGlzLCBlciwgZGF0YSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgZG9uZSh0aGlzLCBudWxsLCBudWxsKTtcbiAgfVxufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm0gPSBmYWxzZTtcbiAgcmV0dXJuIER1cGxleC5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIGNodW5rLCBlbmNvZGluZyk7XG59O1xuXG4vLyBUaGlzIGlzIHRoZSBwYXJ0IHdoZXJlIHlvdSBkbyBzdHVmZiFcbi8vIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gaW4gaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vICdjaHVuaycgaXMgYW4gaW5wdXQgY2h1bmsuXG4vL1xuLy8gQ2FsbCBgcHVzaChuZXdDaHVuaylgIHRvIHBhc3MgYWxvbmcgdHJhbnNmb3JtZWQgb3V0cHV0XG4vLyB0byB0aGUgcmVhZGFibGUgc2lkZS4gIFlvdSBtYXkgY2FsbCAncHVzaCcgemVybyBvciBtb3JlIHRpbWVzLlxuLy9cbi8vIENhbGwgYGNiKGVycilgIHdoZW4geW91IGFyZSBkb25lIHdpdGggdGhpcyBjaHVuay4gIElmIHlvdSBwYXNzXG4vLyBhbiBlcnJvciwgdGhlbiB0aGF0J2xsIHB1dCB0aGUgaHVydCBvbiB0aGUgd2hvbGUgb3BlcmF0aW9uLiAgSWYgeW91XG4vLyBuZXZlciBjYWxsIGNiKCksIHRoZW4geW91J2xsIG5ldmVyIGdldCBhbm90aGVyIGNodW5rLlxuVHJhbnNmb3JtLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdfdHJhbnNmb3JtKCkgaXMgbm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuICB0cy53cml0ZWNiID0gY2I7XG4gIHRzLndyaXRlY2h1bmsgPSBjaHVuaztcbiAgdHMud3JpdGVlbmNvZGluZyA9IGVuY29kaW5nO1xuICBpZiAoIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHZhciBycyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKHRzLm5lZWRUcmFuc2Zvcm0gfHwgcnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn07XG5cbi8vIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGFyZ3MgYXJlIGhlcmUuXG4vLyBfdHJhbnNmb3JtIGRvZXMgYWxsIHRoZSB3b3JrLlxuLy8gVGhhdCB3ZSBnb3QgaGVyZSBtZWFucyB0aGF0IHRoZSByZWFkYWJsZSBzaWRlIHdhbnRzIG1vcmUgZGF0YS5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcblxuICBpZiAodHMud3JpdGVjaHVuayAhPT0gbnVsbCAmJiB0cy53cml0ZWNiICYmICF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB0cy50cmFuc2Zvcm1pbmcgPSB0cnVlO1xuICAgIHRoaXMuX3RyYW5zZm9ybSh0cy53cml0ZWNodW5rLCB0cy53cml0ZWVuY29kaW5nLCB0cy5hZnRlclRyYW5zZm9ybSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbWFyayB0aGF0IHdlIG5lZWQgYSB0cmFuc2Zvcm0sIHNvIHRoYXQgYW55IGRhdGEgdGhhdCBjb21lcyBpblxuICAgIC8vIHdpbGwgZ2V0IHByb2Nlc3NlZCwgbm93IHRoYXQgd2UndmUgYXNrZWQgZm9yIGl0LlxuICAgIHRzLm5lZWRUcmFuc2Zvcm0gPSB0cnVlO1xuICB9XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgRHVwbGV4LnByb3RvdHlwZS5fZGVzdHJveS5jYWxsKHRoaXMsIGVyciwgZnVuY3Rpb24gKGVycjIpIHtcbiAgICBjYihlcnIyKTtcbiAgICBfdGhpczIuZW1pdCgnY2xvc2UnKTtcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBkb25lKHN0cmVhbSwgZXIsIGRhdGEpIHtcbiAgaWYgKGVyKSByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuXG4gIGlmIChkYXRhICE9IG51bGwpIC8vIHNpbmdsZSBlcXVhbHMgY2hlY2sgZm9yIGJvdGggYG51bGxgIGFuZCBgdW5kZWZpbmVkYFxuICAgIHN0cmVhbS5wdXNoKGRhdGEpO1xuXG4gIC8vIGlmIHRoZXJlJ3Mgbm90aGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyLCB0aGVuIHRoYXQgbWVhbnNcbiAgLy8gdGhhdCBub3RoaW5nIG1vcmUgd2lsbCBldmVyIGJlIHByb3ZpZGVkXG4gIGlmIChzdHJlYW0uX3dyaXRhYmxlU3RhdGUubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCcpO1xuXG4gIGlmIChzdHJlYW0uX3RyYW5zZm9ybVN0YXRlLnRyYW5zZm9ybWluZykgdGhyb3cgbmV3IEVycm9yKCdDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nJyk7XG5cbiAgcmV0dXJuIHN0cmVhbS5wdXNoKG51bGwpO1xufSJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7628\n")},3494:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// A bit simpler than readable streams.\n// Implement an async ._write(chunk, encoding, cb), and it'll handle all\n// the drain event emission and buffering.\n\n\n\n/**/\n\nvar pna = __webpack_require__(8212);\n/**/\n\nmodule.exports = Writable;\n\n/* */\nfunction WriteReq(chunk, encoding, cb) {\n this.chunk = chunk;\n this.encoding = encoding;\n this.callback = cb;\n this.next = null;\n}\n\n// It seems a linked list but it is not\n// there will be only 2 of these for each stream\nfunction CorkedRequest(state) {\n var _this = this;\n\n this.next = null;\n this.entry = null;\n this.finish = function () {\n onCorkedFinish(_this, state);\n };\n}\n/* */\n\n/**/\nvar asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick;\n/**/\n\n/**/\nvar Duplex;\n/**/\n\nWritable.WritableState = WritableState;\n\n/**/\nvar util = Object.create(__webpack_require__(6497));\nutil.inherits = __webpack_require__(4378);\n/**/\n\n/**/\nvar internalUtil = {\n deprecate: __webpack_require__(1159)\n};\n/**/\n\n/**/\nvar Stream = __webpack_require__(2300);\n/**/\n\n/**/\n\nvar Buffer = (__webpack_require__(6509).Buffer);\nvar OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};\nfunction _uint8ArrayToBuffer(chunk) {\n return Buffer.from(chunk);\n}\nfunction _isUint8Array(obj) {\n return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n\n/**/\n\nvar destroyImpl = __webpack_require__(4201);\n\nutil.inherits(Writable, Stream);\n\nfunction nop() {}\n\nfunction WritableState(options, stream) {\n Duplex = Duplex || __webpack_require__(2836);\n\n options = options || {};\n\n // Duplex streams are both readable and writable, but share\n // the same options object.\n // However, some cases require setting options to different\n // values for the readable and the writable sides of the duplex stream.\n // These options can be provided separately as readableXXX and writableXXX.\n var isDuplex = stream instanceof Duplex;\n\n // object stream flag to indicate whether or not this stream\n // contains buffers or objects.\n this.objectMode = !!options.objectMode;\n\n if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;\n\n // the point at which write() starts returning false\n // Note: 0 is a valid value, means that we always return false if\n // the entire buffer is not flushed immediately on write()\n var hwm = options.highWaterMark;\n var writableHwm = options.writableHighWaterMark;\n var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n\n if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm;\n\n // cast to ints.\n this.highWaterMark = Math.floor(this.highWaterMark);\n\n // if _final has been called\n this.finalCalled = false;\n\n // drain event flag.\n this.needDrain = false;\n // at the start of calling end()\n this.ending = false;\n // when end() has been called, and returned\n this.ended = false;\n // when 'finish' is emitted\n this.finished = false;\n\n // has it been destroyed\n this.destroyed = false;\n\n // should we decode strings into buffers before passing to _write?\n // this is here so that some node-core streams can optimize string\n // handling at a lower level.\n var noDecode = options.decodeStrings === false;\n this.decodeStrings = !noDecode;\n\n // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n // not an actual buffer we keep track of, but a measurement\n // of how much we're waiting to get pushed to some underlying\n // socket or file.\n this.length = 0;\n\n // a flag to see when we're in the middle of a write.\n this.writing = false;\n\n // when true all writes will be buffered until .uncork() call\n this.corked = 0;\n\n // a flag to be able to tell if the onwrite cb is called immediately,\n // or on a later tick. We set this to true at first, because any\n // actions that shouldn't happen until \"later\" should generally also\n // not happen before the first write call.\n this.sync = true;\n\n // a flag to know if we're processing previously buffered items, which\n // may call the _write() callback in the same tick, so that we don't\n // end up in an overlapped onwrite situation.\n this.bufferProcessing = false;\n\n // the callback that's passed to _write(chunk,cb)\n this.onwrite = function (er) {\n onwrite(stream, er);\n };\n\n // the callback that the user supplies to write(chunk,encoding,cb)\n this.writecb = null;\n\n // the amount that is being written when _write is called.\n this.writelen = 0;\n\n this.bufferedRequest = null;\n this.lastBufferedRequest = null;\n\n // number of pending user-supplied write callbacks\n // this must be 0 before 'finish' can be emitted\n this.pendingcb = 0;\n\n // emit prefinish if the only thing we're waiting for is _write cbs\n // This is relevant for synchronous Transform streams\n this.prefinished = false;\n\n // True if the error was already emitted and should not be thrown again\n this.errorEmitted = false;\n\n // count buffered requests\n this.bufferedRequestCount = 0;\n\n // allocate the first CorkedRequest, there is always\n // one allocated and free to use, and we maintain at most two\n this.corkedRequestsFree = new CorkedRequest(this);\n}\n\nWritableState.prototype.getBuffer = function getBuffer() {\n var current = this.bufferedRequest;\n var out = [];\n while (current) {\n out.push(current);\n current = current.next;\n }\n return out;\n};\n\n(function () {\n try {\n Object.defineProperty(WritableState.prototype, 'buffer', {\n get: internalUtil.deprecate(function () {\n return this.getBuffer();\n }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')\n });\n } catch (_) {}\n})();\n\n// Test _writableState for inheritance to account for Duplex streams,\n// whose prototype chain only points to Readable.\nvar realHasInstance;\nif (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {\n realHasInstance = Function.prototype[Symbol.hasInstance];\n Object.defineProperty(Writable, Symbol.hasInstance, {\n value: function (object) {\n if (realHasInstance.call(this, object)) return true;\n if (this !== Writable) return false;\n\n return object && object._writableState instanceof WritableState;\n }\n });\n} else {\n realHasInstance = function (object) {\n return object instanceof this;\n };\n}\n\nfunction Writable(options) {\n Duplex = Duplex || __webpack_require__(2836);\n\n // Writable ctor is applied to Duplexes, too.\n // `realHasInstance` is necessary because using plain `instanceof`\n // would return false, as no `_writableState` property is attached.\n\n // Trying to use the custom `instanceof` for Writable here will also break the\n // Node.js LazyTransform implementation, which has a non-trivial getter for\n // `_writableState` that would lead to infinite recursion.\n if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {\n return new Writable(options);\n }\n\n this._writableState = new WritableState(options, this);\n\n // legacy.\n this.writable = true;\n\n if (options) {\n if (typeof options.write === 'function') this._write = options.write;\n\n if (typeof options.writev === 'function') this._writev = options.writev;\n\n if (typeof options.destroy === 'function') this._destroy = options.destroy;\n\n if (typeof options.final === 'function') this._final = options.final;\n }\n\n Stream.call(this);\n}\n\n// Otherwise people can pipe Writable streams, which is just wrong.\nWritable.prototype.pipe = function () {\n this.emit('error', new Error('Cannot pipe, not readable'));\n};\n\nfunction writeAfterEnd(stream, cb) {\n var er = new Error('write after end');\n // TODO: defer error events consistently everywhere, not just the cb\n stream.emit('error', er);\n pna.nextTick(cb, er);\n}\n\n// Checks that a user-supplied chunk is valid, especially for the particular\n// mode the stream is in. Currently this means that `null` is never accepted\n// and undefined/non-string values are only allowed in object mode.\nfunction validChunk(stream, state, chunk, cb) {\n var valid = true;\n var er = false;\n\n if (chunk === null) {\n er = new TypeError('May not write null values to stream');\n } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n er = new TypeError('Invalid non-string/buffer chunk');\n }\n if (er) {\n stream.emit('error', er);\n pna.nextTick(cb, er);\n valid = false;\n }\n return valid;\n}\n\nWritable.prototype.write = function (chunk, encoding, cb) {\n var state = this._writableState;\n var ret = false;\n var isBuf = !state.objectMode && _isUint8Array(chunk);\n\n if (isBuf && !Buffer.isBuffer(chunk)) {\n chunk = _uint8ArrayToBuffer(chunk);\n }\n\n if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;\n\n if (typeof cb !== 'function') cb = nop;\n\n if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {\n state.pendingcb++;\n ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);\n }\n\n return ret;\n};\n\nWritable.prototype.cork = function () {\n var state = this._writableState;\n\n state.corked++;\n};\n\nWritable.prototype.uncork = function () {\n var state = this._writableState;\n\n if (state.corked) {\n state.corked--;\n\n if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);\n }\n};\n\nWritable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {\n // node::ParseEncoding() requires lower case.\n if (typeof encoding === 'string') encoding = encoding.toLowerCase();\n if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);\n this._writableState.defaultEncoding = encoding;\n return this;\n};\n\nfunction decodeChunk(state, chunk, encoding) {\n if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n return chunk;\n}\n\nObject.defineProperty(Writable.prototype, 'writableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function () {\n return this._writableState.highWaterMark;\n }\n});\n\n// if we're already writing something, then just put this\n// in the queue, and wait our turn. Otherwise, call _write\n// If we return false, then we need a drain event, so set that flag.\nfunction writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {\n if (!isBuf) {\n var newChunk = decodeChunk(state, chunk, encoding);\n if (chunk !== newChunk) {\n isBuf = true;\n encoding = 'buffer';\n chunk = newChunk;\n }\n }\n var len = state.objectMode ? 1 : chunk.length;\n\n state.length += len;\n\n var ret = state.length < state.highWaterMark;\n // we must ensure that previous needDrain will not be reset to false.\n if (!ret) state.needDrain = true;\n\n if (state.writing || state.corked) {\n var last = state.lastBufferedRequest;\n state.lastBufferedRequest = {\n chunk: chunk,\n encoding: encoding,\n isBuf: isBuf,\n callback: cb,\n next: null\n };\n if (last) {\n last.next = state.lastBufferedRequest;\n } else {\n state.bufferedRequest = state.lastBufferedRequest;\n }\n state.bufferedRequestCount += 1;\n } else {\n doWrite(stream, state, false, len, chunk, encoding, cb);\n }\n\n return ret;\n}\n\nfunction doWrite(stream, state, writev, len, chunk, encoding, cb) {\n state.writelen = len;\n state.writecb = cb;\n state.writing = true;\n state.sync = true;\n if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);\n state.sync = false;\n}\n\nfunction onwriteError(stream, state, sync, er, cb) {\n --state.pendingcb;\n\n if (sync) {\n // defer the callback if we are being called synchronously\n // to avoid piling up things on the stack\n pna.nextTick(cb, er);\n // this can emit finish, and it will always happen\n // after error\n pna.nextTick(finishMaybe, stream, state);\n stream._writableState.errorEmitted = true;\n stream.emit('error', er);\n } else {\n // the caller expect this to happen before if\n // it is async\n cb(er);\n stream._writableState.errorEmitted = true;\n stream.emit('error', er);\n // this can emit finish, but finish must\n // always follow error\n finishMaybe(stream, state);\n }\n}\n\nfunction onwriteStateUpdate(state) {\n state.writing = false;\n state.writecb = null;\n state.length -= state.writelen;\n state.writelen = 0;\n}\n\nfunction onwrite(stream, er) {\n var state = stream._writableState;\n var sync = state.sync;\n var cb = state.writecb;\n\n onwriteStateUpdate(state);\n\n if (er) onwriteError(stream, state, sync, er, cb);else {\n // Check if we're actually ready to finish, but don't emit yet\n var finished = needFinish(state);\n\n if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {\n clearBuffer(stream, state);\n }\n\n if (sync) {\n /**/\n asyncWrite(afterWrite, stream, state, finished, cb);\n /**/\n } else {\n afterWrite(stream, state, finished, cb);\n }\n }\n}\n\nfunction afterWrite(stream, state, finished, cb) {\n if (!finished) onwriteDrain(stream, state);\n state.pendingcb--;\n cb();\n finishMaybe(stream, state);\n}\n\n// Must force callback to be called on nextTick, so that we don't\n// emit 'drain' before the write() consumer gets the 'false' return\n// value, and has a chance to attach a 'drain' listener.\nfunction onwriteDrain(stream, state) {\n if (state.length === 0 && state.needDrain) {\n state.needDrain = false;\n stream.emit('drain');\n }\n}\n\n// if there's something in the buffer waiting, then process it\nfunction clearBuffer(stream, state) {\n state.bufferProcessing = true;\n var entry = state.bufferedRequest;\n\n if (stream._writev && entry && entry.next) {\n // Fast case, write everything using _writev()\n var l = state.bufferedRequestCount;\n var buffer = new Array(l);\n var holder = state.corkedRequestsFree;\n holder.entry = entry;\n\n var count = 0;\n var allBuffers = true;\n while (entry) {\n buffer[count] = entry;\n if (!entry.isBuf) allBuffers = false;\n entry = entry.next;\n count += 1;\n }\n buffer.allBuffers = allBuffers;\n\n doWrite(stream, state, true, state.length, buffer, '', holder.finish);\n\n // doWrite is almost always async, defer these to save a bit of time\n // as the hot path ends with doWrite\n state.pendingcb++;\n state.lastBufferedRequest = null;\n if (holder.next) {\n state.corkedRequestsFree = holder.next;\n holder.next = null;\n } else {\n state.corkedRequestsFree = new CorkedRequest(state);\n }\n state.bufferedRequestCount = 0;\n } else {\n // Slow case, write chunks one-by-one\n while (entry) {\n var chunk = entry.chunk;\n var encoding = entry.encoding;\n var cb = entry.callback;\n var len = state.objectMode ? 1 : chunk.length;\n\n doWrite(stream, state, false, len, chunk, encoding, cb);\n entry = entry.next;\n state.bufferedRequestCount--;\n // if we didn't call the onwrite immediately, then\n // it means that we need to wait until it does.\n // also, that means that the chunk and cb are currently\n // being processed, so move the buffer counter past them.\n if (state.writing) {\n break;\n }\n }\n\n if (entry === null) state.lastBufferedRequest = null;\n }\n\n state.bufferedRequest = entry;\n state.bufferProcessing = false;\n}\n\nWritable.prototype._write = function (chunk, encoding, cb) {\n cb(new Error('_write() is not implemented'));\n};\n\nWritable.prototype._writev = null;\n\nWritable.prototype.end = function (chunk, encoding, cb) {\n var state = this._writableState;\n\n if (typeof chunk === 'function') {\n cb = chunk;\n chunk = null;\n encoding = null;\n } else if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);\n\n // .end() fully uncorks\n if (state.corked) {\n state.corked = 1;\n this.uncork();\n }\n\n // ignore unnecessary end() calls.\n if (!state.ending) endWritable(this, state, cb);\n};\n\nfunction needFinish(state) {\n return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;\n}\nfunction callFinal(stream, state) {\n stream._final(function (err) {\n state.pendingcb--;\n if (err) {\n stream.emit('error', err);\n }\n state.prefinished = true;\n stream.emit('prefinish');\n finishMaybe(stream, state);\n });\n}\nfunction prefinish(stream, state) {\n if (!state.prefinished && !state.finalCalled) {\n if (typeof stream._final === 'function') {\n state.pendingcb++;\n state.finalCalled = true;\n pna.nextTick(callFinal, stream, state);\n } else {\n state.prefinished = true;\n stream.emit('prefinish');\n }\n }\n}\n\nfunction finishMaybe(stream, state) {\n var need = needFinish(state);\n if (need) {\n prefinish(stream, state);\n if (state.pendingcb === 0) {\n state.finished = true;\n stream.emit('finish');\n }\n }\n return need;\n}\n\nfunction endWritable(stream, state, cb) {\n state.ending = true;\n finishMaybe(stream, state);\n if (cb) {\n if (state.finished) pna.nextTick(cb);else stream.once('finish', cb);\n }\n state.ended = true;\n stream.writable = false;\n}\n\nfunction onCorkedFinish(corkReq, state, err) {\n var entry = corkReq.entry;\n corkReq.entry = null;\n while (entry) {\n var cb = entry.callback;\n state.pendingcb--;\n cb(err);\n entry = entry.next;\n }\n\n // reuse the free corkReq.\n state.corkedRequestsFree.next = corkReq;\n}\n\nObject.defineProperty(Writable.prototype, 'destroyed', {\n get: function () {\n if (this._writableState === undefined) {\n return false;\n }\n return this._writableState.destroyed;\n },\n set: function (value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (!this._writableState) {\n return;\n }\n\n // backward compatibility, the user is explicitly\n // managing destroyed\n this._writableState.destroyed = value;\n }\n});\n\nWritable.prototype.destroy = destroyImpl.destroy;\nWritable.prototype._undestroy = destroyImpl.undestroy;\nWritable.prototype._destroy = function (err, cb) {\n this.end();\n cb(err);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ5NC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYjs7QUFFQSxVQUFVLG1CQUFPLENBQUMsSUFBc0I7QUFDeEM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHlCQUF5QixtQkFBTyxDQUFDLElBQWM7QUFDL0MsZ0JBQWdCLG1CQUFPLENBQUMsSUFBVTtBQUNsQzs7QUFFQTtBQUNBO0FBQ0EsYUFBYSxtQkFBTyxDQUFDLElBQWdCO0FBQ3JDO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLG1CQUFPLENBQUMsSUFBMkI7QUFDaEQ7O0FBRUE7O0FBRUEsYUFBYSxrQ0FBNkI7QUFDMUMsOElBQThJO0FBQzlJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxrQkFBa0IsbUJBQU8sQ0FBQyxJQUE0Qjs7QUFFdEQ7O0FBRUE7O0FBRUE7QUFDQSxxQkFBcUIsbUJBQU8sQ0FBQyxJQUFrQjs7QUFFL0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaURBQWlELDBGQUEwRjs7QUFFM0k7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxJQUFJO0FBQ0osQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBcUIsbUJBQU8sQ0FBQyxJQUFrQjs7QUFFL0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlDQUFpQzs7QUFFakM7O0FBRUEsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsb0RBQW9EO0FBQ3BEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9sYXp5c3RyZWFtL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fd3JpdGFibGUuanM/YzcyZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gQSBiaXQgc2ltcGxlciB0aGFuIHJlYWRhYmxlIHN0cmVhbXMuXG4vLyBJbXBsZW1lbnQgYW4gYXN5bmMgLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIGNiKSwgYW5kIGl0J2xsIGhhbmRsZSBhbGxcbi8vIHRoZSBkcmFpbiBldmVudCBlbWlzc2lvbiBhbmQgYnVmZmVyaW5nLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBwbmEgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gV3JpdGFibGU7XG5cbi8qIDxyZXBsYWNlbWVudD4gKi9cbmZ1bmN0aW9uIFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5jaHVuayA9IGNodW5rO1xuICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHRoaXMuY2FsbGJhY2sgPSBjYjtcbiAgdGhpcy5uZXh0ID0gbnVsbDtcbn1cblxuLy8gSXQgc2VlbXMgYSBsaW5rZWQgbGlzdCBidXQgaXQgaXMgbm90XG4vLyB0aGVyZSB3aWxsIGJlIG9ubHkgMiBvZiB0aGVzZSBmb3IgZWFjaCBzdHJlYW1cbmZ1bmN0aW9uIENvcmtlZFJlcXVlc3Qoc3RhdGUpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB0aGlzLm5leHQgPSBudWxsO1xuICB0aGlzLmVudHJ5ID0gbnVsbDtcbiAgdGhpcy5maW5pc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgb25Db3JrZWRGaW5pc2goX3RoaXMsIHN0YXRlKTtcbiAgfTtcbn1cbi8qIDwvcmVwbGFjZW1lbnQ+ICovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgYXN5bmNXcml0ZSA9ICFwcm9jZXNzLmJyb3dzZXIgJiYgWyd2MC4xMCcsICd2MC45LiddLmluZGV4T2YocHJvY2Vzcy52ZXJzaW9uLnNsaWNlKDAsIDUpKSA+IC0xID8gc2V0SW1tZWRpYXRlIDogcG5hLm5leHRUaWNrO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRHVwbGV4O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbldyaXRhYmxlLldyaXRhYmxlU3RhdGUgPSBXcml0YWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSBPYmplY3QuY3JlYXRlKHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaW50ZXJuYWxVdGlsID0ge1xuICBkZXByZWNhdGU6IHJlcXVpcmUoJ3V0aWwtZGVwcmVjYXRlJylcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIE91clVpbnQ4QXJyYXkgPSAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fSkuVWludDhBcnJheSB8fCBmdW5jdGlvbiAoKSB7fTtcbmZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rKTtcbn1cbmZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5O1xufVxuXG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIGRlc3Ryb3lJbXBsID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3knKTtcblxudXRpbC5pbmhlcml0cyhXcml0YWJsZSwgU3RyZWFtKTtcblxuZnVuY3Rpb24gbm9wKCkge31cblxuZnVuY3Rpb24gV3JpdGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBEdXBsZXggc3RyZWFtcyBhcmUgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUsIGJ1dCBzaGFyZVxuICAvLyB0aGUgc2FtZSBvcHRpb25zIG9iamVjdC5cbiAgLy8gSG93ZXZlciwgc29tZSBjYXNlcyByZXF1aXJlIHNldHRpbmcgb3B0aW9ucyB0byBkaWZmZXJlbnRcbiAgLy8gdmFsdWVzIGZvciB0aGUgcmVhZGFibGUgYW5kIHRoZSB3cml0YWJsZSBzaWRlcyBvZiB0aGUgZHVwbGV4IHN0cmVhbS5cbiAgLy8gVGhlc2Ugb3B0aW9ucyBjYW4gYmUgcHJvdmlkZWQgc2VwYXJhdGVseSBhcyByZWFkYWJsZVhYWCBhbmQgd3JpdGFibGVYWFguXG4gIHZhciBpc0R1cGxleCA9IHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleDtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBzdHJlYW1cbiAgLy8gY29udGFpbnMgYnVmZmVycyBvciBvYmplY3RzLlxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoaXNEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMud3JpdGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCB3cml0ZSgpIHN0YXJ0cyByZXR1cm5pbmcgZmFsc2VcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyB0aGF0IHdlIGFsd2F5cyByZXR1cm4gZmFsc2UgaWZcbiAgLy8gdGhlIGVudGlyZSBidWZmZXIgaXMgbm90IGZsdXNoZWQgaW1tZWRpYXRlbHkgb24gd3JpdGUoKVxuICB2YXIgaHdtID0gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrO1xuICB2YXIgd3JpdGFibGVId20gPSBvcHRpb25zLndyaXRhYmxlSGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcblxuICBpZiAoaHdtIHx8IGh3bSA9PT0gMCkgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtO2Vsc2UgaWYgKGlzRHVwbGV4ICYmICh3cml0YWJsZUh3bSB8fCB3cml0YWJsZUh3bSA9PT0gMCkpIHRoaXMuaGlnaFdhdGVyTWFyayA9IHdyaXRhYmxlSHdtO2Vsc2UgdGhpcy5oaWdoV2F0ZXJNYXJrID0gZGVmYXVsdEh3bTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IE1hdGguZmxvb3IodGhpcy5oaWdoV2F0ZXJNYXJrKTtcblxuICAvLyBpZiBfZmluYWwgaGFzIGJlZW4gY2FsbGVkXG4gIHRoaXMuZmluYWxDYWxsZWQgPSBmYWxzZTtcblxuICAvLyBkcmFpbiBldmVudCBmbGFnLlxuICB0aGlzLm5lZWREcmFpbiA9IGZhbHNlO1xuICAvLyBhdCB0aGUgc3RhcnQgb2YgY2FsbGluZyBlbmQoKVxuICB0aGlzLmVuZGluZyA9IGZhbHNlO1xuICAvLyB3aGVuIGVuZCgpIGhhcyBiZWVuIGNhbGxlZCwgYW5kIHJldHVybmVkXG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgLy8gd2hlbiAnZmluaXNoJyBpcyBlbWl0dGVkXG4gIHRoaXMuZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBoYXMgaXQgYmVlbiBkZXN0cm95ZWRcbiAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcblxuICAvLyBzaG91bGQgd2UgZGVjb2RlIHN0cmluZ3MgaW50byBidWZmZXJzIGJlZm9yZSBwYXNzaW5nIHRvIF93cml0ZT9cbiAgLy8gdGhpcyBpcyBoZXJlIHNvIHRoYXQgc29tZSBub2RlLWNvcmUgc3RyZWFtcyBjYW4gb3B0aW1pemUgc3RyaW5nXG4gIC8vIGhhbmRsaW5nIGF0IGEgbG93ZXIgbGV2ZWwuXG4gIHZhciBub0RlY29kZSA9IG9wdGlvbnMuZGVjb2RlU3RyaW5ncyA9PT0gZmFsc2U7XG4gIHRoaXMuZGVjb2RlU3RyaW5ncyA9ICFub0RlY29kZTtcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JztcblxuICAvLyBub3QgYW4gYWN0dWFsIGJ1ZmZlciB3ZSBrZWVwIHRyYWNrIG9mLCBidXQgYSBtZWFzdXJlbWVudFxuICAvLyBvZiBob3cgbXVjaCB3ZSdyZSB3YWl0aW5nIHRvIGdldCBwdXNoZWQgdG8gc29tZSB1bmRlcmx5aW5nXG4gIC8vIHNvY2tldCBvciBmaWxlLlxuICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgLy8gYSBmbGFnIHRvIHNlZSB3aGVuIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSB3cml0ZS5cbiAgdGhpcy53cml0aW5nID0gZmFsc2U7XG5cbiAgLy8gd2hlbiB0cnVlIGFsbCB3cml0ZXMgd2lsbCBiZSBidWZmZXJlZCB1bnRpbCAudW5jb3JrKCkgY2FsbFxuICB0aGlzLmNvcmtlZCA9IDA7XG5cbiAgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgb253cml0ZSBjYiBpcyBjYWxsZWQgaW1tZWRpYXRlbHksXG4gIC8vIG9yIG9uIGEgbGF0ZXIgdGljay4gIFdlIHNldCB0aGlzIHRvIHRydWUgYXQgZmlyc3QsIGJlY2F1c2UgYW55XG4gIC8vIGFjdGlvbnMgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHVudGlsIFwibGF0ZXJcIiBzaG91bGQgZ2VuZXJhbGx5IGFsc29cbiAgLy8gbm90IGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gYSBmbGFnIHRvIGtub3cgaWYgd2UncmUgcHJvY2Vzc2luZyBwcmV2aW91c2x5IGJ1ZmZlcmVkIGl0ZW1zLCB3aGljaFxuICAvLyBtYXkgY2FsbCB0aGUgX3dyaXRlKCkgY2FsbGJhY2sgaW4gdGhlIHNhbWUgdGljaywgc28gdGhhdCB3ZSBkb24ndFxuICAvLyBlbmQgdXAgaW4gYW4gb3ZlcmxhcHBlZCBvbndyaXRlIHNpdHVhdGlvbi5cbiAgdGhpcy5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQncyBwYXNzZWQgdG8gX3dyaXRlKGNodW5rLGNiKVxuICB0aGlzLm9ud3JpdGUgPSBmdW5jdGlvbiAoZXIpIHtcbiAgICBvbndyaXRlKHN0cmVhbSwgZXIpO1xuICB9O1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0IHRoZSB1c2VyIHN1cHBsaWVzIHRvIHdyaXRlKGNodW5rLGVuY29kaW5nLGNiKVxuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuXG4gIC8vIHRoZSBhbW91bnQgdGhhdCBpcyBiZWluZyB3cml0dGVuIHdoZW4gX3dyaXRlIGlzIGNhbGxlZC5cbiAgdGhpcy53cml0ZWxlbiA9IDA7XG5cbiAgdGhpcy5idWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuXG4gIC8vIG51bWJlciBvZiBwZW5kaW5nIHVzZXItc3VwcGxpZWQgd3JpdGUgY2FsbGJhY2tzXG4gIC8vIHRoaXMgbXVzdCBiZSAwIGJlZm9yZSAnZmluaXNoJyBjYW4gYmUgZW1pdHRlZFxuICB0aGlzLnBlbmRpbmdjYiA9IDA7XG5cbiAgLy8gZW1pdCBwcmVmaW5pc2ggaWYgdGhlIG9ubHkgdGhpbmcgd2UncmUgd2FpdGluZyBmb3IgaXMgX3dyaXRlIGNic1xuICAvLyBUaGlzIGlzIHJlbGV2YW50IGZvciBzeW5jaHJvbm91cyBUcmFuc2Zvcm0gc3RyZWFtc1xuICB0aGlzLnByZWZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gVHJ1ZSBpZiB0aGUgZXJyb3Igd2FzIGFscmVhZHkgZW1pdHRlZCBhbmQgc2hvdWxkIG5vdCBiZSB0aHJvd24gYWdhaW5cbiAgdGhpcy5lcnJvckVtaXR0ZWQgPSBmYWxzZTtcblxuICAvLyBjb3VudCBidWZmZXJlZCByZXF1ZXN0c1xuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcblxuICAvLyBhbGxvY2F0ZSB0aGUgZmlyc3QgQ29ya2VkUmVxdWVzdCwgdGhlcmUgaXMgYWx3YXlzXG4gIC8vIG9uZSBhbGxvY2F0ZWQgYW5kIGZyZWUgdG8gdXNlLCBhbmQgd2UgbWFpbnRhaW4gYXQgbW9zdCB0d29cbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdCh0aGlzKTtcbn1cblxuV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUuZ2V0QnVmZmVyID0gZnVuY3Rpb24gZ2V0QnVmZmVyKCkge1xuICB2YXIgY3VycmVudCA9IHRoaXMuYnVmZmVyZWRSZXF1ZXN0O1xuICB2YXIgb3V0ID0gW107XG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgb3V0LnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgfVxuICByZXR1cm4gb3V0O1xufTtcblxuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUsICdidWZmZXInLCB7XG4gICAgICBnZXQ6IGludGVybmFsVXRpbC5kZXByZWNhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIH0sICdfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciAnICsgJ2luc3RlYWQuJywgJ0RFUDAwMDMnKVxuICAgIH0pO1xuICB9IGNhdGNoIChfKSB7fVxufSkoKTtcblxuLy8gVGVzdCBfd3JpdGFibGVTdGF0ZSBmb3IgaW5oZXJpdGFuY2UgdG8gYWNjb3VudCBmb3IgRHVwbGV4IHN0cmVhbXMsXG4vLyB3aG9zZSBwcm90b3R5cGUgY2hhaW4gb25seSBwb2ludHMgdG8gUmVhZGFibGUuXG52YXIgcmVhbEhhc0luc3RhbmNlO1xuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmhhc0luc3RhbmNlICYmIHR5cGVvZiBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXSA9PT0gJ2Z1bmN0aW9uJykge1xuICByZWFsSGFzSW5zdGFuY2UgPSBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLCBTeW1ib2wuaGFzSW5zdGFuY2UsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gKG9iamVjdCkge1xuICAgICAgaWYgKHJlYWxIYXNJbnN0YW5jZS5jYWxsKHRoaXMsIG9iamVjdCkpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHRoaXMgIT09IFdyaXRhYmxlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiBvYmplY3QgJiYgb2JqZWN0Ll93cml0YWJsZVN0YXRlIGluc3RhbmNlb2YgV3JpdGFibGVTdGF0ZTtcbiAgICB9XG4gIH0pO1xufSBlbHNlIHtcbiAgcmVhbEhhc0luc3RhbmNlID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiB0aGlzO1xuICB9O1xufVxuXG5mdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0b28uXG4gIC8vIGByZWFsSGFzSW5zdGFuY2VgIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHVzaW5nIHBsYWluIGBpbnN0YW5jZW9mYFxuICAvLyB3b3VsZCByZXR1cm4gZmFsc2UsIGFzIG5vIGBfd3JpdGFibGVTdGF0ZWAgcHJvcGVydHkgaXMgYXR0YWNoZWQuXG5cbiAgLy8gVHJ5aW5nIHRvIHVzZSB0aGUgY3VzdG9tIGBpbnN0YW5jZW9mYCBmb3IgV3JpdGFibGUgaGVyZSB3aWxsIGFsc28gYnJlYWsgdGhlXG4gIC8vIE5vZGUuanMgTGF6eVRyYW5zZm9ybSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaGFzIGEgbm9uLXRyaXZpYWwgZ2V0dGVyIGZvclxuICAvLyBgX3dyaXRhYmxlU3RhdGVgIHRoYXQgd291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uXG4gIGlmICghcmVhbEhhc0luc3RhbmNlLmNhbGwoV3JpdGFibGUsIHRoaXMpICYmICEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHtcbiAgICByZXR1cm4gbmV3IFdyaXRhYmxlKG9wdGlvbnMpO1xuICB9XG5cbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeS5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGUgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRlID0gb3B0aW9ucy53cml0ZTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZXYgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRldiA9IG9wdGlvbnMud3JpdGV2O1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHRoaXMuX2Rlc3Ryb3kgPSBvcHRpb25zLmRlc3Ryb3k7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmluYWwgPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZpbmFsID0gb3B0aW9ucy5maW5hbDtcbiAgfVxuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBPdGhlcndpc2UgcGVvcGxlIGNhbiBwaXBlIFdyaXRhYmxlIHN0cmVhbXMsIHdoaWNoIGlzIGp1c3Qgd3JvbmcuXG5Xcml0YWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZScpKTtcbn07XG5cbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBjYikge1xuICB2YXIgZXIgPSBuZXcgRXJyb3IoJ3dyaXRlIGFmdGVyIGVuZCcpO1xuICAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIHBuYS5uZXh0VGljayhjYiwgZXIpO1xufVxuXG4vLyBDaGVja3MgdGhhdCBhIHVzZXItc3VwcGxpZWQgY2h1bmsgaXMgdmFsaWQsIGVzcGVjaWFsbHkgZm9yIHRoZSBwYXJ0aWN1bGFyXG4vLyBtb2RlIHRoZSBzdHJlYW0gaXMgaW4uIEN1cnJlbnRseSB0aGlzIG1lYW5zIHRoYXQgYG51bGxgIGlzIG5ldmVyIGFjY2VwdGVkXG4vLyBhbmQgdW5kZWZpbmVkL25vbi1zdHJpbmcgdmFsdWVzIGFyZSBvbmx5IGFsbG93ZWQgaW4gb2JqZWN0IG1vZGUuXG5mdW5jdGlvbiB2YWxpZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBjYikge1xuICB2YXIgdmFsaWQgPSB0cnVlO1xuICB2YXIgZXIgPSBmYWxzZTtcblxuICBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ01heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtJyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgaWYgKGVyKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgIHBuYS5uZXh0VGljayhjYiwgZXIpO1xuICAgIHZhbGlkID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHZhbGlkO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuICB2YXIgcmV0ID0gZmFsc2U7XG4gIHZhciBpc0J1ZiA9ICFzdGF0ZS5vYmplY3RNb2RlICYmIF9pc1VpbnQ4QXJyYXkoY2h1bmspO1xuXG4gIGlmIChpc0J1ZiAmJiAhQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkge1xuICAgIGNodW5rID0gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuayk7XG4gIH1cblxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoaXNCdWYpIGVuY29kaW5nID0gJ2J1ZmZlcic7ZWxzZSBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcblxuICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSBjYiA9IG5vcDtcblxuICBpZiAoc3RhdGUuZW5kZWQpIHdyaXRlQWZ0ZXJFbmQodGhpcywgY2IpO2Vsc2UgaWYgKGlzQnVmIHx8IHZhbGlkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCBjYikpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICByZXQgPSB3cml0ZU9yQnVmZmVyKHRoaXMsIHN0YXRlLCBpc0J1ZiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgc3RhdGUuY29ya2VkKys7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQtLTtcblxuICAgIGlmICghc3RhdGUud3JpdGluZyAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkgY2xlYXJCdWZmZXIodGhpcywgc3RhdGUpO1xuICB9XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nID0gZnVuY3Rpb24gc2V0RGVmYXVsdEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIC8vIG5vZGU6OlBhcnNlRW5jb2RpbmcoKSByZXF1aXJlcyBsb3dlciBjYXNlLlxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykgZW5jb2RpbmcgPSBlbmNvZGluZy50b0xvd2VyQ2FzZSgpO1xuICBpZiAoIShbJ2hleCcsICd1dGY4JywgJ3V0Zi04JywgJ2FzY2lpJywgJ2JpbmFyeScsICdiYXNlNjQnLCAndWNzMicsICd1Y3MtMicsICd1dGYxNmxlJywgJ3V0Zi0xNmxlJywgJ3JhdyddLmluZGV4T2YoKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKCkpID4gLTEpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpO1xuICB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZyA9IGVuY29kaW5nO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpIHtcbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmIHN0YXRlLmRlY29kZVN0cmluZ3MgIT09IGZhbHNlICYmIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cbiAgcmV0dXJuIGNodW5rO1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnd3JpdGFibGVIaWdoV2F0ZXJNYXJrJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICB9XG59KTtcblxuLy8gaWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIHNvbWV0aGluZywgdGhlbiBqdXN0IHB1dCB0aGlzXG4vLyBpbiB0aGUgcXVldWUsIGFuZCB3YWl0IG91ciB0dXJuLiAgT3RoZXJ3aXNlLCBjYWxsIF93cml0ZVxuLy8gSWYgd2UgcmV0dXJuIGZhbHNlLCB0aGVuIHdlIG5lZWQgYSBkcmFpbiBldmVudCwgc28gc2V0IHRoYXQgZmxhZy5cbmZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgaXNCdWYsIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgaWYgKCFpc0J1Zikge1xuICAgIHZhciBuZXdDaHVuayA9IGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpO1xuICAgIGlmIChjaHVuayAhPT0gbmV3Q2h1bmspIHtcbiAgICAgIGlzQnVmID0gdHJ1ZTtcbiAgICAgIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gICAgICBjaHVuayA9IG5ld0NodW5rO1xuICAgIH1cbiAgfVxuICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgc3RhdGUubGVuZ3RoICs9IGxlbjtcblxuICB2YXIgcmV0ID0gc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgLy8gd2UgbXVzdCBlbnN1cmUgdGhhdCBwcmV2aW91cyBuZWVkRHJhaW4gd2lsbCBub3QgYmUgcmVzZXQgdG8gZmFsc2UuXG4gIGlmICghcmV0KSBzdGF0ZS5uZWVkRHJhaW4gPSB0cnVlO1xuXG4gIGlmIChzdGF0ZS53cml0aW5nIHx8IHN0YXRlLmNvcmtlZCkge1xuICAgIHZhciBsYXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0ge1xuICAgICAgY2h1bms6IGNodW5rLFxuICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nLFxuICAgICAgaXNCdWY6IGlzQnVmLFxuICAgICAgY2FsbGJhY2s6IGNiLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGxhc3QubmV4dCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSk7ZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSk7XG4gIHN0YXRlLnN5bmMgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYjtcblxuICBpZiAoc3luYykge1xuICAgIC8vIGRlZmVyIHRoZSBjYWxsYmFjayBpZiB3ZSBhcmUgYmVpbmcgY2FsbGVkIHN5bmNocm9ub3VzbHlcbiAgICAvLyB0byBhdm9pZCBwaWxpbmcgdXAgdGhpbmdzIG9uIHRoZSBzdGFja1xuICAgIHBuYS5uZXh0VGljayhjYiwgZXIpO1xuICAgIC8vIHRoaXMgY2FuIGVtaXQgZmluaXNoLCBhbmQgaXQgd2lsbCBhbHdheXMgaGFwcGVuXG4gICAgLy8gYWZ0ZXIgZXJyb3JcbiAgICBwbmEubmV4dFRpY2soZmluaXNoTWF5YmUsIHN0cmVhbSwgc3RhdGUpO1xuICAgIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB0aGUgY2FsbGVyIGV4cGVjdCB0aGlzIHRvIGhhcHBlbiBiZWZvcmUgaWZcbiAgICAvLyBpdCBpcyBhc3luY1xuICAgIGNiKGVyKTtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgLy8gdGhpcyBjYW4gZW1pdCBmaW5pc2gsIGJ1dCBmaW5pc2ggbXVzdFxuICAgIC8vIGFsd2F5cyBmb2xsb3cgZXJyb3JcbiAgICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpIHtcbiAgc3RhdGUud3JpdGluZyA9IGZhbHNlO1xuICBzdGF0ZS53cml0ZWNiID0gbnVsbDtcbiAgc3RhdGUubGVuZ3RoIC09IHN0YXRlLndyaXRlbGVuO1xuICBzdGF0ZS53cml0ZWxlbiA9IDA7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGUoc3RyZWFtLCBlcikge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciBzeW5jID0gc3RhdGUuc3luYztcbiAgdmFyIGNiID0gc3RhdGUud3JpdGVjYjtcblxuICBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpO1xuXG4gIGlmIChlcikgb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYik7ZWxzZSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgYWN0dWFsbHkgcmVhZHkgdG8gZmluaXNoLCBidXQgZG9uJ3QgZW1pdCB5ZXRcbiAgICB2YXIgZmluaXNoZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcblxuICAgIGlmICghZmluaXNoZWQgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIHtcbiAgICAgIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChzeW5jKSB7XG4gICAgICAvKjxyZXBsYWNlbWVudD4qL1xuICAgICAgYXN5bmNXcml0ZShhZnRlcldyaXRlLCBzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgICAgLyo8L3JlcGxhY2VtZW50PiovXG4gICAgfSBlbHNlIHtcbiAgICAgIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZCkgb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpO1xuICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgY2IoKTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbi8vIE11c3QgZm9yY2UgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIG5leHRUaWNrLCBzbyB0aGF0IHdlIGRvbid0XG4vLyBlbWl0ICdkcmFpbicgYmVmb3JlIHRoZSB3cml0ZSgpIGNvbnN1bWVyIGdldHMgdGhlICdmYWxzZScgcmV0dXJuXG4vLyB2YWx1ZSwgYW5kIGhhcyBhIGNoYW5jZSB0byBhdHRhY2ggYSAnZHJhaW4nIGxpc3RlbmVyLlxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufVxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuXG4gIGlmIChzdHJlYW0uX3dyaXRldiAmJiBlbnRyeSAmJiBlbnRyeS5uZXh0KSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBsID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsKTtcbiAgICB2YXIgaG9sZGVyID0gc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlO1xuICAgIGhvbGRlci5lbnRyeSA9IGVudHJ5O1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB2YXIgYWxsQnVmZmVycyA9IHRydWU7XG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICBidWZmZXJbY291bnRdID0gZW50cnk7XG4gICAgICBpZiAoIWVudHJ5LmlzQnVmKSBhbGxCdWZmZXJzID0gZmFsc2U7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICBjb3VudCArPSAxO1xuICAgIH1cbiAgICBidWZmZXIuYWxsQnVmZmVycyA9IGFsbEJ1ZmZlcnM7XG5cbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHRydWUsIHN0YXRlLmxlbmd0aCwgYnVmZmVyLCAnJywgaG9sZGVyLmZpbmlzaCk7XG5cbiAgICAvLyBkb1dyaXRlIGlzIGFsbW9zdCBhbHdheXMgYXN5bmMsIGRlZmVyIHRoZXNlIHRvIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgIC8vIGFzIHRoZSBob3QgcGF0aCBlbmRzIHdpdGggZG9Xcml0ZVxuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICAgIGlmIChob2xkZXIubmV4dCkge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gaG9sZGVyLm5leHQ7XG4gICAgICBob2xkZXIubmV4dCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHN0YXRlKTtcbiAgICB9XG4gICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFNsb3cgY2FzZSwgd3JpdGUgY2h1bmtzIG9uZS1ieS1vbmVcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIHZhciBjaHVuayA9IGVudHJ5LmNodW5rO1xuICAgICAgdmFyIGVuY29kaW5nID0gZW50cnkuZW5jb2Rpbmc7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICAgICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50LS07XG4gICAgICAvLyBpZiB3ZSBkaWRuJ3QgY2FsbCB0aGUgb253cml0ZSBpbW1lZGlhdGVseSwgdGhlblxuICAgICAgLy8gaXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXQgZG9lcy5cbiAgICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAgIC8vIGJlaW5nIHByb2Nlc3NlZCwgc28gbW92ZSB0aGUgYnVmZmVyIGNvdW50ZXIgcGFzdCB0aGVtLlxuICAgICAgaWYgKHN0YXRlLndyaXRpbmcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5ID09PSBudWxsKSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IGVudHJ5O1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihuZXcgRXJyb3IoJ193cml0ZSgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGV2ID0gbnVsbDtcblxuV3JpdGFibGUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gY2h1bms7XG4gICAgY2h1bmsgPSBudWxsO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkKSB0aGlzLndyaXRlKGNodW5rLCBlbmNvZGluZyk7XG5cbiAgLy8gLmVuZCgpIGZ1bGx5IHVuY29ya3NcbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZCA9IDE7XG4gICAgdGhpcy51bmNvcmsoKTtcbiAgfVxuXG4gIC8vIGlnbm9yZSB1bm5lY2Vzc2FyeSBlbmQoKSBjYWxscy5cbiAgaWYgKCFzdGF0ZS5lbmRpbmcpIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5lbmRpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLndyaXRpbmc7XG59XG5mdW5jdGlvbiBjYWxsRmluYWwoc3RyZWFtLCBzdGF0ZSkge1xuICBzdHJlYW0uX2ZpbmFsKGZ1bmN0aW9uIChlcnIpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgIH1cbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICAgIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQgJiYgIXN0YXRlLmZpbmFsQ2FsbGVkKSB7XG4gICAgaWYgKHR5cGVvZiBzdHJlYW0uX2ZpbmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICAgIHN0YXRlLmZpbmFsQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIHBuYS5uZXh0VGljayhjYWxsRmluYWwsIHN0cmVhbSwgc3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIG5lZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcbiAgaWYgKG5lZWQpIHtcbiAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgaWYgKHN0YXRlLnBlbmRpbmdjYiA9PT0gMCkge1xuICAgICAgc3RhdGUuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLmVtaXQoJ2ZpbmlzaCcpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmVlZDtcbn1cblxuZnVuY3Rpb24gZW5kV3JpdGFibGUoc3RyZWFtLCBzdGF0ZSwgY2IpIHtcbiAgc3RhdGUuZW5kaW5nID0gdHJ1ZTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChjYikge1xuICAgIGlmIChzdGF0ZS5maW5pc2hlZCkgcG5hLm5leHRUaWNrKGNiKTtlbHNlIHN0cmVhbS5vbmNlKCdmaW5pc2gnLCBjYik7XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb25Db3JrZWRGaW5pc2goY29ya1JlcSwgc3RhdGUsIGVycikge1xuICB2YXIgZW50cnkgPSBjb3JrUmVxLmVudHJ5O1xuICBjb3JrUmVxLmVudHJ5ID0gbnVsbDtcbiAgd2hpbGUgKGVudHJ5KSB7XG4gICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgY2IoZXJyKTtcbiAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gIH1cblxuICAvLyByZXVzZSB0aGUgZnJlZSBjb3JrUmVxLlxuICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IGNvcmtSZXE7XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZS5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAoIXRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5cbldyaXRhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveTtcbldyaXRhYmxlLnByb3RvdHlwZS5fdW5kZXN0cm95ID0gZGVzdHJveUltcGwudW5kZXN0cm95O1xuV3JpdGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdGhpcy5lbmQoKTtcbiAgY2IoZXJyKTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3494\n")},8979:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Buffer = (__webpack_require__(6509).Buffer);\nvar util = __webpack_require__(3837);\n\nfunction copyBuffer(src, target, offset) {\n src.copy(target, offset);\n}\n\nmodule.exports = function () {\n function BufferList() {\n _classCallCheck(this, BufferList);\n\n this.head = null;\n this.tail = null;\n this.length = 0;\n }\n\n BufferList.prototype.push = function push(v) {\n var entry = { data: v, next: null };\n if (this.length > 0) this.tail.next = entry;else this.head = entry;\n this.tail = entry;\n ++this.length;\n };\n\n BufferList.prototype.unshift = function unshift(v) {\n var entry = { data: v, next: this.head };\n if (this.length === 0) this.tail = entry;\n this.head = entry;\n ++this.length;\n };\n\n BufferList.prototype.shift = function shift() {\n if (this.length === 0) return;\n var ret = this.head.data;\n if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;\n --this.length;\n return ret;\n };\n\n BufferList.prototype.clear = function clear() {\n this.head = this.tail = null;\n this.length = 0;\n };\n\n BufferList.prototype.join = function join(s) {\n if (this.length === 0) return '';\n var p = this.head;\n var ret = '' + p.data;\n while (p = p.next) {\n ret += s + p.data;\n }return ret;\n };\n\n BufferList.prototype.concat = function concat(n) {\n if (this.length === 0) return Buffer.alloc(0);\n var ret = Buffer.allocUnsafe(n >>> 0);\n var p = this.head;\n var i = 0;\n while (p) {\n copyBuffer(p.data, ret, i);\n i += p.data.length;\n p = p.next;\n }\n return ret;\n };\n\n return BufferList;\n}();\n\nif (util && util.inspect && util.inspect.custom) {\n module.exports.prototype[util.inspect.custom] = function () {\n var obj = util.inspect({ length: this.length });\n return this.constructor.name + ' ' + obj;\n };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODk3OS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixrREFBa0QsMENBQTBDOztBQUU1RixhQUFhLGtDQUE2QjtBQUMxQyxXQUFXLG1CQUFPLENBQUMsSUFBTTs7QUFFekI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQixnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLDZCQUE2QixxQkFBcUI7QUFDbEQ7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvbGF6eXN0cmVhbS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL0J1ZmZlckxpc3QuanM/ZmU5ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG5mdW5jdGlvbiBjb3B5QnVmZmVyKHNyYywgdGFyZ2V0LCBvZmZzZXQpIHtcbiAgc3JjLmNvcHkodGFyZ2V0LCBvZmZzZXQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQnVmZmVyTGlzdCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQnVmZmVyTGlzdCk7XG5cbiAgICB0aGlzLmhlYWQgPSBudWxsO1xuICAgIHRoaXMudGFpbCA9IG51bGw7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIHB1c2godikge1xuICAgIHZhciBlbnRyeSA9IHsgZGF0YTogdiwgbmV4dDogbnVsbCB9O1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IDApIHRoaXMudGFpbC5uZXh0ID0gZW50cnk7ZWxzZSB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgICB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgICArK3RoaXMubGVuZ3RoO1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiB1bnNoaWZ0KHYpIHtcbiAgICB2YXIgZW50cnkgPSB7IGRhdGE6IHYsIG5leHQ6IHRoaXMuaGVhZCB9O1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgdGhpcy50YWlsID0gZW50cnk7XG4gICAgdGhpcy5oZWFkID0gZW50cnk7XG4gICAgKyt0aGlzLmxlbmd0aDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5zaGlmdCA9IGZ1bmN0aW9uIHNoaWZ0KCkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHZhciByZXQgPSB0aGlzLmhlYWQuZGF0YTtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEpIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7ZWxzZSB0aGlzLmhlYWQgPSB0aGlzLmhlYWQubmV4dDtcbiAgICAtLXRoaXMubGVuZ3RoO1xuICAgIHJldHVybiByZXQ7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24gam9pbihzKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gICAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gICAgdmFyIHJldCA9ICcnICsgcC5kYXRhO1xuICAgIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgICByZXQgKz0gcyArIHAuZGF0YTtcbiAgICB9cmV0dXJuIHJldDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQobikge1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgICB2YXIgcmV0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG4gPj4+IDApO1xuICAgIHZhciBwID0gdGhpcy5oZWFkO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAocCkge1xuICAgICAgY29weUJ1ZmZlcihwLmRhdGEsIHJldCwgaSk7XG4gICAgICBpICs9IHAuZGF0YS5sZW5ndGg7XG4gICAgICBwID0gcC5uZXh0O1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9O1xuXG4gIHJldHVybiBCdWZmZXJMaXN0O1xufSgpO1xuXG5pZiAodXRpbCAmJiB1dGlsLmluc3BlY3QgJiYgdXRpbC5pbnNwZWN0LmN1c3RvbSkge1xuICBtb2R1bGUuZXhwb3J0cy5wcm90b3R5cGVbdXRpbC5pbnNwZWN0LmN1c3RvbV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG9iaiA9IHV0aWwuaW5zcGVjdCh7IGxlbmd0aDogdGhpcy5sZW5ndGggfSk7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZSArICcgJyArIG9iajtcbiAgfTtcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8979\n")},4201:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\n/**/\n\nvar pna = __webpack_require__(8212);\n/**/\n\n// undocumented cb() API, needed for core, not for public API\nfunction destroy(err, cb) {\n var _this = this;\n\n var readableDestroyed = this._readableState && this._readableState.destroyed;\n var writableDestroyed = this._writableState && this._writableState.destroyed;\n\n if (readableDestroyed || writableDestroyed) {\n if (cb) {\n cb(err);\n } else if (err) {\n if (!this._writableState) {\n pna.nextTick(emitErrorNT, this, err);\n } else if (!this._writableState.errorEmitted) {\n this._writableState.errorEmitted = true;\n pna.nextTick(emitErrorNT, this, err);\n }\n }\n\n return this;\n }\n\n // we set destroyed to true before firing error callbacks in order\n // to make it re-entrance safe in case destroy() is called within callbacks\n\n if (this._readableState) {\n this._readableState.destroyed = true;\n }\n\n // if this is a duplex stream mark the writable part as destroyed as well\n if (this._writableState) {\n this._writableState.destroyed = true;\n }\n\n this._destroy(err || null, function (err) {\n if (!cb && err) {\n if (!_this._writableState) {\n pna.nextTick(emitErrorNT, _this, err);\n } else if (!_this._writableState.errorEmitted) {\n _this._writableState.errorEmitted = true;\n pna.nextTick(emitErrorNT, _this, err);\n }\n } else if (cb) {\n cb(err);\n }\n });\n\n return this;\n}\n\nfunction undestroy() {\n if (this._readableState) {\n this._readableState.destroyed = false;\n this._readableState.reading = false;\n this._readableState.ended = false;\n this._readableState.endEmitted = false;\n }\n\n if (this._writableState) {\n this._writableState.destroyed = false;\n this._writableState.ended = false;\n this._writableState.ending = false;\n this._writableState.finalCalled = false;\n this._writableState.prefinished = false;\n this._writableState.finished = false;\n this._writableState.errorEmitted = false;\n }\n}\n\nfunction emitErrorNT(self, err) {\n self.emit('error', err);\n}\n\nmodule.exports = {\n destroy: destroy,\n undestroy: undestroy\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIwMS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjs7QUFFQSxVQUFVLG1CQUFPLENBQUMsSUFBc0I7QUFDeEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9sYXp5c3RyZWFtL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveS5qcz9iYzZjIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHBuYSA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLy8gdW5kb2N1bWVudGVkIGNiKCkgQVBJLCBuZWVkZWQgZm9yIGNvcmUsIG5vdCBmb3IgcHVibGljIEFQSVxuZnVuY3Rpb24gZGVzdHJveShlcnIsIGNiKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdmFyIHJlYWRhYmxlRGVzdHJveWVkID0gdGhpcy5fcmVhZGFibGVTdGF0ZSAmJiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgdmFyIHdyaXRhYmxlRGVzdHJveWVkID0gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcblxuICBpZiAocmVhZGFibGVEZXN0cm95ZWQgfHwgd3JpdGFibGVEZXN0cm95ZWQpIHtcbiAgICBpZiAoY2IpIHtcbiAgICAgIGNiKGVycik7XG4gICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgIGlmICghdGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgICAgICBwbmEubmV4dFRpY2soZW1pdEVycm9yTlQsIHRoaXMsIGVycik7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCkge1xuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgICAgIHBuYS5uZXh0VGljayhlbWl0RXJyb3JOVCwgdGhpcywgZXJyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHdlIHNldCBkZXN0cm95ZWQgdG8gdHJ1ZSBiZWZvcmUgZmlyaW5nIGVycm9yIGNhbGxiYWNrcyBpbiBvcmRlclxuICAvLyB0byBtYWtlIGl0IHJlLWVudHJhbmNlIHNhZmUgaW4gY2FzZSBkZXN0cm95KCkgaXMgY2FsbGVkIHdpdGhpbiBjYWxsYmFja3NcblxuICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIGlmIHRoaXMgaXMgYSBkdXBsZXggc3RyZWFtIG1hcmsgdGhlIHdyaXRhYmxlIHBhcnQgYXMgZGVzdHJveWVkIGFzIHdlbGxcbiAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHRydWU7XG4gIH1cblxuICB0aGlzLl9kZXN0cm95KGVyciB8fCBudWxsLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKCFjYiAmJiBlcnIpIHtcbiAgICAgIGlmICghX3RoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgICAgcG5hLm5leHRUaWNrKGVtaXRFcnJvck5ULCBfdGhpcywgZXJyKTtcbiAgICAgIH0gZWxzZSBpZiAoIV90aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCkge1xuICAgICAgICBfdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgICAgICBwbmEubmV4dFRpY2soZW1pdEVycm9yTlQsIF90aGlzLCBlcnIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2IpIHtcbiAgICAgIGNiKGVycik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdGhpcztcbn1cblxuZnVuY3Rpb24gdW5kZXN0cm95KCkge1xuICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluYWxDYWxsZWQgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLnByZWZpbmlzaGVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdEVycm9yTlQoc2VsZiwgZXJyKSB7XG4gIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZGVzdHJveTogZGVzdHJveSxcbiAgdW5kZXN0cm95OiB1bmRlc3Ryb3lcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4201\n")},2300:(module,__unused_webpack_exports,__webpack_require__)=>{eval("module.exports = __webpack_require__(2781);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMwMC5qcyIsIm1hcHBpbmdzIjoiQUFBQSwwQ0FBa0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9sYXp5c3RyZWFtL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtLmpzPzdhODYiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdzdHJlYW0nKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2300\n")},2209:(module,__unused_webpack_exports,__webpack_require__)=>{eval("module.exports = __webpack_require__(3485).PassThrough\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIwOS5qcyIsIm1hcHBpbmdzIjoiQUFBQSxzREFBa0QiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9sYXp5c3RyZWFtL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcGFzc3Rocm91Z2guanM/YTQ2MyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vcmVhZGFibGUnKS5QYXNzVGhyb3VnaFxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2209\n")},3485:(module,exports,__webpack_require__)=>{eval("var Stream = __webpack_require__(2781);\nif (process.env.READABLE_STREAM === 'disable' && Stream) {\n module.exports = Stream;\n exports = module.exports = Stream.Readable;\n exports.Readable = Stream.Readable;\n exports.Writable = Stream.Writable;\n exports.Duplex = Stream.Duplex;\n exports.Transform = Stream.Transform;\n exports.PassThrough = Stream.PassThrough;\n exports.Stream = Stream;\n} else {\n exports = module.exports = __webpack_require__(1143);\n exports.Stream = Stream || exports;\n exports.Readable = exports;\n exports.Writable = __webpack_require__(3494);\n exports.Duplex = __webpack_require__(2836);\n exports.Transform = __webpack_require__(7628);\n exports.PassThrough = __webpack_require__(8407);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ4NS5qcyIsIm1hcHBpbmdzIjoiQUFBQSxhQUFhLG1CQUFPLENBQUMsSUFBUTtBQUM3QjtBQUNBO0FBQ0E7QUFDQSxFQUFFLGdCQUFnQjtBQUNsQixFQUFFLGdCQUFnQjtBQUNsQixFQUFFLGNBQWM7QUFDaEIsRUFBRSxpQkFBaUI7QUFDbkIsRUFBRSxtQkFBbUI7QUFDckIsRUFBRSxjQUFjO0FBQ2hCLEVBQUU7QUFDRixZQUFZLDBDQUFxRDtBQUNqRSxFQUFFLGNBQWM7QUFDaEIsRUFBRSxnQkFBZ0I7QUFDbEIsRUFBRSw0Q0FBdUQ7QUFDekQsRUFBRSwwQ0FBbUQ7QUFDckQsRUFBRSw2Q0FBeUQ7QUFDM0QsRUFBRSwrQ0FBNkQ7QUFDL0QiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9sYXp5c3RyZWFtL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUuanM/MTg3NyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5pZiAocHJvY2Vzcy5lbnYuUkVBREFCTEVfU1RSRUFNID09PSAnZGlzYWJsZScgJiYgU3RyZWFtKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gU3RyZWFtO1xuICBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBTdHJlYW0uUmVhZGFibGU7XG4gIGV4cG9ydHMuUmVhZGFibGUgPSBTdHJlYW0uUmVhZGFibGU7XG4gIGV4cG9ydHMuV3JpdGFibGUgPSBTdHJlYW0uV3JpdGFibGU7XG4gIGV4cG9ydHMuRHVwbGV4ID0gU3RyZWFtLkR1cGxleDtcbiAgZXhwb3J0cy5UcmFuc2Zvcm0gPSBTdHJlYW0uVHJhbnNmb3JtO1xuICBleHBvcnRzLlBhc3NUaHJvdWdoID0gU3RyZWFtLlBhc3NUaHJvdWdoO1xuICBleHBvcnRzLlN0cmVhbSA9IFN0cmVhbTtcbn0gZWxzZSB7XG4gIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcmVhZGFibGUuanMnKTtcbiAgZXhwb3J0cy5TdHJlYW0gPSBTdHJlYW0gfHwgZXhwb3J0cztcbiAgZXhwb3J0cy5SZWFkYWJsZSA9IGV4cG9ydHM7XG4gIGV4cG9ydHMuV3JpdGFibGUgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzJyk7XG4gIGV4cG9ydHMuRHVwbGV4ID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9kdXBsZXguanMnKTtcbiAgZXhwb3J0cy5UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcycpO1xuICBleHBvcnRzLlBhc3NUaHJvdWdoID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qcycpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3485\n")},6509:(module,exports,__webpack_require__)=>{eval("/* eslint-disable node/no-deprecated-api */\nvar buffer = __webpack_require__(4300)\nvar Buffer = buffer.Buffer\n\n// alternative to using Object.keys for old browsers\nfunction copyProps (src, dst) {\n for (var key in src) {\n dst[key] = src[key]\n }\n}\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n module.exports = buffer\n} else {\n // Copy properties from require('buffer')\n copyProps(buffer, exports)\n exports.Buffer = SafeBuffer\n}\n\nfunction SafeBuffer (arg, encodingOrOffset, length) {\n return Buffer(arg, encodingOrOffset, length)\n}\n\n// Copy static methods from Buffer\ncopyProps(Buffer, SafeBuffer)\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n if (typeof arg === 'number') {\n throw new TypeError('Argument must not be a number')\n }\n return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n var buf = Buffer(size)\n if (fill !== undefined) {\n if (typeof encoding === 'string') {\n buf.fill(fill, encoding)\n } else {\n buf.fill(fill)\n }\n } else {\n buf.fill(0)\n }\n return buf\n}\n\nSafeBuffer.allocUnsafe = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return Buffer(size)\n}\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return buffer.SlowBuffer(size)\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjUwOS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBLGFBQWEsbUJBQU8sQ0FBQyxJQUFRO0FBQzdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUUsY0FBYztBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9sYXp5c3RyZWFtL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcz8yYjNlIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cbnZhciBidWZmZXIgPSByZXF1aXJlKCdidWZmZXInKVxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXJcblxuLy8gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgT2JqZWN0LmtleXMgZm9yIG9sZCBicm93c2Vyc1xuZnVuY3Rpb24gY29weVByb3BzIChzcmMsIGRzdCkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgZHN0W2tleV0gPSBzcmNba2V5XVxuICB9XG59XG5pZiAoQnVmZmVyLmZyb20gJiYgQnVmZmVyLmFsbG9jICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZSAmJiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KSB7XG4gIG1vZHVsZS5leHBvcnRzID0gYnVmZmVyXG59IGVsc2Uge1xuICAvLyBDb3B5IHByb3BlcnRpZXMgZnJvbSByZXF1aXJlKCdidWZmZXInKVxuICBjb3B5UHJvcHMoYnVmZmVyLCBleHBvcnRzKVxuICBleHBvcnRzLkJ1ZmZlciA9IFNhZmVCdWZmZXJcbn1cblxuZnVuY3Rpb24gU2FmZUJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gQ29weSBzdGF0aWMgbWV0aG9kcyBmcm9tIEJ1ZmZlclxuY29weVByb3BzKEJ1ZmZlciwgU2FmZUJ1ZmZlcilcblxuU2FmZUJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJ1Zi5maWxsKDApXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoc2l6ZSlcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5TbG93QnVmZmVyKHNpemUpXG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6509\n")},1067:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\n/**/\n\nvar Buffer = (__webpack_require__(6509).Buffer);\n/**/\n\nvar isEncoding = Buffer.isEncoding || function (encoding) {\n encoding = '' + encoding;\n switch (encoding && encoding.toLowerCase()) {\n case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':\n return true;\n default:\n return false;\n }\n};\n\nfunction _normalizeEncoding(enc) {\n if (!enc) return 'utf8';\n var retried;\n while (true) {\n switch (enc) {\n case 'utf8':\n case 'utf-8':\n return 'utf8';\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return 'utf16le';\n case 'latin1':\n case 'binary':\n return 'latin1';\n case 'base64':\n case 'ascii':\n case 'hex':\n return enc;\n default:\n if (retried) return; // undefined\n enc = ('' + enc).toLowerCase();\n retried = true;\n }\n }\n};\n\n// Do not cache `Buffer.isEncoding` when checking encoding names as some\n// modules monkey-patch it to support additional encodings\nfunction normalizeEncoding(enc) {\n var nenc = _normalizeEncoding(enc);\n if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);\n return nenc || enc;\n}\n\n// StringDecoder provides an interface for efficiently splitting a series of\n// buffers into a series of JS strings without breaking apart multi-byte\n// characters.\nexports.s = StringDecoder;\nfunction StringDecoder(encoding) {\n this.encoding = normalizeEncoding(encoding);\n var nb;\n switch (this.encoding) {\n case 'utf16le':\n this.text = utf16Text;\n this.end = utf16End;\n nb = 4;\n break;\n case 'utf8':\n this.fillLast = utf8FillLast;\n nb = 4;\n break;\n case 'base64':\n this.text = base64Text;\n this.end = base64End;\n nb = 3;\n break;\n default:\n this.write = simpleWrite;\n this.end = simpleEnd;\n return;\n }\n this.lastNeed = 0;\n this.lastTotal = 0;\n this.lastChar = Buffer.allocUnsafe(nb);\n}\n\nStringDecoder.prototype.write = function (buf) {\n if (buf.length === 0) return '';\n var r;\n var i;\n if (this.lastNeed) {\n r = this.fillLast(buf);\n if (r === undefined) return '';\n i = this.lastNeed;\n this.lastNeed = 0;\n } else {\n i = 0;\n }\n if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);\n return r || '';\n};\n\nStringDecoder.prototype.end = utf8End;\n\n// Returns only complete characters in a Buffer\nStringDecoder.prototype.text = utf8Text;\n\n// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer\nStringDecoder.prototype.fillLast = function (buf) {\n if (this.lastNeed <= buf.length) {\n buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);\n return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n }\n buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);\n this.lastNeed -= buf.length;\n};\n\n// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a\n// continuation byte. If an invalid byte is detected, -2 is returned.\nfunction utf8CheckByte(byte) {\n if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;\n return byte >> 6 === 0x02 ? -1 : -2;\n}\n\n// Checks at most 3 bytes at the end of a Buffer in order to detect an\n// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)\n// needed to complete the UTF-8 character (if applicable) are returned.\nfunction utf8CheckIncomplete(self, buf, i) {\n var j = buf.length - 1;\n if (j < i) return 0;\n var nb = utf8CheckByte(buf[j]);\n if (nb >= 0) {\n if (nb > 0) self.lastNeed = nb - 1;\n return nb;\n }\n if (--j < i || nb === -2) return 0;\n nb = utf8CheckByte(buf[j]);\n if (nb >= 0) {\n if (nb > 0) self.lastNeed = nb - 2;\n return nb;\n }\n if (--j < i || nb === -2) return 0;\n nb = utf8CheckByte(buf[j]);\n if (nb >= 0) {\n if (nb > 0) {\n if (nb === 2) nb = 0;else self.lastNeed = nb - 3;\n }\n return nb;\n }\n return 0;\n}\n\n// Validates as many continuation bytes for a multi-byte UTF-8 character as\n// needed or are available. If we see a non-continuation byte where we expect\n// one, we \"replace\" the validated continuation bytes we've seen so far with\n// a single UTF-8 replacement character ('\\ufffd'), to match v8's UTF-8 decoding\n// behavior. The continuation byte check is included three times in the case\n// where all of the continuation bytes for a character exist in the same buffer.\n// It is also done this way as a slight performance increase instead of using a\n// loop.\nfunction utf8CheckExtraBytes(self, buf, p) {\n if ((buf[0] & 0xC0) !== 0x80) {\n self.lastNeed = 0;\n return '\\ufffd';\n }\n if (self.lastNeed > 1 && buf.length > 1) {\n if ((buf[1] & 0xC0) !== 0x80) {\n self.lastNeed = 1;\n return '\\ufffd';\n }\n if (self.lastNeed > 2 && buf.length > 2) {\n if ((buf[2] & 0xC0) !== 0x80) {\n self.lastNeed = 2;\n return '\\ufffd';\n }\n }\n }\n}\n\n// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.\nfunction utf8FillLast(buf) {\n var p = this.lastTotal - this.lastNeed;\n var r = utf8CheckExtraBytes(this, buf, p);\n if (r !== undefined) return r;\n if (this.lastNeed <= buf.length) {\n buf.copy(this.lastChar, p, 0, this.lastNeed);\n return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n }\n buf.copy(this.lastChar, p, 0, buf.length);\n this.lastNeed -= buf.length;\n}\n\n// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a\n// partial character, the character's bytes are buffered until the required\n// number of bytes are available.\nfunction utf8Text(buf, i) {\n var total = utf8CheckIncomplete(this, buf, i);\n if (!this.lastNeed) return buf.toString('utf8', i);\n this.lastTotal = total;\n var end = buf.length - (total - this.lastNeed);\n buf.copy(this.lastChar, 0, end);\n return buf.toString('utf8', i, end);\n}\n\n// For UTF-8, a replacement character is added when ending on a partial\n// character.\nfunction utf8End(buf) {\n var r = buf && buf.length ? this.write(buf) : '';\n if (this.lastNeed) return r + '\\ufffd';\n return r;\n}\n\n// UTF-16LE typically needs two bytes per character, but even if we have an even\n// number of bytes available, we need to check if we end on a leading/high\n// surrogate. In that case, we need to wait for the next two bytes in order to\n// decode the last character properly.\nfunction utf16Text(buf, i) {\n if ((buf.length - i) % 2 === 0) {\n var r = buf.toString('utf16le', i);\n if (r) {\n var c = r.charCodeAt(r.length - 1);\n if (c >= 0xD800 && c <= 0xDBFF) {\n this.lastNeed = 2;\n this.lastTotal = 4;\n this.lastChar[0] = buf[buf.length - 2];\n this.lastChar[1] = buf[buf.length - 1];\n return r.slice(0, -1);\n }\n }\n return r;\n }\n this.lastNeed = 1;\n this.lastTotal = 2;\n this.lastChar[0] = buf[buf.length - 1];\n return buf.toString('utf16le', i, buf.length - 1);\n}\n\n// For UTF-16LE we do not explicitly append special replacement characters if we\n// end on a partial character, we simply let v8 handle that.\nfunction utf16End(buf) {\n var r = buf && buf.length ? this.write(buf) : '';\n if (this.lastNeed) {\n var end = this.lastTotal - this.lastNeed;\n return r + this.lastChar.toString('utf16le', 0, end);\n }\n return r;\n}\n\nfunction base64Text(buf, i) {\n var n = (buf.length - i) % 3;\n if (n === 0) return buf.toString('base64', i);\n this.lastNeed = 3 - n;\n this.lastTotal = 3;\n if (n === 1) {\n this.lastChar[0] = buf[buf.length - 1];\n } else {\n this.lastChar[0] = buf[buf.length - 2];\n this.lastChar[1] = buf[buf.length - 1];\n }\n return buf.toString('base64', i, buf.length - n);\n}\n\nfunction base64End(buf) {\n var r = buf && buf.length ? this.write(buf) : '';\n if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);\n return r;\n}\n\n// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)\nfunction simpleWrite(buf) {\n return buf.toString(this.encoding);\n}\n\nfunction simpleEnd(buf) {\n return buf && buf.length ? this.write(buf) : '';\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA2Ny5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViOztBQUVBLGFBQWEsa0NBQTZCO0FBQzFDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLHNDQUFzQyxzQ0FBc0M7QUFDekc7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvbGF6eXN0cmVhbS9ub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvbGliL3N0cmluZ19kZWNvZGVyLmpzPzI3YWEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBpc0VuY29kaW5nID0gQnVmZmVyLmlzRW5jb2RpbmcgfHwgZnVuY3Rpb24gKGVuY29kaW5nKSB7XG4gIGVuY29kaW5nID0gJycgKyBlbmNvZGluZztcbiAgc3dpdGNoIChlbmNvZGluZyAmJiBlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpjYXNlICd1dGY4JzpjYXNlICd1dGYtOCc6Y2FzZSAnYXNjaWknOmNhc2UgJ2JpbmFyeSc6Y2FzZSAnYmFzZTY0JzpjYXNlICd1Y3MyJzpjYXNlICd1Y3MtMic6Y2FzZSAndXRmMTZsZSc6Y2FzZSAndXRmLTE2bGUnOmNhc2UgJ3Jhdyc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBfbm9ybWFsaXplRW5jb2RpbmcoZW5jKSB7XG4gIGlmICghZW5jKSByZXR1cm4gJ3V0ZjgnO1xuICB2YXIgcmV0cmllZDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuYykge1xuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiAndXRmOCc7XG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gJ3V0ZjE2bGUnO1xuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiAnbGF0aW4xJztcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gZW5jO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHJldHJpZWQpIHJldHVybjsgLy8gdW5kZWZpbmVkXG4gICAgICAgIGVuYyA9ICgnJyArIGVuYykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0cmllZCA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG4vLyBEbyBub3QgY2FjaGUgYEJ1ZmZlci5pc0VuY29kaW5nYCB3aGVuIGNoZWNraW5nIGVuY29kaW5nIG5hbWVzIGFzIHNvbWVcbi8vIG1vZHVsZXMgbW9ua2V5LXBhdGNoIGl0IHRvIHN1cHBvcnQgYWRkaXRpb25hbCBlbmNvZGluZ3NcbmZ1bmN0aW9uIG5vcm1hbGl6ZUVuY29kaW5nKGVuYykge1xuICB2YXIgbmVuYyA9IF9ub3JtYWxpemVFbmNvZGluZyhlbmMpO1xuICBpZiAodHlwZW9mIG5lbmMgIT09ICdzdHJpbmcnICYmIChCdWZmZXIuaXNFbmNvZGluZyA9PT0gaXNFbmNvZGluZyB8fCAhaXNFbmNvZGluZyhlbmMpKSkgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jKTtcbiAgcmV0dXJuIG5lbmMgfHwgZW5jO1xufVxuXG4vLyBTdHJpbmdEZWNvZGVyIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgZWZmaWNpZW50bHkgc3BsaXR0aW5nIGEgc2VyaWVzIG9mXG4vLyBidWZmZXJzIGludG8gYSBzZXJpZXMgb2YgSlMgc3RyaW5ncyB3aXRob3V0IGJyZWFraW5nIGFwYXJ0IG11bHRpLWJ5dGVcbi8vIGNoYXJhY3RlcnMuXG5leHBvcnRzLlN0cmluZ0RlY29kZXIgPSBTdHJpbmdEZWNvZGVyO1xuZnVuY3Rpb24gU3RyaW5nRGVjb2RlcihlbmNvZGluZykge1xuICB0aGlzLmVuY29kaW5nID0gbm9ybWFsaXplRW5jb2RpbmcoZW5jb2RpbmcpO1xuICB2YXIgbmI7XG4gIHN3aXRjaCAodGhpcy5lbmNvZGluZykge1xuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgdGhpcy50ZXh0ID0gdXRmMTZUZXh0O1xuICAgICAgdGhpcy5lbmQgPSB1dGYxNkVuZDtcbiAgICAgIG5iID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgdGhpcy5maWxsTGFzdCA9IHV0ZjhGaWxsTGFzdDtcbiAgICAgIG5iID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICB0aGlzLnRleHQgPSBiYXNlNjRUZXh0O1xuICAgICAgdGhpcy5lbmQgPSBiYXNlNjRFbmQ7XG4gICAgICBuYiA9IDM7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhpcy53cml0ZSA9IHNpbXBsZVdyaXRlO1xuICAgICAgdGhpcy5lbmQgPSBzaW1wbGVFbmQ7XG4gICAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5sYXN0TmVlZCA9IDA7XG4gIHRoaXMubGFzdFRvdGFsID0gMDtcbiAgdGhpcy5sYXN0Q2hhciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuYik7XG59XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGJ1Zikge1xuICBpZiAoYnVmLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICB2YXIgcjtcbiAgdmFyIGk7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSB7XG4gICAgciA9IHRoaXMuZmlsbExhc3QoYnVmKTtcbiAgICBpZiAociA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJyc7XG4gICAgaSA9IHRoaXMubGFzdE5lZWQ7XG4gICAgdGhpcy5sYXN0TmVlZCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgaSA9IDA7XG4gIH1cbiAgaWYgKGkgPCBidWYubGVuZ3RoKSByZXR1cm4gciA/IHIgKyB0aGlzLnRleHQoYnVmLCBpKSA6IHRoaXMudGV4dChidWYsIGkpO1xuICByZXR1cm4gciB8fCAnJztcbn07XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZCA9IHV0ZjhFbmQ7XG5cbi8vIFJldHVybnMgb25seSBjb21wbGV0ZSBjaGFyYWN0ZXJzIGluIGEgQnVmZmVyXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS50ZXh0ID0gdXRmOFRleHQ7XG5cbi8vIEF0dGVtcHRzIHRvIGNvbXBsZXRlIGEgcGFydGlhbCBub24tVVRGLTggY2hhcmFjdGVyIHVzaW5nIGJ5dGVzIGZyb20gYSBCdWZmZXJcblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmZpbGxMYXN0ID0gZnVuY3Rpb24gKGJ1Zikge1xuICBpZiAodGhpcy5sYXN0TmVlZCA8PSBidWYubGVuZ3RoKSB7XG4gICAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkLCAwLCB0aGlzLmxhc3ROZWVkKTtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCB0aGlzLmxhc3RUb3RhbCk7XG4gIH1cbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkLCAwLCBidWYubGVuZ3RoKTtcbiAgdGhpcy5sYXN0TmVlZCAtPSBidWYubGVuZ3RoO1xufTtcblxuLy8gQ2hlY2tzIHRoZSB0eXBlIG9mIGEgVVRGLTggYnl0ZSwgd2hldGhlciBpdCdzIEFTQ0lJLCBhIGxlYWRpbmcgYnl0ZSwgb3IgYVxuLy8gY29udGludWF0aW9uIGJ5dGUuIElmIGFuIGludmFsaWQgYnl0ZSBpcyBkZXRlY3RlZCwgLTIgaXMgcmV0dXJuZWQuXG5mdW5jdGlvbiB1dGY4Q2hlY2tCeXRlKGJ5dGUpIHtcbiAgaWYgKGJ5dGUgPD0gMHg3RikgcmV0dXJuIDA7ZWxzZSBpZiAoYnl0ZSA+PiA1ID09PSAweDA2KSByZXR1cm4gMjtlbHNlIGlmIChieXRlID4+IDQgPT09IDB4MEUpIHJldHVybiAzO2Vsc2UgaWYgKGJ5dGUgPj4gMyA9PT0gMHgxRSkgcmV0dXJuIDQ7XG4gIHJldHVybiBieXRlID4+IDYgPT09IDB4MDIgPyAtMSA6IC0yO1xufVxuXG4vLyBDaGVja3MgYXQgbW9zdCAzIGJ5dGVzIGF0IHRoZSBlbmQgb2YgYSBCdWZmZXIgaW4gb3JkZXIgdG8gZGV0ZWN0IGFuXG4vLyBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyLiBUaGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzICgyLCAzLCBvciA0KVxuLy8gbmVlZGVkIHRvIGNvbXBsZXRlIHRoZSBVVEYtOCBjaGFyYWN0ZXIgKGlmIGFwcGxpY2FibGUpIGFyZSByZXR1cm5lZC5cbmZ1bmN0aW9uIHV0ZjhDaGVja0luY29tcGxldGUoc2VsZiwgYnVmLCBpKSB7XG4gIHZhciBqID0gYnVmLmxlbmd0aCAtIDE7XG4gIGlmIChqIDwgaSkgcmV0dXJuIDA7XG4gIHZhciBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSBzZWxmLmxhc3ROZWVkID0gbmIgLSAxO1xuICAgIHJldHVybiBuYjtcbiAgfVxuICBpZiAoLS1qIDwgaSB8fCBuYiA9PT0gLTIpIHJldHVybiAwO1xuICBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSBzZWxmLmxhc3ROZWVkID0gbmIgLSAyO1xuICAgIHJldHVybiBuYjtcbiAgfVxuICBpZiAoLS1qIDwgaSB8fCBuYiA9PT0gLTIpIHJldHVybiAwO1xuICBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSB7XG4gICAgICBpZiAobmIgPT09IDIpIG5iID0gMDtlbHNlIHNlbGYubGFzdE5lZWQgPSBuYiAtIDM7XG4gICAgfVxuICAgIHJldHVybiBuYjtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy8gVmFsaWRhdGVzIGFzIG1hbnkgY29udGludWF0aW9uIGJ5dGVzIGZvciBhIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyIGFzXG4vLyBuZWVkZWQgb3IgYXJlIGF2YWlsYWJsZS4gSWYgd2Ugc2VlIGEgbm9uLWNvbnRpbnVhdGlvbiBieXRlIHdoZXJlIHdlIGV4cGVjdFxuLy8gb25lLCB3ZSBcInJlcGxhY2VcIiB0aGUgdmFsaWRhdGVkIGNvbnRpbnVhdGlvbiBieXRlcyB3ZSd2ZSBzZWVuIHNvIGZhciB3aXRoXG4vLyBhIHNpbmdsZSBVVEYtOCByZXBsYWNlbWVudCBjaGFyYWN0ZXIgKCdcXHVmZmZkJyksIHRvIG1hdGNoIHY4J3MgVVRGLTggZGVjb2Rpbmdcbi8vIGJlaGF2aW9yLiBUaGUgY29udGludWF0aW9uIGJ5dGUgY2hlY2sgaXMgaW5jbHVkZWQgdGhyZWUgdGltZXMgaW4gdGhlIGNhc2Vcbi8vIHdoZXJlIGFsbCBvZiB0aGUgY29udGludWF0aW9uIGJ5dGVzIGZvciBhIGNoYXJhY3RlciBleGlzdCBpbiB0aGUgc2FtZSBidWZmZXIuXG4vLyBJdCBpcyBhbHNvIGRvbmUgdGhpcyB3YXkgYXMgYSBzbGlnaHQgcGVyZm9ybWFuY2UgaW5jcmVhc2UgaW5zdGVhZCBvZiB1c2luZyBhXG4vLyBsb29wLlxuZnVuY3Rpb24gdXRmOENoZWNrRXh0cmFCeXRlcyhzZWxmLCBidWYsIHApIHtcbiAgaWYgKChidWZbMF0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgIHNlbGYubGFzdE5lZWQgPSAwO1xuICAgIHJldHVybiAnXFx1ZmZmZCc7XG4gIH1cbiAgaWYgKHNlbGYubGFzdE5lZWQgPiAxICYmIGJ1Zi5sZW5ndGggPiAxKSB7XG4gICAgaWYgKChidWZbMV0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgc2VsZi5sYXN0TmVlZCA9IDE7XG4gICAgICByZXR1cm4gJ1xcdWZmZmQnO1xuICAgIH1cbiAgICBpZiAoc2VsZi5sYXN0TmVlZCA+IDIgJiYgYnVmLmxlbmd0aCA+IDIpIHtcbiAgICAgIGlmICgoYnVmWzJdICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgICAgc2VsZi5sYXN0TmVlZCA9IDI7XG4gICAgICAgIHJldHVybiAnXFx1ZmZmZCc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIEF0dGVtcHRzIHRvIGNvbXBsZXRlIGEgbXVsdGktYnl0ZSBVVEYtOCBjaGFyYWN0ZXIgdXNpbmcgYnl0ZXMgZnJvbSBhIEJ1ZmZlci5cbmZ1bmN0aW9uIHV0ZjhGaWxsTGFzdChidWYpIHtcbiAgdmFyIHAgPSB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQ7XG4gIHZhciByID0gdXRmOENoZWNrRXh0cmFCeXRlcyh0aGlzLCBidWYsIHApO1xuICBpZiAociAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcjtcbiAgaWYgKHRoaXMubGFzdE5lZWQgPD0gYnVmLmxlbmd0aCkge1xuICAgIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHAsIDAsIHRoaXMubGFzdE5lZWQpO1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIHRoaXMubGFzdFRvdGFsKTtcbiAgfVxuICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCBwLCAwLCBidWYubGVuZ3RoKTtcbiAgdGhpcy5sYXN0TmVlZCAtPSBidWYubGVuZ3RoO1xufVxuXG4vLyBSZXR1cm5zIGFsbCBjb21wbGV0ZSBVVEYtOCBjaGFyYWN0ZXJzIGluIGEgQnVmZmVyLiBJZiB0aGUgQnVmZmVyIGVuZGVkIG9uIGFcbi8vIHBhcnRpYWwgY2hhcmFjdGVyLCB0aGUgY2hhcmFjdGVyJ3MgYnl0ZXMgYXJlIGJ1ZmZlcmVkIHVudGlsIHRoZSByZXF1aXJlZFxuLy8gbnVtYmVyIG9mIGJ5dGVzIGFyZSBhdmFpbGFibGUuXG5mdW5jdGlvbiB1dGY4VGV4dChidWYsIGkpIHtcbiAgdmFyIHRvdGFsID0gdXRmOENoZWNrSW5jb21wbGV0ZSh0aGlzLCBidWYsIGkpO1xuICBpZiAoIXRoaXMubGFzdE5lZWQpIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjgnLCBpKTtcbiAgdGhpcy5sYXN0VG90YWwgPSB0b3RhbDtcbiAgdmFyIGVuZCA9IGJ1Zi5sZW5ndGggLSAodG90YWwgLSB0aGlzLmxhc3ROZWVkKTtcbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgMCwgZW5kKTtcbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygndXRmOCcsIGksIGVuZCk7XG59XG5cbi8vIEZvciBVVEYtOCwgYSByZXBsYWNlbWVudCBjaGFyYWN0ZXIgaXMgYWRkZWQgd2hlbiBlbmRpbmcgb24gYSBwYXJ0aWFsXG4vLyBjaGFyYWN0ZXIuXG5mdW5jdGlvbiB1dGY4RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSByZXR1cm4gciArICdcXHVmZmZkJztcbiAgcmV0dXJuIHI7XG59XG5cbi8vIFVURi0xNkxFIHR5cGljYWxseSBuZWVkcyB0d28gYnl0ZXMgcGVyIGNoYXJhY3RlciwgYnV0IGV2ZW4gaWYgd2UgaGF2ZSBhbiBldmVuXG4vLyBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlLCB3ZSBuZWVkIHRvIGNoZWNrIGlmIHdlIGVuZCBvbiBhIGxlYWRpbmcvaGlnaFxuLy8gc3Vycm9nYXRlLiBJbiB0aGF0IGNhc2UsIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIG5leHQgdHdvIGJ5dGVzIGluIG9yZGVyIHRvXG4vLyBkZWNvZGUgdGhlIGxhc3QgY2hhcmFjdGVyIHByb3Blcmx5LlxuZnVuY3Rpb24gdXRmMTZUZXh0KGJ1ZiwgaSkge1xuICBpZiAoKGJ1Zi5sZW5ndGggLSBpKSAlIDIgPT09IDApIHtcbiAgICB2YXIgciA9IGJ1Zi50b1N0cmluZygndXRmMTZsZScsIGkpO1xuICAgIGlmIChyKSB7XG4gICAgICB2YXIgYyA9IHIuY2hhckNvZGVBdChyLmxlbmd0aCAtIDEpO1xuICAgICAgaWYgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhEQkZGKSB7XG4gICAgICAgIHRoaXMubGFzdE5lZWQgPSAyO1xuICAgICAgICB0aGlzLmxhc3RUb3RhbCA9IDQ7XG4gICAgICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDJdO1xuICAgICAgICB0aGlzLmxhc3RDaGFyWzFdID0gYnVmW2J1Zi5sZW5ndGggLSAxXTtcbiAgICAgICAgcmV0dXJuIHIuc2xpY2UoMCwgLTEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuICB0aGlzLmxhc3ROZWVkID0gMTtcbiAgdGhpcy5sYXN0VG90YWwgPSAyO1xuICB0aGlzLmxhc3RDaGFyWzBdID0gYnVmW2J1Zi5sZW5ndGggLSAxXTtcbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygndXRmMTZsZScsIGksIGJ1Zi5sZW5ndGggLSAxKTtcbn1cblxuLy8gRm9yIFVURi0xNkxFIHdlIGRvIG5vdCBleHBsaWNpdGx5IGFwcGVuZCBzcGVjaWFsIHJlcGxhY2VtZW50IGNoYXJhY3RlcnMgaWYgd2Vcbi8vIGVuZCBvbiBhIHBhcnRpYWwgY2hhcmFjdGVyLCB3ZSBzaW1wbHkgbGV0IHY4IGhhbmRsZSB0aGF0LlxuZnVuY3Rpb24gdXRmMTZFbmQoYnVmKSB7XG4gIHZhciByID0gYnVmICYmIGJ1Zi5sZW5ndGggPyB0aGlzLndyaXRlKGJ1ZikgOiAnJztcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHtcbiAgICB2YXIgZW5kID0gdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkO1xuICAgIHJldHVybiByICsgdGhpcy5sYXN0Q2hhci50b1N0cmluZygndXRmMTZsZScsIDAsIGVuZCk7XG4gIH1cbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRleHQoYnVmLCBpKSB7XG4gIHZhciBuID0gKGJ1Zi5sZW5ndGggLSBpKSAlIDM7XG4gIGlmIChuID09PSAwKSByZXR1cm4gYnVmLnRvU3RyaW5nKCdiYXNlNjQnLCBpKTtcbiAgdGhpcy5sYXN0TmVlZCA9IDMgLSBuO1xuICB0aGlzLmxhc3RUb3RhbCA9IDM7XG4gIGlmIChuID09PSAxKSB7XG4gICAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMl07XG4gICAgdGhpcy5sYXN0Q2hhclsxXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIH1cbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygnYmFzZTY0JywgaSwgYnVmLmxlbmd0aCAtIG4pO1xufVxuXG5mdW5jdGlvbiBiYXNlNjRFbmQoYnVmKSB7XG4gIHZhciByID0gYnVmICYmIGJ1Zi5sZW5ndGggPyB0aGlzLndyaXRlKGJ1ZikgOiAnJztcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHJldHVybiByICsgdGhpcy5sYXN0Q2hhci50b1N0cmluZygnYmFzZTY0JywgMCwgMyAtIHRoaXMubGFzdE5lZWQpO1xuICByZXR1cm4gcjtcbn1cblxuLy8gUGFzcyBieXRlcyBvbiB0aHJvdWdoIGZvciBzaW5nbGUtYnl0ZSBlbmNvZGluZ3MgKGUuZy4gYXNjaWksIGxhdGluMSwgaGV4KVxuZnVuY3Rpb24gc2ltcGxlV3JpdGUoYnVmKSB7XG4gIHJldHVybiBidWYudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG59XG5cbmZ1bmN0aW9uIHNpbXBsZUVuZChidWYpIHtcbiAgcmV0dXJuIGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG59Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1067\n")},5402:module=>{eval("/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n // Safari 9 makes `arguments.length` enumerable in strict mode.\n var result = (isArray(value) || isArguments(value))\n ? baseTimes(value.length, String)\n : [];\n\n var length = result.length,\n skipIndexes = !!length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Used by `_.defaults` to customize its `_.assignIn` use.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to assign.\n * @param {Object} object The parent object of `objValue`.\n * @returns {*} Returns the value to assign.\n */\nfunction assignInDefaults(objValue, srcValue, key, object) {\n if (objValue === undefined ||\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n return srcValue;\n }\n return objValue;\n}\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n object[key] = value;\n }\n}\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = array;\n return apply(func, this, otherArgs);\n };\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n assignValue(object, key, newValue === undefined ? source[key] : newValue);\n }\n return object;\n}\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * This method is like `_.assignIn` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extendWith\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignInWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keysIn(source), object, customizer);\n});\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(args) {\n args.push(undefined, assignInDefaults);\n return apply(assignInWith, undefined, args);\n});\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = defaults;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVEsSUFBSSxRQUFRLElBQUksUUFBUTtBQUM5QyxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxXQUFXO0FBQ3RCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsUUFBUSxJQUFJLFFBQVEsSUFBSSxRQUFRO0FBQ2hELFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9sb2Rhc2guZGVmYXVsdHMvaW5kZXguanM/MTNjYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xudmFyIHJlSXNVaW50ID0gL14oPzowfFsxLTldXFxkKikkLztcblxuLyoqXG4gKiBBIGZhc3RlciBhbHRlcm5hdGl2ZSB0byBgRnVuY3Rpb24jYXBwbHlgLCB0aGlzIGZ1bmN0aW9uIGludm9rZXMgYGZ1bmNgXG4gKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2AgYW5kIHRoZSBhcmd1bWVudHMgb2YgYGFyZ3NgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAqL1xuZnVuY3Rpb24gYXBwbHkoZnVuYywgdGhpc0FyZywgYXJncykge1xuICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcpO1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICB9XG4gIHJldHVybiBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRpbWVzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHNcbiAqIG9yIG1heCBhcnJheSBsZW5ndGggY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRpbWVzKG4sIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobik7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGluZGV4KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGFycmF5LWxpa2UgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgLy8gU2FmYXJpIDguMSBtYWtlcyBgYXJndW1lbnRzLmNhbGxlZWAgZW51bWVyYWJsZSBpbiBzdHJpY3QgbW9kZS5cbiAgLy8gU2FmYXJpIDkgbWFrZXMgYGFyZ3VtZW50cy5sZW5ndGhgIGVudW1lcmFibGUgaW4gc3RyaWN0IG1vZGUuXG4gIHZhciByZXN1bHQgPSAoaXNBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpKVxuICAgID8gYmFzZVRpbWVzKHZhbHVlLmxlbmd0aCwgU3RyaW5nKVxuICAgIDogW107XG5cbiAgdmFyIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGgsXG4gICAgICBza2lwSW5kZXhlcyA9ICEhbGVuZ3RoO1xuXG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKGtleSA9PSAnbGVuZ3RoJyB8fCBpc0luZGV4KGtleSwgbGVuZ3RoKSkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFVzZWQgYnkgYF8uZGVmYXVsdHNgIHRvIGN1c3RvbWl6ZSBpdHMgYF8uYXNzaWduSW5gIHVzZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBvYmpWYWx1ZSBUaGUgZGVzdGluYXRpb24gdmFsdWUuXG4gKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSBzb3VyY2UgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHBhcmVudCBvYmplY3Qgb2YgYG9ialZhbHVlYC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGFzc2lnbkluRGVmYXVsdHMob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCkge1xuICBpZiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgKGVxKG9ialZhbHVlLCBvYmplY3RQcm90b1trZXldKSAmJiAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSB7XG4gICAgcmV0dXJuIHNyY1ZhbHVlO1xuICB9XG4gIHJldHVybiBvYmpWYWx1ZTtcbn1cblxuLyoqXG4gKiBBc3NpZ25zIGB2YWx1ZWAgdG8gYGtleWAgb2YgYG9iamVjdGAgaWYgdGhlIGV4aXN0aW5nIHZhbHVlIGlzIG5vdCBlcXVpdmFsZW50XG4gKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgaWYgKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgZXEob2JqVmFsdWUsIHZhbHVlKSkgfHxcbiAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNJbmAgd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBiYXNlS2V5c0luKG9iamVjdCkge1xuICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7XG4gIH1cbiAgdmFyIGlzUHJvdG8gPSBpc1Byb3RvdHlwZShvYmplY3QpLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgIGlmICghKGtleSA9PSAnY29uc3RydWN0b3InICYmIChpc1Byb3RvIHx8ICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlc3RgIHdoaWNoIGRvZXNuJ3QgdmFsaWRhdGUgb3IgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUmVzdChmdW5jLCBzdGFydCkge1xuICBzdGFydCA9IG5hdGl2ZU1heChzdGFydCA9PT0gdW5kZWZpbmVkID8gKGZ1bmMubGVuZ3RoIC0gMSkgOiBzdGFydCwgMCk7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3MubGVuZ3RoIC0gc3RhcnQsIDApLFxuICAgICAgICBhcnJheSA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgYXJyYXlbaW5kZXhdID0gYXJnc1tzdGFydCArIGluZGV4XTtcbiAgICB9XG4gICAgaW5kZXggPSAtMTtcbiAgICB2YXIgb3RoZXJBcmdzID0gQXJyYXkoc3RhcnQgKyAxKTtcbiAgICB3aGlsZSAoKytpbmRleCA8IHN0YXJ0KSB7XG4gICAgICBvdGhlckFyZ3NbaW5kZXhdID0gYXJnc1tpbmRleF07XG4gICAgfVxuICAgIG90aGVyQXJnc1tzdGFydF0gPSBhcnJheTtcbiAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzIHRvIGNvcHkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb3BpZWQgdmFsdWVzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHtcbiAgb2JqZWN0IHx8IChvYmplY3QgPSB7fSk7XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuXG4gICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgPyBjdXN0b21pemVyKG9iamVjdFtrZXldLCBzb3VyY2Vba2V5XSwga2V5LCBvYmplY3QsIHNvdXJjZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlID09PSB1bmRlZmluZWQgPyBzb3VyY2Vba2V5XSA6IG5ld1ZhbHVlKTtcbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLmFzc2lnbmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGFzc2lnbmVyIFRoZSBmdW5jdGlvbiB0byBhc3NpZ24gdmFsdWVzLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYXNzaWduZXIgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUFzc2lnbmVyKGFzc2lnbmVyKSB7XG4gIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIHNvdXJjZXMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gc291cmNlcy5sZW5ndGgsXG4gICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPiAxID8gc291cmNlc1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZ3VhcmQgPSBsZW5ndGggPiAyID8gc291cmNlc1syXSA6IHVuZGVmaW5lZDtcblxuICAgIGN1c3RvbWl6ZXIgPSAoYXNzaWduZXIubGVuZ3RoID4gMyAmJiB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nKVxuICAgICAgPyAobGVuZ3RoLS0sIGN1c3RvbWl6ZXIpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLCBzb3VyY2VzWzFdLCBndWFyZCkpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPCAzID8gdW5kZWZpbmVkIDogY3VzdG9taXplcjtcbiAgICAgIGxlbmd0aCA9IDE7XG4gICAgfVxuICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgc291cmNlID0gc291cmNlc1tpbmRleF07XG4gICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgIGFzc2lnbmVyKG9iamVjdCwgc291cmNlLCBpbmRleCwgY3VzdG9taXplcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Q7XG4gIH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG4gIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgfHwgcmVJc1VpbnQudGVzdCh2YWx1ZSkpICYmXG4gICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSB2YWx1ZSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7Kn0gaW5kZXggVGhlIHBvdGVudGlhbCBpdGVyYXRlZSBpbmRleCBvciBrZXkgYXJndW1lbnQuXG4gKiBAcGFyYW0geyp9IG9iamVjdCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIG9iamVjdCBhcmd1bWVudC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbCh2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHR5cGUgPSB0eXBlb2YgaW5kZXg7XG4gIGlmICh0eXBlID09ICdudW1iZXInXG4gICAgICAgID8gKGlzQXJyYXlMaWtlKG9iamVjdCkgJiYgaXNJbmRleChpbmRleCwgb2JqZWN0Lmxlbmd0aCkpXG4gICAgICAgIDogKHR5cGUgPT0gJ3N0cmluZycgJiYgaW5kZXggaW4gb2JqZWN0KVxuICAgICAgKSB7XG4gICAgcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sIHZhbHVlKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2VcbiAqIFtgT2JqZWN0LmtleXNgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGV4Y2VwdCB0aGF0IGl0IGluY2x1ZGVzIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIG5hdGl2ZUtleXNJbihvYmplY3QpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBpZiAob2JqZWN0ICE9IG51bGwpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgYVxuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAqXG4gKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKCdhJywgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKE5hTiwgTmFOKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gZXEodmFsdWUsIG90aGVyKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgKHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXIpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuICAvLyBTYWZhcmkgOC4xIG1ha2VzIGBhcmd1bWVudHMuY2FsbGVlYCBlbnVtZXJhYmxlIGluIHN0cmljdCBtb2RlLlxuICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICghcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpIHx8IG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IGFyZ3NUYWcpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgYXJyYXktbGlrZSBpZiBpdCdzXG4gKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZSgnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0FycmF5TGlrZWAgZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGVja3MgaWYgYHZhbHVlYFxuICogaXMgYW4gb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LWxpa2Ugb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzQXJyYXlMaWtlKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oXyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gIC8vIGluIFNhZmFyaSA4LTkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXkgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgdmFyIHRhZyA9IGlzT2JqZWN0KHZhbHVlKSA/IG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpIDogJyc7XG4gIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBsZW5ndGguXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0xlbmd0aCgzKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aCgnMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJlxuICAgIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduSW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgXG4gKiB3aGljaCBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGFzc2lnbmVkIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnNcbiAqIGB1bmRlZmluZWRgLCBhc3NpZ25tZW50IGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgXG4gKiBpcyBpbnZva2VkIHdpdGggZml2ZSBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBhbGlhcyBleHRlbmRXaXRoXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQHNlZSBfLmFzc2lnbldpdGhcbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAqICAgcmV0dXJuIF8uaXNVbmRlZmluZWQob2JqVmFsdWUpID8gc3JjVmFsdWUgOiBvYmpWYWx1ZTtcbiAqIH1cbiAqXG4gKiB2YXIgZGVmYXVsdHMgPSBfLnBhcnRpYWxSaWdodChfLmFzc2lnbkluV2l0aCwgY3VzdG9taXplcik7XG4gKlxuICogZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAqL1xudmFyIGFzc2lnbkluV2l0aCA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcikge1xuICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCwgY3VzdG9taXplcik7XG59KTtcblxuLyoqXG4gKiBBc3NpZ25zIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlXG4gKiBvYmplY3RzIHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzIHRoYXRcbiAqIHJlc29sdmUgdG8gYHVuZGVmaW5lZGAuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC5cbiAqIE9uY2UgYSBwcm9wZXJ0eSBpcyBzZXQsIGFkZGl0aW9uYWwgdmFsdWVzIG9mIHRoZSBzYW1lIHByb3BlcnR5IGFyZSBpZ25vcmVkLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBzZWUgXy5kZWZhdWx0c0RlZXBcbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZhdWx0cyh7ICdhJzogMSB9LCB7ICdiJzogMiB9LCB7ICdhJzogMyB9KTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICovXG52YXIgZGVmYXVsdHMgPSBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gIGFyZ3MucHVzaCh1bmRlZmluZWQsIGFzc2lnbkluRGVmYXVsdHMpO1xuICByZXR1cm4gYXBwbHkoYXNzaWduSW5XaXRoLCB1bmRlZmluZWQsIGFyZ3MpO1xufSk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXNJbihuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG4gIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QsIHRydWUpIDogYmFzZUtleXNJbihvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmF1bHRzO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5402\n")},1478:module=>{eval("/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n var length = array ? array.length : 0;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\n/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array ? array.length : 0;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array ? array.length : 0,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\n/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n if (value !== value) {\n return baseFindIndex(array, baseIsNaN, fromIndex);\n }\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\n/**\n * Checks if a cache value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n // Many host objects are `Object` objects that can coerce to strings\n // despite having improperly defined `toString` methods.\n var result = false;\n if (value != null && typeof value.toString != 'function') {\n try {\n result = !!(value + '');\n } catch (e) {}\n }\n return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice,\n spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map'),\n nativeCreate = getNative(Object, 'create');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n return this.has(key) && delete this.__data__[key];\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n return getMapData(this, key)['delete'](key);\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n getMapData(this, key).set(key, value);\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values ? values.length : 0;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\n/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\nfunction baseDifference(array, values, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n isCommon = true,\n length = array.length,\n result = [],\n valuesLength = values.length;\n\n if (!length) {\n return result;\n }\n if (iteratee) {\n values = arrayMap(values, baseUnary(iteratee));\n }\n if (comparator) {\n includes = arrayIncludesWith;\n isCommon = false;\n }\n else if (values.length >= LARGE_ARRAY_SIZE) {\n includes = cacheHas;\n isCommon = false;\n values = new SetCache(values);\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var valuesIndex = valuesLength;\n while (valuesIndex--) {\n if (values[valuesIndex] === computed) {\n continue outer;\n }\n }\n result.push(value);\n }\n else if (!includes(values, computed, comparator)) {\n result.push(value);\n }\n }\n return result;\n}\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = array;\n return apply(func, this, otherArgs);\n };\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order of result values is determined by the\n * order they occur in the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */\nvar difference = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n : [];\n});\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\nmodule.exports = difference;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvbG9kYXNoLmRpZmZlcmVuY2UvaW5kZXguanM/NjE4ZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIHNpemUgdG8gZW5hYmxlIGxhcmdlIGFycmF5IG9wdGltaXphdGlvbnMuICovXG52YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nO1xuXG4vKipcbiAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGBcbiAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICovXG52YXIgcmVSZWdFeHBDaGFyID0gL1tcXFxcXiQuKis/KClbXFxde318XS9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG52YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4vKipcbiAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICovXG5mdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG59XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluY2x1ZGVzYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIHNwZWNpZnlpbmcgYW4gaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheUluY2x1ZGVzKGFycmF5LCB2YWx1ZSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuICByZXR1cm4gISFsZW5ndGggJiYgYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCAwKSA+IC0xO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXJyYXlJbmNsdWRlc2AgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhIGNvbXBhcmF0b3IuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheUluY2x1ZGVzV2l0aChhcnJheSwgdmFsdWUsIGNvbXBhcmF0b3IpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoY29tcGFyYXRvcih2YWx1ZSwgYXJyYXlbaW5kZXhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWFwYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAqIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQXBwZW5kcyB0aGUgZWxlbWVudHMgb2YgYHZhbHVlc2AgdG8gYGFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFwcGVuZC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBhcnJheVB1c2goYXJyYXksIHZhbHVlcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICBvZmZzZXQgPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhcnJheVtvZmZzZXQgKyBpbmRleF0gPSB2YWx1ZXNbaW5kZXhdO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maW5kSW5kZXhgIGFuZCBgXy5maW5kTGFzdEluZGV4YCB3aXRob3V0XG4gKiBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4LCBmcm9tUmlnaHQpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIGluZGV4ID0gZnJvbUluZGV4ICsgKGZyb21SaWdodCA/IDEgOiAtMSk7XG5cbiAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIGlmICh2YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBmcm9tSW5kZXgpO1xuICB9XG4gIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYU5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbnVtYmVyIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTmFOKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5hcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3Igc3RvcmluZyBtZXRhZGF0YS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jKHZhbHVlKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBjYWNoZSB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgVGhlIGNhY2hlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLCBrZXkpIHtcbiAgcmV0dXJuIGNhY2hlLmhhcyhrZXkpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGhvc3Qgb2JqZWN0IGluIElFIDwgOS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGhvc3Qgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSG9zdE9iamVjdCh2YWx1ZSkge1xuICAvLyBNYW55IGhvc3Qgb2JqZWN0cyBhcmUgYE9iamVjdGAgb2JqZWN0cyB0aGF0IGNhbiBjb2VyY2UgdG8gc3RyaW5nc1xuICAvLyBkZXNwaXRlIGhhdmluZyBpbXByb3Blcmx5IGRlZmluZWQgYHRvU3RyaW5nYCBtZXRob2RzLlxuICB2YXIgcmVzdWx0ID0gZmFsc2U7XG4gIGlmICh2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9ICEhKHZhbHVlICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGUsXG4gICAgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xudmFyIGNvcmVKc0RhdGEgPSByb290WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbnZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG59KCkpO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGlmIGEgbWV0aG9kIGlzIG5hdGl2ZS4gKi9cbnZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gIGZ1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gIC5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLCAnJDEuKj8nKSArICckJ1xuKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sID0gcm9vdC5TeW1ib2wsXG4gICAgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZSxcbiAgICBzcGxpY2UgPSBhcnJheVByb3RvLnNwbGljZSxcbiAgICBzcHJlYWRhYmxlU3ltYm9sID0gU3ltYm9sID8gU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSA6IHVuZGVmaW5lZDtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgTWFwID0gZ2V0TmF0aXZlKHJvb3QsICdNYXAnKSxcbiAgICBuYXRpdmVDcmVhdGUgPSBnZXROYXRpdmUoT2JqZWN0LCAnY3JlYXRlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID8gZW50cmllcy5sZW5ndGggOiAwO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKi9cbmZ1bmN0aW9uIGhhc2hDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IG5hdGl2ZUNyZWF0ZSA/IG5hdGl2ZUNyZWF0ZShudWxsKSA6IHt9O1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge09iamVjdH0gaGFzaCBUaGUgaGFzaCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcbiAgcmV0dXJuIHRoaXMuaGFzKGtleSkgJiYgZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGhhc2hHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgIHZhciByZXN1bHQgPSBkYXRhW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBoYXNoIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoSGFzKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHJldHVybiBuYXRpdmVDcmVhdGUgPyBkYXRhW2tleV0gIT09IHVuZGVmaW5lZCA6IGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBoYXNoIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaGFzaCBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gaGFzaFNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgZGF0YVtrZXldID0gKG5hdGl2ZUNyZWF0ZSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSA/IEhBU0hfVU5ERUZJTkVEIDogdmFsdWU7XG4gIHJldHVybiB0aGlzO1xufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgSGFzaGAuXG5IYXNoLnByb3RvdHlwZS5jbGVhciA9IGhhc2hDbGVhcjtcbkhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7XG5IYXNoLnByb3RvdHlwZS5nZXQgPSBoYXNoR2V0O1xuSGFzaC5wcm90b3R5cGUuaGFzID0gaGFzaEhhcztcbkhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID8gZW50cmllcy5sZW5ndGggOiAwO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBbXTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlRGVsZXRlKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgaWYgKGluZGV4ID09IGxhc3RJbmRleCkge1xuICAgIGRhdGEucG9wKCk7XG4gIH0gZWxzZSB7XG4gICAgc3BsaWNlLmNhbGwoZGF0YSwgaW5kZXgsIDEpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgcmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IGRhdGFbaW5kZXhdWzFdO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sIGtleSkgPiAtMTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBsaXN0IGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhW2luZGV4XVsxXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgTGlzdENhY2hlYC5cbkxpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBsaXN0Q2FjaGVDbGVhcjtcbkxpc3RDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbGlzdENhY2hlRGVsZXRlO1xuTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBsaXN0Q2FjaGVHZXQ7XG5MaXN0Q2FjaGUucHJvdG90eXBlLmhhcyA9IGxpc3RDYWNoZUhhcztcbkxpc3RDYWNoZS5wcm90b3R5cGUuc2V0ID0gbGlzdENhY2hlU2V0O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXAgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPyBlbnRyaWVzLmxlbmd0aCA6IDA7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IHtcbiAgICAnaGFzaCc6IG5ldyBIYXNoLFxuICAgICdtYXAnOiBuZXcgKE1hcCB8fCBMaXN0Q2FjaGUpLFxuICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuICB9O1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbWFwIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpIHtcbiAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5nZXQoa2V5KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBtYXAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5oYXMoa2V5KTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBtYXAgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbWFwIGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gIGdldE1hcERhdGEodGhpcywga2V5KS5zZXQoa2V5LCB2YWx1ZSk7XG4gIHJldHVybiB0aGlzO1xufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLlxuTWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjtcbk1hcENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBtYXBDYWNoZURlbGV0ZTtcbk1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcbk1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhcztcbk1hcENhY2hlLnByb3RvdHlwZS5zZXQgPSBtYXBDYWNoZVNldDtcblxuLyoqXG4gKlxuICogQ3JlYXRlcyBhbiBhcnJheSBjYWNoZSBvYmplY3QgdG8gc3RvcmUgdW5pcXVlIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTZXRDYWNoZSh2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMgPyB2YWx1ZXMubGVuZ3RoIDogMDtcblxuICB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHRoaXMuYWRkKHZhbHVlc1tpbmRleF0pO1xuICB9XG59XG5cbi8qKlxuICogQWRkcyBgdmFsdWVgIHRvIHRoZSBhcnJheSBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgYWRkXG4gKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAqIEBhbGlhcyBwdXNoXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjYWNoZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBzZXRDYWNoZUFkZCh2YWx1ZSkge1xuICB0aGlzLl9fZGF0YV9fLnNldCh2YWx1ZSwgSEFTSF9VTkRFRklORUQpO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzZXRDYWNoZUhhcyh2YWx1ZSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgU2V0Q2FjaGVgLlxuU2V0Q2FjaGUucHJvdG90eXBlLmFkZCA9IFNldENhY2hlLnByb3RvdHlwZS5wdXNoID0gc2V0Q2FjaGVBZGQ7XG5TZXRDYWNoZS5wcm90b3R5cGUuaGFzID0gc2V0Q2FjaGVIYXM7XG5cbi8qKlxuICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIGlmIChlcShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG4gICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRpZmZlcmVuY2VgIHdpdGhvdXQgc3VwcG9ydFxuICogZm9yIGV4Y2x1ZGluZyBtdWx0aXBsZSBhcnJheXMgb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBiYXNlRGlmZmVyZW5jZShhcnJheSwgdmFsdWVzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgIGlzQ29tbW9uID0gdHJ1ZSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgdmFsdWVzTGVuZ3RoID0gdmFsdWVzLmxlbmd0aDtcblxuICBpZiAoIWxlbmd0aCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgdmFsdWVzID0gYXJyYXlNYXAodmFsdWVzLCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgfVxuICBpZiAoY29tcGFyYXRvcikge1xuICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgfVxuICBlbHNlIGlmICh2YWx1ZXMubGVuZ3RoID49IExBUkdFX0FSUkFZX1NJWkUpIHtcbiAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgdmFsdWVzID0gbmV3IFNldENhY2hlKHZhbHVlcyk7XG4gIH1cbiAgb3V0ZXI6XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICB2YXIgdmFsdWVzSW5kZXggPSB2YWx1ZXNMZW5ndGg7XG4gICAgICB3aGlsZSAodmFsdWVzSW5kZXgtLSkge1xuICAgICAgICBpZiAodmFsdWVzW3ZhbHVlc0luZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIGlmICghaW5jbHVkZXModmFsdWVzLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mbGF0dGVuYCB3aXRoIHN1cHBvcnQgZm9yIHJlc3RyaWN0aW5nIGZsYXR0ZW5pbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICogQHBhcmFtIHtudW1iZXJ9IGRlcHRoIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ByZWRpY2F0ZT1pc0ZsYXR0ZW5hYmxlXSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNTdHJpY3RdIFJlc3RyaWN0IHRvIHZhbHVlcyB0aGF0IHBhc3MgYHByZWRpY2F0ZWAgY2hlY2tzLlxuICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdD1bXV0gVGhlIGluaXRpYWwgcmVzdWx0IHZhbHVlLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBwcmVkaWNhdGUgfHwgKHByZWRpY2F0ZSA9IGlzRmxhdHRlbmFibGUpO1xuICByZXN1bHQgfHwgKHJlc3VsdCA9IFtdKTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICBpZiAoZGVwdGggPiAwICYmIHByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgIGlmIChkZXB0aCA+IDEpIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgZmxhdHRlbiBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgYmFzZUZsYXR0ZW4odmFsdWUsIGRlcHRoIC0gMSwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFycmF5UHVzaChyZXN1bHQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpc1N0cmljdCkge1xuICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYXRpdmVgIHdpdGhvdXQgYmFkIHNoaW0gY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTmF0aXZlKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpIHx8IGlzTWFza2VkKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcGF0dGVybiA9IChpc0Z1bmN0aW9uKHZhbHVlKSB8fCBpc0hvc3RPYmplY3QodmFsdWUpKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXN0YCB3aGljaCBkb2Vzbid0IHZhbGlkYXRlIG9yIGNvZXJjZSBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHtcbiAgc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQgPT09IHVuZGVmaW5lZCA/IChmdW5jLmxlbmd0aCAtIDEpIDogc3RhcnQsIDApO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChhcmdzLmxlbmd0aCAtIHN0YXJ0LCAwKSxcbiAgICAgICAgYXJyYXkgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFycmF5W2luZGV4XSA9IGFyZ3Nbc3RhcnQgKyBpbmRleF07XG4gICAgfVxuICAgIGluZGV4ID0gLTE7XG4gICAgdmFyIG90aGVyQXJncyA9IEFycmF5KHN0YXJ0ICsgMSk7XG4gICAgd2hpbGUgKCsraW5kZXggPCBzdGFydCkge1xuICAgICAgb3RoZXJBcmdzW2luZGV4XSA9IGFyZ3NbaW5kZXhdO1xuICAgIH1cbiAgICBvdGhlckFyZ3Nbc3RhcnRdID0gYXJyYXk7XG4gICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gIH07XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJlZmVyZW5jZSBrZXkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGdldE1hcERhdGEobWFwLCBrZXkpIHtcbiAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gIHJldHVybiBpc0tleWFibGUoa2V5KVxuICAgID8gZGF0YVt0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8gJ3N0cmluZycgOiAnaGFzaCddXG4gICAgOiBkYXRhLm1hcDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBuYXRpdmUgZnVuY3Rpb24gYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBpZiBpdCdzIG5hdGl2ZSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG4gIHZhciB2YWx1ZSA9IGdldFZhbHVlKG9iamVjdCwga2V5KTtcbiAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGZsYXR0ZW5hYmxlIGBhcmd1bWVudHNgIG9iamVjdCBvciBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmbGF0dGVuYWJsZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0ZsYXR0ZW5hYmxlKHZhbHVlKSB7XG4gIHJldHVybiBpc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkgfHxcbiAgICAhIShzcHJlYWRhYmxlU3ltYm9sICYmIHZhbHVlICYmIHZhbHVlW3NwcmVhZGFibGVTeW1ib2xdKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICh0eXBlID09ICdzdHJpbmcnIHx8IHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJylcbiAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgOiAodmFsdWUgPT09IG51bGwpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHtcbiAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgZnVuY2AgdG8gaXRzIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBwcm9jZXNzLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG4gKi9cbmZ1bmN0aW9uIHRvU291cmNlKGZ1bmMpIHtcbiAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZnVuY1RvU3RyaW5nLmNhbGwoZnVuYyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChmdW5jICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgYGFycmF5YCB2YWx1ZXMgbm90IGluY2x1ZGVkIGluIHRoZSBvdGhlciBnaXZlbiBhcnJheXNcbiAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlXG4gKiBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBmaXJzdCBhcnJheS5cbiAqXG4gKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gKiBAc2VlIF8ud2l0aG91dCwgXy54b3JcbiAqIEBleGFtcGxlXG4gKlxuICogXy5kaWZmZXJlbmNlKFsyLCAxXSwgWzIsIDNdKTtcbiAqIC8vID0+IFsxXVxuICovXG52YXIgZGlmZmVyZW5jZSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpKVxuICAgIDogW107XG59KTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICpcbiAqIF8uZXEob2JqZWN0LCBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoJ2EnLCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEoJ2EnLCBPYmplY3QoJ2EnKSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoTmFOLCBOYU4pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBlcSh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG4gIC8vIFNhZmFyaSA4LjEgbWFrZXMgYGFyZ3VtZW50cy5jYWxsZWVgIGVudW1lcmFibGUgaW4gc3RyaWN0IG1vZGUuXG4gIHJldHVybiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgKCFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgfHwgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gYXJnc1RhZyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzQXJyYXlMaWtlYCBleGNlcHQgdGhhdCBpdCBhbHNvIGNoZWNrcyBpZiBgdmFsdWVgXG4gKiBpcyBhbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNBcnJheUxpa2UodmFsdWUpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNGdW5jdGlvbihfKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgLy8gaW4gU2FmYXJpIDgtOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheSBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICB2YXIgdGFnID0gaXNPYmplY3QodmFsdWUpID8gb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcbiAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTGVuZ3RoKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICEhdmFsdWUgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGlmZmVyZW5jZTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1478\n")},5800:module=>{eval("/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar Symbol = root.Symbol,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n var length = array ? array.length : 0;\n return length ? baseFlatten(array, 1) : [];\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\nmodule.exports = flatten;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTgwMC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsU0FBUztBQUNwQixXQUFXLE9BQU87QUFDbEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLG1CQUFtQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvbG9kYXNoLmZsYXR0ZW4vaW5kZXguanM/MmZiNCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4vKipcbiAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBTeW1ib2wgPSByb290LlN5bWJvbCxcbiAgICBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlLFxuICAgIHNwcmVhZGFibGVTeW1ib2wgPSBTeW1ib2wgPyBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGggc3VwcG9ydCBmb3IgcmVzdHJpY3RpbmcgZmxhdHRlbmluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiBAcGFyYW0ge251bWJlcn0gZGVwdGggVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICogQHBhcmFtIHtib29sZWFufSBbcHJlZGljYXRlPWlzRmxhdHRlbmFibGVdIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N0cmljdF0gUmVzdHJpY3QgdG8gdmFsdWVzIHRoYXQgcGFzcyBgcHJlZGljYXRlYCBjaGVja3MuXG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0PVtdXSBUaGUgaW5pdGlhbCByZXN1bHQgdmFsdWUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHByZWRpY2F0ZSB8fCAocHJlZGljYXRlID0gaXNGbGF0dGVuYWJsZSk7XG4gIHJlc3VsdCB8fCAocmVzdWx0ID0gW10pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgIGlmIChkZXB0aCA+IDAgJiYgcHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgaWYgKGRlcHRoID4gMSkge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBmbGF0dGVuIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBiYXNlRmxhdHRlbih2YWx1ZSwgZGVwdGggLSAxLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXlQdXNoKHJlc3VsdCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzU3RyaWN0KSB7XG4gICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGZsYXR0ZW5hYmxlIGBhcmd1bWVudHNgIG9iamVjdCBvciBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmbGF0dGVuYWJsZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0ZsYXR0ZW5hYmxlKHZhbHVlKSB7XG4gIHJldHVybiBpc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkgfHxcbiAgICAhIShzcHJlYWRhYmxlU3ltYm9sICYmIHZhbHVlICYmIHZhbHVlW3NwcmVhZGFibGVTeW1ib2xdKTtcbn1cblxuLyoqXG4gKiBGbGF0dGVucyBgYXJyYXlgIGEgc2luZ2xlIGxldmVsIGRlZXAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5mbGF0dGVuKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDtcbiAgcmV0dXJuIGxlbmd0aCA/IGJhc2VGbGF0dGVuKGFycmF5LCAxKSA6IFtdO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuICAvLyBTYWZhcmkgOC4xIG1ha2VzIGBhcmd1bWVudHMuY2FsbGVlYCBlbnVtZXJhYmxlIGluIHN0cmljdCBtb2RlLlxuICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICghcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpIHx8IG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IGFyZ3NUYWcpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgYXJyYXktbGlrZSBpZiBpdCdzXG4gKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZSgnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0FycmF5TGlrZWAgZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGVja3MgaWYgYHZhbHVlYFxuICogaXMgYW4gb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LWxpa2Ugb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzQXJyYXlMaWtlKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oXyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gIC8vIGluIFNhZmFyaSA4LTkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXkgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgdmFyIHRhZyA9IGlzT2JqZWN0KHZhbHVlKSA/IG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpIDogJyc7XG4gIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBsZW5ndGguXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0xlbmd0aCgzKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aCgnMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJlxuICAgIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZsYXR0ZW47XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5800\n")},8146:module=>{eval("/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n // Many host objects are `Object` objects that can coerce to strings\n // despite having improperly defined `toString` methods.\n var result = false;\n if (value != null && typeof value.toString != 'function') {\n try {\n result = !!(value + '');\n } catch (e) {}\n }\n return result;\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) ||\n objectToString.call(value) != objectTag || isHostObject(value)) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return (typeof Ctor == 'function' &&\n Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString);\n}\n\nmodule.exports = isPlainObject;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODE0Ni5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGdCQUFnQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9sb2Rhc2guaXNwbGFpbm9iamVjdC9pbmRleC5qcz9jZDkzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogbG9kYXNoIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBob3N0IG9iamVjdCBpbiBJRSA8IDkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBob3N0IG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0hvc3RPYmplY3QodmFsdWUpIHtcbiAgLy8gTWFueSBob3N0IG9iamVjdHMgYXJlIGBPYmplY3RgIG9iamVjdHMgdGhhdCBjYW4gY29lcmNlIHRvIHN0cmluZ3NcbiAgLy8gZGVzcGl0ZSBoYXZpbmcgaW1wcm9wZXJseSBkZWZpbmVkIGB0b1N0cmluZ2AgbWV0aG9kcy5cbiAgdmFyIHJlc3VsdCA9IGZhbHNlO1xuICBpZiAodmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSAhISh2YWx1ZSArICcnKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpO1xuICB9O1xufVxuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL1xudmFyIG9iamVjdEN0b3JTdHJpbmcgPSBmdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCB0aGF0IGlzLCBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGVcbiAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuOC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiB9XG4gKlxuICogXy5pc1BsYWluT2JqZWN0KG5ldyBGb28pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KHsgJ3gnOiAwLCAneSc6IDAgfSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fFxuICAgICAgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgIT0gb2JqZWN0VGFnIHx8IGlzSG9zdE9iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgaWYgKHByb3RvID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIEN0b3IgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCAnY29uc3RydWN0b3InKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgcmV0dXJuICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmXG4gICAgQ3RvciBpbnN0YW5jZW9mIEN0b3IgJiYgZnVuY1RvU3RyaW5nLmNhbGwoQ3RvcikgPT0gb2JqZWN0Q3RvclN0cmluZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQbGFpbk9iamVjdDtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8146\n")},6744:module=>{eval("/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n var length = array ? array.length : 0;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\n/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array ? array.length : 0;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\n/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n if (value !== value) {\n return baseFindIndex(array, baseIsNaN, fromIndex);\n }\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\n/**\n * Checks if a cache value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n // Many host objects are `Object` objects that can coerce to strings\n // despite having improperly defined `toString` methods.\n var result = false;\n if (value != null && typeof value.toString != 'function') {\n try {\n result = !!(value + '');\n } catch (e) {}\n }\n return result;\n}\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice,\n spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map'),\n Set = getNative(root, 'Set'),\n nativeCreate = getNative(Object, 'create');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n return this.has(key) && delete this.__data__[key];\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n return getMapData(this, key)['delete'](key);\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n getMapData(this, key).set(key, value);\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values ? values.length : 0;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\n/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = array;\n return apply(func, this, otherArgs);\n };\n}\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n};\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Creates an array of unique values, in order, from all given arrays using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([2], [1, 2]);\n * // => [2, 1]\n */\nvar union = baseRest(function(arrays) {\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n});\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n // No operation performed.\n}\n\nmodule.exports = union;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjc0NC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLEdBQUc7QUFDZCxXQUFXLE9BQU87QUFDbEIsYUFBYSxHQUFHO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxHQUFHO0FBQ2QsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLEdBQUc7QUFDZCxXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxHQUFHO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxHQUFHO0FBQ2QsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxHQUFHO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxHQUFHO0FBQ2QsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsUUFBUTtBQUNuQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsVUFBVTtBQUNyQixXQUFXLFVBQVU7QUFDckIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxHQUFHO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixtQkFBbUI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9sb2Rhc2gudW5pb24vaW5kZXguanM/MTNiYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIHNpemUgdG8gZW5hYmxlIGxhcmdlIGFycmF5IG9wdGltaXphdGlvbnMuICovXG52YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwLFxuICAgIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSc7XG5cbi8qKlxuICogVXNlZCB0byBtYXRjaCBgUmVnRXhwYFxuICogW3N5bnRheCBjaGFyYWN0ZXJzXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wYXR0ZXJucykuXG4gKi9cbnZhciByZVJlZ0V4cENoYXIgPSAvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBob3N0IGNvbnN0cnVjdG9ycyAoU2FmYXJpKS4gKi9cbnZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbi8qKlxuICogQSBmYXN0ZXIgYWx0ZXJuYXRpdmUgdG8gYEZ1bmN0aW9uI2FwcGx5YCwgdGhpcyBmdW5jdGlvbiBpbnZva2VzIGBmdW5jYFxuICogd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgIGFuZCB0aGUgYXJndW1lbnRzIG9mIGBhcmdzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5KGZ1bmMsIHRoaXNBcmcsIGFyZ3MpIHtcbiAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnKTtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgfVxuICByZXR1cm4gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbn1cblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5jbHVkZXNgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogc3BlY2lmeWluZyBhbiBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksIHZhbHVlKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7XG4gIHJldHVybiAhIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIDApID4gLTE7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhcnJheUluY2x1ZGVzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgY29tcGFyYXRvci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5jbHVkZXNXaXRoKGFycmF5LCB2YWx1ZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChjb21wYXJhdG9yKHZhbHVlLCBhcnJheVtpbmRleF0pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmluZEluZGV4YCBhbmQgYF8uZmluZExhc3RJbmRleGAgd2l0aG91dFxuICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCwgZnJvbVJpZ2h0KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICBpbmRleCA9IGZyb21JbmRleCArIChmcm9tUmlnaHQgPyAxIDogLTEpO1xuXG4gIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmluZGV4T2ZgIHdpdGhvdXQgYGZyb21JbmRleGAgYm91bmRzIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICBpZiAodmFsdWUgIT09IHZhbHVlKSB7XG4gICAgcmV0dXJuIGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJc05hTiwgZnJvbUluZGV4KTtcbiAgfVxuICB2YXIgaW5kZXggPSBmcm9tSW5kZXggLSAxLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmFOYCB3aXRob3V0IHN1cHBvcnQgZm9yIG51bWJlciBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBUaGUgY2FjaGUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gY2FjaGVIYXMoY2FjaGUsIGtleSkge1xuICByZXR1cm4gY2FjaGUuaGFzKGtleSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCwga2V5KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgaG9zdCBvYmplY3QgaW4gSUUgPCA5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgaG9zdCBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNIb3N0T2JqZWN0KHZhbHVlKSB7XG4gIC8vIE1hbnkgaG9zdCBvYmplY3RzIGFyZSBgT2JqZWN0YCBvYmplY3RzIHRoYXQgY2FuIGNvZXJjZSB0byBzdHJpbmdzXG4gIC8vIGRlc3BpdGUgaGF2aW5nIGltcHJvcGVybHkgZGVmaW5lZCBgdG9TdHJpbmdgIG1ldGhvZHMuXG4gIHZhciByZXN1bHQgPSBmYWxzZTtcbiAgaWYgKHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlLnRvU3RyaW5nICE9ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gISEodmFsdWUgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGBzZXRgIHRvIGFuIGFycmF5IG9mIGl0cyB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIHNldFRvQXJyYXkoc2V0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkoc2V0LnNpemUpO1xuXG4gIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZSxcbiAgICBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovXG52YXIgY29yZUpzRGF0YSA9IHJvb3RbJ19fY29yZS1qc19zaGFyZWRfXyddO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqL1xudmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJztcbn0oKSk7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xudmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBTeW1ib2wgPSByb290LlN5bWJvbCxcbiAgICBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlLFxuICAgIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlLFxuICAgIHNwcmVhZGFibGVTeW1ib2wgPSBTeW1ib2wgPyBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlIDogdW5kZWZpbmVkO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBNYXAgPSBnZXROYXRpdmUocm9vdCwgJ01hcCcpLFxuICAgIFNldCA9IGdldE5hdGl2ZShyb290LCAnU2V0JyksXG4gICAgbmF0aXZlQ3JlYXRlID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2NyZWF0ZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBoYXNoIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gSGFzaChlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA/IGVudHJpZXMubGVuZ3RoIDogMDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgSGFzaFxuICovXG5mdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtPYmplY3R9IGhhc2ggVGhlIGhhc2ggdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hEZWxldGUoa2V5KSB7XG4gIHJldHVybiB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG59XG5cbi8qKlxuICogR2V0cyB0aGUgaGFzaCB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBoYXNoR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIGlmIChuYXRpdmVDcmVhdGUpIHtcbiAgICB2YXIgcmVzdWx0ID0gZGF0YVtrZXldO1xuICAgIHJldHVybiByZXN1bHQgPT09IEhBU0hfVU5ERUZJTkVEID8gdW5kZWZpbmVkIDogcmVzdWx0O1xuICB9XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgaGFzaCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzaEhhcyhrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICByZXR1cm4gbmF0aXZlQ3JlYXRlID8gZGF0YVtrZXldICE9PSB1bmRlZmluZWQgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICByZXR1cm4gdGhpcztcbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG5IYXNoLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBoYXNoRGVsZXRlO1xuSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbkhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG5IYXNoLnByb3RvdHlwZS5zZXQgPSBoYXNoU2V0O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gbGlzdCBjYWNoZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA/IGVudHJpZXMubGVuZ3RoIDogMDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUNsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0gW107XG59XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBsYXN0SW5kZXggPSBkYXRhLmxlbmd0aCAtIDE7XG4gIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcbiAgICBkYXRhLnBvcCgpO1xuICB9IGVsc2Uge1xuICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkpID4gLTE7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgbGlzdCBjYWNoZSBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbGlzdCBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgZGF0YS5wdXNoKFtrZXksIHZhbHVlXSk7XG4gIH0gZWxzZSB7XG4gICAgZGF0YVtpbmRleF1bMV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYExpc3RDYWNoZWAuXG5MaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG5MaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTtcbkxpc3RDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbGlzdENhY2hlR2V0O1xuTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG5MaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID8gZW50cmllcy5sZW5ndGggOiAwO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbWFwLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSB7XG4gICAgJ2hhc2gnOiBuZXcgSGFzaCxcbiAgICAnbWFwJzogbmV3IChNYXAgfHwgTGlzdENhY2hlKSxcbiAgICAnc3RyaW5nJzogbmV3IEhhc2hcbiAgfTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbWFwLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpWydkZWxldGUnXShrZXkpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG1hcCB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbWFwIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuaGFzKGtleSk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgbWFwIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG1hcCBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICBnZXRNYXBEYXRhKHRoaXMsIGtleSkuc2V0KGtleSwgdmFsdWUpO1xuICByZXR1cm4gdGhpcztcbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYE1hcENhY2hlYC5cbk1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7XG5NYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbWFwQ2FjaGVEZWxldGU7XG5NYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbWFwQ2FjaGVHZXQ7XG5NYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7XG5NYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7XG5cbi8qKlxuICpcbiAqIENyZWF0ZXMgYW4gYXJyYXkgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gU2V0Q2FjaGUodmFsdWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gdmFsdWVzID8gdmFsdWVzLmxlbmd0aCA6IDA7XG5cbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKTtcbiAgfVxufVxuXG4vKipcbiAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGFkZFxuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAYWxpYXMgcHVzaFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgdGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsIEhBU0hfVU5ERUZJTkVEKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gdGhlIGFycmF5IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FjaGVIYXModmFsdWUpIHtcbiAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHZhbHVlKTtcbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFNldENhY2hlYC5cblNldENhY2hlLnByb3RvdHlwZS5hZGQgPSBTZXRDYWNoZS5wcm90b3R5cGUucHVzaCA9IHNldENhY2hlQWRkO1xuU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IHNldENhY2hlSGFzO1xuXG4vKipcbiAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBga2V5YCBpcyBmb3VuZCBpbiBgYXJyYXlgIG9mIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IGtleSBUaGUga2V5IHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksIGtleSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkge1xuICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGggc3VwcG9ydCBmb3IgcmVzdHJpY3RpbmcgZmxhdHRlbmluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiBAcGFyYW0ge251bWJlcn0gZGVwdGggVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICogQHBhcmFtIHtib29sZWFufSBbcHJlZGljYXRlPWlzRmxhdHRlbmFibGVdIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N0cmljdF0gUmVzdHJpY3QgdG8gdmFsdWVzIHRoYXQgcGFzcyBgcHJlZGljYXRlYCBjaGVja3MuXG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0PVtdXSBUaGUgaW5pdGlhbCByZXN1bHQgdmFsdWUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHByZWRpY2F0ZSB8fCAocHJlZGljYXRlID0gaXNGbGF0dGVuYWJsZSk7XG4gIHJlc3VsdCB8fCAocmVzdWx0ID0gW10pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgIGlmIChkZXB0aCA+IDAgJiYgcHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgaWYgKGRlcHRoID4gMSkge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBmbGF0dGVuIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBiYXNlRmxhdHRlbih2YWx1ZSwgZGVwdGggLSAxLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXlQdXNoKHJlc3VsdCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzU3RyaWN0KSB7XG4gICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkgfHwgaXNNYXNrZWQodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwYXR0ZXJuID0gKGlzRnVuY3Rpb24odmFsdWUpIHx8IGlzSG9zdE9iamVjdCh2YWx1ZSkpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcbiAgcmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlc3RgIHdoaWNoIGRvZXNuJ3QgdmFsaWRhdGUgb3IgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUmVzdChmdW5jLCBzdGFydCkge1xuICBzdGFydCA9IG5hdGl2ZU1heChzdGFydCA9PT0gdW5kZWZpbmVkID8gKGZ1bmMubGVuZ3RoIC0gMSkgOiBzdGFydCwgMCk7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3MubGVuZ3RoIC0gc3RhcnQsIDApLFxuICAgICAgICBhcnJheSA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgYXJyYXlbaW5kZXhdID0gYXJnc1tzdGFydCArIGluZGV4XTtcbiAgICB9XG4gICAgaW5kZXggPSAtMTtcbiAgICB2YXIgb3RoZXJBcmdzID0gQXJyYXkoc3RhcnQgKyAxKTtcbiAgICB3aGlsZSAoKytpbmRleCA8IHN0YXJ0KSB7XG4gICAgICBvdGhlckFyZ3NbaW5kZXhdID0gYXJnc1tpbmRleF07XG4gICAgfVxuICAgIG90aGVyQXJnc1tzdGFydF0gPSBhcnJheTtcbiAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZVVuaXEoYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgcmVzdWx0ID0gW10sXG4gICAgICBzZWVuID0gcmVzdWx0O1xuXG4gIGlmIChjb21wYXJhdG9yKSB7XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuICB9XG4gIGVsc2UgaWYgKGxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgdmFyIHNldCA9IGl0ZXJhdGVlID8gbnVsbCA6IGNyZWF0ZVNldChhcnJheSk7XG4gICAgaWYgKHNldCkge1xuICAgICAgcmV0dXJuIHNldFRvQXJyYXkoc2V0KTtcbiAgICB9XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgIHNlZW4gPSBuZXcgU2V0Q2FjaGU7XG4gIH1cbiAgZWxzZSB7XG4gICAgc2VlbiA9IGl0ZXJhdGVlID8gW10gOiByZXN1bHQ7XG4gIH1cbiAgb3V0ZXI6XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICB2YXIgc2VlbkluZGV4ID0gc2Vlbi5sZW5ndGg7XG4gICAgICB3aGlsZSAoc2VlbkluZGV4LS0pIHtcbiAgICAgICAgaWYgKHNlZW5bc2VlbkluZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFpbmNsdWRlcyhzZWVuLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgIGlmIChzZWVuICE9PSByZXN1bHQpIHtcbiAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2V0IG9iamVjdCBvZiBgdmFsdWVzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYWRkIHRvIHRoZSBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgc2V0LlxuICovXG52YXIgY3JlYXRlU2V0ID0gIShTZXQgJiYgKDEgLyBzZXRUb0FycmF5KG5ldyBTZXQoWywtMF0pKVsxXSkgPT0gSU5GSU5JVFkpID8gbm9vcCA6IGZ1bmN0aW9uKHZhbHVlcykge1xuICByZXR1cm4gbmV3IFNldCh2YWx1ZXMpO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBkYXRhIGZvciBgbWFwYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgcmVmZXJlbmNlIGtleS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXAgZGF0YS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWFwRGF0YShtYXAsIGtleSkge1xuICB2YXIgZGF0YSA9IG1hcC5fX2RhdGFfXztcbiAgcmV0dXJuIGlzS2V5YWJsZShrZXkpXG4gICAgPyBkYXRhW3R5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyAnc3RyaW5nJyA6ICdoYXNoJ11cbiAgICA6IGRhdGEubWFwO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkpIHtcbiAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmxhdHRlbmFibGUgYGFyZ3VtZW50c2Agb2JqZWN0IG9yIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZsYXR0ZW5hYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSB8fFxuICAgICEhKHNwcmVhZGFibGVTeW1ib2wgJiYgdmFsdWUgJiYgdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgdW5pcXVlIG9iamVjdCBrZXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gKHR5cGUgPT0gJ3N0cmluZycgfHwgdHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nKVxuICAgID8gKHZhbHVlICE9PSAnX19wcm90b19fJylcbiAgICA6ICh2YWx1ZSA9PT0gbnVsbCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgaXRzIHNvdXJjZSBtYXNrZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNNYXNrZWQoZnVuYykge1xuICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIChtYXNrU3JjS2V5IGluIGZ1bmMpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVzLCBpbiBvcmRlciwgZnJvbSBhbGwgZ2l2ZW4gYXJyYXlzIHVzaW5nXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnVuaW9uKFsyXSwgWzEsIDJdKTtcbiAqIC8vID0+IFsyLCAxXVxuICovXG52YXIgdW5pb24gPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpKTtcbn0pO1xuXG4vKipcbiAqIFBlcmZvcm1zIGFcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gKlxuICogXy5lcShvYmplY3QsIG9iamVjdCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcShvYmplY3QsIG90aGVyKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcSgnYScsICdhJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcSgnYScsIE9iamVjdCgnYScpKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcShOYU4sIE5hTik7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPT09IG90aGVyIHx8ICh2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUpIHtcbiAgLy8gU2FmYXJpIDguMSBtYWtlcyBgYXJndW1lbnRzLmNhbGxlZWAgZW51bWVyYWJsZSBpbiBzdHJpY3QgbW9kZS5cbiAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgJiZcbiAgICAoIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICdjYWxsZWUnKSB8fCBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBhcmdzVGFnKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS4gQSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFycmF5LWxpa2UgaWYgaXQnc1xuICogbm90IGEgZnVuY3Rpb24gYW5kIGhhcyBhIGB2YWx1ZS5sZW5ndGhgIHRoYXQncyBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvclxuICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgIWlzRnVuY3Rpb24odmFsdWUpO1xufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNBcnJheUxpa2VgIGV4Y2VwdCB0aGF0IGl0IGFsc28gY2hlY2tzIGlmIGB2YWx1ZWBcbiAqIGlzIGFuIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS1saWtlIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOC05IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5IGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBpc09iamVjdCh2YWx1ZSkgPyBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNMZW5ndGgoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi4zLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5ub29wKTtcbiAqIC8vID0+IFt1bmRlZmluZWQsIHVuZGVmaW5lZF1cbiAqL1xuZnVuY3Rpb24gbm9vcCgpIHtcbiAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1bmlvbjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6744\n")},4842:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/*!\n * mime-db\n * Copyright(c) 2014 Jonathan Ong\n * Copyright(c) 2015-2022 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n/**\n * Module exports.\n */\n\nmodule.exports = __webpack_require__(3765)\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDg0Mi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDBDQUFxQyIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL21pbWUtZGIvaW5kZXguanM/YjRmNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIG1pbWUtZGJcbiAqIENvcHlyaWdodChjKSAyMDE0IEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTUtMjAyMiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZGIuanNvbicpXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4842\n")},983:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("/*!\n * mime-types\n * Copyright(c) 2014 Jonathan Ong\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n\n\n/**\n * Module dependencies.\n * @private\n */\n\nvar db = __webpack_require__(4842)\nvar extname = (__webpack_require__(1017).extname)\n\n/**\n * Module variables.\n * @private\n */\n\nvar EXTRACT_TYPE_REGEXP = /^\\s*([^;\\s]*)(?:;|\\s|$)/\nvar TEXT_TYPE_REGEXP = /^text\\//i\n\n/**\n * Module exports.\n * @public\n */\n\nexports.charset = charset\nexports.charsets = { lookup: charset }\nexports.contentType = contentType\nexports.extension = extension\nexports.extensions = Object.create(null)\nexports.lookup = lookup\nexports.types = Object.create(null)\n\n// Populate the extensions/types maps\npopulateMaps(exports.extensions, exports.types)\n\n/**\n * Get the default charset for a MIME type.\n *\n * @param {string} type\n * @return {boolean|string}\n */\n\nfunction charset (type) {\n if (!type || typeof type !== 'string') {\n return false\n }\n\n // TODO: use media-typer\n var match = EXTRACT_TYPE_REGEXP.exec(type)\n var mime = match && db[match[1].toLowerCase()]\n\n if (mime && mime.charset) {\n return mime.charset\n }\n\n // default text/* to utf-8\n if (match && TEXT_TYPE_REGEXP.test(match[1])) {\n return 'UTF-8'\n }\n\n return false\n}\n\n/**\n * Create a full Content-Type header given a MIME type or extension.\n *\n * @param {string} str\n * @return {boolean|string}\n */\n\nfunction contentType (str) {\n // TODO: should this even be in this module?\n if (!str || typeof str !== 'string') {\n return false\n }\n\n var mime = str.indexOf('/') === -1\n ? exports.lookup(str)\n : str\n\n if (!mime) {\n return false\n }\n\n // TODO: use content-type or other module\n if (mime.indexOf('charset') === -1) {\n var charset = exports.charset(mime)\n if (charset) mime += '; charset=' + charset.toLowerCase()\n }\n\n return mime\n}\n\n/**\n * Get the default extension for a MIME type.\n *\n * @param {string} type\n * @return {boolean|string}\n */\n\nfunction extension (type) {\n if (!type || typeof type !== 'string') {\n return false\n }\n\n // TODO: use media-typer\n var match = EXTRACT_TYPE_REGEXP.exec(type)\n\n // get extensions\n var exts = match && exports.extensions[match[1].toLowerCase()]\n\n if (!exts || !exts.length) {\n return false\n }\n\n return exts[0]\n}\n\n/**\n * Lookup the MIME type for a file path/extension.\n *\n * @param {string} path\n * @return {boolean|string}\n */\n\nfunction lookup (path) {\n if (!path || typeof path !== 'string') {\n return false\n }\n\n // get the extension (\"ext\" or \".ext\" or full path)\n var extension = extname('x.' + path)\n .toLowerCase()\n .substr(1)\n\n if (!extension) {\n return false\n }\n\n return exports.types[extension] || false\n}\n\n/**\n * Populate the extensions and types maps.\n * @private\n */\n\nfunction populateMaps (extensions, types) {\n // source preference (least -> most)\n var preference = ['nginx', 'apache', undefined, 'iana']\n\n Object.keys(db).forEach(function forEachMimeType (type) {\n var mime = db[type]\n var exts = mime.extensions\n\n if (!exts || !exts.length) {\n return\n }\n\n // mime -> extensions\n extensions[type] = exts\n\n // extension -> mime\n for (var i = 0; i < exts.length; i++) {\n var extension = exts[i]\n\n if (types[extension]) {\n var from = preference.indexOf(db[types[extension]].source)\n var to = preference.indexOf(mime.source)\n\n if (types[extension] !== 'application/octet-stream' &&\n (from > to || (from === to && types[extension].substr(0, 12) === 'application/'))) {\n // skip the remapping\n continue\n }\n }\n\n // set the extension -> mime\n types[extension] = type\n }\n })\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTgzLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFWTs7QUFFWjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTLG1CQUFPLENBQUMsSUFBUztBQUMxQixjQUFjLG1DQUF1Qjs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUNBQW1DLFNBQVM7QUFDNUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZUFBZTtBQUNmLGdCQUFnQixLQUFLO0FBQ3JCLG1CQUFtQjtBQUNuQixpQkFBaUI7QUFDakIsa0JBQWtCO0FBQ2xCLGNBQWM7QUFDZCxhQUFhOztBQUViO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL21pbWUtdHlwZXMvaW5kZXguanM/Y2MxZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIG1pbWUtdHlwZXNcbiAqIENvcHlyaWdodChjKSAyMDE0IEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBkYiA9IHJlcXVpcmUoJ21pbWUtZGInKVxudmFyIGV4dG5hbWUgPSByZXF1aXJlKCdwYXRoJykuZXh0bmFtZVxuXG4vKipcbiAqIE1vZHVsZSB2YXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBFWFRSQUNUX1RZUEVfUkVHRVhQID0gL15cXHMqKFteO1xcc10qKSg/Ojt8XFxzfCQpL1xudmFyIFRFWFRfVFlQRV9SRUdFWFAgPSAvXnRleHRcXC8vaVxuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbmV4cG9ydHMuY2hhcnNldCA9IGNoYXJzZXRcbmV4cG9ydHMuY2hhcnNldHMgPSB7IGxvb2t1cDogY2hhcnNldCB9XG5leHBvcnRzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGVcbmV4cG9ydHMuZXh0ZW5zaW9uID0gZXh0ZW5zaW9uXG5leHBvcnRzLmV4dGVuc2lvbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5leHBvcnRzLmxvb2t1cCA9IGxvb2t1cFxuZXhwb3J0cy50eXBlcyA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuLy8gUG9wdWxhdGUgdGhlIGV4dGVuc2lvbnMvdHlwZXMgbWFwc1xucG9wdWxhdGVNYXBzKGV4cG9ydHMuZXh0ZW5zaW9ucywgZXhwb3J0cy50eXBlcylcblxuLyoqXG4gKiBHZXQgdGhlIGRlZmF1bHQgY2hhcnNldCBmb3IgYSBNSU1FIHR5cGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge2Jvb2xlYW58c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGNoYXJzZXQgKHR5cGUpIHtcbiAgaWYgKCF0eXBlIHx8IHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gVE9ETzogdXNlIG1lZGlhLXR5cGVyXG4gIHZhciBtYXRjaCA9IEVYVFJBQ1RfVFlQRV9SRUdFWFAuZXhlYyh0eXBlKVxuICB2YXIgbWltZSA9IG1hdGNoICYmIGRiW21hdGNoWzFdLnRvTG93ZXJDYXNlKCldXG5cbiAgaWYgKG1pbWUgJiYgbWltZS5jaGFyc2V0KSB7XG4gICAgcmV0dXJuIG1pbWUuY2hhcnNldFxuICB9XG5cbiAgLy8gZGVmYXVsdCB0ZXh0LyogdG8gdXRmLThcbiAgaWYgKG1hdGNoICYmIFRFWFRfVFlQRV9SRUdFWFAudGVzdChtYXRjaFsxXSkpIHtcbiAgICByZXR1cm4gJ1VURi04J1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZnVsbCBDb250ZW50LVR5cGUgaGVhZGVyIGdpdmVuIGEgTUlNRSB0eXBlIG9yIGV4dGVuc2lvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtib29sZWFufHN0cmluZ31cbiAqL1xuXG5mdW5jdGlvbiBjb250ZW50VHlwZSAoc3RyKSB7XG4gIC8vIFRPRE86IHNob3VsZCB0aGlzIGV2ZW4gYmUgaW4gdGhpcyBtb2R1bGU/XG4gIGlmICghc3RyIHx8IHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICB2YXIgbWltZSA9IHN0ci5pbmRleE9mKCcvJykgPT09IC0xXG4gICAgPyBleHBvcnRzLmxvb2t1cChzdHIpXG4gICAgOiBzdHJcblxuICBpZiAoIW1pbWUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFRPRE86IHVzZSBjb250ZW50LXR5cGUgb3Igb3RoZXIgbW9kdWxlXG4gIGlmIChtaW1lLmluZGV4T2YoJ2NoYXJzZXQnKSA9PT0gLTEpIHtcbiAgICB2YXIgY2hhcnNldCA9IGV4cG9ydHMuY2hhcnNldChtaW1lKVxuICAgIGlmIChjaGFyc2V0KSBtaW1lICs9ICc7IGNoYXJzZXQ9JyArIGNoYXJzZXQudG9Mb3dlckNhc2UoKVxuICB9XG5cbiAgcmV0dXJuIG1pbWVcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGRlZmF1bHQgZXh0ZW5zaW9uIGZvciBhIE1JTUUgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHJldHVybiB7Ym9vbGVhbnxzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gZXh0ZW5zaW9uICh0eXBlKSB7XG4gIGlmICghdHlwZSB8fCB0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFRPRE86IHVzZSBtZWRpYS10eXBlclxuICB2YXIgbWF0Y2ggPSBFWFRSQUNUX1RZUEVfUkVHRVhQLmV4ZWModHlwZSlcblxuICAvLyBnZXQgZXh0ZW5zaW9uc1xuICB2YXIgZXh0cyA9IG1hdGNoICYmIGV4cG9ydHMuZXh0ZW5zaW9uc1ttYXRjaFsxXS50b0xvd2VyQ2FzZSgpXVxuXG4gIGlmICghZXh0cyB8fCAhZXh0cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiBleHRzWzBdXG59XG5cbi8qKlxuICogTG9va3VwIHRoZSBNSU1FIHR5cGUgZm9yIGEgZmlsZSBwYXRoL2V4dGVuc2lvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHJldHVybiB7Ym9vbGVhbnxzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gbG9va3VwIChwYXRoKSB7XG4gIGlmICghcGF0aCB8fCB0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIGdldCB0aGUgZXh0ZW5zaW9uIChcImV4dFwiIG9yIFwiLmV4dFwiIG9yIGZ1bGwgcGF0aClcbiAgdmFyIGV4dGVuc2lvbiA9IGV4dG5hbWUoJ3guJyArIHBhdGgpXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAuc3Vic3RyKDEpXG5cbiAgaWYgKCFleHRlbnNpb24pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiBleHBvcnRzLnR5cGVzW2V4dGVuc2lvbl0gfHwgZmFsc2Vcbn1cblxuLyoqXG4gKiBQb3B1bGF0ZSB0aGUgZXh0ZW5zaW9ucyBhbmQgdHlwZXMgbWFwcy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcG9wdWxhdGVNYXBzIChleHRlbnNpb25zLCB0eXBlcykge1xuICAvLyBzb3VyY2UgcHJlZmVyZW5jZSAobGVhc3QgLT4gbW9zdClcbiAgdmFyIHByZWZlcmVuY2UgPSBbJ25naW54JywgJ2FwYWNoZScsIHVuZGVmaW5lZCwgJ2lhbmEnXVxuXG4gIE9iamVjdC5rZXlzKGRiKS5mb3JFYWNoKGZ1bmN0aW9uIGZvckVhY2hNaW1lVHlwZSAodHlwZSkge1xuICAgIHZhciBtaW1lID0gZGJbdHlwZV1cbiAgICB2YXIgZXh0cyA9IG1pbWUuZXh0ZW5zaW9uc1xuXG4gICAgaWYgKCFleHRzIHx8ICFleHRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gbWltZSAtPiBleHRlbnNpb25zXG4gICAgZXh0ZW5zaW9uc1t0eXBlXSA9IGV4dHNcblxuICAgIC8vIGV4dGVuc2lvbiAtPiBtaW1lXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZXh0ZW5zaW9uID0gZXh0c1tpXVxuXG4gICAgICBpZiAodHlwZXNbZXh0ZW5zaW9uXSkge1xuICAgICAgICB2YXIgZnJvbSA9IHByZWZlcmVuY2UuaW5kZXhPZihkYlt0eXBlc1tleHRlbnNpb25dXS5zb3VyY2UpXG4gICAgICAgIHZhciB0byA9IHByZWZlcmVuY2UuaW5kZXhPZihtaW1lLnNvdXJjZSlcblxuICAgICAgICBpZiAodHlwZXNbZXh0ZW5zaW9uXSAhPT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgJiZcbiAgICAgICAgICAoZnJvbSA+IHRvIHx8IChmcm9tID09PSB0byAmJiB0eXBlc1tleHRlbnNpb25dLnN1YnN0cigwLCAxMikgPT09ICdhcHBsaWNhdGlvbi8nKSkpIHtcbiAgICAgICAgICAvLyBza2lwIHRoZSByZW1hcHBpbmdcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHNldCB0aGUgZXh0ZW5zaW9uIC0+IG1pbWVcbiAgICAgIHR5cGVzW2V4dGVuc2lvbl0gPSB0eXBlXG4gICAgfVxuICB9KVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///983\n")},1171:(module,__unused_webpack_exports,__webpack_require__)=>{eval("module.exports = minimatch\nminimatch.Minimatch = Minimatch\n\nvar path = (function () { try { return __webpack_require__(1017) } catch (e) {}}()) || {\n sep: '/'\n}\nminimatch.sep = path.sep\n\nvar GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}\nvar expand = __webpack_require__(3644)\n\nvar plTypes = {\n '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},\n '?': { open: '(?:', close: ')?' },\n '+': { open: '(?:', close: ')+' },\n '*': { open: '(?:', close: ')*' },\n '@': { open: '(?:', close: ')' }\n}\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nvar qmark = '[^/]'\n\n// * => any number of characters\nvar star = qmark + '*?'\n\n// ** when dots are allowed. Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nvar twoStarDot = '(?:(?!(?:\\\\\\/|^)(?:\\\\.{1,2})($|\\\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nvar twoStarNoDot = '(?:(?!(?:\\\\\\/|^)\\\\.).)*?'\n\n// characters that need to be escaped in RegExp.\nvar reSpecials = charSet('().*{}+?[]^$\\\\!')\n\n// \"abc\" -> { a:true, b:true, c:true }\nfunction charSet (s) {\n return s.split('').reduce(function (set, c) {\n set[c] = true\n return set\n }, {})\n}\n\n// normalizes slashes.\nvar slashSplit = /\\/+/\n\nminimatch.filter = filter\nfunction filter (pattern, options) {\n options = options || {}\n return function (p, i, list) {\n return minimatch(p, pattern, options)\n }\n}\n\nfunction ext (a, b) {\n b = b || {}\n var t = {}\n Object.keys(a).forEach(function (k) {\n t[k] = a[k]\n })\n Object.keys(b).forEach(function (k) {\n t[k] = b[k]\n })\n return t\n}\n\nminimatch.defaults = function (def) {\n if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n return minimatch\n }\n\n var orig = minimatch\n\n var m = function minimatch (p, pattern, options) {\n return orig(p, pattern, ext(def, options))\n }\n\n m.Minimatch = function Minimatch (pattern, options) {\n return new orig.Minimatch(pattern, ext(def, options))\n }\n m.Minimatch.defaults = function defaults (options) {\n return orig.defaults(ext(def, options)).Minimatch\n }\n\n m.filter = function filter (pattern, options) {\n return orig.filter(pattern, ext(def, options))\n }\n\n m.defaults = function defaults (options) {\n return orig.defaults(ext(def, options))\n }\n\n m.makeRe = function makeRe (pattern, options) {\n return orig.makeRe(pattern, ext(def, options))\n }\n\n m.braceExpand = function braceExpand (pattern, options) {\n return orig.braceExpand(pattern, ext(def, options))\n }\n\n m.match = function (list, pattern, options) {\n return orig.match(list, pattern, ext(def, options))\n }\n\n return m\n}\n\nMinimatch.defaults = function (def) {\n return minimatch.defaults(def).Minimatch\n}\n\nfunction minimatch (p, pattern, options) {\n assertValidPattern(pattern)\n\n if (!options) options = {}\n\n // shortcut: comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n return false\n }\n\n return new Minimatch(pattern, options).match(p)\n}\n\nfunction Minimatch (pattern, options) {\n if (!(this instanceof Minimatch)) {\n return new Minimatch(pattern, options)\n }\n\n assertValidPattern(pattern)\n\n if (!options) options = {}\n\n pattern = pattern.trim()\n\n // windows support: need to use /, not \\\n if (!options.allowWindowsEscape && path.sep !== '/') {\n pattern = pattern.split(path.sep).join('/')\n }\n\n this.options = options\n this.set = []\n this.pattern = pattern\n this.regexp = null\n this.negate = false\n this.comment = false\n this.empty = false\n this.partial = !!options.partial\n\n // make the set of regexps etc.\n this.make()\n}\n\nMinimatch.prototype.debug = function () {}\n\nMinimatch.prototype.make = make\nfunction make () {\n var pattern = this.pattern\n var options = this.options\n\n // empty patterns and comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n this.comment = true\n return\n }\n if (!pattern) {\n this.empty = true\n return\n }\n\n // step 1: figure out negation, etc.\n this.parseNegate()\n\n // step 2: expand braces\n var set = this.globSet = this.braceExpand()\n\n if (options.debug) this.debug = function debug() { console.error.apply(console, arguments) }\n\n this.debug(this.pattern, set)\n\n // step 3: now we have a set, so turn each one into a series of path-portion\n // matching patterns.\n // These will be regexps, except in the case of \"**\", which is\n // set to the GLOBSTAR object for globstar behavior,\n // and will not contain any / characters\n set = this.globParts = set.map(function (s) {\n return s.split(slashSplit)\n })\n\n this.debug(this.pattern, set)\n\n // glob --\x3e regexps\n set = set.map(function (s, si, set) {\n return s.map(this.parse, this)\n }, this)\n\n this.debug(this.pattern, set)\n\n // filter out everything that didn't compile properly.\n set = set.filter(function (s) {\n return s.indexOf(false) === -1\n })\n\n this.debug(this.pattern, set)\n\n this.set = set\n}\n\nMinimatch.prototype.parseNegate = parseNegate\nfunction parseNegate () {\n var pattern = this.pattern\n var negate = false\n var options = this.options\n var negateOffset = 0\n\n if (options.nonegate) return\n\n for (var i = 0, l = pattern.length\n ; i < l && pattern.charAt(i) === '!'\n ; i++) {\n negate = !negate\n negateOffset++\n }\n\n if (negateOffset) this.pattern = pattern.substr(negateOffset)\n this.negate = negate\n}\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nminimatch.braceExpand = function (pattern, options) {\n return braceExpand(pattern, options)\n}\n\nMinimatch.prototype.braceExpand = braceExpand\n\nfunction braceExpand (pattern, options) {\n if (!options) {\n if (this instanceof Minimatch) {\n options = this.options\n } else {\n options = {}\n }\n }\n\n pattern = typeof pattern === 'undefined'\n ? this.pattern : pattern\n\n assertValidPattern(pattern)\n\n // Thanks to Yeting Li for\n // improving this regexp to avoid a ReDOS vulnerability.\n if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n // shortcut. no need to expand.\n return [pattern]\n }\n\n return expand(pattern)\n}\n\nvar MAX_PATTERN_LENGTH = 1024 * 64\nvar assertValidPattern = function (pattern) {\n if (typeof pattern !== 'string') {\n throw new TypeError('invalid pattern')\n }\n\n if (pattern.length > MAX_PATTERN_LENGTH) {\n throw new TypeError('pattern is too long')\n }\n}\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion. Otherwise, any series\n// of * is equivalent to a single *. Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\nMinimatch.prototype.parse = parse\nvar SUBPARSE = {}\nfunction parse (pattern, isSub) {\n assertValidPattern(pattern)\n\n var options = this.options\n\n // shortcuts\n if (pattern === '**') {\n if (!options.noglobstar)\n return GLOBSTAR\n else\n pattern = '*'\n }\n if (pattern === '') return ''\n\n var re = ''\n var hasMagic = !!options.nocase\n var escaping = false\n // ? => one single character\n var patternListStack = []\n var negativeLists = []\n var stateChar\n var inClass = false\n var reClassStart = -1\n var classStart = -1\n // . and .. never match anything that doesn't start with .,\n // even when options.dot is set.\n var patternStart = pattern.charAt(0) === '.' ? '' // anything\n // not (start or / followed by . or .. followed by / or end)\n : options.dot ? '(?!(?:^|\\\\\\/)\\\\.{1,2}(?:$|\\\\\\/))'\n : '(?!\\\\.)'\n var self = this\n\n function clearStateChar () {\n if (stateChar) {\n // we had some state-tracking character\n // that wasn't consumed by this pass.\n switch (stateChar) {\n case '*':\n re += star\n hasMagic = true\n break\n case '?':\n re += qmark\n hasMagic = true\n break\n default:\n re += '\\\\' + stateChar\n break\n }\n self.debug('clearStateChar %j %j', stateChar, re)\n stateChar = false\n }\n }\n\n for (var i = 0, len = pattern.length, c\n ; (i < len) && (c = pattern.charAt(i))\n ; i++) {\n this.debug('%s\\t%s %s %j', pattern, i, re, c)\n\n // skip over any that are escaped.\n if (escaping && reSpecials[c]) {\n re += '\\\\' + c\n escaping = false\n continue\n }\n\n switch (c) {\n /* istanbul ignore next */\n case '/': {\n // completely not allowed, even escaped.\n // Should already be path-split by now.\n return false\n }\n\n case '\\\\':\n clearStateChar()\n escaping = true\n continue\n\n // the various stateChar values\n // for the \"extglob\" stuff.\n case '?':\n case '*':\n case '+':\n case '@':\n case '!':\n this.debug('%s\\t%s %s %j <-- stateChar', pattern, i, re, c)\n\n // all of those are literals inside a class, except that\n // the glob [!a] means [^a] in regexp\n if (inClass) {\n this.debug(' in class')\n if (c === '!' && i === classStart + 1) c = '^'\n re += c\n continue\n }\n\n // if we already have a stateChar, then it means\n // that there was something like ** or +? in there.\n // Handle the stateChar, then proceed with this one.\n self.debug('call clearStateChar %j', stateChar)\n clearStateChar()\n stateChar = c\n // if extglob is disabled, then +(asdf|foo) isn't a thing.\n // just clear the statechar *now*, rather than even diving into\n // the patternList stuff.\n if (options.noext) clearStateChar()\n continue\n\n case '(':\n if (inClass) {\n re += '('\n continue\n }\n\n if (!stateChar) {\n re += '\\\\('\n continue\n }\n\n patternListStack.push({\n type: stateChar,\n start: i - 1,\n reStart: re.length,\n open: plTypes[stateChar].open,\n close: plTypes[stateChar].close\n })\n // negation is (?:(?!js)[^/]*)\n re += stateChar === '!' ? '(?:(?!(?:' : '(?:'\n this.debug('plType %j %j', stateChar, re)\n stateChar = false\n continue\n\n case ')':\n if (inClass || !patternListStack.length) {\n re += '\\\\)'\n continue\n }\n\n clearStateChar()\n hasMagic = true\n var pl = patternListStack.pop()\n // negation is (?:(?!js)[^/]*)\n // The others are (?:)\n re += pl.close\n if (pl.type === '!') {\n negativeLists.push(pl)\n }\n pl.reEnd = re.length\n continue\n\n case '|':\n if (inClass || !patternListStack.length || escaping) {\n re += '\\\\|'\n escaping = false\n continue\n }\n\n clearStateChar()\n re += '|'\n continue\n\n // these are mostly the same in regexp and glob\n case '[':\n // swallow any state-tracking char before the [\n clearStateChar()\n\n if (inClass) {\n re += '\\\\' + c\n continue\n }\n\n inClass = true\n classStart = i\n reClassStart = re.length\n re += c\n continue\n\n case ']':\n // a right bracket shall lose its special\n // meaning and represent itself in\n // a bracket expression if it occurs\n // first in the list. -- POSIX.2 2.8.3.2\n if (i === classStart + 1 || !inClass) {\n re += '\\\\' + c\n escaping = false\n continue\n }\n\n // handle the case where we left a class open.\n // \"[z-a]\" is valid, equivalent to \"\\[z-a\\]\"\n // split where the last [ was, make sure we don't have\n // an invalid re. if so, re-walk the contents of the\n // would-be class to re-translate any characters that\n // were passed through as-is\n // TODO: It would probably be faster to determine this\n // without a try/catch and a new RegExp, but it's tricky\n // to do safely. For now, this is safe and works.\n var cs = pattern.substring(classStart + 1, i)\n try {\n RegExp('[' + cs + ']')\n } catch (er) {\n // not a valid class!\n var sp = this.parse(cs, SUBPARSE)\n re = re.substr(0, reClassStart) + '\\\\[' + sp[0] + '\\\\]'\n hasMagic = hasMagic || sp[1]\n inClass = false\n continue\n }\n\n // finish up the class.\n hasMagic = true\n inClass = false\n re += c\n continue\n\n default:\n // swallow any state char that wasn't consumed\n clearStateChar()\n\n if (escaping) {\n // no need\n escaping = false\n } else if (reSpecials[c]\n && !(c === '^' && inClass)) {\n re += '\\\\'\n }\n\n re += c\n\n } // switch\n } // for\n\n // handle the case where we left a class open.\n // \"[abc\" is valid, equivalent to \"\\[abc\"\n if (inClass) {\n // split where the last [ was, and escape it\n // this is a huge pita. We now have to re-walk\n // the contents of the would-be class to re-translate\n // any characters that were passed through as-is\n cs = pattern.substr(classStart + 1)\n sp = this.parse(cs, SUBPARSE)\n re = re.substr(0, reClassStart) + '\\\\[' + sp[0]\n hasMagic = hasMagic || sp[1]\n }\n\n // handle the case where we had a +( thing at the *end*\n // of the pattern.\n // each pattern list stack adds 3 chars, and we need to go through\n // and escape any | chars that were passed through as-is for the regexp.\n // Go through and escape them, taking care not to double-escape any\n // | chars that were already escaped.\n for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {\n var tail = re.slice(pl.reStart + pl.open.length)\n this.debug('setting tail', re, pl)\n // maybe some even number of \\, then maybe 1 \\, followed by a |\n tail = tail.replace(/((?:\\\\{2}){0,64})(\\\\?)\\|/g, function (_, $1, $2) {\n if (!$2) {\n // the | isn't already escaped, so escape it.\n $2 = '\\\\'\n }\n\n // need to escape all those slashes *again*, without escaping the\n // one that we need for escaping the | character. As it works out,\n // escaping an even number of slashes can be done by simply repeating\n // it exactly after itself. That's why this trick works.\n //\n // I am sorry that you have to see this.\n return $1 + $1 + $2 + '|'\n })\n\n this.debug('tail=%j\\n %s', tail, tail, pl, re)\n var t = pl.type === '*' ? star\n : pl.type === '?' ? qmark\n : '\\\\' + pl.type\n\n hasMagic = true\n re = re.slice(0, pl.reStart) + t + '\\\\(' + tail\n }\n\n // handle trailing things that only matter at the very end.\n clearStateChar()\n if (escaping) {\n // trailing \\\\\n re += '\\\\\\\\'\n }\n\n // only need to apply the nodot start if the re starts with\n // something that could conceivably capture a dot\n var addPatternStart = false\n switch (re.charAt(0)) {\n case '[': case '.': case '(': addPatternStart = true\n }\n\n // Hack to work around lack of negative lookbehind in JS\n // A pattern like: *.!(x).!(y|z) needs to ensure that a name\n // like 'a.xyz.yz' doesn't match. So, the first negative\n // lookahead, has to look ALL the way ahead, to the end of\n // the pattern.\n for (var n = negativeLists.length - 1; n > -1; n--) {\n var nl = negativeLists[n]\n\n var nlBefore = re.slice(0, nl.reStart)\n var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)\n var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)\n var nlAfter = re.slice(nl.reEnd)\n\n nlLast += nlAfter\n\n // Handle nested stuff like *(*.js|!(*.json)), where open parens\n // mean that we should *not* include the ) in the bit that is considered\n // \"after\" the negated section.\n var openParensBefore = nlBefore.split('(').length - 1\n var cleanAfter = nlAfter\n for (i = 0; i < openParensBefore; i++) {\n cleanAfter = cleanAfter.replace(/\\)[+*?]?/, '')\n }\n nlAfter = cleanAfter\n\n var dollar = ''\n if (nlAfter === '' && isSub !== SUBPARSE) {\n dollar = '$'\n }\n var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast\n re = newRe\n }\n\n // if the re is not \"\" at this point, then we need to make sure\n // it doesn't match against an empty path part.\n // Otherwise a/* will match a/, which it should not.\n if (re !== '' && hasMagic) {\n re = '(?=.)' + re\n }\n\n if (addPatternStart) {\n re = patternStart + re\n }\n\n // parsing just a piece of a larger pattern.\n if (isSub === SUBPARSE) {\n return [re, hasMagic]\n }\n\n // skip the regexp for non-magical patterns\n // unescape anything in it, though, so that it'll be\n // an exact match against a file etc.\n if (!hasMagic) {\n return globUnescape(pattern)\n }\n\n var flags = options.nocase ? 'i' : ''\n try {\n var regExp = new RegExp('^' + re + '$', flags)\n } catch (er) /* istanbul ignore next - should be impossible */ {\n // If it was an invalid regular expression, then it can't match\n // anything. This trick looks for a character after the end of\n // the string, which is of course impossible, except in multi-line\n // mode, but it's not a /m regex.\n return new RegExp('$.')\n }\n\n regExp._glob = pattern\n regExp._src = re\n\n return regExp\n}\n\nminimatch.makeRe = function (pattern, options) {\n return new Minimatch(pattern, options || {}).makeRe()\n}\n\nMinimatch.prototype.makeRe = makeRe\nfunction makeRe () {\n if (this.regexp || this.regexp === false) return this.regexp\n\n // at this point, this.set is a 2d array of partial\n // pattern strings, or \"**\".\n //\n // It's better to use .match(). This function shouldn't\n // be used, really, but it's pretty convenient sometimes,\n // when you just want to work with a regex.\n var set = this.set\n\n if (!set.length) {\n this.regexp = false\n return this.regexp\n }\n var options = this.options\n\n var twoStar = options.noglobstar ? star\n : options.dot ? twoStarDot\n : twoStarNoDot\n var flags = options.nocase ? 'i' : ''\n\n var re = set.map(function (pattern) {\n return pattern.map(function (p) {\n return (p === GLOBSTAR) ? twoStar\n : (typeof p === 'string') ? regExpEscape(p)\n : p._src\n }).join('\\\\\\/')\n }).join('|')\n\n // must match entire pattern\n // ending in a * or ** will make it less strict.\n re = '^(?:' + re + ')$'\n\n // can match anything, as long as it's not this.\n if (this.negate) re = '^(?!' + re + ').*$'\n\n try {\n this.regexp = new RegExp(re, flags)\n } catch (ex) /* istanbul ignore next - should be impossible */ {\n this.regexp = false\n }\n return this.regexp\n}\n\nminimatch.match = function (list, pattern, options) {\n options = options || {}\n var mm = new Minimatch(pattern, options)\n list = list.filter(function (f) {\n return mm.match(f)\n })\n if (mm.options.nonull && !list.length) {\n list.push(pattern)\n }\n return list\n}\n\nMinimatch.prototype.match = function match (f, partial) {\n if (typeof partial === 'undefined') partial = this.partial\n this.debug('match', f, this.pattern)\n // short-circuit in the case of busted things.\n // comments, etc.\n if (this.comment) return false\n if (this.empty) return f === ''\n\n if (f === '/' && partial) return true\n\n var options = this.options\n\n // windows: need to use /, not \\\n if (path.sep !== '/') {\n f = f.split(path.sep).join('/')\n }\n\n // treat the test path as a set of pathparts.\n f = f.split(slashSplit)\n this.debug(this.pattern, 'split', f)\n\n // just ONE of the pattern sets in this.set needs to match\n // in order for it to be valid. If negating, then just one\n // match means that we have failed.\n // Either way, return on the first hit.\n\n var set = this.set\n this.debug(this.pattern, 'set', set)\n\n // Find the basename of the path by looking for the last non-empty segment\n var filename\n var i\n for (i = f.length - 1; i >= 0; i--) {\n filename = f[i]\n if (filename) break\n }\n\n for (i = 0; i < set.length; i++) {\n var pattern = set[i]\n var file = f\n if (options.matchBase && pattern.length === 1) {\n file = [filename]\n }\n var hit = this.matchOne(file, pattern, partial)\n if (hit) {\n if (options.flipNegate) return true\n return !this.negate\n }\n }\n\n // didn't get any hits. this is success if it's a negative\n // pattern, failure otherwise.\n if (options.flipNegate) return false\n return this.negate\n}\n\n// set partial to true to test if, for example,\n// \"/a/b\" matches the start of \"/*/b/*/d\"\n// Partial means, if you run out of file before you run\n// out of pattern, then that's fine, as long as all\n// the parts match.\nMinimatch.prototype.matchOne = function (file, pattern, partial) {\n var options = this.options\n\n this.debug('matchOne',\n { 'this': this, file: file, pattern: pattern })\n\n this.debug('matchOne', file.length, pattern.length)\n\n for (var fi = 0,\n pi = 0,\n fl = file.length,\n pl = pattern.length\n ; (fi < fl) && (pi < pl)\n ; fi++, pi++) {\n this.debug('matchOne loop')\n var p = pattern[pi]\n var f = file[fi]\n\n this.debug(pattern, p, f)\n\n // should be impossible.\n // some invalid regexp stuff in the set.\n /* istanbul ignore if */\n if (p === false) return false\n\n if (p === GLOBSTAR) {\n this.debug('GLOBSTAR', [pattern, p, f])\n\n // \"**\"\n // a/**/b/**/c would match the following:\n // a/b/x/y/z/c\n // a/x/y/z/b/c\n // a/b/x/b/x/c\n // a/b/c\n // To do this, take the rest of the pattern after\n // the **, and see if it would match the file remainder.\n // If so, return success.\n // If not, the ** \"swallows\" a segment, and try again.\n // This is recursively awful.\n //\n // a/**/b/**/c matching a/b/x/y/z/c\n // - a matches a\n // - doublestar\n // - matchOne(b/x/y/z/c, b/**/c)\n // - b matches b\n // - doublestar\n // - matchOne(x/y/z/c, c) -> no\n // - matchOne(y/z/c, c) -> no\n // - matchOne(z/c, c) -> no\n // - matchOne(c, c) yes, hit\n var fr = fi\n var pr = pi + 1\n if (pr === pl) {\n this.debug('** at the end')\n // a ** at the end will just swallow the rest.\n // We have found a match.\n // however, it will not swallow /.x, unless\n // options.dot is set.\n // . and .. are *never* matched by **, for explosively\n // exponential reasons.\n for (; fi < fl; fi++) {\n if (file[fi] === '.' || file[fi] === '..' ||\n (!options.dot && file[fi].charAt(0) === '.')) return false\n }\n return true\n }\n\n // ok, let's see if we can swallow whatever we can.\n while (fr < fl) {\n var swallowee = file[fr]\n\n this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee)\n\n // XXX remove this slice. Just pass the start index.\n if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n this.debug('globstar found match!', fr, fl, swallowee)\n // found a match.\n return true\n } else {\n // can't swallow \".\" or \"..\" ever.\n // can only swallow \".foo\" when explicitly asked.\n if (swallowee === '.' || swallowee === '..' ||\n (!options.dot && swallowee.charAt(0) === '.')) {\n this.debug('dot detected!', file, fr, pattern, pr)\n break\n }\n\n // ** swallows a segment, and continue.\n this.debug('globstar swallow a segment, and continue')\n fr++\n }\n }\n\n // no match was found.\n // However, in partial mode, we can't say this is necessarily over.\n // If there's more *pattern* left, then\n /* istanbul ignore if */\n if (partial) {\n // ran out of file\n this.debug('\\n>>> no match, partial?', file, fr, pattern, pr)\n if (fr === fl) return true\n }\n return false\n }\n\n // something other than **\n // non-magic patterns just have to match exactly\n // patterns with magic have been turned into regexps.\n var hit\n if (typeof p === 'string') {\n hit = f === p\n this.debug('string match', p, f, hit)\n } else {\n hit = f.match(p)\n this.debug('pattern match', p, f, hit)\n }\n\n if (!hit) return false\n }\n\n // Note: ending in / means that we'll get a final \"\"\n // at the end of the pattern. This can only match a\n // corresponding \"\" at the end of the file.\n // If the file ends in /, then it can only match a\n // a pattern that ends in /, unless the pattern just\n // doesn't have any more for it. But, a/b/ should *not*\n // match \"a/b/*\", even though \"\" matches against the\n // [^/]*? pattern, except in partial mode, where it might\n // simply not be reached yet.\n // However, a/b/ should still satisfy a/*\n\n // now either we fell off the end of the pattern, or we're done.\n if (fi === fl && pi === pl) {\n // ran out of pattern and filename at the same time.\n // an exact hit!\n return true\n } else if (fi === fl) {\n // ran out of file, but still had pattern left.\n // this is ok if we're doing the match as part of\n // a glob fs traversal.\n return partial\n } else /* istanbul ignore else */ if (pi === pl) {\n // ran out of pattern, still have file left.\n // this is only acceptable if we're on the very last\n // empty segment of a file with a trailing slash.\n // a/* should match a/b/\n return (fi === fl - 1) && (file[fi] === '')\n }\n\n // should be unreachable.\n /* istanbul ignore next */\n throw new Error('wtf?')\n}\n\n// replace stuff like \\* with *\nfunction globUnescape (s) {\n return s.replace(/\\\\(.)/g, '$1')\n}\n\nfunction regExpEscape (s) {\n return s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ04sTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsTUFBTTtBQUNOLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxFQUFFLEVBQUUsS0FBSztBQUN6QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxRQUFRO0FBQ2pEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isc0JBQXNCO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDZDQUE2QztBQUM3Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLFFBQVE7QUFDakM7QUFDQTtBQUNBOztBQUVBLGNBQWMsZ0JBQWdCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU0sNENBQTRDOztBQUVsRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjtBQUMzQiIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL21pbmltYXRjaC9taW5pbWF0Y2guanM/ZDhiMiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IG1pbmltYXRjaFxubWluaW1hdGNoLk1pbmltYXRjaCA9IE1pbmltYXRjaFxuXG52YXIgcGF0aCA9IChmdW5jdGlvbiAoKSB7IHRyeSB7IHJldHVybiByZXF1aXJlKCdwYXRoJykgfSBjYXRjaCAoZSkge319KCkpIHx8IHtcbiAgc2VwOiAnLydcbn1cbm1pbmltYXRjaC5zZXAgPSBwYXRoLnNlcFxuXG52YXIgR0xPQlNUQVIgPSBtaW5pbWF0Y2guR0xPQlNUQVIgPSBNaW5pbWF0Y2guR0xPQlNUQVIgPSB7fVxudmFyIGV4cGFuZCA9IHJlcXVpcmUoJ2JyYWNlLWV4cGFuc2lvbicpXG5cbnZhciBwbFR5cGVzID0ge1xuICAnISc6IHsgb3BlbjogJyg/Oig/ISg/OicsIGNsb3NlOiAnKSlbXi9dKj8pJ30sXG4gICc/JzogeyBvcGVuOiAnKD86JywgY2xvc2U6ICcpPycgfSxcbiAgJysnOiB7IG9wZW46ICcoPzonLCBjbG9zZTogJykrJyB9LFxuICAnKic6IHsgb3BlbjogJyg/OicsIGNsb3NlOiAnKSonIH0sXG4gICdAJzogeyBvcGVuOiAnKD86JywgY2xvc2U6ICcpJyB9XG59XG5cbi8vIGFueSBzaW5nbGUgdGhpbmcgb3RoZXIgdGhhbiAvXG4vLyBkb24ndCBuZWVkIHRvIGVzY2FwZSAvIHdoZW4gdXNpbmcgbmV3IFJlZ0V4cCgpXG52YXIgcW1hcmsgPSAnW14vXSdcblxuLy8gKiA9PiBhbnkgbnVtYmVyIG9mIGNoYXJhY3RlcnNcbnZhciBzdGFyID0gcW1hcmsgKyAnKj8nXG5cbi8vICoqIHdoZW4gZG90cyBhcmUgYWxsb3dlZC4gIEFueXRoaW5nIGdvZXMsIGV4Y2VwdCAuLiBhbmQgLlxuLy8gbm90ICheIG9yIC8gZm9sbG93ZWQgYnkgb25lIG9yIHR3byBkb3RzIGZvbGxvd2VkIGJ5ICQgb3IgLyksXG4vLyBmb2xsb3dlZCBieSBhbnl0aGluZywgYW55IG51bWJlciBvZiB0aW1lcy5cbnZhciB0d29TdGFyRG90ID0gJyg/Oig/ISg/OlxcXFxcXC98XikoPzpcXFxcLnsxLDJ9KSgkfFxcXFxcXC8pKS4pKj8nXG5cbi8vIG5vdCBhIF4gb3IgLyBmb2xsb3dlZCBieSBhIGRvdCxcbi8vIGZvbGxvd2VkIGJ5IGFueXRoaW5nLCBhbnkgbnVtYmVyIG9mIHRpbWVzLlxudmFyIHR3b1N0YXJOb0RvdCA9ICcoPzooPyEoPzpcXFxcXFwvfF4pXFxcXC4pLikqPydcblxuLy8gY2hhcmFjdGVycyB0aGF0IG5lZWQgdG8gYmUgZXNjYXBlZCBpbiBSZWdFeHAuXG52YXIgcmVTcGVjaWFscyA9IGNoYXJTZXQoJygpLip7fSs/W11eJFxcXFwhJylcblxuLy8gXCJhYmNcIiAtPiB7IGE6dHJ1ZSwgYjp0cnVlLCBjOnRydWUgfVxuZnVuY3Rpb24gY2hhclNldCAocykge1xuICByZXR1cm4gcy5zcGxpdCgnJykucmVkdWNlKGZ1bmN0aW9uIChzZXQsIGMpIHtcbiAgICBzZXRbY10gPSB0cnVlXG4gICAgcmV0dXJuIHNldFxuICB9LCB7fSlcbn1cblxuLy8gbm9ybWFsaXplcyBzbGFzaGVzLlxudmFyIHNsYXNoU3BsaXQgPSAvXFwvKy9cblxubWluaW1hdGNoLmZpbHRlciA9IGZpbHRlclxuZnVuY3Rpb24gZmlsdGVyIChwYXR0ZXJuLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIHJldHVybiBmdW5jdGlvbiAocCwgaSwgbGlzdCkge1xuICAgIHJldHVybiBtaW5pbWF0Y2gocCwgcGF0dGVybiwgb3B0aW9ucylcbiAgfVxufVxuXG5mdW5jdGlvbiBleHQgKGEsIGIpIHtcbiAgYiA9IGIgfHwge31cbiAgdmFyIHQgPSB7fVxuICBPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgdFtrXSA9IGFba11cbiAgfSlcbiAgT2JqZWN0LmtleXMoYikuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgIHRba10gPSBiW2tdXG4gIH0pXG4gIHJldHVybiB0XG59XG5cbm1pbmltYXRjaC5kZWZhdWx0cyA9IGZ1bmN0aW9uIChkZWYpIHtcbiAgaWYgKCFkZWYgfHwgdHlwZW9mIGRlZiAhPT0gJ29iamVjdCcgfHwgIU9iamVjdC5rZXlzKGRlZikubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG1pbmltYXRjaFxuICB9XG5cbiAgdmFyIG9yaWcgPSBtaW5pbWF0Y2hcblxuICB2YXIgbSA9IGZ1bmN0aW9uIG1pbmltYXRjaCAocCwgcGF0dGVybiwgb3B0aW9ucykge1xuICAgIHJldHVybiBvcmlnKHAsIHBhdHRlcm4sIGV4dChkZWYsIG9wdGlvbnMpKVxuICB9XG5cbiAgbS5NaW5pbWF0Y2ggPSBmdW5jdGlvbiBNaW5pbWF0Y2ggKHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IG9yaWcuTWluaW1hdGNoKHBhdHRlcm4sIGV4dChkZWYsIG9wdGlvbnMpKVxuICB9XG4gIG0uTWluaW1hdGNoLmRlZmF1bHRzID0gZnVuY3Rpb24gZGVmYXVsdHMgKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3JpZy5kZWZhdWx0cyhleHQoZGVmLCBvcHRpb25zKSkuTWluaW1hdGNoXG4gIH1cblxuICBtLmZpbHRlciA9IGZ1bmN0aW9uIGZpbHRlciAocGF0dGVybiwgb3B0aW9ucykge1xuICAgIHJldHVybiBvcmlnLmZpbHRlcihwYXR0ZXJuLCBleHQoZGVmLCBvcHRpb25zKSlcbiAgfVxuXG4gIG0uZGVmYXVsdHMgPSBmdW5jdGlvbiBkZWZhdWx0cyAob3B0aW9ucykge1xuICAgIHJldHVybiBvcmlnLmRlZmF1bHRzKGV4dChkZWYsIG9wdGlvbnMpKVxuICB9XG5cbiAgbS5tYWtlUmUgPSBmdW5jdGlvbiBtYWtlUmUgKHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3JpZy5tYWtlUmUocGF0dGVybiwgZXh0KGRlZiwgb3B0aW9ucykpXG4gIH1cblxuICBtLmJyYWNlRXhwYW5kID0gZnVuY3Rpb24gYnJhY2VFeHBhbmQgKHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3JpZy5icmFjZUV4cGFuZChwYXR0ZXJuLCBleHQoZGVmLCBvcHRpb25zKSlcbiAgfVxuXG4gIG0ubWF0Y2ggPSBmdW5jdGlvbiAobGlzdCwgcGF0dGVybiwgb3B0aW9ucykge1xuICAgIHJldHVybiBvcmlnLm1hdGNoKGxpc3QsIHBhdHRlcm4sIGV4dChkZWYsIG9wdGlvbnMpKVxuICB9XG5cbiAgcmV0dXJuIG1cbn1cblxuTWluaW1hdGNoLmRlZmF1bHRzID0gZnVuY3Rpb24gKGRlZikge1xuICByZXR1cm4gbWluaW1hdGNoLmRlZmF1bHRzKGRlZikuTWluaW1hdGNoXG59XG5cbmZ1bmN0aW9uIG1pbmltYXRjaCAocCwgcGF0dGVybiwgb3B0aW9ucykge1xuICBhc3NlcnRWYWxpZFBhdHRlcm4ocGF0dGVybilcblxuICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fVxuXG4gIC8vIHNob3J0Y3V0OiBjb21tZW50cyBtYXRjaCBub3RoaW5nLlxuICBpZiAoIW9wdGlvbnMubm9jb21tZW50ICYmIHBhdHRlcm4uY2hhckF0KDApID09PSAnIycpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiBuZXcgTWluaW1hdGNoKHBhdHRlcm4sIG9wdGlvbnMpLm1hdGNoKHApXG59XG5cbmZ1bmN0aW9uIE1pbmltYXRjaCAocGF0dGVybiwgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTWluaW1hdGNoKSkge1xuICAgIHJldHVybiBuZXcgTWluaW1hdGNoKHBhdHRlcm4sIG9wdGlvbnMpXG4gIH1cblxuICBhc3NlcnRWYWxpZFBhdHRlcm4ocGF0dGVybilcblxuICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fVxuXG4gIHBhdHRlcm4gPSBwYXR0ZXJuLnRyaW0oKVxuXG4gIC8vIHdpbmRvd3Mgc3VwcG9ydDogbmVlZCB0byB1c2UgLywgbm90IFxcXG4gIGlmICghb3B0aW9ucy5hbGxvd1dpbmRvd3NFc2NhcGUgJiYgcGF0aC5zZXAgIT09ICcvJykge1xuICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnNwbGl0KHBhdGguc2VwKS5qb2luKCcvJylcbiAgfVxuXG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgdGhpcy5zZXQgPSBbXVxuICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuXG4gIHRoaXMucmVnZXhwID0gbnVsbFxuICB0aGlzLm5lZ2F0ZSA9IGZhbHNlXG4gIHRoaXMuY29tbWVudCA9IGZhbHNlXG4gIHRoaXMuZW1wdHkgPSBmYWxzZVxuICB0aGlzLnBhcnRpYWwgPSAhIW9wdGlvbnMucGFydGlhbFxuXG4gIC8vIG1ha2UgdGhlIHNldCBvZiByZWdleHBzIGV0Yy5cbiAgdGhpcy5tYWtlKClcbn1cblxuTWluaW1hdGNoLnByb3RvdHlwZS5kZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9XG5cbk1pbmltYXRjaC5wcm90b3R5cGUubWFrZSA9IG1ha2VcbmZ1bmN0aW9uIG1ha2UgKCkge1xuICB2YXIgcGF0dGVybiA9IHRoaXMucGF0dGVyblxuICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uc1xuXG4gIC8vIGVtcHR5IHBhdHRlcm5zIGFuZCBjb21tZW50cyBtYXRjaCBub3RoaW5nLlxuICBpZiAoIW9wdGlvbnMubm9jb21tZW50ICYmIHBhdHRlcm4uY2hhckF0KDApID09PSAnIycpIHtcbiAgICB0aGlzLmNvbW1lbnQgPSB0cnVlXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKCFwYXR0ZXJuKSB7XG4gICAgdGhpcy5lbXB0eSA9IHRydWVcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIHN0ZXAgMTogZmlndXJlIG91dCBuZWdhdGlvbiwgZXRjLlxuICB0aGlzLnBhcnNlTmVnYXRlKClcblxuICAvLyBzdGVwIDI6IGV4cGFuZCBicmFjZXNcbiAgdmFyIHNldCA9IHRoaXMuZ2xvYlNldCA9IHRoaXMuYnJhY2VFeHBhbmQoKVxuXG4gIGlmIChvcHRpb25zLmRlYnVnKSB0aGlzLmRlYnVnID0gZnVuY3Rpb24gZGVidWcoKSB7IGNvbnNvbGUuZXJyb3IuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKSB9XG5cbiAgdGhpcy5kZWJ1Zyh0aGlzLnBhdHRlcm4sIHNldClcblxuICAvLyBzdGVwIDM6IG5vdyB3ZSBoYXZlIGEgc2V0LCBzbyB0dXJuIGVhY2ggb25lIGludG8gYSBzZXJpZXMgb2YgcGF0aC1wb3J0aW9uXG4gIC8vIG1hdGNoaW5nIHBhdHRlcm5zLlxuICAvLyBUaGVzZSB3aWxsIGJlIHJlZ2V4cHMsIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBcIioqXCIsIHdoaWNoIGlzXG4gIC8vIHNldCB0byB0aGUgR0xPQlNUQVIgb2JqZWN0IGZvciBnbG9ic3RhciBiZWhhdmlvcixcbiAgLy8gYW5kIHdpbGwgbm90IGNvbnRhaW4gYW55IC8gY2hhcmFjdGVyc1xuICBzZXQgPSB0aGlzLmdsb2JQYXJ0cyA9IHNldC5tYXAoZnVuY3Rpb24gKHMpIHtcbiAgICByZXR1cm4gcy5zcGxpdChzbGFzaFNwbGl0KVxuICB9KVxuXG4gIHRoaXMuZGVidWcodGhpcy5wYXR0ZXJuLCBzZXQpXG5cbiAgLy8gZ2xvYiAtLT4gcmVnZXhwc1xuICBzZXQgPSBzZXQubWFwKGZ1bmN0aW9uIChzLCBzaSwgc2V0KSB7XG4gICAgcmV0dXJuIHMubWFwKHRoaXMucGFyc2UsIHRoaXMpXG4gIH0sIHRoaXMpXG5cbiAgdGhpcy5kZWJ1Zyh0aGlzLnBhdHRlcm4sIHNldClcblxuICAvLyBmaWx0ZXIgb3V0IGV2ZXJ5dGhpbmcgdGhhdCBkaWRuJ3QgY29tcGlsZSBwcm9wZXJseS5cbiAgc2V0ID0gc2V0LmZpbHRlcihmdW5jdGlvbiAocykge1xuICAgIHJldHVybiBzLmluZGV4T2YoZmFsc2UpID09PSAtMVxuICB9KVxuXG4gIHRoaXMuZGVidWcodGhpcy5wYXR0ZXJuLCBzZXQpXG5cbiAgdGhpcy5zZXQgPSBzZXRcbn1cblxuTWluaW1hdGNoLnByb3RvdHlwZS5wYXJzZU5lZ2F0ZSA9IHBhcnNlTmVnYXRlXG5mdW5jdGlvbiBwYXJzZU5lZ2F0ZSAoKSB7XG4gIHZhciBwYXR0ZXJuID0gdGhpcy5wYXR0ZXJuXG4gIHZhciBuZWdhdGUgPSBmYWxzZVxuICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uc1xuICB2YXIgbmVnYXRlT2Zmc2V0ID0gMFxuXG4gIGlmIChvcHRpb25zLm5vbmVnYXRlKSByZXR1cm5cblxuICBmb3IgKHZhciBpID0gMCwgbCA9IHBhdHRlcm4ubGVuZ3RoXG4gICAgOyBpIDwgbCAmJiBwYXR0ZXJuLmNoYXJBdChpKSA9PT0gJyEnXG4gICAgOyBpKyspIHtcbiAgICBuZWdhdGUgPSAhbmVnYXRlXG4gICAgbmVnYXRlT2Zmc2V0KytcbiAgfVxuXG4gIGlmIChuZWdhdGVPZmZzZXQpIHRoaXMucGF0dGVybiA9IHBhdHRlcm4uc3Vic3RyKG5lZ2F0ZU9mZnNldClcbiAgdGhpcy5uZWdhdGUgPSBuZWdhdGVcbn1cblxuLy8gQnJhY2UgZXhwYW5zaW9uOlxuLy8gYXtiLGN9ZCAtPiBhYmQgYWNkXG4vLyBhe2IsfWMgLT4gYWJjIGFjXG4vLyBhezAuLjN9ZCAtPiBhMGQgYTFkIGEyZCBhM2Rcbi8vIGF7Yixje2QsZX1mfWcgLT4gYWJnIGFjZGZnIGFjZWZnXG4vLyBhe2IsY31ke2UsZn1nIC0+IGFiZGVnIGFjZGVnIGFiZGVnIGFiZGZnXG4vL1xuLy8gSW52YWxpZCBzZXRzIGFyZSBub3QgZXhwYW5kZWQuXG4vLyBhezIuLn1iIC0+IGF7Mi4ufWJcbi8vIGF7Yn1jIC0+IGF7Yn1jXG5taW5pbWF0Y2guYnJhY2VFeHBhbmQgPSBmdW5jdGlvbiAocGF0dGVybiwgb3B0aW9ucykge1xuICByZXR1cm4gYnJhY2VFeHBhbmQocGF0dGVybiwgb3B0aW9ucylcbn1cblxuTWluaW1hdGNoLnByb3RvdHlwZS5icmFjZUV4cGFuZCA9IGJyYWNlRXhwYW5kXG5cbmZ1bmN0aW9uIGJyYWNlRXhwYW5kIChwYXR0ZXJuLCBvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucykge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgTWluaW1hdGNoKSB7XG4gICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zXG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMgPSB7fVxuICAgIH1cbiAgfVxuXG4gIHBhdHRlcm4gPSB0eXBlb2YgcGF0dGVybiA9PT0gJ3VuZGVmaW5lZCdcbiAgICA/IHRoaXMucGF0dGVybiA6IHBhdHRlcm5cblxuICBhc3NlcnRWYWxpZFBhdHRlcm4ocGF0dGVybilcblxuICAvLyBUaGFua3MgdG8gWWV0aW5nIExpIDxodHRwczovL2dpdGh1Yi5jb20veWV0aW5nbGk+IGZvclxuICAvLyBpbXByb3ZpbmcgdGhpcyByZWdleHAgdG8gYXZvaWQgYSBSZURPUyB2dWxuZXJhYmlsaXR5LlxuICBpZiAob3B0aW9ucy5ub2JyYWNlIHx8ICEvXFx7KD86KD8hXFx7KS4pKlxcfS8udGVzdChwYXR0ZXJuKSkge1xuICAgIC8vIHNob3J0Y3V0LiBubyBuZWVkIHRvIGV4cGFuZC5cbiAgICByZXR1cm4gW3BhdHRlcm5dXG4gIH1cblxuICByZXR1cm4gZXhwYW5kKHBhdHRlcm4pXG59XG5cbnZhciBNQVhfUEFUVEVSTl9MRU5HVEggPSAxMDI0ICogNjRcbnZhciBhc3NlcnRWYWxpZFBhdHRlcm4gPSBmdW5jdGlvbiAocGF0dGVybikge1xuICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBwYXR0ZXJuJylcbiAgfVxuXG4gIGlmIChwYXR0ZXJuLmxlbmd0aCA+IE1BWF9QQVRURVJOX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3BhdHRlcm4gaXMgdG9vIGxvbmcnKVxuICB9XG59XG5cbi8vIHBhcnNlIGEgY29tcG9uZW50IG9mIHRoZSBleHBhbmRlZCBzZXQuXG4vLyBBdCB0aGlzIHBvaW50LCBubyBwYXR0ZXJuIG1heSBjb250YWluIFwiL1wiIGluIGl0XG4vLyBzbyB3ZSdyZSBnb2luZyB0byByZXR1cm4gYSAyZCBhcnJheSwgd2hlcmUgZWFjaCBlbnRyeSBpcyB0aGUgZnVsbFxuLy8gcGF0dGVybiwgc3BsaXQgb24gJy8nLCBhbmQgdGhlbiB0dXJuZWQgaW50byBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbi8vIEEgcmVnZXhwIGlzIG1hZGUgYXQgdGhlIGVuZCB3aGljaCBqb2lucyBlYWNoIGFycmF5IHdpdGggYW5cbi8vIGVzY2FwZWQgLywgYW5kIGFub3RoZXIgZnVsbCBvbmUgd2hpY2ggam9pbnMgZWFjaCByZWdleHAgd2l0aCB8LlxuLy9cbi8vIEZvbGxvd2luZyB0aGUgbGVhZCBvZiBCYXNoIDQuMSwgbm90ZSB0aGF0IFwiKipcIiBvbmx5IGhhcyBzcGVjaWFsIG1lYW5pbmdcbi8vIHdoZW4gaXQgaXMgdGhlICpvbmx5KiB0aGluZyBpbiBhIHBhdGggcG9ydGlvbi4gIE90aGVyd2lzZSwgYW55IHNlcmllc1xuLy8gb2YgKiBpcyBlcXVpdmFsZW50IHRvIGEgc2luZ2xlICouICBHbG9ic3RhciBiZWhhdmlvciBpcyBlbmFibGVkIGJ5XG4vLyBkZWZhdWx0LCBhbmQgY2FuIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgb3B0aW9ucy5ub2dsb2JzdGFyLlxuTWluaW1hdGNoLnByb3RvdHlwZS5wYXJzZSA9IHBhcnNlXG52YXIgU1VCUEFSU0UgPSB7fVxuZnVuY3Rpb24gcGFyc2UgKHBhdHRlcm4sIGlzU3ViKSB7XG4gIGFzc2VydFZhbGlkUGF0dGVybihwYXR0ZXJuKVxuXG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zXG5cbiAgLy8gc2hvcnRjdXRzXG4gIGlmIChwYXR0ZXJuID09PSAnKionKSB7XG4gICAgaWYgKCFvcHRpb25zLm5vZ2xvYnN0YXIpXG4gICAgICByZXR1cm4gR0xPQlNUQVJcbiAgICBlbHNlXG4gICAgICBwYXR0ZXJuID0gJyonXG4gIH1cbiAgaWYgKHBhdHRlcm4gPT09ICcnKSByZXR1cm4gJydcblxuICB2YXIgcmUgPSAnJ1xuICB2YXIgaGFzTWFnaWMgPSAhIW9wdGlvbnMubm9jYXNlXG4gIHZhciBlc2NhcGluZyA9IGZhbHNlXG4gIC8vID8gPT4gb25lIHNpbmdsZSBjaGFyYWN0ZXJcbiAgdmFyIHBhdHRlcm5MaXN0U3RhY2sgPSBbXVxuICB2YXIgbmVnYXRpdmVMaXN0cyA9IFtdXG4gIHZhciBzdGF0ZUNoYXJcbiAgdmFyIGluQ2xhc3MgPSBmYWxzZVxuICB2YXIgcmVDbGFzc1N0YXJ0ID0gLTFcbiAgdmFyIGNsYXNzU3RhcnQgPSAtMVxuICAvLyAuIGFuZCAuLiBuZXZlciBtYXRjaCBhbnl0aGluZyB0aGF0IGRvZXNuJ3Qgc3RhcnQgd2l0aCAuLFxuICAvLyBldmVuIHdoZW4gb3B0aW9ucy5kb3QgaXMgc2V0LlxuICB2YXIgcGF0dGVyblN0YXJ0ID0gcGF0dGVybi5jaGFyQXQoMCkgPT09ICcuJyA/ICcnIC8vIGFueXRoaW5nXG4gIC8vIG5vdCAoc3RhcnQgb3IgLyBmb2xsb3dlZCBieSAuIG9yIC4uIGZvbGxvd2VkIGJ5IC8gb3IgZW5kKVxuICA6IG9wdGlvbnMuZG90ID8gJyg/ISg/Ol58XFxcXFxcLylcXFxcLnsxLDJ9KD86JHxcXFxcXFwvKSknXG4gIDogJyg/IVxcXFwuKSdcbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgZnVuY3Rpb24gY2xlYXJTdGF0ZUNoYXIgKCkge1xuICAgIGlmIChzdGF0ZUNoYXIpIHtcbiAgICAgIC8vIHdlIGhhZCBzb21lIHN0YXRlLXRyYWNraW5nIGNoYXJhY3RlclxuICAgICAgLy8gdGhhdCB3YXNuJ3QgY29uc3VtZWQgYnkgdGhpcyBwYXNzLlxuICAgICAgc3dpdGNoIChzdGF0ZUNoYXIpIHtcbiAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgcmUgKz0gc3RhclxuICAgICAgICAgIGhhc01hZ2ljID0gdHJ1ZVxuICAgICAgICBicmVha1xuICAgICAgICBjYXNlICc/JzpcbiAgICAgICAgICByZSArPSBxbWFya1xuICAgICAgICAgIGhhc01hZ2ljID0gdHJ1ZVxuICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJlICs9ICdcXFxcJyArIHN0YXRlQ2hhclxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgc2VsZi5kZWJ1ZygnY2xlYXJTdGF0ZUNoYXIgJWogJWonLCBzdGF0ZUNoYXIsIHJlKVxuICAgICAgc3RhdGVDaGFyID0gZmFsc2VcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gcGF0dGVybi5sZW5ndGgsIGNcbiAgICA7IChpIDwgbGVuKSAmJiAoYyA9IHBhdHRlcm4uY2hhckF0KGkpKVxuICAgIDsgaSsrKSB7XG4gICAgdGhpcy5kZWJ1ZygnJXNcXHQlcyAlcyAlaicsIHBhdHRlcm4sIGksIHJlLCBjKVxuXG4gICAgLy8gc2tpcCBvdmVyIGFueSB0aGF0IGFyZSBlc2NhcGVkLlxuICAgIGlmIChlc2NhcGluZyAmJiByZVNwZWNpYWxzW2NdKSB7XG4gICAgICByZSArPSAnXFxcXCcgKyBjXG4gICAgICBlc2NhcGluZyA9IGZhbHNlXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHN3aXRjaCAoYykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGNhc2UgJy8nOiB7XG4gICAgICAgIC8vIGNvbXBsZXRlbHkgbm90IGFsbG93ZWQsIGV2ZW4gZXNjYXBlZC5cbiAgICAgICAgLy8gU2hvdWxkIGFscmVhZHkgYmUgcGF0aC1zcGxpdCBieSBub3cuXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBjYXNlICdcXFxcJzpcbiAgICAgICAgY2xlYXJTdGF0ZUNoYXIoKVxuICAgICAgICBlc2NhcGluZyA9IHRydWVcbiAgICAgIGNvbnRpbnVlXG5cbiAgICAgIC8vIHRoZSB2YXJpb3VzIHN0YXRlQ2hhciB2YWx1ZXNcbiAgICAgIC8vIGZvciB0aGUgXCJleHRnbG9iXCIgc3R1ZmYuXG4gICAgICBjYXNlICc/JzpcbiAgICAgIGNhc2UgJyonOlxuICAgICAgY2FzZSAnKyc6XG4gICAgICBjYXNlICdAJzpcbiAgICAgIGNhc2UgJyEnOlxuICAgICAgICB0aGlzLmRlYnVnKCclc1xcdCVzICVzICVqIDwtLSBzdGF0ZUNoYXInLCBwYXR0ZXJuLCBpLCByZSwgYylcblxuICAgICAgICAvLyBhbGwgb2YgdGhvc2UgYXJlIGxpdGVyYWxzIGluc2lkZSBhIGNsYXNzLCBleGNlcHQgdGhhdFxuICAgICAgICAvLyB0aGUgZ2xvYiBbIWFdIG1lYW5zIFteYV0gaW4gcmVnZXhwXG4gICAgICAgIGlmIChpbkNsYXNzKSB7XG4gICAgICAgICAgdGhpcy5kZWJ1ZygnICBpbiBjbGFzcycpXG4gICAgICAgICAgaWYgKGMgPT09ICchJyAmJiBpID09PSBjbGFzc1N0YXJ0ICsgMSkgYyA9ICdeJ1xuICAgICAgICAgIHJlICs9IGNcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgd2UgYWxyZWFkeSBoYXZlIGEgc3RhdGVDaGFyLCB0aGVuIGl0IG1lYW5zXG4gICAgICAgIC8vIHRoYXQgdGhlcmUgd2FzIHNvbWV0aGluZyBsaWtlICoqIG9yICs/IGluIHRoZXJlLlxuICAgICAgICAvLyBIYW5kbGUgdGhlIHN0YXRlQ2hhciwgdGhlbiBwcm9jZWVkIHdpdGggdGhpcyBvbmUuXG4gICAgICAgIHNlbGYuZGVidWcoJ2NhbGwgY2xlYXJTdGF0ZUNoYXIgJWonLCBzdGF0ZUNoYXIpXG4gICAgICAgIGNsZWFyU3RhdGVDaGFyKClcbiAgICAgICAgc3RhdGVDaGFyID0gY1xuICAgICAgICAvLyBpZiBleHRnbG9iIGlzIGRpc2FibGVkLCB0aGVuICsoYXNkZnxmb28pIGlzbid0IGEgdGhpbmcuXG4gICAgICAgIC8vIGp1c3QgY2xlYXIgdGhlIHN0YXRlY2hhciAqbm93KiwgcmF0aGVyIHRoYW4gZXZlbiBkaXZpbmcgaW50b1xuICAgICAgICAvLyB0aGUgcGF0dGVybkxpc3Qgc3R1ZmYuXG4gICAgICAgIGlmIChvcHRpb25zLm5vZXh0KSBjbGVhclN0YXRlQ2hhcigpXG4gICAgICBjb250aW51ZVxuXG4gICAgICBjYXNlICcoJzpcbiAgICAgICAgaWYgKGluQ2xhc3MpIHtcbiAgICAgICAgICByZSArPSAnKCdcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzdGF0ZUNoYXIpIHtcbiAgICAgICAgICByZSArPSAnXFxcXCgnXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIHBhdHRlcm5MaXN0U3RhY2sucHVzaCh7XG4gICAgICAgICAgdHlwZTogc3RhdGVDaGFyLFxuICAgICAgICAgIHN0YXJ0OiBpIC0gMSxcbiAgICAgICAgICByZVN0YXJ0OiByZS5sZW5ndGgsXG4gICAgICAgICAgb3BlbjogcGxUeXBlc1tzdGF0ZUNoYXJdLm9wZW4sXG4gICAgICAgICAgY2xvc2U6IHBsVHlwZXNbc3RhdGVDaGFyXS5jbG9zZVxuICAgICAgICB9KVxuICAgICAgICAvLyBuZWdhdGlvbiBpcyAoPzooPyFqcylbXi9dKilcbiAgICAgICAgcmUgKz0gc3RhdGVDaGFyID09PSAnIScgPyAnKD86KD8hKD86JyA6ICcoPzonXG4gICAgICAgIHRoaXMuZGVidWcoJ3BsVHlwZSAlaiAlaicsIHN0YXRlQ2hhciwgcmUpXG4gICAgICAgIHN0YXRlQ2hhciA9IGZhbHNlXG4gICAgICBjb250aW51ZVxuXG4gICAgICBjYXNlICcpJzpcbiAgICAgICAgaWYgKGluQ2xhc3MgfHwgIXBhdHRlcm5MaXN0U3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgcmUgKz0gJ1xcXFwpJ1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjbGVhclN0YXRlQ2hhcigpXG4gICAgICAgIGhhc01hZ2ljID0gdHJ1ZVxuICAgICAgICB2YXIgcGwgPSBwYXR0ZXJuTGlzdFN0YWNrLnBvcCgpXG4gICAgICAgIC8vIG5lZ2F0aW9uIGlzICg/Oig/IWpzKVteL10qKVxuICAgICAgICAvLyBUaGUgb3RoZXJzIGFyZSAoPzo8cGF0dGVybj4pPHR5cGU+XG4gICAgICAgIHJlICs9IHBsLmNsb3NlXG4gICAgICAgIGlmIChwbC50eXBlID09PSAnIScpIHtcbiAgICAgICAgICBuZWdhdGl2ZUxpc3RzLnB1c2gocGwpXG4gICAgICAgIH1cbiAgICAgICAgcGwucmVFbmQgPSByZS5sZW5ndGhcbiAgICAgIGNvbnRpbnVlXG5cbiAgICAgIGNhc2UgJ3wnOlxuICAgICAgICBpZiAoaW5DbGFzcyB8fCAhcGF0dGVybkxpc3RTdGFjay5sZW5ndGggfHwgZXNjYXBpbmcpIHtcbiAgICAgICAgICByZSArPSAnXFxcXHwnXG4gICAgICAgICAgZXNjYXBpbmcgPSBmYWxzZVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjbGVhclN0YXRlQ2hhcigpXG4gICAgICAgIHJlICs9ICd8J1xuICAgICAgY29udGludWVcblxuICAgICAgLy8gdGhlc2UgYXJlIG1vc3RseSB0aGUgc2FtZSBpbiByZWdleHAgYW5kIGdsb2JcbiAgICAgIGNhc2UgJ1snOlxuICAgICAgICAvLyBzd2FsbG93IGFueSBzdGF0ZS10cmFja2luZyBjaGFyIGJlZm9yZSB0aGUgW1xuICAgICAgICBjbGVhclN0YXRlQ2hhcigpXG5cbiAgICAgICAgaWYgKGluQ2xhc3MpIHtcbiAgICAgICAgICByZSArPSAnXFxcXCcgKyBjXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGluQ2xhc3MgPSB0cnVlXG4gICAgICAgIGNsYXNzU3RhcnQgPSBpXG4gICAgICAgIHJlQ2xhc3NTdGFydCA9IHJlLmxlbmd0aFxuICAgICAgICByZSArPSBjXG4gICAgICBjb250aW51ZVxuXG4gICAgICBjYXNlICddJzpcbiAgICAgICAgLy8gIGEgcmlnaHQgYnJhY2tldCBzaGFsbCBsb3NlIGl0cyBzcGVjaWFsXG4gICAgICAgIC8vICBtZWFuaW5nIGFuZCByZXByZXNlbnQgaXRzZWxmIGluXG4gICAgICAgIC8vICBhIGJyYWNrZXQgZXhwcmVzc2lvbiBpZiBpdCBvY2N1cnNcbiAgICAgICAgLy8gIGZpcnN0IGluIHRoZSBsaXN0LiAgLS0gUE9TSVguMiAyLjguMy4yXG4gICAgICAgIGlmIChpID09PSBjbGFzc1N0YXJ0ICsgMSB8fCAhaW5DbGFzcykge1xuICAgICAgICAgIHJlICs9ICdcXFxcJyArIGNcbiAgICAgICAgICBlc2NhcGluZyA9IGZhbHNlXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBsZWZ0IGEgY2xhc3Mgb3Blbi5cbiAgICAgICAgLy8gXCJbei1hXVwiIGlzIHZhbGlkLCBlcXVpdmFsZW50IHRvIFwiXFxbei1hXFxdXCJcbiAgICAgICAgLy8gc3BsaXQgd2hlcmUgdGhlIGxhc3QgWyB3YXMsIG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlXG4gICAgICAgIC8vIGFuIGludmFsaWQgcmUuIGlmIHNvLCByZS13YWxrIHRoZSBjb250ZW50cyBvZiB0aGVcbiAgICAgICAgLy8gd291bGQtYmUgY2xhc3MgdG8gcmUtdHJhbnNsYXRlIGFueSBjaGFyYWN0ZXJzIHRoYXRcbiAgICAgICAgLy8gd2VyZSBwYXNzZWQgdGhyb3VnaCBhcy1pc1xuICAgICAgICAvLyBUT0RPOiBJdCB3b3VsZCBwcm9iYWJseSBiZSBmYXN0ZXIgdG8gZGV0ZXJtaW5lIHRoaXNcbiAgICAgICAgLy8gd2l0aG91dCBhIHRyeS9jYXRjaCBhbmQgYSBuZXcgUmVnRXhwLCBidXQgaXQncyB0cmlja3lcbiAgICAgICAgLy8gdG8gZG8gc2FmZWx5LiAgRm9yIG5vdywgdGhpcyBpcyBzYWZlIGFuZCB3b3Jrcy5cbiAgICAgICAgdmFyIGNzID0gcGF0dGVybi5zdWJzdHJpbmcoY2xhc3NTdGFydCArIDEsIGkpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgUmVnRXhwKCdbJyArIGNzICsgJ10nKVxuICAgICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICAgIC8vIG5vdCBhIHZhbGlkIGNsYXNzIVxuICAgICAgICAgIHZhciBzcCA9IHRoaXMucGFyc2UoY3MsIFNVQlBBUlNFKVxuICAgICAgICAgIHJlID0gcmUuc3Vic3RyKDAsIHJlQ2xhc3NTdGFydCkgKyAnXFxcXFsnICsgc3BbMF0gKyAnXFxcXF0nXG4gICAgICAgICAgaGFzTWFnaWMgPSBoYXNNYWdpYyB8fCBzcFsxXVxuICAgICAgICAgIGluQ2xhc3MgPSBmYWxzZVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaW5pc2ggdXAgdGhlIGNsYXNzLlxuICAgICAgICBoYXNNYWdpYyA9IHRydWVcbiAgICAgICAgaW5DbGFzcyA9IGZhbHNlXG4gICAgICAgIHJlICs9IGNcbiAgICAgIGNvbnRpbnVlXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIHN3YWxsb3cgYW55IHN0YXRlIGNoYXIgdGhhdCB3YXNuJ3QgY29uc3VtZWRcbiAgICAgICAgY2xlYXJTdGF0ZUNoYXIoKVxuXG4gICAgICAgIGlmIChlc2NhcGluZykge1xuICAgICAgICAgIC8vIG5vIG5lZWRcbiAgICAgICAgICBlc2NhcGluZyA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSBpZiAocmVTcGVjaWFsc1tjXVxuICAgICAgICAgICYmICEoYyA9PT0gJ14nICYmIGluQ2xhc3MpKSB7XG4gICAgICAgICAgcmUgKz0gJ1xcXFwnXG4gICAgICAgIH1cblxuICAgICAgICByZSArPSBjXG5cbiAgICB9IC8vIHN3aXRjaFxuICB9IC8vIGZvclxuXG4gIC8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBsZWZ0IGEgY2xhc3Mgb3Blbi5cbiAgLy8gXCJbYWJjXCIgaXMgdmFsaWQsIGVxdWl2YWxlbnQgdG8gXCJcXFthYmNcIlxuICBpZiAoaW5DbGFzcykge1xuICAgIC8vIHNwbGl0IHdoZXJlIHRoZSBsYXN0IFsgd2FzLCBhbmQgZXNjYXBlIGl0XG4gICAgLy8gdGhpcyBpcyBhIGh1Z2UgcGl0YS4gIFdlIG5vdyBoYXZlIHRvIHJlLXdhbGtcbiAgICAvLyB0aGUgY29udGVudHMgb2YgdGhlIHdvdWxkLWJlIGNsYXNzIHRvIHJlLXRyYW5zbGF0ZVxuICAgIC8vIGFueSBjaGFyYWN0ZXJzIHRoYXQgd2VyZSBwYXNzZWQgdGhyb3VnaCBhcy1pc1xuICAgIGNzID0gcGF0dGVybi5zdWJzdHIoY2xhc3NTdGFydCArIDEpXG4gICAgc3AgPSB0aGlzLnBhcnNlKGNzLCBTVUJQQVJTRSlcbiAgICByZSA9IHJlLnN1YnN0cigwLCByZUNsYXNzU3RhcnQpICsgJ1xcXFxbJyArIHNwWzBdXG4gICAgaGFzTWFnaWMgPSBoYXNNYWdpYyB8fCBzcFsxXVxuICB9XG5cbiAgLy8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGhhZCBhICsoIHRoaW5nIGF0IHRoZSAqZW5kKlxuICAvLyBvZiB0aGUgcGF0dGVybi5cbiAgLy8gZWFjaCBwYXR0ZXJuIGxpc3Qgc3RhY2sgYWRkcyAzIGNoYXJzLCBhbmQgd2UgbmVlZCB0byBnbyB0aHJvdWdoXG4gIC8vIGFuZCBlc2NhcGUgYW55IHwgY2hhcnMgdGhhdCB3ZXJlIHBhc3NlZCB0aHJvdWdoIGFzLWlzIGZvciB0aGUgcmVnZXhwLlxuICAvLyBHbyB0aHJvdWdoIGFuZCBlc2NhcGUgdGhlbSwgdGFraW5nIGNhcmUgbm90IHRvIGRvdWJsZS1lc2NhcGUgYW55XG4gIC8vIHwgY2hhcnMgdGhhdCB3ZXJlIGFscmVhZHkgZXNjYXBlZC5cbiAgZm9yIChwbCA9IHBhdHRlcm5MaXN0U3RhY2sucG9wKCk7IHBsOyBwbCA9IHBhdHRlcm5MaXN0U3RhY2sucG9wKCkpIHtcbiAgICB2YXIgdGFpbCA9IHJlLnNsaWNlKHBsLnJlU3RhcnQgKyBwbC5vcGVuLmxlbmd0aClcbiAgICB0aGlzLmRlYnVnKCdzZXR0aW5nIHRhaWwnLCByZSwgcGwpXG4gICAgLy8gbWF5YmUgc29tZSBldmVuIG51bWJlciBvZiBcXCwgdGhlbiBtYXliZSAxIFxcLCBmb2xsb3dlZCBieSBhIHxcbiAgICB0YWlsID0gdGFpbC5yZXBsYWNlKC8oKD86XFxcXHsyfSl7MCw2NH0pKFxcXFw/KVxcfC9nLCBmdW5jdGlvbiAoXywgJDEsICQyKSB7XG4gICAgICBpZiAoISQyKSB7XG4gICAgICAgIC8vIHRoZSB8IGlzbid0IGFscmVhZHkgZXNjYXBlZCwgc28gZXNjYXBlIGl0LlxuICAgICAgICAkMiA9ICdcXFxcJ1xuICAgICAgfVxuXG4gICAgICAvLyBuZWVkIHRvIGVzY2FwZSBhbGwgdGhvc2Ugc2xhc2hlcyAqYWdhaW4qLCB3aXRob3V0IGVzY2FwaW5nIHRoZVxuICAgICAgLy8gb25lIHRoYXQgd2UgbmVlZCBmb3IgZXNjYXBpbmcgdGhlIHwgY2hhcmFjdGVyLiAgQXMgaXQgd29ya3Mgb3V0LFxuICAgICAgLy8gZXNjYXBpbmcgYW4gZXZlbiBudW1iZXIgb2Ygc2xhc2hlcyBjYW4gYmUgZG9uZSBieSBzaW1wbHkgcmVwZWF0aW5nXG4gICAgICAvLyBpdCBleGFjdGx5IGFmdGVyIGl0c2VsZi4gIFRoYXQncyB3aHkgdGhpcyB0cmljayB3b3Jrcy5cbiAgICAgIC8vXG4gICAgICAvLyBJIGFtIHNvcnJ5IHRoYXQgeW91IGhhdmUgdG8gc2VlIHRoaXMuXG4gICAgICByZXR1cm4gJDEgKyAkMSArICQyICsgJ3wnXG4gICAgfSlcblxuICAgIHRoaXMuZGVidWcoJ3RhaWw9JWpcXG4gICAlcycsIHRhaWwsIHRhaWwsIHBsLCByZSlcbiAgICB2YXIgdCA9IHBsLnR5cGUgPT09ICcqJyA/IHN0YXJcbiAgICAgIDogcGwudHlwZSA9PT0gJz8nID8gcW1hcmtcbiAgICAgIDogJ1xcXFwnICsgcGwudHlwZVxuXG4gICAgaGFzTWFnaWMgPSB0cnVlXG4gICAgcmUgPSByZS5zbGljZSgwLCBwbC5yZVN0YXJ0KSArIHQgKyAnXFxcXCgnICsgdGFpbFxuICB9XG5cbiAgLy8gaGFuZGxlIHRyYWlsaW5nIHRoaW5ncyB0aGF0IG9ubHkgbWF0dGVyIGF0IHRoZSB2ZXJ5IGVuZC5cbiAgY2xlYXJTdGF0ZUNoYXIoKVxuICBpZiAoZXNjYXBpbmcpIHtcbiAgICAvLyB0cmFpbGluZyBcXFxcXG4gICAgcmUgKz0gJ1xcXFxcXFxcJ1xuICB9XG5cbiAgLy8gb25seSBuZWVkIHRvIGFwcGx5IHRoZSBub2RvdCBzdGFydCBpZiB0aGUgcmUgc3RhcnRzIHdpdGhcbiAgLy8gc29tZXRoaW5nIHRoYXQgY291bGQgY29uY2VpdmFibHkgY2FwdHVyZSBhIGRvdFxuICB2YXIgYWRkUGF0dGVyblN0YXJ0ID0gZmFsc2VcbiAgc3dpdGNoIChyZS5jaGFyQXQoMCkpIHtcbiAgICBjYXNlICdbJzogY2FzZSAnLic6IGNhc2UgJygnOiBhZGRQYXR0ZXJuU3RhcnQgPSB0cnVlXG4gIH1cblxuICAvLyBIYWNrIHRvIHdvcmsgYXJvdW5kIGxhY2sgb2YgbmVnYXRpdmUgbG9va2JlaGluZCBpbiBKU1xuICAvLyBBIHBhdHRlcm4gbGlrZTogKi4hKHgpLiEoeXx6KSBuZWVkcyB0byBlbnN1cmUgdGhhdCBhIG5hbWVcbiAgLy8gbGlrZSAnYS54eXoueXonIGRvZXNuJ3QgbWF0Y2guICBTbywgdGhlIGZpcnN0IG5lZ2F0aXZlXG4gIC8vIGxvb2thaGVhZCwgaGFzIHRvIGxvb2sgQUxMIHRoZSB3YXkgYWhlYWQsIHRvIHRoZSBlbmQgb2ZcbiAgLy8gdGhlIHBhdHRlcm4uXG4gIGZvciAodmFyIG4gPSBuZWdhdGl2ZUxpc3RzLmxlbmd0aCAtIDE7IG4gPiAtMTsgbi0tKSB7XG4gICAgdmFyIG5sID0gbmVnYXRpdmVMaXN0c1tuXVxuXG4gICAgdmFyIG5sQmVmb3JlID0gcmUuc2xpY2UoMCwgbmwucmVTdGFydClcbiAgICB2YXIgbmxGaXJzdCA9IHJlLnNsaWNlKG5sLnJlU3RhcnQsIG5sLnJlRW5kIC0gOClcbiAgICB2YXIgbmxMYXN0ID0gcmUuc2xpY2UobmwucmVFbmQgLSA4LCBubC5yZUVuZClcbiAgICB2YXIgbmxBZnRlciA9IHJlLnNsaWNlKG5sLnJlRW5kKVxuXG4gICAgbmxMYXN0ICs9IG5sQWZ0ZXJcblxuICAgIC8vIEhhbmRsZSBuZXN0ZWQgc3R1ZmYgbGlrZSAqKCouanN8ISgqLmpzb24pKSwgd2hlcmUgb3BlbiBwYXJlbnNcbiAgICAvLyBtZWFuIHRoYXQgd2Ugc2hvdWxkICpub3QqIGluY2x1ZGUgdGhlICkgaW4gdGhlIGJpdCB0aGF0IGlzIGNvbnNpZGVyZWRcbiAgICAvLyBcImFmdGVyXCIgdGhlIG5lZ2F0ZWQgc2VjdGlvbi5cbiAgICB2YXIgb3BlblBhcmVuc0JlZm9yZSA9IG5sQmVmb3JlLnNwbGl0KCcoJykubGVuZ3RoIC0gMVxuICAgIHZhciBjbGVhbkFmdGVyID0gbmxBZnRlclxuICAgIGZvciAoaSA9IDA7IGkgPCBvcGVuUGFyZW5zQmVmb3JlOyBpKyspIHtcbiAgICAgIGNsZWFuQWZ0ZXIgPSBjbGVhbkFmdGVyLnJlcGxhY2UoL1xcKVsrKj9dPy8sICcnKVxuICAgIH1cbiAgICBubEFmdGVyID0gY2xlYW5BZnRlclxuXG4gICAgdmFyIGRvbGxhciA9ICcnXG4gICAgaWYgKG5sQWZ0ZXIgPT09ICcnICYmIGlzU3ViICE9PSBTVUJQQVJTRSkge1xuICAgICAgZG9sbGFyID0gJyQnXG4gICAgfVxuICAgIHZhciBuZXdSZSA9IG5sQmVmb3JlICsgbmxGaXJzdCArIG5sQWZ0ZXIgKyBkb2xsYXIgKyBubExhc3RcbiAgICByZSA9IG5ld1JlXG4gIH1cblxuICAvLyBpZiB0aGUgcmUgaXMgbm90IFwiXCIgYXQgdGhpcyBwb2ludCwgdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZVxuICAvLyBpdCBkb2Vzbid0IG1hdGNoIGFnYWluc3QgYW4gZW1wdHkgcGF0aCBwYXJ0LlxuICAvLyBPdGhlcndpc2UgYS8qIHdpbGwgbWF0Y2ggYS8sIHdoaWNoIGl0IHNob3VsZCBub3QuXG4gIGlmIChyZSAhPT0gJycgJiYgaGFzTWFnaWMpIHtcbiAgICByZSA9ICcoPz0uKScgKyByZVxuICB9XG5cbiAgaWYgKGFkZFBhdHRlcm5TdGFydCkge1xuICAgIHJlID0gcGF0dGVyblN0YXJ0ICsgcmVcbiAgfVxuXG4gIC8vIHBhcnNpbmcganVzdCBhIHBpZWNlIG9mIGEgbGFyZ2VyIHBhdHRlcm4uXG4gIGlmIChpc1N1YiA9PT0gU1VCUEFSU0UpIHtcbiAgICByZXR1cm4gW3JlLCBoYXNNYWdpY11cbiAgfVxuXG4gIC8vIHNraXAgdGhlIHJlZ2V4cCBmb3Igbm9uLW1hZ2ljYWwgcGF0dGVybnNcbiAgLy8gdW5lc2NhcGUgYW55dGhpbmcgaW4gaXQsIHRob3VnaCwgc28gdGhhdCBpdCdsbCBiZVxuICAvLyBhbiBleGFjdCBtYXRjaCBhZ2FpbnN0IGEgZmlsZSBldGMuXG4gIGlmICghaGFzTWFnaWMpIHtcbiAgICByZXR1cm4gZ2xvYlVuZXNjYXBlKHBhdHRlcm4pXG4gIH1cblxuICB2YXIgZmxhZ3MgPSBvcHRpb25zLm5vY2FzZSA/ICdpJyA6ICcnXG4gIHRyeSB7XG4gICAgdmFyIHJlZ0V4cCA9IG5ldyBSZWdFeHAoJ14nICsgcmUgKyAnJCcsIGZsYWdzKVxuICB9IGNhdGNoIChlcikgLyogaXN0YW5idWwgaWdub3JlIG5leHQgLSBzaG91bGQgYmUgaW1wb3NzaWJsZSAqLyB7XG4gICAgLy8gSWYgaXQgd2FzIGFuIGludmFsaWQgcmVndWxhciBleHByZXNzaW9uLCB0aGVuIGl0IGNhbid0IG1hdGNoXG4gICAgLy8gYW55dGhpbmcuICBUaGlzIHRyaWNrIGxvb2tzIGZvciBhIGNoYXJhY3RlciBhZnRlciB0aGUgZW5kIG9mXG4gICAgLy8gdGhlIHN0cmluZywgd2hpY2ggaXMgb2YgY291cnNlIGltcG9zc2libGUsIGV4Y2VwdCBpbiBtdWx0aS1saW5lXG4gICAgLy8gbW9kZSwgYnV0IGl0J3Mgbm90IGEgL20gcmVnZXguXG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoJyQuJylcbiAgfVxuXG4gIHJlZ0V4cC5fZ2xvYiA9IHBhdHRlcm5cbiAgcmVnRXhwLl9zcmMgPSByZVxuXG4gIHJldHVybiByZWdFeHBcbn1cblxubWluaW1hdGNoLm1ha2VSZSA9IGZ1bmN0aW9uIChwYXR0ZXJuLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgTWluaW1hdGNoKHBhdHRlcm4sIG9wdGlvbnMgfHwge30pLm1ha2VSZSgpXG59XG5cbk1pbmltYXRjaC5wcm90b3R5cGUubWFrZVJlID0gbWFrZVJlXG5mdW5jdGlvbiBtYWtlUmUgKCkge1xuICBpZiAodGhpcy5yZWdleHAgfHwgdGhpcy5yZWdleHAgPT09IGZhbHNlKSByZXR1cm4gdGhpcy5yZWdleHBcblxuICAvLyBhdCB0aGlzIHBvaW50LCB0aGlzLnNldCBpcyBhIDJkIGFycmF5IG9mIHBhcnRpYWxcbiAgLy8gcGF0dGVybiBzdHJpbmdzLCBvciBcIioqXCIuXG4gIC8vXG4gIC8vIEl0J3MgYmV0dGVyIHRvIHVzZSAubWF0Y2goKS4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkbid0XG4gIC8vIGJlIHVzZWQsIHJlYWxseSwgYnV0IGl0J3MgcHJldHR5IGNvbnZlbmllbnQgc29tZXRpbWVzLFxuICAvLyB3aGVuIHlvdSBqdXN0IHdhbnQgdG8gd29yayB3aXRoIGEgcmVnZXguXG4gIHZhciBzZXQgPSB0aGlzLnNldFxuXG4gIGlmICghc2V0Lmxlbmd0aCkge1xuICAgIHRoaXMucmVnZXhwID0gZmFsc2VcbiAgICByZXR1cm4gdGhpcy5yZWdleHBcbiAgfVxuICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uc1xuXG4gIHZhciB0d29TdGFyID0gb3B0aW9ucy5ub2dsb2JzdGFyID8gc3RhclxuICAgIDogb3B0aW9ucy5kb3QgPyB0d29TdGFyRG90XG4gICAgOiB0d29TdGFyTm9Eb3RcbiAgdmFyIGZsYWdzID0gb3B0aW9ucy5ub2Nhc2UgPyAnaScgOiAnJ1xuXG4gIHZhciByZSA9IHNldC5tYXAoZnVuY3Rpb24gKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gcGF0dGVybi5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICAgIHJldHVybiAocCA9PT0gR0xPQlNUQVIpID8gdHdvU3RhclxuICAgICAgOiAodHlwZW9mIHAgPT09ICdzdHJpbmcnKSA/IHJlZ0V4cEVzY2FwZShwKVxuICAgICAgOiBwLl9zcmNcbiAgICB9KS5qb2luKCdcXFxcXFwvJylcbiAgfSkuam9pbignfCcpXG5cbiAgLy8gbXVzdCBtYXRjaCBlbnRpcmUgcGF0dGVyblxuICAvLyBlbmRpbmcgaW4gYSAqIG9yICoqIHdpbGwgbWFrZSBpdCBsZXNzIHN0cmljdC5cbiAgcmUgPSAnXig/OicgKyByZSArICcpJCdcblxuICAvLyBjYW4gbWF0Y2ggYW55dGhpbmcsIGFzIGxvbmcgYXMgaXQncyBub3QgdGhpcy5cbiAgaWYgKHRoaXMubmVnYXRlKSByZSA9ICdeKD8hJyArIHJlICsgJykuKiQnXG5cbiAgdHJ5IHtcbiAgICB0aGlzLnJlZ2V4cCA9IG5ldyBSZWdFeHAocmUsIGZsYWdzKVxuICB9IGNhdGNoIChleCkgLyogaXN0YW5idWwgaWdub3JlIG5leHQgLSBzaG91bGQgYmUgaW1wb3NzaWJsZSAqLyB7XG4gICAgdGhpcy5yZWdleHAgPSBmYWxzZVxuICB9XG4gIHJldHVybiB0aGlzLnJlZ2V4cFxufVxuXG5taW5pbWF0Y2gubWF0Y2ggPSBmdW5jdGlvbiAobGlzdCwgcGF0dGVybiwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICB2YXIgbW0gPSBuZXcgTWluaW1hdGNoKHBhdHRlcm4sIG9wdGlvbnMpXG4gIGxpc3QgPSBsaXN0LmZpbHRlcihmdW5jdGlvbiAoZikge1xuICAgIHJldHVybiBtbS5tYXRjaChmKVxuICB9KVxuICBpZiAobW0ub3B0aW9ucy5ub251bGwgJiYgIWxpc3QubGVuZ3RoKSB7XG4gICAgbGlzdC5wdXNoKHBhdHRlcm4pXG4gIH1cbiAgcmV0dXJuIGxpc3Rcbn1cblxuTWluaW1hdGNoLnByb3RvdHlwZS5tYXRjaCA9IGZ1bmN0aW9uIG1hdGNoIChmLCBwYXJ0aWFsKSB7XG4gIGlmICh0eXBlb2YgcGFydGlhbCA9PT0gJ3VuZGVmaW5lZCcpIHBhcnRpYWwgPSB0aGlzLnBhcnRpYWxcbiAgdGhpcy5kZWJ1ZygnbWF0Y2gnLCBmLCB0aGlzLnBhdHRlcm4pXG4gIC8vIHNob3J0LWNpcmN1aXQgaW4gdGhlIGNhc2Ugb2YgYnVzdGVkIHRoaW5ncy5cbiAgLy8gY29tbWVudHMsIGV0Yy5cbiAgaWYgKHRoaXMuY29tbWVudCkgcmV0dXJuIGZhbHNlXG4gIGlmICh0aGlzLmVtcHR5KSByZXR1cm4gZiA9PT0gJydcblxuICBpZiAoZiA9PT0gJy8nICYmIHBhcnRpYWwpIHJldHVybiB0cnVlXG5cbiAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNcblxuICAvLyB3aW5kb3dzOiBuZWVkIHRvIHVzZSAvLCBub3QgXFxcbiAgaWYgKHBhdGguc2VwICE9PSAnLycpIHtcbiAgICBmID0gZi5zcGxpdChwYXRoLnNlcCkuam9pbignLycpXG4gIH1cblxuICAvLyB0cmVhdCB0aGUgdGVzdCBwYXRoIGFzIGEgc2V0IG9mIHBhdGhwYXJ0cy5cbiAgZiA9IGYuc3BsaXQoc2xhc2hTcGxpdClcbiAgdGhpcy5kZWJ1Zyh0aGlzLnBhdHRlcm4sICdzcGxpdCcsIGYpXG5cbiAgLy8ganVzdCBPTkUgb2YgdGhlIHBhdHRlcm4gc2V0cyBpbiB0aGlzLnNldCBuZWVkcyB0byBtYXRjaFxuICAvLyBpbiBvcmRlciBmb3IgaXQgdG8gYmUgdmFsaWQuICBJZiBuZWdhdGluZywgdGhlbiBqdXN0IG9uZVxuICAvLyBtYXRjaCBtZWFucyB0aGF0IHdlIGhhdmUgZmFpbGVkLlxuICAvLyBFaXRoZXIgd2F5LCByZXR1cm4gb24gdGhlIGZpcnN0IGhpdC5cblxuICB2YXIgc2V0ID0gdGhpcy5zZXRcbiAgdGhpcy5kZWJ1Zyh0aGlzLnBhdHRlcm4sICdzZXQnLCBzZXQpXG5cbiAgLy8gRmluZCB0aGUgYmFzZW5hbWUgb2YgdGhlIHBhdGggYnkgbG9va2luZyBmb3IgdGhlIGxhc3Qgbm9uLWVtcHR5IHNlZ21lbnRcbiAgdmFyIGZpbGVuYW1lXG4gIHZhciBpXG4gIGZvciAoaSA9IGYubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBmaWxlbmFtZSA9IGZbaV1cbiAgICBpZiAoZmlsZW5hbWUpIGJyZWFrXG4gIH1cblxuICBmb3IgKGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBhdHRlcm4gPSBzZXRbaV1cbiAgICB2YXIgZmlsZSA9IGZcbiAgICBpZiAob3B0aW9ucy5tYXRjaEJhc2UgJiYgcGF0dGVybi5sZW5ndGggPT09IDEpIHtcbiAgICAgIGZpbGUgPSBbZmlsZW5hbWVdXG4gICAgfVxuICAgIHZhciBoaXQgPSB0aGlzLm1hdGNoT25lKGZpbGUsIHBhdHRlcm4sIHBhcnRpYWwpXG4gICAgaWYgKGhpdCkge1xuICAgICAgaWYgKG9wdGlvbnMuZmxpcE5lZ2F0ZSkgcmV0dXJuIHRydWVcbiAgICAgIHJldHVybiAhdGhpcy5uZWdhdGVcbiAgICB9XG4gIH1cblxuICAvLyBkaWRuJ3QgZ2V0IGFueSBoaXRzLiAgdGhpcyBpcyBzdWNjZXNzIGlmIGl0J3MgYSBuZWdhdGl2ZVxuICAvLyBwYXR0ZXJuLCBmYWlsdXJlIG90aGVyd2lzZS5cbiAgaWYgKG9wdGlvbnMuZmxpcE5lZ2F0ZSkgcmV0dXJuIGZhbHNlXG4gIHJldHVybiB0aGlzLm5lZ2F0ZVxufVxuXG4vLyBzZXQgcGFydGlhbCB0byB0cnVlIHRvIHRlc3QgaWYsIGZvciBleGFtcGxlLFxuLy8gXCIvYS9iXCIgbWF0Y2hlcyB0aGUgc3RhcnQgb2YgXCIvKi9iLyovZFwiXG4vLyBQYXJ0aWFsIG1lYW5zLCBpZiB5b3UgcnVuIG91dCBvZiBmaWxlIGJlZm9yZSB5b3UgcnVuXG4vLyBvdXQgb2YgcGF0dGVybiwgdGhlbiB0aGF0J3MgZmluZSwgYXMgbG9uZyBhcyBhbGxcbi8vIHRoZSBwYXJ0cyBtYXRjaC5cbk1pbmltYXRjaC5wcm90b3R5cGUubWF0Y2hPbmUgPSBmdW5jdGlvbiAoZmlsZSwgcGF0dGVybiwgcGFydGlhbCkge1xuICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uc1xuXG4gIHRoaXMuZGVidWcoJ21hdGNoT25lJyxcbiAgICB7ICd0aGlzJzogdGhpcywgZmlsZTogZmlsZSwgcGF0dGVybjogcGF0dGVybiB9KVxuXG4gIHRoaXMuZGVidWcoJ21hdGNoT25lJywgZmlsZS5sZW5ndGgsIHBhdHRlcm4ubGVuZ3RoKVxuXG4gIGZvciAodmFyIGZpID0gMCxcbiAgICAgIHBpID0gMCxcbiAgICAgIGZsID0gZmlsZS5sZW5ndGgsXG4gICAgICBwbCA9IHBhdHRlcm4ubGVuZ3RoXG4gICAgICA7IChmaSA8IGZsKSAmJiAocGkgPCBwbClcbiAgICAgIDsgZmkrKywgcGkrKykge1xuICAgIHRoaXMuZGVidWcoJ21hdGNoT25lIGxvb3AnKVxuICAgIHZhciBwID0gcGF0dGVybltwaV1cbiAgICB2YXIgZiA9IGZpbGVbZmldXG5cbiAgICB0aGlzLmRlYnVnKHBhdHRlcm4sIHAsIGYpXG5cbiAgICAvLyBzaG91bGQgYmUgaW1wb3NzaWJsZS5cbiAgICAvLyBzb21lIGludmFsaWQgcmVnZXhwIHN0dWZmIGluIHRoZSBzZXQuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHAgPT09IGZhbHNlKSByZXR1cm4gZmFsc2VcblxuICAgIGlmIChwID09PSBHTE9CU1RBUikge1xuICAgICAgdGhpcy5kZWJ1ZygnR0xPQlNUQVInLCBbcGF0dGVybiwgcCwgZl0pXG5cbiAgICAgIC8vIFwiKipcIlxuICAgICAgLy8gYS8qKi9iLyoqL2Mgd291bGQgbWF0Y2ggdGhlIGZvbGxvd2luZzpcbiAgICAgIC8vIGEvYi94L3kvei9jXG4gICAgICAvLyBhL3gveS96L2IvY1xuICAgICAgLy8gYS9iL3gvYi94L2NcbiAgICAgIC8vIGEvYi9jXG4gICAgICAvLyBUbyBkbyB0aGlzLCB0YWtlIHRoZSByZXN0IG9mIHRoZSBwYXR0ZXJuIGFmdGVyXG4gICAgICAvLyB0aGUgKiosIGFuZCBzZWUgaWYgaXQgd291bGQgbWF0Y2ggdGhlIGZpbGUgcmVtYWluZGVyLlxuICAgICAgLy8gSWYgc28sIHJldHVybiBzdWNjZXNzLlxuICAgICAgLy8gSWYgbm90LCB0aGUgKiogXCJzd2FsbG93c1wiIGEgc2VnbWVudCwgYW5kIHRyeSBhZ2Fpbi5cbiAgICAgIC8vIFRoaXMgaXMgcmVjdXJzaXZlbHkgYXdmdWwuXG4gICAgICAvL1xuICAgICAgLy8gYS8qKi9iLyoqL2MgbWF0Y2hpbmcgYS9iL3gveS96L2NcbiAgICAgIC8vIC0gYSBtYXRjaGVzIGFcbiAgICAgIC8vIC0gZG91Ymxlc3RhclxuICAgICAgLy8gICAtIG1hdGNoT25lKGIveC95L3ovYywgYi8qKi9jKVxuICAgICAgLy8gICAgIC0gYiBtYXRjaGVzIGJcbiAgICAgIC8vICAgICAtIGRvdWJsZXN0YXJcbiAgICAgIC8vICAgICAgIC0gbWF0Y2hPbmUoeC95L3ovYywgYykgLT4gbm9cbiAgICAgIC8vICAgICAgIC0gbWF0Y2hPbmUoeS96L2MsIGMpIC0+IG5vXG4gICAgICAvLyAgICAgICAtIG1hdGNoT25lKHovYywgYykgLT4gbm9cbiAgICAgIC8vICAgICAgIC0gbWF0Y2hPbmUoYywgYykgeWVzLCBoaXRcbiAgICAgIHZhciBmciA9IGZpXG4gICAgICB2YXIgcHIgPSBwaSArIDFcbiAgICAgIGlmIChwciA9PT0gcGwpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZygnKiogYXQgdGhlIGVuZCcpXG4gICAgICAgIC8vIGEgKiogYXQgdGhlIGVuZCB3aWxsIGp1c3Qgc3dhbGxvdyB0aGUgcmVzdC5cbiAgICAgICAgLy8gV2UgaGF2ZSBmb3VuZCBhIG1hdGNoLlxuICAgICAgICAvLyBob3dldmVyLCBpdCB3aWxsIG5vdCBzd2FsbG93IC8ueCwgdW5sZXNzXG4gICAgICAgIC8vIG9wdGlvbnMuZG90IGlzIHNldC5cbiAgICAgICAgLy8gLiBhbmQgLi4gYXJlICpuZXZlciogbWF0Y2hlZCBieSAqKiwgZm9yIGV4cGxvc2l2ZWx5XG4gICAgICAgIC8vIGV4cG9uZW50aWFsIHJlYXNvbnMuXG4gICAgICAgIGZvciAoOyBmaSA8IGZsOyBmaSsrKSB7XG4gICAgICAgICAgaWYgKGZpbGVbZmldID09PSAnLicgfHwgZmlsZVtmaV0gPT09ICcuLicgfHxcbiAgICAgICAgICAgICghb3B0aW9ucy5kb3QgJiYgZmlsZVtmaV0uY2hhckF0KDApID09PSAnLicpKSByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuXG4gICAgICAvLyBvaywgbGV0J3Mgc2VlIGlmIHdlIGNhbiBzd2FsbG93IHdoYXRldmVyIHdlIGNhbi5cbiAgICAgIHdoaWxlIChmciA8IGZsKSB7XG4gICAgICAgIHZhciBzd2FsbG93ZWUgPSBmaWxlW2ZyXVxuXG4gICAgICAgIHRoaXMuZGVidWcoJ1xcbmdsb2JzdGFyIHdoaWxlJywgZmlsZSwgZnIsIHBhdHRlcm4sIHByLCBzd2FsbG93ZWUpXG5cbiAgICAgICAgLy8gWFhYIHJlbW92ZSB0aGlzIHNsaWNlLiAgSnVzdCBwYXNzIHRoZSBzdGFydCBpbmRleC5cbiAgICAgICAgaWYgKHRoaXMubWF0Y2hPbmUoZmlsZS5zbGljZShmciksIHBhdHRlcm4uc2xpY2UocHIpLCBwYXJ0aWFsKSkge1xuICAgICAgICAgIHRoaXMuZGVidWcoJ2dsb2JzdGFyIGZvdW5kIG1hdGNoIScsIGZyLCBmbCwgc3dhbGxvd2VlKVxuICAgICAgICAgIC8vIGZvdW5kIGEgbWF0Y2guXG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBjYW4ndCBzd2FsbG93IFwiLlwiIG9yIFwiLi5cIiBldmVyLlxuICAgICAgICAgIC8vIGNhbiBvbmx5IHN3YWxsb3cgXCIuZm9vXCIgd2hlbiBleHBsaWNpdGx5IGFza2VkLlxuICAgICAgICAgIGlmIChzd2FsbG93ZWUgPT09ICcuJyB8fCBzd2FsbG93ZWUgPT09ICcuLicgfHxcbiAgICAgICAgICAgICghb3B0aW9ucy5kb3QgJiYgc3dhbGxvd2VlLmNoYXJBdCgwKSA9PT0gJy4nKSkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZygnZG90IGRldGVjdGVkIScsIGZpbGUsIGZyLCBwYXR0ZXJuLCBwcilcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gKiogc3dhbGxvd3MgYSBzZWdtZW50LCBhbmQgY29udGludWUuXG4gICAgICAgICAgdGhpcy5kZWJ1ZygnZ2xvYnN0YXIgc3dhbGxvdyBhIHNlZ21lbnQsIGFuZCBjb250aW51ZScpXG4gICAgICAgICAgZnIrK1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIG5vIG1hdGNoIHdhcyBmb3VuZC5cbiAgICAgIC8vIEhvd2V2ZXIsIGluIHBhcnRpYWwgbW9kZSwgd2UgY2FuJ3Qgc2F5IHRoaXMgaXMgbmVjZXNzYXJpbHkgb3Zlci5cbiAgICAgIC8vIElmIHRoZXJlJ3MgbW9yZSAqcGF0dGVybiogbGVmdCwgdGhlblxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAocGFydGlhbCkge1xuICAgICAgICAvLyByYW4gb3V0IG9mIGZpbGVcbiAgICAgICAgdGhpcy5kZWJ1ZygnXFxuPj4+IG5vIG1hdGNoLCBwYXJ0aWFsPycsIGZpbGUsIGZyLCBwYXR0ZXJuLCBwcilcbiAgICAgICAgaWYgKGZyID09PSBmbCkgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIHNvbWV0aGluZyBvdGhlciB0aGFuICoqXG4gICAgLy8gbm9uLW1hZ2ljIHBhdHRlcm5zIGp1c3QgaGF2ZSB0byBtYXRjaCBleGFjdGx5XG4gICAgLy8gcGF0dGVybnMgd2l0aCBtYWdpYyBoYXZlIGJlZW4gdHVybmVkIGludG8gcmVnZXhwcy5cbiAgICB2YXIgaGl0XG4gICAgaWYgKHR5cGVvZiBwID09PSAnc3RyaW5nJykge1xuICAgICAgaGl0ID0gZiA9PT0gcFxuICAgICAgdGhpcy5kZWJ1Zygnc3RyaW5nIG1hdGNoJywgcCwgZiwgaGl0KVxuICAgIH0gZWxzZSB7XG4gICAgICBoaXQgPSBmLm1hdGNoKHApXG4gICAgICB0aGlzLmRlYnVnKCdwYXR0ZXJuIG1hdGNoJywgcCwgZiwgaGl0KVxuICAgIH1cblxuICAgIGlmICghaGl0KSByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIE5vdGU6IGVuZGluZyBpbiAvIG1lYW5zIHRoYXQgd2UnbGwgZ2V0IGEgZmluYWwgXCJcIlxuICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuLiAgVGhpcyBjYW4gb25seSBtYXRjaCBhXG4gIC8vIGNvcnJlc3BvbmRpbmcgXCJcIiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLlxuICAvLyBJZiB0aGUgZmlsZSBlbmRzIGluIC8sIHRoZW4gaXQgY2FuIG9ubHkgbWF0Y2ggYVxuICAvLyBhIHBhdHRlcm4gdGhhdCBlbmRzIGluIC8sIHVubGVzcyB0aGUgcGF0dGVybiBqdXN0XG4gIC8vIGRvZXNuJ3QgaGF2ZSBhbnkgbW9yZSBmb3IgaXQuIEJ1dCwgYS9iLyBzaG91bGQgKm5vdCpcbiAgLy8gbWF0Y2ggXCJhL2IvKlwiLCBldmVuIHRob3VnaCBcIlwiIG1hdGNoZXMgYWdhaW5zdCB0aGVcbiAgLy8gW14vXSo/IHBhdHRlcm4sIGV4Y2VwdCBpbiBwYXJ0aWFsIG1vZGUsIHdoZXJlIGl0IG1pZ2h0XG4gIC8vIHNpbXBseSBub3QgYmUgcmVhY2hlZCB5ZXQuXG4gIC8vIEhvd2V2ZXIsIGEvYi8gc2hvdWxkIHN0aWxsIHNhdGlzZnkgYS8qXG5cbiAgLy8gbm93IGVpdGhlciB3ZSBmZWxsIG9mZiB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuLCBvciB3ZSdyZSBkb25lLlxuICBpZiAoZmkgPT09IGZsICYmIHBpID09PSBwbCkge1xuICAgIC8vIHJhbiBvdXQgb2YgcGF0dGVybiBhbmQgZmlsZW5hbWUgYXQgdGhlIHNhbWUgdGltZS5cbiAgICAvLyBhbiBleGFjdCBoaXQhXG4gICAgcmV0dXJuIHRydWVcbiAgfSBlbHNlIGlmIChmaSA9PT0gZmwpIHtcbiAgICAvLyByYW4gb3V0IG9mIGZpbGUsIGJ1dCBzdGlsbCBoYWQgcGF0dGVybiBsZWZ0LlxuICAgIC8vIHRoaXMgaXMgb2sgaWYgd2UncmUgZG9pbmcgdGhlIG1hdGNoIGFzIHBhcnQgb2ZcbiAgICAvLyBhIGdsb2IgZnMgdHJhdmVyc2FsLlxuICAgIHJldHVybiBwYXJ0aWFsXG4gIH0gZWxzZSAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLyBpZiAocGkgPT09IHBsKSB7XG4gICAgLy8gcmFuIG91dCBvZiBwYXR0ZXJuLCBzdGlsbCBoYXZlIGZpbGUgbGVmdC5cbiAgICAvLyB0aGlzIGlzIG9ubHkgYWNjZXB0YWJsZSBpZiB3ZSdyZSBvbiB0aGUgdmVyeSBsYXN0XG4gICAgLy8gZW1wdHkgc2VnbWVudCBvZiBhIGZpbGUgd2l0aCBhIHRyYWlsaW5nIHNsYXNoLlxuICAgIC8vIGEvKiBzaG91bGQgbWF0Y2ggYS9iL1xuICAgIHJldHVybiAoZmkgPT09IGZsIC0gMSkgJiYgKGZpbGVbZmldID09PSAnJylcbiAgfVxuXG4gIC8vIHNob3VsZCBiZSB1bnJlYWNoYWJsZS5cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgdGhyb3cgbmV3IEVycm9yKCd3dGY/Jylcbn1cblxuLy8gcmVwbGFjZSBzdHVmZiBsaWtlIFxcKiB3aXRoICpcbmZ1bmN0aW9uIGdsb2JVbmVzY2FwZSAocykge1xuICByZXR1cm4gcy5yZXBsYWNlKC9cXFxcKC4pL2csICckMScpXG59XG5cbmZ1bmN0aW9uIHJlZ0V4cEVzY2FwZSAocykge1xuICByZXR1cm4gcy5yZXBsYWNlKC9bLVtcXF17fSgpKis/LixcXFxcXiR8I1xcc10vZywgJ1xcXFwkJicpXG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1171\n")},3171:module=>{eval("/*!\n * normalize-path \n *\n * Copyright (c) 2014-2018, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nmodule.exports = function(path, stripTrailing) {\n if (typeof path !== 'string') {\n throw new TypeError('expected path to be a string');\n }\n\n if (path === '\\\\' || path === '/') return '/';\n\n var len = path.length;\n if (len <= 1) return path;\n\n // ensure that win32 namespaces has two leading slashes, so that the path is\n // handled properly by the win32 version of path.parse() after being normalized\n // https://msdn.microsoft.com/library/windows/desktop/aa365247(v=vs.85).aspx#namespaces\n var prefix = '';\n if (len > 4 && path[3] === '\\\\') {\n var ch = path[2];\n if ((ch === '?' || ch === '.') && path.slice(0, 2) === '\\\\\\\\') {\n path = path.slice(2);\n prefix = '//';\n }\n }\n\n var segs = path.split(/[/\\\\]+/);\n if (stripTrailing !== false && segs[segs.length - 1] === '') {\n segs.pop();\n }\n return prefix + segs.join('/');\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE3MS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL25vcm1hbGl6ZS1wYXRoL2luZGV4LmpzPzc0YjMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBub3JtYWxpemUtcGF0aCA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvbm9ybWFsaXplLXBhdGg+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTgsIEpvbiBTY2hsaW5rZXJ0LlxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ocGF0aCwgc3RyaXBUcmFpbGluZykge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhwZWN0ZWQgcGF0aCB0byBiZSBhIHN0cmluZycpO1xuICB9XG5cbiAgaWYgKHBhdGggPT09ICdcXFxcJyB8fCBwYXRoID09PSAnLycpIHJldHVybiAnLyc7XG5cbiAgdmFyIGxlbiA9IHBhdGgubGVuZ3RoO1xuICBpZiAobGVuIDw9IDEpIHJldHVybiBwYXRoO1xuXG4gIC8vIGVuc3VyZSB0aGF0IHdpbjMyIG5hbWVzcGFjZXMgaGFzIHR3byBsZWFkaW5nIHNsYXNoZXMsIHNvIHRoYXQgdGhlIHBhdGggaXNcbiAgLy8gaGFuZGxlZCBwcm9wZXJseSBieSB0aGUgd2luMzIgdmVyc2lvbiBvZiBwYXRoLnBhcnNlKCkgYWZ0ZXIgYmVpbmcgbm9ybWFsaXplZFxuICAvLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9hYTM2NTI0Nyh2PXZzLjg1KS5hc3B4I25hbWVzcGFjZXNcbiAgdmFyIHByZWZpeCA9ICcnO1xuICBpZiAobGVuID4gNCAmJiBwYXRoWzNdID09PSAnXFxcXCcpIHtcbiAgICB2YXIgY2ggPSBwYXRoWzJdO1xuICAgIGlmICgoY2ggPT09ICc/JyB8fCBjaCA9PT0gJy4nKSAmJiBwYXRoLnNsaWNlKDAsIDIpID09PSAnXFxcXFxcXFwnKSB7XG4gICAgICBwYXRoID0gcGF0aC5zbGljZSgyKTtcbiAgICAgIHByZWZpeCA9ICcvLyc7XG4gICAgfVxuICB9XG5cbiAgdmFyIHNlZ3MgPSBwYXRoLnNwbGl0KC9bL1xcXFxdKy8pO1xuICBpZiAoc3RyaXBUcmFpbGluZyAhPT0gZmFsc2UgJiYgc2Vnc1tzZWdzLmxlbmd0aCAtIDFdID09PSAnJykge1xuICAgIHNlZ3MucG9wKCk7XG4gIH1cbiAgcmV0dXJuIHByZWZpeCArIHNlZ3Muam9pbignLycpO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3171\n")},778:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var wrappy = __webpack_require__(2479)\nmodule.exports = wrappy(once)\nmodule.exports.strict = wrappy(onceStrict)\n\nonce.proto = once(function () {\n Object.defineProperty(Function.prototype, 'once', {\n value: function () {\n return once(this)\n },\n configurable: true\n })\n\n Object.defineProperty(Function.prototype, 'onceStrict', {\n value: function () {\n return onceStrict(this)\n },\n configurable: true\n })\n})\n\nfunction once (fn) {\n var f = function () {\n if (f.called) return f.value\n f.called = true\n return f.value = fn.apply(this, arguments)\n }\n f.called = false\n return f\n}\n\nfunction onceStrict (fn) {\n var f = function () {\n if (f.called)\n throw new Error(f.onceError)\n f.called = true\n return f.value = fn.apply(this, arguments)\n }\n var name = fn.name || 'Function wrapped with `once`'\n f.onceError = name + \" shouldn't be called more than once\"\n f.called = false\n return f\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzc4LmpzIiwibWFwcGluZ3MiOiJBQUFBLGFBQWEsbUJBQU8sQ0FBQyxJQUFRO0FBQzdCO0FBQ0EscUJBQXFCOztBQUVyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL29uY2Uvb25jZS5qcz81NjZiIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB3cmFwcHkgPSByZXF1aXJlKCd3cmFwcHknKVxubW9kdWxlLmV4cG9ydHMgPSB3cmFwcHkob25jZSlcbm1vZHVsZS5leHBvcnRzLnN0cmljdCA9IHdyYXBweShvbmNlU3RyaWN0KVxuXG5vbmNlLnByb3RvID0gb25jZShmdW5jdGlvbiAoKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsICdvbmNlJywge1xuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gb25jZSh0aGlzKVxuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZ1bmN0aW9uLnByb3RvdHlwZSwgJ29uY2VTdHJpY3QnLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBvbmNlU3RyaWN0KHRoaXMpXG4gICAgfSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSlcbn0pXG5cbmZ1bmN0aW9uIG9uY2UgKGZuKSB7XG4gIHZhciBmID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChmLmNhbGxlZCkgcmV0dXJuIGYudmFsdWVcbiAgICBmLmNhbGxlZCA9IHRydWVcbiAgICByZXR1cm4gZi52YWx1ZSA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgfVxuICBmLmNhbGxlZCA9IGZhbHNlXG4gIHJldHVybiBmXG59XG5cbmZ1bmN0aW9uIG9uY2VTdHJpY3QgKGZuKSB7XG4gIHZhciBmID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChmLmNhbGxlZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihmLm9uY2VFcnJvcilcbiAgICBmLmNhbGxlZCA9IHRydWVcbiAgICByZXR1cm4gZi52YWx1ZSA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgfVxuICB2YXIgbmFtZSA9IGZuLm5hbWUgfHwgJ0Z1bmN0aW9uIHdyYXBwZWQgd2l0aCBgb25jZWAnXG4gIGYub25jZUVycm9yID0gbmFtZSArIFwiIHNob3VsZG4ndCBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2VcIlxuICBmLmNhbGxlZCA9IGZhbHNlXG4gIHJldHVybiBmXG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///778\n")},4095:module=>{"use strict";eval("\n\nfunction posix(path) {\n\treturn path.charAt(0) === '/';\n}\n\nfunction win32(path) {\n\t// https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56\n\tvar splitDeviceRe = /^([a-zA-Z]:|[\\\\\\/]{2}[^\\\\\\/]+[\\\\\\/]+[^\\\\\\/]+)?([\\\\\\/])?([\\s\\S]*?)$/;\n\tvar result = splitDeviceRe.exec(path);\n\tvar device = result[1] || '';\n\tvar isUnc = Boolean(device && device.charAt(1) !== ':');\n\n\t// UNC paths are always absolute\n\treturn Boolean(result[2] || isUnc);\n}\n\nmodule.exports = process.platform === 'win32' ? win32 : posix;\nmodule.exports.posix = posix;\nmodule.exports.win32 = win32;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA5NS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlDQUF5QyxFQUFFO0FBQzNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0I7QUFDcEIsb0JBQW9CIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvcGF0aC1pcy1hYnNvbHV0ZS9pbmRleC5qcz9hMWEyIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gcG9zaXgocGF0aCkge1xuXHRyZXR1cm4gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbn1cblxuZnVuY3Rpb24gd2luMzIocGF0aCkge1xuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9iM2ZjYzI0NWZiMjU1Mzk5MDllZjFkNWVhYTAxZGJmOTJlMTY4NjMzL2xpYi9wYXRoLmpzI0w1NlxuXHR2YXIgc3BsaXREZXZpY2VSZSA9IC9eKFthLXpBLVpdOnxbXFxcXFxcL117Mn1bXlxcXFxcXC9dK1tcXFxcXFwvXStbXlxcXFxcXC9dKyk/KFtcXFxcXFwvXSk/KFtcXHNcXFNdKj8pJC87XG5cdHZhciByZXN1bHQgPSBzcGxpdERldmljZVJlLmV4ZWMocGF0aCk7XG5cdHZhciBkZXZpY2UgPSByZXN1bHRbMV0gfHwgJyc7XG5cdHZhciBpc1VuYyA9IEJvb2xlYW4oZGV2aWNlICYmIGRldmljZS5jaGFyQXQoMSkgIT09ICc6Jyk7XG5cblx0Ly8gVU5DIHBhdGhzIGFyZSBhbHdheXMgYWJzb2x1dGVcblx0cmV0dXJuIEJvb2xlYW4ocmVzdWx0WzJdIHx8IGlzVW5jKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gd2luMzIgOiBwb3NpeDtcbm1vZHVsZS5leHBvcnRzLnBvc2l4ID0gcG9zaXg7XG5tb2R1bGUuZXhwb3J0cy53aW4zMiA9IHdpbjMyO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4095\n")},8212:module=>{"use strict";eval("\n\nif (typeof process === 'undefined' ||\n !process.version ||\n process.version.indexOf('v0.') === 0 ||\n process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {\n module.exports = { nextTick: nextTick };\n} else {\n module.exports = process\n}\n\nfunction nextTick(fn, arg1, arg2, arg3) {\n if (typeof fn !== 'function') {\n throw new TypeError('\"callback\" argument must be a function');\n }\n var len = arguments.length;\n var args, i;\n switch (len) {\n case 0:\n case 1:\n return process.nextTick(fn);\n case 2:\n return process.nextTick(function afterTickOne() {\n fn.call(null, arg1);\n });\n case 3:\n return process.nextTick(function afterTickTwo() {\n fn.call(null, arg1, arg2);\n });\n case 4:\n return process.nextTick(function afterTickThree() {\n fn.call(null, arg1, arg2, arg3);\n });\n default:\n args = new Array(len - 1);\n i = 0;\n while (i < args.length) {\n args[i++] = arguments[i];\n }\n return process.nextTick(function afterTick() {\n fn.apply(null, args);\n });\n }\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODIxMi5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MtbmV4dGljay1hcmdzL2luZGV4LmpzPzk2NmQiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5pZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgIXByb2Nlc3MudmVyc2lvbiB8fFxuICAgIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MC4nKSA9PT0gMCB8fFxuICAgIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MS4nKSA9PT0gMCAmJiBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjEuOC4nKSAhPT0gMCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHsgbmV4dFRpY2s6IG5leHRUaWNrIH07XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHByb2Nlc3Ncbn1cblxuZnVuY3Rpb24gbmV4dFRpY2soZm4sIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiY2FsbGJhY2tcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGFyZ3MsIGk7XG4gIHN3aXRjaCAobGVuKSB7XG4gIGNhc2UgMDpcbiAgY2FzZSAxOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZuKTtcbiAgY2FzZSAyOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja09uZSgpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSk7XG4gICAgfSk7XG4gIGNhc2UgMzpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUd28oKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEsIGFyZzIpO1xuICAgIH0pO1xuICBjYXNlIDQ6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrVGhyZWUoKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgIH0pO1xuICBkZWZhdWx0OlxuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBhcmdzLmxlbmd0aCkge1xuICAgICAgYXJnc1tpKytdID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2soKSB7XG4gICAgICBmbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9KTtcbiAgfVxufVxuXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8212\n")},4012:module=>{"use strict";eval("\n\nconst codes = {};\n\nfunction createErrorType(code, message, Base) {\n if (!Base) {\n Base = Error\n }\n\n function getMessage (arg1, arg2, arg3) {\n if (typeof message === 'string') {\n return message\n } else {\n return message(arg1, arg2, arg3)\n }\n }\n\n class NodeError extends Base {\n constructor (arg1, arg2, arg3) {\n super(getMessage(arg1, arg2, arg3));\n }\n }\n\n NodeError.prototype.name = Base.name;\n NodeError.prototype.code = code;\n\n codes[code] = NodeError;\n}\n\n// https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js\nfunction oneOf(expected, thing) {\n if (Array.isArray(expected)) {\n const len = expected.length;\n expected = expected.map((i) => String(i));\n if (len > 2) {\n return `one of ${thing} ${expected.slice(0, len - 1).join(', ')}, or ` +\n expected[len - 1];\n } else if (len === 2) {\n return `one of ${thing} ${expected[0]} or ${expected[1]}`;\n } else {\n return `of ${thing} ${expected[0]}`;\n }\n } else {\n return `of ${thing} ${String(expected)}`;\n }\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith\nfunction startsWith(str, search, pos) {\n\treturn str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith\nfunction endsWith(str, search, this_len) {\n\tif (this_len === undefined || this_len > str.length) {\n\t\tthis_len = str.length;\n\t}\n\treturn str.substring(this_len - search.length, this_len) === search;\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes\nfunction includes(str, search, start) {\n if (typeof start !== 'number') {\n start = 0;\n }\n\n if (start + search.length > str.length) {\n return false;\n } else {\n return str.indexOf(search, start) !== -1;\n }\n}\n\ncreateErrorType('ERR_INVALID_OPT_VALUE', function (name, value) {\n return 'The value \"' + value + '\" is invalid for option \"' + name + '\"'\n}, TypeError);\ncreateErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) {\n // determiner: 'must be' or 'must not be'\n let determiner;\n if (typeof expected === 'string' && startsWith(expected, 'not ')) {\n determiner = 'must not be';\n expected = expected.replace(/^not /, '');\n } else {\n determiner = 'must be';\n }\n\n let msg;\n if (endsWith(name, ' argument')) {\n // For cases like 'first argument'\n msg = `The ${name} ${determiner} ${oneOf(expected, 'type')}`;\n } else {\n const type = includes(name, '.') ? 'property' : 'argument';\n msg = `The \"${name}\" ${type} ${determiner} ${oneOf(expected, 'type')}`;\n }\n\n msg += `. Received type ${typeof actual}`;\n return msg;\n}, TypeError);\ncreateErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF');\ncreateErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) {\n return 'The ' + name + ' method is not implemented'\n});\ncreateErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close');\ncreateErrorType('ERR_STREAM_DESTROYED', function (name) {\n return 'Cannot call ' + name + ' after a stream was destroyed';\n});\ncreateErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times');\ncreateErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable');\ncreateErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end');\ncreateErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError);\ncreateErrorType('ERR_UNKNOWN_ENCODING', function (arg) {\n return 'Unknown encoding: ' + arg\n}, TypeError);\ncreateErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event');\n\nmodule.exports.q = codes;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAxMi5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixPQUFPLEVBQUUsc0NBQXNDO0FBQ3RFO0FBQ0EsTUFBTTtBQUNOLHVCQUF1QixPQUFPLEVBQUUsYUFBYSxLQUFLLFlBQVk7QUFDOUQsTUFBTTtBQUNOLG1CQUFtQixPQUFPLEVBQUUsWUFBWTtBQUN4QztBQUNBLElBQUk7QUFDSixpQkFBaUIsT0FBTyxFQUFFLGlCQUFpQjtBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsTUFBTSxFQUFFLFlBQVksRUFBRSx3QkFBd0I7QUFDL0QsSUFBSTtBQUNKO0FBQ0Esa0JBQWtCLEtBQUssSUFBSSxNQUFNLEVBQUUsWUFBWSxFQUFFLHdCQUF3QjtBQUN6RTs7QUFFQSw0QkFBNEIsY0FBYztBQUMxQztBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQSxnQkFBb0IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vZXJyb3JzLmpzPzhhNGEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBjb2RlcyA9IHt9O1xuXG5mdW5jdGlvbiBjcmVhdGVFcnJvclR5cGUoY29kZSwgbWVzc2FnZSwgQmFzZSkge1xuICBpZiAoIUJhc2UpIHtcbiAgICBCYXNlID0gRXJyb3JcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1lc3NhZ2UgKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbWVzc2FnZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbWVzc2FnZShhcmcxLCBhcmcyLCBhcmczKVxuICAgIH1cbiAgfVxuXG4gIGNsYXNzIE5vZGVFcnJvciBleHRlbmRzIEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgICBzdXBlcihnZXRNZXNzYWdlKGFyZzEsIGFyZzIsIGFyZzMpKTtcbiAgICB9XG4gIH1cblxuICBOb2RlRXJyb3IucHJvdG90eXBlLm5hbWUgPSBCYXNlLm5hbWU7XG4gIE5vZGVFcnJvci5wcm90b3R5cGUuY29kZSA9IGNvZGU7XG5cbiAgY29kZXNbY29kZV0gPSBOb2RlRXJyb3I7XG59XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL3YxMC44LjAvbGliL2ludGVybmFsL2Vycm9ycy5qc1xuZnVuY3Rpb24gb25lT2YoZXhwZWN0ZWQsIHRoaW5nKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGV4cGVjdGVkKSkge1xuICAgIGNvbnN0IGxlbiA9IGV4cGVjdGVkLmxlbmd0aDtcbiAgICBleHBlY3RlZCA9IGV4cGVjdGVkLm1hcCgoaSkgPT4gU3RyaW5nKGkpKTtcbiAgICBpZiAobGVuID4gMikge1xuICAgICAgcmV0dXJuIGBvbmUgb2YgJHt0aGluZ30gJHtleHBlY3RlZC5zbGljZSgwLCBsZW4gLSAxKS5qb2luKCcsICcpfSwgb3IgYCArXG4gICAgICAgICAgICAgZXhwZWN0ZWRbbGVuIC0gMV07XG4gICAgfSBlbHNlIGlmIChsZW4gPT09IDIpIHtcbiAgICAgIHJldHVybiBgb25lIG9mICR7dGhpbmd9ICR7ZXhwZWN0ZWRbMF19IG9yICR7ZXhwZWN0ZWRbMV19YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGBvZiAke3RoaW5nfSAke2V4cGVjdGVkWzBdfWA7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBgb2YgJHt0aGluZ30gJHtTdHJpbmcoZXhwZWN0ZWQpfWA7XG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL3N0YXJ0c1dpdGhcbmZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyLCBzZWFyY2gsIHBvcykge1xuXHRyZXR1cm4gc3RyLnN1YnN0cighcG9zIHx8IHBvcyA8IDAgPyAwIDogK3Bvcywgc2VhcmNoLmxlbmd0aCkgPT09IHNlYXJjaDtcbn1cblxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL2VuZHNXaXRoXG5mdW5jdGlvbiBlbmRzV2l0aChzdHIsIHNlYXJjaCwgdGhpc19sZW4pIHtcblx0aWYgKHRoaXNfbGVuID09PSB1bmRlZmluZWQgfHwgdGhpc19sZW4gPiBzdHIubGVuZ3RoKSB7XG5cdFx0dGhpc19sZW4gPSBzdHIubGVuZ3RoO1xuXHR9XG5cdHJldHVybiBzdHIuc3Vic3RyaW5nKHRoaXNfbGVuIC0gc2VhcmNoLmxlbmd0aCwgdGhpc19sZW4pID09PSBzZWFyY2g7XG59XG5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N0cmluZy9pbmNsdWRlc1xuZnVuY3Rpb24gaW5jbHVkZXMoc3RyLCBzZWFyY2gsIHN0YXJ0KSB7XG4gIGlmICh0eXBlb2Ygc3RhcnQgIT09ICdudW1iZXInKSB7XG4gICAgc3RhcnQgPSAwO1xuICB9XG5cbiAgaWYgKHN0YXJ0ICsgc2VhcmNoLmxlbmd0aCA+IHN0ci5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0ci5pbmRleE9mKHNlYXJjaCwgc3RhcnQpICE9PSAtMTtcbiAgfVxufVxuXG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9JTlZBTElEX09QVF9WQUxVRScsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gJ1RoZSB2YWx1ZSBcIicgKyB2YWx1ZSArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCInICsgbmFtZSArICdcIidcbn0sIFR5cGVFcnJvcik7XG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9JTlZBTElEX0FSR19UWVBFJywgZnVuY3Rpb24gKG5hbWUsIGV4cGVjdGVkLCBhY3R1YWwpIHtcbiAgLy8gZGV0ZXJtaW5lcjogJ211c3QgYmUnIG9yICdtdXN0IG5vdCBiZSdcbiAgbGV0IGRldGVybWluZXI7XG4gIGlmICh0eXBlb2YgZXhwZWN0ZWQgPT09ICdzdHJpbmcnICYmIHN0YXJ0c1dpdGgoZXhwZWN0ZWQsICdub3QgJykpIHtcbiAgICBkZXRlcm1pbmVyID0gJ211c3Qgbm90IGJlJztcbiAgICBleHBlY3RlZCA9IGV4cGVjdGVkLnJlcGxhY2UoL15ub3QgLywgJycpO1xuICB9IGVsc2Uge1xuICAgIGRldGVybWluZXIgPSAnbXVzdCBiZSc7XG4gIH1cblxuICBsZXQgbXNnO1xuICBpZiAoZW5kc1dpdGgobmFtZSwgJyBhcmd1bWVudCcpKSB7XG4gICAgLy8gRm9yIGNhc2VzIGxpa2UgJ2ZpcnN0IGFyZ3VtZW50J1xuICAgIG1zZyA9IGBUaGUgJHtuYW1lfSAke2RldGVybWluZXJ9ICR7b25lT2YoZXhwZWN0ZWQsICd0eXBlJyl9YDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB0eXBlID0gaW5jbHVkZXMobmFtZSwgJy4nKSA/ICdwcm9wZXJ0eScgOiAnYXJndW1lbnQnO1xuICAgIG1zZyA9IGBUaGUgXCIke25hbWV9XCIgJHt0eXBlfSAke2RldGVybWluZXJ9ICR7b25lT2YoZXhwZWN0ZWQsICd0eXBlJyl9YDtcbiAgfVxuXG4gIG1zZyArPSBgLiBSZWNlaXZlZCB0eXBlICR7dHlwZW9mIGFjdHVhbH1gO1xuICByZXR1cm4gbXNnO1xufSwgVHlwZUVycm9yKTtcbmNyZWF0ZUVycm9yVHlwZSgnRVJSX1NUUkVBTV9QVVNIX0FGVEVSX0VPRicsICdzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRicpO1xuY3JlYXRlRXJyb3JUeXBlKCdFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCcsIGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiAnVGhlICcgKyBuYW1lICsgJyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkJ1xufSk7XG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFJywgJ1ByZW1hdHVyZSBjbG9zZScpO1xuY3JlYXRlRXJyb3JUeXBlKCdFUlJfU1RSRUFNX0RFU1RST1lFRCcsIGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiAnQ2Fubm90IGNhbGwgJyArIG5hbWUgKyAnIGFmdGVyIGEgc3RyZWFtIHdhcyBkZXN0cm95ZWQnO1xufSk7XG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9NVUxUSVBMRV9DQUxMQkFDSycsICdDYWxsYmFjayBjYWxsZWQgbXVsdGlwbGUgdGltZXMnKTtcbmNyZWF0ZUVycm9yVHlwZSgnRVJSX1NUUkVBTV9DQU5OT1RfUElQRScsICdDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlJyk7XG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EJywgJ3dyaXRlIGFmdGVyIGVuZCcpO1xuY3JlYXRlRXJyb3JUeXBlKCdFUlJfU1RSRUFNX05VTExfVkFMVUVTJywgJ01heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtJywgVHlwZUVycm9yKTtcbmNyZWF0ZUVycm9yVHlwZSgnRVJSX1VOS05PV05fRU5DT0RJTkcnLCBmdW5jdGlvbiAoYXJnKSB7XG4gIHJldHVybiAnVW5rbm93biBlbmNvZGluZzogJyArIGFyZ1xufSwgVHlwZUVycm9yKTtcbmNyZWF0ZUVycm9yVHlwZSgnRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVCcsICdzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCcpO1xuXG5tb2R1bGUuZXhwb3J0cy5jb2RlcyA9IGNvZGVzO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4012\n")},6753:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a duplex stream is just a stream that is both readable and writable.\n// Since JS doesn't have multiple prototypal inheritance, this class\n// prototypally inherits from Readable, and then parasitically from\n// Writable.\n\n\n\n/**/\nvar objectKeys = Object.keys || function (obj) {\n var keys = [];\n for (var key in obj) keys.push(key);\n return keys;\n};\n/**/\n\nmodule.exports = Duplex;\nvar Readable = __webpack_require__(9481);\nvar Writable = __webpack_require__(4229);\n__webpack_require__(4378)(Duplex, Readable);\n{\n // Allow the keys array to be GC'ed.\n var keys = objectKeys(Writable.prototype);\n for (var v = 0; v < keys.length; v++) {\n var method = keys[v];\n if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];\n }\n}\nfunction Duplex(options) {\n if (!(this instanceof Duplex)) return new Duplex(options);\n Readable.call(this, options);\n Writable.call(this, options);\n this.allowHalfOpen = true;\n if (options) {\n if (options.readable === false) this.readable = false;\n if (options.writable === false) this.writable = false;\n if (options.allowHalfOpen === false) {\n this.allowHalfOpen = false;\n this.once('end', onend);\n }\n }\n}\nObject.defineProperty(Duplex.prototype, 'writableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._writableState.highWaterMark;\n }\n});\nObject.defineProperty(Duplex.prototype, 'writableBuffer', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._writableState && this._writableState.getBuffer();\n }\n});\nObject.defineProperty(Duplex.prototype, 'writableLength', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._writableState.length;\n }\n});\n\n// the no-half-open enforcer\nfunction onend() {\n // If the writable side ended, then we're ok.\n if (this._writableState.ended) return;\n\n // no more data can be written.\n // But allow more writes to happen in this tick.\n process.nextTick(onEndNT, this);\n}\nfunction onEndNT(self) {\n self.end();\n}\nObject.defineProperty(Duplex.prototype, 'destroyed', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n if (this._readableState === undefined || this._writableState === undefined) {\n return false;\n }\n return this._readableState.destroyed && this._writableState.destroyed;\n },\n set: function set(value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (this._readableState === undefined || this._writableState === undefined) {\n return;\n }\n\n // backward compatibility, the user is explicitly\n // managing destroyed\n this._readableState.destroyed = value;\n this._writableState.destroyed = value;\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjc1My5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxtQkFBTyxDQUFDLElBQW9CO0FBQzNDLGVBQWUsbUJBQU8sQ0FBQyxJQUFvQjtBQUMzQyxtQkFBTyxDQUFDLElBQVU7QUFDbEI7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzP2IxOWEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgZHVwbGV4IHN0cmVhbSBpcyBqdXN0IGEgc3RyZWFtIHRoYXQgaXMgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUuXG4vLyBTaW5jZSBKUyBkb2Vzbid0IGhhdmUgbXVsdGlwbGUgcHJvdG90eXBhbCBpbmhlcml0YW5jZSwgdGhpcyBjbGFzc1xuLy8gcHJvdG90eXBhbGx5IGluaGVyaXRzIGZyb20gUmVhZGFibGUsIGFuZCB0aGVuIHBhcmFzaXRpY2FsbHkgZnJvbVxuLy8gV3JpdGFibGUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSBrZXlzLnB1c2goa2V5KTtcbiAgcmV0dXJuIGtleXM7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gRHVwbGV4O1xudmFyIFJlYWRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3JlYWRhYmxlJyk7XG52YXIgV3JpdGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fd3JpdGFibGUnKTtcbnJlcXVpcmUoJ2luaGVyaXRzJykoRHVwbGV4LCBSZWFkYWJsZSk7XG57XG4gIC8vIEFsbG93IHRoZSBrZXlzIGFycmF5IHRvIGJlIEdDJ2VkLlxuICB2YXIga2V5cyA9IG9iamVjdEtleXMoV3JpdGFibGUucHJvdG90eXBlKTtcbiAgZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzLmxlbmd0aDsgdisrKSB7XG4gICAgdmFyIG1ldGhvZCA9IGtleXNbdl07XG4gICAgaWYgKCFEdXBsZXgucHJvdG90eXBlW21ldGhvZF0pIER1cGxleC5wcm90b3R5cGVbbWV0aG9kXSA9IFdyaXRhYmxlLnByb3RvdHlwZVttZXRob2RdO1xuICB9XG59XG5mdW5jdGlvbiBEdXBsZXgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucyk7XG4gIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIFdyaXRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMucmVhZGFibGUgPT09IGZhbHNlKSB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgaWYgKG9wdGlvbnMud3JpdGFibGUgPT09IGZhbHNlKSB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgaWYgKG9wdGlvbnMuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuYWxsb3dIYWxmT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5vbmNlKCdlbmQnLCBvbmVuZCk7XG4gICAgfVxuICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4LnByb3RvdHlwZSwgJ3dyaXRhYmxlSGlnaFdhdGVyTWFyaycsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4LnByb3RvdHlwZSwgJ3dyaXRhYmxlQnVmZmVyJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmdldEJ1ZmZlcigpO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdXBsZXgucHJvdG90eXBlLCAnd3JpdGFibGVMZW5ndGgnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmxlbmd0aDtcbiAgfVxufSk7XG5cbi8vIHRoZSBuby1oYWxmLW9wZW4gZW5mb3JjZXJcbmZ1bmN0aW9uIG9uZW5kKCkge1xuICAvLyBJZiB0aGUgd3JpdGFibGUgc2lkZSBlbmRlZCwgdGhlbiB3ZSdyZSBvay5cbiAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpIHJldHVybjtcblxuICAvLyBubyBtb3JlIGRhdGEgY2FuIGJlIHdyaXR0ZW4uXG4gIC8vIEJ1dCBhbGxvdyBtb3JlIHdyaXRlcyB0byBoYXBwZW4gaW4gdGhpcyB0aWNrLlxuICBwcm9jZXNzLm5leHRUaWNrKG9uRW5kTlQsIHRoaXMpO1xufVxuZnVuY3Rpb24gb25FbmROVChzZWxmKSB7XG4gIHNlbGYuZW5kKCk7XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4LnByb3RvdHlwZSwgJ2Rlc3Ryb3llZCcsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAvLyBtYW5hZ2luZyBkZXN0cm95ZWRcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gIH1cbn0pOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6753\n")},2725:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval('// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// "Software"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a passthrough stream.\n// basically just the most minimal sort of Transform stream.\n// Every written chunk gets output as-is.\n\n\n\nmodule.exports = PassThrough;\nvar Transform = __webpack_require__(4605);\n__webpack_require__(4378)(PassThrough, Transform);\nfunction PassThrough(options) {\n if (!(this instanceof PassThrough)) return new PassThrough(options);\n Transform.call(this, options);\n}\nPassThrough.prototype._transform = function (chunk, encoding, cb) {\n cb(null, chunk);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcyNS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYjtBQUNBLGdCQUFnQixtQkFBTyxDQUFDLElBQXFCO0FBQzdDLG1CQUFPLENBQUMsSUFBVTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qcz83ODBmIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIHBhc3N0aHJvdWdoIHN0cmVhbS5cbi8vIGJhc2ljYWxseSBqdXN0IHRoZSBtb3N0IG1pbmltYWwgc29ydCBvZiBUcmFuc2Zvcm0gc3RyZWFtLlxuLy8gRXZlcnkgd3JpdHRlbiBjaHVuayBnZXRzIG91dHB1dCBhcy1pcy5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBhc3NUaHJvdWdoO1xudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vX3N0cmVhbV90cmFuc2Zvcm0nKTtcbnJlcXVpcmUoJ2luaGVyaXRzJykoUGFzc1Rocm91Z2gsIFRyYW5zZm9ybSk7XG5mdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpIHJldHVybiBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucyk7XG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuUGFzc1Rocm91Z2gucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihudWxsLCBjaHVuayk7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2725\n')},9481:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\nmodule.exports = Readable;\n\n/**/\nvar Duplex;\n/**/\n\nReadable.ReadableState = ReadableState;\n\n/**/\nvar EE = (__webpack_require__(2361).EventEmitter);\nvar EElistenerCount = function EElistenerCount(emitter, type) {\n return emitter.listeners(type).length;\n};\n/**/\n\n/**/\nvar Stream = __webpack_require__(2238);\n/**/\n\nvar Buffer = (__webpack_require__(4300).Buffer);\nvar OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};\nfunction _uint8ArrayToBuffer(chunk) {\n return Buffer.from(chunk);\n}\nfunction _isUint8Array(obj) {\n return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n\n/**/\nvar debugUtil = __webpack_require__(3837);\nvar debug;\nif (debugUtil && debugUtil.debuglog) {\n debug = debugUtil.debuglog('stream');\n} else {\n debug = function debug() {};\n}\n/**/\n\nvar BufferList = __webpack_require__(7327);\nvar destroyImpl = __webpack_require__(1195);\nvar _require = __webpack_require__(2457),\n getHighWaterMark = _require.getHighWaterMark;\nvar _require$codes = (__webpack_require__(4012)/* .codes */ .q),\n ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,\n ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF,\n ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,\n ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT;\n\n// Lazy loaded to improve the startup performance.\nvar StringDecoder;\nvar createReadableStreamAsyncIterator;\nvar from;\n__webpack_require__(4378)(Readable, Stream);\nvar errorOrDestroy = destroyImpl.errorOrDestroy;\nvar kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];\nfunction prependListener(emitter, event, fn) {\n // Sadly this is not cacheable as some libraries bundle their own\n // event emitter implementation with them.\n if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);\n\n // This is a hack to make sure that our error handler is attached before any\n // userland ones. NEVER DO THIS. This is here only because this code needs\n // to continue to work with older versions of Node.js that do not include\n // the prependListener() method. The goal is to eventually remove this hack.\n if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];\n}\nfunction ReadableState(options, stream, isDuplex) {\n Duplex = Duplex || __webpack_require__(6753);\n options = options || {};\n\n // Duplex streams are both readable and writable, but share\n // the same options object.\n // However, some cases require setting options to different\n // values for the readable and the writable sides of the duplex stream.\n // These options can be provided separately as readableXXX and writableXXX.\n if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex;\n\n // object stream flag. Used to make read(n) ignore n and to\n // make all the buffer merging and length checks go away\n this.objectMode = !!options.objectMode;\n if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;\n\n // the point at which it stops calling _read() to fill the buffer\n // Note: 0 is a valid value, means \"don't call _read preemptively ever\"\n this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex);\n\n // A linked list is used to store data chunks instead of an array because the\n // linked list can remove elements from the beginning faster than\n // array.shift()\n this.buffer = new BufferList();\n this.length = 0;\n this.pipes = null;\n this.pipesCount = 0;\n this.flowing = null;\n this.ended = false;\n this.endEmitted = false;\n this.reading = false;\n\n // a flag to be able to tell if the event 'readable'/'data' is emitted\n // immediately, or on a later tick. We set this to true at first, because\n // any actions that shouldn't happen until \"later\" should generally also\n // not happen before the first read call.\n this.sync = true;\n\n // whenever we return null, then we set a flag to say\n // that we're awaiting a 'readable' event emission.\n this.needReadable = false;\n this.emittedReadable = false;\n this.readableListening = false;\n this.resumeScheduled = false;\n this.paused = true;\n\n // Should close be emitted on destroy. Defaults to true.\n this.emitClose = options.emitClose !== false;\n\n // Should .destroy() be called after 'end' (and potentially 'finish')\n this.autoDestroy = !!options.autoDestroy;\n\n // has it been destroyed\n this.destroyed = false;\n\n // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n // the number of writers that are awaiting a drain event in .pipe()s\n this.awaitDrain = 0;\n\n // if true, a maybeReadMore has been scheduled\n this.readingMore = false;\n this.decoder = null;\n this.encoding = null;\n if (options.encoding) {\n if (!StringDecoder) StringDecoder = (__webpack_require__(2553)/* .StringDecoder */ .s);\n this.decoder = new StringDecoder(options.encoding);\n this.encoding = options.encoding;\n }\n}\nfunction Readable(options) {\n Duplex = Duplex || __webpack_require__(6753);\n if (!(this instanceof Readable)) return new Readable(options);\n\n // Checking for a Stream.Duplex instance is faster here instead of inside\n // the ReadableState constructor, at least with V8 6.5\n var isDuplex = this instanceof Duplex;\n this._readableState = new ReadableState(options, this, isDuplex);\n\n // legacy\n this.readable = true;\n if (options) {\n if (typeof options.read === 'function') this._read = options.read;\n if (typeof options.destroy === 'function') this._destroy = options.destroy;\n }\n Stream.call(this);\n}\nObject.defineProperty(Readable.prototype, 'destroyed', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n if (this._readableState === undefined) {\n return false;\n }\n return this._readableState.destroyed;\n },\n set: function set(value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (!this._readableState) {\n return;\n }\n\n // backward compatibility, the user is explicitly\n // managing destroyed\n this._readableState.destroyed = value;\n }\n});\nReadable.prototype.destroy = destroyImpl.destroy;\nReadable.prototype._undestroy = destroyImpl.undestroy;\nReadable.prototype._destroy = function (err, cb) {\n cb(err);\n};\n\n// Manually shove something into the read() buffer.\n// This returns true if the highWaterMark has not been hit yet,\n// similar to how Writable.write() returns true if you should\n// write() some more.\nReadable.prototype.push = function (chunk, encoding) {\n var state = this._readableState;\n var skipChunkCheck;\n if (!state.objectMode) {\n if (typeof chunk === 'string') {\n encoding = encoding || state.defaultEncoding;\n if (encoding !== state.encoding) {\n chunk = Buffer.from(chunk, encoding);\n encoding = '';\n }\n skipChunkCheck = true;\n }\n } else {\n skipChunkCheck = true;\n }\n return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);\n};\n\n// Unshift should *always* be something directly out of read()\nReadable.prototype.unshift = function (chunk) {\n return readableAddChunk(this, chunk, null, true, false);\n};\nfunction readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {\n debug('readableAddChunk', chunk);\n var state = stream._readableState;\n if (chunk === null) {\n state.reading = false;\n onEofChunk(stream, state);\n } else {\n var er;\n if (!skipChunkCheck) er = chunkInvalid(state, chunk);\n if (er) {\n errorOrDestroy(stream, er);\n } else if (state.objectMode || chunk && chunk.length > 0) {\n if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {\n chunk = _uint8ArrayToBuffer(chunk);\n }\n if (addToFront) {\n if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true);\n } else if (state.ended) {\n errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF());\n } else if (state.destroyed) {\n return false;\n } else {\n state.reading = false;\n if (state.decoder && !encoding) {\n chunk = state.decoder.write(chunk);\n if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);\n } else {\n addChunk(stream, state, chunk, false);\n }\n }\n } else if (!addToFront) {\n state.reading = false;\n maybeReadMore(stream, state);\n }\n }\n\n // We can push more data if we are below the highWaterMark.\n // Also, if we have no data yet, we can stand some more bytes.\n // This is to work around cases where hwm=0, such as the repl.\n return !state.ended && (state.length < state.highWaterMark || state.length === 0);\n}\nfunction addChunk(stream, state, chunk, addToFront) {\n if (state.flowing && state.length === 0 && !state.sync) {\n state.awaitDrain = 0;\n stream.emit('data', chunk);\n } else {\n // update the buffer info.\n state.length += state.objectMode ? 1 : chunk.length;\n if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);\n if (state.needReadable) emitReadable(stream);\n }\n maybeReadMore(stream, state);\n}\nfunction chunkInvalid(state, chunk) {\n var er;\n if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk);\n }\n return er;\n}\nReadable.prototype.isPaused = function () {\n return this._readableState.flowing === false;\n};\n\n// backwards compatibility.\nReadable.prototype.setEncoding = function (enc) {\n if (!StringDecoder) StringDecoder = (__webpack_require__(2553)/* .StringDecoder */ .s);\n var decoder = new StringDecoder(enc);\n this._readableState.decoder = decoder;\n // If setEncoding(null), decoder.encoding equals utf8\n this._readableState.encoding = this._readableState.decoder.encoding;\n\n // Iterate over current buffer to convert already stored Buffers:\n var p = this._readableState.buffer.head;\n var content = '';\n while (p !== null) {\n content += decoder.write(p.data);\n p = p.next;\n }\n this._readableState.buffer.clear();\n if (content !== '') this._readableState.buffer.push(content);\n this._readableState.length = content.length;\n return this;\n};\n\n// Don't raise the hwm > 1GB\nvar MAX_HWM = 0x40000000;\nfunction computeNewHighWaterMark(n) {\n if (n >= MAX_HWM) {\n // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE.\n n = MAX_HWM;\n } else {\n // Get the next highest power of 2 to prevent increasing hwm excessively in\n // tiny amounts\n n--;\n n |= n >>> 1;\n n |= n >>> 2;\n n |= n >>> 4;\n n |= n >>> 8;\n n |= n >>> 16;\n n++;\n }\n return n;\n}\n\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction howMuchToRead(n, state) {\n if (n <= 0 || state.length === 0 && state.ended) return 0;\n if (state.objectMode) return 1;\n if (n !== n) {\n // Only flow one buffer at a time\n if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;\n }\n // If we're asking for more than the current hwm, then raise the hwm.\n if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);\n if (n <= state.length) return n;\n // Don't have enough\n if (!state.ended) {\n state.needReadable = true;\n return 0;\n }\n return state.length;\n}\n\n// you can override either this method, or the async _read(n) below.\nReadable.prototype.read = function (n) {\n debug('read', n);\n n = parseInt(n, 10);\n var state = this._readableState;\n var nOrig = n;\n if (n !== 0) state.emittedReadable = false;\n\n // if we're doing read(0) to trigger a readable event, but we\n // already have a bunch of data in the buffer, then just trigger\n // the 'readable' event and move on.\n if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) {\n debug('read: emitReadable', state.length, state.ended);\n if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);\n return null;\n }\n n = howMuchToRead(n, state);\n\n // if we've ended, and we're now clear, then finish it up.\n if (n === 0 && state.ended) {\n if (state.length === 0) endReadable(this);\n return null;\n }\n\n // All the actual chunk generation logic needs to be\n // *below* the call to _read. The reason is that in certain\n // synthetic stream cases, such as passthrough streams, _read\n // may be a completely synchronous operation which may change\n // the state of the read buffer, providing enough data when\n // before there was *not* enough.\n //\n // So, the steps are:\n // 1. Figure out what the state of things will be after we do\n // a read from the buffer.\n //\n // 2. If that resulting state will trigger a _read, then call _read.\n // Note that this may be asynchronous, or synchronous. Yes, it is\n // deeply ugly to write APIs this way, but that still doesn't mean\n // that the Readable class should behave improperly, as streams are\n // designed to be sync/async agnostic.\n // Take note if the _read call is sync or async (ie, if the read call\n // has returned yet), so that we know whether or not it's safe to emit\n // 'readable' etc.\n //\n // 3. Actually pull the requested chunks out of the buffer and return.\n\n // if we need a readable event, then we need to do some reading.\n var doRead = state.needReadable;\n debug('need readable', doRead);\n\n // if we currently have less than the highWaterMark, then also read some\n if (state.length === 0 || state.length - n < state.highWaterMark) {\n doRead = true;\n debug('length less than watermark', doRead);\n }\n\n // however, if we've ended, then there's no point, and if we're already\n // reading, then it's unnecessary.\n if (state.ended || state.reading) {\n doRead = false;\n debug('reading or ended', doRead);\n } else if (doRead) {\n debug('do read');\n state.reading = true;\n state.sync = true;\n // if the length is currently zero, then we *need* a readable event.\n if (state.length === 0) state.needReadable = true;\n // call internal read method\n this._read(state.highWaterMark);\n state.sync = false;\n // If _read pushed data synchronously, then `reading` will be false,\n // and we need to re-evaluate how much data we can return to the user.\n if (!state.reading) n = howMuchToRead(nOrig, state);\n }\n var ret;\n if (n > 0) ret = fromList(n, state);else ret = null;\n if (ret === null) {\n state.needReadable = state.length <= state.highWaterMark;\n n = 0;\n } else {\n state.length -= n;\n state.awaitDrain = 0;\n }\n if (state.length === 0) {\n // If we have nothing in the buffer, then we want to know\n // as soon as we *do* get something into the buffer.\n if (!state.ended) state.needReadable = true;\n\n // If we tried to read() past the EOF, then emit end on the next tick.\n if (nOrig !== n && state.ended) endReadable(this);\n }\n if (ret !== null) this.emit('data', ret);\n return ret;\n};\nfunction onEofChunk(stream, state) {\n debug('onEofChunk');\n if (state.ended) return;\n if (state.decoder) {\n var chunk = state.decoder.end();\n if (chunk && chunk.length) {\n state.buffer.push(chunk);\n state.length += state.objectMode ? 1 : chunk.length;\n }\n }\n state.ended = true;\n if (state.sync) {\n // if we are sync, wait until next tick to emit the data.\n // Otherwise we risk emitting data in the flow()\n // the readable code triggers during a read() call\n emitReadable(stream);\n } else {\n // emit 'readable' now to make sure it gets picked up.\n state.needReadable = false;\n if (!state.emittedReadable) {\n state.emittedReadable = true;\n emitReadable_(stream);\n }\n }\n}\n\n// Don't emit readable right away in sync mode, because this can trigger\n// another read() call => stack overflow. This way, it might trigger\n// a nextTick recursion warning, but that's not so bad.\nfunction emitReadable(stream) {\n var state = stream._readableState;\n debug('emitReadable', state.needReadable, state.emittedReadable);\n state.needReadable = false;\n if (!state.emittedReadable) {\n debug('emitReadable', state.flowing);\n state.emittedReadable = true;\n process.nextTick(emitReadable_, stream);\n }\n}\nfunction emitReadable_(stream) {\n var state = stream._readableState;\n debug('emitReadable_', state.destroyed, state.length, state.ended);\n if (!state.destroyed && (state.length || state.ended)) {\n stream.emit('readable');\n state.emittedReadable = false;\n }\n\n // The stream needs another readable event if\n // 1. It is not flowing, as the flow mechanism will take\n // care of it.\n // 2. It is not ended.\n // 3. It is below the highWaterMark, so we can schedule\n // another readable later.\n state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark;\n flow(stream);\n}\n\n// at this point, the user has presumably seen the 'readable' event,\n// and called read() to consume some data. that may have triggered\n// in turn another _read(n) call, in which case reading = true if\n// it's in progress.\n// However, if we're not ended, or reading, and the length < hwm,\n// then go ahead and try to read some more preemptively.\nfunction maybeReadMore(stream, state) {\n if (!state.readingMore) {\n state.readingMore = true;\n process.nextTick(maybeReadMore_, stream, state);\n }\n}\nfunction maybeReadMore_(stream, state) {\n // Attempt to read more data if we should.\n //\n // The conditions for reading more data are (one of):\n // - Not enough data buffered (state.length < state.highWaterMark). The loop\n // is responsible for filling the buffer with enough data if such data\n // is available. If highWaterMark is 0 and we are not in the flowing mode\n // we should _not_ attempt to buffer any extra data. We'll get more data\n // when the stream consumer calls read() instead.\n // - No data in the buffer, and the stream is in flowing mode. In this mode\n // the loop below is responsible for ensuring read() is called. Failing to\n // call read here would abort the flow and there's no other mechanism for\n // continuing the flow if the stream consumer has just subscribed to the\n // 'data' event.\n //\n // In addition to the above conditions to keep reading data, the following\n // conditions prevent the data from being read:\n // - The stream has ended (state.ended).\n // - There is already a pending 'read' operation (state.reading). This is a\n // case where the the stream has called the implementation defined _read()\n // method, but they are processing the call asynchronously and have _not_\n // called push() with new data. In this case we skip performing more\n // read()s. The execution ends in this method again after the _read() ends\n // up calling push() with more data.\n while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) {\n var len = state.length;\n debug('maybeReadMore read 0');\n stream.read(0);\n if (len === state.length)\n // didn't get any data, stop spinning.\n break;\n }\n state.readingMore = false;\n}\n\n// abstract method. to be overridden in specific implementation classes.\n// call cb(er, data) where data is <= n in length.\n// for virtual (non-string, non-buffer) streams, \"length\" is somewhat\n// arbitrary, and perhaps not very meaningful.\nReadable.prototype._read = function (n) {\n errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()'));\n};\nReadable.prototype.pipe = function (dest, pipeOpts) {\n var src = this;\n var state = this._readableState;\n switch (state.pipesCount) {\n case 0:\n state.pipes = dest;\n break;\n case 1:\n state.pipes = [state.pipes, dest];\n break;\n default:\n state.pipes.push(dest);\n break;\n }\n state.pipesCount += 1;\n debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);\n var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;\n var endFn = doEnd ? onend : unpipe;\n if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn);\n dest.on('unpipe', onunpipe);\n function onunpipe(readable, unpipeInfo) {\n debug('onunpipe');\n if (readable === src) {\n if (unpipeInfo && unpipeInfo.hasUnpiped === false) {\n unpipeInfo.hasUnpiped = true;\n cleanup();\n }\n }\n }\n function onend() {\n debug('onend');\n dest.end();\n }\n\n // when the dest drains, it reduces the awaitDrain counter\n // on the source. This would be more elegant with a .once()\n // handler in flow(), but adding and removing repeatedly is\n // too slow.\n var ondrain = pipeOnDrain(src);\n dest.on('drain', ondrain);\n var cleanedUp = false;\n function cleanup() {\n debug('cleanup');\n // cleanup event handlers once the pipe is broken\n dest.removeListener('close', onclose);\n dest.removeListener('finish', onfinish);\n dest.removeListener('drain', ondrain);\n dest.removeListener('error', onerror);\n dest.removeListener('unpipe', onunpipe);\n src.removeListener('end', onend);\n src.removeListener('end', unpipe);\n src.removeListener('data', ondata);\n cleanedUp = true;\n\n // if the reader is waiting for a drain event from this\n // specific writer, then it would cause it to never start\n // flowing again.\n // So, if this is awaiting a drain, then we just call it now.\n // If we don't know, then assume that we are waiting for one.\n if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();\n }\n src.on('data', ondata);\n function ondata(chunk) {\n debug('ondata');\n var ret = dest.write(chunk);\n debug('dest.write', ret);\n if (ret === false) {\n // If the user unpiped during `dest.write()`, it is possible\n // to get stuck in a permanently paused state if that write\n // also returned false.\n // => Check whether `dest` is still a piping destination.\n if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {\n debug('false write response, pause', state.awaitDrain);\n state.awaitDrain++;\n }\n src.pause();\n }\n }\n\n // if the dest has an error, then stop piping into it.\n // however, don't suppress the throwing behavior for this.\n function onerror(er) {\n debug('onerror', er);\n unpipe();\n dest.removeListener('error', onerror);\n if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er);\n }\n\n // Make sure our error handler is attached before userland ones.\n prependListener(dest, 'error', onerror);\n\n // Both close and finish should trigger unpipe, but only once.\n function onclose() {\n dest.removeListener('finish', onfinish);\n unpipe();\n }\n dest.once('close', onclose);\n function onfinish() {\n debug('onfinish');\n dest.removeListener('close', onclose);\n unpipe();\n }\n dest.once('finish', onfinish);\n function unpipe() {\n debug('unpipe');\n src.unpipe(dest);\n }\n\n // tell the dest that it's being piped to\n dest.emit('pipe', src);\n\n // start the flow if it hasn't been started already.\n if (!state.flowing) {\n debug('pipe resume');\n src.resume();\n }\n return dest;\n};\nfunction pipeOnDrain(src) {\n return function pipeOnDrainFunctionResult() {\n var state = src._readableState;\n debug('pipeOnDrain', state.awaitDrain);\n if (state.awaitDrain) state.awaitDrain--;\n if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {\n state.flowing = true;\n flow(src);\n }\n };\n}\nReadable.prototype.unpipe = function (dest) {\n var state = this._readableState;\n var unpipeInfo = {\n hasUnpiped: false\n };\n\n // if we're not piping anywhere, then do nothing.\n if (state.pipesCount === 0) return this;\n\n // just one destination. most common case.\n if (state.pipesCount === 1) {\n // passed in one, but it's not the right one.\n if (dest && dest !== state.pipes) return this;\n if (!dest) dest = state.pipes;\n\n // got a match.\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n if (dest) dest.emit('unpipe', this, unpipeInfo);\n return this;\n }\n\n // slow case. multiple pipe destinations.\n\n if (!dest) {\n // remove all.\n var dests = state.pipes;\n var len = state.pipesCount;\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n for (var i = 0; i < len; i++) dests[i].emit('unpipe', this, {\n hasUnpiped: false\n });\n return this;\n }\n\n // try to find the right one.\n var index = indexOf(state.pipes, dest);\n if (index === -1) return this;\n state.pipes.splice(index, 1);\n state.pipesCount -= 1;\n if (state.pipesCount === 1) state.pipes = state.pipes[0];\n dest.emit('unpipe', this, unpipeInfo);\n return this;\n};\n\n// set up data events if they are asked for\n// Ensure readable listeners eventually get something\nReadable.prototype.on = function (ev, fn) {\n var res = Stream.prototype.on.call(this, ev, fn);\n var state = this._readableState;\n if (ev === 'data') {\n // update readableListening so that resume() may be a no-op\n // a few lines down. This is needed to support once('readable').\n state.readableListening = this.listenerCount('readable') > 0;\n\n // Try start flowing on next tick if stream isn't explicitly paused\n if (state.flowing !== false) this.resume();\n } else if (ev === 'readable') {\n if (!state.endEmitted && !state.readableListening) {\n state.readableListening = state.needReadable = true;\n state.flowing = false;\n state.emittedReadable = false;\n debug('on readable', state.length, state.reading);\n if (state.length) {\n emitReadable(this);\n } else if (!state.reading) {\n process.nextTick(nReadingNextTick, this);\n }\n }\n }\n return res;\n};\nReadable.prototype.addListener = Readable.prototype.on;\nReadable.prototype.removeListener = function (ev, fn) {\n var res = Stream.prototype.removeListener.call(this, ev, fn);\n if (ev === 'readable') {\n // We need to check if there is someone still listening to\n // readable and reset the state. However this needs to happen\n // after readable has been emitted but before I/O (nextTick) to\n // support once('readable', fn) cycles. This means that calling\n // resume within the same tick will have no\n // effect.\n process.nextTick(updateReadableListening, this);\n }\n return res;\n};\nReadable.prototype.removeAllListeners = function (ev) {\n var res = Stream.prototype.removeAllListeners.apply(this, arguments);\n if (ev === 'readable' || ev === undefined) {\n // We need to check if there is someone still listening to\n // readable and reset the state. However this needs to happen\n // after readable has been emitted but before I/O (nextTick) to\n // support once('readable', fn) cycles. This means that calling\n // resume within the same tick will have no\n // effect.\n process.nextTick(updateReadableListening, this);\n }\n return res;\n};\nfunction updateReadableListening(self) {\n var state = self._readableState;\n state.readableListening = self.listenerCount('readable') > 0;\n if (state.resumeScheduled && !state.paused) {\n // flowing needs to be set to true now, otherwise\n // the upcoming resume will not flow.\n state.flowing = true;\n\n // crude way to check if we should resume\n } else if (self.listenerCount('data') > 0) {\n self.resume();\n }\n}\nfunction nReadingNextTick(self) {\n debug('readable nexttick read 0');\n self.read(0);\n}\n\n// pause() and resume() are remnants of the legacy readable stream API\n// If the user uses them, then switch into old mode.\nReadable.prototype.resume = function () {\n var state = this._readableState;\n if (!state.flowing) {\n debug('resume');\n // we flow only if there is no one listening\n // for readable, but we still have to call\n // resume()\n state.flowing = !state.readableListening;\n resume(this, state);\n }\n state.paused = false;\n return this;\n};\nfunction resume(stream, state) {\n if (!state.resumeScheduled) {\n state.resumeScheduled = true;\n process.nextTick(resume_, stream, state);\n }\n}\nfunction resume_(stream, state) {\n debug('resume', state.reading);\n if (!state.reading) {\n stream.read(0);\n }\n state.resumeScheduled = false;\n stream.emit('resume');\n flow(stream);\n if (state.flowing && !state.reading) stream.read(0);\n}\nReadable.prototype.pause = function () {\n debug('call pause flowing=%j', this._readableState.flowing);\n if (this._readableState.flowing !== false) {\n debug('pause');\n this._readableState.flowing = false;\n this.emit('pause');\n }\n this._readableState.paused = true;\n return this;\n};\nfunction flow(stream) {\n var state = stream._readableState;\n debug('flow', state.flowing);\n while (state.flowing && stream.read() !== null);\n}\n\n// wrap an old-style stream as the async data source.\n// This is *not* part of the readable stream interface.\n// It is an ugly unfortunate mess of history.\nReadable.prototype.wrap = function (stream) {\n var _this = this;\n var state = this._readableState;\n var paused = false;\n stream.on('end', function () {\n debug('wrapped end');\n if (state.decoder && !state.ended) {\n var chunk = state.decoder.end();\n if (chunk && chunk.length) _this.push(chunk);\n }\n _this.push(null);\n });\n stream.on('data', function (chunk) {\n debug('wrapped data');\n if (state.decoder) chunk = state.decoder.write(chunk);\n\n // don't skip over falsy values in objectMode\n if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;\n var ret = _this.push(chunk);\n if (!ret) {\n paused = true;\n stream.pause();\n }\n });\n\n // proxy all the other methods.\n // important when wrapping filters and duplexes.\n for (var i in stream) {\n if (this[i] === undefined && typeof stream[i] === 'function') {\n this[i] = function methodWrap(method) {\n return function methodWrapReturnFunction() {\n return stream[method].apply(stream, arguments);\n };\n }(i);\n }\n }\n\n // proxy certain important events.\n for (var n = 0; n < kProxyEvents.length; n++) {\n stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));\n }\n\n // when we try to consume some more bytes, simply unpause the\n // underlying stream.\n this._read = function (n) {\n debug('wrapped _read', n);\n if (paused) {\n paused = false;\n stream.resume();\n }\n };\n return this;\n};\nif (typeof Symbol === 'function') {\n Readable.prototype[Symbol.asyncIterator] = function () {\n if (createReadableStreamAsyncIterator === undefined) {\n createReadableStreamAsyncIterator = __webpack_require__(5850);\n }\n return createReadableStreamAsyncIterator(this);\n };\n}\nObject.defineProperty(Readable.prototype, 'readableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._readableState.highWaterMark;\n }\n});\nObject.defineProperty(Readable.prototype, 'readableBuffer', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._readableState && this._readableState.buffer;\n }\n});\nObject.defineProperty(Readable.prototype, 'readableFlowing', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._readableState.flowing;\n },\n set: function set(state) {\n if (this._readableState) {\n this._readableState.flowing = state;\n }\n }\n});\n\n// exposed for testing purposes only.\nReadable._fromList = fromList;\nObject.defineProperty(Readable.prototype, 'readableLength', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._readableState.length;\n }\n});\n\n// Pluck off n bytes from an array of buffers.\n// Length is the combined lengths of all the buffers in the list.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromList(n, state) {\n // nothing buffered\n if (state.length === 0) return null;\n var ret;\n if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {\n // read it all, truncate the list\n if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length);\n state.buffer.clear();\n } else {\n // read part of list\n ret = state.buffer.consume(n, state.decoder);\n }\n return ret;\n}\nfunction endReadable(stream) {\n var state = stream._readableState;\n debug('endReadable', state.endEmitted);\n if (!state.endEmitted) {\n state.ended = true;\n process.nextTick(endReadableNT, state, stream);\n }\n}\nfunction endReadableNT(state, stream) {\n debug('endReadableNT', state.endEmitted, state.length);\n\n // Check that we didn't get one last unshift.\n if (!state.endEmitted && state.length === 0) {\n state.endEmitted = true;\n stream.readable = false;\n stream.emit('end');\n if (state.autoDestroy) {\n // In case of duplex streams we need a way to detect\n // if the writable side is ready for autoDestroy as well\n var wState = stream._writableState;\n if (!wState || wState.autoDestroy && wState.finished) {\n stream.destroy();\n }\n }\n }\n}\nif (typeof Symbol === 'function') {\n Readable.from = function (iterable, opts) {\n if (from === undefined) {\n from = __webpack_require__(6307);\n }\n return from(Readable, iterable, opts);\n };\n}\nfunction indexOf(xs, x) {\n for (var i = 0, l = xs.length; i < l; i++) {\n if (xs[i] === x) return i;\n }\n return -1;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTQ4MS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFNBQVMsd0NBQThCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYSxtQkFBTyxDQUFDLElBQTJCO0FBQ2hEOztBQUVBLGFBQWEsa0NBQXdCO0FBQ3JDLDhJQUE4STtBQUM5STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0IsbUJBQU8sQ0FBQyxJQUFNO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsSUFBZ0M7QUFDekQsa0JBQWtCLG1CQUFPLENBQUMsSUFBNEI7QUFDdEQsZUFBZSxtQkFBTyxDQUFDLElBQTBCO0FBQ2pEO0FBQ0EscUJBQXFCLDBDQUEwQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFPLENBQUMsSUFBVTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUUsbUZBQW1GO0FBQzVKO0FBQ0E7QUFDQSxxQkFBcUIsbUJBQU8sQ0FBQyxJQUFrQjtBQUMvQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0Msa0RBQXdDO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsbUJBQU8sQ0FBQyxJQUFrQjtBQUMvQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSwrRkFBK0Y7QUFDL0YsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLDRGQUE0RjtBQUM1RixVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNDQUFzQyxrREFBd0M7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0RUFBNEU7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZEO0FBQzdEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFNBQVM7QUFDN0I7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0RUFBNEU7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLHlCQUF5QjtBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsbUJBQU8sQ0FBQyxJQUFtQztBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBLG1EQUFtRCwrREFBK0Q7QUFDbEg7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsbUJBQU8sQ0FBQyxJQUF5QjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLE9BQU87QUFDeEM7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcmVhZGFibGUuanM/YWQ3MSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWRhYmxlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIER1cGxleDtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbnZhciBFRWxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiBFRWxpc3RlbmVyQ291bnQoZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lcnModHlwZSkubGVuZ3RoO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9zdHJlYW0nKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xudmFyIE91clVpbnQ4QXJyYXkgPSAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fSkuVWludDhBcnJheSB8fCBmdW5jdGlvbiAoKSB7fTtcbmZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rKTtcbn1cbmZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5O1xufVxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGRlYnVnVXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBkZWJ1ZztcbmlmIChkZWJ1Z1V0aWwgJiYgZGVidWdVdGlsLmRlYnVnbG9nKSB7XG4gIGRlYnVnID0gZGVidWdVdGlsLmRlYnVnbG9nKCdzdHJlYW0nKTtcbn0gZWxzZSB7XG4gIGRlYnVnID0gZnVuY3Rpb24gZGVidWcoKSB7fTtcbn1cbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgQnVmZmVyTGlzdCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9idWZmZXJfbGlzdCcpO1xudmFyIGRlc3Ryb3lJbXBsID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3knKTtcbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9zdGF0ZScpLFxuICBnZXRIaWdoV2F0ZXJNYXJrID0gX3JlcXVpcmUuZ2V0SGlnaFdhdGVyTWFyaztcbnZhciBfcmVxdWlyZSRjb2RlcyA9IHJlcXVpcmUoJy4uL2Vycm9ycycpLmNvZGVzLFxuICBFUlJfSU5WQUxJRF9BUkdfVFlQRSA9IF9yZXF1aXJlJGNvZGVzLkVSUl9JTlZBTElEX0FSR19UWVBFLFxuICBFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GID0gX3JlcXVpcmUkY29kZXMuRVJSX1NUUkVBTV9QVVNIX0FGVEVSX0VPRixcbiAgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCxcbiAgRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVCA9IF9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQ7XG5cbi8vIExhenkgbG9hZGVkIHRvIGltcHJvdmUgdGhlIHN0YXJ0dXAgcGVyZm9ybWFuY2UuXG52YXIgU3RyaW5nRGVjb2RlcjtcbnZhciBjcmVhdGVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3I7XG52YXIgZnJvbTtcbnJlcXVpcmUoJ2luaGVyaXRzJykoUmVhZGFibGUsIFN0cmVhbSk7XG52YXIgZXJyb3JPckRlc3Ryb3kgPSBkZXN0cm95SW1wbC5lcnJvck9yRGVzdHJveTtcbnZhciBrUHJveHlFdmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG5mdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuKSB7XG4gIC8vIFNhZGx5IHRoaXMgaXMgbm90IGNhY2hlYWJsZSBhcyBzb21lIGxpYnJhcmllcyBidW5kbGUgdGhlaXIgb3duXG4gIC8vIGV2ZW50IGVtaXR0ZXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGVtLlxuICBpZiAodHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIoZXZlbnQsIGZuKTtcblxuICAvLyBUaGlzIGlzIGEgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgYW55XG4gIC8vIHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLiBUaGlzIGlzIGhlcmUgb25seSBiZWNhdXNlIHRoaXMgY29kZSBuZWVkc1xuICAvLyB0byBjb250aW51ZSB0byB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgTm9kZS5qcyB0aGF0IGRvIG5vdCBpbmNsdWRlXG4gIC8vIHRoZSBwcmVwZW5kTGlzdGVuZXIoKSBtZXRob2QuIFRoZSBnb2FsIGlzIHRvIGV2ZW50dWFsbHkgcmVtb3ZlIHRoaXMgaGFjay5cbiAgaWYgKCFlbWl0dGVyLl9ldmVudHMgfHwgIWVtaXR0ZXIuX2V2ZW50c1tldmVudF0pIGVtaXR0ZXIub24oZXZlbnQsIGZuKTtlbHNlIGlmIChBcnJheS5pc0FycmF5KGVtaXR0ZXIuX2V2ZW50c1tldmVudF0pKSBlbWl0dGVyLl9ldmVudHNbZXZlbnRdLnVuc2hpZnQoZm4pO2Vsc2UgZW1pdHRlci5fZXZlbnRzW2V2ZW50XSA9IFtmbiwgZW1pdHRlci5fZXZlbnRzW2V2ZW50XV07XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSwgaXNEdXBsZXgpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gRHVwbGV4IHN0cmVhbXMgYXJlIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLCBidXQgc2hhcmVcbiAgLy8gdGhlIHNhbWUgb3B0aW9ucyBvYmplY3QuXG4gIC8vIEhvd2V2ZXIsIHNvbWUgY2FzZXMgcmVxdWlyZSBzZXR0aW5nIG9wdGlvbnMgdG8gZGlmZmVyZW50XG4gIC8vIHZhbHVlcyBmb3IgdGhlIHJlYWRhYmxlIGFuZCB0aGUgd3JpdGFibGUgc2lkZXMgb2YgdGhlIGR1cGxleCBzdHJlYW0uXG4gIC8vIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkgYXMgcmVhZGFibGVYWFggYW5kIHdyaXRhYmxlWFhYLlxuICBpZiAodHlwZW9mIGlzRHVwbGV4ICE9PSAnYm9vbGVhbicpIGlzRHVwbGV4ID0gc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZy4gVXNlZCB0byBtYWtlIHJlYWQobikgaWdub3JlIG4gYW5kIHRvXG4gIC8vIG1ha2UgYWxsIHRoZSBidWZmZXIgbWVyZ2luZyBhbmQgbGVuZ3RoIGNoZWNrcyBnbyBhd2F5XG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuICBpZiAoaXNEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCBpdCBzdG9wcyBjYWxsaW5nIF9yZWFkKCkgdG8gZmlsbCB0aGUgYnVmZmVyXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgXCJkb24ndCBjYWxsIF9yZWFkIHByZWVtcHRpdmVseSBldmVyXCJcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gZ2V0SGlnaFdhdGVyTWFyayh0aGlzLCBvcHRpb25zLCAncmVhZGFibGVIaWdoV2F0ZXJNYXJrJywgaXNEdXBsZXgpO1xuXG4gIC8vIEEgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBzdG9yZSBkYXRhIGNodW5rcyBpbnN0ZWFkIG9mIGFuIGFycmF5IGJlY2F1c2UgdGhlXG4gIC8vIGxpbmtlZCBsaXN0IGNhbiByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgYmVnaW5uaW5nIGZhc3RlciB0aGFuXG4gIC8vIGFycmF5LnNoaWZ0KClcbiAgdGhpcy5idWZmZXIgPSBuZXcgQnVmZmVyTGlzdCgpO1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucGlwZXMgPSBudWxsO1xuICB0aGlzLnBpcGVzQ291bnQgPSAwO1xuICB0aGlzLmZsb3dpbmcgPSBudWxsO1xuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYWRpbmcgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBldmVudCAncmVhZGFibGUnLydkYXRhJyBpcyBlbWl0dGVkXG4gIC8vIGltbWVkaWF0ZWx5LCBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlXG4gIC8vIGFueSBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCByZWFkIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gd2hlbmV2ZXIgd2UgcmV0dXJuIG51bGwsIHRoZW4gd2Ugc2V0IGEgZmxhZyB0byBzYXlcbiAgLy8gdGhhdCB3ZSdyZSBhd2FpdGluZyBhICdyZWFkYWJsZScgZXZlbnQgZW1pc3Npb24uXG4gIHRoaXMubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZTtcbiAgdGhpcy5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgdGhpcy5wYXVzZWQgPSB0cnVlO1xuXG4gIC8vIFNob3VsZCBjbG9zZSBiZSBlbWl0dGVkIG9uIGRlc3Ryb3kuIERlZmF1bHRzIHRvIHRydWUuXG4gIHRoaXMuZW1pdENsb3NlID0gb3B0aW9ucy5lbWl0Q2xvc2UgIT09IGZhbHNlO1xuXG4gIC8vIFNob3VsZCAuZGVzdHJveSgpIGJlIGNhbGxlZCBhZnRlciAnZW5kJyAoYW5kIHBvdGVudGlhbGx5ICdmaW5pc2gnKVxuICB0aGlzLmF1dG9EZXN0cm95ID0gISFvcHRpb25zLmF1dG9EZXN0cm95O1xuXG4gIC8vIGhhcyBpdCBiZWVuIGRlc3Ryb3llZFxuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG4gIHRoaXMuZGVjb2RlciA9IG51bGw7XG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsO1xuICBpZiAob3B0aW9ucy5lbmNvZGluZykge1xuICAgIGlmICghU3RyaW5nRGVjb2RlcikgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyLycpLlN0cmluZ0RlY29kZXI7XG4gICAgdGhpcy5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIob3B0aW9ucy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2Rpbmc7XG4gIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSkgcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKTtcblxuICAvLyBDaGVja2luZyBmb3IgYSBTdHJlYW0uRHVwbGV4IGluc3RhbmNlIGlzIGZhc3RlciBoZXJlIGluc3RlYWQgb2YgaW5zaWRlXG4gIC8vIHRoZSBSZWFkYWJsZVN0YXRlIGNvbnN0cnVjdG9yLCBhdCBsZWFzdCB3aXRoIFY4IDYuNVxuICB2YXIgaXNEdXBsZXggPSB0aGlzIGluc3RhbmNlb2YgRHVwbGV4O1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbmV3IFJlYWRhYmxlU3RhdGUob3B0aW9ucywgdGhpcywgaXNEdXBsZXgpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fcmVhZCA9IG9wdGlvbnMucmVhZDtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZGVzdHJveSA9IG9wdGlvbnMuZGVzdHJveTtcbiAgfVxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAoIXRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5SZWFkYWJsZS5wcm90b3R5cGUuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLmRlc3Ryb3k7XG5SZWFkYWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLnVuZGVzdHJveTtcblJlYWRhYmxlLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIGNiKGVycik7XG59O1xuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHNraXBDaHVua0NoZWNrO1xuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgICBpZiAoZW5jb2RpbmcgIT09IHN0YXRlLmVuY29kaW5nKSB7XG4gICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICAgIH1cbiAgICAgIHNraXBDaHVua0NoZWNrID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2tpcENodW5rQ2hlY2sgPSB0cnVlO1xuICB9XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBlbmNvZGluZywgZmFsc2UsIHNraXBDaHVua0NoZWNrKTtcbn07XG5cbi8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpXG5SZWFkYWJsZS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uIChjaHVuaykge1xuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBjaHVuaywgbnVsbCwgdHJ1ZSwgZmFsc2UpO1xufTtcbmZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsoc3RyZWFtLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQsIHNraXBDaHVua0NoZWNrKSB7XG4gIGRlYnVnKCdyZWFkYWJsZUFkZENodW5rJywgY2h1bmspO1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBlcjtcbiAgICBpZiAoIXNraXBDaHVua0NoZWNrKSBlciA9IGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspO1xuICAgIGlmIChlcikge1xuICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcik7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rICYmIGNodW5rLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmICFzdGF0ZS5vYmplY3RNb2RlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihjaHVuaykgIT09IEJ1ZmZlci5wcm90b3R5cGUpIHtcbiAgICAgICAgY2h1bmsgPSBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKTtcbiAgICAgIH1cbiAgICAgIGlmIChhZGRUb0Zyb250KSB7XG4gICAgICAgIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBlcnJvck9yRGVzdHJveShzdHJlYW0sIG5ldyBFUlJfU1RSRUFNX1VOU0hJRlRfQUZURVJfRU5EX0VWRU5UKCkpO2Vsc2UgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lbmRlZCkge1xuICAgICAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIG5ldyBFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GKCkpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuICAgICAgICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rLmxlbmd0aCAhPT0gMCkgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtlbHNlIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICAgIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gV2UgY2FuIHB1c2ggbW9yZSBkYXRhIGlmIHdlIGFyZSBiZWxvdyB0aGUgaGlnaFdhdGVyTWFyay5cbiAgLy8gQWxzbywgaWYgd2UgaGF2ZSBubyBkYXRhIHlldCwgd2UgY2FuIHN0YW5kIHNvbWUgbW9yZSBieXRlcy5cbiAgLy8gVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCwgc3VjaCBhcyB0aGUgcmVwbC5cbiAgcmV0dXJuICFzdGF0ZS5lbmRlZCAmJiAoc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5sZW5ndGggPT09IDApO1xufVxuZnVuY3Rpb24gYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGFkZFRvRnJvbnQpIHtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgc3RhdGUuYXdhaXREcmFpbiA9IDA7XG4gICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gIH0gZWxzZSB7XG4gICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICBpZiAoc3RhdGUubmVlZFJlYWRhYmxlKSBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbiAgfVxuICBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpO1xufVxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXI7XG4gIGlmICghX2lzVWludDhBcnJheShjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2NodW5rJywgWydzdHJpbmcnLCAnQnVmZmVyJywgJ1VpbnQ4QXJyYXknXSwgY2h1bmspO1xuICB9XG4gIHJldHVybiBlcjtcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59O1xuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdmFyIGRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihlbmMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBkZWNvZGVyO1xuICAvLyBJZiBzZXRFbmNvZGluZyhudWxsKSwgZGVjb2Rlci5lbmNvZGluZyBlcXVhbHMgdXRmOFxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyLmVuY29kaW5nO1xuXG4gIC8vIEl0ZXJhdGUgb3ZlciBjdXJyZW50IGJ1ZmZlciB0byBjb252ZXJ0IGFscmVhZHkgc3RvcmVkIEJ1ZmZlcnM6XG4gIHZhciBwID0gdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIuaGVhZDtcbiAgdmFyIGNvbnRlbnQgPSAnJztcbiAgd2hpbGUgKHAgIT09IG51bGwpIHtcbiAgICBjb250ZW50ICs9IGRlY29kZXIud3JpdGUocC5kYXRhKTtcbiAgICBwID0gcC5uZXh0O1xuICB9XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyLmNsZWFyKCk7XG4gIGlmIChjb250ZW50ICE9PSAnJykgdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIucHVzaChjb250ZW50KTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5sZW5ndGggPSBjb250ZW50Lmxlbmd0aDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gMUdCXG52YXIgTUFYX0hXTSA9IDB4NDAwMDAwMDA7XG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICAvLyBUT0RPKHJvbmFnKTogVGhyb3cgRVJSX1ZBTFVFX09VVF9PRl9SQU5HRS5cbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyIHRvIHByZXZlbnQgaW5jcmVhc2luZyBod20gZXhjZXNzaXZlbHkgaW5cbiAgICAvLyB0aW55IGFtb3VudHNcbiAgICBuLS07XG4gICAgbiB8PSBuID4+PiAxO1xuICAgIG4gfD0gbiA+Pj4gMjtcbiAgICBuIHw9IG4gPj4+IDQ7XG4gICAgbiB8PSBuID4+PiA4O1xuICAgIG4gfD0gbiA+Pj4gMTY7XG4gICAgbisrO1xuICB9XG4gIHJldHVybiBuO1xufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKG4gPD0gMCB8fCBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIHJldHVybiAwO1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0dXJuIDE7XG4gIGlmIChuICE9PSBuKSB7XG4gICAgLy8gT25seSBmbG93IG9uZSBidWZmZXIgYXQgYSB0aW1lXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg7ZWxzZSByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICB9XG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSBjdXJyZW50IGh3bSwgdGhlbiByYWlzZSB0aGUgaHdtLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcbiAgaWYgKG4gPD0gc3RhdGUubGVuZ3RoKSByZXR1cm4gbjtcbiAgLy8gRG9uJ3QgaGF2ZSBlbm91Z2hcbiAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbn1cblxuLy8geW91IGNhbiBvdmVycmlkZSBlaXRoZXIgdGhpcyBtZXRob2QsIG9yIHRoZSBhc3luYyBfcmVhZChuKSBiZWxvdy5cblJlYWRhYmxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgZGVidWcoJ3JlYWQnLCBuKTtcbiAgbiA9IHBhcnNlSW50KG4sIDEwKTtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIG5PcmlnID0gbjtcbiAgaWYgKG4gIT09IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmICgoc3RhdGUuaGlnaFdhdGVyTWFyayAhPT0gMCA/IHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIDogc3RhdGUubGVuZ3RoID4gMCkgfHwgc3RhdGUuZW5kZWQpKSB7XG4gICAgZGVidWcoJ3JlYWQ6IGVtaXRSZWFkYWJsZScsIHN0YXRlLmxlbmd0aCwgc3RhdGUuZW5kZWQpO1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO2Vsc2UgZW1pdFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBbGwgdGhlIGFjdHVhbCBjaHVuayBnZW5lcmF0aW9uIGxvZ2ljIG5lZWRzIHRvIGJlXG4gIC8vICpiZWxvdyogdGhlIGNhbGwgdG8gX3JlYWQuICBUaGUgcmVhc29uIGlzIHRoYXQgaW4gY2VydGFpblxuICAvLyBzeW50aGV0aWMgc3RyZWFtIGNhc2VzLCBzdWNoIGFzIHBhc3N0aHJvdWdoIHN0cmVhbXMsIF9yZWFkXG4gIC8vIG1heSBiZSBhIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2VcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSByZWFkIGJ1ZmZlciwgcHJvdmlkaW5nIGVub3VnaCBkYXRhIHdoZW5cbiAgLy8gYmVmb3JlIHRoZXJlIHdhcyAqbm90KiBlbm91Z2guXG4gIC8vXG4gIC8vIFNvLCB0aGUgc3RlcHMgYXJlOlxuICAvLyAxLiBGaWd1cmUgb3V0IHdoYXQgdGhlIHN0YXRlIG9mIHRoaW5ncyB3aWxsIGJlIGFmdGVyIHdlIGRvXG4gIC8vIGEgcmVhZCBmcm9tIHRoZSBidWZmZXIuXG4gIC8vXG4gIC8vIDIuIElmIHRoYXQgcmVzdWx0aW5nIHN0YXRlIHdpbGwgdHJpZ2dlciBhIF9yZWFkLCB0aGVuIGNhbGwgX3JlYWQuXG4gIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhc3luY2hyb25vdXMsIG9yIHN5bmNocm9ub3VzLiAgWWVzLCBpdCBpc1xuICAvLyBkZWVwbHkgdWdseSB0byB3cml0ZSBBUElzIHRoaXMgd2F5LCBidXQgdGhhdCBzdGlsbCBkb2Vzbid0IG1lYW5cbiAgLy8gdGhhdCB0aGUgUmVhZGFibGUgY2xhc3Mgc2hvdWxkIGJlaGF2ZSBpbXByb3Blcmx5LCBhcyBzdHJlYW1zIGFyZVxuICAvLyBkZXNpZ25lZCB0byBiZSBzeW5jL2FzeW5jIGFnbm9zdGljLlxuICAvLyBUYWtlIG5vdGUgaWYgdGhlIF9yZWFkIGNhbGwgaXMgc3luYyBvciBhc3luYyAoaWUsIGlmIHRoZSByZWFkIGNhbGxcbiAgLy8gaGFzIHJldHVybmVkIHlldCksIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIG9yIG5vdCBpdCdzIHNhZmUgdG8gZW1pdFxuICAvLyAncmVhZGFibGUnIGV0Yy5cbiAgLy9cbiAgLy8gMy4gQWN0dWFsbHkgcHVsbCB0aGUgcmVxdWVzdGVkIGNodW5rcyBvdXQgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuLlxuXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cbiAgdmFyIGRvUmVhZCA9IHN0YXRlLm5lZWRSZWFkYWJsZTtcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZTtcbiAgICBkZWJ1ZygnbGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsnLCBkb1JlYWQpO1xuICB9XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZykge1xuICAgIGRvUmVhZCA9IGZhbHNlO1xuICAgIGRlYnVnKCdyZWFkaW5nIG9yIGVuZGVkJywgZG9SZWFkKTtcbiAgfSBlbHNlIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpO1xuICAgIHN0YXRlLnJlYWRpbmcgPSB0cnVlO1xuICAgIHN0YXRlLnN5bmMgPSB0cnVlO1xuICAgIC8vIGlmIHRoZSBsZW5ndGggaXMgY3VycmVudGx5IHplcm8sIHRoZW4gd2UgKm5lZWQqIGEgcmVhZGFibGUgZXZlbnQuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gICAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuICB9XG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcbiAgaWYgKHJldCA9PT0gbnVsbCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHN0YXRlLmxlbmd0aCA8PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAgIG4gPSAwO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlLmxlbmd0aCAtPSBuO1xuICAgIHN0YXRlLmF3YWl0RHJhaW4gPSAwO1xuICB9XG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwgdGhlbiB3ZSB3YW50IHRvIGtub3dcbiAgICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAgIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO1xuICB9XG4gIGlmIChyZXQgIT09IG51bGwpIHRoaXMuZW1pdCgnZGF0YScsIHJldCk7XG4gIHJldHVybiByZXQ7XG59O1xuZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKSB7XG4gIGRlYnVnKCdvbkVvZkNodW5rJyk7XG4gIGlmIChzdGF0ZS5lbmRlZCkgcmV0dXJuO1xuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gIGlmIChzdGF0ZS5zeW5jKSB7XG4gICAgLy8gaWYgd2UgYXJlIHN5bmMsIHdhaXQgdW50aWwgbmV4dCB0aWNrIHRvIGVtaXQgdGhlIGRhdGEuXG4gICAgLy8gT3RoZXJ3aXNlIHdlIHJpc2sgZW1pdHRpbmcgZGF0YSBpbiB0aGUgZmxvdygpXG4gICAgLy8gdGhlIHJlYWRhYmxlIGNvZGUgdHJpZ2dlcnMgZHVyaW5nIGEgcmVhZCgpIGNhbGxcbiAgICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgICBpZiAoIXN0YXRlLmVtaXR0ZWRSZWFkYWJsZSkge1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gRG9uJ3QgZW1pdCByZWFkYWJsZSByaWdodCBhd2F5IGluIHN5bmMgbW9kZSwgYmVjYXVzZSB0aGlzIGNhbiB0cmlnZ2VyXG4vLyBhbm90aGVyIHJlYWQoKSBjYWxsID0+IHN0YWNrIG92ZXJmbG93LiAgVGhpcyB3YXksIGl0IG1pZ2h0IHRyaWdnZXJcbi8vIGEgbmV4dFRpY2sgcmVjdXJzaW9uIHdhcm5pbmcsIGJ1dCB0aGF0J3Mgbm90IHNvIGJhZC5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUubmVlZFJlYWRhYmxlLCBzdGF0ZS5lbWl0dGVkUmVhZGFibGUpO1xuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgaWYgKCFzdGF0ZS5lbWl0dGVkUmVhZGFibGUpIHtcbiAgICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUuZmxvd2luZyk7XG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRSZWFkYWJsZV8sIHN0cmVhbSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgZGVidWcoJ2VtaXRSZWFkYWJsZV8nLCBzdGF0ZS5kZXN0cm95ZWQsIHN0YXRlLmxlbmd0aCwgc3RhdGUuZW5kZWQpO1xuICBpZiAoIXN0YXRlLmRlc3Ryb3llZCAmJiAoc3RhdGUubGVuZ3RoIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB9XG5cbiAgLy8gVGhlIHN0cmVhbSBuZWVkcyBhbm90aGVyIHJlYWRhYmxlIGV2ZW50IGlmXG4gIC8vIDEuIEl0IGlzIG5vdCBmbG93aW5nLCBhcyB0aGUgZmxvdyBtZWNoYW5pc20gd2lsbCB0YWtlXG4gIC8vICAgIGNhcmUgb2YgaXQuXG4gIC8vIDIuIEl0IGlzIG5vdCBlbmRlZC5cbiAgLy8gMy4gSXQgaXMgYmVsb3cgdGhlIGhpZ2hXYXRlck1hcmssIHNvIHdlIGNhbiBzY2hlZHVsZVxuICAvLyAgICBhbm90aGVyIHJlYWRhYmxlIGxhdGVyLlxuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDw9IHN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIGZsb3coc3RyZWFtKTtcbn1cblxuLy8gYXQgdGhpcyBwb2ludCwgdGhlIHVzZXIgaGFzIHByZXN1bWFibHkgc2VlbiB0aGUgJ3JlYWRhYmxlJyBldmVudCxcbi8vIGFuZCBjYWxsZWQgcmVhZCgpIHRvIGNvbnN1bWUgc29tZSBkYXRhLiAgdGhhdCBtYXkgaGF2ZSB0cmlnZ2VyZWRcbi8vIGluIHR1cm4gYW5vdGhlciBfcmVhZChuKSBjYWxsLCBpbiB3aGljaCBjYXNlIHJlYWRpbmcgPSB0cnVlIGlmXG4vLyBpdCdzIGluIHByb2dyZXNzLlxuLy8gSG93ZXZlciwgaWYgd2UncmUgbm90IGVuZGVkLCBvciByZWFkaW5nLCBhbmQgdGhlIGxlbmd0aCA8IGh3bSxcbi8vIHRoZW4gZ28gYWhlYWQgYW5kIHRyeSB0byByZWFkIHNvbWUgbW9yZSBwcmVlbXB0aXZlbHkuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nTW9yZSkge1xuICAgIHN0YXRlLnJlYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSkge1xuICAvLyBBdHRlbXB0IHRvIHJlYWQgbW9yZSBkYXRhIGlmIHdlIHNob3VsZC5cbiAgLy9cbiAgLy8gVGhlIGNvbmRpdGlvbnMgZm9yIHJlYWRpbmcgbW9yZSBkYXRhIGFyZSAob25lIG9mKTpcbiAgLy8gLSBOb3QgZW5vdWdoIGRhdGEgYnVmZmVyZWQgKHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmspLiBUaGUgbG9vcFxuICAvLyAgIGlzIHJlc3BvbnNpYmxlIGZvciBmaWxsaW5nIHRoZSBidWZmZXIgd2l0aCBlbm91Z2ggZGF0YSBpZiBzdWNoIGRhdGFcbiAgLy8gICBpcyBhdmFpbGFibGUuIElmIGhpZ2hXYXRlck1hcmsgaXMgMCBhbmQgd2UgYXJlIG5vdCBpbiB0aGUgZmxvd2luZyBtb2RlXG4gIC8vICAgd2Ugc2hvdWxkIF9ub3RfIGF0dGVtcHQgdG8gYnVmZmVyIGFueSBleHRyYSBkYXRhLiBXZSdsbCBnZXQgbW9yZSBkYXRhXG4gIC8vICAgd2hlbiB0aGUgc3RyZWFtIGNvbnN1bWVyIGNhbGxzIHJlYWQoKSBpbnN0ZWFkLlxuICAvLyAtIE5vIGRhdGEgaW4gdGhlIGJ1ZmZlciwgYW5kIHRoZSBzdHJlYW0gaXMgaW4gZmxvd2luZyBtb2RlLiBJbiB0aGlzIG1vZGVcbiAgLy8gICB0aGUgbG9vcCBiZWxvdyBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgcmVhZCgpIGlzIGNhbGxlZC4gRmFpbGluZyB0b1xuICAvLyAgIGNhbGwgcmVhZCBoZXJlIHdvdWxkIGFib3J0IHRoZSBmbG93IGFuZCB0aGVyZSdzIG5vIG90aGVyIG1lY2hhbmlzbSBmb3JcbiAgLy8gICBjb250aW51aW5nIHRoZSBmbG93IGlmIHRoZSBzdHJlYW0gY29uc3VtZXIgaGFzIGp1c3Qgc3Vic2NyaWJlZCB0byB0aGVcbiAgLy8gICAnZGF0YScgZXZlbnQuXG4gIC8vXG4gIC8vIEluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSBjb25kaXRpb25zIHRvIGtlZXAgcmVhZGluZyBkYXRhLCB0aGUgZm9sbG93aW5nXG4gIC8vIGNvbmRpdGlvbnMgcHJldmVudCB0aGUgZGF0YSBmcm9tIGJlaW5nIHJlYWQ6XG4gIC8vIC0gVGhlIHN0cmVhbSBoYXMgZW5kZWQgKHN0YXRlLmVuZGVkKS5cbiAgLy8gLSBUaGVyZSBpcyBhbHJlYWR5IGEgcGVuZGluZyAncmVhZCcgb3BlcmF0aW9uIChzdGF0ZS5yZWFkaW5nKS4gVGhpcyBpcyBhXG4gIC8vICAgY2FzZSB3aGVyZSB0aGUgdGhlIHN0cmVhbSBoYXMgY2FsbGVkIHRoZSBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIF9yZWFkKClcbiAgLy8gICBtZXRob2QsIGJ1dCB0aGV5IGFyZSBwcm9jZXNzaW5nIHRoZSBjYWxsIGFzeW5jaHJvbm91c2x5IGFuZCBoYXZlIF9ub3RfXG4gIC8vICAgY2FsbGVkIHB1c2goKSB3aXRoIG5ldyBkYXRhLiBJbiB0aGlzIGNhc2Ugd2Ugc2tpcCBwZXJmb3JtaW5nIG1vcmVcbiAgLy8gICByZWFkKClzLiBUaGUgZXhlY3V0aW9uIGVuZHMgaW4gdGhpcyBtZXRob2QgYWdhaW4gYWZ0ZXIgdGhlIF9yZWFkKCkgZW5kc1xuICAvLyAgIHVwIGNhbGxpbmcgcHVzaCgpIHdpdGggbW9yZSBkYXRhLlxuICB3aGlsZSAoIXN0YXRlLnJlYWRpbmcgJiYgIXN0YXRlLmVuZGVkICYmIChzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwKSkge1xuICAgIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gICAgZGVidWcoJ21heWJlUmVhZE1vcmUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgaWYgKGxlbiA9PT0gc3RhdGUubGVuZ3RoKVxuICAgICAgLy8gZGlkbid0IGdldCBhbnkgZGF0YSwgc3RvcCBzcGlubmluZy5cbiAgICAgIGJyZWFrO1xuICB9XG4gIHN0YXRlLnJlYWRpbmdNb3JlID0gZmFsc2U7XG59XG5cbi8vIGFic3RyYWN0IG1ldGhvZC4gIHRvIGJlIG92ZXJyaWRkZW4gaW4gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vIGNhbGwgY2IoZXIsIGRhdGEpIHdoZXJlIGRhdGEgaXMgPD0gbiBpbiBsZW5ndGguXG4vLyBmb3IgdmlydHVhbCAobm9uLXN0cmluZywgbm9uLWJ1ZmZlcikgc3RyZWFtcywgXCJsZW5ndGhcIiBpcyBzb21ld2hhdFxuLy8gYXJiaXRyYXJ5LCBhbmQgcGVyaGFwcyBub3QgdmVyeSBtZWFuaW5nZnVsLlxuUmVhZGFibGUucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgZXJyb3JPckRlc3Ryb3kodGhpcywgbmV3IEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEKCdfcmVhZCgpJykpO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBzd2l0Y2ggKHN0YXRlLnBpcGVzQ291bnQpIHtcbiAgICBjYXNlIDA6XG4gICAgICBzdGF0ZS5waXBlcyA9IGRlc3Q7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6XG4gICAgICBzdGF0ZS5waXBlcyA9IFtzdGF0ZS5waXBlcywgZGVzdF07XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgc3RhdGUucGlwZXMucHVzaChkZXN0KTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHN0YXRlLnBpcGVzQ291bnQgKz0gMTtcbiAgZGVidWcoJ3BpcGUgY291bnQ9JWQgb3B0cz0laicsIHN0YXRlLnBpcGVzQ291bnQsIHBpcGVPcHRzKTtcbiAgdmFyIGRvRW5kID0gKCFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlKSAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZG91dCAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZGVycjtcbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IHVucGlwZTtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHByb2Nlc3MubmV4dFRpY2soZW5kRm4pO2Vsc2Ugc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKTtcbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpO1xuICBmdW5jdGlvbiBvbnVucGlwZShyZWFkYWJsZSwgdW5waXBlSW5mbykge1xuICAgIGRlYnVnKCdvbnVucGlwZScpO1xuICAgIGlmIChyZWFkYWJsZSA9PT0gc3JjKSB7XG4gICAgICBpZiAodW5waXBlSW5mbyAmJiB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHVucGlwZUluZm8uaGFzVW5waXBlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgZGVidWcoJ29uZW5kJyk7XG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG4gIC8vIHdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgLy8gb24gdGhlIHNvdXJjZS4gIFRoaXMgd291bGQgYmUgbW9yZSBlbGVnYW50IHdpdGggYSAub25jZSgpXG4gIC8vIGhhbmRsZXIgaW4gZmxvdygpLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyByZXBlYXRlZGx5IGlzXG4gIC8vIHRvbyBzbG93LlxuICB2YXIgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYyk7XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG4gIHZhciBjbGVhbmVkVXAgPSBmYWxzZTtcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpO1xuICAgIC8vIGNsZWFudXAgZXZlbnQgaGFuZGxlcnMgb25jZSB0aGUgcGlwZSBpcyBicm9rZW5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJywgb251bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgdW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvbmRhdGEpO1xuICAgIGNsZWFuZWRVcCA9IHRydWU7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpIG9uZHJhaW4oKTtcbiAgfVxuICBzcmMub24oJ2RhdGEnLCBvbmRhdGEpO1xuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJyk7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGRlYnVnKCdkZXN0LndyaXRlJywgcmV0KTtcbiAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgLy8gSWYgdGhlIHVzZXIgdW5waXBlZCBkdXJpbmcgYGRlc3Qud3JpdGUoKWAsIGl0IGlzIHBvc3NpYmxlXG4gICAgICAvLyB0byBnZXQgc3R1Y2sgaW4gYSBwZXJtYW5lbnRseSBwYXVzZWQgc3RhdGUgaWYgdGhhdCB3cml0ZVxuICAgICAgLy8gYWxzbyByZXR1cm5lZCBmYWxzZS5cbiAgICAgIC8vID0+IENoZWNrIHdoZXRoZXIgYGRlc3RgIGlzIHN0aWxsIGEgcGlwaW5nIGRlc3RpbmF0aW9uLlxuICAgICAgaWYgKChzdGF0ZS5waXBlc0NvdW50ID09PSAxICYmIHN0YXRlLnBpcGVzID09PSBkZXN0IHx8IHN0YXRlLnBpcGVzQ291bnQgPiAxICYmIGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpICE9PSAtMSkgJiYgIWNsZWFuZWRVcCkge1xuICAgICAgICBkZWJ1ZygnZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlJywgc3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICAgIH1cbiAgICAgIHNyYy5wYXVzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBkZXN0IGhhcyBhbiBlcnJvciwgdGhlbiBzdG9wIHBpcGluZyBpbnRvIGl0LlxuICAvLyBob3dldmVyLCBkb24ndCBzdXBwcmVzcyB0aGUgdGhyb3dpbmcgYmVoYXZpb3IgZm9yIHRoaXMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBkZWJ1Zygnb25lcnJvcicsIGVyKTtcbiAgICB1bnBpcGUoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGlmIChFRWxpc3RlbmVyQ291bnQoZGVzdCwgJ2Vycm9yJykgPT09IDApIGVycm9yT3JEZXN0cm95KGRlc3QsIGVyKTtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgdXNlcmxhbmQgb25lcy5cbiAgcHJlcGVuZExpc3RlbmVyKGRlc3QsICdlcnJvcicsIG9uZXJyb3IpO1xuXG4gIC8vIEJvdGggY2xvc2UgYW5kIGZpbmlzaCBzaG91bGQgdHJpZ2dlciB1bnBpcGUsIGJ1dCBvbmx5IG9uY2UuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKTtcbiAgZnVuY3Rpb24gb25maW5pc2goKSB7XG4gICAgZGVidWcoJ29uZmluaXNoJyk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgZnVuY3Rpb24gdW5waXBlKCkge1xuICAgIGRlYnVnKCd1bnBpcGUnKTtcbiAgICBzcmMudW5waXBlKGRlc3QpO1xuICB9XG5cbiAgLy8gdGVsbCB0aGUgZGVzdCB0aGF0IGl0J3MgYmVpbmcgcGlwZWQgdG9cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKTtcblxuICAvLyBzdGFydCB0aGUgZmxvdyBpZiBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkIGFscmVhZHkuXG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwaXBlIHJlc3VtZScpO1xuICAgIHNyYy5yZXN1bWUoKTtcbiAgfVxuICByZXR1cm4gZGVzdDtcbn07XG5mdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHBpcGVPbkRyYWluRnVuY3Rpb25SZXN1bHQoKSB7XG4gICAgdmFyIHN0YXRlID0gc3JjLl9yZWFkYWJsZVN0YXRlO1xuICAgIGRlYnVnKCdwaXBlT25EcmFpbicsIHN0YXRlLmF3YWl0RHJhaW4pO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluKSBzdGF0ZS5hd2FpdERyYWluLS07XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPT09IDAgJiYgRUVsaXN0ZW5lckNvdW50KHNyYywgJ2RhdGEnKSkge1xuICAgICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgICBmbG93KHNyYyk7XG4gICAgfVxuICB9O1xufVxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciB1bnBpcGVJbmZvID0ge1xuICAgIGhhc1VucGlwZWQ6IGZhbHNlXG4gIH07XG5cbiAgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMCkgcmV0dXJuIHRoaXM7XG5cbiAgLy8ganVzdCBvbmUgZGVzdGluYXRpb24uICBtb3N0IGNvbW1vbiBjYXNlLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkge1xuICAgIC8vIHBhc3NlZCBpbiBvbmUsIGJ1dCBpdCdzIG5vdCB0aGUgcmlnaHQgb25lLlxuICAgIGlmIChkZXN0ICYmIGRlc3QgIT09IHN0YXRlLnBpcGVzKSByZXR1cm4gdGhpcztcbiAgICBpZiAoIWRlc3QpIGRlc3QgPSBzdGF0ZS5waXBlcztcblxuICAgIC8vIGdvdCBhIG1hdGNoLlxuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgaWYgKGRlc3QpIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcywgdW5waXBlSW5mbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBzbG93IGNhc2UuIG11bHRpcGxlIHBpcGUgZGVzdGluYXRpb25zLlxuXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgdmFyIGRlc3RzID0gc3RhdGUucGlwZXM7XG4gICAgdmFyIGxlbiA9IHN0YXRlLnBpcGVzQ291bnQ7XG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBkZXN0c1tpXS5lbWl0KCd1bnBpcGUnLCB0aGlzLCB7XG4gICAgICBoYXNVbnBpcGVkOiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gdHJ5IHRvIGZpbmQgdGhlIHJpZ2h0IG9uZS5cbiAgdmFyIGluZGV4ID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiB0aGlzO1xuICBzdGF0ZS5waXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIHNldCB1cCBkYXRhIGV2ZW50cyBpZiB0aGV5IGFyZSBhc2tlZCBmb3Jcbi8vIEVuc3VyZSByZWFkYWJsZSBsaXN0ZW5lcnMgZXZlbnR1YWxseSBnZXQgc29tZXRoaW5nXG5SZWFkYWJsZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAoZXYsIGZuKSB7XG4gIHZhciByZXMgPSBTdHJlYW0ucHJvdG90eXBlLm9uLmNhbGwodGhpcywgZXYsIGZuKTtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKGV2ID09PSAnZGF0YScpIHtcbiAgICAvLyB1cGRhdGUgcmVhZGFibGVMaXN0ZW5pbmcgc28gdGhhdCByZXN1bWUoKSBtYXkgYmUgYSBuby1vcFxuICAgIC8vIGEgZmV3IGxpbmVzIGRvd24uIFRoaXMgaXMgbmVlZGVkIHRvIHN1cHBvcnQgb25jZSgncmVhZGFibGUnKS5cbiAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHRoaXMubGlzdGVuZXJDb3VudCgncmVhZGFibGUnKSA+IDA7XG5cbiAgICAvLyBUcnkgc3RhcnQgZmxvd2luZyBvbiBuZXh0IHRpY2sgaWYgc3RyZWFtIGlzbid0IGV4cGxpY2l0bHkgcGF1c2VkXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgIT09IGZhbHNlKSB0aGlzLnJlc3VtZSgpO1xuICB9IGVsc2UgaWYgKGV2ID09PSAncmVhZGFibGUnKSB7XG4gICAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmICFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBkZWJ1Zygnb24gcmVhZGFibGUnLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLnJlYWRpbmcpO1xuICAgICAgaWYgKHN0YXRlLmxlbmd0aCkge1xuICAgICAgICBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgICB9IGVsc2UgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soblJlYWRpbmdOZXh0VGljaywgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59O1xuUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uO1xuUmVhZGFibGUucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lci5jYWxsKHRoaXMsIGV2LCBmbik7XG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJykge1xuICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgaXMgc29tZW9uZSBzdGlsbCBsaXN0ZW5pbmcgdG9cbiAgICAvLyByZWFkYWJsZSBhbmQgcmVzZXQgdGhlIHN0YXRlLiBIb3dldmVyIHRoaXMgbmVlZHMgdG8gaGFwcGVuXG4gICAgLy8gYWZ0ZXIgcmVhZGFibGUgaGFzIGJlZW4gZW1pdHRlZCBidXQgYmVmb3JlIEkvTyAobmV4dFRpY2spIHRvXG4gICAgLy8gc3VwcG9ydCBvbmNlKCdyZWFkYWJsZScsIGZuKSBjeWNsZXMuIFRoaXMgbWVhbnMgdGhhdCBjYWxsaW5nXG4gICAgLy8gcmVzdW1lIHdpdGhpbiB0aGUgc2FtZSB0aWNrIHdpbGwgaGF2ZSBub1xuICAgIC8vIGVmZmVjdC5cbiAgICBwcm9jZXNzLm5leHRUaWNrKHVwZGF0ZVJlYWRhYmxlTGlzdGVuaW5nLCB0aGlzKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoZXYpIHtcbiAgdmFyIHJlcyA9IFN0cmVhbS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJyB8fCBldiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBzb21lb25lIHN0aWxsIGxpc3RlbmluZyB0b1xuICAgIC8vIHJlYWRhYmxlIGFuZCByZXNldCB0aGUgc3RhdGUuIEhvd2V2ZXIgdGhpcyBuZWVkcyB0byBoYXBwZW5cbiAgICAvLyBhZnRlciByZWFkYWJsZSBoYXMgYmVlbiBlbWl0dGVkIGJ1dCBiZWZvcmUgSS9PIChuZXh0VGljaykgdG9cbiAgICAvLyBzdXBwb3J0IG9uY2UoJ3JlYWRhYmxlJywgZm4pIGN5Y2xlcy4gVGhpcyBtZWFucyB0aGF0IGNhbGxpbmdcbiAgICAvLyByZXN1bWUgd2l0aGluIHRoZSBzYW1lIHRpY2sgd2lsbCBoYXZlIG5vXG4gICAgLy8gZWZmZWN0LlxuICAgIHByb2Nlc3MubmV4dFRpY2sodXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcsIHRoaXMpO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuZnVuY3Rpb24gdXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcoc2VsZikge1xuICB2YXIgc3RhdGUgPSBzZWxmLl9yZWFkYWJsZVN0YXRlO1xuICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHNlbGYubGlzdGVuZXJDb3VudCgncmVhZGFibGUnKSA+IDA7XG4gIGlmIChzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgJiYgIXN0YXRlLnBhdXNlZCkge1xuICAgIC8vIGZsb3dpbmcgbmVlZHMgdG8gYmUgc2V0IHRvIHRydWUgbm93LCBvdGhlcndpc2VcbiAgICAvLyB0aGUgdXBjb21pbmcgcmVzdW1lIHdpbGwgbm90IGZsb3cuXG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG5cbiAgICAvLyBjcnVkZSB3YXkgdG8gY2hlY2sgaWYgd2Ugc2hvdWxkIHJlc3VtZVxuICB9IGVsc2UgaWYgKHNlbGYubGlzdGVuZXJDb3VudCgnZGF0YScpID4gMCkge1xuICAgIHNlbGYucmVzdW1lKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIG5SZWFkaW5nTmV4dFRpY2soc2VsZikge1xuICBkZWJ1ZygncmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwJyk7XG4gIHNlbGYucmVhZCgwKTtcbn1cblxuLy8gcGF1c2UoKSBhbmQgcmVzdW1lKCkgYXJlIHJlbW5hbnRzIG9mIHRoZSBsZWdhY3kgcmVhZGFibGUgc3RyZWFtIEFQSVxuLy8gSWYgdGhlIHVzZXIgdXNlcyB0aGVtLCB0aGVuIHN3aXRjaCBpbnRvIG9sZCBtb2RlLlxuUmVhZGFibGUucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZScpO1xuICAgIC8vIHdlIGZsb3cgb25seSBpZiB0aGVyZSBpcyBubyBvbmUgbGlzdGVuaW5nXG4gICAgLy8gZm9yIHJlYWRhYmxlLCBidXQgd2Ugc3RpbGwgaGF2ZSB0byBjYWxsXG4gICAgLy8gcmVzdW1lKClcbiAgICBzdGF0ZS5mbG93aW5nID0gIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nO1xuICAgIHJlc3VtZSh0aGlzLCBzdGF0ZSk7XG4gIH1cbiAgc3RhdGUucGF1c2VkID0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKHJlc3VtZV8sIHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgZGVidWcoJ3Jlc3VtZScsIHN0YXRlLnJlYWRpbmcpO1xuICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyk7XG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgIT09IGZhbHNlKSB7XG4gICAgZGVidWcoJ3BhdXNlJyk7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUucGF1c2VkID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuZnVuY3Rpb24gZmxvdyhzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZmxvdycsIHN0YXRlLmZsb3dpbmcpO1xuICB3aGlsZSAoc3RhdGUuZmxvd2luZyAmJiBzdHJlYW0ucmVhZCgpICE9PSBudWxsKTtcbn1cblxuLy8gd3JhcCBhbiBvbGQtc3R5bGUgc3RyZWFtIGFzIHRoZSBhc3luYyBkYXRhIHNvdXJjZS5cbi8vIFRoaXMgaXMgKm5vdCogcGFydCBvZiB0aGUgcmVhZGFibGUgc3RyZWFtIGludGVyZmFjZS5cbi8vIEl0IGlzIGFuIHVnbHkgdW5mb3J0dW5hdGUgbWVzcyBvZiBoaXN0b3J5LlxuUmVhZGFibGUucHJvdG90eXBlLndyYXAgPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBwYXVzZWQgPSBmYWxzZTtcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgX3RoaXMucHVzaChjaHVuayk7XG4gICAgfVxuICAgIF90aGlzLnB1c2gobnVsbCk7XG4gIH0pO1xuICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBkYXRhJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG5cbiAgICAvLyBkb24ndCBza2lwIG92ZXIgZmFsc3kgdmFsdWVzIGluIG9iamVjdE1vZGVcbiAgICBpZiAoc3RhdGUub2JqZWN0TW9kZSAmJiAoY2h1bmsgPT09IG51bGwgfHwgY2h1bmsgPT09IHVuZGVmaW5lZCkpIHJldHVybjtlbHNlIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiAoIWNodW5rIHx8ICFjaHVuay5sZW5ndGgpKSByZXR1cm47XG4gICAgdmFyIHJldCA9IF90aGlzLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIG1ldGhvZFdyYXAobWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBtZXRob2RXcmFwUmV0dXJuRnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHN0cmVhbVttZXRob2RdLmFwcGx5KHN0cmVhbSwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0oaSk7XG4gICAgfVxuICB9XG5cbiAgLy8gcHJveHkgY2VydGFpbiBpbXBvcnRhbnQgZXZlbnRzLlxuICBmb3IgKHZhciBuID0gMDsgbiA8IGtQcm94eUV2ZW50cy5sZW5ndGg7IG4rKykge1xuICAgIHN0cmVhbS5vbihrUHJveHlFdmVudHNbbl0sIHRoaXMuZW1pdC5iaW5kKHRoaXMsIGtQcm94eUV2ZW50c1tuXSkpO1xuICB9XG5cbiAgLy8gd2hlbiB3ZSB0cnkgdG8gY29uc3VtZSBzb21lIG1vcmUgYnl0ZXMsIHNpbXBseSB1bnBhdXNlIHRoZVxuICAvLyB1bmRlcmx5aW5nIHN0cmVhbS5cbiAgdGhpcy5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgX3JlYWQnLCBuKTtcbiAgICBpZiAocGF1c2VkKSB7XG4gICAgICBwYXVzZWQgPSBmYWxzZTtcbiAgICAgIHN0cmVhbS5yZXN1bWUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB0aGlzO1xufTtcbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG4gIFJlYWRhYmxlLnByb3RvdHlwZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjcmVhdGVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvYXN5bmNfaXRlcmF0b3InKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcih0aGlzKTtcbiAgfTtcbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdyZWFkYWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgJ3JlYWRhYmxlQnVmZmVyJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSAmJiB0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlcjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGUucHJvdG90eXBlLCAncmVhZGFibGVGbG93aW5nJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIHNldChzdGF0ZSkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBzdGF0ZTtcbiAgICB9XG4gIH1cbn0pO1xuXG4vLyBleHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5SZWFkYWJsZS5fZnJvbUxpc3QgPSBmcm9tTGlzdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdyZWFkYWJsZUxlbmd0aCcsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUubGVuZ3RoO1xuICB9XG59KTtcblxuLy8gUGx1Y2sgb2ZmIG4gYnl0ZXMgZnJvbSBhbiBhcnJheSBvZiBidWZmZXJzLlxuLy8gTGVuZ3RoIGlzIHRoZSBjb21iaW5lZCBsZW5ndGhzIG9mIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgbGlzdC5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gZnJvbUxpc3Qobiwgc3RhdGUpIHtcbiAgLy8gbm90aGluZyBidWZmZXJlZFxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgdmFyIHJldDtcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldCA9IHN0YXRlLmJ1ZmZlci5zaGlmdCgpO2Vsc2UgaWYgKCFuIHx8IG4gPj0gc3RhdGUubGVuZ3RoKSB7XG4gICAgLy8gcmVhZCBpdCBhbGwsIHRydW5jYXRlIHRoZSBsaXN0XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIHJldCA9IHN0YXRlLmJ1ZmZlci5qb2luKCcnKTtlbHNlIGlmIChzdGF0ZS5idWZmZXIubGVuZ3RoID09PSAxKSByZXQgPSBzdGF0ZS5idWZmZXIuZmlyc3QoKTtlbHNlIHJldCA9IHN0YXRlLmJ1ZmZlci5jb25jYXQoc3RhdGUubGVuZ3RoKTtcbiAgICBzdGF0ZS5idWZmZXIuY2xlYXIoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIHBhcnQgb2YgbGlzdFxuICAgIHJldCA9IHN0YXRlLmJ1ZmZlci5jb25zdW1lKG4sIHN0YXRlLmRlY29kZXIpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZW5kUmVhZGFibGUnLCBzdGF0ZS5lbmRFbWl0dGVkKTtcbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIHByb2Nlc3MubmV4dFRpY2soZW5kUmVhZGFibGVOVCwgc3RhdGUsIHN0cmVhbSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlTlQoc3RhdGUsIHN0cmVhbSkge1xuICBkZWJ1ZygnZW5kUmVhZGFibGVOVCcsIHN0YXRlLmVuZEVtaXR0ZWQsIHN0YXRlLmxlbmd0aCk7XG5cbiAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgZ2V0IG9uZSBsYXN0IHVuc2hpZnQuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICBzdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gICAgaWYgKHN0YXRlLmF1dG9EZXN0cm95KSB7XG4gICAgICAvLyBJbiBjYXNlIG9mIGR1cGxleCBzdHJlYW1zIHdlIG5lZWQgYSB3YXkgdG8gZGV0ZWN0XG4gICAgICAvLyBpZiB0aGUgd3JpdGFibGUgc2lkZSBpcyByZWFkeSBmb3IgYXV0b0Rlc3Ryb3kgYXMgd2VsbFxuICAgICAgdmFyIHdTdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgICAgIGlmICghd1N0YXRlIHx8IHdTdGF0ZS5hdXRvRGVzdHJveSAmJiB3U3RhdGUuZmluaXNoZWQpIHtcbiAgICAgICAgc3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG4gIFJlYWRhYmxlLmZyb20gPSBmdW5jdGlvbiAoaXRlcmFibGUsIG9wdHMpIHtcbiAgICBpZiAoZnJvbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmcm9tID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2Zyb20nKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyb20oUmVhZGFibGUsIGl0ZXJhYmxlLCBvcHRzKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9481\n")},4605:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a transform stream is a readable/writable stream where you do\n// something with the data. Sometimes it's called a \"filter\",\n// but that's not a great name for it, since that implies a thing where\n// some bits pass through, and others are simply ignored. (That would\n// be a valid example of a transform, of course.)\n//\n// While the output is causally related to the input, it's not a\n// necessarily symmetric or synchronous transformation. For example,\n// a zlib stream might take multiple plain-text writes(), and then\n// emit a single compressed chunk some time in the future.\n//\n// Here's how this works:\n//\n// The Transform stream has all the aspects of the readable and writable\n// stream classes. When you write(chunk), that calls _write(chunk,cb)\n// internally, and returns false if there's a lot of pending writes\n// buffered up. When you call read(), that calls _read(n) until\n// there's enough pending readable data buffered up.\n//\n// In a transform stream, the written data is placed in a buffer. When\n// _read(n) is called, it transforms the queued up data, calling the\n// buffered _write cb's as it consumes chunks. If consuming a single\n// written chunk would result in multiple output chunks, then the first\n// outputted bit calls the readcb, and subsequent chunks just go into\n// the read buffer, and will cause it to emit 'readable' if necessary.\n//\n// This way, back-pressure is actually determined by the reading side,\n// since _read has to be called to start processing a new chunk. However,\n// a pathological inflate type of transform can cause excessive buffering\n// here. For example, imagine a stream where every byte of input is\n// interpreted as an integer from 0-255, and then results in that many\n// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in\n// 1kb of data being output. In this case, you could write a very small\n// amount of input, and end up with a very large amount of output. In\n// such a pathological inflating mechanism, there'd be no way to tell\n// the system to stop doing the transform. A single 4MB write could\n// cause the system to run out of memory.\n//\n// However, even in such a pathological case, only a single written chunk\n// would be consumed, and then the rest would wait (un-transformed) until\n// the results of the previous transformed chunk were consumed.\n\n\n\nmodule.exports = Transform;\nvar _require$codes = (__webpack_require__(4012)/* .codes */ .q),\n ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,\n ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,\n ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING,\n ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0;\nvar Duplex = __webpack_require__(6753);\n__webpack_require__(4378)(Transform, Duplex);\nfunction afterTransform(er, data) {\n var ts = this._transformState;\n ts.transforming = false;\n var cb = ts.writecb;\n if (cb === null) {\n return this.emit('error', new ERR_MULTIPLE_CALLBACK());\n }\n ts.writechunk = null;\n ts.writecb = null;\n if (data != null)\n // single equals check for both `null` and `undefined`\n this.push(data);\n cb(er);\n var rs = this._readableState;\n rs.reading = false;\n if (rs.needReadable || rs.length < rs.highWaterMark) {\n this._read(rs.highWaterMark);\n }\n}\nfunction Transform(options) {\n if (!(this instanceof Transform)) return new Transform(options);\n Duplex.call(this, options);\n this._transformState = {\n afterTransform: afterTransform.bind(this),\n needTransform: false,\n transforming: false,\n writecb: null,\n writechunk: null,\n writeencoding: null\n };\n\n // start out asking for a readable event once data is transformed.\n this._readableState.needReadable = true;\n\n // we have implemented the _read method, and done the other things\n // that Readable wants before the first _read call, so unset the\n // sync guard flag.\n this._readableState.sync = false;\n if (options) {\n if (typeof options.transform === 'function') this._transform = options.transform;\n if (typeof options.flush === 'function') this._flush = options.flush;\n }\n\n // When the writable side finishes, then flush out anything remaining.\n this.on('prefinish', prefinish);\n}\nfunction prefinish() {\n var _this = this;\n if (typeof this._flush === 'function' && !this._readableState.destroyed) {\n this._flush(function (er, data) {\n done(_this, er, data);\n });\n } else {\n done(this, null, null);\n }\n}\nTransform.prototype.push = function (chunk, encoding) {\n this._transformState.needTransform = false;\n return Duplex.prototype.push.call(this, chunk, encoding);\n};\n\n// This is the part where you do stuff!\n// override this function in implementation classes.\n// 'chunk' is an input chunk.\n//\n// Call `push(newChunk)` to pass along transformed output\n// to the readable side. You may call 'push' zero or more times.\n//\n// Call `cb(err)` when you are done with this chunk. If you pass\n// an error, then that'll put the hurt on the whole operation. If you\n// never call cb(), then you'll never get another chunk.\nTransform.prototype._transform = function (chunk, encoding, cb) {\n cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()'));\n};\nTransform.prototype._write = function (chunk, encoding, cb) {\n var ts = this._transformState;\n ts.writecb = cb;\n ts.writechunk = chunk;\n ts.writeencoding = encoding;\n if (!ts.transforming) {\n var rs = this._readableState;\n if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);\n }\n};\n\n// Doesn't matter what the args are here.\n// _transform does all the work.\n// That we got here means that the readable side wants more data.\nTransform.prototype._read = function (n) {\n var ts = this._transformState;\n if (ts.writechunk !== null && !ts.transforming) {\n ts.transforming = true;\n this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);\n } else {\n // mark that we need a transform, so that any data that comes in\n // will get processed, now that we've asked for it.\n ts.needTransform = true;\n }\n};\nTransform.prototype._destroy = function (err, cb) {\n Duplex.prototype._destroy.call(this, err, function (err2) {\n cb(err2);\n });\n};\nfunction done(stream, er, data) {\n if (er) return stream.emit('error', er);\n if (data != null)\n // single equals check for both `null` and `undefined`\n stream.push(data);\n\n // TODO(BridgeAR): Write a test for these two error cases\n // if there's nothing in the write buffer, then that means\n // that nothing more will ever be provided\n if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0();\n if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING();\n return stream.push(null);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYwNS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLGFBQWE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViO0FBQ0EscUJBQXFCLDBDQUEwQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsbUJBQU8sQ0FBQyxJQUFrQjtBQUN2QyxtQkFBTyxDQUFDLElBQVU7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzPzI3YmYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgdHJhbnNmb3JtIHN0cmVhbSBpcyBhIHJlYWRhYmxlL3dyaXRhYmxlIHN0cmVhbSB3aGVyZSB5b3UgZG9cbi8vIHNvbWV0aGluZyB3aXRoIHRoZSBkYXRhLiAgU29tZXRpbWVzIGl0J3MgY2FsbGVkIGEgXCJmaWx0ZXJcIixcbi8vIGJ1dCB0aGF0J3Mgbm90IGEgZ3JlYXQgbmFtZSBmb3IgaXQsIHNpbmNlIHRoYXQgaW1wbGllcyBhIHRoaW5nIHdoZXJlXG4vLyBzb21lIGJpdHMgcGFzcyB0aHJvdWdoLCBhbmQgb3RoZXJzIGFyZSBzaW1wbHkgaWdub3JlZC4gIChUaGF0IHdvdWxkXG4vLyBiZSBhIHZhbGlkIGV4YW1wbGUgb2YgYSB0cmFuc2Zvcm0sIG9mIGNvdXJzZS4pXG4vL1xuLy8gV2hpbGUgdGhlIG91dHB1dCBpcyBjYXVzYWxseSByZWxhdGVkIHRvIHRoZSBpbnB1dCwgaXQncyBub3QgYVxuLy8gbmVjZXNzYXJpbHkgc3ltbWV0cmljIG9yIHN5bmNocm9ub3VzIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsXG4vLyBhIHpsaWIgc3RyZWFtIG1pZ2h0IHRha2UgbXVsdGlwbGUgcGxhaW4tdGV4dCB3cml0ZXMoKSwgYW5kIHRoZW5cbi8vIGVtaXQgYSBzaW5nbGUgY29tcHJlc3NlZCBjaHVuayBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZS5cbi8vXG4vLyBIZXJlJ3MgaG93IHRoaXMgd29ya3M6XG4vL1xuLy8gVGhlIFRyYW5zZm9ybSBzdHJlYW0gaGFzIGFsbCB0aGUgYXNwZWN0cyBvZiB0aGUgcmVhZGFibGUgYW5kIHdyaXRhYmxlXG4vLyBzdHJlYW0gY2xhc3Nlcy4gIFdoZW4geW91IHdyaXRlKGNodW5rKSwgdGhhdCBjYWxscyBfd3JpdGUoY2h1bmssY2IpXG4vLyBpbnRlcm5hbGx5LCBhbmQgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSdzIGEgbG90IG9mIHBlbmRpbmcgd3JpdGVzXG4vLyBidWZmZXJlZCB1cC4gIFdoZW4geW91IGNhbGwgcmVhZCgpLCB0aGF0IGNhbGxzIF9yZWFkKG4pIHVudGlsXG4vLyB0aGVyZSdzIGVub3VnaCBwZW5kaW5nIHJlYWRhYmxlIGRhdGEgYnVmZmVyZWQgdXAuXG4vL1xuLy8gSW4gYSB0cmFuc2Zvcm0gc3RyZWFtLCB0aGUgd3JpdHRlbiBkYXRhIGlzIHBsYWNlZCBpbiBhIGJ1ZmZlci4gIFdoZW5cbi8vIF9yZWFkKG4pIGlzIGNhbGxlZCwgaXQgdHJhbnNmb3JtcyB0aGUgcXVldWVkIHVwIGRhdGEsIGNhbGxpbmcgdGhlXG4vLyBidWZmZXJlZCBfd3JpdGUgY2IncyBhcyBpdCBjb25zdW1lcyBjaHVua3MuICBJZiBjb25zdW1pbmcgYSBzaW5nbGVcbi8vIHdyaXR0ZW4gY2h1bmsgd291bGQgcmVzdWx0IGluIG11bHRpcGxlIG91dHB1dCBjaHVua3MsIHRoZW4gdGhlIGZpcnN0XG4vLyBvdXRwdXR0ZWQgYml0IGNhbGxzIHRoZSByZWFkY2IsIGFuZCBzdWJzZXF1ZW50IGNodW5rcyBqdXN0IGdvIGludG9cbi8vIHRoZSByZWFkIGJ1ZmZlciwgYW5kIHdpbGwgY2F1c2UgaXQgdG8gZW1pdCAncmVhZGFibGUnIGlmIG5lY2Vzc2FyeS5cbi8vXG4vLyBUaGlzIHdheSwgYmFjay1wcmVzc3VyZSBpcyBhY3R1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSByZWFkaW5nIHNpZGUsXG4vLyBzaW5jZSBfcmVhZCBoYXMgdG8gYmUgY2FsbGVkIHRvIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgY2h1bmsuICBIb3dldmVyLFxuLy8gYSBwYXRob2xvZ2ljYWwgaW5mbGF0ZSB0eXBlIG9mIHRyYW5zZm9ybSBjYW4gY2F1c2UgZXhjZXNzaXZlIGJ1ZmZlcmluZ1xuLy8gaGVyZS4gIEZvciBleGFtcGxlLCBpbWFnaW5lIGEgc3RyZWFtIHdoZXJlIGV2ZXJ5IGJ5dGUgb2YgaW5wdXQgaXNcbi8vIGludGVycHJldGVkIGFzIGFuIGludGVnZXIgZnJvbSAwLTI1NSwgYW5kIHRoZW4gcmVzdWx0cyBpbiB0aGF0IG1hbnlcbi8vIGJ5dGVzIG9mIG91dHB1dC4gIFdyaXRpbmcgdGhlIDQgYnl0ZXMge2ZmLGZmLGZmLGZmfSB3b3VsZCByZXN1bHQgaW5cbi8vIDFrYiBvZiBkYXRhIGJlaW5nIG91dHB1dC4gIEluIHRoaXMgY2FzZSwgeW91IGNvdWxkIHdyaXRlIGEgdmVyeSBzbWFsbFxuLy8gYW1vdW50IG9mIGlucHV0LCBhbmQgZW5kIHVwIHdpdGggYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBvdXRwdXQuICBJblxuLy8gc3VjaCBhIHBhdGhvbG9naWNhbCBpbmZsYXRpbmcgbWVjaGFuaXNtLCB0aGVyZSdkIGJlIG5vIHdheSB0byB0ZWxsXG4vLyB0aGUgc3lzdGVtIHRvIHN0b3AgZG9pbmcgdGhlIHRyYW5zZm9ybS4gIEEgc2luZ2xlIDRNQiB3cml0ZSBjb3VsZFxuLy8gY2F1c2UgdGhlIHN5c3RlbSB0byBydW4gb3V0IG9mIG1lbW9yeS5cbi8vXG4vLyBIb3dldmVyLCBldmVuIGluIHN1Y2ggYSBwYXRob2xvZ2ljYWwgY2FzZSwgb25seSBhIHNpbmdsZSB3cml0dGVuIGNodW5rXG4vLyB3b3VsZCBiZSBjb25zdW1lZCwgYW5kIHRoZW4gdGhlIHJlc3Qgd291bGQgd2FpdCAodW4tdHJhbnNmb3JtZWQpIHVudGlsXG4vLyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgdHJhbnNmb3JtZWQgY2h1bmsgd2VyZSBjb25zdW1lZC5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcbnZhciBfcmVxdWlyZSRjb2RlcyA9IHJlcXVpcmUoJy4uL2Vycm9ycycpLmNvZGVzLFxuICBFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCA9IF9yZXF1aXJlJGNvZGVzLkVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVELFxuICBFUlJfTVVMVElQTEVfQ0FMTEJBQ0sgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfTVVMVElQTEVfQ0FMTEJBQ0ssXG4gIEVSUl9UUkFOU0ZPUk1fQUxSRUFEWV9UUkFOU0ZPUk1JTkcgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfVFJBTlNGT1JNX0FMUkVBRFlfVFJBTlNGT1JNSU5HLFxuICBFUlJfVFJBTlNGT1JNX1dJVEhfTEVOR1RIXzAgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfVFJBTlNGT1JNX1dJVEhfTEVOR1RIXzA7XG52YXIgRHVwbGV4ID0gcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xucmVxdWlyZSgnaW5oZXJpdHMnKShUcmFuc2Zvcm0sIER1cGxleCk7XG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShlciwgZGF0YSkge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG4gIGlmIChjYiA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVSUl9NVUxUSVBMRV9DQUxMQkFDSygpKTtcbiAgfVxuICB0cy53cml0ZWNodW5rID0gbnVsbDtcbiAgdHMud3JpdGVjYiA9IG51bGw7XG4gIGlmIChkYXRhICE9IG51bGwpXG4gICAgLy8gc2luZ2xlIGVxdWFscyBjaGVjayBmb3IgYm90aCBgbnVsbGAgYW5kIGB1bmRlZmluZWRgXG4gICAgdGhpcy5wdXNoKGRhdGEpO1xuICBjYihlcik7XG4gIHZhciBycyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHJzLnJlYWRpbmcgPSBmYWxzZTtcbiAgaWYgKHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgdGhpcy5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufVxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuICBEdXBsZXguY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUgPSB7XG4gICAgYWZ0ZXJUcmFuc2Zvcm06IGFmdGVyVHJhbnNmb3JtLmJpbmQodGhpcyksXG4gICAgbmVlZFRyYW5zZm9ybTogZmFsc2UsXG4gICAgdHJhbnNmb3JtaW5nOiBmYWxzZSxcbiAgICB3cml0ZWNiOiBudWxsLFxuICAgIHdyaXRlY2h1bms6IG51bGwsXG4gICAgd3JpdGVlbmNvZGluZzogbnVsbFxuICB9O1xuXG4gIC8vIHN0YXJ0IG91dCBhc2tpbmcgZm9yIGEgcmVhZGFibGUgZXZlbnQgb25jZSBkYXRhIGlzIHRyYW5zZm9ybWVkLlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG5cbiAgLy8gd2UgaGF2ZSBpbXBsZW1lbnRlZCB0aGUgX3JlYWQgbWV0aG9kLCBhbmQgZG9uZSB0aGUgb3RoZXIgdGhpbmdzXG4gIC8vIHRoYXQgUmVhZGFibGUgd2FudHMgYmVmb3JlIHRoZSBmaXJzdCBfcmVhZCBjYWxsLCBzbyB1bnNldCB0aGVcbiAgLy8gc3luYyBndWFyZCBmbGFnLlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmMgPSBmYWxzZTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB0aGlzLl90cmFuc2Zvcm0gPSBvcHRpb25zLnRyYW5zZm9ybTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoID0gb3B0aW9ucy5mbHVzaDtcbiAgfVxuXG4gIC8vIFdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZmluaXNoZXMsIHRoZW4gZmx1c2ggb3V0IGFueXRoaW5nIHJlbWFpbmluZy5cbiAgdGhpcy5vbigncHJlZmluaXNoJywgcHJlZmluaXNoKTtcbn1cbmZ1bmN0aW9uIHByZWZpbmlzaCgpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcbiAgaWYgKHR5cGVvZiB0aGlzLl9mbHVzaCA9PT0gJ2Z1bmN0aW9uJyAmJiAhdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQpIHtcbiAgICB0aGlzLl9mbHVzaChmdW5jdGlvbiAoZXIsIGRhdGEpIHtcbiAgICAgIGRvbmUoX3RoaXMsIGVyLCBkYXRhKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBkb25lKHRoaXMsIG51bGwsIG51bGwpO1xuICB9XG59XG5UcmFuc2Zvcm0ucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm0gPSBmYWxzZTtcbiAgcmV0dXJuIER1cGxleC5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIGNodW5rLCBlbmNvZGluZyk7XG59O1xuXG4vLyBUaGlzIGlzIHRoZSBwYXJ0IHdoZXJlIHlvdSBkbyBzdHVmZiFcbi8vIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gaW4gaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vICdjaHVuaycgaXMgYW4gaW5wdXQgY2h1bmsuXG4vL1xuLy8gQ2FsbCBgcHVzaChuZXdDaHVuaylgIHRvIHBhc3MgYWxvbmcgdHJhbnNmb3JtZWQgb3V0cHV0XG4vLyB0byB0aGUgcmVhZGFibGUgc2lkZS4gIFlvdSBtYXkgY2FsbCAncHVzaCcgemVybyBvciBtb3JlIHRpbWVzLlxuLy9cbi8vIENhbGwgYGNiKGVycilgIHdoZW4geW91IGFyZSBkb25lIHdpdGggdGhpcyBjaHVuay4gIElmIHlvdSBwYXNzXG4vLyBhbiBlcnJvciwgdGhlbiB0aGF0J2xsIHB1dCB0aGUgaHVydCBvbiB0aGUgd2hvbGUgb3BlcmF0aW9uLiAgSWYgeW91XG4vLyBuZXZlciBjYWxsIGNiKCksIHRoZW4geW91J2xsIG5ldmVyIGdldCBhbm90aGVyIGNodW5rLlxuVHJhbnNmb3JtLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobmV3IEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEKCdfdHJhbnNmb3JtKCknKSk7XG59O1xuVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMud3JpdGVjYiA9IGNiO1xuICB0cy53cml0ZWNodW5rID0gY2h1bms7XG4gIHRzLndyaXRlZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgaWYgKCF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICh0cy5uZWVkVHJhbnNmb3JtIHx8IHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59O1xuXG4vLyBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBhcmdzIGFyZSBoZXJlLlxuLy8gX3RyYW5zZm9ybSBkb2VzIGFsbCB0aGUgd29yay5cbi8vIFRoYXQgd2UgZ290IGhlcmUgbWVhbnMgdGhhdCB0aGUgcmVhZGFibGUgc2lkZSB3YW50cyBtb3JlIGRhdGEuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG4gIGlmICh0cy53cml0ZWNodW5rICE9PSBudWxsICYmICF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB0cy50cmFuc2Zvcm1pbmcgPSB0cnVlO1xuICAgIHRoaXMuX3RyYW5zZm9ybSh0cy53cml0ZWNodW5rLCB0cy53cml0ZWVuY29kaW5nLCB0cy5hZnRlclRyYW5zZm9ybSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbWFyayB0aGF0IHdlIG5lZWQgYSB0cmFuc2Zvcm0sIHNvIHRoYXQgYW55IGRhdGEgdGhhdCBjb21lcyBpblxuICAgIC8vIHdpbGwgZ2V0IHByb2Nlc3NlZCwgbm93IHRoYXQgd2UndmUgYXNrZWQgZm9yIGl0LlxuICAgIHRzLm5lZWRUcmFuc2Zvcm0gPSB0cnVlO1xuICB9XG59O1xuVHJhbnNmb3JtLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIER1cGxleC5wcm90b3R5cGUuX2Rlc3Ryb3kuY2FsbCh0aGlzLCBlcnIsIGZ1bmN0aW9uIChlcnIyKSB7XG4gICAgY2IoZXJyMik7XG4gIH0pO1xufTtcbmZ1bmN0aW9uIGRvbmUoc3RyZWFtLCBlciwgZGF0YSkge1xuICBpZiAoZXIpIHJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIGlmIChkYXRhICE9IG51bGwpXG4gICAgLy8gc2luZ2xlIGVxdWFscyBjaGVjayBmb3IgYm90aCBgbnVsbGAgYW5kIGB1bmRlZmluZWRgXG4gICAgc3RyZWFtLnB1c2goZGF0YSk7XG5cbiAgLy8gVE9ETyhCcmlkZ2VBUik6IFdyaXRlIGEgdGVzdCBmb3IgdGhlc2UgdHdvIGVycm9yIGNhc2VzXG4gIC8vIGlmIHRoZXJlJ3Mgbm90aGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyLCB0aGVuIHRoYXQgbWVhbnNcbiAgLy8gdGhhdCBub3RoaW5nIG1vcmUgd2lsbCBldmVyIGJlIHByb3ZpZGVkXG4gIGlmIChzdHJlYW0uX3dyaXRhYmxlU3RhdGUubGVuZ3RoKSB0aHJvdyBuZXcgRVJSX1RSQU5TRk9STV9XSVRIX0xFTkdUSF8wKCk7XG4gIGlmIChzdHJlYW0uX3RyYW5zZm9ybVN0YXRlLnRyYW5zZm9ybWluZykgdGhyb3cgbmV3IEVSUl9UUkFOU0ZPUk1fQUxSRUFEWV9UUkFOU0ZPUk1JTkcoKTtcbiAgcmV0dXJuIHN0cmVhbS5wdXNoKG51bGwpO1xufSJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4605\n")},4229:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// A bit simpler than readable streams.\n// Implement an async ._write(chunk, encoding, cb), and it'll handle all\n// the drain event emission and buffering.\n\n\n\nmodule.exports = Writable;\n\n/* */\nfunction WriteReq(chunk, encoding, cb) {\n this.chunk = chunk;\n this.encoding = encoding;\n this.callback = cb;\n this.next = null;\n}\n\n// It seems a linked list but it is not\n// there will be only 2 of these for each stream\nfunction CorkedRequest(state) {\n var _this = this;\n this.next = null;\n this.entry = null;\n this.finish = function () {\n onCorkedFinish(_this, state);\n };\n}\n/* */\n\n/**/\nvar Duplex;\n/**/\n\nWritable.WritableState = WritableState;\n\n/**/\nvar internalUtil = {\n deprecate: __webpack_require__(1159)\n};\n/**/\n\n/**/\nvar Stream = __webpack_require__(2238);\n/**/\n\nvar Buffer = (__webpack_require__(4300).Buffer);\nvar OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};\nfunction _uint8ArrayToBuffer(chunk) {\n return Buffer.from(chunk);\n}\nfunction _isUint8Array(obj) {\n return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\nvar destroyImpl = __webpack_require__(1195);\nvar _require = __webpack_require__(2457),\n getHighWaterMark = _require.getHighWaterMark;\nvar _require$codes = (__webpack_require__(4012)/* .codes */ .q),\n ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,\n ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,\n ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,\n ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE,\n ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED,\n ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES,\n ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END,\n ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING;\nvar errorOrDestroy = destroyImpl.errorOrDestroy;\n__webpack_require__(4378)(Writable, Stream);\nfunction nop() {}\nfunction WritableState(options, stream, isDuplex) {\n Duplex = Duplex || __webpack_require__(6753);\n options = options || {};\n\n // Duplex streams are both readable and writable, but share\n // the same options object.\n // However, some cases require setting options to different\n // values for the readable and the writable sides of the duplex stream,\n // e.g. options.readableObjectMode vs. options.writableObjectMode, etc.\n if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex;\n\n // object stream flag to indicate whether or not this stream\n // contains buffers or objects.\n this.objectMode = !!options.objectMode;\n if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;\n\n // the point at which write() starts returning false\n // Note: 0 is a valid value, means that we always return false if\n // the entire buffer is not flushed immediately on write()\n this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex);\n\n // if _final has been called\n this.finalCalled = false;\n\n // drain event flag.\n this.needDrain = false;\n // at the start of calling end()\n this.ending = false;\n // when end() has been called, and returned\n this.ended = false;\n // when 'finish' is emitted\n this.finished = false;\n\n // has it been destroyed\n this.destroyed = false;\n\n // should we decode strings into buffers before passing to _write?\n // this is here so that some node-core streams can optimize string\n // handling at a lower level.\n var noDecode = options.decodeStrings === false;\n this.decodeStrings = !noDecode;\n\n // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n // not an actual buffer we keep track of, but a measurement\n // of how much we're waiting to get pushed to some underlying\n // socket or file.\n this.length = 0;\n\n // a flag to see when we're in the middle of a write.\n this.writing = false;\n\n // when true all writes will be buffered until .uncork() call\n this.corked = 0;\n\n // a flag to be able to tell if the onwrite cb is called immediately,\n // or on a later tick. We set this to true at first, because any\n // actions that shouldn't happen until \"later\" should generally also\n // not happen before the first write call.\n this.sync = true;\n\n // a flag to know if we're processing previously buffered items, which\n // may call the _write() callback in the same tick, so that we don't\n // end up in an overlapped onwrite situation.\n this.bufferProcessing = false;\n\n // the callback that's passed to _write(chunk,cb)\n this.onwrite = function (er) {\n onwrite(stream, er);\n };\n\n // the callback that the user supplies to write(chunk,encoding,cb)\n this.writecb = null;\n\n // the amount that is being written when _write is called.\n this.writelen = 0;\n this.bufferedRequest = null;\n this.lastBufferedRequest = null;\n\n // number of pending user-supplied write callbacks\n // this must be 0 before 'finish' can be emitted\n this.pendingcb = 0;\n\n // emit prefinish if the only thing we're waiting for is _write cbs\n // This is relevant for synchronous Transform streams\n this.prefinished = false;\n\n // True if the error was already emitted and should not be thrown again\n this.errorEmitted = false;\n\n // Should close be emitted on destroy. Defaults to true.\n this.emitClose = options.emitClose !== false;\n\n // Should .destroy() be called after 'finish' (and potentially 'end')\n this.autoDestroy = !!options.autoDestroy;\n\n // count buffered requests\n this.bufferedRequestCount = 0;\n\n // allocate the first CorkedRequest, there is always\n // one allocated and free to use, and we maintain at most two\n this.corkedRequestsFree = new CorkedRequest(this);\n}\nWritableState.prototype.getBuffer = function getBuffer() {\n var current = this.bufferedRequest;\n var out = [];\n while (current) {\n out.push(current);\n current = current.next;\n }\n return out;\n};\n(function () {\n try {\n Object.defineProperty(WritableState.prototype, 'buffer', {\n get: internalUtil.deprecate(function writableStateBufferGetter() {\n return this.getBuffer();\n }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')\n });\n } catch (_) {}\n})();\n\n// Test _writableState for inheritance to account for Duplex streams,\n// whose prototype chain only points to Readable.\nvar realHasInstance;\nif (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {\n realHasInstance = Function.prototype[Symbol.hasInstance];\n Object.defineProperty(Writable, Symbol.hasInstance, {\n value: function value(object) {\n if (realHasInstance.call(this, object)) return true;\n if (this !== Writable) return false;\n return object && object._writableState instanceof WritableState;\n }\n });\n} else {\n realHasInstance = function realHasInstance(object) {\n return object instanceof this;\n };\n}\nfunction Writable(options) {\n Duplex = Duplex || __webpack_require__(6753);\n\n // Writable ctor is applied to Duplexes, too.\n // `realHasInstance` is necessary because using plain `instanceof`\n // would return false, as no `_writableState` property is attached.\n\n // Trying to use the custom `instanceof` for Writable here will also break the\n // Node.js LazyTransform implementation, which has a non-trivial getter for\n // `_writableState` that would lead to infinite recursion.\n\n // Checking for a Stream.Duplex instance is faster here instead of inside\n // the WritableState constructor, at least with V8 6.5\n var isDuplex = this instanceof Duplex;\n if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options);\n this._writableState = new WritableState(options, this, isDuplex);\n\n // legacy.\n this.writable = true;\n if (options) {\n if (typeof options.write === 'function') this._write = options.write;\n if (typeof options.writev === 'function') this._writev = options.writev;\n if (typeof options.destroy === 'function') this._destroy = options.destroy;\n if (typeof options.final === 'function') this._final = options.final;\n }\n Stream.call(this);\n}\n\n// Otherwise people can pipe Writable streams, which is just wrong.\nWritable.prototype.pipe = function () {\n errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE());\n};\nfunction writeAfterEnd(stream, cb) {\n var er = new ERR_STREAM_WRITE_AFTER_END();\n // TODO: defer error events consistently everywhere, not just the cb\n errorOrDestroy(stream, er);\n process.nextTick(cb, er);\n}\n\n// Checks that a user-supplied chunk is valid, especially for the particular\n// mode the stream is in. Currently this means that `null` is never accepted\n// and undefined/non-string values are only allowed in object mode.\nfunction validChunk(stream, state, chunk, cb) {\n var er;\n if (chunk === null) {\n er = new ERR_STREAM_NULL_VALUES();\n } else if (typeof chunk !== 'string' && !state.objectMode) {\n er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk);\n }\n if (er) {\n errorOrDestroy(stream, er);\n process.nextTick(cb, er);\n return false;\n }\n return true;\n}\nWritable.prototype.write = function (chunk, encoding, cb) {\n var state = this._writableState;\n var ret = false;\n var isBuf = !state.objectMode && _isUint8Array(chunk);\n if (isBuf && !Buffer.isBuffer(chunk)) {\n chunk = _uint8ArrayToBuffer(chunk);\n }\n if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;\n if (typeof cb !== 'function') cb = nop;\n if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {\n state.pendingcb++;\n ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);\n }\n return ret;\n};\nWritable.prototype.cork = function () {\n this._writableState.corked++;\n};\nWritable.prototype.uncork = function () {\n var state = this._writableState;\n if (state.corked) {\n state.corked--;\n if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);\n }\n};\nWritable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {\n // node::ParseEncoding() requires lower case.\n if (typeof encoding === 'string') encoding = encoding.toLowerCase();\n if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding);\n this._writableState.defaultEncoding = encoding;\n return this;\n};\nObject.defineProperty(Writable.prototype, 'writableBuffer', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._writableState && this._writableState.getBuffer();\n }\n});\nfunction decodeChunk(state, chunk, encoding) {\n if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n return chunk;\n}\nObject.defineProperty(Writable.prototype, 'writableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._writableState.highWaterMark;\n }\n});\n\n// if we're already writing something, then just put this\n// in the queue, and wait our turn. Otherwise, call _write\n// If we return false, then we need a drain event, so set that flag.\nfunction writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {\n if (!isBuf) {\n var newChunk = decodeChunk(state, chunk, encoding);\n if (chunk !== newChunk) {\n isBuf = true;\n encoding = 'buffer';\n chunk = newChunk;\n }\n }\n var len = state.objectMode ? 1 : chunk.length;\n state.length += len;\n var ret = state.length < state.highWaterMark;\n // we must ensure that previous needDrain will not be reset to false.\n if (!ret) state.needDrain = true;\n if (state.writing || state.corked) {\n var last = state.lastBufferedRequest;\n state.lastBufferedRequest = {\n chunk: chunk,\n encoding: encoding,\n isBuf: isBuf,\n callback: cb,\n next: null\n };\n if (last) {\n last.next = state.lastBufferedRequest;\n } else {\n state.bufferedRequest = state.lastBufferedRequest;\n }\n state.bufferedRequestCount += 1;\n } else {\n doWrite(stream, state, false, len, chunk, encoding, cb);\n }\n return ret;\n}\nfunction doWrite(stream, state, writev, len, chunk, encoding, cb) {\n state.writelen = len;\n state.writecb = cb;\n state.writing = true;\n state.sync = true;\n if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);\n state.sync = false;\n}\nfunction onwriteError(stream, state, sync, er, cb) {\n --state.pendingcb;\n if (sync) {\n // defer the callback if we are being called synchronously\n // to avoid piling up things on the stack\n process.nextTick(cb, er);\n // this can emit finish, and it will always happen\n // after error\n process.nextTick(finishMaybe, stream, state);\n stream._writableState.errorEmitted = true;\n errorOrDestroy(stream, er);\n } else {\n // the caller expect this to happen before if\n // it is async\n cb(er);\n stream._writableState.errorEmitted = true;\n errorOrDestroy(stream, er);\n // this can emit finish, but finish must\n // always follow error\n finishMaybe(stream, state);\n }\n}\nfunction onwriteStateUpdate(state) {\n state.writing = false;\n state.writecb = null;\n state.length -= state.writelen;\n state.writelen = 0;\n}\nfunction onwrite(stream, er) {\n var state = stream._writableState;\n var sync = state.sync;\n var cb = state.writecb;\n if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK();\n onwriteStateUpdate(state);\n if (er) onwriteError(stream, state, sync, er, cb);else {\n // Check if we're actually ready to finish, but don't emit yet\n var finished = needFinish(state) || stream.destroyed;\n if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {\n clearBuffer(stream, state);\n }\n if (sync) {\n process.nextTick(afterWrite, stream, state, finished, cb);\n } else {\n afterWrite(stream, state, finished, cb);\n }\n }\n}\nfunction afterWrite(stream, state, finished, cb) {\n if (!finished) onwriteDrain(stream, state);\n state.pendingcb--;\n cb();\n finishMaybe(stream, state);\n}\n\n// Must force callback to be called on nextTick, so that we don't\n// emit 'drain' before the write() consumer gets the 'false' return\n// value, and has a chance to attach a 'drain' listener.\nfunction onwriteDrain(stream, state) {\n if (state.length === 0 && state.needDrain) {\n state.needDrain = false;\n stream.emit('drain');\n }\n}\n\n// if there's something in the buffer waiting, then process it\nfunction clearBuffer(stream, state) {\n state.bufferProcessing = true;\n var entry = state.bufferedRequest;\n if (stream._writev && entry && entry.next) {\n // Fast case, write everything using _writev()\n var l = state.bufferedRequestCount;\n var buffer = new Array(l);\n var holder = state.corkedRequestsFree;\n holder.entry = entry;\n var count = 0;\n var allBuffers = true;\n while (entry) {\n buffer[count] = entry;\n if (!entry.isBuf) allBuffers = false;\n entry = entry.next;\n count += 1;\n }\n buffer.allBuffers = allBuffers;\n doWrite(stream, state, true, state.length, buffer, '', holder.finish);\n\n // doWrite is almost always async, defer these to save a bit of time\n // as the hot path ends with doWrite\n state.pendingcb++;\n state.lastBufferedRequest = null;\n if (holder.next) {\n state.corkedRequestsFree = holder.next;\n holder.next = null;\n } else {\n state.corkedRequestsFree = new CorkedRequest(state);\n }\n state.bufferedRequestCount = 0;\n } else {\n // Slow case, write chunks one-by-one\n while (entry) {\n var chunk = entry.chunk;\n var encoding = entry.encoding;\n var cb = entry.callback;\n var len = state.objectMode ? 1 : chunk.length;\n doWrite(stream, state, false, len, chunk, encoding, cb);\n entry = entry.next;\n state.bufferedRequestCount--;\n // if we didn't call the onwrite immediately, then\n // it means that we need to wait until it does.\n // also, that means that the chunk and cb are currently\n // being processed, so move the buffer counter past them.\n if (state.writing) {\n break;\n }\n }\n if (entry === null) state.lastBufferedRequest = null;\n }\n state.bufferedRequest = entry;\n state.bufferProcessing = false;\n}\nWritable.prototype._write = function (chunk, encoding, cb) {\n cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()'));\n};\nWritable.prototype._writev = null;\nWritable.prototype.end = function (chunk, encoding, cb) {\n var state = this._writableState;\n if (typeof chunk === 'function') {\n cb = chunk;\n chunk = null;\n encoding = null;\n } else if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);\n\n // .end() fully uncorks\n if (state.corked) {\n state.corked = 1;\n this.uncork();\n }\n\n // ignore unnecessary end() calls.\n if (!state.ending) endWritable(this, state, cb);\n return this;\n};\nObject.defineProperty(Writable.prototype, 'writableLength', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._writableState.length;\n }\n});\nfunction needFinish(state) {\n return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;\n}\nfunction callFinal(stream, state) {\n stream._final(function (err) {\n state.pendingcb--;\n if (err) {\n errorOrDestroy(stream, err);\n }\n state.prefinished = true;\n stream.emit('prefinish');\n finishMaybe(stream, state);\n });\n}\nfunction prefinish(stream, state) {\n if (!state.prefinished && !state.finalCalled) {\n if (typeof stream._final === 'function' && !state.destroyed) {\n state.pendingcb++;\n state.finalCalled = true;\n process.nextTick(callFinal, stream, state);\n } else {\n state.prefinished = true;\n stream.emit('prefinish');\n }\n }\n}\nfunction finishMaybe(stream, state) {\n var need = needFinish(state);\n if (need) {\n prefinish(stream, state);\n if (state.pendingcb === 0) {\n state.finished = true;\n stream.emit('finish');\n if (state.autoDestroy) {\n // In case of duplex streams we need a way to detect\n // if the readable side is ready for autoDestroy as well\n var rState = stream._readableState;\n if (!rState || rState.autoDestroy && rState.endEmitted) {\n stream.destroy();\n }\n }\n }\n }\n return need;\n}\nfunction endWritable(stream, state, cb) {\n state.ending = true;\n finishMaybe(stream, state);\n if (cb) {\n if (state.finished) process.nextTick(cb);else stream.once('finish', cb);\n }\n state.ended = true;\n stream.writable = false;\n}\nfunction onCorkedFinish(corkReq, state, err) {\n var entry = corkReq.entry;\n corkReq.entry = null;\n while (entry) {\n var cb = entry.callback;\n state.pendingcb--;\n cb(err);\n entry = entry.next;\n }\n\n // reuse the free corkReq.\n state.corkedRequestsFree.next = corkReq;\n}\nObject.defineProperty(Writable.prototype, 'destroyed', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n if (this._writableState === undefined) {\n return false;\n }\n return this._writableState.destroyed;\n },\n set: function set(value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (!this._writableState) {\n return;\n }\n\n // backward compatibility, the user is explicitly\n // managing destroyed\n this._writableState.destroyed = value;\n }\n});\nWritable.prototype.destroy = destroyImpl.destroy;\nWritable.prototype._undestroy = destroyImpl.undestroy;\nWritable.prototype._destroy = function (err, cb) {\n cb(err);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0Usc0RBQXNEO0FBQzlIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qcz9kYzE0Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBBIGJpdCBzaW1wbGVyIHRoYW4gcmVhZGFibGUgc3RyZWFtcy5cbi8vIEltcGxlbWVudCBhbiBhc3luYyAuX3dyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpLCBhbmQgaXQnbGwgaGFuZGxlIGFsbFxuLy8gdGhlIGRyYWluIGV2ZW50IGVtaXNzaW9uIGFuZCBidWZmZXJpbmcuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBXcml0YWJsZTtcblxuLyogPHJlcGxhY2VtZW50PiAqL1xuZnVuY3Rpb24gV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aGlzLmNodW5rID0gY2h1bms7XG4gIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgdGhpcy5jYWxsYmFjayA9IGNiO1xuICB0aGlzLm5leHQgPSBudWxsO1xufVxuXG4vLyBJdCBzZWVtcyBhIGxpbmtlZCBsaXN0IGJ1dCBpdCBpcyBub3Rcbi8vIHRoZXJlIHdpbGwgYmUgb25seSAyIG9mIHRoZXNlIGZvciBlYWNoIHN0cmVhbVxuZnVuY3Rpb24gQ29ya2VkUmVxdWVzdChzdGF0ZSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICB0aGlzLm5leHQgPSBudWxsO1xuICB0aGlzLmVudHJ5ID0gbnVsbDtcbiAgdGhpcy5maW5pc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgb25Db3JrZWRGaW5pc2goX3RoaXMsIHN0YXRlKTtcbiAgfTtcbn1cbi8qIDwvcmVwbGFjZW1lbnQ+ICovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRHVwbGV4O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbldyaXRhYmxlLldyaXRhYmxlU3RhdGUgPSBXcml0YWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGludGVybmFsVXRpbCA9IHtcbiAgZGVwcmVjYXRlOiByZXF1aXJlKCd1dGlsLWRlcHJlY2F0ZScpXG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG52YXIgT3VyVWludDhBcnJheSA9ICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9KS5VaW50OEFycmF5IHx8IGZ1bmN0aW9uICgpIHt9O1xuZnVuY3Rpb24gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuaykge1xuICByZXR1cm4gQnVmZmVyLmZyb20oY2h1bmspO1xufVxuZnVuY3Rpb24gX2lzVWludDhBcnJheShvYmopIHtcbiAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihvYmopIHx8IG9iaiBpbnN0YW5jZW9mIE91clVpbnQ4QXJyYXk7XG59XG52YXIgZGVzdHJveUltcGwgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveScpO1xudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3N0YXRlJyksXG4gIGdldEhpZ2hXYXRlck1hcmsgPSBfcmVxdWlyZS5nZXRIaWdoV2F0ZXJNYXJrO1xudmFyIF9yZXF1aXJlJGNvZGVzID0gcmVxdWlyZSgnLi4vZXJyb3JzJykuY29kZXMsXG4gIEVSUl9JTlZBTElEX0FSR19UWVBFID0gX3JlcXVpcmUkY29kZXMuRVJSX0lOVkFMSURfQVJHX1RZUEUsXG4gIEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEID0gX3JlcXVpcmUkY29kZXMuRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsXG4gIEVSUl9NVUxUSVBMRV9DQUxMQkFDSyA9IF9yZXF1aXJlJGNvZGVzLkVSUl9NVUxUSVBMRV9DQUxMQkFDSyxcbiAgRVJSX1NUUkVBTV9DQU5OT1RfUElQRSA9IF9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fQ0FOTk9UX1BJUEUsXG4gIEVSUl9TVFJFQU1fREVTVFJPWUVEID0gX3JlcXVpcmUkY29kZXMuRVJSX1NUUkVBTV9ERVNUUk9ZRUQsXG4gIEVSUl9TVFJFQU1fTlVMTF9WQUxVRVMgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfU1RSRUFNX05VTExfVkFMVUVTLFxuICBFUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORCA9IF9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5ELFxuICBFUlJfVU5LTk9XTl9FTkNPRElORyA9IF9yZXF1aXJlJGNvZGVzLkVSUl9VTktOT1dOX0VOQ09ESU5HO1xudmFyIGVycm9yT3JEZXN0cm95ID0gZGVzdHJveUltcGwuZXJyb3JPckRlc3Ryb3k7XG5yZXF1aXJlKCdpbmhlcml0cycpKFdyaXRhYmxlLCBTdHJlYW0pO1xuZnVuY3Rpb24gbm9wKCkge31cbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtLCBpc0R1cGxleCkge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBEdXBsZXggc3RyZWFtcyBhcmUgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUsIGJ1dCBzaGFyZVxuICAvLyB0aGUgc2FtZSBvcHRpb25zIG9iamVjdC5cbiAgLy8gSG93ZXZlciwgc29tZSBjYXNlcyByZXF1aXJlIHNldHRpbmcgb3B0aW9ucyB0byBkaWZmZXJlbnRcbiAgLy8gdmFsdWVzIGZvciB0aGUgcmVhZGFibGUgYW5kIHRoZSB3cml0YWJsZSBzaWRlcyBvZiB0aGUgZHVwbGV4IHN0cmVhbSxcbiAgLy8gZS5nLiBvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZSB2cy4gb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGUsIGV0Yy5cbiAgaWYgKHR5cGVvZiBpc0R1cGxleCAhPT0gJ2Jvb2xlYW4nKSBpc0R1cGxleCA9IHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleDtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBzdHJlYW1cbiAgLy8gY29udGFpbnMgYnVmZmVycyBvciBvYmplY3RzLlxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcbiAgaWYgKGlzRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggd3JpdGUoKSBzdGFydHMgcmV0dXJuaW5nIGZhbHNlXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgdGhhdCB3ZSBhbHdheXMgcmV0dXJuIGZhbHNlIGlmXG4gIC8vIHRoZSBlbnRpcmUgYnVmZmVyIGlzIG5vdCBmbHVzaGVkIGltbWVkaWF0ZWx5IG9uIHdyaXRlKClcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gZ2V0SGlnaFdhdGVyTWFyayh0aGlzLCBvcHRpb25zLCAnd3JpdGFibGVIaWdoV2F0ZXJNYXJrJywgaXNEdXBsZXgpO1xuXG4gIC8vIGlmIF9maW5hbCBoYXMgYmVlbiBjYWxsZWRcbiAgdGhpcy5maW5hbENhbGxlZCA9IGZhbHNlO1xuXG4gIC8vIGRyYWluIGV2ZW50IGZsYWcuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7XG4gIC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG4gIHRoaXMuZW5kaW5nID0gZmFsc2U7XG4gIC8vIHdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWRcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAvLyB3aGVuICdmaW5pc2gnIGlzIGVtaXR0ZWRcbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIGhhcyBpdCBiZWVuIGRlc3Ryb3llZFxuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIC8vIHNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIG5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMDtcblxuICAvLyBhIGZsYWcgdG8gc2VlIHdoZW4gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHdyaXRlLlxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTtcblxuICAvLyB3aGVuIHRydWUgYWxsIHdyaXRlcyB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIC51bmNvcmsoKSBjYWxsXG4gIHRoaXMuY29ya2VkID0gMDtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyBhIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCdzIHBhc3NlZCB0byBfd3JpdGUoY2h1bmssY2IpXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uIChlcikge1xuICAgIG9ud3JpdGUoc3RyZWFtLCBlcik7XG4gIH07XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQgdGhlIHVzZXIgc3VwcGxpZXMgdG8gd3JpdGUoY2h1bmssZW5jb2RpbmcsY2IpXG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG5cbiAgLy8gdGhlIGFtb3VudCB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4gd2hlbiBfd3JpdGUgaXMgY2FsbGVkLlxuICB0aGlzLndyaXRlbGVuID0gMDtcbiAgdGhpcy5idWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuXG4gIC8vIG51bWJlciBvZiBwZW5kaW5nIHVzZXItc3VwcGxpZWQgd3JpdGUgY2FsbGJhY2tzXG4gIC8vIHRoaXMgbXVzdCBiZSAwIGJlZm9yZSAnZmluaXNoJyBjYW4gYmUgZW1pdHRlZFxuICB0aGlzLnBlbmRpbmdjYiA9IDA7XG5cbiAgLy8gZW1pdCBwcmVmaW5pc2ggaWYgdGhlIG9ubHkgdGhpbmcgd2UncmUgd2FpdGluZyBmb3IgaXMgX3dyaXRlIGNic1xuICAvLyBUaGlzIGlzIHJlbGV2YW50IGZvciBzeW5jaHJvbm91cyBUcmFuc2Zvcm0gc3RyZWFtc1xuICB0aGlzLnByZWZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gVHJ1ZSBpZiB0aGUgZXJyb3Igd2FzIGFscmVhZHkgZW1pdHRlZCBhbmQgc2hvdWxkIG5vdCBiZSB0aHJvd24gYWdhaW5cbiAgdGhpcy5lcnJvckVtaXR0ZWQgPSBmYWxzZTtcblxuICAvLyBTaG91bGQgY2xvc2UgYmUgZW1pdHRlZCBvbiBkZXN0cm95LiBEZWZhdWx0cyB0byB0cnVlLlxuICB0aGlzLmVtaXRDbG9zZSA9IG9wdGlvbnMuZW1pdENsb3NlICE9PSBmYWxzZTtcblxuICAvLyBTaG91bGQgLmRlc3Ryb3koKSBiZSBjYWxsZWQgYWZ0ZXIgJ2ZpbmlzaCcgKGFuZCBwb3RlbnRpYWxseSAnZW5kJylcbiAgdGhpcy5hdXRvRGVzdHJveSA9ICEhb3B0aW9ucy5hdXRvRGVzdHJveTtcblxuICAvLyBjb3VudCBidWZmZXJlZCByZXF1ZXN0c1xuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcblxuICAvLyBhbGxvY2F0ZSB0aGUgZmlyc3QgQ29ya2VkUmVxdWVzdCwgdGhlcmUgaXMgYWx3YXlzXG4gIC8vIG9uZSBhbGxvY2F0ZWQgYW5kIGZyZWUgdG8gdXNlLCBhbmQgd2UgbWFpbnRhaW4gYXQgbW9zdCB0d29cbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdCh0aGlzKTtcbn1cbldyaXRhYmxlU3RhdGUucHJvdG90eXBlLmdldEJ1ZmZlciA9IGZ1bmN0aW9uIGdldEJ1ZmZlcigpIHtcbiAgdmFyIGN1cnJlbnQgPSB0aGlzLmJ1ZmZlcmVkUmVxdWVzdDtcbiAgdmFyIG91dCA9IFtdO1xuICB3aGlsZSAoY3VycmVudCkge1xuICAgIG91dC5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn07XG4oZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0YXRlLnByb3RvdHlwZSwgJ2J1ZmZlcicsIHtcbiAgICAgIGdldDogaW50ZXJuYWxVdGlsLmRlcHJlY2F0ZShmdW5jdGlvbiB3cml0YWJsZVN0YXRlQnVmZmVyR2V0dGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIH0sICdfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciAnICsgJ2luc3RlYWQuJywgJ0RFUDAwMDMnKVxuICAgIH0pO1xuICB9IGNhdGNoIChfKSB7fVxufSkoKTtcblxuLy8gVGVzdCBfd3JpdGFibGVTdGF0ZSBmb3IgaW5oZXJpdGFuY2UgdG8gYWNjb3VudCBmb3IgRHVwbGV4IHN0cmVhbXMsXG4vLyB3aG9zZSBwcm90b3R5cGUgY2hhaW4gb25seSBwb2ludHMgdG8gUmVhZGFibGUuXG52YXIgcmVhbEhhc0luc3RhbmNlO1xuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmhhc0luc3RhbmNlICYmIHR5cGVvZiBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXSA9PT0gJ2Z1bmN0aW9uJykge1xuICByZWFsSGFzSW5zdGFuY2UgPSBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLCBTeW1ib2wuaGFzSW5zdGFuY2UsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUob2JqZWN0KSB7XG4gICAgICBpZiAocmVhbEhhc0luc3RhbmNlLmNhbGwodGhpcywgb2JqZWN0KSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAodGhpcyAhPT0gV3JpdGFibGUpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgb2JqZWN0Ll93cml0YWJsZVN0YXRlIGluc3RhbmNlb2YgV3JpdGFibGVTdGF0ZTtcbiAgICB9XG4gIH0pO1xufSBlbHNlIHtcbiAgcmVhbEhhc0luc3RhbmNlID0gZnVuY3Rpb24gcmVhbEhhc0luc3RhbmNlKG9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiB0aGlzO1xuICB9O1xufVxuZnVuY3Rpb24gV3JpdGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIC8vIFdyaXRhYmxlIGN0b3IgaXMgYXBwbGllZCB0byBEdXBsZXhlcywgdG9vLlxuICAvLyBgcmVhbEhhc0luc3RhbmNlYCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB1c2luZyBwbGFpbiBgaW5zdGFuY2VvZmBcbiAgLy8gd291bGQgcmV0dXJuIGZhbHNlLCBhcyBubyBgX3dyaXRhYmxlU3RhdGVgIHByb3BlcnR5IGlzIGF0dGFjaGVkLlxuXG4gIC8vIFRyeWluZyB0byB1c2UgdGhlIGN1c3RvbSBgaW5zdGFuY2VvZmAgZm9yIFdyaXRhYmxlIGhlcmUgd2lsbCBhbHNvIGJyZWFrIHRoZVxuICAvLyBOb2RlLmpzIExhenlUcmFuc2Zvcm0gaW1wbGVtZW50YXRpb24sIHdoaWNoIGhhcyBhIG5vbi10cml2aWFsIGdldHRlciBmb3JcbiAgLy8gYF93cml0YWJsZVN0YXRlYCB0aGF0IHdvdWxkIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuXG4gIC8vIENoZWNraW5nIGZvciBhIFN0cmVhbS5EdXBsZXggaW5zdGFuY2UgaXMgZmFzdGVyIGhlcmUgaW5zdGVhZCBvZiBpbnNpZGVcbiAgLy8gdGhlIFdyaXRhYmxlU3RhdGUgY29uc3RydWN0b3IsIGF0IGxlYXN0IHdpdGggVjggNi41XG4gIHZhciBpc0R1cGxleCA9IHRoaXMgaW5zdGFuY2VvZiBEdXBsZXg7XG4gIGlmICghaXNEdXBsZXggJiYgIXJlYWxIYXNJbnN0YW5jZS5jYWxsKFdyaXRhYmxlLCB0aGlzKSkgcmV0dXJuIG5ldyBXcml0YWJsZShvcHRpb25zKTtcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMsIGlzRHVwbGV4KTtcblxuICAvLyBsZWdhY3kuXG4gIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGUgPSBvcHRpb25zLndyaXRlO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZXYgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRldiA9IG9wdGlvbnMud3JpdGV2O1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95O1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5maW5hbCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmluYWwgPSBvcHRpb25zLmZpbmFsO1xuICB9XG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBPdGhlcndpc2UgcGVvcGxlIGNhbiBwaXBlIFdyaXRhYmxlIHN0cmVhbXMsIHdoaWNoIGlzIGp1c3Qgd3JvbmcuXG5Xcml0YWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgZXJyb3JPckRlc3Ryb3kodGhpcywgbmV3IEVSUl9TVFJFQU1fQ0FOTk9UX1BJUEUoKSk7XG59O1xuZnVuY3Rpb24gd3JpdGVBZnRlckVuZChzdHJlYW0sIGNiKSB7XG4gIHZhciBlciA9IG5ldyBFUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORCgpO1xuICAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuICBlcnJvck9yRGVzdHJveShzdHJlYW0sIGVyKTtcbiAgcHJvY2Vzcy5uZXh0VGljayhjYiwgZXIpO1xufVxuXG4vLyBDaGVja3MgdGhhdCBhIHVzZXItc3VwcGxpZWQgY2h1bmsgaXMgdmFsaWQsIGVzcGVjaWFsbHkgZm9yIHRoZSBwYXJ0aWN1bGFyXG4vLyBtb2RlIHRoZSBzdHJlYW0gaXMgaW4uIEN1cnJlbnRseSB0aGlzIG1lYW5zIHRoYXQgYG51bGxgIGlzIG5ldmVyIGFjY2VwdGVkXG4vLyBhbmQgdW5kZWZpbmVkL25vbi1zdHJpbmcgdmFsdWVzIGFyZSBvbmx5IGFsbG93ZWQgaW4gb2JqZWN0IG1vZGUuXG5mdW5jdGlvbiB2YWxpZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBjYikge1xuICB2YXIgZXI7XG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIGVyID0gbmV3IEVSUl9TVFJFQU1fTlVMTF9WQUxVRVMoKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2NodW5rJywgWydzdHJpbmcnLCAnQnVmZmVyJ10sIGNodW5rKTtcbiAgfVxuICBpZiAoZXIpIHtcbiAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIGVyKTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGNiLCBlcik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuV3JpdGFibGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHJldCA9IGZhbHNlO1xuICB2YXIgaXNCdWYgPSAhc3RhdGUub2JqZWN0TW9kZSAmJiBfaXNVaW50OEFycmF5KGNodW5rKTtcbiAgaWYgKGlzQnVmICYmICFCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSB7XG4gICAgY2h1bmsgPSBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKTtcbiAgfVxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cbiAgaWYgKGlzQnVmKSBlbmNvZGluZyA9ICdidWZmZXInO2Vsc2UgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIGNiID0gbm9wO1xuICBpZiAoc3RhdGUuZW5kaW5nKSB3cml0ZUFmdGVyRW5kKHRoaXMsIGNiKTtlbHNlIGlmIChpc0J1ZiB8fCB2YWxpZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgY2IpKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgcmV0ID0gd3JpdGVPckJ1ZmZlcih0aGlzLCBzdGF0ZSwgaXNCdWYsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG4gIHJldHVybiByZXQ7XG59O1xuV3JpdGFibGUucHJvdG90eXBlLmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuY29ya2VkKys7XG59O1xuV3JpdGFibGUucHJvdG90eXBlLnVuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZC0tO1xuICAgIGlmICghc3RhdGUud3JpdGluZyAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkgY2xlYXJCdWZmZXIodGhpcywgc3RhdGUpO1xuICB9XG59O1xuV3JpdGFibGUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykge1xuICAvLyBub2RlOjpQYXJzZUVuY29kaW5nKCkgcmVxdWlyZXMgbG93ZXIgY2FzZS5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIGVuY29kaW5nID0gZW5jb2RpbmcudG9Mb3dlckNhc2UoKTtcbiAgaWYgKCEoWydoZXgnLCAndXRmOCcsICd1dGYtOCcsICdhc2NpaScsICdiaW5hcnknLCAnYmFzZTY0JywgJ3VjczInLCAndWNzLTInLCAndXRmMTZsZScsICd1dGYtMTZsZScsICdyYXcnXS5pbmRleE9mKChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpKSA+IC0xKSkgdGhyb3cgbmV3IEVSUl9VTktOT1dOX0VOQ09ESU5HKGVuY29kaW5nKTtcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2RpbmcgPSBlbmNvZGluZztcbiAgcmV0dXJuIHRoaXM7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlQnVmZmVyJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmdldEJ1ZmZlcigpO1xuICB9XG59KTtcbmZ1bmN0aW9uIGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpIHtcbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmIHN0YXRlLmRlY29kZVN0cmluZ3MgIT09IGZhbHNlICYmIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cbiAgcmV0dXJuIGNodW5rO1xufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlSGlnaFdhdGVyTWFyaycsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgfVxufSk7XG5cbi8vIGlmIHdlJ3JlIGFscmVhZHkgd3JpdGluZyBzb21ldGhpbmcsIHRoZW4ganVzdCBwdXQgdGhpc1xuLy8gaW4gdGhlIHF1ZXVlLCBhbmQgd2FpdCBvdXIgdHVybi4gIE90aGVyd2lzZSwgY2FsbCBfd3JpdGVcbi8vIElmIHdlIHJldHVybiBmYWxzZSwgdGhlbiB3ZSBuZWVkIGEgZHJhaW4gZXZlbnQsIHNvIHNldCB0aGF0IGZsYWcuXG5mdW5jdGlvbiB3cml0ZU9yQnVmZmVyKHN0cmVhbSwgc3RhdGUsIGlzQnVmLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGlmICghaXNCdWYpIHtcbiAgICB2YXIgbmV3Q2h1bmsgPSBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKTtcbiAgICBpZiAoY2h1bmsgIT09IG5ld0NodW5rKSB7XG4gICAgICBpc0J1ZiA9IHRydWU7XG4gICAgICBlbmNvZGluZyA9ICdidWZmZXInO1xuICAgICAgY2h1bmsgPSBuZXdDaHVuaztcbiAgICB9XG4gIH1cbiAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICBzdGF0ZS5sZW5ndGggKz0gbGVuO1xuICB2YXIgcmV0ID0gc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgLy8gd2UgbXVzdCBlbnN1cmUgdGhhdCBwcmV2aW91cyBuZWVkRHJhaW4gd2lsbCBub3QgYmUgcmVzZXQgdG8gZmFsc2UuXG4gIGlmICghcmV0KSBzdGF0ZS5uZWVkRHJhaW4gPSB0cnVlO1xuICBpZiAoc3RhdGUud3JpdGluZyB8fCBzdGF0ZS5jb3JrZWQpIHtcbiAgICB2YXIgbGFzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IHtcbiAgICAgIGNodW5rOiBjaHVuayxcbiAgICAgIGVuY29kaW5nOiBlbmNvZGluZyxcbiAgICAgIGlzQnVmOiBpc0J1ZixcbiAgICAgIGNhbGxiYWNrOiBjYixcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuICAgIGlmIChsYXN0KSB7XG4gICAgICBsYXN0Lm5leHQgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIH1cbiAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudCArPSAxO1xuICB9IGVsc2Uge1xuICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAoc3RhdGUuZGVzdHJveWVkKSBzdGF0ZS5vbndyaXRlKG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCgnd3JpdGUnKSk7ZWxzZSBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSk7ZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSk7XG4gIHN0YXRlLnN5bmMgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpIHtcbiAgLS1zdGF0ZS5wZW5kaW5nY2I7XG4gIGlmIChzeW5jKSB7XG4gICAgLy8gZGVmZXIgdGhlIGNhbGxiYWNrIGlmIHdlIGFyZSBiZWluZyBjYWxsZWQgc3luY2hyb25vdXNseVxuICAgIC8vIHRvIGF2b2lkIHBpbGluZyB1cCB0aGluZ3Mgb24gdGhlIHN0YWNrXG4gICAgcHJvY2Vzcy5uZXh0VGljayhjYiwgZXIpO1xuICAgIC8vIHRoaXMgY2FuIGVtaXQgZmluaXNoLCBhbmQgaXQgd2lsbCBhbHdheXMgaGFwcGVuXG4gICAgLy8gYWZ0ZXIgZXJyb3JcbiAgICBwcm9jZXNzLm5leHRUaWNrKGZpbmlzaE1heWJlLCBzdHJlYW0sIHN0YXRlKTtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIGVyKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB0aGUgY2FsbGVyIGV4cGVjdCB0aGlzIHRvIGhhcHBlbiBiZWZvcmUgaWZcbiAgICAvLyBpdCBpcyBhc3luY1xuICAgIGNiKGVyKTtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIGVyKTtcbiAgICAvLyB0aGlzIGNhbiBlbWl0IGZpbmlzaCwgYnV0IGZpbmlzaCBtdXN0XG4gICAgLy8gYWx3YXlzIGZvbGxvdyBlcnJvclxuICAgIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5mdW5jdGlvbiBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpIHtcbiAgc3RhdGUud3JpdGluZyA9IGZhbHNlO1xuICBzdGF0ZS53cml0ZWNiID0gbnVsbDtcbiAgc3RhdGUubGVuZ3RoIC09IHN0YXRlLndyaXRlbGVuO1xuICBzdGF0ZS53cml0ZWxlbiA9IDA7XG59XG5mdW5jdGlvbiBvbndyaXRlKHN0cmVhbSwgZXIpIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgc3luYyA9IHN0YXRlLnN5bmM7XG4gIHZhciBjYiA9IHN0YXRlLndyaXRlY2I7XG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBFUlJfTVVMVElQTEVfQ0FMTEJBQ0soKTtcbiAgb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKTtcbiAgaWYgKGVyKSBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtlbHNlIHtcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBhY3R1YWxseSByZWFkeSB0byBmaW5pc2gsIGJ1dCBkb24ndCBlbWl0IHlldFxuICAgIHZhciBmaW5pc2hlZCA9IG5lZWRGaW5pc2goc3RhdGUpIHx8IHN0cmVhbS5kZXN0cm95ZWQ7XG4gICAgaWYgKCFmaW5pc2hlZCAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkge1xuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICAgIGlmIChzeW5jKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGFmdGVyV3JpdGUsIHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKSB7XG4gIGlmICghZmluaXNoZWQpIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKTtcbiAgc3RhdGUucGVuZGluZ2NiLS07XG4gIGNiKCk7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xufVxuXG4vLyBNdXN0IGZvcmNlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbiBuZXh0VGljaywgc28gdGhhdCB3ZSBkb24ndFxuLy8gZW1pdCAnZHJhaW4nIGJlZm9yZSB0aGUgd3JpdGUoKSBjb25zdW1lciBnZXRzIHRoZSAnZmFsc2UnIHJldHVyblxuLy8gdmFsdWUsIGFuZCBoYXMgYSBjaGFuY2UgdG8gYXR0YWNoIGEgJ2RyYWluJyBsaXN0ZW5lci5cbmZ1bmN0aW9uIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUubmVlZERyYWluKSB7XG4gICAgc3RhdGUubmVlZERyYWluID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2RyYWluJyk7XG4gIH1cbn1cblxuLy8gaWYgdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nLCB0aGVuIHByb2Nlc3MgaXRcbmZ1bmN0aW9uIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IHRydWU7XG4gIHZhciBlbnRyeSA9IHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdDtcbiAgaWYgKHN0cmVhbS5fd3JpdGV2ICYmIGVudHJ5ICYmIGVudHJ5Lm5leHQpIHtcbiAgICAvLyBGYXN0IGNhc2UsIHdyaXRlIGV2ZXJ5dGhpbmcgdXNpbmcgX3dyaXRldigpXG4gICAgdmFyIGwgPSBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudDtcbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5KGwpO1xuICAgIHZhciBob2xkZXIgPSBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7XG4gICAgaG9sZGVyLmVudHJ5ID0gZW50cnk7XG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB2YXIgYWxsQnVmZmVycyA9IHRydWU7XG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICBidWZmZXJbY291bnRdID0gZW50cnk7XG4gICAgICBpZiAoIWVudHJ5LmlzQnVmKSBhbGxCdWZmZXJzID0gZmFsc2U7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICBjb3VudCArPSAxO1xuICAgIH1cbiAgICBidWZmZXIuYWxsQnVmZmVycyA9IGFsbEJ1ZmZlcnM7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGJ1ZmZlciwgJycsIGhvbGRlci5maW5pc2gpO1xuXG4gICAgLy8gZG9Xcml0ZSBpcyBhbG1vc3QgYWx3YXlzIGFzeW5jLCBkZWZlciB0aGVzZSB0byBzYXZlIGEgYml0IG9mIHRpbWVcbiAgICAvLyBhcyB0aGUgaG90IHBhdGggZW5kcyB3aXRoIGRvV3JpdGVcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgICBpZiAoaG9sZGVyLm5leHQpIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IGhvbGRlci5uZXh0O1xuICAgICAgaG9sZGVyLm5leHQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdChzdGF0ZSk7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBTbG93IGNhc2UsIHdyaXRlIGNodW5rcyBvbmUtYnktb25lXG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2h1bmsgPSBlbnRyeS5jaHVuaztcbiAgICAgIHZhciBlbmNvZGluZyA9IGVudHJ5LmVuY29kaW5nO1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQtLTtcbiAgICAgIC8vIGlmIHdlIGRpZG4ndCBjYWxsIHRoZSBvbndyaXRlIGltbWVkaWF0ZWx5LCB0aGVuXG4gICAgICAvLyBpdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdCBkb2VzLlxuICAgICAgLy8gYWxzbywgdGhhdCBtZWFucyB0aGF0IHRoZSBjaHVuayBhbmQgY2IgYXJlIGN1cnJlbnRseVxuICAgICAgLy8gYmVpbmcgcHJvY2Vzc2VkLCBzbyBtb3ZlIHRoZSBidWZmZXIgY291bnRlciBwYXN0IHRoZW0uXG4gICAgICBpZiAoc3RhdGUud3JpdGluZykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVudHJ5ID09PSBudWxsKSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgfVxuICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPSBlbnRyeTtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xufVxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCgnX3dyaXRlKCknKSk7XG59O1xuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXYgPSBudWxsO1xuV3JpdGFibGUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIGlmICh0eXBlb2YgY2h1bmsgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGNodW5rO1xuICAgIGNodW5rID0gbnVsbDtcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cbiAgaWYgKGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQpIHRoaXMud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcblxuICAvLyAuZW5kKCkgZnVsbHkgdW5jb3Jrc1xuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkID0gMTtcbiAgICB0aGlzLnVuY29yaygpO1xuICB9XG5cbiAgLy8gaWdub3JlIHVubmVjZXNzYXJ5IGVuZCgpIGNhbGxzLlxuICBpZiAoIXN0YXRlLmVuZGluZykgZW5kV3JpdGFibGUodGhpcywgc3RhdGUsIGNiKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlTGVuZ3RoJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5sZW5ndGg7XG4gIH1cbn0pO1xuZnVuY3Rpb24gbmVlZEZpbmlzaChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUuZW5kaW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPT09IG51bGwgJiYgIXN0YXRlLmZpbmlzaGVkICYmICFzdGF0ZS53cml0aW5nO1xufVxuZnVuY3Rpb24gY2FsbEZpbmFsKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RyZWFtLl9maW5hbChmdW5jdGlvbiAoZXJyKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgaWYgKGVycikge1xuICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIpO1xuICAgIH1cbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICAgIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQgJiYgIXN0YXRlLmZpbmFsQ2FsbGVkKSB7XG4gICAgaWYgKHR5cGVvZiBzdHJlYW0uX2ZpbmFsID09PSAnZnVuY3Rpb24nICYmICFzdGF0ZS5kZXN0cm95ZWQpIHtcbiAgICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgICAgc3RhdGUuZmluYWxDYWxsZWQgPSB0cnVlO1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsRmluYWwsIHN0cmVhbSwgc3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBuZWVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG4gIGlmIChuZWVkKSB7XG4gICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICAgIGlmIChzdGF0ZS5wZW5kaW5nY2IgPT09IDApIHtcbiAgICAgIHN0YXRlLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgICAgIGlmIChzdGF0ZS5hdXRvRGVzdHJveSkge1xuICAgICAgICAvLyBJbiBjYXNlIG9mIGR1cGxleCBzdHJlYW1zIHdlIG5lZWQgYSB3YXkgdG8gZGV0ZWN0XG4gICAgICAgIC8vIGlmIHRoZSByZWFkYWJsZSBzaWRlIGlzIHJlYWR5IGZvciBhdXRvRGVzdHJveSBhcyB3ZWxsXG4gICAgICAgIHZhciByU3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gICAgICAgIGlmICghclN0YXRlIHx8IHJTdGF0ZS5hdXRvRGVzdHJveSAmJiByU3RhdGUuZW5kRW1pdHRlZCkge1xuICAgICAgICAgIHN0cmVhbS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lZWQ7XG59XG5mdW5jdGlvbiBlbmRXcml0YWJsZShzdHJlYW0sIHN0YXRlLCBjYikge1xuICBzdGF0ZS5lbmRpbmcgPSB0cnVlO1xuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbiAgaWYgKGNiKSB7XG4gICAgaWYgKHN0YXRlLmZpbmlzaGVkKSBwcm9jZXNzLm5leHRUaWNrKGNiKTtlbHNlIHN0cmVhbS5vbmNlKCdmaW5pc2gnLCBjYik7XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIG9uQ29ya2VkRmluaXNoKGNvcmtSZXEsIHN0YXRlLCBlcnIpIHtcbiAgdmFyIGVudHJ5ID0gY29ya1JlcS5lbnRyeTtcbiAgY29ya1JlcS5lbnRyeSA9IG51bGw7XG4gIHdoaWxlIChlbnRyeSkge1xuICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgIHN0YXRlLnBlbmRpbmdjYi0tO1xuICAgIGNiKGVycik7XG4gICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICB9XG5cbiAgLy8gcmV1c2UgdGhlIGZyZWUgY29ya1JlcS5cbiAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQgPSBjb3JrUmVxO1xufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwgJ2Rlc3Ryb3llZCcsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgLy8gd2UgaWdub3JlIHRoZSB2YWx1ZSBpZiB0aGUgc3RyZWFtXG4gICAgLy8gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldFxuICAgIGlmICghdGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAvLyBtYW5hZ2luZyBkZXN0cm95ZWRcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICB9XG59KTtcbldyaXRhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveTtcbldyaXRhYmxlLnByb3RvdHlwZS5fdW5kZXN0cm95ID0gZGVzdHJveUltcGwudW5kZXN0cm95O1xuV3JpdGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgY2IoZXJyKTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4229\n")},5850:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar _Object$setPrototypeO;\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nvar finished = __webpack_require__(8610);\nvar kLastResolve = Symbol('lastResolve');\nvar kLastReject = Symbol('lastReject');\nvar kError = Symbol('error');\nvar kEnded = Symbol('ended');\nvar kLastPromise = Symbol('lastPromise');\nvar kHandlePromise = Symbol('handlePromise');\nvar kStream = Symbol('stream');\nfunction createIterResult(value, done) {\n return {\n value: value,\n done: done\n };\n}\nfunction readAndResolve(iter) {\n var resolve = iter[kLastResolve];\n if (resolve !== null) {\n var data = iter[kStream].read();\n // we defer if data is null\n // we can be expecting either 'end' or\n // 'error'\n if (data !== null) {\n iter[kLastPromise] = null;\n iter[kLastResolve] = null;\n iter[kLastReject] = null;\n resolve(createIterResult(data, false));\n }\n }\n}\nfunction onReadable(iter) {\n // we wait for the next tick, because it might\n // emit an error with process.nextTick\n process.nextTick(readAndResolve, iter);\n}\nfunction wrapForNext(lastPromise, iter) {\n return function (resolve, reject) {\n lastPromise.then(function () {\n if (iter[kEnded]) {\n resolve(createIterResult(undefined, true));\n return;\n }\n iter[kHandlePromise](resolve, reject);\n }, reject);\n };\n}\nvar AsyncIteratorPrototype = Object.getPrototypeOf(function () {});\nvar ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = {\n get stream() {\n return this[kStream];\n },\n next: function next() {\n var _this = this;\n // if we have detected an error in the meanwhile\n // reject straight away\n var error = this[kError];\n if (error !== null) {\n return Promise.reject(error);\n }\n if (this[kEnded]) {\n return Promise.resolve(createIterResult(undefined, true));\n }\n if (this[kStream].destroyed) {\n // We need to defer via nextTick because if .destroy(err) is\n // called, the error will be emitted via nextTick, and\n // we cannot guarantee that there is no error lingering around\n // waiting to be emitted.\n return new Promise(function (resolve, reject) {\n process.nextTick(function () {\n if (_this[kError]) {\n reject(_this[kError]);\n } else {\n resolve(createIterResult(undefined, true));\n }\n });\n });\n }\n\n // if we have multiple next() calls\n // we will wait for the previous Promise to finish\n // this logic is optimized to support for await loops,\n // where next() is only called once at a time\n var lastPromise = this[kLastPromise];\n var promise;\n if (lastPromise) {\n promise = new Promise(wrapForNext(lastPromise, this));\n } else {\n // fast path needed to support multiple this.push()\n // without triggering the next() queue\n var data = this[kStream].read();\n if (data !== null) {\n return Promise.resolve(createIterResult(data, false));\n }\n promise = new Promise(this[kHandlePromise]);\n }\n this[kLastPromise] = promise;\n return promise;\n }\n}, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () {\n return this;\n}), _defineProperty(_Object$setPrototypeO, \"return\", function _return() {\n var _this2 = this;\n // destroy(err, cb) is a private API\n // we can guarantee we have that here, because we control the\n // Readable class this is attached to\n return new Promise(function (resolve, reject) {\n _this2[kStream].destroy(null, function (err) {\n if (err) {\n reject(err);\n return;\n }\n resolve(createIterResult(undefined, true));\n });\n });\n}), _Object$setPrototypeO), AsyncIteratorPrototype);\nvar createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) {\n var _Object$create;\n var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, {\n value: stream,\n writable: true\n }), _defineProperty(_Object$create, kLastResolve, {\n value: null,\n writable: true\n }), _defineProperty(_Object$create, kLastReject, {\n value: null,\n writable: true\n }), _defineProperty(_Object$create, kError, {\n value: null,\n writable: true\n }), _defineProperty(_Object$create, kEnded, {\n value: stream._readableState.endEmitted,\n writable: true\n }), _defineProperty(_Object$create, kHandlePromise, {\n value: function value(resolve, reject) {\n var data = iterator[kStream].read();\n if (data) {\n iterator[kLastPromise] = null;\n iterator[kLastResolve] = null;\n iterator[kLastReject] = null;\n resolve(createIterResult(data, false));\n } else {\n iterator[kLastResolve] = resolve;\n iterator[kLastReject] = reject;\n }\n },\n writable: true\n }), _Object$create));\n iterator[kLastPromise] = null;\n finished(stream, function (err) {\n if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') {\n var reject = iterator[kLastReject];\n // reject if we are waiting for data in the Promise\n // returned by next() and store the error\n if (reject !== null) {\n iterator[kLastPromise] = null;\n iterator[kLastResolve] = null;\n iterator[kLastReject] = null;\n reject(err);\n }\n iterator[kError] = err;\n return;\n }\n var resolve = iterator[kLastResolve];\n if (resolve !== null) {\n iterator[kLastPromise] = null;\n iterator[kLastResolve] = null;\n iterator[kLastReject] = null;\n resolve(createIterResult(undefined, true));\n }\n iterator[kEnded] = true;\n });\n stream.on('readable', onReadable.bind(null, iterator));\n return iterator;\n};\nmodule.exports = createReadableStreamAsyncIterator;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTg1MC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBLDRDQUE0QywyQkFBMkIsa0JBQWtCLGtDQUFrQyxvRUFBb0UsS0FBSyxPQUFPLG9CQUFvQjtBQUMvTiwrQkFBK0IsdUNBQXVDO0FBQ3RFLHFDQUFxQywrREFBK0Qsc0NBQXNDLDBCQUEwQiwrQ0FBK0MseUNBQXlDLHVFQUF1RTtBQUNuVSxlQUFlLG1CQUFPLENBQUMsSUFBaUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsaUVBQWlFO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBLHlGQUF5RjtBQUN6RjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvYXN5bmNfaXRlcmF0b3IuanM/OWMwZSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBfT2JqZWN0JHNldFByb3RvdHlwZU87XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7IHZhciBrZXkgPSBfdG9QcmltaXRpdmUoYXJnLCBcInN0cmluZ1wiKTsgcmV0dXJuIHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7IGlmICh0eXBlb2YgaW5wdXQgIT09IFwib2JqZWN0XCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDsgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7IHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgXCJkZWZhdWx0XCIpOyBpZiAodHlwZW9mIHJlcyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHJlczsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoaGludCA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOyB9XG52YXIgZmluaXNoZWQgPSByZXF1aXJlKCcuL2VuZC1vZi1zdHJlYW0nKTtcbnZhciBrTGFzdFJlc29sdmUgPSBTeW1ib2woJ2xhc3RSZXNvbHZlJyk7XG52YXIga0xhc3RSZWplY3QgPSBTeW1ib2woJ2xhc3RSZWplY3QnKTtcbnZhciBrRXJyb3IgPSBTeW1ib2woJ2Vycm9yJyk7XG52YXIga0VuZGVkID0gU3ltYm9sKCdlbmRlZCcpO1xudmFyIGtMYXN0UHJvbWlzZSA9IFN5bWJvbCgnbGFzdFByb21pc2UnKTtcbnZhciBrSGFuZGxlUHJvbWlzZSA9IFN5bWJvbCgnaGFuZGxlUHJvbWlzZScpO1xudmFyIGtTdHJlYW0gPSBTeW1ib2woJ3N0cmVhbScpO1xuZnVuY3Rpb24gY3JlYXRlSXRlclJlc3VsdCh2YWx1ZSwgZG9uZSkge1xuICByZXR1cm4ge1xuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBkb25lOiBkb25lXG4gIH07XG59XG5mdW5jdGlvbiByZWFkQW5kUmVzb2x2ZShpdGVyKSB7XG4gIHZhciByZXNvbHZlID0gaXRlcltrTGFzdFJlc29sdmVdO1xuICBpZiAocmVzb2x2ZSAhPT0gbnVsbCkge1xuICAgIHZhciBkYXRhID0gaXRlcltrU3RyZWFtXS5yZWFkKCk7XG4gICAgLy8gd2UgZGVmZXIgaWYgZGF0YSBpcyBudWxsXG4gICAgLy8gd2UgY2FuIGJlIGV4cGVjdGluZyBlaXRoZXIgJ2VuZCcgb3JcbiAgICAvLyAnZXJyb3InXG4gICAgaWYgKGRhdGEgIT09IG51bGwpIHtcbiAgICAgIGl0ZXJba0xhc3RQcm9taXNlXSA9IG51bGw7XG4gICAgICBpdGVyW2tMYXN0UmVzb2x2ZV0gPSBudWxsO1xuICAgICAgaXRlcltrTGFzdFJlamVjdF0gPSBudWxsO1xuICAgICAgcmVzb2x2ZShjcmVhdGVJdGVyUmVzdWx0KGRhdGEsIGZhbHNlKSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBvblJlYWRhYmxlKGl0ZXIpIHtcbiAgLy8gd2Ugd2FpdCBmb3IgdGhlIG5leHQgdGljaywgYmVjYXVzZSBpdCBtaWdodFxuICAvLyBlbWl0IGFuIGVycm9yIHdpdGggcHJvY2Vzcy5uZXh0VGlja1xuICBwcm9jZXNzLm5leHRUaWNrKHJlYWRBbmRSZXNvbHZlLCBpdGVyKTtcbn1cbmZ1bmN0aW9uIHdyYXBGb3JOZXh0KGxhc3RQcm9taXNlLCBpdGVyKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgbGFzdFByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoaXRlcltrRW5kZWRdKSB7XG4gICAgICAgIHJlc29sdmUoY3JlYXRlSXRlclJlc3VsdCh1bmRlZmluZWQsIHRydWUpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaXRlcltrSGFuZGxlUHJvbWlzZV0ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICB9LCByZWplY3QpO1xuICB9O1xufVxudmFyIEFzeW5jSXRlcmF0b3JQcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZnVuY3Rpb24gKCkge30pO1xudmFyIFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSA9IE9iamVjdC5zZXRQcm90b3R5cGVPZigoX09iamVjdCRzZXRQcm90b3R5cGVPID0ge1xuICBnZXQgc3RyZWFtKCkge1xuICAgIHJldHVybiB0aGlzW2tTdHJlYW1dO1xuICB9LFxuICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgLy8gaWYgd2UgaGF2ZSBkZXRlY3RlZCBhbiBlcnJvciBpbiB0aGUgbWVhbndoaWxlXG4gICAgLy8gcmVqZWN0IHN0cmFpZ2h0IGF3YXlcbiAgICB2YXIgZXJyb3IgPSB0aGlzW2tFcnJvcl07XG4gICAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgICBpZiAodGhpc1trRW5kZWRdKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodW5kZWZpbmVkLCB0cnVlKSk7XG4gICAgfVxuICAgIGlmICh0aGlzW2tTdHJlYW1dLmRlc3Ryb3llZCkge1xuICAgICAgLy8gV2UgbmVlZCB0byBkZWZlciB2aWEgbmV4dFRpY2sgYmVjYXVzZSBpZiAuZGVzdHJveShlcnIpIGlzXG4gICAgICAvLyBjYWxsZWQsIHRoZSBlcnJvciB3aWxsIGJlIGVtaXR0ZWQgdmlhIG5leHRUaWNrLCBhbmRcbiAgICAgIC8vIHdlIGNhbm5vdCBndWFyYW50ZWUgdGhhdCB0aGVyZSBpcyBubyBlcnJvciBsaW5nZXJpbmcgYXJvdW5kXG4gICAgICAvLyB3YWl0aW5nIHRvIGJlIGVtaXR0ZWQuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoX3RoaXNba0Vycm9yXSkge1xuICAgICAgICAgICAgcmVqZWN0KF90aGlzW2tFcnJvcl0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodW5kZWZpbmVkLCB0cnVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGlmIHdlIGhhdmUgbXVsdGlwbGUgbmV4dCgpIGNhbGxzXG4gICAgLy8gd2Ugd2lsbCB3YWl0IGZvciB0aGUgcHJldmlvdXMgUHJvbWlzZSB0byBmaW5pc2hcbiAgICAvLyB0aGlzIGxvZ2ljIGlzIG9wdGltaXplZCB0byBzdXBwb3J0IGZvciBhd2FpdCBsb29wcyxcbiAgICAvLyB3aGVyZSBuZXh0KCkgaXMgb25seSBjYWxsZWQgb25jZSBhdCBhIHRpbWVcbiAgICB2YXIgbGFzdFByb21pc2UgPSB0aGlzW2tMYXN0UHJvbWlzZV07XG4gICAgdmFyIHByb21pc2U7XG4gICAgaWYgKGxhc3RQcm9taXNlKSB7XG4gICAgICBwcm9taXNlID0gbmV3IFByb21pc2Uod3JhcEZvck5leHQobGFzdFByb21pc2UsIHRoaXMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZmFzdCBwYXRoIG5lZWRlZCB0byBzdXBwb3J0IG11bHRpcGxlIHRoaXMucHVzaCgpXG4gICAgICAvLyB3aXRob3V0IHRyaWdnZXJpbmcgdGhlIG5leHQoKSBxdWV1ZVxuICAgICAgdmFyIGRhdGEgPSB0aGlzW2tTdHJlYW1dLnJlYWQoKTtcbiAgICAgIGlmIChkYXRhICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY3JlYXRlSXRlclJlc3VsdChkYXRhLCBmYWxzZSkpO1xuICAgICAgfVxuICAgICAgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHRoaXNba0hhbmRsZVByb21pc2VdKTtcbiAgICB9XG4gICAgdGhpc1trTGFzdFByb21pc2VdID0gcHJvbWlzZTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxufSwgX2RlZmluZVByb3BlcnR5KF9PYmplY3Qkc2V0UHJvdG90eXBlTywgU3ltYm9sLmFzeW5jSXRlcmF0b3IsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXM7XG59KSwgX2RlZmluZVByb3BlcnR5KF9PYmplY3Qkc2V0UHJvdG90eXBlTywgXCJyZXR1cm5cIiwgZnVuY3Rpb24gX3JldHVybigpIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG4gIC8vIGRlc3Ryb3koZXJyLCBjYikgaXMgYSBwcml2YXRlIEFQSVxuICAvLyB3ZSBjYW4gZ3VhcmFudGVlIHdlIGhhdmUgdGhhdCBoZXJlLCBiZWNhdXNlIHdlIGNvbnRyb2wgdGhlXG4gIC8vIFJlYWRhYmxlIGNsYXNzIHRoaXMgaXMgYXR0YWNoZWQgdG9cbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBfdGhpczJba1N0cmVhbV0uZGVzdHJveShudWxsLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodW5kZWZpbmVkLCB0cnVlKSk7XG4gICAgfSk7XG4gIH0pO1xufSksIF9PYmplY3Qkc2V0UHJvdG90eXBlTyksIEFzeW5jSXRlcmF0b3JQcm90b3R5cGUpO1xudmFyIGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvciA9IGZ1bmN0aW9uIGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcihzdHJlYW0pIHtcbiAgdmFyIF9PYmplY3QkY3JlYXRlO1xuICB2YXIgaXRlcmF0b3IgPSBPYmplY3QuY3JlYXRlKFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgKF9PYmplY3QkY3JlYXRlID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga1N0cmVhbSwge1xuICAgIHZhbHVlOiBzdHJlYW0sXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSksIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga0xhc3RSZXNvbHZlLCB7XG4gICAgdmFsdWU6IG51bGwsXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSksIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga0xhc3RSZWplY3QsIHtcbiAgICB2YWx1ZTogbnVsbCxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KSwgX2RlZmluZVByb3BlcnR5KF9PYmplY3QkY3JlYXRlLCBrRXJyb3IsIHtcbiAgICB2YWx1ZTogbnVsbCxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KSwgX2RlZmluZVByb3BlcnR5KF9PYmplY3QkY3JlYXRlLCBrRW5kZWQsIHtcbiAgICB2YWx1ZTogc3RyZWFtLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQsXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSksIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga0hhbmRsZVByb21pc2UsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgZGF0YSA9IGl0ZXJhdG9yW2tTdHJlYW1dLnJlYWQoKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGl0ZXJhdG9yW2tMYXN0UHJvbWlzZV0gPSBudWxsO1xuICAgICAgICBpdGVyYXRvcltrTGFzdFJlc29sdmVdID0gbnVsbDtcbiAgICAgICAgaXRlcmF0b3Jba0xhc3RSZWplY3RdID0gbnVsbDtcbiAgICAgICAgcmVzb2x2ZShjcmVhdGVJdGVyUmVzdWx0KGRhdGEsIGZhbHNlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVyYXRvcltrTGFzdFJlc29sdmVdID0gcmVzb2x2ZTtcbiAgICAgICAgaXRlcmF0b3Jba0xhc3RSZWplY3RdID0gcmVqZWN0O1xuICAgICAgfVxuICAgIH0sXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSksIF9PYmplY3QkY3JlYXRlKSk7XG4gIGl0ZXJhdG9yW2tMYXN0UHJvbWlzZV0gPSBudWxsO1xuICBmaW5pc2hlZChzdHJlYW0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlICE9PSAnRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UnKSB7XG4gICAgICB2YXIgcmVqZWN0ID0gaXRlcmF0b3Jba0xhc3RSZWplY3RdO1xuICAgICAgLy8gcmVqZWN0IGlmIHdlIGFyZSB3YWl0aW5nIGZvciBkYXRhIGluIHRoZSBQcm9taXNlXG4gICAgICAvLyByZXR1cm5lZCBieSBuZXh0KCkgYW5kIHN0b3JlIHRoZSBlcnJvclxuICAgICAgaWYgKHJlamVjdCAhPT0gbnVsbCkge1xuICAgICAgICBpdGVyYXRvcltrTGFzdFByb21pc2VdID0gbnVsbDtcbiAgICAgICAgaXRlcmF0b3Jba0xhc3RSZXNvbHZlXSA9IG51bGw7XG4gICAgICAgIGl0ZXJhdG9yW2tMYXN0UmVqZWN0XSA9IG51bGw7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfVxuICAgICAgaXRlcmF0b3Jba0Vycm9yXSA9IGVycjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHJlc29sdmUgPSBpdGVyYXRvcltrTGFzdFJlc29sdmVdO1xuICAgIGlmIChyZXNvbHZlICE9PSBudWxsKSB7XG4gICAgICBpdGVyYXRvcltrTGFzdFByb21pc2VdID0gbnVsbDtcbiAgICAgIGl0ZXJhdG9yW2tMYXN0UmVzb2x2ZV0gPSBudWxsO1xuICAgICAgaXRlcmF0b3Jba0xhc3RSZWplY3RdID0gbnVsbDtcbiAgICAgIHJlc29sdmUoY3JlYXRlSXRlclJlc3VsdCh1bmRlZmluZWQsIHRydWUpKTtcbiAgICB9XG4gICAgaXRlcmF0b3Jba0VuZGVkXSA9IHRydWU7XG4gIH0pO1xuICBzdHJlYW0ub24oJ3JlYWRhYmxlJywgb25SZWFkYWJsZS5iaW5kKG51bGwsIGl0ZXJhdG9yKSk7XG4gIHJldHVybiBpdGVyYXRvcjtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcjsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5850\n")},7327:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval('\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }\nvar _require = __webpack_require__(4300),\n Buffer = _require.Buffer;\nvar _require2 = __webpack_require__(3837),\n inspect = _require2.inspect;\nvar custom = inspect && inspect.custom || \'inspect\';\nfunction copyBuffer(src, target, offset) {\n Buffer.prototype.copy.call(src, target, offset);\n}\nmodule.exports = /*#__PURE__*/function () {\n function BufferList() {\n _classCallCheck(this, BufferList);\n this.head = null;\n this.tail = null;\n this.length = 0;\n }\n _createClass(BufferList, [{\n key: "push",\n value: function push(v) {\n var entry = {\n data: v,\n next: null\n };\n if (this.length > 0) this.tail.next = entry;else this.head = entry;\n this.tail = entry;\n ++this.length;\n }\n }, {\n key: "unshift",\n value: function unshift(v) {\n var entry = {\n data: v,\n next: this.head\n };\n if (this.length === 0) this.tail = entry;\n this.head = entry;\n ++this.length;\n }\n }, {\n key: "shift",\n value: function shift() {\n if (this.length === 0) return;\n var ret = this.head.data;\n if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;\n --this.length;\n return ret;\n }\n }, {\n key: "clear",\n value: function clear() {\n this.head = this.tail = null;\n this.length = 0;\n }\n }, {\n key: "join",\n value: function join(s) {\n if (this.length === 0) return \'\';\n var p = this.head;\n var ret = \'\' + p.data;\n while (p = p.next) ret += s + p.data;\n return ret;\n }\n }, {\n key: "concat",\n value: function concat(n) {\n if (this.length === 0) return Buffer.alloc(0);\n var ret = Buffer.allocUnsafe(n >>> 0);\n var p = this.head;\n var i = 0;\n while (p) {\n copyBuffer(p.data, ret, i);\n i += p.data.length;\n p = p.next;\n }\n return ret;\n }\n\n // Consumes a specified amount of bytes or characters from the buffered data.\n }, {\n key: "consume",\n value: function consume(n, hasStrings) {\n var ret;\n if (n < this.head.data.length) {\n // `slice` is the same for buffers and strings.\n ret = this.head.data.slice(0, n);\n this.head.data = this.head.data.slice(n);\n } else if (n === this.head.data.length) {\n // First chunk is a perfect match.\n ret = this.shift();\n } else {\n // Result spans more than one buffer.\n ret = hasStrings ? this._getString(n) : this._getBuffer(n);\n }\n return ret;\n }\n }, {\n key: "first",\n value: function first() {\n return this.head.data;\n }\n\n // Consumes a specified amount of characters from the buffered data.\n }, {\n key: "_getString",\n value: function _getString(n) {\n var p = this.head;\n var c = 1;\n var ret = p.data;\n n -= ret.length;\n while (p = p.next) {\n var str = p.data;\n var nb = n > str.length ? str.length : n;\n if (nb === str.length) ret += str;else ret += str.slice(0, n);\n n -= nb;\n if (n === 0) {\n if (nb === str.length) {\n ++c;\n if (p.next) this.head = p.next;else this.head = this.tail = null;\n } else {\n this.head = p;\n p.data = str.slice(nb);\n }\n break;\n }\n ++c;\n }\n this.length -= c;\n return ret;\n }\n\n // Consumes a specified amount of bytes from the buffered data.\n }, {\n key: "_getBuffer",\n value: function _getBuffer(n) {\n var ret = Buffer.allocUnsafe(n);\n var p = this.head;\n var c = 1;\n p.data.copy(ret);\n n -= p.data.length;\n while (p = p.next) {\n var buf = p.data;\n var nb = n > buf.length ? buf.length : n;\n buf.copy(ret, ret.length - n, 0, nb);\n n -= nb;\n if (n === 0) {\n if (nb === buf.length) {\n ++c;\n if (p.next) this.head = p.next;else this.head = this.tail = null;\n } else {\n this.head = p;\n p.data = buf.slice(nb);\n }\n break;\n }\n ++c;\n }\n this.length -= c;\n return ret;\n }\n\n // Make sure the linked list only shows the minimal necessary information.\n }, {\n key: custom,\n value: function value(_, options) {\n return inspect(this, _objectSpread(_objectSpread({}, options), {}, {\n // Only inspect one level.\n depth: 0,\n // It should not recurse.\n customInspect: false\n }));\n }\n }]);\n return BufferList;\n}();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzMyNy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYiwyQ0FBMkMsZ0NBQWdDLG9DQUFvQyxvREFBb0QsNkRBQTZELGlFQUFpRSxzQ0FBc0M7QUFDdlUsaUNBQWlDLGdCQUFnQixzQkFBc0IsT0FBTyx1REFBdUQsNkRBQTZELDRDQUE0QyxvS0FBb0ssbUZBQW1GLEtBQUs7QUFDMWUsNENBQTRDLDJCQUEyQixrQkFBa0Isa0NBQWtDLG9FQUFvRSxLQUFLLE9BQU8sb0JBQW9CO0FBQy9OLGtEQUFrRCwwQ0FBMEM7QUFDNUYsNENBQTRDLGdCQUFnQixrQkFBa0IsT0FBTywyQkFBMkIsd0RBQXdELGdDQUFnQyx1REFBdUQ7QUFDL1AsOERBQThELHNFQUFzRSw4REFBOEQsa0RBQWtELGlCQUFpQixHQUFHO0FBQ3hRLCtCQUErQix1Q0FBdUM7QUFDdEUscUNBQXFDLCtEQUErRCxzQ0FBc0MsMEJBQTBCLCtDQUErQyx5Q0FBeUMsdUVBQXVFO0FBQ25VLGVBQWUsbUJBQU8sQ0FBQyxJQUFRO0FBQy9CO0FBQ0EsZ0JBQWdCLG1CQUFPLENBQUMsSUFBTTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0MsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSx5REFBeUQsY0FBYztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvYnVmZmVyX2xpc3QuanM/YzZhZSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIF90b1Byb3BlcnR5S2V5KGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7IH0gfVxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZykgeyB2YXIga2V5ID0gX3RvUHJpbWl0aXZlKGFyZywgXCJzdHJpbmdcIik7IHJldHVybiB0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiID8ga2V5IDogU3RyaW5nKGtleSk7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZShpbnB1dCwgaGludCkgeyBpZiAodHlwZW9mIGlucHV0ICE9PSBcIm9iamVjdFwiIHx8IGlucHV0ID09PSBudWxsKSByZXR1cm4gaW5wdXQ7IHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHByaW0gIT09IHVuZGVmaW5lZCkgeyB2YXIgcmVzID0gcHJpbS5jYWxsKGlucHV0LCBoaW50IHx8IFwiZGVmYXVsdFwiKTsgaWYgKHR5cGVvZiByZXMgIT09IFwib2JqZWN0XCIpIHJldHVybiByZXM7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKGhpbnQgPT09IFwic3RyaW5nXCIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTsgfVxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnYnVmZmVyJyksXG4gIEJ1ZmZlciA9IF9yZXF1aXJlLkJ1ZmZlcjtcbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCd1dGlsJyksXG4gIGluc3BlY3QgPSBfcmVxdWlyZTIuaW5zcGVjdDtcbnZhciBjdXN0b20gPSBpbnNwZWN0ICYmIGluc3BlY3QuY3VzdG9tIHx8ICdpbnNwZWN0JztcbmZ1bmN0aW9uIGNvcHlCdWZmZXIoc3JjLCB0YXJnZXQsIG9mZnNldCkge1xuICBCdWZmZXIucHJvdG90eXBlLmNvcHkuY2FsbChzcmMsIHRhcmdldCwgb2Zmc2V0KTtcbn1cbm1vZHVsZS5leHBvcnRzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQnVmZmVyTGlzdCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQnVmZmVyTGlzdCk7XG4gICAgdGhpcy5oZWFkID0gbnVsbDtcbiAgICB0aGlzLnRhaWwgPSBudWxsO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoQnVmZmVyTGlzdCwgW3tcbiAgICBrZXk6IFwicHVzaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwdXNoKHYpIHtcbiAgICAgIHZhciBlbnRyeSA9IHtcbiAgICAgICAgZGF0YTogdixcbiAgICAgICAgbmV4dDogbnVsbFxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLmxlbmd0aCA+IDApIHRoaXMudGFpbC5uZXh0ID0gZW50cnk7ZWxzZSB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgICAgIHRoaXMudGFpbCA9IGVudHJ5O1xuICAgICAgKyt0aGlzLmxlbmd0aDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5zaGlmdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bnNoaWZ0KHYpIHtcbiAgICAgIHZhciBlbnRyeSA9IHtcbiAgICAgICAgZGF0YTogdixcbiAgICAgICAgbmV4dDogdGhpcy5oZWFkXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgICAgIHRoaXMuaGVhZCA9IGVudHJ5O1xuICAgICAgKyt0aGlzLmxlbmd0aDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hpZnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hpZnQoKSB7XG4gICAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgIHZhciByZXQgPSB0aGlzLmhlYWQuZGF0YTtcbiAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtlbHNlIHRoaXMuaGVhZCA9IHRoaXMuaGVhZC5uZXh0O1xuICAgICAgLS10aGlzLmxlbmd0aDtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNsZWFyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtcbiAgICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiam9pblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBqb2luKHMpIHtcbiAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICAgICAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gICAgICB2YXIgcmV0ID0gJycgKyBwLmRhdGE7XG4gICAgICB3aGlsZSAocCA9IHAubmV4dCkgcmV0ICs9IHMgKyBwLmRhdGE7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb25jYXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uY2F0KG4pIHtcbiAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgICAgIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobiA+Pj4gMCk7XG4gICAgICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgICAgIHZhciBpID0gMDtcbiAgICAgIHdoaWxlIChwKSB7XG4gICAgICAgIGNvcHlCdWZmZXIocC5kYXRhLCByZXQsIGkpO1xuICAgICAgICBpICs9IHAuZGF0YS5sZW5ndGg7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIC8vIENvbnN1bWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBieXRlcyBvciBjaGFyYWN0ZXJzIGZyb20gdGhlIGJ1ZmZlcmVkIGRhdGEuXG4gIH0sIHtcbiAgICBrZXk6IFwiY29uc3VtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb25zdW1lKG4sIGhhc1N0cmluZ3MpIHtcbiAgICAgIHZhciByZXQ7XG4gICAgICBpZiAobiA8IHRoaXMuaGVhZC5kYXRhLmxlbmd0aCkge1xuICAgICAgICAvLyBgc2xpY2VgIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzLlxuICAgICAgICByZXQgPSB0aGlzLmhlYWQuZGF0YS5zbGljZSgwLCBuKTtcbiAgICAgICAgdGhpcy5oZWFkLmRhdGEgPSB0aGlzLmhlYWQuZGF0YS5zbGljZShuKTtcbiAgICAgIH0gZWxzZSBpZiAobiA9PT0gdGhpcy5oZWFkLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgIC8vIEZpcnN0IGNodW5rIGlzIGEgcGVyZmVjdCBtYXRjaC5cbiAgICAgICAgcmV0ID0gdGhpcy5zaGlmdCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVzdWx0IHNwYW5zIG1vcmUgdGhhbiBvbmUgYnVmZmVyLlxuICAgICAgICByZXQgPSBoYXNTdHJpbmdzID8gdGhpcy5fZ2V0U3RyaW5nKG4pIDogdGhpcy5fZ2V0QnVmZmVyKG4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZmlyc3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmlyc3QoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oZWFkLmRhdGE7XG4gICAgfVxuXG4gICAgLy8gQ29uc3VtZXMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgYnVmZmVyZWQgZGF0YS5cbiAgfSwge1xuICAgIGtleTogXCJfZ2V0U3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRTdHJpbmcobikge1xuICAgICAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gICAgICB2YXIgYyA9IDE7XG4gICAgICB2YXIgcmV0ID0gcC5kYXRhO1xuICAgICAgbiAtPSByZXQubGVuZ3RoO1xuICAgICAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICAgICAgdmFyIHN0ciA9IHAuZGF0YTtcbiAgICAgICAgdmFyIG5iID0gbiA+IHN0ci5sZW5ndGggPyBzdHIubGVuZ3RoIDogbjtcbiAgICAgICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSByZXQgKz0gc3RyO2Vsc2UgcmV0ICs9IHN0ci5zbGljZSgwLCBuKTtcbiAgICAgICAgbiAtPSBuYjtcbiAgICAgICAgaWYgKG4gPT09IDApIHtcbiAgICAgICAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgICsrYztcbiAgICAgICAgICAgIGlmIChwLm5leHQpIHRoaXMuaGVhZCA9IHAubmV4dDtlbHNlIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGVhZCA9IHA7XG4gICAgICAgICAgICBwLmRhdGEgPSBzdHIuc2xpY2UobmIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICArK2M7XG4gICAgICB9XG4gICAgICB0aGlzLmxlbmd0aCAtPSBjO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICAvLyBDb25zdW1lcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgYnl0ZXMgZnJvbSB0aGUgYnVmZmVyZWQgZGF0YS5cbiAgfSwge1xuICAgIGtleTogXCJfZ2V0QnVmZmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRCdWZmZXIobikge1xuICAgICAgdmFyIHJldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuKTtcbiAgICAgIHZhciBwID0gdGhpcy5oZWFkO1xuICAgICAgdmFyIGMgPSAxO1xuICAgICAgcC5kYXRhLmNvcHkocmV0KTtcbiAgICAgIG4gLT0gcC5kYXRhLmxlbmd0aDtcbiAgICAgIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgICAgIHZhciBidWYgPSBwLmRhdGE7XG4gICAgICAgIHZhciBuYiA9IG4gPiBidWYubGVuZ3RoID8gYnVmLmxlbmd0aCA6IG47XG4gICAgICAgIGJ1Zi5jb3B5KHJldCwgcmV0Lmxlbmd0aCAtIG4sIDAsIG5iKTtcbiAgICAgICAgbiAtPSBuYjtcbiAgICAgICAgaWYgKG4gPT09IDApIHtcbiAgICAgICAgICBpZiAobmIgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgICAgICsrYztcbiAgICAgICAgICAgIGlmIChwLm5leHQpIHRoaXMuaGVhZCA9IHAubmV4dDtlbHNlIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGVhZCA9IHA7XG4gICAgICAgICAgICBwLmRhdGEgPSBidWYuc2xpY2UobmIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICArK2M7XG4gICAgICB9XG4gICAgICB0aGlzLmxlbmd0aCAtPSBjO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICAvLyBNYWtlIHN1cmUgdGhlIGxpbmtlZCBsaXN0IG9ubHkgc2hvd3MgdGhlIG1pbmltYWwgbmVjZXNzYXJ5IGluZm9ybWF0aW9uLlxuICB9LCB7XG4gICAga2V5OiBjdXN0b20sXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKF8sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBpbnNwZWN0KHRoaXMsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3B0aW9ucyksIHt9LCB7XG4gICAgICAgIC8vIE9ubHkgaW5zcGVjdCBvbmUgbGV2ZWwuXG4gICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAvLyBJdCBzaG91bGQgbm90IHJlY3Vyc2UuXG4gICAgICAgIGN1c3RvbUluc3BlY3Q6IGZhbHNlXG4gICAgICB9KSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBCdWZmZXJMaXN0O1xufSgpOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7327\n')},1195:module=>{"use strict";eval("\n\n// undocumented cb() API, needed for core, not for public API\nfunction destroy(err, cb) {\n var _this = this;\n var readableDestroyed = this._readableState && this._readableState.destroyed;\n var writableDestroyed = this._writableState && this._writableState.destroyed;\n if (readableDestroyed || writableDestroyed) {\n if (cb) {\n cb(err);\n } else if (err) {\n if (!this._writableState) {\n process.nextTick(emitErrorNT, this, err);\n } else if (!this._writableState.errorEmitted) {\n this._writableState.errorEmitted = true;\n process.nextTick(emitErrorNT, this, err);\n }\n }\n return this;\n }\n\n // we set destroyed to true before firing error callbacks in order\n // to make it re-entrance safe in case destroy() is called within callbacks\n\n if (this._readableState) {\n this._readableState.destroyed = true;\n }\n\n // if this is a duplex stream mark the writable part as destroyed as well\n if (this._writableState) {\n this._writableState.destroyed = true;\n }\n this._destroy(err || null, function (err) {\n if (!cb && err) {\n if (!_this._writableState) {\n process.nextTick(emitErrorAndCloseNT, _this, err);\n } else if (!_this._writableState.errorEmitted) {\n _this._writableState.errorEmitted = true;\n process.nextTick(emitErrorAndCloseNT, _this, err);\n } else {\n process.nextTick(emitCloseNT, _this);\n }\n } else if (cb) {\n process.nextTick(emitCloseNT, _this);\n cb(err);\n } else {\n process.nextTick(emitCloseNT, _this);\n }\n });\n return this;\n}\nfunction emitErrorAndCloseNT(self, err) {\n emitErrorNT(self, err);\n emitCloseNT(self);\n}\nfunction emitCloseNT(self) {\n if (self._writableState && !self._writableState.emitClose) return;\n if (self._readableState && !self._readableState.emitClose) return;\n self.emit('close');\n}\nfunction undestroy() {\n if (this._readableState) {\n this._readableState.destroyed = false;\n this._readableState.reading = false;\n this._readableState.ended = false;\n this._readableState.endEmitted = false;\n }\n if (this._writableState) {\n this._writableState.destroyed = false;\n this._writableState.ended = false;\n this._writableState.ending = false;\n this._writableState.finalCalled = false;\n this._writableState.prefinished = false;\n this._writableState.finished = false;\n this._writableState.errorEmitted = false;\n }\n}\nfunction emitErrorNT(self, err) {\n self.emit('error', err);\n}\nfunction errorOrDestroy(stream, err) {\n // We have tests that rely on errors being emitted\n // in the same tick, so changing this is semver major.\n // For now when you opt-in to autoDestroy we allow\n // the error to be emitted nextTick. In a future\n // semver major update we should change the default to this.\n\n var rState = stream._readableState;\n var wState = stream._writableState;\n if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err);\n}\nmodule.exports = {\n destroy: destroy,\n undestroy: undestroy,\n errorOrDestroy: errorOrDestroy\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE5NS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0ZBQXdGO0FBQ3hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95LmpzPzQ2ODEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vLyB1bmRvY3VtZW50ZWQgY2IoKSBBUEksIG5lZWRlZCBmb3IgY29yZSwgbm90IGZvciBwdWJsaWMgQVBJXG5mdW5jdGlvbiBkZXN0cm95KGVyciwgY2IpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcbiAgdmFyIHJlYWRhYmxlRGVzdHJveWVkID0gdGhpcy5fcmVhZGFibGVTdGF0ZSAmJiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgdmFyIHdyaXRhYmxlRGVzdHJveWVkID0gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgaWYgKHJlYWRhYmxlRGVzdHJveWVkIHx8IHdyaXRhYmxlRGVzdHJveWVkKSB7XG4gICAgaWYgKGNiKSB7XG4gICAgICBjYihlcnIpO1xuICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICBpZiAoIXRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JOVCwgdGhpcywgZXJyKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkKSB7XG4gICAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JOVCwgdGhpcywgZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB3ZSBzZXQgZGVzdHJveWVkIHRvIHRydWUgYmVmb3JlIGZpcmluZyBlcnJvciBjYWxsYmFja3MgaW4gb3JkZXJcbiAgLy8gdG8gbWFrZSBpdCByZS1lbnRyYW5jZSBzYWZlIGluIGNhc2UgZGVzdHJveSgpIGlzIGNhbGxlZCB3aXRoaW4gY2FsbGJhY2tzXG5cbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHRydWU7XG4gIH1cblxuICAvLyBpZiB0aGlzIGlzIGEgZHVwbGV4IHN0cmVhbSBtYXJrIHRoZSB3cml0YWJsZSBwYXJ0IGFzIGRlc3Ryb3llZCBhcyB3ZWxsXG4gIGlmICh0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB0cnVlO1xuICB9XG4gIHRoaXMuX2Rlc3Ryb3koZXJyIHx8IG51bGwsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoIWNiICYmIGVycikge1xuICAgICAgaWYgKCFfdGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRFcnJvckFuZENsb3NlTlQsIF90aGlzLCBlcnIpO1xuICAgICAgfSBlbHNlIGlmICghX3RoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkKSB7XG4gICAgICAgIF90aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdEVycm9yQW5kQ2xvc2VOVCwgX3RoaXMsIGVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRDbG9zZU5ULCBfdGhpcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjYikge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2VOVCwgX3RoaXMpO1xuICAgICAgY2IoZXJyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2VOVCwgX3RoaXMpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufVxuZnVuY3Rpb24gZW1pdEVycm9yQW5kQ2xvc2VOVChzZWxmLCBlcnIpIHtcbiAgZW1pdEVycm9yTlQoc2VsZiwgZXJyKTtcbiAgZW1pdENsb3NlTlQoc2VsZik7XG59XG5mdW5jdGlvbiBlbWl0Q2xvc2VOVChzZWxmKSB7XG4gIGlmIChzZWxmLl93cml0YWJsZVN0YXRlICYmICFzZWxmLl93cml0YWJsZVN0YXRlLmVtaXRDbG9zZSkgcmV0dXJuO1xuICBpZiAoc2VsZi5fcmVhZGFibGVTdGF0ZSAmJiAhc2VsZi5fcmVhZGFibGVTdGF0ZS5lbWl0Q2xvc2UpIHJldHVybjtcbiAgc2VsZi5lbWl0KCdjbG9zZScpO1xufVxuZnVuY3Rpb24gdW5kZXN0cm95KCkge1xuICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB9XG4gIGlmICh0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmZpbmFsQ2FsbGVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5wcmVmaW5pc2hlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBlbWl0RXJyb3JOVChzZWxmLCBlcnIpIHtcbiAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7XG59XG5mdW5jdGlvbiBlcnJvck9yRGVzdHJveShzdHJlYW0sIGVycikge1xuICAvLyBXZSBoYXZlIHRlc3RzIHRoYXQgcmVseSBvbiBlcnJvcnMgYmVpbmcgZW1pdHRlZFxuICAvLyBpbiB0aGUgc2FtZSB0aWNrLCBzbyBjaGFuZ2luZyB0aGlzIGlzIHNlbXZlciBtYWpvci5cbiAgLy8gRm9yIG5vdyB3aGVuIHlvdSBvcHQtaW4gdG8gYXV0b0Rlc3Ryb3kgd2UgYWxsb3dcbiAgLy8gdGhlIGVycm9yIHRvIGJlIGVtaXR0ZWQgbmV4dFRpY2suIEluIGEgZnV0dXJlXG4gIC8vIHNlbXZlciBtYWpvciB1cGRhdGUgd2Ugc2hvdWxkIGNoYW5nZSB0aGUgZGVmYXVsdCB0byB0aGlzLlxuXG4gIHZhciByU3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHZhciB3U3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIGlmIChyU3RhdGUgJiYgclN0YXRlLmF1dG9EZXN0cm95IHx8IHdTdGF0ZSAmJiB3U3RhdGUuYXV0b0Rlc3Ryb3kpIHN0cmVhbS5kZXN0cm95KGVycik7ZWxzZSBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpO1xufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRlc3Ryb3k6IGRlc3Ryb3ksXG4gIHVuZGVzdHJveTogdW5kZXN0cm95LFxuICBlcnJvck9yRGVzdHJveTogZXJyb3JPckRlc3Ryb3lcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1195\n")},8610:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Ported from https://github.com/mafintosh/end-of-stream with\n// permission from the author, Mathias Buus (@mafintosh).\n\n\n\nvar ERR_STREAM_PREMATURE_CLOSE = (__webpack_require__(4012)/* .codes */ .q).ERR_STREAM_PREMATURE_CLOSE;\nfunction once(callback) {\n var called = false;\n return function () {\n if (called) return;\n called = true;\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n callback.apply(this, args);\n };\n}\nfunction noop() {}\nfunction isRequest(stream) {\n return stream.setHeader && typeof stream.abort === 'function';\n}\nfunction eos(stream, opts, callback) {\n if (typeof opts === 'function') return eos(stream, null, opts);\n if (!opts) opts = {};\n callback = once(callback || noop);\n var readable = opts.readable || opts.readable !== false && stream.readable;\n var writable = opts.writable || opts.writable !== false && stream.writable;\n var onlegacyfinish = function onlegacyfinish() {\n if (!stream.writable) onfinish();\n };\n var writableEnded = stream._writableState && stream._writableState.finished;\n var onfinish = function onfinish() {\n writable = false;\n writableEnded = true;\n if (!readable) callback.call(stream);\n };\n var readableEnded = stream._readableState && stream._readableState.endEmitted;\n var onend = function onend() {\n readable = false;\n readableEnded = true;\n if (!writable) callback.call(stream);\n };\n var onerror = function onerror(err) {\n callback.call(stream, err);\n };\n var onclose = function onclose() {\n var err;\n if (readable && !readableEnded) {\n if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();\n return callback.call(stream, err);\n }\n if (writable && !writableEnded) {\n if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();\n return callback.call(stream, err);\n }\n };\n var onrequest = function onrequest() {\n stream.req.on('finish', onfinish);\n };\n if (isRequest(stream)) {\n stream.on('complete', onfinish);\n stream.on('abort', onclose);\n if (stream.req) onrequest();else stream.on('request', onrequest);\n } else if (writable && !stream._writableState) {\n // legacy streams\n stream.on('end', onlegacyfinish);\n stream.on('close', onlegacyfinish);\n }\n stream.on('end', onend);\n stream.on('finish', onfinish);\n if (opts.error !== false) stream.on('error', onerror);\n stream.on('close', onclose);\n return function () {\n stream.removeListener('complete', onfinish);\n stream.removeListener('abort', onclose);\n stream.removeListener('request', onrequest);\n if (stream.req) stream.req.removeListener('finish', onfinish);\n stream.removeListener('end', onlegacyfinish);\n stream.removeListener('close', onlegacyfinish);\n stream.removeListener('finish', onfinish);\n stream.removeListener('end', onend);\n stream.removeListener('error', onerror);\n stream.removeListener('close', onclose);\n };\n}\nmodule.exports = eos;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODYxMC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVhOztBQUViLGlDQUFpQywwQ0FBZ0M7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdFQUF3RSxhQUFhO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEMsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2VuZC1vZi1zdHJlYW0uanM/OTAzYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBQb3J0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWFmaW50b3NoL2VuZC1vZi1zdHJlYW0gd2l0aFxuLy8gcGVybWlzc2lvbiBmcm9tIHRoZSBhdXRob3IsIE1hdGhpYXMgQnV1cyAoQG1hZmludG9zaCkuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFID0gcmVxdWlyZSgnLi4vLi4vLi4vZXJyb3JzJykuY29kZXMuRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0U7XG5mdW5jdGlvbiBvbmNlKGNhbGxiYWNrKSB7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2FsbGVkKSByZXR1cm47XG4gICAgY2FsbGVkID0gdHJ1ZTtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9O1xufVxuZnVuY3Rpb24gbm9vcCgpIHt9XG5mdW5jdGlvbiBpc1JlcXVlc3Qoc3RyZWFtKSB7XG4gIHJldHVybiBzdHJlYW0uc2V0SGVhZGVyICYmIHR5cGVvZiBzdHJlYW0uYWJvcnQgPT09ICdmdW5jdGlvbic7XG59XG5mdW5jdGlvbiBlb3Moc3RyZWFtLCBvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHJldHVybiBlb3Moc3RyZWFtLCBudWxsLCBvcHRzKTtcbiAgaWYgKCFvcHRzKSBvcHRzID0ge307XG4gIGNhbGxiYWNrID0gb25jZShjYWxsYmFjayB8fCBub29wKTtcbiAgdmFyIHJlYWRhYmxlID0gb3B0cy5yZWFkYWJsZSB8fCBvcHRzLnJlYWRhYmxlICE9PSBmYWxzZSAmJiBzdHJlYW0ucmVhZGFibGU7XG4gIHZhciB3cml0YWJsZSA9IG9wdHMud3JpdGFibGUgfHwgb3B0cy53cml0YWJsZSAhPT0gZmFsc2UgJiYgc3RyZWFtLndyaXRhYmxlO1xuICB2YXIgb25sZWdhY3lmaW5pc2ggPSBmdW5jdGlvbiBvbmxlZ2FjeWZpbmlzaCgpIHtcbiAgICBpZiAoIXN0cmVhbS53cml0YWJsZSkgb25maW5pc2goKTtcbiAgfTtcbiAgdmFyIHdyaXRhYmxlRW5kZWQgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGUgJiYgc3RyZWFtLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkO1xuICB2YXIgb25maW5pc2ggPSBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICB3cml0YWJsZSA9IGZhbHNlO1xuICAgIHdyaXRhYmxlRW5kZWQgPSB0cnVlO1xuICAgIGlmICghcmVhZGFibGUpIGNhbGxiYWNrLmNhbGwoc3RyZWFtKTtcbiAgfTtcbiAgdmFyIHJlYWRhYmxlRW5kZWQgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGUgJiYgc3RyZWFtLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQ7XG4gIHZhciBvbmVuZCA9IGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIHJlYWRhYmxlID0gZmFsc2U7XG4gICAgcmVhZGFibGVFbmRlZCA9IHRydWU7XG4gICAgaWYgKCF3cml0YWJsZSkgY2FsbGJhY2suY2FsbChzdHJlYW0pO1xuICB9O1xuICB2YXIgb25lcnJvciA9IGZ1bmN0aW9uIG9uZXJyb3IoZXJyKSB7XG4gICAgY2FsbGJhY2suY2FsbChzdHJlYW0sIGVycik7XG4gIH07XG4gIHZhciBvbmNsb3NlID0gZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICB2YXIgZXJyO1xuICAgIGlmIChyZWFkYWJsZSAmJiAhcmVhZGFibGVFbmRlZCkge1xuICAgICAgaWYgKCFzdHJlYW0uX3JlYWRhYmxlU3RhdGUgfHwgIXN0cmVhbS5fcmVhZGFibGVTdGF0ZS5lbmRlZCkgZXJyID0gbmV3IEVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFKCk7XG4gICAgICByZXR1cm4gY2FsbGJhY2suY2FsbChzdHJlYW0sIGVycik7XG4gICAgfVxuICAgIGlmICh3cml0YWJsZSAmJiAhd3JpdGFibGVFbmRlZCkge1xuICAgICAgaWYgKCFzdHJlYW0uX3dyaXRhYmxlU3RhdGUgfHwgIXN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lbmRlZCkgZXJyID0gbmV3IEVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFKCk7XG4gICAgICByZXR1cm4gY2FsbGJhY2suY2FsbChzdHJlYW0sIGVycik7XG4gICAgfVxuICB9O1xuICB2YXIgb25yZXF1ZXN0ID0gZnVuY3Rpb24gb25yZXF1ZXN0KCkge1xuICAgIHN0cmVhbS5yZXEub24oJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgfTtcbiAgaWYgKGlzUmVxdWVzdChzdHJlYW0pKSB7XG4gICAgc3RyZWFtLm9uKCdjb21wbGV0ZScsIG9uZmluaXNoKTtcbiAgICBzdHJlYW0ub24oJ2Fib3J0Jywgb25jbG9zZSk7XG4gICAgaWYgKHN0cmVhbS5yZXEpIG9ucmVxdWVzdCgpO2Vsc2Ugc3RyZWFtLm9uKCdyZXF1ZXN0Jywgb25yZXF1ZXN0KTtcbiAgfSBlbHNlIGlmICh3cml0YWJsZSAmJiAhc3RyZWFtLl93cml0YWJsZVN0YXRlKSB7XG4gICAgLy8gbGVnYWN5IHN0cmVhbXNcbiAgICBzdHJlYW0ub24oJ2VuZCcsIG9ubGVnYWN5ZmluaXNoKTtcbiAgICBzdHJlYW0ub24oJ2Nsb3NlJywgb25sZWdhY3lmaW5pc2gpO1xuICB9XG4gIHN0cmVhbS5vbignZW5kJywgb25lbmQpO1xuICBzdHJlYW0ub24oJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgaWYgKG9wdHMuZXJyb3IgIT09IGZhbHNlKSBzdHJlYW0ub24oJ2Vycm9yJywgb25lcnJvcik7XG4gIHN0cmVhbS5vbignY2xvc2UnLCBvbmNsb3NlKTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2NvbXBsZXRlJywgb25maW5pc2gpO1xuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignYWJvcnQnLCBvbmNsb3NlKTtcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ3JlcXVlc3QnLCBvbnJlcXVlc3QpO1xuICAgIGlmIChzdHJlYW0ucmVxKSBzdHJlYW0ucmVxLnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmxlZ2FjeWZpbmlzaCk7XG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9ubGVnYWN5ZmluaXNoKTtcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBlb3M7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8610\n")},6307:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval('\n\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }\nvar ERR_INVALID_ARG_TYPE = (__webpack_require__(4012)/* .codes */ .q).ERR_INVALID_ARG_TYPE;\nfunction from(Readable, iterable, opts) {\n var iterator;\n if (iterable && typeof iterable.next === \'function\') {\n iterator = iterable;\n } else if (iterable && iterable[Symbol.asyncIterator]) iterator = iterable[Symbol.asyncIterator]();else if (iterable && iterable[Symbol.iterator]) iterator = iterable[Symbol.iterator]();else throw new ERR_INVALID_ARG_TYPE(\'iterable\', [\'Iterable\'], iterable);\n var readable = new Readable(_objectSpread({\n objectMode: true\n }, opts));\n // Reading boolean to protect against _read\n // being called before last iteration completion.\n var reading = false;\n readable._read = function () {\n if (!reading) {\n reading = true;\n next();\n }\n };\n function next() {\n return _next2.apply(this, arguments);\n }\n function _next2() {\n _next2 = _asyncToGenerator(function* () {\n try {\n var _yield$iterator$next = yield iterator.next(),\n value = _yield$iterator$next.value,\n done = _yield$iterator$next.done;\n if (done) {\n readable.push(null);\n } else if (readable.push(yield value)) {\n next();\n } else {\n reading = false;\n }\n } catch (err) {\n readable.destroy(err);\n }\n });\n return _next2.apply(this, arguments);\n }\n return readable;\n}\nmodule.exports = from;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjMwNy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYiw2RUFBNkUsTUFBTSwwQkFBMEIsMEJBQTBCLGdCQUFnQixlQUFlLFVBQVUsaUJBQWlCLGtCQUFrQixPQUFPO0FBQzFOLGlDQUFpQyxxQkFBcUIsbUNBQW1DLGdEQUFnRCxnQ0FBZ0Msd0JBQXdCLDBFQUEwRSx1QkFBdUIseUVBQXlFLG1CQUFtQjtBQUM5WCwyQ0FBMkMsZ0NBQWdDLG9DQUFvQyxvREFBb0QsNkRBQTZELGlFQUFpRSxzQ0FBc0M7QUFDdlUsaUNBQWlDLGdCQUFnQixzQkFBc0IsT0FBTyx1REFBdUQsNkRBQTZELDRDQUE0QyxvS0FBb0ssbUZBQW1GLEtBQUs7QUFDMWUsNENBQTRDLDJCQUEyQixrQkFBa0Isa0NBQWtDLG9FQUFvRSxLQUFLLE9BQU8sb0JBQW9CO0FBQy9OLCtCQUErQix1Q0FBdUM7QUFDdEUscUNBQXFDLCtEQUErRCxzQ0FBc0MsMEJBQTBCLCtDQUErQyx5Q0FBeUMsdUVBQXVFO0FBQ25VLDJCQUEyQiwwQ0FBZ0M7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGlHQUFpRyx1RkFBdUY7QUFDNUw7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Zyb20uanM/MWVjZiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHsgdHJ5IHsgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpOyB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlOyB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyByZXR1cm47IH0gaWYgKGluZm8uZG9uZSkgeyByZXNvbHZlKHZhbHVlKTsgfSBlbHNlIHsgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOyB9IH1cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBzZWxmID0gdGhpcywgYXJncyA9IGFyZ3VtZW50czsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpOyBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwibmV4dFwiLCB2YWx1ZSk7IH0gZnVuY3Rpb24gX3Rocm93KGVycikgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTsgfSBfbmV4dCh1bmRlZmluZWQpOyB9KTsgfTsgfVxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7IHZhciBrZXkgPSBfdG9QcmltaXRpdmUoYXJnLCBcInN0cmluZ1wiKTsgcmV0dXJuIHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7IGlmICh0eXBlb2YgaW5wdXQgIT09IFwib2JqZWN0XCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDsgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7IHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgXCJkZWZhdWx0XCIpOyBpZiAodHlwZW9mIHJlcyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHJlczsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoaGludCA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOyB9XG52YXIgRVJSX0lOVkFMSURfQVJHX1RZUEUgPSByZXF1aXJlKCcuLi8uLi8uLi9lcnJvcnMnKS5jb2Rlcy5FUlJfSU5WQUxJRF9BUkdfVFlQRTtcbmZ1bmN0aW9uIGZyb20oUmVhZGFibGUsIGl0ZXJhYmxlLCBvcHRzKSB7XG4gIHZhciBpdGVyYXRvcjtcbiAgaWYgKGl0ZXJhYmxlICYmIHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZTtcbiAgfSBlbHNlIGlmIChpdGVyYWJsZSAmJiBpdGVyYWJsZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0pIGl0ZXJhdG9yID0gaXRlcmFibGVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7ZWxzZSBpZiAoaXRlcmFibGUgJiYgaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSkgaXRlcmF0b3IgPSBpdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7ZWxzZSB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2l0ZXJhYmxlJywgWydJdGVyYWJsZSddLCBpdGVyYWJsZSk7XG4gIHZhciByZWFkYWJsZSA9IG5ldyBSZWFkYWJsZShfb2JqZWN0U3ByZWFkKHtcbiAgICBvYmplY3RNb2RlOiB0cnVlXG4gIH0sIG9wdHMpKTtcbiAgLy8gUmVhZGluZyBib29sZWFuIHRvIHByb3RlY3QgYWdhaW5zdCBfcmVhZFxuICAvLyBiZWluZyBjYWxsZWQgYmVmb3JlIGxhc3QgaXRlcmF0aW9uIGNvbXBsZXRpb24uXG4gIHZhciByZWFkaW5nID0gZmFsc2U7XG4gIHJlYWRhYmxlLl9yZWFkID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghcmVhZGluZykge1xuICAgICAgcmVhZGluZyA9IHRydWU7XG4gICAgICBuZXh0KCk7XG4gICAgfVxuICB9O1xuICBmdW5jdGlvbiBuZXh0KCkge1xuICAgIHJldHVybiBfbmV4dDIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuICBmdW5jdGlvbiBfbmV4dDIoKSB7XG4gICAgX25leHQyID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBfeWllbGQkaXRlcmF0b3IkbmV4dCA9IHlpZWxkIGl0ZXJhdG9yLm5leHQoKSxcbiAgICAgICAgICB2YWx1ZSA9IF95aWVsZCRpdGVyYXRvciRuZXh0LnZhbHVlLFxuICAgICAgICAgIGRvbmUgPSBfeWllbGQkaXRlcmF0b3IkbmV4dC5kb25lO1xuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgIHJlYWRhYmxlLnB1c2gobnVsbCk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVhZGFibGUucHVzaCh5aWVsZCB2YWx1ZSkpIHtcbiAgICAgICAgICBuZXh0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVhZGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmVhZGFibGUuZGVzdHJveShlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBfbmV4dDIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuICByZXR1cm4gcmVhZGFibGU7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGZyb207XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6307\n')},9946:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Ported from https://github.com/mafintosh/pump with\n// permission from the author, Mathias Buus (@mafintosh).\n\n\n\nvar eos;\nfunction once(callback) {\n var called = false;\n return function () {\n if (called) return;\n called = true;\n callback.apply(void 0, arguments);\n };\n}\nvar _require$codes = (__webpack_require__(4012)/* .codes */ .q),\n ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS,\n ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED;\nfunction noop(err) {\n // Rethrow the error if it exists to avoid swallowing it\n if (err) throw err;\n}\nfunction isRequest(stream) {\n return stream.setHeader && typeof stream.abort === 'function';\n}\nfunction destroyer(stream, reading, writing, callback) {\n callback = once(callback);\n var closed = false;\n stream.on('close', function () {\n closed = true;\n });\n if (eos === undefined) eos = __webpack_require__(8610);\n eos(stream, {\n readable: reading,\n writable: writing\n }, function (err) {\n if (err) return callback(err);\n closed = true;\n callback();\n });\n var destroyed = false;\n return function (err) {\n if (closed) return;\n if (destroyed) return;\n destroyed = true;\n\n // request.destroy just do .end - .abort is what we want\n if (isRequest(stream)) return stream.abort();\n if (typeof stream.destroy === 'function') return stream.destroy();\n callback(err || new ERR_STREAM_DESTROYED('pipe'));\n };\n}\nfunction call(fn) {\n fn();\n}\nfunction pipe(from, to) {\n return from.pipe(to);\n}\nfunction popCallback(streams) {\n if (!streams.length) return noop;\n if (typeof streams[streams.length - 1] !== 'function') return noop;\n return streams.pop();\n}\nfunction pipeline() {\n for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) {\n streams[_key] = arguments[_key];\n }\n var callback = popCallback(streams);\n if (Array.isArray(streams[0])) streams = streams[0];\n if (streams.length < 2) {\n throw new ERR_MISSING_ARGS('streams');\n }\n var error;\n var destroys = streams.map(function (stream, i) {\n var reading = i < streams.length - 1;\n var writing = i > 0;\n return destroyer(stream, reading, writing, function (err) {\n if (!error) error = err;\n if (err) destroys.forEach(call);\n if (reading) return;\n destroys.forEach(call);\n callback(error);\n });\n });\n return streams.reduce(pipe);\n}\nmodule.exports = pipeline;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTk0Ni5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQiwwQ0FBZ0M7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCwrQkFBK0IsbUJBQU8sQ0FBQyxJQUFpQjtBQUN4RDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUVBQXlFLGFBQWE7QUFDdEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3BpcGVsaW5lLmpzPzVkMWMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gUG9ydGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL21hZmludG9zaC9wdW1wIHdpdGhcbi8vIHBlcm1pc3Npb24gZnJvbSB0aGUgYXV0aG9yLCBNYXRoaWFzIEJ1dXMgKEBtYWZpbnRvc2gpLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBlb3M7XG5mdW5jdGlvbiBvbmNlKGNhbGxiYWNrKSB7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2FsbGVkKSByZXR1cm47XG4gICAgY2FsbGVkID0gdHJ1ZTtcbiAgICBjYWxsYmFjay5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gIH07XG59XG52YXIgX3JlcXVpcmUkY29kZXMgPSByZXF1aXJlKCcuLi8uLi8uLi9lcnJvcnMnKS5jb2RlcyxcbiAgRVJSX01JU1NJTkdfQVJHUyA9IF9yZXF1aXJlJGNvZGVzLkVSUl9NSVNTSU5HX0FSR1MsXG4gIEVSUl9TVFJFQU1fREVTVFJPWUVEID0gX3JlcXVpcmUkY29kZXMuRVJSX1NUUkVBTV9ERVNUUk9ZRUQ7XG5mdW5jdGlvbiBub29wKGVycikge1xuICAvLyBSZXRocm93IHRoZSBlcnJvciBpZiBpdCBleGlzdHMgdG8gYXZvaWQgc3dhbGxvd2luZyBpdFxuICBpZiAoZXJyKSB0aHJvdyBlcnI7XG59XG5mdW5jdGlvbiBpc1JlcXVlc3Qoc3RyZWFtKSB7XG4gIHJldHVybiBzdHJlYW0uc2V0SGVhZGVyICYmIHR5cGVvZiBzdHJlYW0uYWJvcnQgPT09ICdmdW5jdGlvbic7XG59XG5mdW5jdGlvbiBkZXN0cm95ZXIoc3RyZWFtLCByZWFkaW5nLCB3cml0aW5nLCBjYWxsYmFjaykge1xuICBjYWxsYmFjayA9IG9uY2UoY2FsbGJhY2spO1xuICB2YXIgY2xvc2VkID0gZmFsc2U7XG4gIHN0cmVhbS5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgY2xvc2VkID0gdHJ1ZTtcbiAgfSk7XG4gIGlmIChlb3MgPT09IHVuZGVmaW5lZCkgZW9zID0gcmVxdWlyZSgnLi9lbmQtb2Ytc3RyZWFtJyk7XG4gIGVvcyhzdHJlYW0sIHtcbiAgICByZWFkYWJsZTogcmVhZGluZyxcbiAgICB3cml0YWJsZTogd3JpdGluZ1xuICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgY2xvc2VkID0gdHJ1ZTtcbiAgICBjYWxsYmFjaygpO1xuICB9KTtcbiAgdmFyIGRlc3Ryb3llZCA9IGZhbHNlO1xuICByZXR1cm4gZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChjbG9zZWQpIHJldHVybjtcbiAgICBpZiAoZGVzdHJveWVkKSByZXR1cm47XG4gICAgZGVzdHJveWVkID0gdHJ1ZTtcblxuICAgIC8vIHJlcXVlc3QuZGVzdHJveSBqdXN0IGRvIC5lbmQgLSAuYWJvcnQgaXMgd2hhdCB3ZSB3YW50XG4gICAgaWYgKGlzUmVxdWVzdChzdHJlYW0pKSByZXR1cm4gc3RyZWFtLmFib3J0KCk7XG4gICAgaWYgKHR5cGVvZiBzdHJlYW0uZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHN0cmVhbS5kZXN0cm95KCk7XG4gICAgY2FsbGJhY2soZXJyIHx8IG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCgncGlwZScpKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGNhbGwoZm4pIHtcbiAgZm4oKTtcbn1cbmZ1bmN0aW9uIHBpcGUoZnJvbSwgdG8pIHtcbiAgcmV0dXJuIGZyb20ucGlwZSh0byk7XG59XG5mdW5jdGlvbiBwb3BDYWxsYmFjayhzdHJlYW1zKSB7XG4gIGlmICghc3RyZWFtcy5sZW5ndGgpIHJldHVybiBub29wO1xuICBpZiAodHlwZW9mIHN0cmVhbXNbc3RyZWFtcy5sZW5ndGggLSAxXSAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG5vb3A7XG4gIHJldHVybiBzdHJlYW1zLnBvcCgpO1xufVxuZnVuY3Rpb24gcGlwZWxpbmUoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBzdHJlYW1zID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHN0cmVhbXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cbiAgdmFyIGNhbGxiYWNrID0gcG9wQ2FsbGJhY2soc3RyZWFtcyk7XG4gIGlmIChBcnJheS5pc0FycmF5KHN0cmVhbXNbMF0pKSBzdHJlYW1zID0gc3RyZWFtc1swXTtcbiAgaWYgKHN0cmVhbXMubGVuZ3RoIDwgMikge1xuICAgIHRocm93IG5ldyBFUlJfTUlTU0lOR19BUkdTKCdzdHJlYW1zJyk7XG4gIH1cbiAgdmFyIGVycm9yO1xuICB2YXIgZGVzdHJveXMgPSBzdHJlYW1zLm1hcChmdW5jdGlvbiAoc3RyZWFtLCBpKSB7XG4gICAgdmFyIHJlYWRpbmcgPSBpIDwgc3RyZWFtcy5sZW5ndGggLSAxO1xuICAgIHZhciB3cml0aW5nID0gaSA+IDA7XG4gICAgcmV0dXJuIGRlc3Ryb3llcihzdHJlYW0sIHJlYWRpbmcsIHdyaXRpbmcsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmICghZXJyb3IpIGVycm9yID0gZXJyO1xuICAgICAgaWYgKGVycikgZGVzdHJveXMuZm9yRWFjaChjYWxsKTtcbiAgICAgIGlmIChyZWFkaW5nKSByZXR1cm47XG4gICAgICBkZXN0cm95cy5mb3JFYWNoKGNhbGwpO1xuICAgICAgY2FsbGJhY2soZXJyb3IpO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHN0cmVhbXMucmVkdWNlKHBpcGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBwaXBlbGluZTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9946\n")},2457:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar ERR_INVALID_OPT_VALUE = (__webpack_require__(4012)/* .codes */ .q).ERR_INVALID_OPT_VALUE;\nfunction highWaterMarkFrom(options, isDuplex, duplexKey) {\n return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null;\n}\nfunction getHighWaterMark(state, options, duplexKey, isDuplex) {\n var hwm = highWaterMarkFrom(options, isDuplex, duplexKey);\n if (hwm != null) {\n if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) {\n var name = isDuplex ? duplexKey : 'highWaterMark';\n throw new ERR_INVALID_OPT_VALUE(name, hwm);\n }\n return Math.floor(hwm);\n }\n\n // Default value\n return state.objectMode ? 16 : 16 * 1024;\n}\nmodule.exports = {\n getHighWaterMark: getHighWaterMark\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ1Ny5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYiw0QkFBNEIsMENBQWdDO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvc3RhdGUuanM/MGRiNiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBFUlJfSU5WQUxJRF9PUFRfVkFMVUUgPSByZXF1aXJlKCcuLi8uLi8uLi9lcnJvcnMnKS5jb2Rlcy5FUlJfSU5WQUxJRF9PUFRfVkFMVUU7XG5mdW5jdGlvbiBoaWdoV2F0ZXJNYXJrRnJvbShvcHRpb25zLCBpc0R1cGxleCwgZHVwbGV4S2V5KSB7XG4gIHJldHVybiBvcHRpb25zLmhpZ2hXYXRlck1hcmsgIT0gbnVsbCA/IG9wdGlvbnMuaGlnaFdhdGVyTWFyayA6IGlzRHVwbGV4ID8gb3B0aW9uc1tkdXBsZXhLZXldIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGdldEhpZ2hXYXRlck1hcmsoc3RhdGUsIG9wdGlvbnMsIGR1cGxleEtleSwgaXNEdXBsZXgpIHtcbiAgdmFyIGh3bSA9IGhpZ2hXYXRlck1hcmtGcm9tKG9wdGlvbnMsIGlzRHVwbGV4LCBkdXBsZXhLZXkpO1xuICBpZiAoaHdtICE9IG51bGwpIHtcbiAgICBpZiAoIShpc0Zpbml0ZShod20pICYmIE1hdGguZmxvb3IoaHdtKSA9PT0gaHdtKSB8fCBod20gPCAwKSB7XG4gICAgICB2YXIgbmFtZSA9IGlzRHVwbGV4ID8gZHVwbGV4S2V5IDogJ2hpZ2hXYXRlck1hcmsnO1xuICAgICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX09QVF9WQUxVRShuYW1lLCBod20pO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5mbG9vcihod20pO1xuICB9XG5cbiAgLy8gRGVmYXVsdCB2YWx1ZVxuICByZXR1cm4gc3RhdGUub2JqZWN0TW9kZSA/IDE2IDogMTYgKiAxMDI0O1xufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldEhpZ2hXYXRlck1hcms6IGdldEhpZ2hXYXRlck1hcmtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2457\n")},2238:(module,__unused_webpack_exports,__webpack_require__)=>{eval("module.exports = __webpack_require__(2781);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIzOC5qcyIsIm1hcHBpbmdzIjoiQUFBQSwwQ0FBa0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtLmpzP2NjMjUiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdzdHJlYW0nKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2238\n")},1451:(module,exports,__webpack_require__)=>{eval("var Stream = __webpack_require__(2781);\nif (process.env.READABLE_STREAM === 'disable' && Stream) {\n module.exports = Stream.Readable;\n Object.assign(module.exports, Stream);\n module.exports.Stream = Stream;\n} else {\n exports = module.exports = __webpack_require__(9481);\n exports.Stream = Stream || exports;\n exports.Readable = exports;\n exports.Writable = __webpack_require__(4229);\n exports.Duplex = __webpack_require__(6753);\n exports.Transform = __webpack_require__(4605);\n exports.PassThrough = __webpack_require__(2725);\n exports.finished = __webpack_require__(8610);\n exports.pipeline = __webpack_require__(9946);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ1MS5qcyIsIm1hcHBpbmdzIjoiQUFBQSxhQUFhLG1CQUFPLENBQUMsSUFBUTtBQUM3QjtBQUNBO0FBQ0E7QUFDQSxFQUFFLHFCQUFxQjtBQUN2QixFQUFFO0FBQ0YsWUFBWSwwQ0FBcUQ7QUFDakUsRUFBRSxjQUFjO0FBQ2hCLEVBQUUsZ0JBQWdCO0FBQ2xCLEVBQUUsNENBQXVEO0FBQ3pELEVBQUUsMENBQW1EO0FBQ3JELEVBQUUsNkNBQXlEO0FBQzNELEVBQUUsK0NBQTZEO0FBQy9ELEVBQUUsNENBQXFFO0FBQ3ZFLEVBQUUsNENBQWdFO0FBQ2xFIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLmpzPzY5Y2YiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuaWYgKHByb2Nlc3MuZW52LlJFQURBQkxFX1NUUkVBTSA9PT0gJ2Rpc2FibGUnICYmIFN0cmVhbSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IFN0cmVhbS5SZWFkYWJsZTtcbiAgT2JqZWN0LmFzc2lnbihtb2R1bGUuZXhwb3J0cywgU3RyZWFtKTtcbiAgbW9kdWxlLmV4cG9ydHMuU3RyZWFtID0gU3RyZWFtO1xufSBlbHNlIHtcbiAgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcycpO1xuICBleHBvcnRzLlN0cmVhbSA9IFN0cmVhbSB8fCBleHBvcnRzO1xuICBleHBvcnRzLlJlYWRhYmxlID0gZXhwb3J0cztcbiAgZXhwb3J0cy5Xcml0YWJsZSA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fd3JpdGFibGUuanMnKTtcbiAgZXhwb3J0cy5EdXBsZXggPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX2R1cGxleC5qcycpO1xuICBleHBvcnRzLlRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzJyk7XG4gIGV4cG9ydHMuUGFzc1Rocm91Z2ggPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzJyk7XG4gIGV4cG9ydHMuZmluaXNoZWQgPSByZXF1aXJlKCcuL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2VuZC1vZi1zdHJlYW0uanMnKTtcbiAgZXhwb3J0cy5waXBlbGluZSA9IHJlcXVpcmUoJy4vbGliL2ludGVybmFsL3N0cmVhbXMvcGlwZWxpbmUuanMnKTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1451\n")},2141:(module,__unused_webpack_exports,__webpack_require__)=>{eval("module.exports = readdirGlob;\n\nconst fs = __webpack_require__(7147);\nconst { EventEmitter } = __webpack_require__(2361);\nconst { Minimatch } = __webpack_require__(5924);\nconst { resolve } = __webpack_require__(1017);\n\nfunction readdir(dir, strict) {\n return new Promise((resolve, reject) => {\n fs.readdir(dir, {withFileTypes: true} ,(err, files) => {\n if(err) {\n switch (err.code) {\n case 'ENOTDIR': // Not a directory\n if(strict) {\n reject(err);\n } else {\n resolve([]);\n }\n break;\n case 'ENOTSUP': // Operation not supported\n case 'ENOENT': // No such file or directory\n case 'ENAMETOOLONG': // Filename too long\n case 'UNKNOWN':\n resolve([]);\n break;\n case 'ELOOP': // Too many levels of symbolic links\n default:\n reject(err);\n break;\n }\n } else {\n resolve(files);\n }\n });\n });\n}\nfunction stat(file, followSymlinks) {\n return new Promise((resolve, reject) => {\n const statFunc = followSymlinks ? fs.stat : fs.lstat;\n statFunc(file, (err, stats) => {\n if(err) {\n switch (err.code) {\n case 'ENOENT':\n if(followSymlinks) {\n // Fallback to lstat to handle broken links as files\n resolve(stat(file, false)); \n } else {\n resolve(null);\n }\n break;\n default:\n resolve(null);\n break;\n }\n } else {\n resolve(stats);\n }\n });\n });\n}\n\nasync function* exploreWalkAsync(dir, path, followSymlinks, useStat, shouldSkip, strict) {\n let files = await readdir(path + dir, strict);\n for(const file of files) {\n let name = file.name;\n if(name === undefined) {\n // undefined file.name means the `withFileTypes` options is not supported by node\n // we have to call the stat function to know if file is directory or not.\n name = file;\n useStat = true;\n }\n const filename = dir + '/' + name;\n const relative = filename.slice(1); // Remove the leading /\n const absolute = path + '/' + relative;\n let stats = null;\n if(useStat || followSymlinks) {\n stats = await stat(absolute, followSymlinks);\n }\n if(!stats && file.name !== undefined) {\n stats = file;\n }\n if(stats === null) {\n stats = { isDirectory: () => false };\n }\n\n if(stats.isDirectory()) {\n if(!shouldSkip(relative)) {\n yield {relative, absolute, stats};\n yield* exploreWalkAsync(filename, path, followSymlinks, useStat, shouldSkip, false);\n }\n } else {\n yield {relative, absolute, stats};\n }\n }\n}\nasync function* explore(path, followSymlinks, useStat, shouldSkip) {\n yield* exploreWalkAsync('', path, followSymlinks, useStat, shouldSkip, true);\n}\n\n\nfunction readOptions(options) {\n return {\n pattern: options.pattern,\n dot: !!options.dot,\n noglobstar: !!options.noglobstar,\n matchBase: !!options.matchBase,\n nocase: !!options.nocase,\n ignore: options.ignore,\n skip: options.skip,\n\n follow: !!options.follow,\n stat: !!options.stat,\n nodir: !!options.nodir,\n mark: !!options.mark,\n silent: !!options.silent,\n absolute: !!options.absolute\n };\n}\n\nclass ReaddirGlob extends EventEmitter {\n constructor(cwd, options, cb) {\n super();\n if(typeof options === 'function') {\n cb = options;\n options = null;\n }\n\n this.options = readOptions(options || {});\n \n this.matchers = [];\n if(this.options.pattern) {\n const matchers = Array.isArray(this.options.pattern) ? this.options.pattern : [this.options.pattern];\n this.matchers = matchers.map( m =>\n new Minimatch(m, {\n dot: this.options.dot,\n noglobstar:this.options.noglobstar,\n matchBase:this.options.matchBase,\n nocase:this.options.nocase\n })\n );\n }\n \n this.ignoreMatchers = [];\n if(this.options.ignore) {\n const ignorePatterns = Array.isArray(this.options.ignore) ? this.options.ignore : [this.options.ignore];\n this.ignoreMatchers = ignorePatterns.map( ignore =>\n new Minimatch(ignore, {dot: true})\n );\n }\n \n this.skipMatchers = [];\n if(this.options.skip) {\n const skipPatterns = Array.isArray(this.options.skip) ? this.options.skip : [this.options.skip];\n this.skipMatchers = skipPatterns.map( skip =>\n new Minimatch(skip, {dot: true})\n );\n }\n\n this.iterator = explore(resolve(cwd || '.'), this.options.follow, this.options.stat, this._shouldSkipDirectory.bind(this));\n this.paused = false;\n this.inactive = false;\n this.aborted = false;\n \n if(cb) {\n this._matches = []; \n this.on('match', match => this._matches.push(this.options.absolute ? match.absolute : match.relative));\n this.on('error', err => cb(err));\n this.on('end', () => cb(null, this._matches));\n }\n\n setTimeout( () => this._next(), 0);\n }\n\n _shouldSkipDirectory(relative) {\n //console.log(relative, this.skipMatchers.some(m => m.match(relative)));\n return this.skipMatchers.some(m => m.match(relative));\n }\n\n _fileMatches(relative, isDirectory) {\n const file = relative + (isDirectory ? '/' : '');\n return (this.matchers.length === 0 || this.matchers.some(m => m.match(file)))\n && !this.ignoreMatchers.some(m => m.match(file))\n && (!this.options.nodir || !isDirectory);\n }\n\n _next() {\n if(!this.paused && !this.aborted) {\n this.iterator.next()\n .then((obj)=> {\n if(!obj.done) {\n const isDirectory = obj.value.stats.isDirectory();\n if(this._fileMatches(obj.value.relative, isDirectory )) {\n let relative = obj.value.relative;\n let absolute = obj.value.absolute;\n if(this.options.mark && isDirectory) {\n relative += '/';\n absolute += '/';\n }\n if(this.options.stat) {\n this.emit('match', {relative, absolute, stat:obj.value.stats});\n } else {\n this.emit('match', {relative, absolute});\n }\n }\n this._next(this.iterator);\n } else {\n this.emit('end');\n }\n })\n .catch((err) => {\n this.abort();\n this.emit('error', err);\n if(!err.code && !this.options.silent) {\n console.error(err);\n }\n });\n } else {\n this.inactive = true;\n }\n }\n\n abort() {\n this.aborted = true;\n }\n\n pause() {\n this.paused = true;\n }\n\n resume() {\n this.paused = false;\n if(this.inactive) {\n this.inactive = false;\n this._next();\n }\n }\n}\n\n\nfunction readdirGlob(pattern, options, cb) {\n return new ReaddirGlob(pattern, options, cb);\n}\nreaddirGlob.ReaddirGlob = ReaddirGlob;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE0MS5qcyIsIm1hcHBpbmdzIjoiQUFBQTs7QUFFQSxXQUFXLG1CQUFPLENBQUMsSUFBSTtBQUN2QixRQUFRLGVBQWUsRUFBRSxtQkFBTyxDQUFDLElBQVE7QUFDekMsUUFBUSxZQUFZLEVBQUUsbUJBQU8sQ0FBQyxJQUFXO0FBQ3pDLFFBQVEsVUFBVSxFQUFFLG1CQUFPLENBQUMsSUFBTTs7QUFFbEM7QUFDQTtBQUNBLHFCQUFxQixxQkFBcUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7O0FBRUE7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0EsTUFBTTtBQUNOLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixVQUFVO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLFVBQVU7QUFDdkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MseUNBQXlDO0FBQzNFLGNBQWM7QUFDZCxrQ0FBa0MsbUJBQW1CO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9yZWFkZGlyLWdsb2IvaW5kZXguanM/NzI5OCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHJlYWRkaXJHbG9iO1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCB7IEV2ZW50RW1pdHRlciB9ID0gcmVxdWlyZSgnZXZlbnRzJyk7XG5jb25zdCB7IE1pbmltYXRjaCB9ID0gcmVxdWlyZSgnbWluaW1hdGNoJyk7XG5jb25zdCB7IHJlc29sdmUgfSA9IHJlcXVpcmUoJ3BhdGgnKTtcblxuZnVuY3Rpb24gcmVhZGRpcihkaXIsIHN0cmljdCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGZzLnJlYWRkaXIoZGlyLCB7d2l0aEZpbGVUeXBlczogdHJ1ZX0gLChlcnIsIGZpbGVzKSA9PiB7XG4gICAgICBpZihlcnIpIHtcbiAgICAgICAgc3dpdGNoIChlcnIuY29kZSkge1xuICAgICAgICAgIGNhc2UgJ0VOT1RESVInOiAgICAgIC8vIE5vdCBhIGRpcmVjdG9yeVxuICAgICAgICAgICAgaWYoc3RyaWN0KSB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdFTk9UU1VQJzogICAgICAvLyBPcGVyYXRpb24gbm90IHN1cHBvcnRlZFxuICAgICAgICAgIGNhc2UgJ0VOT0VOVCc6ICAgICAgIC8vIE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcbiAgICAgICAgICBjYXNlICdFTkFNRVRPT0xPTkcnOiAvLyBGaWxlbmFtZSB0b28gbG9uZ1xuICAgICAgICAgIGNhc2UgJ1VOS05PV04nOlxuICAgICAgICAgICAgcmVzb2x2ZShbXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdFTE9PUCc6ICAgICAgICAvLyBUb28gbWFueSBsZXZlbHMgb2Ygc3ltYm9saWMgbGlua3NcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShmaWxlcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuZnVuY3Rpb24gc3RhdChmaWxlLCBmb2xsb3dTeW1saW5rcykge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHN0YXRGdW5jID0gZm9sbG93U3ltbGlua3MgPyBmcy5zdGF0IDogZnMubHN0YXQ7XG4gICAgc3RhdEZ1bmMoZmlsZSwgKGVyciwgc3RhdHMpID0+IHtcbiAgICAgIGlmKGVycikge1xuICAgICAgICBzd2l0Y2ggKGVyci5jb2RlKSB7XG4gICAgICAgICAgY2FzZSAnRU5PRU5UJzpcbiAgICAgICAgICAgIGlmKGZvbGxvd1N5bWxpbmtzKSB7XG4gICAgICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGxzdGF0IHRvIGhhbmRsZSBicm9rZW4gbGlua3MgYXMgZmlsZXNcbiAgICAgICAgICAgICAgcmVzb2x2ZShzdGF0KGZpbGUsIGZhbHNlKSk7IFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoc3RhdHMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24qIGV4cGxvcmVXYWxrQXN5bmMoZGlyLCBwYXRoLCBmb2xsb3dTeW1saW5rcywgdXNlU3RhdCwgc2hvdWxkU2tpcCwgc3RyaWN0KSB7XG4gIGxldCBmaWxlcyA9IGF3YWl0IHJlYWRkaXIocGF0aCArIGRpciwgc3RyaWN0KTtcbiAgZm9yKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBsZXQgbmFtZSA9IGZpbGUubmFtZTtcbiAgICBpZihuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIHVuZGVmaW5lZCBmaWxlLm5hbWUgbWVhbnMgdGhlIGB3aXRoRmlsZVR5cGVzYCBvcHRpb25zIGlzIG5vdCBzdXBwb3J0ZWQgYnkgbm9kZVxuICAgICAgLy8gd2UgaGF2ZSB0byBjYWxsIHRoZSBzdGF0IGZ1bmN0aW9uIHRvIGtub3cgaWYgZmlsZSBpcyBkaXJlY3Rvcnkgb3Igbm90LlxuICAgICAgbmFtZSA9IGZpbGU7XG4gICAgICB1c2VTdGF0ID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgZmlsZW5hbWUgPSBkaXIgKyAnLycgKyBuYW1lO1xuICAgIGNvbnN0IHJlbGF0aXZlID0gZmlsZW5hbWUuc2xpY2UoMSk7IC8vIFJlbW92ZSB0aGUgbGVhZGluZyAvXG4gICAgY29uc3QgYWJzb2x1dGUgPSBwYXRoICsgJy8nICsgcmVsYXRpdmU7XG4gICAgbGV0IHN0YXRzID0gbnVsbDtcbiAgICBpZih1c2VTdGF0IHx8IGZvbGxvd1N5bWxpbmtzKSB7XG4gICAgICBzdGF0cyA9IGF3YWl0IHN0YXQoYWJzb2x1dGUsIGZvbGxvd1N5bWxpbmtzKTtcbiAgICB9XG4gICAgaWYoIXN0YXRzICYmIGZpbGUubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdGF0cyA9IGZpbGU7XG4gICAgfVxuICAgIGlmKHN0YXRzID09PSBudWxsKSB7XG4gICAgICBzdGF0cyA9IHsgaXNEaXJlY3Rvcnk6ICgpID0+IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYoc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgaWYoIXNob3VsZFNraXAocmVsYXRpdmUpKSB7XG4gICAgICAgIHlpZWxkIHtyZWxhdGl2ZSwgYWJzb2x1dGUsIHN0YXRzfTtcbiAgICAgICAgeWllbGQqIGV4cGxvcmVXYWxrQXN5bmMoZmlsZW5hbWUsIHBhdGgsIGZvbGxvd1N5bWxpbmtzLCB1c2VTdGF0LCBzaG91bGRTa2lwLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHlpZWxkIHtyZWxhdGl2ZSwgYWJzb2x1dGUsIHN0YXRzfTtcbiAgICB9XG4gIH1cbn1cbmFzeW5jIGZ1bmN0aW9uKiBleHBsb3JlKHBhdGgsIGZvbGxvd1N5bWxpbmtzLCB1c2VTdGF0LCBzaG91bGRTa2lwKSB7XG4gIHlpZWxkKiBleHBsb3JlV2Fsa0FzeW5jKCcnLCBwYXRoLCBmb2xsb3dTeW1saW5rcywgdXNlU3RhdCwgc2hvdWxkU2tpcCwgdHJ1ZSk7XG59XG5cblxuZnVuY3Rpb24gcmVhZE9wdGlvbnMob3B0aW9ucykge1xuICByZXR1cm4ge1xuICAgIHBhdHRlcm46IG9wdGlvbnMucGF0dGVybixcbiAgICBkb3Q6ICEhb3B0aW9ucy5kb3QsXG4gICAgbm9nbG9ic3RhcjogISFvcHRpb25zLm5vZ2xvYnN0YXIsXG4gICAgbWF0Y2hCYXNlOiAhIW9wdGlvbnMubWF0Y2hCYXNlLFxuICAgIG5vY2FzZTogISFvcHRpb25zLm5vY2FzZSxcbiAgICBpZ25vcmU6IG9wdGlvbnMuaWdub3JlLFxuICAgIHNraXA6IG9wdGlvbnMuc2tpcCxcblxuICAgIGZvbGxvdzogISFvcHRpb25zLmZvbGxvdyxcbiAgICBzdGF0OiAhIW9wdGlvbnMuc3RhdCxcbiAgICBub2RpcjogISFvcHRpb25zLm5vZGlyLFxuICAgIG1hcms6ICEhb3B0aW9ucy5tYXJrLFxuICAgIHNpbGVudDogISFvcHRpb25zLnNpbGVudCxcbiAgICBhYnNvbHV0ZTogISFvcHRpb25zLmFic29sdXRlXG4gIH07XG59XG5cbmNsYXNzIFJlYWRkaXJHbG9iIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IoY3dkLCBvcHRpb25zLCBjYikge1xuICAgIHN1cGVyKCk7XG4gICAgaWYodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNiID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IHJlYWRPcHRpb25zKG9wdGlvbnMgfHzCoHt9KTtcbiAgXG4gICAgdGhpcy5tYXRjaGVycyA9IFtdO1xuICAgIGlmKHRoaXMub3B0aW9ucy5wYXR0ZXJuKSB7XG4gICAgICBjb25zdCBtYXRjaGVycyA9IEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLnBhdHRlcm4pID8gdGhpcy5vcHRpb25zLnBhdHRlcm4gOiBbdGhpcy5vcHRpb25zLnBhdHRlcm5dO1xuICAgICAgdGhpcy5tYXRjaGVycyA9IG1hdGNoZXJzLm1hcCggbSA9PlxuICAgICAgICBuZXcgTWluaW1hdGNoKG0sIHtcbiAgICAgICAgICBkb3Q6IHRoaXMub3B0aW9ucy5kb3QsXG4gICAgICAgICAgbm9nbG9ic3Rhcjp0aGlzLm9wdGlvbnMubm9nbG9ic3RhcixcbiAgICAgICAgICBtYXRjaEJhc2U6dGhpcy5vcHRpb25zLm1hdGNoQmFzZSxcbiAgICAgICAgICBub2Nhc2U6dGhpcy5vcHRpb25zLm5vY2FzZVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIFxuICAgIHRoaXMuaWdub3JlTWF0Y2hlcnMgPSBbXTtcbiAgICBpZih0aGlzLm9wdGlvbnMuaWdub3JlKSB7XG4gICAgICBjb25zdCBpZ25vcmVQYXR0ZXJucyA9IEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLmlnbm9yZSkgPyB0aGlzLm9wdGlvbnMuaWdub3JlIDogW3RoaXMub3B0aW9ucy5pZ25vcmVdO1xuICAgICAgdGhpcy5pZ25vcmVNYXRjaGVycyA9IGlnbm9yZVBhdHRlcm5zLm1hcCggaWdub3JlID0+XG4gICAgICAgIG5ldyBNaW5pbWF0Y2goaWdub3JlLCB7ZG90OiB0cnVlfSlcbiAgICAgICk7XG4gICAgfVxuICBcbiAgICB0aGlzLnNraXBNYXRjaGVycyA9IFtdO1xuICAgIGlmKHRoaXMub3B0aW9ucy5za2lwKSB7XG4gICAgICBjb25zdCBza2lwUGF0dGVybnMgPSBBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5za2lwKSA/IHRoaXMub3B0aW9ucy5za2lwIDogW3RoaXMub3B0aW9ucy5za2lwXTtcbiAgICAgIHRoaXMuc2tpcE1hdGNoZXJzID0gc2tpcFBhdHRlcm5zLm1hcCggc2tpcCA9PlxuICAgICAgICBuZXcgTWluaW1hdGNoKHNraXAsIHtkb3Q6IHRydWV9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLml0ZXJhdG9yID0gZXhwbG9yZShyZXNvbHZlKGN3ZCB8fCAnLicpLCB0aGlzLm9wdGlvbnMuZm9sbG93LCB0aGlzLm9wdGlvbnMuc3RhdCwgdGhpcy5fc2hvdWxkU2tpcERpcmVjdG9yeS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuaW5hY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLmFib3J0ZWQgPSBmYWxzZTtcbiAgXG4gICAgaWYoY2IpIHtcbiAgICAgIHRoaXMuX21hdGNoZXMgPSBbXTsgXG4gICAgICB0aGlzLm9uKCdtYXRjaCcsIG1hdGNoID0+IHRoaXMuX21hdGNoZXMucHVzaCh0aGlzLm9wdGlvbnMuYWJzb2x1dGUgPyBtYXRjaC5hYnNvbHV0ZSA6IG1hdGNoLnJlbGF0aXZlKSk7XG4gICAgICB0aGlzLm9uKCdlcnJvcicsIGVyciA9PiBjYihlcnIpKTtcbiAgICAgIHRoaXMub24oJ2VuZCcsICgpID0+IGNiKG51bGwsIHRoaXMuX21hdGNoZXMpKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCAoKSA9PiB0aGlzLl9uZXh0KCksIDApO1xuICB9XG5cbiAgX3Nob3VsZFNraXBEaXJlY3RvcnkocmVsYXRpdmUpIHtcbiAgICAvL2NvbnNvbGUubG9nKHJlbGF0aXZlLCB0aGlzLnNraXBNYXRjaGVycy5zb21lKG0gPT4gbS5tYXRjaChyZWxhdGl2ZSkpKTtcbiAgICByZXR1cm4gdGhpcy5za2lwTWF0Y2hlcnMuc29tZShtID0+IG0ubWF0Y2gocmVsYXRpdmUpKTtcbiAgfVxuXG4gIF9maWxlTWF0Y2hlcyhyZWxhdGl2ZSwgaXNEaXJlY3RvcnkpIHtcbiAgICBjb25zdCBmaWxlID0gcmVsYXRpdmUgKyAoaXNEaXJlY3RvcnkgPyAnLycgOiAnJyk7XG4gICAgcmV0dXJuICh0aGlzLm1hdGNoZXJzLmxlbmd0aCA9PT0gMCB8fCB0aGlzLm1hdGNoZXJzLnNvbWUobSA9PiBtLm1hdGNoKGZpbGUpKSlcbiAgICAgICYmICF0aGlzLmlnbm9yZU1hdGNoZXJzLnNvbWUobSA9PiBtLm1hdGNoKGZpbGUpKVxuICAgICAgJiYgKCF0aGlzLm9wdGlvbnMubm9kaXIgfHwgIWlzRGlyZWN0b3J5KTtcbiAgfVxuXG4gIF9uZXh0KCkge1xuICAgIGlmKCF0aGlzLnBhdXNlZCAmJiAhdGhpcy5hYm9ydGVkKSB7XG4gICAgICB0aGlzLml0ZXJhdG9yLm5leHQoKVxuICAgICAgLnRoZW4oKG9iaik9PiB7XG4gICAgICAgIGlmKCFvYmouZG9uZSkge1xuICAgICAgICAgIGNvbnN0IGlzRGlyZWN0b3J5ID0gb2JqLnZhbHVlLnN0YXRzLmlzRGlyZWN0b3J5KCk7XG4gICAgICAgICAgaWYodGhpcy5fZmlsZU1hdGNoZXMob2JqLnZhbHVlLnJlbGF0aXZlLCBpc0RpcmVjdG9yeSApKSB7XG4gICAgICAgICAgICBsZXQgcmVsYXRpdmUgPSBvYmoudmFsdWUucmVsYXRpdmU7XG4gICAgICAgICAgICBsZXQgYWJzb2x1dGUgPSBvYmoudmFsdWUuYWJzb2x1dGU7XG4gICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMubWFyayAmJiBpc0RpcmVjdG9yeSkge1xuICAgICAgICAgICAgICByZWxhdGl2ZSArPSAnLyc7XG4gICAgICAgICAgICAgIGFic29sdXRlICs9ICcvJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5zdGF0KSB7XG4gICAgICAgICAgICAgIHRoaXMuZW1pdCgnbWF0Y2gnLCB7cmVsYXRpdmUsIGFic29sdXRlLCBzdGF0Om9iai52YWx1ZS5zdGF0c30pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5lbWl0KCdtYXRjaCcsIHtyZWxhdGl2ZSwgYWJzb2x1dGV9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fbmV4dCh0aGlzLml0ZXJhdG9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5hYm9ydCgpO1xuICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgaWYoIWVyci5jb2RlICYmICF0aGlzLm9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbmFjdGl2ZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgYWJvcnQoKSB7XG4gICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHBhdXNlKCkge1xuICAgIHRoaXMucGF1c2VkID0gdHJ1ZTtcbiAgfVxuXG4gIHJlc3VtZSgpIHtcbiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xuICAgIGlmKHRoaXMuaW5hY3RpdmUpIHtcbiAgICAgIHRoaXMuaW5hY3RpdmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuX25leHQoKTtcbiAgICB9XG4gIH1cbn1cblxuXG5mdW5jdGlvbiByZWFkZGlyR2xvYihwYXR0ZXJuLCBvcHRpb25zLCBjYikge1xuICByZXR1cm4gbmV3IFJlYWRkaXJHbG9iKHBhdHRlcm4sIG9wdGlvbnMsIGNiKTtcbn1cbnJlYWRkaXJHbG9iLlJlYWRkaXJHbG9iID0gUmVhZGRpckdsb2I7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2141\n")},4491:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var balanced = __webpack_require__(5623);\n\nmodule.exports = expandTop;\n\nvar escSlash = '\\0SLASH'+Math.random()+'\\0';\nvar escOpen = '\\0OPEN'+Math.random()+'\\0';\nvar escClose = '\\0CLOSE'+Math.random()+'\\0';\nvar escComma = '\\0COMMA'+Math.random()+'\\0';\nvar escPeriod = '\\0PERIOD'+Math.random()+'\\0';\n\nfunction numeric(str) {\n return parseInt(str, 10) == str\n ? parseInt(str, 10)\n : str.charCodeAt(0);\n}\n\nfunction escapeBraces(str) {\n return str.split('\\\\\\\\').join(escSlash)\n .split('\\\\{').join(escOpen)\n .split('\\\\}').join(escClose)\n .split('\\\\,').join(escComma)\n .split('\\\\.').join(escPeriod);\n}\n\nfunction unescapeBraces(str) {\n return str.split(escSlash).join('\\\\')\n .split(escOpen).join('{')\n .split(escClose).join('}')\n .split(escComma).join(',')\n .split(escPeriod).join('.');\n}\n\n\n// Basically just str.split(\",\"), but handling cases\n// where we have nested braced sections, which should be\n// treated as individual members, like {a,{b,c},d}\nfunction parseCommaParts(str) {\n if (!str)\n return [''];\n\n var parts = [];\n var m = balanced('{', '}', str);\n\n if (!m)\n return str.split(',');\n\n var pre = m.pre;\n var body = m.body;\n var post = m.post;\n var p = pre.split(',');\n\n p[p.length-1] += '{' + body + '}';\n var postParts = parseCommaParts(post);\n if (post.length) {\n p[p.length-1] += postParts.shift();\n p.push.apply(p, postParts);\n }\n\n parts.push.apply(parts, p);\n\n return parts;\n}\n\nfunction expandTop(str) {\n if (!str)\n return [];\n\n // I don't know why Bash 4.3 does this, but it does.\n // Anything starting with {} will have the first two bytes preserved\n // but *only* at the top level, so {},a}b will not expand to anything,\n // but a{},b}c will be expanded to [a}c,abc].\n // One could argue that this is a bug in Bash, but since the goal of\n // this module is to match Bash's rules, we escape a leading {}\n if (str.substr(0, 2) === '{}') {\n str = '\\\\{\\\\}' + str.substr(2);\n }\n\n return expand(escapeBraces(str), true).map(unescapeBraces);\n}\n\nfunction embrace(str) {\n return '{' + str + '}';\n}\nfunction isPadded(el) {\n return /^-?0\\d/.test(el);\n}\n\nfunction lte(i, y) {\n return i <= y;\n}\nfunction gte(i, y) {\n return i >= y;\n}\n\nfunction expand(str, isTop) {\n var expansions = [];\n\n var m = balanced('{', '}', str);\n if (!m) return [str];\n\n // no need to expand pre, since it is guaranteed to be free of brace-sets\n var pre = m.pre;\n var post = m.post.length\n ? expand(m.post, false)\n : [''];\n\n if (/\\$$/.test(m.pre)) { \n for (var k = 0; k < post.length; k++) {\n var expansion = pre+ '{' + m.body + '}' + post[k];\n expansions.push(expansion);\n }\n } else {\n var isNumericSequence = /^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(m.body);\n var isAlphaSequence = /^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(m.body);\n var isSequence = isNumericSequence || isAlphaSequence;\n var isOptions = m.body.indexOf(',') >= 0;\n if (!isSequence && !isOptions) {\n // {a},b}\n if (m.post.match(/,.*\\}/)) {\n str = m.pre + '{' + m.body + escClose + m.post;\n return expand(str);\n }\n return [str];\n }\n\n var n;\n if (isSequence) {\n n = m.body.split(/\\.\\./);\n } else {\n n = parseCommaParts(m.body);\n if (n.length === 1) {\n // x{{a,b}}y ==> x{a}y x{b}y\n n = expand(n[0], false).map(embrace);\n if (n.length === 1) {\n return post.map(function(p) {\n return m.pre + n[0] + p;\n });\n }\n }\n }\n\n // at this point, n is the parts, and we know it's not a comma set\n // with a single entry.\n var N;\n\n if (isSequence) {\n var x = numeric(n[0]);\n var y = numeric(n[1]);\n var width = Math.max(n[0].length, n[1].length)\n var incr = n.length == 3\n ? Math.abs(numeric(n[2]))\n : 1;\n var test = lte;\n var reverse = y < x;\n if (reverse) {\n incr *= -1;\n test = gte;\n }\n var pad = n.some(isPadded);\n\n N = [];\n\n for (var i = x; test(i, y); i += incr) {\n var c;\n if (isAlphaSequence) {\n c = String.fromCharCode(i);\n if (c === '\\\\')\n c = '';\n } else {\n c = String(i);\n if (pad) {\n var need = width - c.length;\n if (need > 0) {\n var z = new Array(need + 1).join('0');\n if (i < 0)\n c = '-' + z + c.slice(1);\n else\n c = z + c;\n }\n }\n }\n N.push(c);\n }\n } else {\n N = [];\n\n for (var j = 0; j < n.length; j++) {\n N.push.apply(N, expand(n[j], false));\n }\n }\n\n for (var j = 0; j < N.length; j++) {\n for (var k = 0; k < post.length; k++) {\n var expansion = pre + N[j] + post[k];\n if (!isTop || isSequence || expansion)\n expansions.push(expansion);\n }\n }\n }\n\n return expansions;\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQ5MS5qcyIsIm1hcHBpbmdzIjoiQUFBQSxlQUFlLG1CQUFPLENBQUMsSUFBZ0I7O0FBRXZDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1DQUFtQztBQUNuQyxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0Esd0NBQXdDLEdBQUcsSUFBSTtBQUMvQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBcUIsS0FBSzs7QUFFMUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsYUFBYTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsK0JBQStCO0FBQy9CLHVDQUF1QyxHQUFHO0FBQzFDLFlBQVksR0FBRyx5QkFBeUI7QUFDeEM7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QixjQUFjLEdBQUc7QUFDakI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFdBQVcsWUFBWTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxxQkFBcUIsS0FBSztBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQyw2QkFBNkIsZUFBZTtBQUM1QztBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLEVBQUU7QUFDWiw2QkFBNkI7QUFDN0Isd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsY0FBYyxLQUFLLFFBQVEsRUFBRSxJQUFJLEVBQUU7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLHNCQUFzQixZQUFZO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLGNBQWM7QUFDbEMsc0JBQXNCLGlCQUFpQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL3JlYWRkaXItZ2xvYi9ub2RlX21vZHVsZXMvYnJhY2UtZXhwYW5zaW9uL2luZGV4LmpzPzQ3OTkiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhbGFuY2VkID0gcmVxdWlyZSgnYmFsYW5jZWQtbWF0Y2gnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBhbmRUb3A7XG5cbnZhciBlc2NTbGFzaCA9ICdcXDBTTEFTSCcrTWF0aC5yYW5kb20oKSsnXFwwJztcbnZhciBlc2NPcGVuID0gJ1xcME9QRU4nK01hdGgucmFuZG9tKCkrJ1xcMCc7XG52YXIgZXNjQ2xvc2UgPSAnXFwwQ0xPU0UnK01hdGgucmFuZG9tKCkrJ1xcMCc7XG52YXIgZXNjQ29tbWEgPSAnXFwwQ09NTUEnK01hdGgucmFuZG9tKCkrJ1xcMCc7XG52YXIgZXNjUGVyaW9kID0gJ1xcMFBFUklPRCcrTWF0aC5yYW5kb20oKSsnXFwwJztcblxuZnVuY3Rpb24gbnVtZXJpYyhzdHIpIHtcbiAgcmV0dXJuIHBhcnNlSW50KHN0ciwgMTApID09IHN0clxuICAgID8gcGFyc2VJbnQoc3RyLCAxMClcbiAgICA6IHN0ci5jaGFyQ29kZUF0KDApO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVCcmFjZXMoc3RyKSB7XG4gIHJldHVybiBzdHIuc3BsaXQoJ1xcXFxcXFxcJykuam9pbihlc2NTbGFzaClcbiAgICAgICAgICAgIC5zcGxpdCgnXFxcXHsnKS5qb2luKGVzY09wZW4pXG4gICAgICAgICAgICAuc3BsaXQoJ1xcXFx9Jykuam9pbihlc2NDbG9zZSlcbiAgICAgICAgICAgIC5zcGxpdCgnXFxcXCwnKS5qb2luKGVzY0NvbW1hKVxuICAgICAgICAgICAgLnNwbGl0KCdcXFxcLicpLmpvaW4oZXNjUGVyaW9kKTtcbn1cblxuZnVuY3Rpb24gdW5lc2NhcGVCcmFjZXMoc3RyKSB7XG4gIHJldHVybiBzdHIuc3BsaXQoZXNjU2xhc2gpLmpvaW4oJ1xcXFwnKVxuICAgICAgICAgICAgLnNwbGl0KGVzY09wZW4pLmpvaW4oJ3snKVxuICAgICAgICAgICAgLnNwbGl0KGVzY0Nsb3NlKS5qb2luKCd9JylcbiAgICAgICAgICAgIC5zcGxpdChlc2NDb21tYSkuam9pbignLCcpXG4gICAgICAgICAgICAuc3BsaXQoZXNjUGVyaW9kKS5qb2luKCcuJyk7XG59XG5cblxuLy8gQmFzaWNhbGx5IGp1c3Qgc3RyLnNwbGl0KFwiLFwiKSwgYnV0IGhhbmRsaW5nIGNhc2VzXG4vLyB3aGVyZSB3ZSBoYXZlIG5lc3RlZCBicmFjZWQgc2VjdGlvbnMsIHdoaWNoIHNob3VsZCBiZVxuLy8gdHJlYXRlZCBhcyBpbmRpdmlkdWFsIG1lbWJlcnMsIGxpa2Uge2Ese2IsY30sZH1cbmZ1bmN0aW9uIHBhcnNlQ29tbWFQYXJ0cyhzdHIpIHtcbiAgaWYgKCFzdHIpXG4gICAgcmV0dXJuIFsnJ107XG5cbiAgdmFyIHBhcnRzID0gW107XG4gIHZhciBtID0gYmFsYW5jZWQoJ3snLCAnfScsIHN0cik7XG5cbiAgaWYgKCFtKVxuICAgIHJldHVybiBzdHIuc3BsaXQoJywnKTtcblxuICB2YXIgcHJlID0gbS5wcmU7XG4gIHZhciBib2R5ID0gbS5ib2R5O1xuICB2YXIgcG9zdCA9IG0ucG9zdDtcbiAgdmFyIHAgPSBwcmUuc3BsaXQoJywnKTtcblxuICBwW3AubGVuZ3RoLTFdICs9ICd7JyArIGJvZHkgKyAnfSc7XG4gIHZhciBwb3N0UGFydHMgPSBwYXJzZUNvbW1hUGFydHMocG9zdCk7XG4gIGlmIChwb3N0Lmxlbmd0aCkge1xuICAgIHBbcC5sZW5ndGgtMV0gKz0gcG9zdFBhcnRzLnNoaWZ0KCk7XG4gICAgcC5wdXNoLmFwcGx5KHAsIHBvc3RQYXJ0cyk7XG4gIH1cblxuICBwYXJ0cy5wdXNoLmFwcGx5KHBhcnRzLCBwKTtcblxuICByZXR1cm4gcGFydHM7XG59XG5cbmZ1bmN0aW9uIGV4cGFuZFRvcChzdHIpIHtcbiAgaWYgKCFzdHIpXG4gICAgcmV0dXJuIFtdO1xuXG4gIC8vIEkgZG9uJ3Qga25vdyB3aHkgQmFzaCA0LjMgZG9lcyB0aGlzLCBidXQgaXQgZG9lcy5cbiAgLy8gQW55dGhpbmcgc3RhcnRpbmcgd2l0aCB7fSB3aWxsIGhhdmUgdGhlIGZpcnN0IHR3byBieXRlcyBwcmVzZXJ2ZWRcbiAgLy8gYnV0ICpvbmx5KiBhdCB0aGUgdG9wIGxldmVsLCBzbyB7fSxhfWIgd2lsbCBub3QgZXhwYW5kIHRvIGFueXRoaW5nLFxuICAvLyBidXQgYXt9LGJ9YyB3aWxsIGJlIGV4cGFuZGVkIHRvIFthfWMsYWJjXS5cbiAgLy8gT25lIGNvdWxkIGFyZ3VlIHRoYXQgdGhpcyBpcyBhIGJ1ZyBpbiBCYXNoLCBidXQgc2luY2UgdGhlIGdvYWwgb2ZcbiAgLy8gdGhpcyBtb2R1bGUgaXMgdG8gbWF0Y2ggQmFzaCdzIHJ1bGVzLCB3ZSBlc2NhcGUgYSBsZWFkaW5nIHt9XG4gIGlmIChzdHIuc3Vic3RyKDAsIDIpID09PSAne30nKSB7XG4gICAgc3RyID0gJ1xcXFx7XFxcXH0nICsgc3RyLnN1YnN0cigyKTtcbiAgfVxuXG4gIHJldHVybiBleHBhbmQoZXNjYXBlQnJhY2VzKHN0ciksIHRydWUpLm1hcCh1bmVzY2FwZUJyYWNlcyk7XG59XG5cbmZ1bmN0aW9uIGVtYnJhY2Uoc3RyKSB7XG4gIHJldHVybiAneycgKyBzdHIgKyAnfSc7XG59XG5mdW5jdGlvbiBpc1BhZGRlZChlbCkge1xuICByZXR1cm4gL14tPzBcXGQvLnRlc3QoZWwpO1xufVxuXG5mdW5jdGlvbiBsdGUoaSwgeSkge1xuICByZXR1cm4gaSA8PSB5O1xufVxuZnVuY3Rpb24gZ3RlKGksIHkpIHtcbiAgcmV0dXJuIGkgPj0geTtcbn1cblxuZnVuY3Rpb24gZXhwYW5kKHN0ciwgaXNUb3ApIHtcbiAgdmFyIGV4cGFuc2lvbnMgPSBbXTtcblxuICB2YXIgbSA9IGJhbGFuY2VkKCd7JywgJ30nLCBzdHIpO1xuICBpZiAoIW0pIHJldHVybiBbc3RyXTtcblxuICAvLyBubyBuZWVkIHRvIGV4cGFuZCBwcmUsIHNpbmNlIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgZnJlZSBvZiBicmFjZS1zZXRzXG4gIHZhciBwcmUgPSBtLnByZTtcbiAgdmFyIHBvc3QgPSBtLnBvc3QubGVuZ3RoXG4gICAgPyBleHBhbmQobS5wb3N0LCBmYWxzZSlcbiAgICA6IFsnJ107XG5cbiAgaWYgKC9cXCQkLy50ZXN0KG0ucHJlKSkgeyAgICBcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IHBvc3QubGVuZ3RoOyBrKyspIHtcbiAgICAgIHZhciBleHBhbnNpb24gPSBwcmUrICd7JyArIG0uYm9keSArICd9JyArIHBvc3Rba107XG4gICAgICBleHBhbnNpb25zLnB1c2goZXhwYW5zaW9uKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGlzTnVtZXJpY1NlcXVlbmNlID0gL14tP1xcZCtcXC5cXC4tP1xcZCsoPzpcXC5cXC4tP1xcZCspPyQvLnRlc3QobS5ib2R5KTtcbiAgICB2YXIgaXNBbHBoYVNlcXVlbmNlID0gL15bYS16QS1aXVxcLlxcLlthLXpBLVpdKD86XFwuXFwuLT9cXGQrKT8kLy50ZXN0KG0uYm9keSk7XG4gICAgdmFyIGlzU2VxdWVuY2UgPSBpc051bWVyaWNTZXF1ZW5jZSB8fCBpc0FscGhhU2VxdWVuY2U7XG4gICAgdmFyIGlzT3B0aW9ucyA9IG0uYm9keS5pbmRleE9mKCcsJykgPj0gMDtcbiAgICBpZiAoIWlzU2VxdWVuY2UgJiYgIWlzT3B0aW9ucykge1xuICAgICAgLy8ge2F9LGJ9XG4gICAgICBpZiAobS5wb3N0Lm1hdGNoKC8sLipcXH0vKSkge1xuICAgICAgICBzdHIgPSBtLnByZSArICd7JyArIG0uYm9keSArIGVzY0Nsb3NlICsgbS5wb3N0O1xuICAgICAgICByZXR1cm4gZXhwYW5kKHN0cik7XG4gICAgICB9XG4gICAgICByZXR1cm4gW3N0cl07XG4gICAgfVxuXG4gICAgdmFyIG47XG4gICAgaWYgKGlzU2VxdWVuY2UpIHtcbiAgICAgIG4gPSBtLmJvZHkuc3BsaXQoL1xcLlxcLi8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBuID0gcGFyc2VDb21tYVBhcnRzKG0uYm9keSk7XG4gICAgICBpZiAobi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8geHt7YSxifX15ID09PiB4e2F9eSB4e2J9eVxuICAgICAgICBuID0gZXhwYW5kKG5bMF0sIGZhbHNlKS5tYXAoZW1icmFjZSk7XG4gICAgICAgIGlmIChuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiBwb3N0Lm1hcChmdW5jdGlvbihwKSB7XG4gICAgICAgICAgICByZXR1cm4gbS5wcmUgKyBuWzBdICsgcDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGF0IHRoaXMgcG9pbnQsIG4gaXMgdGhlIHBhcnRzLCBhbmQgd2Uga25vdyBpdCdzIG5vdCBhIGNvbW1hIHNldFxuICAgIC8vIHdpdGggYSBzaW5nbGUgZW50cnkuXG4gICAgdmFyIE47XG5cbiAgICBpZiAoaXNTZXF1ZW5jZSkge1xuICAgICAgdmFyIHggPSBudW1lcmljKG5bMF0pO1xuICAgICAgdmFyIHkgPSBudW1lcmljKG5bMV0pO1xuICAgICAgdmFyIHdpZHRoID0gTWF0aC5tYXgoblswXS5sZW5ndGgsIG5bMV0ubGVuZ3RoKVxuICAgICAgdmFyIGluY3IgPSBuLmxlbmd0aCA9PSAzXG4gICAgICAgID8gTWF0aC5hYnMobnVtZXJpYyhuWzJdKSlcbiAgICAgICAgOiAxO1xuICAgICAgdmFyIHRlc3QgPSBsdGU7XG4gICAgICB2YXIgcmV2ZXJzZSA9IHkgPCB4O1xuICAgICAgaWYgKHJldmVyc2UpIHtcbiAgICAgICAgaW5jciAqPSAtMTtcbiAgICAgICAgdGVzdCA9IGd0ZTtcbiAgICAgIH1cbiAgICAgIHZhciBwYWQgPSBuLnNvbWUoaXNQYWRkZWQpO1xuXG4gICAgICBOID0gW107XG5cbiAgICAgIGZvciAodmFyIGkgPSB4OyB0ZXN0KGksIHkpOyBpICs9IGluY3IpIHtcbiAgICAgICAgdmFyIGM7XG4gICAgICAgIGlmIChpc0FscGhhU2VxdWVuY2UpIHtcbiAgICAgICAgICBjID0gU3RyaW5nLmZyb21DaGFyQ29kZShpKTtcbiAgICAgICAgICBpZiAoYyA9PT0gJ1xcXFwnKVxuICAgICAgICAgICAgYyA9ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGMgPSBTdHJpbmcoaSk7XG4gICAgICAgICAgaWYgKHBhZCkge1xuICAgICAgICAgICAgdmFyIG5lZWQgPSB3aWR0aCAtIGMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKG5lZWQgPiAwKSB7XG4gICAgICAgICAgICAgIHZhciB6ID0gbmV3IEFycmF5KG5lZWQgKyAxKS5qb2luKCcwJyk7XG4gICAgICAgICAgICAgIGlmIChpIDwgMClcbiAgICAgICAgICAgICAgICBjID0gJy0nICsgeiArIGMuc2xpY2UoMSk7XG4gICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBjID0geiArIGM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIE4ucHVzaChjKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgTiA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgTi5wdXNoLmFwcGx5KE4sIGV4cGFuZChuW2pdLCBmYWxzZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgTi5sZW5ndGg7IGorKykge1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBwb3N0Lmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBleHBhbnNpb24gPSBwcmUgKyBOW2pdICsgcG9zdFtrXTtcbiAgICAgICAgaWYgKCFpc1RvcCB8fCBpc1NlcXVlbmNlIHx8IGV4cGFuc2lvbilcbiAgICAgICAgICBleHBhbnNpb25zLnB1c2goZXhwYW5zaW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhwYW5zaW9ucztcbn1cblxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4491\n")},8582:module=>{eval("const isWindows = typeof process === 'object' &&\n process &&\n process.platform === 'win32'\nmodule.exports = isWindows ? { sep: '\\\\' } : { sep: '/' }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODU4Mi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsWUFBWSxJQUFJIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWN0aW9uLXR5cGVzY3JpcHQvLi9ub2RlX21vZHVsZXMvcmVhZGRpci1nbG9iL25vZGVfbW9kdWxlcy9taW5pbWF0Y2gvbGliL3BhdGguanM/YTRkMSJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBpc1dpbmRvd3MgPSB0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiZcbiAgcHJvY2VzcyAmJlxuICBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInXG5tb2R1bGUuZXhwb3J0cyA9IGlzV2luZG93cyA/IHsgc2VwOiAnXFxcXCcgfSA6IHsgc2VwOiAnLycgfVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8582\n")},5924:(module,__unused_webpack_exports,__webpack_require__)=>{eval("const minimatch = module.exports = (p, pattern, options = {}) => {\n assertValidPattern(pattern)\n\n // shortcut: comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n return false\n }\n\n return new Minimatch(pattern, options).match(p)\n}\n\nmodule.exports = minimatch\n\nconst path = __webpack_require__(8582)\nminimatch.sep = path.sep\n\nconst GLOBSTAR = Symbol('globstar **')\nminimatch.GLOBSTAR = GLOBSTAR\nconst expand = __webpack_require__(4491)\n\nconst plTypes = {\n '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},\n '?': { open: '(?:', close: ')?' },\n '+': { open: '(?:', close: ')+' },\n '*': { open: '(?:', close: ')*' },\n '@': { open: '(?:', close: ')' }\n}\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n\n// ** when dots are allowed. Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\\\/|^)(?:\\\\.{1,2})($|\\\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\\\/|^)\\\\.).)*?'\n\n// \"abc\" -> { a:true, b:true, c:true }\nconst charSet = s => s.split('').reduce((set, c) => {\n set[c] = true\n return set\n}, {})\n\n// characters that need to be escaped in RegExp.\nconst reSpecials = charSet('().*{}+?[]^$\\\\!')\n\n// characters that indicate we have to add the pattern start\nconst addPatternStartSet = charSet('[.(')\n\n// normalizes slashes.\nconst slashSplit = /\\/+/\n\nminimatch.filter = (pattern, options = {}) =>\n (p, i, list) => minimatch(p, pattern, options)\n\nconst ext = (a, b = {}) => {\n const t = {}\n Object.keys(a).forEach(k => t[k] = a[k])\n Object.keys(b).forEach(k => t[k] = b[k])\n return t\n}\n\nminimatch.defaults = def => {\n if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n return minimatch\n }\n\n const orig = minimatch\n\n const m = (p, pattern, options) => orig(p, pattern, ext(def, options))\n m.Minimatch = class Minimatch extends orig.Minimatch {\n constructor (pattern, options) {\n super(pattern, ext(def, options))\n }\n }\n m.Minimatch.defaults = options => orig.defaults(ext(def, options)).Minimatch\n m.filter = (pattern, options) => orig.filter(pattern, ext(def, options))\n m.defaults = options => orig.defaults(ext(def, options))\n m.makeRe = (pattern, options) => orig.makeRe(pattern, ext(def, options))\n m.braceExpand = (pattern, options) => orig.braceExpand(pattern, ext(def, options))\n m.match = (list, pattern, options) => orig.match(list, pattern, ext(def, options))\n\n return m\n}\n\n\n\n\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nminimatch.braceExpand = (pattern, options) => braceExpand(pattern, options)\n\nconst braceExpand = (pattern, options = {}) => {\n assertValidPattern(pattern)\n\n // Thanks to Yeting Li for\n // improving this regexp to avoid a ReDOS vulnerability.\n if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n // shortcut. no need to expand.\n return [pattern]\n }\n\n return expand(pattern)\n}\n\nconst MAX_PATTERN_LENGTH = 1024 * 64\nconst assertValidPattern = pattern => {\n if (typeof pattern !== 'string') {\n throw new TypeError('invalid pattern')\n }\n\n if (pattern.length > MAX_PATTERN_LENGTH) {\n throw new TypeError('pattern is too long')\n }\n}\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion. Otherwise, any series\n// of * is equivalent to a single *. Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\nconst SUBPARSE = Symbol('subparse')\n\nminimatch.makeRe = (pattern, options) =>\n new Minimatch(pattern, options || {}).makeRe()\n\nminimatch.match = (list, pattern, options = {}) => {\n const mm = new Minimatch(pattern, options)\n list = list.filter(f => mm.match(f))\n if (mm.options.nonull && !list.length) {\n list.push(pattern)\n }\n return list\n}\n\n// replace stuff like \\* with *\nconst globUnescape = s => s.replace(/\\\\(.)/g, '$1')\nconst charUnescape = s => s.replace(/\\\\([^-\\]])/g, '$1')\nconst regExpEscape = s => s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\nconst braExpEscape = s => s.replace(/[[\\]\\\\]/g, '\\\\$&')\n\nclass Minimatch {\n constructor (pattern, options) {\n assertValidPattern(pattern)\n\n if (!options) options = {}\n\n this.options = options\n this.set = []\n this.pattern = pattern\n this.windowsPathsNoEscape = !!options.windowsPathsNoEscape ||\n options.allowWindowsEscape === false\n if (this.windowsPathsNoEscape) {\n this.pattern = this.pattern.replace(/\\\\/g, '/')\n }\n this.regexp = null\n this.negate = false\n this.comment = false\n this.empty = false\n this.partial = !!options.partial\n\n // make the set of regexps etc.\n this.make()\n }\n\n debug () {}\n\n make () {\n const pattern = this.pattern\n const options = this.options\n\n // empty patterns and comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n this.comment = true\n return\n }\n if (!pattern) {\n this.empty = true\n return\n }\n\n // step 1: figure out negation, etc.\n this.parseNegate()\n\n // step 2: expand braces\n let set = this.globSet = this.braceExpand()\n\n if (options.debug) this.debug = (...args) => console.error(...args)\n\n this.debug(this.pattern, set)\n\n // step 3: now we have a set, so turn each one into a series of path-portion\n // matching patterns.\n // These will be regexps, except in the case of \"**\", which is\n // set to the GLOBSTAR object for globstar behavior,\n // and will not contain any / characters\n set = this.globParts = set.map(s => s.split(slashSplit))\n\n this.debug(this.pattern, set)\n\n // glob --\x3e regexps\n set = set.map((s, si, set) => s.map(this.parse, this))\n\n this.debug(this.pattern, set)\n\n // filter out everything that didn't compile properly.\n set = set.filter(s => s.indexOf(false) === -1)\n\n this.debug(this.pattern, set)\n\n this.set = set\n }\n\n parseNegate () {\n if (this.options.nonegate) return\n\n const pattern = this.pattern\n let negate = false\n let negateOffset = 0\n\n for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n negate = !negate\n negateOffset++\n }\n\n if (negateOffset) this.pattern = pattern.slice(negateOffset)\n this.negate = negate\n }\n\n // set partial to true to test if, for example,\n // \"/a/b\" matches the start of \"/*/b/*/d\"\n // Partial means, if you run out of file before you run\n // out of pattern, then that's fine, as long as all\n // the parts match.\n matchOne (file, pattern, partial) {\n var options = this.options\n\n this.debug('matchOne',\n { 'this': this, file: file, pattern: pattern })\n\n this.debug('matchOne', file.length, pattern.length)\n\n for (var fi = 0,\n pi = 0,\n fl = file.length,\n pl = pattern.length\n ; (fi < fl) && (pi < pl)\n ; fi++, pi++) {\n this.debug('matchOne loop')\n var p = pattern[pi]\n var f = file[fi]\n\n this.debug(pattern, p, f)\n\n // should be impossible.\n // some invalid regexp stuff in the set.\n /* istanbul ignore if */\n if (p === false) return false\n\n if (p === GLOBSTAR) {\n this.debug('GLOBSTAR', [pattern, p, f])\n\n // \"**\"\n // a/**/b/**/c would match the following:\n // a/b/x/y/z/c\n // a/x/y/z/b/c\n // a/b/x/b/x/c\n // a/b/c\n // To do this, take the rest of the pattern after\n // the **, and see if it would match the file remainder.\n // If so, return success.\n // If not, the ** \"swallows\" a segment, and try again.\n // This is recursively awful.\n //\n // a/**/b/**/c matching a/b/x/y/z/c\n // - a matches a\n // - doublestar\n // - matchOne(b/x/y/z/c, b/**/c)\n // - b matches b\n // - doublestar\n // - matchOne(x/y/z/c, c) -> no\n // - matchOne(y/z/c, c) -> no\n // - matchOne(z/c, c) -> no\n // - matchOne(c, c) yes, hit\n var fr = fi\n var pr = pi + 1\n if (pr === pl) {\n this.debug('** at the end')\n // a ** at the end will just swallow the rest.\n // We have found a match.\n // however, it will not swallow /.x, unless\n // options.dot is set.\n // . and .. are *never* matched by **, for explosively\n // exponential reasons.\n for (; fi < fl; fi++) {\n if (file[fi] === '.' || file[fi] === '..' ||\n (!options.dot && file[fi].charAt(0) === '.')) return false\n }\n return true\n }\n\n // ok, let's see if we can swallow whatever we can.\n while (fr < fl) {\n var swallowee = file[fr]\n\n this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee)\n\n // XXX remove this slice. Just pass the start index.\n if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n this.debug('globstar found match!', fr, fl, swallowee)\n // found a match.\n return true\n } else {\n // can't swallow \".\" or \"..\" ever.\n // can only swallow \".foo\" when explicitly asked.\n if (swallowee === '.' || swallowee === '..' ||\n (!options.dot && swallowee.charAt(0) === '.')) {\n this.debug('dot detected!', file, fr, pattern, pr)\n break\n }\n\n // ** swallows a segment, and continue.\n this.debug('globstar swallow a segment, and continue')\n fr++\n }\n }\n\n // no match was found.\n // However, in partial mode, we can't say this is necessarily over.\n // If there's more *pattern* left, then\n /* istanbul ignore if */\n if (partial) {\n // ran out of file\n this.debug('\\n>>> no match, partial?', file, fr, pattern, pr)\n if (fr === fl) return true\n }\n return false\n }\n\n // something other than **\n // non-magic patterns just have to match exactly\n // patterns with magic have been turned into regexps.\n var hit\n if (typeof p === 'string') {\n hit = f === p\n this.debug('string match', p, f, hit)\n } else {\n hit = f.match(p)\n this.debug('pattern match', p, f, hit)\n }\n\n if (!hit) return false\n }\n\n // Note: ending in / means that we'll get a final \"\"\n // at the end of the pattern. This can only match a\n // corresponding \"\" at the end of the file.\n // If the file ends in /, then it can only match a\n // a pattern that ends in /, unless the pattern just\n // doesn't have any more for it. But, a/b/ should *not*\n // match \"a/b/*\", even though \"\" matches against the\n // [^/]*? pattern, except in partial mode, where it might\n // simply not be reached yet.\n // However, a/b/ should still satisfy a/*\n\n // now either we fell off the end of the pattern, or we're done.\n if (fi === fl && pi === pl) {\n // ran out of pattern and filename at the same time.\n // an exact hit!\n return true\n } else if (fi === fl) {\n // ran out of file, but still had pattern left.\n // this is ok if we're doing the match as part of\n // a glob fs traversal.\n return partial\n } else /* istanbul ignore else */ if (pi === pl) {\n // ran out of pattern, still have file left.\n // this is only acceptable if we're on the very last\n // empty segment of a file with a trailing slash.\n // a/* should match a/b/\n return (fi === fl - 1) && (file[fi] === '')\n }\n\n // should be unreachable.\n /* istanbul ignore next */\n throw new Error('wtf?')\n }\n\n braceExpand () {\n return braceExpand(this.pattern, this.options)\n }\n\n parse (pattern, isSub) {\n assertValidPattern(pattern)\n\n const options = this.options\n\n // shortcuts\n if (pattern === '**') {\n if (!options.noglobstar)\n return GLOBSTAR\n else\n pattern = '*'\n }\n if (pattern === '') return ''\n\n let re = ''\n let hasMagic = false\n let escaping = false\n // ? => one single character\n const patternListStack = []\n const negativeLists = []\n let stateChar\n let inClass = false\n let reClassStart = -1\n let classStart = -1\n let cs\n let pl\n let sp\n // . and .. never match anything that doesn't start with .,\n // even when options.dot is set. However, if the pattern\n // starts with ., then traversal patterns can match.\n let dotTravAllowed = pattern.charAt(0) === '.'\n let dotFileAllowed = options.dot || dotTravAllowed\n const patternStart = () =>\n dotTravAllowed\n ? ''\n : dotFileAllowed\n ? '(?!(?:^|\\\\/)\\\\.{1,2}(?:$|\\\\/))'\n : '(?!\\\\.)'\n const subPatternStart = (p) =>\n p.charAt(0) === '.'\n ? ''\n : options.dot\n ? '(?!(?:^|\\\\/)\\\\.{1,2}(?:$|\\\\/))'\n : '(?!\\\\.)'\n\n\n const clearStateChar = () => {\n if (stateChar) {\n // we had some state-tracking character\n // that wasn't consumed by this pass.\n switch (stateChar) {\n case '*':\n re += star\n hasMagic = true\n break\n case '?':\n re += qmark\n hasMagic = true\n break\n default:\n re += '\\\\' + stateChar\n break\n }\n this.debug('clearStateChar %j %j', stateChar, re)\n stateChar = false\n }\n }\n\n for (let i = 0, c; (i < pattern.length) && (c = pattern.charAt(i)); i++) {\n this.debug('%s\\t%s %s %j', pattern, i, re, c)\n\n // skip over any that are escaped.\n if (escaping) {\n /* istanbul ignore next - completely not allowed, even escaped. */\n if (c === '/') {\n return false\n }\n\n if (reSpecials[c]) {\n re += '\\\\'\n }\n re += c\n escaping = false\n continue\n }\n\n switch (c) {\n /* istanbul ignore next */\n case '/': {\n // Should already be path-split by now.\n return false\n }\n\n case '\\\\':\n if (inClass && pattern.charAt(i + 1) === '-') {\n re += c\n continue\n }\n\n clearStateChar()\n escaping = true\n continue\n\n // the various stateChar values\n // for the \"extglob\" stuff.\n case '?':\n case '*':\n case '+':\n case '@':\n case '!':\n this.debug('%s\\t%s %s %j <-- stateChar', pattern, i, re, c)\n\n // all of those are literals inside a class, except that\n // the glob [!a] means [^a] in regexp\n if (inClass) {\n this.debug(' in class')\n if (c === '!' && i === classStart + 1) c = '^'\n re += c\n continue\n }\n\n // if we already have a stateChar, then it means\n // that there was something like ** or +? in there.\n // Handle the stateChar, then proceed with this one.\n this.debug('call clearStateChar %j', stateChar)\n clearStateChar()\n stateChar = c\n // if extglob is disabled, then +(asdf|foo) isn't a thing.\n // just clear the statechar *now*, rather than even diving into\n // the patternList stuff.\n if (options.noext) clearStateChar()\n continue\n\n case '(': {\n if (inClass) {\n re += '('\n continue\n }\n\n if (!stateChar) {\n re += '\\\\('\n continue\n }\n\n const plEntry = {\n type: stateChar,\n start: i - 1,\n reStart: re.length,\n open: plTypes[stateChar].open,\n close: plTypes[stateChar].close,\n }\n this.debug(this.pattern, '\\t', plEntry)\n patternListStack.push(plEntry)\n // negation is (?:(?!(?:js)(?:))[^/]*)\n re += plEntry.open\n // next entry starts with a dot maybe?\n if (plEntry.start === 0 && plEntry.type !== '!') {\n dotTravAllowed = true\n re += subPatternStart(pattern.slice(i + 1))\n }\n this.debug('plType %j %j', stateChar, re)\n stateChar = false\n continue\n }\n\n case ')': {\n const plEntry = patternListStack[patternListStack.length - 1]\n if (inClass || !plEntry) {\n re += '\\\\)'\n continue\n }\n patternListStack.pop()\n\n // closing an extglob\n clearStateChar()\n hasMagic = true\n pl = plEntry\n // negation is (?:(?!js)[^/]*)\n // The others are (?:)\n re += pl.close\n if (pl.type === '!') {\n negativeLists.push(Object.assign(pl, { reEnd: re.length }))\n }\n continue\n }\n\n case '|': {\n const plEntry = patternListStack[patternListStack.length - 1]\n if (inClass || !plEntry) {\n re += '\\\\|'\n continue\n }\n\n clearStateChar()\n re += '|'\n // next subpattern can start with a dot?\n if (plEntry.start === 0 && plEntry.type !== '!') {\n dotTravAllowed = true\n re += subPatternStart(pattern.slice(i + 1))\n }\n continue\n }\n\n // these are mostly the same in regexp and glob\n case '[':\n // swallow any state-tracking char before the [\n clearStateChar()\n\n if (inClass) {\n re += '\\\\' + c\n continue\n }\n\n inClass = true\n classStart = i\n reClassStart = re.length\n re += c\n continue\n\n case ']':\n // a right bracket shall lose its special\n // meaning and represent itself in\n // a bracket expression if it occurs\n // first in the list. -- POSIX.2 2.8.3.2\n if (i === classStart + 1 || !inClass) {\n re += '\\\\' + c\n continue\n }\n\n // split where the last [ was, make sure we don't have\n // an invalid re. if so, re-walk the contents of the\n // would-be class to re-translate any characters that\n // were passed through as-is\n // TODO: It would probably be faster to determine this\n // without a try/catch and a new RegExp, but it's tricky\n // to do safely. For now, this is safe and works.\n cs = pattern.substring(classStart + 1, i)\n try {\n RegExp('[' + braExpEscape(charUnescape(cs)) + ']')\n // looks good, finish up the class.\n re += c\n } catch (er) {\n // out of order ranges in JS are errors, but in glob syntax,\n // they're just a range that matches nothing.\n re = re.substring(0, reClassStart) + '(?:$.)' // match nothing ever\n }\n hasMagic = true\n inClass = false\n continue\n\n default:\n // swallow any state char that wasn't consumed\n clearStateChar()\n\n if (reSpecials[c] && !(c === '^' && inClass)) {\n re += '\\\\'\n }\n\n re += c\n break\n\n } // switch\n } // for\n\n // handle the case where we left a class open.\n // \"[abc\" is valid, equivalent to \"\\[abc\"\n if (inClass) {\n // split where the last [ was, and escape it\n // this is a huge pita. We now have to re-walk\n // the contents of the would-be class to re-translate\n // any characters that were passed through as-is\n cs = pattern.slice(classStart + 1)\n sp = this.parse(cs, SUBPARSE)\n re = re.substring(0, reClassStart) + '\\\\[' + sp[0]\n hasMagic = hasMagic || sp[1]\n }\n\n // handle the case where we had a +( thing at the *end*\n // of the pattern.\n // each pattern list stack adds 3 chars, and we need to go through\n // and escape any | chars that were passed through as-is for the regexp.\n // Go through and escape them, taking care not to double-escape any\n // | chars that were already escaped.\n for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {\n let tail\n tail = re.slice(pl.reStart + pl.open.length)\n this.debug('setting tail', re, pl)\n // maybe some even number of \\, then maybe 1 \\, followed by a |\n tail = tail.replace(/((?:\\\\{2}){0,64})(\\\\?)\\|/g, (_, $1, $2) => {\n /* istanbul ignore else - should already be done */\n if (!$2) {\n // the | isn't already escaped, so escape it.\n $2 = '\\\\'\n }\n\n // need to escape all those slashes *again*, without escaping the\n // one that we need for escaping the | character. As it works out,\n // escaping an even number of slashes can be done by simply repeating\n // it exactly after itself. That's why this trick works.\n //\n // I am sorry that you have to see this.\n return $1 + $1 + $2 + '|'\n })\n\n this.debug('tail=%j\\n %s', tail, tail, pl, re)\n const t = pl.type === '*' ? star\n : pl.type === '?' ? qmark\n : '\\\\' + pl.type\n\n hasMagic = true\n re = re.slice(0, pl.reStart) + t + '\\\\(' + tail\n }\n\n // handle trailing things that only matter at the very end.\n clearStateChar()\n if (escaping) {\n // trailing \\\\\n re += '\\\\\\\\'\n }\n\n // only need to apply the nodot start if the re starts with\n // something that could conceivably capture a dot\n const addPatternStart = addPatternStartSet[re.charAt(0)]\n\n // Hack to work around lack of negative lookbehind in JS\n // A pattern like: *.!(x).!(y|z) needs to ensure that a name\n // like 'a.xyz.yz' doesn't match. So, the first negative\n // lookahead, has to look ALL the way ahead, to the end of\n // the pattern.\n for (let n = negativeLists.length - 1; n > -1; n--) {\n const nl = negativeLists[n]\n\n const nlBefore = re.slice(0, nl.reStart)\n const nlFirst = re.slice(nl.reStart, nl.reEnd - 8)\n let nlAfter = re.slice(nl.reEnd)\n const nlLast = re.slice(nl.reEnd - 8, nl.reEnd) + nlAfter\n\n // Handle nested stuff like *(*.js|!(*.json)), where open parens\n // mean that we should *not* include the ) in the bit that is considered\n // \"after\" the negated section.\n const closeParensBefore = nlBefore.split(')').length\n const openParensBefore = nlBefore.split('(').length - closeParensBefore\n let cleanAfter = nlAfter\n for (let i = 0; i < openParensBefore; i++) {\n cleanAfter = cleanAfter.replace(/\\)[+*?]?/, '')\n }\n nlAfter = cleanAfter\n\n const dollar = nlAfter === '' && isSub !== SUBPARSE ? '(?:$|\\\\/)' : ''\n\n re = nlBefore + nlFirst + nlAfter + dollar + nlLast\n }\n\n // if the re is not \"\" at this point, then we need to make sure\n // it doesn't match against an empty path part.\n // Otherwise a/* will match a/, which it should not.\n if (re !== '' && hasMagic) {\n re = '(?=.)' + re\n }\n\n if (addPatternStart) {\n re = patternStart() + re\n }\n\n // parsing just a piece of a larger pattern.\n if (isSub === SUBPARSE) {\n return [re, hasMagic]\n }\n\n // if it's nocase, and the lcase/uppercase don't match, it's magic\n if (options.nocase && !hasMagic) {\n hasMagic = pattern.toUpperCase() !== pattern.toLowerCase()\n }\n\n // skip the regexp for non-magical patterns\n // unescape anything in it, though, so that it'll be\n // an exact match against a file etc.\n if (!hasMagic) {\n return globUnescape(pattern)\n }\n\n const flags = options.nocase ? 'i' : ''\n try {\n return Object.assign(new RegExp('^' + re + '$', flags), {\n _glob: pattern,\n _src: re,\n })\n } catch (er) /* istanbul ignore next - should be impossible */ {\n // If it was an invalid regular expression, then it can't match\n // anything. This trick looks for a character after the end of\n // the string, which is of course impossible, except in multi-line\n // mode, but it's not a /m regex.\n return new RegExp('$.')\n }\n }\n\n makeRe () {\n if (this.regexp || this.regexp === false) return this.regexp\n\n // at this point, this.set is a 2d array of partial\n // pattern strings, or \"**\".\n //\n // It's better to use .match(). This function shouldn't\n // be used, really, but it's pretty convenient sometimes,\n // when you just want to work with a regex.\n const set = this.set\n\n if (!set.length) {\n this.regexp = false\n return this.regexp\n }\n const options = this.options\n\n const twoStar = options.noglobstar ? star\n : options.dot ? twoStarDot\n : twoStarNoDot\n const flags = options.nocase ? 'i' : ''\n\n // coalesce globstars and regexpify non-globstar patterns\n // if it's the only item, then we just do one twoStar\n // if it's the first, and there are more, prepend (\\/|twoStar\\/)? to next\n // if it's the last, append (\\/twoStar|) to previous\n // if it's in the middle, append (\\/|\\/twoStar\\/) to previous\n // then filter out GLOBSTAR symbols\n let re = set.map(pattern => {\n pattern = pattern.map(p =>\n typeof p === 'string' ? regExpEscape(p)\n : p === GLOBSTAR ? GLOBSTAR\n : p._src\n ).reduce((set, p) => {\n if (!(set[set.length - 1] === GLOBSTAR && p === GLOBSTAR)) {\n set.push(p)\n }\n return set\n }, [])\n pattern.forEach((p, i) => {\n if (p !== GLOBSTAR || pattern[i-1] === GLOBSTAR) {\n return\n }\n if (i === 0) {\n if (pattern.length > 1) {\n pattern[i+1] = '(?:\\\\\\/|' + twoStar + '\\\\\\/)?' + pattern[i+1]\n } else {\n pattern[i] = twoStar\n }\n } else if (i === pattern.length - 1) {\n pattern[i-1] += '(?:\\\\\\/|' + twoStar + ')?'\n } else {\n pattern[i-1] += '(?:\\\\\\/|\\\\\\/' + twoStar + '\\\\\\/)' + pattern[i+1]\n pattern[i+1] = GLOBSTAR\n }\n })\n return pattern.filter(p => p !== GLOBSTAR).join('/')\n }).join('|')\n\n // must match entire pattern\n // ending in a * or ** will make it less strict.\n re = '^(?:' + re + ')$'\n\n // can match anything, as long as it's not this.\n if (this.negate) re = '^(?!' + re + ').*$'\n\n try {\n this.regexp = new RegExp(re, flags)\n } catch (ex) /* istanbul ignore next - should be impossible */ {\n this.regexp = false\n }\n return this.regexp\n }\n\n match (f, partial = this.partial) {\n this.debug('match', f, this.pattern)\n // short-circuit in the case of busted things.\n // comments, etc.\n if (this.comment) return false\n if (this.empty) return f === ''\n\n if (f === '/' && partial) return true\n\n const options = this.options\n\n // windows: need to use /, not \\\n if (path.sep !== '/') {\n f = f.split(path.sep).join('/')\n }\n\n // treat the test path as a set of pathparts.\n f = f.split(slashSplit)\n this.debug(this.pattern, 'split', f)\n\n // just ONE of the pattern sets in this.set needs to match\n // in order for it to be valid. If negating, then just one\n // match means that we have failed.\n // Either way, return on the first hit.\n\n const set = this.set\n this.debug(this.pattern, 'set', set)\n\n // Find the basename of the path by looking for the last non-empty segment\n let filename\n for (let i = f.length - 1; i >= 0; i--) {\n filename = f[i]\n if (filename) break\n }\n\n for (let i = 0; i < set.length; i++) {\n const pattern = set[i]\n let file = f\n if (options.matchBase && pattern.length === 1) {\n file = [filename]\n }\n const hit = this.matchOne(file, pattern, partial)\n if (hit) {\n if (options.flipNegate) return true\n return !this.negate\n }\n }\n\n // didn't get any hits. this is success if it's a negative\n // pattern, failure otherwise.\n if (options.flipNegate) return false\n return this.negate\n }\n\n static defaults (def) {\n return minimatch.defaults(def).Minimatch\n }\n}\n\nminimatch.Minimatch = Minimatch\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkyNC5qcyIsIm1hcHBpbmdzIjoiQUFBQSw0REFBNEQ7QUFDNUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxhQUFhLG1CQUFPLENBQUMsSUFBZTtBQUNwQzs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxtQkFBTyxDQUFDLElBQWlCOztBQUV4QztBQUNBLFNBQVMsc0NBQXNDO0FBQy9DLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsSUFBSTs7QUFFL0M7QUFDQTtBQUNBOztBQUVBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxDQUFDLElBQUk7O0FBRUw7QUFDQSxrQ0FBa0M7O0FBRWxDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx5Q0FBeUM7QUFDekM7O0FBRUEsc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7OztBQU1BO0FBQ0EsS0FBSyxJQUFJO0FBQ1QsS0FBSyxHQUFHO0FBQ1IsS0FBSyxLQUFLO0FBQ1YsS0FBSyxJQUFJLElBQUksRUFBRTtBQUNmLEtBQUssSUFBSSxFQUFFLElBQUk7QUFDZjtBQUNBO0FBQ0EsS0FBSyxJQUFJLE9BQU8sSUFBSTtBQUNwQixLQUFLLEVBQUUsT0FBTyxFQUFFO0FBQ2hCOztBQUVBLDBDQUEwQztBQUMxQzs7QUFFQTtBQUNBO0FBQ0EsNkJBQTZCLFFBQVEsTUFBTTtBQUMzQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQzs7QUFFdEMsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsaURBQWlEO0FBQ3JFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRLDRDQUE0Qzs7QUFFcEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLElBQUk7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixJQUFJO0FBQy9COzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUJBQXVCLGlEQUFpRDtBQUN4RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELGtCQUFrQjtBQUNyRTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLFFBQVE7QUFDUixNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsSUFBSTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxFQUFFLEVBQUUsS0FBSztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLFFBQVE7QUFDbkQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHNCQUFzQjtBQUM1QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0IsUUFBUTtBQUN2QztBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY3Rpb24tdHlwZXNjcmlwdC8uL25vZGVfbW9kdWxlcy9yZWFkZGlyLWdsb2Ivbm9kZV9tb2R1bGVzL21pbmltYXRjaC9taW5pbWF0Y2guanM/ODVmMyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBtaW5pbWF0Y2ggPSBtb2R1bGUuZXhwb3J0cyA9IChwLCBwYXR0ZXJuLCBvcHRpb25zID0ge30pID0+IHtcbiAgYXNzZXJ0VmFsaWRQYXR0ZXJuKHBhdHRlcm4pXG5cbiAgLy8gc2hvcnRjdXQ6IGNvbW1lbnRzIG1hdGNoIG5vdGhpbmcuXG4gIGlmICghb3B0aW9ucy5ub2NvbW1lbnQgJiYgcGF0dGVybi5jaGFyQXQoMCkgPT09ICcjJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIG5ldyBNaW5pbWF0Y2gocGF0dGVybiwgb3B0aW9ucykubWF0Y2gocClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtaW5pbWF0Y2hcblxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJy4vbGliL3BhdGguanMnKVxubWluaW1hdGNoLnNlcCA9IHBhdGguc2VwXG5cbmNvbnN0IEdMT0JTVEFSID0gU3ltYm9sKCdnbG9ic3RhciAqKicpXG5taW5pbWF0Y2guR0xPQlNUQVIgPSBHTE9CU1RBUlxuY29uc3QgZXhwYW5kID0gcmVxdWlyZSgnYnJhY2UtZXhwYW5zaW9uJylcblxuY29uc3QgcGxUeXBlcyA9IHtcbiAgJyEnOiB7IG9wZW46ICcoPzooPyEoPzonLCBjbG9zZTogJykpW14vXSo/KSd9LFxuICAnPyc6IHsgb3BlbjogJyg/OicsIGNsb3NlOiAnKT8nIH0sXG4gICcrJzogeyBvcGVuOiAnKD86JywgY2xvc2U6ICcpKycgfSxcbiAgJyonOiB7IG9wZW46ICcoPzonLCBjbG9zZTogJykqJyB9LFxuICAnQCc6IHsgb3BlbjogJyg/OicsIGNsb3NlOiAnKScgfVxufVxuXG4vLyBhbnkgc2luZ2xlIHRoaW5nIG90aGVyIHRoYW4gL1xuLy8gZG9uJ3QgbmVlZCB0byBlc2NhcGUgLyB3aGVuIHVzaW5nIG5ldyBSZWdFeHAoKVxuY29uc3QgcW1hcmsgPSAnW14vXSdcblxuLy8gKiA9PiBhbnkgbnVtYmVyIG9mIGNoYXJhY3RlcnNcbmNvbnN0IHN0YXIgPSBxbWFyayArICcqPydcblxuLy8gKiogd2hlbiBkb3RzIGFyZSBhbGxvd2VkLiAgQW55dGhpbmcgZ29lcywgZXhjZXB0IC4uIGFuZCAuXG4vLyBub3QgKF4gb3IgLyBmb2xsb3dlZCBieSBvbmUgb3IgdHdvIGRvdHMgZm9sbG93ZWQgYnkgJCBvciAvKSxcbi8vIGZvbGxvd2VkIGJ5IGFueXRoaW5nLCBhbnkgbnVtYmVyIG9mIHRpbWVzLlxuY29uc3QgdHdvU3RhckRvdCA9ICcoPzooPyEoPzpcXFxcXFwvfF4pKD86XFxcXC57MSwyfSkoJHxcXFxcXFwvKSkuKSo/J1xuXG4vLyBub3QgYSBeIG9yIC8gZm9sbG93ZWQgYnkgYSBkb3QsXG4vLyBmb2xsb3dlZCBieSBhbnl0aGluZywgYW55IG51bWJlciBvZiB0aW1lcy5cbmNvbnN0IHR3b1N0YXJOb0RvdCA9ICcoPzooPyEoPzpcXFxcXFwvfF4pXFxcXC4pLikqPydcblxuLy8gXCJhYmNcIiAtPiB7IGE6dHJ1ZSwgYjp0cnVlLCBjOnRydWUgfVxuY29uc3QgY2hhclNldCA9IHMgPT4gcy5zcGxpdCgnJykucmVkdWNlKChzZXQsIGMpID0+IHtcbiAgc2V0W2NdID0gdHJ1ZVxuICByZXR1cm4gc2V0XG59LCB7fSlcblxuLy8gY2hhcmFjdGVycyB0aGF0IG5lZWQgdG8gYmUgZXNjYXBlZCBpbiBSZWdFeHAuXG5jb25zdCByZVNwZWNpYWxzID0gY2hhclNldCgnKCkuKnt9Kz9bXV4kXFxcXCEnKVxuXG4vLyBjaGFyYWN0ZXJzIHRoYXQgaW5kaWNhdGUgd2UgaGF2ZSB0byBhZGQgdGhlIHBhdHRlcm4gc3RhcnRcbmNvbnN0IGFkZFBhdHRlcm5TdGFydFNldCA9IGNoYXJTZXQoJ1suKCcpXG5cbi8vIG5vcm1hbGl6ZXMgc2xhc2hlcy5cbmNvbnN0IHNsYXNoU3BsaXQgPSAvXFwvKy9cblxubWluaW1hdGNoLmZpbHRlciA9IChwYXR0ZXJuLCBvcHRpb25zID0ge30pID0+XG4gIChwLCBpLCBsaXN0KSA9PiBtaW5pbWF0Y2gocCwgcGF0dGVybiwgb3B0aW9ucylcblxuY29uc3QgZXh0ID0gKGEsIGIgPSB7fSkgPT4ge1xuICBjb25zdCB0ID0ge31cbiAgT2JqZWN0LmtleXMoYSkuZm9yRWFjaChrID0+IHRba10gPSBhW2tdKVxuICBPYmplY3Qua2V5cyhiKS5mb3JFYWNoKGsgPT4gdFtrXSA9IGJba10pXG4gIHJldHVybiB0XG59XG5cbm1pbmltYXRjaC5kZWZhdWx0cyA9IGRlZiA9PiB7XG4gIGlmICghZGVmIHx8IHR5cGVvZiBkZWYgIT09ICdvYmplY3QnIHx8ICFPYmplY3Qua2V5cyhkZWYpLmxlbmd0aCkge1xuICAgIHJldHVybiBtaW5pbWF0Y2hcbiAgfVxuXG4gIGNvbnN0IG9yaWcgPSBtaW5pbWF0Y2hcblxuICBjb25zdCBtID0gKHAsIHBhdHRlcm4sIG9wdGlvbnMpID0+IG9yaWcocCwgcGF0dGVybiwgZXh0KGRlZiwgb3B0aW9ucykpXG4gIG0uTWluaW1hdGNoID0gY2xhc3MgTWluaW1hdGNoIGV4dGVuZHMgb3JpZy5NaW5pbWF0Y2gge1xuICAgIGNvbnN0cnVjdG9yIChwYXR0ZXJuLCBvcHRpb25zKSB7XG4gICAgICBzdXBlcihwYXR0ZXJuLCBleHQoZGVmLCBvcHRpb25zKSlcbiAgICB9XG4gIH1cbiAgbS5NaW5pbWF0Y2guZGVmYXVsdHMgPSBvcHRpb25zID0+IG9yaWcuZGVmYXVsdHMoZXh0KGRlZiwgb3B0aW9ucykpLk1pbmltYXRjaFxuICBtLmZpbHRlciA9IChwYXR0ZXJuLCBvcHRpb25zKSA9PiBvcmlnLmZpbHRlcihwYXR0ZXJuLCBleHQoZGVmLCBvcHRpb25zKSlcbiAgbS5kZWZhdWx0cyA9IG9wdGlvbnMgPT4gb3JpZy5kZWZhdWx0cyhleHQoZGVmLCBvcHRpb25zKSlcbiAgbS5tYWtlUmUgPSAocGF0dGVybiwgb3B0aW9ucykgPT4gb3JpZy5tYWtlUmUocGF0dGVybiwgZXh0KGRlZiwgb3B0aW9ucykpXG4gIG0uYnJhY2VFeHBhbmQgPSAocGF0dGVybiwgb3B0aW9ucykgPT4gb3JpZy5icmFjZUV4cGFuZChwYXR0ZXJuLCBleHQoZGVmLCBvcHRpb25zKSlcbiAgbS5tYXRjaCA9IChsaXN0LCBwYXR0ZXJuLCBvcHRpb25zKSA9PiBvcmlnLm1hdGNoKGxpc3QsIHBhdHRlcm4sIGV4dChkZWYsIG9wdGlvbnMpKVxuXG4gIHJldHVybiBtXG59XG5cblxuXG5cblxuLy8gQnJhY2UgZXhwYW5zaW9uOlxuLy8gYXtiLGN9ZCAtPiBhYmQgYWNkXG4vLyBhe2IsfWMgLT4gYWJjIGFjXG4vLyBhezAuLjN9ZCAtPiBhMGQgYTFkIGEyZCBhM2Rcbi8vIGF7Yixje2QsZX1mfWcgLT4gYWJnIGFjZGZnIGFjZWZnXG4vLyBhe2IsY31ke2UsZn1nIC0+IGFiZGVnIGFjZGVnIGFiZGVnIGFiZGZnXG4vL1xuLy8gSW52YWxpZCBzZXRzIGFyZSBub3QgZXhwYW5kZWQuXG4vLyBhezIuLn1iIC0+IGF7Mi4ufWJcbi8vIGF7Yn1jIC0+IGF7Yn1jXG5taW5pbWF0Y2guYnJhY2VFeHBhbmQgPSAocGF0dGVybiwgb3B0aW9ucykgPT4gYnJhY2VFeHBhbmQocGF0dGVybiwgb3B0aW9ucylcblxuY29uc3QgYnJhY2VFeHBhbmQgPSAocGF0dGVybiwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGFzc2VydFZhbGlkUGF0dGVybihwYXR0ZXJuKVxuXG4gIC8vIFRoYW5rcyB0byBZZXRpbmcgTGkgPGh0dHBzOi8vZ2l0aHViLmNvbS95ZXRpbmdsaT4gZm9yXG4gIC8vIGltcHJvdmluZyB0aGlzIHJlZ2V4cCB0byBhdm9pZCBhIFJlRE9TIHZ1bG5lcmFiaWxpdHkuXG4gIGlmIChvcHRpb25zLm5vYnJhY2UgfHwgIS9cXHsoPzooPyFcXHspLikqXFx9Ly50ZXN0KHBhdHRlcm4pKSB7XG4gICAgLy8gc2hvcnRjdXQuIG5vIG5lZWQgdG8gZXhwYW5kLlxuICAgIHJldHVybiBbcGF0dGVybl1cbiAgfVxuXG4gIHJldHVybiBleHBhbmQocGF0dGVybilcbn1cblxuY29uc3QgTUFYX1BBVFRFUk5fTEVOR1RIID0gMTAyNCAqIDY0XG5jb25zdCBhc3NlcnRWYWxpZFBhdHRlcm4gPSBwYXR0ZXJuID0+IHtcbiAgaWYgKHR5cGVvZiBwYXR0ZXJuICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgcGF0dGVybicpXG4gIH1cblxuICBpZiAocGF0dGVybi5sZW5ndGggPiBNQVhfUEFUVEVSTl9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXR0ZXJuIGlzIHRvbyBsb25nJylcbiAgfVxufVxuXG4vLyBwYXJzZSBhIGNvbXBvbmVudCBvZiB0aGUgZXhwYW5kZWQgc2V0LlxuLy8gQXQgdGhpcyBwb2ludCwgbm8gcGF0dGVybiBtYXkgY29udGFpbiBcIi9cIiBpbiBpdFxuLy8gc28gd2UncmUgZ29pbmcgdG8gcmV0dXJuIGEgMmQgYXJyYXksIHdoZXJlIGVhY2ggZW50cnkgaXMgdGhlIGZ1bGxcbi8vIHBhdHRlcm4sIHNwbGl0IG9uICcvJywgYW5kIHRoZW4gdHVybmVkIGludG8gYSByZWd1bGFyIGV4cHJlc3Npb24uXG4vLyBBIHJlZ2V4cCBpcyBtYWRlIGF0IHRoZSBlbmQgd2hpY2ggam9pbnMgZWFjaCBhcnJheSB3aXRoIGFuXG4vLyBlc2NhcGVkIC8sIGFuZCBhbm90aGVyIGZ1bGwgb25lIHdoaWNoIGpvaW5zIGVhY2ggcmVnZXhwIHdpdGggfC5cbi8vXG4vLyBGb2xsb3dpbmcgdGhlIGxlYWQgb2YgQmFzaCA0LjEsIG5vdGUgdGhhdCBcIioqXCIgb25seSBoYXMgc3BlY2lhbCBtZWFuaW5nXG4vLyB3aGVuIGl0IGlzIHRoZSAqb25seSogdGhpbmcgaW4gYSBwYXRoIHBvcnRpb24uICBPdGhlcndpc2UsIGFueSBzZXJpZXNcbi8vIG9mICogaXMgZXF1aXZhbGVudCB0byBhIHNpbmdsZSAqLiAgR2xvYnN0YXIgYmVoYXZpb3IgaXMgZW5hYmxlZCBieVxuLy8gZGVmYXVsdCwgYW5kIGNhbiBiZSBkaXNhYmxlZCBieSBzZXR0aW5nIG9wdGlvbnMubm9nbG9ic3Rhci5cbmNvbnN0IFNVQlBBUlNFID0gU3ltYm9sKCdzdWJwYXJzZScpXG5cbm1pbmltYXRjaC5tYWtlUmUgPSAocGF0dGVybiwgb3B0aW9ucykgPT5cbiAgbmV3IE1pbmltYXRjaChwYXR0ZXJuLCBvcHRpb25zIHx8IHt9KS5tYWtlUmUoKVxuXG5taW5pbWF0Y2gubWF0Y2ggPSAobGlzdCwgcGF0dGVybiwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IG1tID0gbmV3IE1pbmltYXRjaChwYXR0ZXJuLCBvcHRpb25zKVxuICBsaXN0ID0gbGlzdC5maWx0ZXIoZiA9PiBtbS5tYXRjaChmKSlcbiAgaWYgKG1tLm9wdGlvbnMubm9udWxsICYmICFsaXN0Lmxlbmd0aCkge1xuICAgIGxpc3QucHVzaChwYXR0ZXJuKVxuICB9XG4gIHJldHVybiBsaXN0XG59XG5cbi8vIHJlcGxhY2Ugc3R1ZmYgbGlrZSBcXCogd2l0aCAqXG5jb25zdCBnbG9iVW5lc2NhcGUgPSBzID0+IHMucmVwbGFjZSgvXFxcXCguKS9nLCAnJDEnKVxuY29uc3QgY2hhclVuZXNjYXBlID0gcyA9PiBzLnJlcGxhY2UoL1xcXFwoW14tXFxdXSkvZywgJyQxJylcbmNvbnN0IHJlZ0V4cEVzY2FwZSA9IHMgPT4gcy5yZXBsYWNlKC9bLVtcXF17fSgpKis/LixcXFxcXiR8I1xcc10vZywgJ1xcXFwkJicpXG5jb25zdCBicmFFeHBFc2NhcGUgPSBzID0+IHMucmVwbGFjZSgvW1tcXF1cXFxcXS9nLCAnXFxcXCQmJylcblxuY2xhc3MgTWluaW1hdGNoIHtcbiAgY29uc3RydWN0b3IgKHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgICBhc3NlcnRWYWxpZFBhdHRlcm4ocGF0dGVybilcblxuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5zZXQgPSBbXVxuICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm5cbiAgICB0aGlzLndpbmRvd3NQYXRoc05vRXNjYXBlID0gISFvcHRpb25zLndpbmRvd3NQYXRoc05vRXNjYXBlIHx8XG4gICAgICBvcHRpb25zLmFsbG93V2luZG93c0VzY2FwZSA9PT0gZmFsc2VcbiAgICBpZiAodGhpcy53aW5kb3dzUGF0aHNOb0VzY2FwZSkge1xuICAgICAgdGhpcy5wYXR0ZXJuID0gdGhpcy5wYXR0ZXJuLnJlcGxhY2UoL1xcXFwvZywgJy8nKVxuICAgIH1cbiAgICB0aGlzLnJlZ2V4cCA9IG51bGxcbiAgICB0aGlzLm5lZ2F0ZSA9IGZhbHNlXG4gICAgdGhpcy5jb21tZW50ID0gZmFsc2VcbiAgICB0aGlzLmVtcHR5ID0gZmFsc2VcbiAgICB0aGlzLnBhcnRpYWwgPSAhIW9wdGlvbnMucGFydGlhbFxuXG4gICAgLy8gbWFrZSB0aGUgc2V0IG9mIHJlZ2V4cHMgZXRjLlxuICAgIHRoaXMubWFrZSgpXG4gIH1cblxuICBkZWJ1ZyAoKSB7fVxuXG4gIG1ha2UgKCkge1xuICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLnBhdHRlcm5cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zXG5cbiAgICAvLyBlbXB0eSBwYXR0ZXJucyBhbmQgY29tbWVudHMgbWF0Y2ggbm90aGluZy5cbiAgICBpZiAoIW9wdGlvbnMubm9jb21tZW50ICYmIHBhdHRlcm4uY2hhckF0KDApID09PSAnIycpIHtcbiAgICAgIHRoaXMuY29tbWVudCA9IHRydWVcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIXBhdHRlcm4pIHtcbiAgICAgIHRoaXMuZW1wdHkgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBzdGVwIDE6IGZpZ3VyZSBvdXQgbmVnYXRpb24sIGV0Yy5cbiAgICB0aGlzLnBhcnNlTmVnYXRlKClcblxuICAgIC8vIHN0ZXAgMjogZXhwYW5kIGJyYWNlc1xuICAgIGxldCBzZXQgPSB0aGlzLmdsb2JTZXQgPSB0aGlzLmJyYWNlRXhwYW5kKClcblxuICAgIGlmIChvcHRpb25zLmRlYnVnKSB0aGlzLmRlYnVnID0gKC4uLmFyZ3MpID0+IGNvbnNvbGUuZXJyb3IoLi4uYXJncylcblxuICAgIHRoaXMuZGVidWcodGhpcy5wYXR0ZXJuLCBzZXQpXG5cbiAgICAvLyBzdGVwIDM6IG5vdyB3ZSBoYXZlIGEgc2V0LCBzbyB0dXJuIGVhY2ggb25lIGludG8gYSBzZXJpZXMgb2YgcGF0aC1wb3J0aW9uXG4gICAgLy8gbWF0Y2hpbmcgcGF0dGVybnMuXG4gICAgLy8gVGhlc2Ugd2lsbCBiZSByZWdleHBzLCBleGNlcHQgaW4gdGhlIGNhc2Ugb2YgXCIqKlwiLCB3aGljaCBpc1xuICAgIC8vIHNldCB0byB0aGUgR0xPQlNUQVIgb2JqZWN0IGZvciBnbG9ic3RhciBiZWhhdmlvcixcbiAgICAvLyBhbmQgd2lsbCBub3QgY29udGFpbiBhbnkgLyBjaGFyYWN0ZXJzXG4gICAgc2V0ID0gdGhpcy5nbG9iUGFydHMgPSBzZXQubWFwKHMgPT4gcy5zcGxpdChzbGFzaFNwbGl0KSlcblxuICAgIHRoaXMuZGVidWcodGhpcy5wYXR0ZXJuLCBzZXQpXG5cbiAgICAvLyBnbG9iIC0tPiByZWdleHBzXG4gICAgc2V0ID0gc2V0Lm1hcCgocywgc2ksIHNldCkgPT4gcy5tYXAodGhpcy5wYXJzZSwgdGhpcykpXG5cbiAgICB0aGlzLmRlYnVnKHRoaXMucGF0dGVybiwgc2V0KVxuXG4gICAgLy8gZmlsdGVyIG91dCBldmVyeXRoaW5nIHRoYXQgZGlkbid0IGNvbXBpbGUgcHJvcGVybHkuXG4gICAgc2V0ID0gc2V0LmZpbHRlcihzID0+IHMuaW5kZXhPZihmYWxzZSkgPT09IC0xKVxuXG4gICAgdGhpcy5kZWJ1Zyh0aGlzLnBhdHRlcm4sIHNldClcblxuICAgIHRoaXMuc2V0ID0gc2V0XG4gIH1cblxuICBwYXJzZU5lZ2F0ZSAoKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5ub25lZ2F0ZSkgcmV0dXJuXG5cbiAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5wYXR0ZXJuXG4gICAgbGV0IG5lZ2F0ZSA9IGZhbHNlXG4gICAgbGV0IG5lZ2F0ZU9mZnNldCA9IDBcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVybi5sZW5ndGggJiYgcGF0dGVybi5jaGFyQXQoaSkgPT09ICchJzsgaSsrKSB7XG4gICAgICBuZWdhdGUgPSAhbmVnYXRlXG4gICAgICBuZWdhdGVPZmZzZXQrK1xuICAgIH1cblxuICAgIGlmIChuZWdhdGVPZmZzZXQpIHRoaXMucGF0dGVybiA9IHBhdHRlcm4uc2xpY2UobmVnYXRlT2Zmc2V0KVxuICAgIHRoaXMubmVnYXRlID0gbmVnYXRlXG4gIH1cblxuICAvLyBzZXQgcGFydGlhbCB0byB0cnVlIHRvIHRlc3QgaWYsIGZvciBleGFtcGxlLFxuICAvLyBcIi9hL2JcIiBtYXRjaGVzIHRoZSBzdGFydCBvZiBcIi8qL2IvKi9kXCJcbiAgLy8gUGFydGlhbCBtZWFucywgaWYgeW91IHJ1biBvdXQgb2YgZmlsZSBiZWZvcmUgeW91IHJ1blxuICAvLyBvdXQgb2YgcGF0dGVybiwgdGhlbiB0aGF0J3MgZmluZSwgYXMgbG9uZyBhcyBhbGxcbiAgLy8gdGhlIHBhcnRzIG1hdGNoLlxuICBtYXRjaE9uZSAoZmlsZSwgcGF0dGVybiwgcGFydGlhbCkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zXG5cbiAgICB0aGlzLmRlYnVnKCdtYXRjaE9uZScsXG4gICAgICB7ICd0aGlzJzogdGhpcywgZmlsZTogZmlsZSwgcGF0dGVybjogcGF0dGVybiB9KVxuXG4gICAgdGhpcy5kZWJ1ZygnbWF0Y2hPbmUnLCBmaWxlLmxlbmd0aCwgcGF0dGVybi5sZW5ndGgpXG5cbiAgICBmb3IgKHZhciBmaSA9IDAsXG4gICAgICAgIHBpID0gMCxcbiAgICAgICAgZmwgPSBmaWxlLmxlbmd0aCxcbiAgICAgICAgcGwgPSBwYXR0ZXJuLmxlbmd0aFxuICAgICAgICA7IChmaSA8IGZsKSAmJiAocGkgPCBwbClcbiAgICAgICAgOyBmaSsrLCBwaSsrKSB7XG4gICAgICB0aGlzLmRlYnVnKCdtYXRjaE9uZSBsb29wJylcbiAgICAgIHZhciBwID0gcGF0dGVybltwaV1cbiAgICAgIHZhciBmID0gZmlsZVtmaV1cblxuICAgICAgdGhpcy5kZWJ1ZyhwYXR0ZXJuLCBwLCBmKVxuXG4gICAgICAvLyBzaG91bGQgYmUgaW1wb3NzaWJsZS5cbiAgICAgIC8vIHNvbWUgaW52YWxpZCByZWdleHAgc3R1ZmYgaW4gdGhlIHNldC5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHAgPT09IGZhbHNlKSByZXR1cm4gZmFsc2VcblxuICAgICAgaWYgKHAgPT09IEdMT0JTVEFSKSB7XG4gICAgICAgIHRoaXMuZGVidWcoJ0dMT0JTVEFSJywgW3BhdHRlcm4sIHAsIGZdKVxuXG4gICAgICAgIC8vIFwiKipcIlxuICAgICAgICAvLyBhLyoqL2IvKiovYyB3b3VsZCBtYXRjaCB0aGUgZm9sbG93aW5nOlxuICAgICAgICAvLyBhL2IveC95L3ovY1xuICAgICAgICAvLyBhL3gveS96L2IvY1xuICAgICAgICAvLyBhL2IveC9iL3gvY1xuICAgICAgICAvLyBhL2IvY1xuICAgICAgICAvLyBUbyBkbyB0aGlzLCB0YWtlIHRoZSByZXN0IG9mIHRoZSBwYXR0ZXJuIGFmdGVyXG4gICAgICAgIC8vIHRoZSAqKiwgYW5kIHNlZSBpZiBpdCB3b3VsZCBtYXRjaCB0aGUgZmlsZSByZW1haW5kZXIuXG4gICAgICAgIC8vIElmIHNvLCByZXR1cm4gc3VjY2Vzcy5cbiAgICAgICAgLy8gSWYgbm90LCB0aGUgKiogXCJzd2FsbG93c1wiIGEgc2VnbWVudCwgYW5kIHRyeSBhZ2Fpbi5cbiAgICAgICAgLy8gVGhpcyBpcyByZWN1cnNpdmVseSBhd2Z1bC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gYS8qKi9iLyoqL2MgbWF0Y2hpbmcgYS9iL3gveS96L2NcbiAgICAgICAgLy8gLSBhIG1hdGNoZXMgYVxuICAgICAgICAvLyAtIGRvdWJsZXN0YXJcbiAgICAgICAgLy8gICAtIG1hdGNoT25lKGIveC95L3ovYywgYi8qKi9jKVxuICAgICAgICAvLyAgICAgLSBiIG1hdGNoZXMgYlxuICAgICAgICAvLyAgICAgLSBkb3VibGVzdGFyXG4gICAgICAgIC8vICAgICAgIC0gbWF0Y2hPbmUoeC95L3ovYywgYykgLT4gbm9cbiAgICAgICAgLy8gICAgICAgLSBtYXRjaE9uZSh5L3ovYywgYykgLT4gbm9cbiAgICAgICAgLy8gICAgICAgLSBtYXRjaE9uZSh6L2MsIGMpIC0+IG5vXG4gICAgICAgIC8vICAgICAgIC0gbWF0Y2hPbmUoYywgYykgeWVzLCBoaXRcbiAgICAgICAgdmFyIGZyID0gZmlcbiAgICAgICAgdmFyIHByID0gcGkgKyAxXG4gICAgICAgIGlmIChwciA9PT0gcGwpIHtcbiAgICAgICAgICB0aGlzLmRlYnVnKCcqKiBhdCB0aGUgZW5kJylcbiAgICAgICAgICAvLyBhICoqIGF0IHRoZSBlbmQgd2lsbCBqdXN0IHN3YWxsb3cgdGhlIHJlc3QuXG4gICAgICAgICAgLy8gV2UgaGF2ZSBmb3VuZCBhIG1hdGNoLlxuICAgICAgICAgIC8vIGhvd2V2ZXIsIGl0IHdpbGwgbm90IHN3YWxsb3cgLy54LCB1bmxlc3NcbiAgICAgICAgICAvLyBvcHRpb25zLmRvdCBpcyBzZXQuXG4gICAgICAgICAgLy8gLiBhbmQgLi4gYXJlICpuZXZlciogbWF0Y2hlZCBieSAqKiwgZm9yIGV4cGxvc2l2ZWx5XG4gICAgICAgICAgLy8gZXhwb25lbnRpYWwgcmVhc29ucy5cbiAgICAgICAgICBmb3IgKDsgZmkgPCBmbDsgZmkrKykge1xuICAgICAgICAgICAgaWYgKGZpbGVbZmldID09PSAnLicgfHwgZmlsZVtmaV0gPT09ICcuLicgfHxcbiAgICAgICAgICAgICAgKCFvcHRpb25zLmRvdCAmJiBmaWxlW2ZpXS5jaGFyQXQoMCkgPT09ICcuJykpIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gb2ssIGxldCdzIHNlZSBpZiB3ZSBjYW4gc3dhbGxvdyB3aGF0ZXZlciB3ZSBjYW4uXG4gICAgICAgIHdoaWxlIChmciA8IGZsKSB7XG4gICAgICAgICAgdmFyIHN3YWxsb3dlZSA9IGZpbGVbZnJdXG5cbiAgICAgICAgICB0aGlzLmRlYnVnKCdcXG5nbG9ic3RhciB3aGlsZScsIGZpbGUsIGZyLCBwYXR0ZXJuLCBwciwgc3dhbGxvd2VlKVxuXG4gICAgICAgICAgLy8gWFhYIHJlbW92ZSB0aGlzIHNsaWNlLiAgSnVzdCBwYXNzIHRoZSBzdGFydCBpbmRleC5cbiAgICAgICAgICBpZiAodGhpcy5tYXRjaE9uZShmaWxlLnNsaWNlKGZyKSwgcGF0dGVybi5zbGljZShwciksIHBhcnRpYWwpKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKCdnbG9ic3RhciBmb3VuZCBtYXRjaCEnLCBmciwgZmwsIHN3YWxsb3dlZSlcbiAgICAgICAgICAgIC8vIGZvdW5kIGEgbWF0Y2guXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBjYW4ndCBzd2FsbG93IFwiLlwiIG9yIFwiLi5cIiBldmVyLlxuICAgICAgICAgICAgLy8gY2FuIG9ubHkgc3dhbGxvdyBcIi5mb29cIiB3aGVuIGV4cGxpY2l0bHkgYXNrZWQuXG4gICAgICAgICAgICBpZiAoc3dhbGxvd2VlID09PSAnLicgfHwgc3dhbGxvd2VlID09PSAnLi4nIHx8XG4gICAgICAgICAgICAgICghb3B0aW9ucy5kb3QgJiYgc3dhbGxvd2VlLmNoYXJBdCgwKSA9PT0gJy4nKSkge1xuICAgICAgICAgICAgICB0aGlzLmRlYnVnKCdkb3QgZGV0ZWN0ZWQhJywgZmlsZSwgZnIsIHBhdHRlcm4sIHByKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAqKiBzd2FsbG93cyBhIHNlZ21lbnQsIGFuZCBjb250aW51ZS5cbiAgICAgICAgICAgIHRoaXMuZGVidWcoJ2dsb2JzdGFyIHN3YWxsb3cgYSBzZWdtZW50LCBhbmQgY29udGludWUnKVxuICAgICAgICAgICAgZnIrK1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vIG1hdGNoIHdhcyBmb3VuZC5cbiAgICAgICAgLy8gSG93ZXZlciwgaW4gcGFydGlhbCBtb2RlLCB3ZSBjYW4ndCBzYXkgdGhpcyBpcyBuZWNlc3NhcmlseSBvdmVyLlxuICAgICAgICAvLyBJZiB0aGVyZSdzIG1vcmUgKnBhdHRlcm4qIGxlZnQsIHRoZW5cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmIChwYXJ0aWFsKSB7XG4gICAgICAgICAgLy8gcmFuIG91dCBvZiBmaWxlXG4gICAgICAgICAgdGhpcy5kZWJ1ZygnXFxuPj4+IG5vIG1hdGNoLCBwYXJ0aWFsPycsIGZpbGUsIGZyLCBwYXR0ZXJuLCBwcilcbiAgICAgICAgICBpZiAoZnIgPT09IGZsKSByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBzb21ldGhpbmcgb3RoZXIgdGhhbiAqKlxuICAgICAgLy8gbm9uLW1hZ2ljIHBhdHRlcm5zIGp1c3QgaGF2ZSB0byBtYXRjaCBleGFjdGx5XG4gICAgICAvLyBwYXR0ZXJucyB3aXRoIG1hZ2ljIGhhdmUgYmVlbiB0dXJuZWQgaW50byByZWdleHBzLlxuICAgICAgdmFyIGhpdFxuICAgICAgaWYgKHR5cGVvZiBwID09PSAnc3RyaW5nJykge1xuICAgICAgICBoaXQgPSBmID09PSBwXG4gICAgICAgIHRoaXMuZGVidWcoJ3N0cmluZyBtYXRjaCcsIHAsIGYsIGhpdClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhpdCA9IGYubWF0Y2gocClcbiAgICAgICAgdGhpcy5kZWJ1ZygncGF0dGVybiBtYXRjaCcsIHAsIGYsIGhpdClcbiAgICAgIH1cblxuICAgICAgaWYgKCFoaXQpIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIE5vdGU6IGVuZGluZyBpbiAvIG1lYW5zIHRoYXQgd2UnbGwgZ2V0IGEgZmluYWwgXCJcIlxuICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4uICBUaGlzIGNhbiBvbmx5IG1hdGNoIGFcbiAgICAvLyBjb3JyZXNwb25kaW5nIFwiXCIgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS5cbiAgICAvLyBJZiB0aGUgZmlsZSBlbmRzIGluIC8sIHRoZW4gaXQgY2FuIG9ubHkgbWF0Y2ggYVxuICAgIC8vIGEgcGF0dGVybiB0aGF0IGVuZHMgaW4gLywgdW5sZXNzIHRoZSBwYXR0ZXJuIGp1c3RcbiAgICAvLyBkb2Vzbid0IGhhdmUgYW55IG1vcmUgZm9yIGl0LiBCdXQsIGEvYi8gc2hvdWxkICpub3QqXG4gICAgLy8gbWF0Y2ggXCJhL2IvKlwiLCBldmVuIHRob3VnaCBcIlwiIG1hdGNoZXMgYWdhaW5zdCB0aGVcbiAgICAvLyBbXi9dKj8gcGF0dGVybiwgZXhjZXB0IGluIHBhcnRpYWwgbW9kZSwgd2hlcmUgaXQgbWlnaHRcbiAgICAvLyBzaW1wbHkgbm90IGJlIHJlYWNoZWQgeWV0LlxuICAgIC8vIEhvd2V2ZXIsIGEvYi8gc2hvdWxkIHN0aWxsIHNhdGlzZnkgYS8qXG5cbiAgICAvLyBub3cgZWl0aGVyIHdlIGZlbGwgb2ZmIHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4sIG9yIHdlJ3JlIGRvbmUuXG4gICAgaWYgKGZpID09PSBmbCAmJiBwaSA9PT0gcGwpIHtcbiAgICAgIC8vIHJhbiBvdXQgb2YgcGF0dGVybiBhbmQgZmlsZW5hbWUgYXQgdGhlIHNhbWUgdGltZS5cbiAgICAgIC8vIGFuIGV4YWN0IGhpdCFcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIGlmIChmaSA9PT0gZmwpIHtcbiAgICAgIC8vIHJhbiBvdXQgb2YgZmlsZSwgYnV0IHN0aWxsIGhhZCBwYXR0ZXJuIGxlZnQuXG4gICAgICAvLyB0aGlzIGlzIG9rIGlmIHdlJ3JlIGRvaW5nIHRoZSBtYXRjaCBhcyBwYXJ0IG9mXG4gICAgICAvLyBhIGdsb2IgZnMgdHJhdmVyc2FsLlxuICAgICAgcmV0dXJuIHBhcnRpYWxcbiAgICB9IGVsc2UgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8gaWYgKHBpID09PSBwbCkge1xuICAgICAgLy8gcmFuIG91dCBvZiBwYXR0ZXJuLCBzdGlsbCBoYXZlIGZpbGUgbGVmdC5cbiAgICAgIC8vIHRoaXMgaXMgb25seSBhY2NlcHRhYmxlIGlmIHdlJ3JlIG9uIHRoZSB2ZXJ5IGxhc3RcbiAgICAgIC8vIGVtcHR5IHNlZ21lbnQgb2YgYSBmaWxlIHdpdGggYSB0cmFpbGluZyBzbGFzaC5cbiAgICAgIC8vIGEvKiBzaG91bGQgbWF0Y2ggYS9iL1xuICAgICAgcmV0dXJuIChmaSA9PT0gZmwgLSAxKSAmJiAoZmlsZVtmaV0gPT09ICcnKVxuICAgIH1cblxuICAgIC8vIHNob3VsZCBiZSB1bnJlYWNoYWJsZS5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHRocm93IG5ldyBFcnJvcignd3RmPycpXG4gIH1cblxuICBicmFjZUV4cGFuZCAoKSB7XG4gICAgcmV0dXJuIGJyYWNlRXhwYW5kKHRoaXMucGF0dGVybiwgdGhpcy5vcHRpb25zKVxuICB9XG5cbiAgcGFyc2UgKHBhdHRlcm4sIGlzU3ViKSB7XG4gICAgYXNzZXJ0VmFsaWRQYXR0ZXJuKHBhdHRlcm4pXG5cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zXG5cbiAgICAvLyBzaG9ydGN1dHNcbiAgICBpZiAocGF0dGVybiA9PT0gJyoqJykge1xuICAgICAgaWYgKCFvcHRpb25zLm5vZ2xvYnN0YXIpXG4gICAgICAgIHJldHVybiBHTE9CU1RBUlxuICAgICAgZWxzZVxuICAgICAgICBwYXR0ZXJuID0gJyonXG4gICAgfVxuICAgIGlmIChwYXR0ZXJuID09PSAnJykgcmV0dXJuICcnXG5cbiAgICBsZXQgcmUgPSAnJ1xuICAgIGxldCBoYXNNYWdpYyA9IGZhbHNlXG4gICAgbGV0IGVzY2FwaW5nID0gZmFsc2VcbiAgICAvLyA/ID0+IG9uZSBzaW5nbGUgY2hhcmFjdGVyXG4gICAgY29uc3QgcGF0dGVybkxpc3RTdGFjayA9IFtdXG4gICAgY29uc3QgbmVnYXRpdmVMaXN0cyA9IFtdXG4gICAgbGV0IHN0YXRlQ2hhclxuICAgIGxldCBpbkNsYXNzID0gZmFsc2VcbiAgICBsZXQgcmVDbGFzc1N0YXJ0ID0gLTFcbiAgICBsZXQgY2xhc3NTdGFydCA9IC0xXG4gICAgbGV0IGNzXG4gICAgbGV0IHBsXG4gICAgbGV0IHNwXG4gICAgLy8gLiBhbmQgLi4gbmV2ZXIgbWF0Y2ggYW55dGhpbmcgdGhhdCBkb2Vzbid0IHN0YXJ0IHdpdGggLixcbiAgICAvLyBldmVuIHdoZW4gb3B0aW9ucy5kb3QgaXMgc2V0LiAgSG93ZXZlciwgaWYgdGhlIHBhdHRlcm5cbiAgICAvLyBzdGFydHMgd2l0aCAuLCB0aGVuIHRyYXZlcnNhbCBwYXR0ZXJucyBjYW4gbWF0Y2guXG4gICAgbGV0IGRvdFRyYXZBbGxvd2VkID0gcGF0dGVybi5jaGFyQXQoMCkgPT09ICcuJ1xuICAgIGxldCBkb3RGaWxlQWxsb3dlZCA9IG9wdGlvbnMuZG90IHx8IGRvdFRyYXZBbGxvd2VkXG4gICAgY29uc3QgcGF0dGVyblN0YXJ0ID0gKCkgPT5cbiAgICAgIGRvdFRyYXZBbGxvd2VkXG4gICAgICAgID8gJydcbiAgICAgICAgOiBkb3RGaWxlQWxsb3dlZFxuICAgICAgICA/ICcoPyEoPzpefFxcXFwvKVxcXFwuezEsMn0oPzokfFxcXFwvKSknXG4gICAgICAgIDogJyg/IVxcXFwuKSdcbiAgICBjb25zdCBzdWJQYXR0ZXJuU3RhcnQgPSAocCkgPT5cbiAgICAgIHAuY2hhckF0KDApID09PSAnLidcbiAgICAgICAgPyAnJ1xuICAgICAgICA6IG9wdGlvbnMuZG90XG4gICAgICAgID8gJyg/ISg/Ol58XFxcXC8pXFxcXC57MSwyfSg/OiR8XFxcXC8pKSdcbiAgICAgICAgOiAnKD8hXFxcXC4pJ1xuXG5cbiAgICBjb25zdCBjbGVhclN0YXRlQ2hhciA9ICgpID0+IHtcbiAgICAgIGlmIChzdGF0ZUNoYXIpIHtcbiAgICAgICAgLy8gd2UgaGFkIHNvbWUgc3RhdGUtdHJhY2tpbmcgY2hhcmFjdGVyXG4gICAgICAgIC8vIHRoYXQgd2Fzbid0IGNvbnN1bWVkIGJ5IHRoaXMgcGFzcy5cbiAgICAgICAgc3dpdGNoIChzdGF0ZUNoYXIpIHtcbiAgICAgICAgICBjYXNlICcqJzpcbiAgICAgICAgICAgIHJlICs9IHN0YXJcbiAgICAgICAgICAgIGhhc01hZ2ljID0gdHJ1ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAnPyc6XG4gICAgICAgICAgICByZSArPSBxbWFya1xuICAgICAgICAgICAgaGFzTWFnaWMgPSB0cnVlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmUgKz0gJ1xcXFwnICsgc3RhdGVDaGFyXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlYnVnKCdjbGVhclN0YXRlQ2hhciAlaiAlaicsIHN0YXRlQ2hhciwgcmUpXG4gICAgICAgIHN0YXRlQ2hhciA9IGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDAsIGM7IChpIDwgcGF0dGVybi5sZW5ndGgpICYmIChjID0gcGF0dGVybi5jaGFyQXQoaSkpOyBpKyspIHtcbiAgICAgIHRoaXMuZGVidWcoJyVzXFx0JXMgJXMgJWonLCBwYXR0ZXJuLCBpLCByZSwgYylcblxuICAgICAgLy8gc2tpcCBvdmVyIGFueSB0aGF0IGFyZSBlc2NhcGVkLlxuICAgICAgaWYgKGVzY2FwaW5nKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0gY29tcGxldGVseSBub3QgYWxsb3dlZCwgZXZlbiBlc2NhcGVkLiAqL1xuICAgICAgICBpZiAoYyA9PT0gJy8nKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVTcGVjaWFsc1tjXSkge1xuICAgICAgICAgIHJlICs9ICdcXFxcJ1xuICAgICAgICB9XG4gICAgICAgIHJlICs9IGNcbiAgICAgICAgZXNjYXBpbmcgPSBmYWxzZVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgY2FzZSAnLyc6IHtcbiAgICAgICAgICAvLyBTaG91bGQgYWxyZWFkeSBiZSBwYXRoLXNwbGl0IGJ5IG5vdy5cbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ1xcXFwnOlxuICAgICAgICAgIGlmIChpbkNsYXNzICYmIHBhdHRlcm4uY2hhckF0KGkgKyAxKSA9PT0gJy0nKSB7XG4gICAgICAgICAgICByZSArPSBjXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNsZWFyU3RhdGVDaGFyKClcbiAgICAgICAgICBlc2NhcGluZyA9IHRydWVcbiAgICAgICAgY29udGludWVcblxuICAgICAgICAvLyB0aGUgdmFyaW91cyBzdGF0ZUNoYXIgdmFsdWVzXG4gICAgICAgIC8vIGZvciB0aGUgXCJleHRnbG9iXCIgc3R1ZmYuXG4gICAgICAgIGNhc2UgJz8nOlxuICAgICAgICBjYXNlICcqJzpcbiAgICAgICAgY2FzZSAnKyc6XG4gICAgICAgIGNhc2UgJ0AnOlxuICAgICAgICBjYXNlICchJzpcbiAgICAgICAgICB0aGlzLmRlYnVnKCclc1xcdCVzICVzICVqIDwtLSBzdGF0ZUNoYXInLCBwYXR0ZXJuLCBpLCByZSwgYylcblxuICAgICAgICAgIC8vIGFsbCBvZiB0aG9zZSBhcmUgbGl0ZXJhbHMgaW5zaWRlIGEgY2xhc3MsIGV4Y2VwdCB0aGF0XG4gICAgICAgICAgLy8gdGhlIGdsb2IgWyFhXSBtZWFucyBbXmFdIGluIHJlZ2V4cFxuICAgICAgICAgIGlmIChpbkNsYXNzKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKCcgIGluIGNsYXNzJylcbiAgICAgICAgICAgIGlmIChjID09PSAnIScgJiYgaSA9PT0gY2xhc3NTdGFydCArIDEpIGMgPSAnXidcbiAgICAgICAgICAgIHJlICs9IGNcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaWYgd2UgYWxyZWFkeSBoYXZlIGEgc3RhdGVDaGFyLCB0aGVuIGl0IG1lYW5zXG4gICAgICAgICAgLy8gdGhhdCB0aGVyZSB3YXMgc29tZXRoaW5nIGxpa2UgKiogb3IgKz8gaW4gdGhlcmUuXG4gICAgICAgICAgLy8gSGFuZGxlIHRoZSBzdGF0ZUNoYXIsIHRoZW4gcHJvY2VlZCB3aXRoIHRoaXMgb25lLlxuICAgICAgICAgIHRoaXMuZGVidWcoJ2NhbGwgY2xlYXJTdGF0ZUNoYXIgJWonLCBzdGF0ZUNoYXIpXG4gICAgICAgICAgY2xlYXJTdGF0ZUNoYXIoKVxuICAgICAgICAgIHN0YXRlQ2hhciA9IGNcbiAgICAgICAgICAvLyBpZiBleHRnbG9iIGlzIGRpc2FibGVkLCB0aGVuICsoYXNkZnxmb28pIGlzbid0IGEgdGhpbmcuXG4gICAgICAgICAgLy8ganVzdCBjbGVhciB0aGUgc3RhdGVjaGFyICpub3cqLCByYXRoZXIgdGhhbiBldmVuIGRpdmluZyBpbnRvXG4gICAgICAgICAgLy8gdGhlIHBhdHRlcm5MaXN0IHN0dWZmLlxuICAgICAgICAgIGlmIChvcHRpb25zLm5vZXh0KSBjbGVhclN0YXRlQ2hhcigpXG4gICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSAnKCc6IHtcbiAgICAgICAgICBpZiAoaW5DbGFzcykge1xuICAgICAgICAgICAgcmUgKz0gJygnXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghc3RhdGVDaGFyKSB7XG4gICAgICAgICAgICByZSArPSAnXFxcXCgnXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHBsRW50cnkgPSB7XG4gICAgICAgICAgICB0eXBlOiBzdGF0ZUNoYXIsXG4gICAgICAgICAgICBzdGFydDogaSAtIDEsXG4gICAgICAgICAgICByZVN0YXJ0OiByZS5sZW5ndGgsXG4gICAgICAgICAgICBvcGVuOiBwbFR5cGVzW3N0YXRlQ2hhcl0ub3BlbixcbiAgICAgICAgICAgIGNsb3NlOiBwbFR5cGVzW3N0YXRlQ2hhcl0uY2xvc2UsXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZGVidWcodGhpcy5wYXR0ZXJuLCAnXFx0JywgcGxFbnRyeSlcbiAgICAgICAgICBwYXR0ZXJuTGlzdFN0YWNrLnB1c2gocGxFbnRyeSlcbiAgICAgICAgICAvLyBuZWdhdGlvbiBpcyAoPzooPyEoPzpqcykoPzo8cmVzdD4pKVteL10qKVxuICAgICAgICAgIHJlICs9IHBsRW50cnkub3BlblxuICAgICAgICAgIC8vIG5leHQgZW50cnkgc3RhcnRzIHdpdGggYSBkb3QgbWF5YmU/XG4gICAgICAgICAgaWYgKHBsRW50cnkuc3RhcnQgPT09IDAgJiYgcGxFbnRyeS50eXBlICE9PSAnIScpIHtcbiAgICAgICAgICAgIGRvdFRyYXZBbGxvd2VkID0gdHJ1ZVxuICAgICAgICAgICAgcmUgKz0gc3ViUGF0dGVyblN0YXJ0KHBhdHRlcm4uc2xpY2UoaSArIDEpKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmRlYnVnKCdwbFR5cGUgJWogJWonLCBzdGF0ZUNoYXIsIHJlKVxuICAgICAgICAgIHN0YXRlQ2hhciA9IGZhbHNlXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJyknOiB7XG4gICAgICAgICAgY29uc3QgcGxFbnRyeSA9IHBhdHRlcm5MaXN0U3RhY2tbcGF0dGVybkxpc3RTdGFjay5sZW5ndGggLSAxXVxuICAgICAgICAgIGlmIChpbkNsYXNzIHx8ICFwbEVudHJ5KSB7XG4gICAgICAgICAgICByZSArPSAnXFxcXCknXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBwYXR0ZXJuTGlzdFN0YWNrLnBvcCgpXG5cbiAgICAgICAgICAvLyBjbG9zaW5nIGFuIGV4dGdsb2JcbiAgICAgICAgICBjbGVhclN0YXRlQ2hhcigpXG4gICAgICAgICAgaGFzTWFnaWMgPSB0cnVlXG4gICAgICAgICAgcGwgPSBwbEVudHJ5XG4gICAgICAgICAgLy8gbmVnYXRpb24gaXMgKD86KD8hanMpW14vXSopXG4gICAgICAgICAgLy8gVGhlIG90aGVycyBhcmUgKD86PHBhdHRlcm4+KTx0eXBlPlxuICAgICAgICAgIHJlICs9IHBsLmNsb3NlXG4gICAgICAgICAgaWYgKHBsLnR5cGUgPT09ICchJykge1xuICAgICAgICAgICAgbmVnYXRpdmVMaXN0cy5wdXNoKE9iamVjdC5hc3NpZ24ocGwsIHsgcmVFbmQ6IHJlLmxlbmd0aCB9KSlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ3wnOiB7XG4gICAgICAgICAgY29uc3QgcGxFbnRyeSA9IHBhdHRlcm5MaXN0U3RhY2tbcGF0dGVybkxpc3RTdGFjay5sZW5ndGggLSAxXVxuICAgICAgICAgIGlmIChpbkNsYXNzIHx8ICFwbEVudHJ5KSB7XG4gICAgICAgICAgICByZSArPSAnXFxcXHwnXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNsZWFyU3RhdGVDaGFyKClcbiAgICAgICAgICByZSArPSAnfCdcbiAgICAgICAgICAvLyBuZXh0IHN1YnBhdHRlcm4gY2FuIHN0YXJ0IHdpdGggYSBkb3Q/XG4gICAgICAgICAgaWYgKHBsRW50cnkuc3RhcnQgPT09IDAgJiYgcGxFbnRyeS50eXBlICE9PSAnIScpIHtcbiAgICAgICAgICAgIGRvdFRyYXZBbGxvd2VkID0gdHJ1ZVxuICAgICAgICAgICAgcmUgKz0gc3ViUGF0dGVyblN0YXJ0KHBhdHRlcm4uc2xpY2UoaSArIDEpKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGhlc2UgYXJlIG1vc3RseSB0aGUgc2FtZSBpbiByZWdleHAgYW5kIGdsb2JcbiAgICAgICAgY2FzZSAnWyc6XG4gICAgICAgICAgLy8gc3dhbGxvdyBhbnkgc3RhdGUtdHJhY2tpbmcgY2hhciBiZWZvcmUgdGhlIFtcbiAgICAgICAgICBjbGVhclN0YXRlQ2hhcigpXG5cbiAgICAgICAgICBpZiAoaW5DbGFzcykge1xuICAgICAgICAgICAgcmUgKz0gJ1xcXFwnICsgY1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbkNsYXNzID0gdHJ1ZVxuICAgICAgICAgIGNsYXNzU3RhcnQgPSBpXG4gICAgICAgICAgcmVDbGFzc1N0YXJ0ID0gcmUubGVuZ3RoXG4gICAgICAgICAgcmUgKz0gY1xuICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgJ10nOlxuICAgICAgICAgIC8vICBhIHJpZ2h0IGJyYWNrZXQgc2hhbGwgbG9zZSBpdHMgc3BlY2lhbFxuICAgICAgICAgIC8vICBtZWFuaW5nIGFuZCByZXByZXNlbnQgaXRzZWxmIGluXG4gICAgICAgICAgLy8gIGEgYnJhY2tldCBleHByZXNzaW9uIGlmIGl0IG9jY3Vyc1xuICAgICAgICAgIC8vICBmaXJzdCBpbiB0aGUgbGlzdC4gIC0tIFBPU0lYLjIgMi44LjMuMlxuICAgICAgICAgIGlmIChpID09PSBjbGFzc1N0YXJ0ICsgMSB8fCAhaW5DbGFzcykge1xuICAgICAgICAgICAgcmUgKz0gJ1xcXFwnICsgY1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzcGxpdCB3aGVyZSB0aGUgbGFzdCBbIHdhcywgbWFrZSBzdXJlIHdlIGRvbid0IGhhdmVcbiAgICAgICAgICAvLyBhbiBpbnZhbGlkIHJlLiBpZiBzbywgcmUtd2FsayB0aGUgY29udGVudHMgb2YgdGhlXG4gICAgICAgICAgLy8gd291bGQtYmUgY2xhc3MgdG8gcmUtdHJhbnNsYXRlIGFueSBjaGFyYWN0ZXJzIHRoYXRcbiAgICAgICAgICAvLyB3ZXJlIHBhc3NlZCB0aHJvdWdoIGFzLWlzXG4gICAgICAgICAgLy8gVE9ETzogSXQgd291bGQgcHJvYmFibHkgYmUgZmFzdGVyIHRvIGRldGVybWluZSB0aGlzXG4gICAgICAgICAgLy8gd2l0aG91dCBhIHRyeS9jYXRjaCBhbmQgYSBuZXcgUmVnRXhwLCBidXQgaXQncyB0cmlja3lcbiAgICAgICAgICAvLyB0byBkbyBzYWZlbHkuICBGb3Igbm93LCB0aGlzIGlzIHNhZmUgYW5kIHdvcmtzLlxuICAgICAgICAgIGNzID0gcGF0dGVybi5zdWJzdHJpbmcoY2xhc3NTdGFydCArIDEsIGkpXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIFJlZ0V4cCgnWycgKyBicmFFeHBFc2NhcGUoY2hhclVuZXNjYXBlKGNzKSkgKyAnXScpXG4gICAgICAgICAgICAvLyBsb29rcyBnb29kLCBmaW5pc2ggdXAgdGhlIGNsYXNzLlxuICAgICAgICAgICAgcmUgKz0gY1xuICAgICAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICAvLyBvdXQgb2Ygb3JkZXIgcmFuZ2VzIGluIEpTIGFyZSBlcnJvcnMsIGJ1dCBpbiBnbG9iIHN5bnRheCxcbiAgICAgICAgICAgIC8vIHRoZXkncmUganVzdCBhIHJhbmdlIHRoYXQgbWF0Y2hlcyBub3RoaW5nLlxuICAgICAgICAgICAgcmUgPSByZS5zdWJzdHJpbmcoMCwgcmVDbGFzc1N0YXJ0KSArICcoPzokLiknIC8vIG1hdGNoIG5vdGhpbmcgZXZlclxuICAgICAgICAgIH1cbiAgICAgICAgICBoYXNNYWdpYyA9IHRydWVcbiAgICAgICAgICBpbkNsYXNzID0gZmFsc2VcbiAgICAgICAgY29udGludWVcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIHN3YWxsb3cgYW55IHN0YXRlIGNoYXIgdGhhdCB3YXNuJ3QgY29uc3VtZWRcbiAgICAgICAgICBjbGVhclN0YXRlQ2hhcigpXG5cbiAgICAgICAgICBpZiAocmVTcGVjaWFsc1tjXSAmJiAhKGMgPT09ICdeJyAmJiBpbkNsYXNzKSkge1xuICAgICAgICAgICAgcmUgKz0gJ1xcXFwnXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmUgKz0gY1xuICAgICAgICAgIGJyZWFrXG5cbiAgICAgIH0gLy8gc3dpdGNoXG4gICAgfSAvLyBmb3JcblxuICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBsZWZ0IGEgY2xhc3Mgb3Blbi5cbiAgICAvLyBcIlthYmNcIiBpcyB2YWxpZCwgZXF1aXZhbGVudCB0byBcIlxcW2FiY1wiXG4gICAgaWYgKGluQ2xhc3MpIHtcbiAgICAgIC8vIHNwbGl0IHdoZXJlIHRoZSBsYXN0IFsgd2FzLCBhbmQgZXNjYXBlIGl0XG4gICAgICAvLyB0aGlzIGlzIGEgaHVnZSBwaXRhLiAgV2Ugbm93IGhhdmUgdG8gcmUtd2Fsa1xuICAgICAgLy8gdGhlIGNvbnRlbnRzIG9mIHRoZSB3b3VsZC1iZSBjbGFzcyB0byByZS10cmFuc2xhdGVcbiAgICAgIC8vIGFueSBjaGFyYWN0ZXJzIHRoYXQgd2VyZSBwYXNzZWQgdGhyb3VnaCBhcy1pc1xuICAgICAgY3MgPSBwYXR0ZXJuLnNsaWNlKGNsYXNzU3RhcnQgKyAxKVxuICAgICAgc3AgPSB0aGlzLnBhcnNlKGNzLCBTVUJQQVJTRSlcbiAgICAgIHJlID0gcmUuc3Vic3RyaW5nKDAsIHJlQ2xhc3NTdGFydCkgKyAnXFxcXFsnICsgc3BbMF1cbiAgICAgIGhhc01hZ2ljID0gaGFzTWFnaWMgfHwgc3BbMV1cbiAgICB9XG5cbiAgICAvLyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2UgaGFkIGEgKyggdGhpbmcgYXQgdGhlICplbmQqXG4gICAgLy8gb2YgdGhlIHBhdHRlcm4uXG4gICAgLy8gZWFjaCBwYXR0ZXJuIGxpc3Qgc3RhY2sgYWRkcyAzIGNoYXJzLCBhbmQgd2UgbmVlZCB0byBnbyB0aHJvdWdoXG4gICAgLy8gYW5kIGVzY2FwZSBhbnkgfCBjaGFycyB0aGF0IHdlcmUgcGFzc2VkIHRocm91Z2ggYXMtaXMgZm9yIHRoZSByZWdleHAuXG4gICAgLy8gR28gdGhyb3VnaCBhbmQgZXNjYXBlIHRoZW0sIHRha2luZyBjYXJlIG5vdCB0byBkb3VibGUtZXNjYXBlIGFueVxuICAgIC8vIHwgY2hhcnMgdGhhdCB3ZXJlIGFscmVhZHkgZXNjYXBlZC5cbiAgICBmb3IgKHBsID0gcGF0dGVybkxpc3RTdGFjay5wb3AoKTsgcGw7IHBsID0gcGF0dGVybkxpc3RTdGFjay5wb3AoKSkge1xuICAgICAgbGV0IHRhaWxcbiAgICAgIHRhaWwgPSByZS5zbGljZShwbC5yZVN0YXJ0ICsgcGwub3Blbi5sZW5ndGgpXG4gICAgICB0aGlzLmRlYnVnKCdzZXR0aW5nIHRhaWwnLCByZSwgcGwpXG4gICAgICAvLyBtYXliZSBzb21lIGV2ZW4gbnVtYmVyIG9mIFxcLCB0aGVuIG1heWJlIDEgXFwsIGZvbGxvd2VkIGJ5IGEgfFxuICAgICAgdGFpbCA9IHRhaWwucmVwbGFjZSgvKCg/OlxcXFx7Mn0pezAsNjR9KShcXFxcPylcXHwvZywgKF8sICQxLCAkMikgPT4ge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAtIHNob3VsZCBhbHJlYWR5IGJlIGRvbmUgKi9cbiAgICAgICAgaWYgKCEkMikge1xuICAgICAgICAgIC8vIHRoZSB8IGlzbid0IGFscmVhZHkgZXNjYXBlZCwgc28gZXNjYXBlIGl0LlxuICAgICAgICAgICQyID0gJ1xcXFwnXG4gICAgICAgIH1cblxuICAgICAgICAvLyBuZWVkIHRvIGVzY2FwZSBhbGwgdGhvc2Ugc2xhc2hlcyAqYWdhaW4qLCB3aXRob3V0IGVzY2FwaW5nIHRoZVxuICAgICAgICAvLyBvbmUgdGhhdCB3ZSBuZWVkIGZvciBlc2NhcGluZyB0aGUgfCBjaGFyYWN0ZXIuICBBcyBpdCB3b3JrcyBvdXQsXG4gICAgICAgIC8vIGVzY2FwaW5nIGFuIGV2ZW4gbnVtYmVyIG9mIHNsYXNoZXMgY2FuIGJlIGRvbmUgYnkgc2ltcGx5IHJlcGVhdGluZ1xuICAgICAgICAvLyBpdCBleGFjdGx5IGFmdGVyIGl0c2VsZi4gIFRoYXQncyB3aHkgdGhpcyB0cmljayB3b3Jrcy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSSBhbSBzb3JyeSB0aGF0IHlvdSBoYXZlIHRvIHNlZSB0aGlzLlxuICAgICAgICByZXR1cm4gJDEgKyAkMSArICQyICsgJ3wnXG4gICAgICB9KVxuXG4gICAgICB0aGlzLmRlYnVnKCd0YWlsPSVqXFxuICAgJXMnLCB0YWlsLCB0YWlsLCBwbCwgcmUpXG4gICAgICBjb25zdCB0ID0gcGwudHlwZSA9PT0gJyonID8gc3RhclxuICAgICAgICA6IHBsLnR5cGUgPT09ICc/JyA/IHFtYXJrXG4gICAgICAgIDogJ1xcXFwnICsgcGwudHlwZVxuXG4gICAgICBoYXNNYWdpYyA9IHRydWVcbiAgICAgIHJlID0gcmUuc2xpY2UoMCwgcGwucmVTdGFydCkgKyB0ICsgJ1xcXFwoJyArIHRhaWxcbiAgICB9XG5cbiAgICAvLyBoYW5kbGUgdHJhaWxpbmcgdGhpbmdzIHRoYXQgb25seSBtYXR0ZXIgYXQgdGhlIHZlcnkgZW5kLlxuICAgIGNsZWFyU3RhdGVDaGFyKClcbiAgICBpZiAoZXNjYXBpbmcpIHtcbiAgICAgIC8vIHRyYWlsaW5nIFxcXFxcbiAgICAgIHJlICs9ICdcXFxcXFxcXCdcbiAgICB9XG5cbiAgICAvLyBvbmx5IG5lZWQgdG8gYXBwbHkgdGhlIG5vZG90IHN0YXJ0IGlmIHRoZSByZSBzdGFydHMgd2l0aFxuICAgIC8vIHNvbWV0aGluZyB0aGF0IGNvdWxkIGNvbmNlaXZhYmx5IGNhcHR1cmUgYSBkb3RcbiAgICBjb25zdCBhZGRQYXR0ZXJuU3RhcnQgPSBhZGRQYXR0ZXJuU3RhcnRTZXRbcmUuY2hhckF0KDApXVxuXG4gICAgLy8gSGFjayB0byB3b3JrIGFyb3VuZCBsYWNrIG9mIG5lZ2F0aXZlIGxvb2tiZWhpbmQgaW4gSlNcbiAgICAvLyBBIHBhdHRlcm4gbGlrZTogKi4hKHgpLiEoeXx6KSBuZWVkcyB0byBlbnN1cmUgdGhhdCBhIG5hbWVcbiAgICAvLyBsaWtlICdhLnh5ei55eicgZG9lc24ndCBtYXRjaC4gIFNvLCB0aGUgZmlyc3QgbmVnYXRpdmVcbiAgICAvLyBsb29rYWhlYWQsIGhhcyB0byBsb29rIEFMTCB0aGUgd2F5IGFoZWFkLCB0byB0aGUgZW5kIG9mXG4gICAgLy8gdGhlIHBhdHRlcm4uXG4gICAgZm9yIChsZXQgbiA9IG5lZ2F0aXZlTGlzdHMubGVuZ3RoIC0gMTsgbiA+IC0xOyBuLS0pIHtcbiAgICAgIGNvbnN0IG5sID0gbmVnYXRpdmVMaXN0c1tuXVxuXG4gICAgICBjb25zdCBubEJlZm9yZSA9IHJlLnNsaWNlKDAsIG5sLnJlU3RhcnQpXG4gICAgICBjb25zdCBubEZpcnN0ID0gcmUuc2xpY2UobmwucmVTdGFydCwgbmwucmVFbmQgLSA4KVxuICAgICAgbGV0IG5sQWZ0ZXIgPSByZS5zbGljZShubC5yZUVuZClcbiAgICAgIGNvbnN0IG5sTGFzdCA9IHJlLnNsaWNlKG5sLnJlRW5kIC0gOCwgbmwucmVFbmQpICsgbmxBZnRlclxuXG4gICAgICAvLyBIYW5kbGUgbmVzdGVkIHN0dWZmIGxpa2UgKigqLmpzfCEoKi5qc29uKSksIHdoZXJlIG9wZW4gcGFyZW5zXG4gICAgICAvLyBtZWFuIHRoYXQgd2Ugc2hvdWxkICpub3QqIGluY2x1ZGUgdGhlICkgaW4gdGhlIGJpdCB0aGF0IGlzIGNvbnNpZGVyZWRcbiAgICAgIC8vIFwiYWZ0ZXJcIiB0aGUgbmVnYXRlZCBzZWN0aW9uLlxuICAgICAgY29uc3QgY2xvc2VQYXJlbnNCZWZvcmUgPSBubEJlZm9yZS5zcGxpdCgnKScpLmxlbmd0aFxuICAgICAgY29uc3Qgb3BlblBhcmVuc0JlZm9yZSA9IG5sQmVmb3JlLnNwbGl0KCcoJykubGVuZ3RoIC0gY2xvc2VQYXJlbnNCZWZvcmVcbiAgICAgIGxldCBjbGVhbkFmdGVyID0gbmxBZnRlclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcGVuUGFyZW5zQmVmb3JlOyBpKyspIHtcbiAgICAgICAgY2xlYW5BZnRlciA9IGNsZWFuQWZ0ZXIucmVwbGFjZSgvXFwpWysqP10/LywgJycpXG4gICAgICB9XG4gICAgICBubEFmdGVyID0gY2xlYW5BZnRlclxuXG4gICAgICBjb25zdCBkb2xsYXIgPSBubEFmdGVyID09PSAnJyAmJiBpc1N1YiAhPT0gU1VCUEFSU0UgPyAnKD86JHxcXFxcLyknIDogJydcblxuICAgICAgcmUgPSBubEJlZm9yZSArIG5sRmlyc3QgKyBubEFmdGVyICsgZG9sbGFyICsgbmxMYXN0XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIHJlIGlzIG5vdCBcIlwiIGF0IHRoaXMgcG9pbnQsIHRoZW4gd2UgbmVlZCB0byBtYWtlIHN1cmVcbiAgICAvLyBpdCBkb2Vzbid0IG1hdGNoIGFnYWluc3QgYW4gZW1wdHkgcGF0aCBwYXJ0LlxuICAgIC8vIE90aGVyd2lzZSBhLyogd2lsbCBtYXRjaCBhLywgd2hpY2ggaXQgc2hvdWxkIG5vdC5cbiAgICBpZiAocmUgIT09ICcnICYmIGhhc01hZ2ljKSB7XG4gICAgICByZSA9ICcoPz0uKScgKyByZVxuICAgIH1cblxuICAgIGlmIChhZGRQYXR0ZXJuU3RhcnQpIHtcbiAgICAgIHJlID0gcGF0dGVyblN0YXJ0KCkgKyByZVxuICAgIH1cblxuICAgIC8vIHBhcnNpbmcganVzdCBhIHBpZWNlIG9mIGEgbGFyZ2VyIHBhdHRlcm4uXG4gICAgaWYgKGlzU3ViID09PSBTVUJQQVJTRSkge1xuICAgICAgcmV0dXJuIFtyZSwgaGFzTWFnaWNdXG4gICAgfVxuXG4gICAgLy8gaWYgaXQncyBub2Nhc2UsIGFuZCB0aGUgbGNhc2UvdXBwZXJjYXNlIGRvbid0IG1hdGNoLCBpdCdzIG1hZ2ljXG4gICAgaWYgKG9wdGlvbnMubm9jYXNlICYmICFoYXNNYWdpYykge1xuICAgICAgaGFzTWFnaWMgPSBwYXR0ZXJuLnRvVXBwZXJDYXNlKCkgIT09IHBhdHRlcm4udG9Mb3dlckNhc2UoKVxuICAgIH1cblxuICAgIC8vIHNraXAgdGhlIHJlZ2V4cCBmb3Igbm9uLW1hZ2ljYWwgcGF0dGVybnNcbiAgICAvLyB1bmVzY2FwZSBhbnl0aGluZyBpbiBpdCwgdGhvdWdoLCBzbyB0aGF0IGl0J2xsIGJlXG4gICAgLy8gYW4gZXhhY3QgbWF0Y2ggYWdhaW5zdCBhIGZpbGUgZXRjLlxuICAgIGlmICghaGFzTWFnaWMpIHtcbiAgICAgIHJldHVybiBnbG9iVW5lc2NhcGUocGF0dGVybilcbiAgICB9XG5cbiAgICBjb25zdCBmbGFncyA9IG9wdGlvbnMubm9jYXNlID8gJ2knIDogJydcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IFJlZ0V4cCgnXicgKyByZSArICckJywgZmxhZ3MpLCB7XG4gICAgICAgIF9nbG9iOiBwYXR0ZXJuLFxuICAgICAgICBfc3JjOiByZSxcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXIpIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0gc2hvdWxkIGJlIGltcG9zc2libGUgKi8ge1xuICAgICAgLy8gSWYgaXQgd2FzIGFuIGludmFsaWQgcmVndWxhciBleHByZXNzaW9uLCB0aGVuIGl0IGNhbid0IG1hdGNoXG4gICAgICAvLyBhbnl0aGluZy4gIFRoaXMgdHJpY2sgbG9va3MgZm9yIGEgY2hhcmFjdGVyIGFmdGVyIHRoZSBlbmQgb2ZcbiAgICAgIC8vIHRoZSBzdHJpbmcsIHdoaWNoIGlzIG9mIGNvdXJzZSBpbXBvc3NpYmxlLCBleGNlcHQgaW4gbXVsdGktbGluZVxuICAgICAgLy8gbW9kZSwgYnV0IGl0J3Mgbm90IGEgL20gcmVnZXguXG4gICAgICByZXR1cm4gbmV3IFJlZ0V4cCgnJC4nKVxuICAgIH1cbiAgfVxuXG4gIG1ha2VSZSAoKSB7XG4gICAgaWYgKHRoaXMucmVnZXhwIHx8IHRoaXMucmVnZXhwID09PSBmYWxzZSkgcmV0dXJuIHRoaXMucmVnZXhwXG5cbiAgICAvLyBhdCB0aGlzIHBvaW50LCB0aGlzLnNldCBpcyBhIDJkIGFycmF5IG9mIHBhcnRpYWxcbiAgICAvLyBwYXR0ZXJuIHN0cmluZ3MsIG9yIFwiKipcIi5cbiAgICAvL1xuICAgIC8vIEl0J3MgYmV0dGVyIHRvIHVzZSAubWF0Y2goKS4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkbid0XG4gICAgLy8gYmUgdXNlZCwgcmVhbGx5LCBidXQgaXQncyBwcmV0dHkgY29udmVuaWVudCBzb21ldGltZXMsXG4gICAgLy8gd2hlbiB5b3UganVzdCB3YW50IHRvIHdvcmsgd2l0aCBhIHJlZ2V4LlxuICAgIGNvbnN0IHNldCA9IHRoaXMuc2V0XG5cbiAgICBpZiAoIXNldC5sZW5ndGgpIHtcbiAgICAgIHRoaXMucmVnZXhwID0gZmFsc2VcbiAgICAgIHJldHVybiB0aGlzLnJlZ2V4cFxuICAgIH1cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zXG5cbiAgICBjb25zdCB0d29TdGFyID0gb3B0aW9ucy5ub2dsb2JzdGFyID8gc3RhclxuICAgICAgOiBvcHRpb25zLmRvdCA/IHR3b1N0YXJEb3RcbiAgICAgIDogdHdvU3Rhck5vRG90XG4gICAgY29uc3QgZmxhZ3MgPSBvcHRpb25zLm5vY2FzZSA/ICdpJyA6ICcnXG5cbiAgICAvLyBjb2FsZXNjZSBnbG9ic3RhcnMgYW5kIHJlZ2V4cGlmeSBub24tZ2xvYnN0YXIgcGF0dGVybnNcbiAgICAvLyBpZiBpdCdzIHRoZSBvbmx5IGl0ZW0sIHRoZW4gd2UganVzdCBkbyBvbmUgdHdvU3RhclxuICAgIC8vIGlmIGl0J3MgdGhlIGZpcnN0LCBhbmQgdGhlcmUgYXJlIG1vcmUsIHByZXBlbmQgKFxcL3x0d29TdGFyXFwvKT8gdG8gbmV4dFxuICAgIC8vIGlmIGl0J3MgdGhlIGxhc3QsIGFwcGVuZCAoXFwvdHdvU3RhcnwpIHRvIHByZXZpb3VzXG4gICAgLy8gaWYgaXQncyBpbiB0aGUgbWlkZGxlLCBhcHBlbmQgKFxcL3xcXC90d29TdGFyXFwvKSB0byBwcmV2aW91c1xuICAgIC8vIHRoZW4gZmlsdGVyIG91dCBHTE9CU1RBUiBzeW1ib2xzXG4gICAgbGV0IHJlID0gc2V0Lm1hcChwYXR0ZXJuID0+IHtcbiAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLm1hcChwID0+XG4gICAgICAgIHR5cGVvZiBwID09PSAnc3RyaW5nJyA/IHJlZ0V4cEVzY2FwZShwKVxuICAgICAgICA6IHAgPT09IEdMT0JTVEFSID8gR0xPQlNUQVJcbiAgICAgICAgOiBwLl9zcmNcbiAgICAgICkucmVkdWNlKChzZXQsIHApID0+IHtcbiAgICAgICAgaWYgKCEoc2V0W3NldC5sZW5ndGggLSAxXSA9PT0gR0xPQlNUQVIgJiYgcCA9PT0gR0xPQlNUQVIpKSB7XG4gICAgICAgICAgc2V0LnB1c2gocClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2V0XG4gICAgICB9LCBbXSlcbiAgICAgIHBhdHRlcm4uZm9yRWFjaCgocCwgaSkgPT4ge1xuICAgICAgICBpZiAocCAhPT0gR0xPQlNUQVIgfHwgcGF0dGVybltpLTFdID09PSBHTE9CU1RBUikge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgaWYgKHBhdHRlcm4ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgcGF0dGVybltpKzFdID0gJyg/OlxcXFxcXC98JyArIHR3b1N0YXIgKyAnXFxcXFxcLyk/JyArIHBhdHRlcm5baSsxXVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXR0ZXJuW2ldID0gdHdvU3RhclxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpID09PSBwYXR0ZXJuLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBwYXR0ZXJuW2ktMV0gKz0gJyg/OlxcXFxcXC98JyArIHR3b1N0YXIgKyAnKT8nXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGF0dGVybltpLTFdICs9ICcoPzpcXFxcXFwvfFxcXFxcXC8nICsgdHdvU3RhciArICdcXFxcXFwvKScgKyBwYXR0ZXJuW2krMV1cbiAgICAgICAgICBwYXR0ZXJuW2krMV0gPSBHTE9CU1RBUlxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgcmV0dXJuIHBhdHRlcm4uZmlsdGVyKHAgPT4gcCAhPT0gR0xPQlNUQVIpLmpvaW4oJy8nKVxuICAgIH0pLmpvaW4oJ3wnKVxuXG4gICAgLy8gbXVzdCBtYXRjaCBlbnRpcmUgcGF0dGVyblxuICAgIC8vIGVuZGluZyBpbiBhICogb3IgKiogd2lsbCBtYWtlIGl0IGxlc3Mgc3RyaWN0LlxuICAgIHJlID0gJ14oPzonICsgcmUgKyAnKSQnXG5cbiAgICAvLyBjYW4gbWF0Y2ggYW55dGhpbmcsIGFzIGxvbmcgYXMgaXQncyBub3QgdGhpcy5cbiAgICBpZiAodGhpcy5uZWdhdGUpIHJlID0gJ14oPyEnICsgcmUgKyAnKS4qJCdcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnJlZ2V4cCA9IG5ldyBSZWdFeHAocmUsIGZsYWdzKVxuICAgIH0gY2F0Y2ggKGV4KSAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAtIHNob3VsZCBiZSBpbXBvc3NpYmxlICovIHtcbiAgICAgIHRoaXMucmVnZXhwID0gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVnZXhwXG4gIH1cblxuICBtYXRjaCAoZiwgcGFydGlhbCA9IHRoaXMucGFydGlhbCkge1xuICAgIHRoaXMuZGVidWcoJ21hdGNoJywgZiwgdGhpcy5wYXR0ZXJuKVxuICAgIC8vIHNob3J0LWNpcmN1aXQgaW4gdGhlIGNhc2Ugb2YgYnVzdGVkIHRoaW5ncy5cbiAgICAvLyBjb21tZW50cywgZXRjLlxuICAgIGlmICh0aGlzLmNvbW1lbnQpIHJldHVybiBmYWxzZVxuICAgIGlmICh0aGlzLmVtcHR5KSByZXR1cm4gZiA9PT0gJydcblxuICAgIGlmIChmID09PSAnLycgJiYgcGFydGlhbCkgcmV0dXJuIHRydWVcblxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNcblxuICAgIC8vIHdpbmRvd3M6IG5lZWQgdG8gdXNlIC8sIG5vdCBcXFxuICAgIGlmIChwYXRoLnNlcCAhPT0gJy8nKSB7XG4gICAgICBmID0gZi5zcGxpdChwYXRoLnNlcCkuam9pbignLycpXG4gICAgfVxuXG4gICAgLy8gdHJlYXQgdGhlIHRlc3QgcGF0aCBhcyBhIHNldCBvZiBwYXRocGFydHMuXG4gICAgZiA9IGYuc3BsaXQoc2xhc2hTcGxpdClcbiAgICB0aGlzLmRlYnVnKHRoaXMucGF0dGVybiwgJ3NwbGl0JywgZilcblxuICAgIC8vIGp1c3QgT05FIG9mIHRoZSBwYXR0ZXJuIHNldHMgaW4gdGhpcy5zZXQgbmVlZHMgdG8gbWF0Y2hcbiAgICAvLyBpbiBvcmRlciBmb3IgaXQgdG8gYmUgdmFsaWQuICBJZiBuZWdhdGluZywgdGhlbiBqdXN0IG9uZVxuICAgIC8vIG1hdGNoIG1lYW5zIHRoYXQgd2UgaGF2ZSBmYWlsZWQuXG4gICAgLy8gRWl0aGVyIHdheSwgcmV0dXJuIG9uIHRoZSBmaXJzdCBoaXQuXG5cbiAgICBjb25zdCBzZXQgPSB0aGlzLnNldFxuICAgIHRoaXMuZGVidWcodGhpcy5wYXR0ZXJuLCAnc2V0Jywgc2V0KVxuXG4gICAgLy8gRmluZCB0aGUgYmFzZW5hbWUgb2YgdGhlIHBhdGggYnkgbG9va2luZyBmb3IgdGhlIGxhc3Qgbm9uLWVtcHR5IHNlZ21lbnRcbiAgICBsZXQgZmlsZW5hbWVcbiAgICBmb3IgKGxldCBpID0gZi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgZmlsZW5hbWUgPSBmW2ldXG4gICAgICBpZiAoZmlsZW5hbWUpIGJyZWFrXG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBhdHRlcm4gPSBzZXRbaV1cbiAgICAgIGxldCBmaWxlID0gZlxuICAgICAgaWYgKG9wdGlvbnMubWF0Y2hCYXNlICYmIHBhdHRlcm4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGZpbGUgPSBbZmlsZW5hbWVdXG4gICAgICB9XG4gICAgICBjb25zdCBoaXQgPSB0aGlzLm1hdGNoT25lKGZpbGUsIHBhdHRlcm4sIHBhcnRpYWwpXG4gICAgICBpZiAoaGl0KSB7XG4gICAgICAgIGlmIChvcHRpb25zLmZsaXBOZWdhdGUpIHJldHVybiB0cnVlXG4gICAgICAgIHJldHVybiAhdGhpcy5uZWdhdGVcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkaWRuJ3QgZ2V0IGFueSBoaXRzLiAgdGhpcyBpcyBzdWNjZXNzIGlmIGl0J3MgYSBuZWdhdGl2ZVxuICAgIC8vIHBhdHRlcm4sIGZhaWx1cmUgb3RoZXJ3aXNlLlxuICAgIGlmIChvcHRpb25zLmZsaXBOZWdhdGUpIHJldHVybiBmYWxzZVxuICAgIHJldHVybiB0aGlzLm5lZ2F0ZVxuICB9XG5cbiAgc3RhdGljIGRlZmF1bHRzIChkZWYpIHtcbiAgICByZXR1cm4gbWluaW1hdGNoLmRlZmF1bHRzKGRlZikuTWluaW1hdGNoXG4gIH1cbn1cblxubWluaW1hdGNoLk1pbmltYXRjaCA9IE1pbmltYXRjaFxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5924\n")},9509:(module,exports,__webpack_require__)=>{eval("/*! safe-buffer. MIT License. Feross Aboukhadijeh */\n/* eslint-disable node/no-deprecated-api */\nvar buffer = __webpack_require__(4300)\nvar Buffer = buffer.Buffer\n\n// alternative to using Object.keys for old browsers\nfunction copyProps (src, dst) {\n for (var key in src) {\n dst[key] = src[key]\n }\n}\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n module.exports = buffer\n} else {\n // Copy properties from require('buffer')\n copyProps(buffer, exports)\n exports.Buffer = SafeBuffer\n}\n\nfunction SafeBuffer (arg, encodingOrOffset, length) {\n return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.prototype = Object.create(Buffer.prototype)\n\n// Copy static methods from Buffer\ncopyProps(Buffer, SafeBuffer)\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n if (typeof arg === 'number') {\n throw new TypeError('Argument must not be a number')\n }\n return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n var buf = Buffer(size)\n if (fill !== undefined) {\n if (typeof encoding === 'string') {\n buf.fill(fill, encoding)\n } else {\n buf.fill(fill)\n }\n } else {\n buf.fill(0)\n }\n return buf\n}\n\nSafeBuffer.allocUnsafe = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return Buffer(size)\n}\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return buffer.SlowBuffer(size)\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTUwOS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0EsYUFBYSxtQkFBTyxDQUFDLElBQVE7QUFDN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRSxjQUFjO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FjdGlvbi10eXBlc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzPzg3MDciXSwic291cmNlc0NvbnRlbnQiOlsiLyohIHNhZmUtYnVmZmVyLiBNSVQgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBub2RlL25vLWRlcHJlY2F0ZWQtYXBpICovXG52YXIgYnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJylcbnZhciBCdWZmZXIgPSBidWZmZXIuQnVmZmVyXG5cbi8vIGFsdGVybmF0aXZlIHRvIHVzaW5nIE9iamVjdC5rZXlzIGZvciBvbGQgYnJvd3NlcnNcbmZ1bmN0aW9uIGNvcHlQcm9wcyAoc3JjLCBkc3QpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgIGRzdFtrZXldID0gc3JjW2tleV1cbiAgfVxufVxuaWYgKEJ1ZmZlci5mcm9tICYmIEJ1ZmZlci5hbGxvYyAmJiBCdWZmZXIuYWxsb2NVbnNhZmUgJiYgQnVmZmVyLmFsbG9jVW5zYWZlU2xvdykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGJ1ZmZlclxufSBlbHNlIHtcbiAgLy8gQ29weSBwcm9wZXJ0aWVzIGZyb20gcmVxdWlyZSgnYnVmZmVyJylcbiAgY29weVByb3BzKGJ1ZmZlciwgZXhwb3J0cylcbiAgZXhwb3J0cy5CdWZmZXIgPSBTYWZlQnVmZmVyXG59XG5cbmZ1bmN0aW9uIFNhZmVCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cblNhZmVCdWZmZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShCdWZmZXIucHJvdG90eXBlKVxuXG4vLyBDb3B5IHN0YXRpYyBtZXRob2RzIGZyb20gQnVmZmVyXG5jb3B5UHJvcHMoQnVmZmVyLCBTYWZlQnVmZmVyKVxuXG5TYWZlQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cblNhZmVCdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHZhciBidWYgPSBCdWZmZXIoc2l6ZSlcbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBidWYuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmLmZpbGwoZmlsbClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYnVmLmZpbGwoMClcbiAgfVxuICByZXR1cm4gYnVmXG59XG5cblNhZmVCdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlcihzaXplKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gYnVmZmVyLlNsb3dCdWZmZXIoc2l6ZSlcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9509\n")},6099:(__unused_webpack_module,exports,__webpack_require__)=>{eval(";(function (sax) { // wrapper for non-node envs\n sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }\n sax.SAXParser = SAXParser\n sax.SAXStream = SAXStream\n sax.createStream = createStream\n\n // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.\n // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),\n // since that's the earliest that a buffer overrun could occur. This way, checks are\n // as rare as required, but as often as necessary to ensure never crossing this bound.\n // Furthermore, buffers are only tested at most once per write(), so passing a very\n // large string into write() might have undesirable effects, but this is manageable by\n // the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme\n // edge case, result in creating at most one complete copy of the string passed in.\n // Set to Infinity to have unlimited buffers.\n sax.MAX_BUFFER_LENGTH = 64 * 1024\n\n var buffers = [\n 'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',\n 'procInstName', 'procInstBody', 'entity', 'attribName',\n 'attribValue', 'cdata', 'script'\n ]\n\n sax.EVENTS = [\n 'text',\n 'processinginstruction',\n 'sgmldeclaration',\n 'doctype',\n 'comment',\n 'opentagstart',\n 'attribute',\n 'opentag',\n 'closetag',\n 'opencdata',\n 'cdata',\n 'closecdata',\n 'error',\n 'end',\n 'ready',\n 'script',\n 'opennamespace',\n 'closenamespace'\n ]\n\n function SAXParser (strict, opt) {\n if (!(this instanceof SAXParser)) {\n return new SAXParser(strict, opt)\n }\n\n var parser = this\n clearBuffers(parser)\n parser.q = parser.c = ''\n parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH\n parser.opt = opt || {}\n parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags\n parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'\n parser.tags = []\n parser.closed = parser.closedRoot = parser.sawRoot = false\n parser.tag = parser.error = null\n parser.strict = !!strict\n parser.noscript = !!(strict || parser.opt.noscript)\n parser.state = S.BEGIN\n parser.strictEntities = parser.opt.strictEntities\n parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)\n parser.attribList = []\n\n // namespaces form a prototype chain.\n // it always points at the current tag,\n // which protos to its parent tag.\n if (parser.opt.xmlns) {\n parser.ns = Object.create(rootNS)\n }\n\n // mostly just for error reporting\n parser.trackPosition = parser.opt.position !== false\n if (parser.trackPosition) {\n parser.position = parser.line = parser.column = 0\n }\n emit(parser, 'onready')\n }\n\n if (!Object.create) {\n Object.create = function (o) {\n function F () {}\n F.prototype = o\n var newf = new F()\n return newf\n }\n }\n\n if (!Object.keys) {\n Object.keys = function (o) {\n var a = []\n for (var i in o) if (o.hasOwnProperty(i)) a.push(i)\n return a\n }\n }\n\n function checkBufferLength (parser) {\n var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)\n var maxActual = 0\n for (var i = 0, l = buffers.length; i < l; i++) {\n var len = parser[buffers[i]].length\n if (len > maxAllowed) {\n // Text/cdata nodes can get big, and since they're buffered,\n // we can get here under normal conditions.\n // Avoid issues by emitting the text node now,\n // so at least it won't get any bigger.\n switch (buffers[i]) {\n case 'textNode':\n closeText(parser)\n break\n\n case 'cdata':\n emitNode(parser, 'oncdata', parser.cdata)\n parser.cdata = ''\n break\n\n case 'script':\n emitNode(parser, 'onscript', parser.script)\n parser.script = ''\n break\n\n default:\n error(parser, 'Max buffer length exceeded: ' + buffers[i])\n }\n }\n maxActual = Math.max(maxActual, len)\n }\n // schedule the next check for the earliest possible buffer overrun.\n var m = sax.MAX_BUFFER_LENGTH - maxActual\n parser.bufferCheckPosition = m + parser.position\n }\n\n function clearBuffers (parser) {\n for (var i = 0, l = buffers.length; i < l; i++) {\n parser[buffers[i]] = ''\n }\n }\n\n function flushBuffers (parser) {\n closeText(parser)\n if (parser.cdata !== '') {\n emitNode(parser, 'oncdata', parser.cdata)\n parser.cdata = ''\n }\n if (parser.script !== '') {\n emitNode(parser, 'onscript', parser.script)\n parser.script = ''\n }\n }\n\n SAXParser.prototype = {\n end: function () { end(this) },\n write: write,\n resume: function () { this.error = null; return this },\n close: function () { return this.write(null) },\n flush: function () { flushBuffers(this) }\n }\n\n var Stream\n try {\n Stream = (__webpack_require__(2781).Stream)\n } catch (ex) {\n Stream = function () {}\n }\n if (!Stream) Stream = function () {}\n\n var streamWraps = sax.EVENTS.filter(function (ev) {\n return ev !== 'error' && ev !== 'end'\n })\n\n function createStream (strict, opt) {\n return new SAXStream(strict, opt)\n }\n\n function SAXStream (strict, opt) {\n if (!(this instanceof SAXStream)) {\n return new SAXStream(strict, opt)\n }\n\n Stream.apply(this)\n\n this._parser = new SAXParser(strict, opt)\n this.writable = true\n this.readable = true\n\n var me = this\n\n this._parser.onend = function () {\n me.emit('end')\n }\n\n this._parser.onerror = function (er) {\n me.emit('error', er)\n\n // if didn't throw, then means error was handled.\n // go ahead and clear error, so we can write again.\n me._parser.error = null\n }\n\n this._decoder = null\n\n streamWraps.forEach(function (ev) {\n Object.defineProperty(me, 'on' + ev, {\n get: function () {\n return me._parser['on' + ev]\n },\n set: function (h) {\n if (!h) {\n me.removeAllListeners(ev)\n me._parser['on' + ev] = h\n return h\n }\n me.on(ev, h)\n },\n enumerable: true,\n configurable: false\n })\n })\n }\n\n SAXStream.prototype = Object.create(Stream.prototype, {\n constructor: {\n value: SAXStream\n }\n })\n\n SAXStream.prototype.write = function (data) {\n if (typeof Buffer === 'function' &&\n typeof Buffer.isBuffer === 'function' &&\n Buffer.isBuffer(data)) {\n if (!this._decoder) {\n var SD = (__webpack_require__(1576).StringDecoder)\n this._decoder = new SD('utf8')\n }\n data = this._decoder.write(data)\n }\n\n this._parser.write(data.toString())\n this.emit('data', data)\n return true\n }\n\n SAXStream.prototype.end = function (chunk) {\n if (chunk && chunk.length) {\n this.write(chunk)\n }\n this._parser.end()\n return true\n }\n\n SAXStream.prototype.on = function (ev, handler) {\n var me = this\n if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {\n me._parser['on' + ev] = function () {\n var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)\n args.splice(0, 0, ev)\n me.emit.apply(me, args)\n }\n }\n\n return Stream.prototype.on.call(me, ev, handler)\n }\n\n // this really needs to be replaced with character classes.\n // XML allows all manner of ridiculous numbers and digits.\n var CDATA = '[CDATA['\n var DOCTYPE = 'DOCTYPE'\n var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'\n var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/'\n var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }\n\n // http://www.w3.org/TR/REC-xml/#NT-NameStartChar\n // This implementation works on strings, a single character at a time\n // as such, it cannot ever support astral-plane characters (10000-EFFFF)\n // without a significant breaking change to either this parser, or the\n // JavaScript language. Implementation of an emoji-capable xml parser\n // is left as an exercise for the reader.\n var nameStart = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n\n var nameBody = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040.\\d-]/\n\n var entityStart = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n var entityBody = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040.\\d-]/\n\n function isWhitespace (c) {\n return c === ' ' || c === '\\n' || c === '\\r' || c === '\\t'\n }\n\n function isQuote (c) {\n return c === '\"' || c === '\\''\n }\n\n function isAttribEnd (c) {\n return c === '>' || isWhitespace(c)\n }\n\n function isMatch (regex, c) {\n return regex.test(c)\n }\n\n function notMatch (regex, c) {\n return !isMatch(regex, c)\n }\n\n var S = 0\n sax.STATE = {\n BEGIN: S++, // leading byte order mark or whitespace\n BEGIN_WHITESPACE: S++, // leading whitespace\n TEXT: S++, // general stuff\n TEXT_ENTITY: S++, // & and such.\n OPEN_WAKA: S++, // <\n SGML_DECL: S++, // \n SCRIPT: S++, //