346 lines
37 KiB
JavaScript
346 lines
37 KiB
JavaScript
/******/ (() => { // webpackBootstrap
|
|
/******/ "use strict";
|
|
/******/ var __webpack_modules__ = ({
|
|
|
|
/***/ "./src/WebSocketEvent.ts":
|
|
/*!*******************************!*\
|
|
!*** ./src/WebSocketEvent.ts ***!
|
|
\*******************************/
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.WebSocketEvent = void 0;
|
|
var WebSocketEvent;
|
|
(function (WebSocketEvent) {
|
|
WebSocketEvent["STATUS"] = "STATUS";
|
|
})(WebSocketEvent = exports.WebSocketEvent || (exports.WebSocketEvent = {}));
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/WebSocketPayload.ts":
|
|
/*!*********************************!*\
|
|
!*** ./src/WebSocketPayload.ts ***!
|
|
\*********************************/
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.WebSocketPayload = void 0;
|
|
const WebSocketEvent_1 = __webpack_require__(/*! ./WebSocketEvent */ "./src/WebSocketEvent.ts");
|
|
class WebSocketPayload {
|
|
constructor(event, error = false, data) {
|
|
this._event = event;
|
|
this._error = error;
|
|
this._data = data;
|
|
}
|
|
set event(value) {
|
|
this._event = value;
|
|
}
|
|
set error(value) {
|
|
this._error = value;
|
|
}
|
|
set data(value) {
|
|
this._data = value;
|
|
}
|
|
get event() {
|
|
return this._event;
|
|
}
|
|
get error() {
|
|
return this._error;
|
|
}
|
|
get data() {
|
|
return this._data;
|
|
}
|
|
static parseFromBase64Json(json) {
|
|
json = (typeof window != 'undefined') ? atob(json) : Buffer.from(json, "base64").toString();
|
|
let rawPayload;
|
|
try {
|
|
rawPayload = JSON.parse(json);
|
|
}
|
|
catch (e) {
|
|
return null;
|
|
}
|
|
let wsEvent = WebSocketEvent_1.WebSocketEvent[rawPayload.event];
|
|
return new WebSocketPayload(wsEvent, rawPayload.error, rawPayload.data);
|
|
}
|
|
toString() {
|
|
let json = JSON.stringify({ "event": this._event, status: this._error, data: this._data });
|
|
json = ((typeof window != 'undefined') ? btoa(json) : Buffer.from(json).toString("base64"));
|
|
return json;
|
|
}
|
|
}
|
|
exports.WebSocketPayload = WebSocketPayload;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/web/ButtonType.ts":
|
|
/*!*******************************!*\
|
|
!*** ./src/web/ButtonType.ts ***!
|
|
\*******************************/
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.ButtonType = void 0;
|
|
var ButtonType;
|
|
(function (ButtonType) {
|
|
ButtonType["SUCCESS"] = "success";
|
|
ButtonType["ERROR"] = "error";
|
|
})(ButtonType = exports.ButtonType || (exports.ButtonType = {}));
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/web/Modal.ts":
|
|
/*!**************************!*\
|
|
!*** ./src/web/Modal.ts ***!
|
|
\**************************/
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.Modal = void 0;
|
|
class Modal {
|
|
constructor(id, title, content) {
|
|
this._title = "iTender";
|
|
this._content = "";
|
|
this._id = "";
|
|
this._loader = false;
|
|
this._buttons = [];
|
|
this._id = id;
|
|
this._title = title;
|
|
this._content = content;
|
|
}
|
|
set title(value) {
|
|
this._title = value;
|
|
}
|
|
set content(value) {
|
|
this._content = value;
|
|
}
|
|
set id(value) {
|
|
this._id = value;
|
|
}
|
|
set loader(value) {
|
|
this._loader = value;
|
|
}
|
|
addButton(type, content, onclick) {
|
|
this._buttons.push({ type: type, content: content, onclick: onclick });
|
|
}
|
|
open() {
|
|
if (!this._content)
|
|
this._content = "";
|
|
if (this._loader)
|
|
this._content += "<br><div class=\"lds-ellipsis\">\n" +
|
|
" <div></div><div></div><div></div><div></div>\n" +
|
|
"</div>";
|
|
for (let btn of this._buttons) {
|
|
this._content += `<button class="btn btn-${btn.type}" onclick="(${btn.onclick})();">${btn.content}</button>`;
|
|
}
|
|
Modal.open(this._title, this._content, this._id);
|
|
}
|
|
static open(title, content, id) {
|
|
const modal = document.getElementById("modal");
|
|
const modalContent = document.getElementById("modalInnerContent");
|
|
if (!modal || !modalContent)
|
|
return;
|
|
modalContent.classList.add("modalBlendIn");
|
|
modal.classList.add("modalBlendIn");
|
|
setTimeout(() => {
|
|
modalContent.classList.remove("modalBlendIn");
|
|
modal.classList.remove("modalBlendIn");
|
|
}, 800);
|
|
modalContent.innerHTML = `<h1 id="modalTitle">${title}</h1>${content}`;
|
|
modal.style.display = "block";
|
|
this.currentModalId = id ? id : "null";
|
|
}
|
|
static close(id) {
|
|
if (this.currentModalId != id)
|
|
return;
|
|
const modal = document.getElementById("modal");
|
|
const modalContent = document.getElementById("modal-content");
|
|
const modalInnerContent = document.getElementById("modalInnerContent");
|
|
if (!modal || !modalContent || !modalInnerContent)
|
|
return;
|
|
modalContent.classList.add("modalBlendOut");
|
|
modal.classList.add("modalBlendOut");
|
|
setTimeout(() => {
|
|
modal.style.display = "none";
|
|
modalInnerContent.innerHTML = "";
|
|
modalContent.classList.remove("modalBlendOut");
|
|
modal.classList.remove("modalBlendOut");
|
|
}, 800);
|
|
}
|
|
}
|
|
exports.Modal = Modal;
|
|
Modal.currentModalId = "";
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/web/WebWebSocketHandler.ts":
|
|
/*!****************************************!*\
|
|
!*** ./src/web/WebWebSocketHandler.ts ***!
|
|
\****************************************/
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.WebWebSocketHandler = void 0;
|
|
const Modal_1 = __webpack_require__(/*! ./Modal */ "./src/web/Modal.ts");
|
|
const WebSocketEvent_1 = __webpack_require__(/*! ../WebSocketEvent */ "./src/WebSocketEvent.ts");
|
|
const WebSocketPayload_1 = __webpack_require__(/*! ../WebSocketPayload */ "./src/WebSocketPayload.ts");
|
|
const ButtonType_1 = __webpack_require__(/*! ./ButtonType */ "./src/web/ButtonType.ts");
|
|
class WebWebSocketHandler {
|
|
constructor() {
|
|
this.socket = new WebSocket(WebWebSocketHandler.url);
|
|
this.socket.onopen = this.onOpen;
|
|
this.socket.onclose = this.onClose;
|
|
this.socket.onerror = this.onError;
|
|
this.socket.onmessage = this.onMessage;
|
|
}
|
|
onMessage(msgEvent) {
|
|
console.log("[WS] Incoming message", msgEvent);
|
|
let payload = WebSocketPayload_1.WebSocketPayload.parseFromBase64Json(msgEvent.data);
|
|
if (!payload) {
|
|
console.log("[WS] Could not parse message: ", msgEvent);
|
|
return;
|
|
}
|
|
console.debug(payload);
|
|
console.debug(payload.event);
|
|
console.log("[WS] Received " + payload.event + " Event");
|
|
switch (payload.event) {
|
|
case WebSocketEvent_1.WebSocketEvent.STATUS: {
|
|
let statusElement = document.getElementById("status");
|
|
if (statusElement)
|
|
statusElement.innerText = payload.data.status;
|
|
}
|
|
}
|
|
}
|
|
onOpen(event) {
|
|
console.log("[WS] Connected", event);
|
|
Modal_1.Modal.close("start");
|
|
let connectionElement = document.getElementById("right");
|
|
if (connectionElement)
|
|
connectionElement.innerText = "Verbunden";
|
|
}
|
|
onClose(event) {
|
|
console.error("[WS] Closed!", event);
|
|
if (event.wasClean) {
|
|
let modal = new Modal_1.Modal("socketClosed", "Sitzung beendet!");
|
|
modal.content = `Diese Sitzung wurde beendet, da der iTender nun an einem anderen Gerät bzw. an dem Hauptgerät gesteuert wird.<br><br>`;
|
|
modal.addButton(ButtonType_1.ButtonType.SUCCESS, "Sitzung wiederherstellen", () => {
|
|
window.location.reload();
|
|
});
|
|
modal.open();
|
|
}
|
|
else {
|
|
let modal = new Modal_1.Modal("socketClosed", "Verbindungsproblem!");
|
|
modal.content = `Die Benutzeroberfläche hat die Verbindung mit dem Gerät verloren.<br>Die Verbindung wird wiederhergestellt...<br>`;
|
|
modal.loader = true;
|
|
modal.open();
|
|
setInterval(() => {
|
|
window.location.reload();
|
|
}, 5000);
|
|
}
|
|
let connectionElement = document.getElementById("right");
|
|
if (connectionElement)
|
|
connectionElement.innerText = "Keine Verbindung";
|
|
}
|
|
onError(event) {
|
|
console.error("[WS] Error", event);
|
|
let connectionElement = document.getElementById("right");
|
|
if (connectionElement)
|
|
connectionElement.innerText = "Fehler";
|
|
}
|
|
}
|
|
exports.WebWebSocketHandler = WebWebSocketHandler;
|
|
WebWebSocketHandler.url = (window.location.protocol == "http:" ? "ws://" : "wss://") + window.location.hostname + ":3005";
|
|
|
|
|
|
/***/ })
|
|
|
|
/******/ });
|
|
/************************************************************************/
|
|
/******/ // The module cache
|
|
/******/ var __webpack_module_cache__ = {};
|
|
/******/
|
|
/******/ // The require function
|
|
/******/ function __webpack_require__(moduleId) {
|
|
/******/ // Check if module is in cache
|
|
/******/ var cachedModule = __webpack_module_cache__[moduleId];
|
|
/******/ if (cachedModule !== undefined) {
|
|
/******/ return cachedModule.exports;
|
|
/******/ }
|
|
/******/ // Create a new module (and put it into the cache)
|
|
/******/ var module = __webpack_module_cache__[moduleId] = {
|
|
/******/ // no module.id needed
|
|
/******/ // no module.loaded needed
|
|
/******/ exports: {}
|
|
/******/ };
|
|
/******/
|
|
/******/ // Execute the module function
|
|
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
/******/
|
|
/******/ // Return the exports of the module
|
|
/******/ return module.exports;
|
|
/******/ }
|
|
/******/
|
|
/************************************************************************/
|
|
var __webpack_exports__ = {};
|
|
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
|
|
(() => {
|
|
var exports = __webpack_exports__;
|
|
/*!*************************!*\
|
|
!*** ./src/web/main.ts ***!
|
|
\*************************/
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
const WebWebSocketHandler_1 = __webpack_require__(/*! ./WebWebSocketHandler */ "./src/web/WebWebSocketHandler.ts");
|
|
const Modal_1 = __webpack_require__(/*! ./Modal */ "./src/web/Modal.ts");
|
|
const main = document.getElementById("main");
|
|
const time = document.getElementById("title");
|
|
document.addEventListener("DOMContentLoaded", () => {
|
|
console.log("DOM Loaded");
|
|
let modal = new Modal_1.Modal("start", "iTender");
|
|
modal.content = "Willkommen";
|
|
modal.loader = true;
|
|
modal.open();
|
|
connect();
|
|
setTimeout(load, 1000);
|
|
});
|
|
function load() {
|
|
if (!main || !time)
|
|
return;
|
|
setInterval(() => {
|
|
let currentDate = new Date();
|
|
time.innerText = "" + (currentDate.getHours() < 10 ? "0" + currentDate.getHours() : currentDate.getHours()) + ":" + (currentDate.getMinutes() < 10 ? "0" + currentDate.getMinutes() : currentDate.getMinutes());
|
|
}, 1000);
|
|
let maxI = 20;
|
|
main.style.gridTemplateRows = `repeat(${Math.round(maxI / 3)}, calc(90%/2))`;
|
|
for (let i = 0; i < maxI; i++) {
|
|
let testDrink = document.createElement("div");
|
|
testDrink.classList.add("drink");
|
|
let img = document.createElement("img");
|
|
img.classList.add("thumbnail");
|
|
testDrink.append(img);
|
|
let name = document.createElement("p");
|
|
name.classList.add("name");
|
|
testDrink.append(name);
|
|
img.alt = "Thumbnail";
|
|
name.innerText = "Mixery";
|
|
main.append(testDrink);
|
|
}
|
|
}
|
|
let wsHandler;
|
|
function connect() {
|
|
wsHandler = new WebWebSocketHandler_1.WebWebSocketHandler();
|
|
}
|
|
|
|
})();
|
|
|
|
/******/ })()
|
|
;
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV0QixJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdkIsR0FBRyxDQUFDLEdBQUcsR0FBQyxXQUFXLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRO1FBRXpCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDekI7QUFDSixDQUFDO0FBRUQsSUFBSSxTQUFTLENBQUM7QUFDZCxTQUFTLE9BQU87SUFFYixTQUFTLEdBQUcsSUFBSSx5Q0FBbUIsRUFBRSxDQUFDO0FBRXpDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGVuZGVyLy4vc3JjL1dlYlNvY2tldEV2ZW50LnRzIiwid2VicGFjazovL2l0ZW5kZXIvLi9zcmMvV2ViU29ja2V0UGF5bG9hZC50cyIsIndlYnBhY2s6Ly9pdGVuZGVyLy4vc3JjL3dlYi9CdXR0b25UeXBlLnRzIiwid2VicGFjazovL2l0ZW5kZXIvLi9zcmMvd2ViL01vZGFsLnRzIiwid2VicGFjazovL2l0ZW5kZXIvLi9zcmMvd2ViL1dlYldlYlNvY2tldEhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vaXRlbmRlci93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9pdGVuZGVyLy4vc3JjL3dlYi9tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIFdlYlNvY2tldEV2ZW50IHtcbiAgICBTVEFUVVM9IFwiU1RBVFVTXCJcbn0iLCJpbXBvcnQge1dlYlNvY2tldEV2ZW50fSBmcm9tIFwiLi9XZWJTb2NrZXRFdmVudFwiO1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0UGF5bG9hZCB7XG4gICAgc2V0IGV2ZW50KHZhbHVlOiBXZWJTb2NrZXRFdmVudCkge1xuICAgICAgICB0aGlzLl9ldmVudCA9IHZhbHVlO1xuICAgIH1cblxuICAgIHNldCBlcnJvcih2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9lcnJvciA9IHZhbHVlO1xuICAgIH1cblxuICAgIHNldCBkYXRhKHZhbHVlOiBhbnkgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2V2ZW50OiBXZWJTb2NrZXRFdmVudDtcbiAgICBwcml2YXRlIF9lcnJvcjogYm9vbGVhbjtcbiAgICBwcml2YXRlIF9kYXRhOiBhbnkgfCB1bmRlZmluZWQ7XG5cblxuICAgIGdldCBldmVudCgpOiBXZWJTb2NrZXRFdmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG5cbiAgICBnZXQgZXJyb3IoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lcnJvcjtcbiAgICB9XG5cbiAgICBnZXQgZGF0YSgpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihldmVudDogV2ViU29ja2V0RXZlbnQsIGVycm9yOiBib29sZWFuID0gZmFsc2UsIGRhdGE/OiBhbnkpIHtcbiAgICAgICAgdGhpcy5fZXZlbnQgPSBldmVudDtcbiAgICAgICAgdGhpcy5fZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBwYXJzZUZyb21CYXNlNjRKc29uKGpzb246IHN0cmluZyk6IFdlYlNvY2tldFBheWxvYWQgfCBudWxsIHtcbiAgICAgICAganNvbiA9ICh0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnKSA/IGF0b2IoanNvbikgOiBCdWZmZXIuZnJvbShqc29uLCBcImJhc2U2NFwiKS50b1N0cmluZygpO1xuICAgICAgICBsZXQgcmF3UGF5bG9hZDogeyBldmVudDogc3RyaW5nLCBlcnJvcjogYm9vbGVhbiwgZGF0YTogYW55IH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByYXdQYXlsb2FkID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgd3NFdmVudCA9IFdlYlNvY2tldEV2ZW50WzxrZXlvZiB0eXBlb2YgV2ViU29ja2V0RXZlbnQ+cmF3UGF5bG9hZC5ldmVudF07XG5cbiAgICAgICAgcmV0dXJuIG5ldyBXZWJTb2NrZXRQYXlsb2FkKHdzRXZlbnQsIHJhd1BheWxvYWQuZXJyb3IsIHJhd1BheWxvYWQuZGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcGF5bG9hZCBhcyBiYXNlNjQgZW5jb2RlZCBqc29uIHN0cmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBsZXQganNvbiA9IEpTT04uc3RyaW5naWZ5KHtcImV2ZW50XCI6IHRoaXMuX2V2ZW50LCBzdGF0dXM6IHRoaXMuX2Vycm9yLCBkYXRhOiB0aGlzLl9kYXRhfSk7XG4gICAgICAgIGpzb24gPSAoKHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcpID8gYnRvYShqc29uKSA6IEJ1ZmZlci5mcm9tKGpzb24pLnRvU3RyaW5nKFwiYmFzZTY0XCIpKTtcbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxufSIsImV4cG9ydCBlbnVtIEJ1dHRvblR5cGUge1xuICAgIFNVQ0NFU1MgPSBcInN1Y2Nlc3NcIixcbiAgICBFUlJPUiA9IFwiZXJyb3JcIixcblxufSIsImltcG9ydCB7QnV0dG9uVHlwZX0gZnJvbSBcIi4vQnV0dG9uVHlwZVwiO1xuXG5leHBvcnQgY2xhc3MgTW9kYWwge1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgY3VycmVudE1vZGFsSWQgPSBcIlwiO1xuXG4gICAgcHJpdmF0ZSBfdGl0bGU6IHN0cmluZyA9IFwiaVRlbmRlclwiO1xuICAgIHByaXZhdGUgX2NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IFwiXCI7XG4gICAgcHJpdmF0ZSBfaWQ6IHN0cmluZyA9IFwiXCI7XG4gICAgcHJpdmF0ZSBfbG9hZGVyOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfYnV0dG9uczogeyB0eXBlOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgb25jbGljazogRnVuY3Rpb24gfVtdID0gW107XG5cblxuICAgIGNvbnN0cnVjdG9yKGlkLCB0aXRsZTogc3RyaW5nLCBjb250ZW50Pzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2lkID0gaWQ7XG4gICAgICAgIHRoaXMuX3RpdGxlID0gdGl0bGU7XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBjb250ZW50O1xuICAgIH1cblxuXG4gICAgc2V0IHRpdGxlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fdGl0bGUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBzZXQgY29udGVudCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBzZXQgaWQodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIHNldCBsb2FkZXIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fbG9hZGVyID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEJ1dHRvbiggdHlwZTogQnV0dG9uVHlwZSwgY29udGVudDogc3RyaW5nLCBvbmNsaWNrOiBGdW5jdGlvbiApXG4gICAge1xuICAgICAgICB0aGlzLl9idXR0b25zLnB1c2goe3R5cGU6IHR5cGUsIGNvbnRlbnQ6IGNvbnRlbnQsIG9uY2xpY2s6IG9uY2xpY2t9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3BlbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jb250ZW50KVxuICAgICAgICAgICAgdGhpcy5fY29udGVudCA9IFwiXCI7XG5cbiAgICAgICAgaWYgKHRoaXMuX2xvYWRlcilcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnQgKz0gXCI8YnI+PGRpdiBjbGFzcz1cXFwibGRzLWVsbGlwc2lzXFxcIj5cXG5cIiArXG4gICAgICAgICAgICAgICAgXCIgIDxkaXY+PC9kaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjxkaXY+PC9kaXY+XFxuXCIgK1xuICAgICAgICAgICAgICAgIFwiPC9kaXY+XCI7XG5cbiAgICAgICAgZm9yIChsZXQgYnRuIG9mIHRoaXMuX2J1dHRvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnQgKz0gYDxidXR0b24gY2xhc3M9XCJidG4gYnRuLSR7YnRuLnR5cGV9XCIgb25jbGljaz1cIigke2J0bi5vbmNsaWNrfSkoKTtcIj4ke2J0bi5jb250ZW50fTwvYnV0dG9uPmA7XG4gICAgICAgIH1cblxuICAgICAgICBNb2RhbC5vcGVuKHRoaXMuX3RpdGxlLCB0aGlzLl9jb250ZW50LCB0aGlzLl9pZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRpdGxlXG4gICAgICogQHBhcmFtIGNvbnRlbnRcbiAgICAgKiBAcGFyYW0gaWRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIG9wZW4odGl0bGU6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBpZD86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibW9kYWxcIik7XG4gICAgICAgIGNvbnN0IG1vZGFsQ29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibW9kYWxJbm5lckNvbnRlbnRcIik7XG5cbiAgICAgICAgaWYgKCFtb2RhbCB8fCAhbW9kYWxDb250ZW50KVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIG1vZGFsQ29udGVudC5jbGFzc0xpc3QuYWRkKFwibW9kYWxCbGVuZEluXCIpO1xuICAgICAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKFwibW9kYWxCbGVuZEluXCIpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgbW9kYWxDb250ZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJtb2RhbEJsZW5kSW5cIik7XG4gICAgICAgICAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKFwibW9kYWxCbGVuZEluXCIpO1xuICAgICAgICB9LCA4MDApO1xuXG4gICAgICAgIG1vZGFsQ29udGVudC5pbm5lckhUTUwgPSBgPGgxIGlkPVwibW9kYWxUaXRsZVwiPiR7dGl0bGV9PC9oMT4ke2NvbnRlbnR9YDtcbiAgICAgICAgbW9kYWwuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcblxuICAgICAgICB0aGlzLmN1cnJlbnRNb2RhbElkID0gaWQgPyBpZCA6IFwibnVsbFwiO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xvc2UoaWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudE1vZGFsSWQgIT0gaWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1vZGFsXCIpO1xuICAgICAgICBjb25zdCBtb2RhbENvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1vZGFsLWNvbnRlbnRcIik7XG4gICAgICAgIGNvbnN0IG1vZGFsSW5uZXJDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtb2RhbElubmVyQ29udGVudFwiKTtcblxuICAgICAgICBpZiAoIW1vZGFsIHx8ICFtb2RhbENvbnRlbnQgfHwgIW1vZGFsSW5uZXJDb250ZW50KVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIG1vZGFsQ29udGVudC5jbGFzc0xpc3QuYWRkKFwibW9kYWxCbGVuZE91dFwiKTtcbiAgICAgICAgbW9kYWwuY2xhc3NMaXN0LmFkZChcIm1vZGFsQmxlbmRPdXRcIik7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBtb2RhbC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgICAgICBtb2RhbElubmVyQ29udGVudC5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICAgICAgbW9kYWxDb250ZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJtb2RhbEJsZW5kT3V0XCIpO1xuICAgICAgICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZShcIm1vZGFsQmxlbmRPdXRcIik7XG4gICAgICAgIH0sIDgwMCk7XG4gICAgfVxufSIsImltcG9ydCB7TW9kYWx9IGZyb20gXCIuL01vZGFsXCI7XG5pbXBvcnQge1dlYlNvY2tldEV2ZW50fSBmcm9tIFwiLi4vV2ViU29ja2V0RXZlbnRcIjtcbmltcG9ydCB7V2ViU29ja2V0UGF5bG9hZH0gZnJvbSBcIi4uL1dlYlNvY2tldFBheWxvYWRcIjtcbmltcG9ydCB7QnV0dG9uVHlwZX0gZnJvbSBcIi4vQnV0dG9uVHlwZVwiO1xuXG5leHBvcnQgY2xhc3MgV2ViV2ViU29ja2V0SGFuZGxlciB7XG4gICAgcHJpdmF0ZSBzb2NrZXQ6IFdlYlNvY2tldDtcbiAgICBwcml2YXRlIHN0YXRpYyB1cmwgPSAod2luZG93LmxvY2F0aW9uLnByb3RvY29sID09IFwiaHR0cDpcIiA/IFwid3M6Ly9cIiA6IFwid3NzOi8vXCIpICsgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lICsgXCI6MzAwNVwiO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldChXZWJXZWJTb2NrZXRIYW5kbGVyLnVybCk7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9ub3BlbiA9IHRoaXMub25PcGVuO1xuICAgICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gdGhpcy5vbkNsb3NlO1xuICAgICAgICB0aGlzLnNvY2tldC5vbmVycm9yID0gdGhpcy5vbkVycm9yO1xuICAgICAgICB0aGlzLnNvY2tldC5vbm1lc3NhZ2UgPSB0aGlzLm9uTWVzc2FnZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uTWVzc2FnZShtc2dFdmVudDogTWVzc2FnZUV2ZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiW1dTXSBJbmNvbWluZyBtZXNzYWdlXCIsIG1zZ0V2ZW50KTtcbiAgICAgICAgbGV0IHBheWxvYWQgPSBXZWJTb2NrZXRQYXlsb2FkLnBhcnNlRnJvbUJhc2U2NEpzb24obXNnRXZlbnQuZGF0YSk7XG4gICAgICAgIGlmICghcGF5bG9hZCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJbV1NdIENvdWxkIG5vdCBwYXJzZSBtZXNzYWdlOiBcIiwgbXNnRXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUuZGVidWcocGF5bG9hZClcblxuICAgICAgICBjb25zb2xlLmRlYnVnKHBheWxvYWQuZXZlbnQpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKFwiW1dTXSBSZWNlaXZlZCBcIiArIHBheWxvYWQuZXZlbnQgKyBcIiBFdmVudFwiKTtcblxuICAgICAgICBzd2l0Y2ggKHBheWxvYWQuZXZlbnQpIHtcbiAgICAgICAgICAgIGNhc2UgV2ViU29ja2V0RXZlbnQuU1RBVFVTOiB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXR1c0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInN0YXR1c1wiKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzRWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzRWxlbWVudC5pbm5lclRleHQgPSBwYXlsb2FkLmRhdGEuc3RhdHVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbk9wZW4oZXZlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbV1NdIENvbm5lY3RlZFwiLCBldmVudCk7XG4gICAgICAgIE1vZGFsLmNsb3NlKFwic3RhcnRcIik7XG4gICAgICAgIGxldCBjb25uZWN0aW9uRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmlnaHRcIik7XG4gICAgICAgIGlmIChjb25uZWN0aW9uRWxlbWVudClcbiAgICAgICAgICAgIGNvbm5lY3Rpb25FbGVtZW50LmlubmVyVGV4dCA9IFwiVmVyYnVuZGVuXCI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkNsb3NlKGV2ZW50KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbV1NdIENsb3NlZCFcIiwgZXZlbnQpO1xuICAgICAgICBpZiggZXZlbnQud2FzQ2xlYW4gKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgbW9kYWwgPSBuZXcgTW9kYWwoXCJzb2NrZXRDbG9zZWRcIiwgXCJTaXR6dW5nIGJlZW5kZXQhXCIpO1xuICAgICAgICAgICAgbW9kYWwuY29udGVudCA9IGBEaWVzZSBTaXR6dW5nIHd1cmRlIGJlZW5kZXQsIGRhIGRlciBpVGVuZGVyIG51biBhbiBlaW5lbSBhbmRlcmVuIEdlcsOkdCBiencuIGFuIGRlbSBIYXVwdGdlcsOkdCBnZXN0ZXVlcnQgd2lyZC48YnI+PGJyPmA7XG4gICAgICAgICAgICBtb2RhbC5hZGRCdXR0b24oQnV0dG9uVHlwZS5TVUNDRVNTLCBcIlNpdHp1bmcgd2llZGVyaGVyc3RlbGxlblwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtb2RhbC5vcGVuKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgbW9kYWwgPSBuZXcgTW9kYWwoXCJzb2NrZXRDbG9zZWRcIiwgXCJWZXJiaW5kdW5nc3Byb2JsZW0hXCIpO1xuICAgICAgICAgICAgbW9kYWwuY29udGVudCA9IGBEaWUgQmVudXR6ZXJvYmVyZmzDpGNoZSBoYXQgZGllIFZlcmJpbmR1bmcgbWl0IGRlbSBHZXLDpHQgdmVybG9yZW4uPGJyPkRpZSBWZXJiaW5kdW5nIHdpcmQgd2llZGVyaGVyZ2VzdGVsbHQuLi48YnI+YDtcbiAgICAgICAgICAgIG1vZGFsLmxvYWRlciA9IHRydWU7XG4gICAgICAgICAgICBtb2RhbC5vcGVuKCk7XG4gICAgICAgICAgICBzZXRJbnRlcnZhbCggKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgICAgIH0sIDUwMDAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb25uZWN0aW9uRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmlnaHRcIik7XG4gICAgICAgIGlmIChjb25uZWN0aW9uRWxlbWVudClcbiAgICAgICAgICAgIGNvbm5lY3Rpb25FbGVtZW50LmlubmVyVGV4dCA9IFwiS2VpbmUgVmVyYmluZHVuZ1wiO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25FcnJvcihldmVudCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiW1dTXSBFcnJvclwiLCBldmVudCk7XG4gICAgICAgIGxldCBjb25uZWN0aW9uRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmlnaHRcIik7XG4gICAgICAgIGlmIChjb25uZWN0aW9uRWxlbWVudClcbiAgICAgICAgICAgIGNvbm5lY3Rpb25FbGVtZW50LmlubmVyVGV4dCA9IFwiRmVobGVyXCI7XG4gICAgICAgIC8vb3Blbk1vZGFsKFwiRWluZW4gQXVnZW5ibGljay4uLlwiLCBgRXMgd3VyZGUgZWluIGtyaXRpc2NoZXIgRmVobGVyIGZlc3RnZXN0ZWxsdC5cXG5CaXR0ZSB3YXJ0ZW4gU2llLCB3w6RocmVuZCBkZXIgUHJvemVzcyBuZXUgZ2VzdGFydGV0IHdpcmQuLi5gICk7XG4gICAgICAgIC8vd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH1cbn0iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiaW1wb3J0IHtXZWJXZWJTb2NrZXRIYW5kbGVyfSBmcm9tIFwiLi9XZWJXZWJTb2NrZXRIYW5kbGVyXCI7XG5pbXBvcnQge01vZGFsfSBmcm9tIFwiLi9Nb2RhbFwiO1xuXG5jb25zdCBtYWluID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtYWluXCIpO1xuY29uc3QgdGltZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidGl0bGVcIik7XG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsICgpID0+IHtcbiAgIGNvbnNvbGUubG9nKFwiRE9NIExvYWRlZFwiKTtcblxuICAgbGV0IG1vZGFsID0gbmV3IE1vZGFsKFwic3RhcnRcIiwgXCJpVGVuZGVyXCIpO1xuICAgbW9kYWwuY29udGVudCA9IFwiV2lsbGtvbW1lblwiO1xuICAgbW9kYWwubG9hZGVyID0gdHJ1ZTtcbiAgIG1vZGFsLm9wZW4oKTtcbiAgIGNvbm5lY3QoKTtcblxuICAgc2V0VGltZW91dCggbG9hZCwgMTAwMCk7XG59KTtcblxuZnVuY3Rpb24gbG9hZCgpXG57XG4gICBpZighbWFpbnx8IXRpbWUpXG4gICAgICByZXR1cm47XG5cbiAgIHNldEludGVydmFsKCAoKSA9PiB7XG4gICAgICBsZXQgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgdGltZS5pbm5lclRleHQgPSBcIlwiICsgKCBjdXJyZW50RGF0ZS5nZXRIb3VycygpIDwgMTAgPyBcIjBcIiArIGN1cnJlbnREYXRlLmdldEhvdXJzKCkgOiBjdXJyZW50RGF0ZS5nZXRIb3VycygpICkgKyBcIjpcIiArICggY3VycmVudERhdGUuZ2V0TWludXRlcygpIDwgMTAgPyBcIjBcIiArIGN1cnJlbnREYXRlLmdldE1pbnV0ZXMoKSA6IGN1cnJlbnREYXRlLmdldE1pbnV0ZXMoKSApO1xuICAgfSwgMTAwMCApO1xuXG4gICBsZXQgbWF4SSA9IDIwO1xuXG4gICBtYWluLnN0eWxlLmdyaWRUZW1wbGF0ZVJvd3MgPSBgcmVwZWF0KCR7TWF0aC5yb3VuZChtYXhJLzMpfSwgY2FsYyg5MCUvMikpYDtcblxuXG4gICBmb3IoIGxldCBpID0gMDsgaTxtYXhJOyBpKysgKVxuICAge1xuICAgICAgbGV0IHRlc3REcmluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICB0ZXN0RHJpbmsuY2xhc3NMaXN0LmFkZChcImRyaW5rXCIpO1xuXG4gICAgICBsZXQgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcbiAgICAgIGltZy5jbGFzc0xpc3QuYWRkKFwidGh1bWJuYWlsXCIpO1xuICAgICAgdGVzdERyaW5rLmFwcGVuZChpbWcpO1xuXG4gICAgICBsZXQgbmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpO1xuICAgICAgbmFtZS5jbGFzc0xpc3QuYWRkKFwibmFtZVwiKTtcbiAgICAgIHRlc3REcmluay5hcHBlbmQobmFtZSk7XG5cbiAgICAgIGltZy5hbHQ9XCJUaHVtYm5haWxcIjtcbiAgICAgIG5hbWUuaW5uZXJUZXh0ID0gXCJNaXhlcnlcIlxuXG4gICAgICBtYWluLmFwcGVuZCh0ZXN0RHJpbmspO1xuICAgfVxufVxuXG5sZXQgd3NIYW5kbGVyO1xuZnVuY3Rpb24gY29ubmVjdCgpXG57XG4gICB3c0hhbmRsZXIgPSBuZXcgV2ViV2ViU29ja2V0SGFuZGxlcigpO1xuXG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
|