diff --git a/index.html b/index.html
index 97626e6..0515087 100644
--- a/index.html
+++ b/index.html
@@ -99,6 +99,7 @@
#log {
font-family: monospace;
+ text-wrap: nowrap;
}
.button {
diff --git a/main b/main
index 8ef08c3..723e289 100755
Binary files a/main and b/main differ
diff --git a/main.go b/main.go
index ad9afa4..8dc7d07 100644
--- a/main.go
+++ b/main.go
@@ -73,7 +73,7 @@ func noDirListing(h http.Handler, root string) http.HandlerFunc {
func main() {
dir := "./"
- port := 80
+ port := 6789
addr := ":" + strconv.Itoa(port)
log.Printf("Starting server on %s", addr)
diff --git a/main.js b/main.js
index 7785720..4a4592a 100644
--- a/main.js
+++ b/main.js
@@ -21,6 +21,18 @@ class Post {
this.importSource = importSource;
}
}
+window.addEventListener('scroll', () => {
+ // Total height of the document
+ const totalPageHeight = document.body.scrollHeight;
+ // Current scroll position
+ const scrollPoint = window.scrollY + window.innerHeight;
+ // Check if scrolled to bottom
+ if (scrollPoint >= totalPageHeight) {
+ console.log('Scrolled to the bottom!');
+ console.log(scrollPoint, totalPageHeight);
+ // You can perform your action here
+ }
+});
function initMarkdown() {
const renderer = new marked.Renderer();
renderer.link = (href, title, text) => {
@@ -186,6 +198,7 @@ function connectWebsocket(userID) {
websocket.onopen = function (evt) {
log("Websocket: CONNECTED");
websocket.send(`{"messageType":"connect", "id": "${userID}"}`);
+ let websocketPingInterval = window.setInterval(() => { websocket.send(`{"messageType":"ping", "id": "${userID}"}`); }, 5000);
};
websocket.onclose = function (evt) {
log("Websocket: DISCONNECTED");
@@ -198,13 +211,19 @@ function connectWebsocket(userID) {
};
return websocket;
}
-function setFont(fontName) {
- document.body.style.fontFamily = fontName;
+function setFont(fontName, fontSize) {
+ let content = document.getElementById('content');
+ if (!content) {
+ return;
+ }
+ content.style.fontFamily = fontName;
+ content.style.fontSize = fontSize;
let textArea = document.getElementById('textarea_post');
if (!textArea) {
return;
}
textArea.style.fontFamily = fontName;
+ textArea.style.fontSize = fontSize;
}
function initOffline() {
// Event listener for going offline
@@ -216,8 +235,8 @@ function initOffline() {
function initButtons(userID, posts) {
let font1Button = document.getElementById("button_font1");
let font2Button = document.getElementById("button_font2");
- font1Button.addEventListener('click', () => { setFont('Bookerly'); });
- font2Button.addEventListener('click', () => { setFont('Virgil'); });
+ font1Button.addEventListener('click', () => { setFont('Bookerly', '16px'); });
+ font2Button.addEventListener('click', () => { setFont('Virgil', '24px'); });
let postButton = document.getElementById("button_post");
let postText = document.getElementById("textarea_post");
if (!(postButton && postText)) {
@@ -255,7 +274,7 @@ async function main() {
const isPersisted = await navigator.storage.persist();
log(`Persisted storage granted: ${isPersisted}`);
}
- log(`Persisted: ${(await navigator.storage.persisted()).toString()}`);
+ log(`Persisted: ${(await navigator?.storage?.persisted())?.toString()}`);
initMarkdown();
// let main = await fetch("/main.js");
// let code = await main.text();
@@ -329,4 +348,4 @@ function renderPost(post) {
return containerDiv;
}
window.addEventListener("load", main);
-//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNyYy9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFHdEUsaUJBQWlCO0FBQ2pCLHNDQUFzQztBQUN0Qyx1QkFBdUI7QUFFdkIsNEJBQTRCO0FBQzVCLGtCQUFrQjtBQUNsQixtQkFBbUI7QUFDbkIsaUJBQWlCO0FBQ2pCLGtCQUFrQjtBQUNsQixvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLElBQUk7QUFFSixNQUFNLElBQUk7SUFXUixZQUFZLE1BQWMsRUFBRSxTQUFpQixFQUFFLElBQVksRUFBRSxjQUFvQixFQUFFLFlBQWdDLElBQUksRUFBRSxlQUFpQyxJQUFJLEVBQUUsZUFBb0IsSUFBSTtRQUN0TCxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUVyQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUU1QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7QUFHRCxTQUFTLFlBQVk7SUFDbkIsTUFBTSxRQUFRLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDdkMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLElBQVMsRUFBRSxLQUFhLEVBQUUsSUFBWSxFQUFFLEVBQUU7UUFDekQsT0FBTyxZQUFZLElBQUksb0JBQW9CLEtBQUssQ0FBQyxDQUFDLENBQUMsV0FBVyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUks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QixZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLFlBQVksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFdkMsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBvcGVuRGF0YWJhc2UsIGdldERhdGEsIGFkZERhdGEsIGFkZERhdGFBcnJheSB9IGZyb20gXCIuL2RiLmpzXCJcblxuZGVjbGFyZSBsZXQgbWFya2VkOiBhbnk7XG4vLyBsZXQgcG9zdHM6YW55O1xuLy8gbGV0IGtleUJhc2UgPSBcImRhbmRlbGlvbl9wb3N0c192MV9cIlxuLy8gbGV0IGtleTpzdHJpbmcgPSBcIlwiO1xuXG4vLyBpbnRlcmZhY2UgUG9zdFRpbWVzdGFtcCB7XG4vLyAgIHllYXI6IG51bWJlcixcbi8vICAgbW9udGg6IG51bWJlcixcbi8vICAgZGF5OiBudW1iZXIsXG4vLyAgIGhvdXI6IG51bWJlcixcbi8vICAgbWludXRlOiBudW1iZXIsXG4vLyAgIHNlY29uZDogbnVtYmVyLFxuLy8gfVxuXG5jbGFzcyBQb3N0IHtcbiAgcG9zdF90aW1lc3RhbXA6IERhdGU7XG4gIGF1dGhvcjogc3RyaW5nO1xuICBhdXRob3JfaWQ6IHN0cmluZztcbiAgdGV4dDogc3RyaW5nO1xuICBpbWFnZV9kYXRhOiBBcnJheUJ1ZmZlciB8IG51bGw7XG5cblxuICBpbXBvcnRlZEZyb206IFwidHdpdHRlclwiIHwgbnVsbDtcbiAgaW1wb3J0U291cmNlOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoYXV0aG9yOiBzdHJpbmcsIGF1dGhvcl9pZDogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIHBvc3RfdGltZXN0YW1wOiBEYXRlLCBpbWFnZURhdGE6IEFycmF5QnVmZmVyIHwgbnVsbCA9IG51bGwsIGltcG9ydGVkRnJvbTogXCJ0d2l0dGVyXCIgfCBudWxsID0gbnVsbCwgaW1wb3J0U291cmNlOiBhbnkgPSBudWxsKSB7XG4gICAgdGhpcy5wb3N0X3RpbWVzdGFtcCA9IHBvc3RfdGltZXN0YW1wO1xuXG4gICAgdGhpcy5hdXRob3IgPSBhdXRob3I7XG4gICAgdGhpcy5hdXRob3JfaWQgPSBhdXRob3JfaWQ7XG4gICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICB0aGlzLmltYWdlX2RhdGEgPSBpbWFnZURhdGE7XG5cbiAgICB0aGlzLmltcG9ydGVkRnJvbSA9IGltcG9ydGVkRnJvbTtcbiAgICB0aGlzLmltcG9ydFNvdXJjZSA9IGltcG9ydFNvdXJjZTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGluaXRNYXJrZG93bigpIHtcbiAgY29uc3QgcmVuZGVyZXIgPSBuZXcgbWFya2VkLlJlbmRlcmVyKCk7XG4gIHJlbmRlcmVyLmxpbmsgPSAoaHJlZjogYW55LCB0aXRsZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gYDxhIGhyZWY9XCIke2hyZWZ9XCIgdGFyZ2V0PVwiX2JsYW5rXCIke3RpdGxlID8gYCB0aXRsZT1cIiR7dGl0bGV9XCJgIDogJyd9PiR7dGV4dH08L2E+YDtcbiAgfTtcbiAgbWFya2VkLnNldE9wdGlvbnMoeyByZW5kZXJlcjogcmVuZGVyZXIgfSk7XG59XG5cbmZ1bmN0aW9uIHdhaXRNcyhkdXJhdGlvbk1zOiBudW1iZXIpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkdXJhdGlvbk1zKSk7XG59XG5cbmZ1bmN0aW9uIHV1aWR2NCgpIHtcbiAgcmV0dXJuIFwiMTAwMDAwMDAtMTAwMC00MDAwLTgwMDAtMTAwMDAwMDAwMDAwXCIucmVwbGFjZSgvWzAxOF0vZywgKGM6IGFueSkgPT5cbiAgICAoYyBeIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMSkpWzBdICYgMTUgPj4gYyAvIDQpLnRvU3RyaW5nKDE2KVxuICApO1xufVxuXG5sZXQgbG9nTGluZXM6IHN0cmluZ1tdID0gW107XG5sZXQgbG9nTGVuZ3RoID0gMTA7XG5mdW5jdGlvbiBsb2cobWVzc2FnZTogc3RyaW5nKSB7XG4gIGxvZ0xpbmVzLnB1c2goYCR7bmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKX06ICR7bWVzc2FnZX1gKTtcbiAgaWYgKGxvZ0xpbmVzLmxlbmd0aCA+IDEwKSB7XG4gICAgbG9nTGluZXMgPSBsb2dMaW5lcy5zbGljZShsb2dMaW5lcy5sZW5ndGggLSBsb2dMZW5ndGgpO1xuICB9XG4gIGxldCBsb2cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImxvZ1wiKTtcbiAgaWYgKCFsb2cpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgfVxuICBsb2cuaW5uZXJUZXh0ID0gbG9nTGluZXMuam9pbihcIlxcblwiKTtcbn1cblxuZnVuY3Rpb24gYXJyYXlCdWZmZXJUb0Jhc2U2NChidWZmZXI6IEFycmF5QnVmZmVyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0pO1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICByZWFkZXIub25sb2FkZW5kID0gKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YVVybCA9IHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nO1xuICAgICAgaWYgKCFkYXRhVXJsKSB7XG4gICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhc2U2NCA9IGRhdGFVcmwuc3BsaXQoJywnKVsxXTtcbiAgICAgIHJlc29sdmUoYmFzZTY0KTtcbiAgICB9O1xuXG4gICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfTtcblxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlVGVzdERhdGEoKSB7XG4gIGxldCBwb3N0c1Rlc3REYXRhID0gYXdhaXQgKGF3YWl0IGZldGNoKFwiLi9wb3N0c1Rlc3REYXRhLmpzb25cIikpLmpzb24oKTtcblxuICByZXR1cm4gcG9zdHNUZXN0RGF0YTtcbn1cblxubGV0IHRpbWUgPSAwO1xuXG5mdW5jdGlvbiB0aW1lclN0YXJ0KCkge1xuICB0aW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG59XG5cbmZ1bmN0aW9uIHRpbWVyRGVsdGEoKSB7XG4gIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKSAtIHRpbWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEZpeGVkVHdlZXRUZXh0KGVudHJ5OiBhbnkpIHtcblxuXG4gIGxldCBmdWxsVGV4dCA9IGVudHJ5LnR3ZWV0LmZ1bGxfdGV4dDtcblxuICBsZXQgbGlua01hcmtkb3duID0gXCJcIjtcbiAgZm9yIChjb25zdCB1cmwgb2YgZW50cnkudHdlZXQuZW50aXRpZXMudXJscykge1xuICAgIGxpbmtNYXJrZG93biA9IGBbJHt1cmwuZGlzcGxheV91cmx9XSgke3VybC5leHBhbmRlZF91cmx9KWA7XG4gICAgZnVsbFRleHQgPSBmdWxsVGV4dC5yZXBsYWNlKHVybC51cmwsIGxpbmtNYXJrZG93bik7XG4gIH1cblxuICByZXR1cm4gZnVsbFRleHRcbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlVGVzdERhdGEyKHVzZXJJRDogc3RyaW5nKSB7XG4gIGxvZyhcIkltcG9ydGluZyB0d2VldCBhcmNoaXZlXCIpXG4gIGxldCBwb3N0c1Rlc3REYXRhOiBhbnlbXSA9IFtdO1xuXG4gIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiLi90d2VldHMuanNcIik7XG4gIGxldCB0d2VldHNUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICB0d2VldHNUZXh0ID0gdHdlZXRzVGV4dC5yZXBsYWNlKFwid2luZG93LllURC50d2VldHMucGFydDBcIiwgXCJ3aW5kb3cudHdlZXREYXRhXCIpO1xuXG4gIG5ldyBGdW5jdGlvbih0d2VldHNUZXh0KSgpO1xuXG5cbiAgLy8gbGV0IHR3ZWV0cyA9IEpTT04ucGFyc2UodHdlZXRKU09OKTtcbiAgbGV0IGNvdW50ID0gMDtcblxuICBmb3IgKGxldCBlbnRyeSBvZiAod2luZG93IGFzIGFueSkudHdlZXREYXRhKSB7XG4gICAgLy8gaWYgKGVudHJ5LnR3ZWV0Lmhhc093blByb3BlcnR5KFwiaW5fcmVwbHlfdG9fc2NyZWVuX25hbWVcIikgfHwgZW50cnkudHdlZXQucmV0d2VldGVkIHx8IGVudHJ5LnR3ZWV0LmZ1bGxfdGV4dC5zdGFydHNXaXRoKFwiUlRcIikpIHtcbiAgICAvLyAgIGNvbnRpbnVlO1xuICAgIC8vIH1cblxuICAgIGxldCBtZWRpYVVSTDogc3RyaW5nID0gZW50cnkudHdlZXQ/LmVudGl0aWVzPy5tZWRpYT8uWzBdPy5tZWRpYV91cmw7XG4gICAgbGV0IGlzSW1hZ2UgPSBmYWxzZTtcbiAgICBpZiAobWVkaWFVUkwpIHtcbiAgICAgIGlzSW1hZ2UgPSBtZWRpYVVSTC5pbmNsdWRlcygnanBnJyk7XG4gICAgfVxuXG4gICAgbGV0IGltYWdlRGF0YSA9IG51bGw7XG4gICAgaWYgKGlzSW1hZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKG1lZGlhVVJMKTtcbiAgICAgICAgYXdhaXQgd2FpdE1zKDEwMCk7XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgIGltYWdlRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coaW1hZ2VEYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICBsZXQgdGltZVN0YW1wID0gbmV3IERhdGUoZW50cnkudHdlZXQuY3JlYXRlZF9hdCk7XG4gICAgbGV0IHR3ZWV0VGV4dCA9IGF3YWl0IGdldEZpeGVkVHdlZXRUZXh0KGVudHJ5KTtcbiAgICBsZXQgbmV3UG9zdCA9IG5ldyBQb3N0KCdib2JieWRpZ2l0YWxlcycsIHVzZXJJRCwgdHdlZXRUZXh0LCB0aW1lU3RhbXAsIGltYWdlRGF0YSwgJ3R3aXR0ZXInLCBlbnRyeSk7XG5cbiAgICBwb3N0c1Rlc3REYXRhLnB1c2gobmV3UG9zdCk7XG5cbiAgICBjb3VudCsrO1xuICAgIGlmIChjb3VudCAlIDEwMCA9PT0gMCkge1xuICAgICAgbG9nKGBJbXBvcnRlZCAke2NvdW50fSBwb3N0cy4uLmApO1xuICAgICAgLy8gcmVuZGVyKHBvc3RzVGVzdERhdGEpO1xuICAgIH1cblxuICAgIC8vIGlmIChjb3VudCA9PSAxMDAtMSkge1xuICAgIC8vICAgYnJlYWs7XG4gICAgLy8gfVxuXG4gIH1cbiAgcmV0dXJuIHBvc3RzVGVzdERhdGE7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRlc3REYXRhMyh1c2VySUQ6IHN0cmluZykge1xuICBsZXQgcG9zdHMgPSBhd2FpdCAoYXdhaXQgKGZldGNoKCcuL3Bvc3RzLmpzb24nKSkpLmpzb24oKTtcblxuICByZXR1cm4gcG9zdHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlZ2lzdGVyU2VydmljZVdvcmtlcigpIHtcbiAgaWYgKCEoXCJzZXJ2aWNlV29ya2VyXCIgaW4gbmF2aWdhdG9yKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCByZWdpc3RyYXRpb25zID0gYXdhaXQgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIuZ2V0UmVnaXN0cmF0aW9ucygpO1xuICBpZiAocmVnaXN0cmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5sb2coXCJTZXJ2aWNlIHdvcmtlciBhbHJlYWR5IHJlZ2lzdGVyZWQuXCIpO1xuICAgIHJldHVybiByZWdpc3RyYXRpb25zWzBdO1xuICB9XG5cbiAgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXJcbiAgICAucmVnaXN0ZXIoXCIvc3cuanNcIilcbiAgICAudGhlbigocmVnaXN0cmF0aW9uKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhcIlNlcnZpY2UgV29ya2VyIHJlZ2lzdGVyZWQgd2l0aCBzY29wZTpcIiwgcmVnaXN0cmF0aW9uLnNjb3BlKTtcbiAgICAgIHJldHVybiByZWdpc3RyYXRpb247XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiU2VydmljZSBXb3JrZXIgcmVnaXN0cmF0aW9uIGZhaWxlZDpcIiwgZXJyb3IpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRQb3N0KHVzZXJJRDogc3RyaW5nLCBwb3N0czogUG9zdFtdLCBwb3N0VGV4dDogc3RyaW5nKSB7XG4gIGlmICgodHlwZW9mIHBvc3RUZXh0ICE9PSBcInN0cmluZ1wiKSB8fCBwb3N0VGV4dC5sZW5ndGggPT09IDApIHtcbiAgICBsb2coXCJOb3QgcG9zdGluZyBhbiBlbXB0eSBzdHJpbmcuLi5cIilcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgcG9zdCA9IG5ldyBQb3N0KGBib2JieWRpZ2l0YWxlc2AsIHVzZXJJRCwgcG9zdFRleHQsIG5ldyBEYXRlKCkpO1xuXG4gIHBvc3RzLnB1c2gocG9zdCk7XG4gIC8vIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkocG9zdHMpKTtcbiAgYWRkRGF0YSh1c2VySUQsIHBvc3QpXG5cbiAgcmVuZGVyKHBvc3RzKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVJRCgpIHtcbiAgaWYgKHNlbGYuY3J5cHRvLmhhc093blByb3BlcnR5KFwicmFuZG9tVVVJRFwiKSkge1xuICAgIHJldHVybiBzZWxmLmNyeXB0by5yYW5kb21VVUlEKCk7XG4gIH1cblxuICByZXR1cm4gdXVpZHY0KCk7XG59XG5cbmZ1bmN0aW9uIGdldFVzZXJJRCgpIHtcbiAgbGV0IGlkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJkYW5kZWxpb25faWRcIik7XG5cbiAgaWYgKCFpZCkge1xuICAgIGlkID0gZ2VuZXJhdGVJRCgpO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZGFuZGVsaW9uX2lkXCIsIGlkKTtcbiAgfVxuXG4gIHJldHVybiBpZDtcbn1cblxuZnVuY3Rpb24gY29ubmVjdFdlYnNvY2tldCh1c2VySUQ6IHN0cmluZykge1xuICBsZXQgd2Vic29ja2V0ID0gbmV3IFdlYlNvY2tldChgd3M6Ly8ke3dpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZX06JHt3aW5kb3cubG9jYXRpb24ucG9ydH0vd3NgKTtcblxuICB3ZWJzb2NrZXQub25vcGVuID0gZnVuY3Rpb24gKGV2dCkge1xuICAgIGxvZyhcIldlYnNvY2tldDogQ09OTkVDVEVEXCIpO1xuICAgIHdlYnNvY2tldC5zZW5kKGB7XCJtZXNzYWdlVHlwZVwiOlwiY29ubmVjdFwiLCBcImlkXCI6IFwiJHt1c2VySUR9XCJ9YCk7XG4gIH07XG5cbiAgd2Vic29ja2V0Lm9uY2xvc2UgPSBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgbG9nKFwiV2Vic29ja2V0OiBESVNDT05ORUNURURcIik7XG4gIH07XG5cbiAgd2Vic29ja2V0Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChldnQpIHtcbiAgICBsb2coJ1dlYnNvY2tldDogUkVTUE9OU0U6ICcgKyBldnQuZGF0YSk7XG4gIH07XG5cbiAgd2Vic29ja2V0Lm9uZXJyb3IgPSBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgbG9nKCdXZWJzb2NrZXQ6IEVSUk9SOiAnICsgZXZ0KTtcbiAgfTtcblxuICByZXR1cm4gd2Vic29ja2V0O1xufVxuXG5mdW5jdGlvbiBzZXRGb250KGZvbnROYW1lOiBzdHJpbmcpIHtcblxuICBkb2N1bWVudC5ib2R5LnN0eWxlLmZvbnRGYW1pbHkgPSBmb250TmFtZTtcbiAgbGV0IHRleHRBcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RleHRhcmVhX3Bvc3QnKTtcbiAgaWYgKCF0ZXh0QXJlYSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRleHRBcmVhLnN0eWxlLmZvbnRGYW1pbHkgPSBmb250TmFtZTtcbn1cblxuZnVuY3Rpb24gaW5pdE9mZmxpbmUoKSB7XG4gIC8vIEV2ZW50IGxpc3RlbmVyIGZvciBnb2luZyBvZmZsaW5lXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvZmZsaW5lJywgKCkgPT4geyBsb2coXCJvZmZsaW5lXCIpIH0pO1xuXG4gIC8vIEV2ZW50IGxpc3RlbmVyIGZvciBnb2luZyBvbmxpbmVcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29ubGluZScsICgpID0+IHsgbG9nKFwib25saW5lXCIpIH0pO1xuXG4gIGxvZyhgT25saW5lIHN0YXR1czogJHtuYXZpZ2F0b3Iub25MaW5lID8gXCJvbmxpbmVcIiA6IFwib2ZmbGluZVwifWApXG5cbn1cblxuZnVuY3Rpb24gaW5pdEJ1dHRvbnModXNlcklEOiBzdHJpbmcsIHBvc3RzOiBQb3N0W10pIHtcbiAgbGV0IGZvbnQxQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJidXR0b25fZm9udDFcIikgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIGxldCBmb250MkJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYnV0dG9uX2ZvbnQyXCIpIGFzIEhUTUxCdXR0b25FbGVtZW50O1xuXG4gIGZvbnQxQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4geyBzZXRGb250KCdCb29rZXJseScpOyB9KTtcbiAgZm9udDJCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IHNldEZvbnQoJ1ZpcmdpbCcpIH0pO1xuXG5cbiAgbGV0IHBvc3RCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJ1dHRvbl9wb3N0XCIpIGFzIEhUTUxCdXR0b25FbGVtZW50O1xuICBsZXQgcG9zdFRleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInRleHRhcmVhX3Bvc3RcIikgYXMgSFRNTFRleHRBcmVhRWxlbWVudDtcblxuICBpZiAoIShwb3N0QnV0dG9uICYmIHBvc3RUZXh0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcigpO1xuICB9XG5cbiAgcG9zdEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgIGFkZFBvc3QodXNlcklELCBwb3N0cywgcG9zdFRleHQudmFsdWUpO1xuICAgIHBvc3RUZXh0LnZhbHVlID0gXCJcIjtcbiAgfSk7XG5cbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFBvc3RzKHVzZXJJRDogc3RyaW5nKSB7XG5cbiAgdGltZXJTdGFydCgpO1xuICBsZXQgcG9zdHM6IGFueSA9IGF3YWl0IGdldERhdGEodXNlcklELCBuZXcgRGF0ZSgyMDIyLCA4KSwgbmV3IERhdGUoKSk7XG5cbiAgaWYgKHBvc3RzLmxlbmd0aCA+IDApIHtcbiAgICBsb2coYExvYWRlZCAke3Bvc3RzLmxlbmd0aH0gcG9zdHMgaW4gJHt0aW1lckRlbHRhKCkudG9GaXhlZCgyKX1tc2ApO1xuICAgIHJldHVybiBwb3N0cztcbiAgfVxuXG4gIHBvc3RzID0gYXdhaXQgY3JlYXRlVGVzdERhdGEyKHVzZXJJRCk7XG5cbiAgbG9nKFwiQWRkaW5nIHRlc3QgZGF0YS4uLlwiKTtcbiAgYWRkRGF0YUFycmF5KHVzZXJJRCwgcG9zdHMpO1xuICByZXR1cm4gYXdhaXQgZ2V0RGF0YSh1c2VySUQsIG5ldyBEYXRlKDIwMjIsIDgpLCBuZXcgRGF0ZSgpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpIHtcbiAgbGV0IHBvc3RzOiBQb3N0W10gPSBbXTtcbiAgbGV0IHRpbWUgPSAwOyBgYFxuICBsZXQgZGVsdGEgPSAwO1xuXG4gIGxldCB1cmxQYXJhbXMgPSAobmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikpLnNlYXJjaFBhcmFtcztcblxuICBpZiAodXJsUGFyYW1zLmdldChcInN3XCIpID09PSBcInRydWVcIikge1xuICAgIGxldCByZWdpc3RyYXRpb24gPSBhd2FpdCByZWdpc3RlclNlcnZpY2VXb3JrZXIoKTtcbiAgfVxuXG4gIGxldCB1c2VySUQgPSBnZXRVc2VySUQoKTtcbiAgbG9nKGBZb3VyIHVzZXIgSUQgaXM6ICR7dXNlcklEfWApO1xuXG4gIGlmIChuYXZpZ2F0b3Iuc3RvcmFnZSAmJiBuYXZpZ2F0b3Iuc3RvcmFnZS5wZXJzaXN0ICYmICFuYXZpZ2F0b3Iuc3RvcmFnZS5wZXJzaXN0ZWQpIHtcbiAgICBjb25zdCBpc1BlcnNpc3RlZCA9IGF3YWl0IG5hdmlnYXRvci5zdG9yYWdlLnBlcnNpc3QoKTtcbiAgICBsb2coYFBlcnNpc3RlZCBzdG9yYWdlIGdyYW50ZWQ6ICR7aXNQZXJzaXN0ZWR9YCk7XG4gIH1cblxuICBsb2coYFBlcnNpc3RlZDogJHsoYXdhaXQgbmF2aWdhdG9yLnN0b3JhZ2UucGVyc2lzdGVkKCkpLnRvU3RyaW5nKCl9YCk7XG5cbiAgaW5pdE1hcmtkb3duKCk7XG5cbiAgLy8gbGV0IG1haW4gPSBhd2FpdCBmZXRjaChcIi9tYWluLmpzXCIpO1xuICAvLyBsZXQgY29kZSA9IGF3YWl0IG1haW4udGV4dCgpO1xuICAvLyAgIGNvbnNvbGUubG9nKGNvZGUpO1xuICAvLyAgIHJlZ2lzdHJhdGlvbi5hY3RpdmUucG9zdE1lc3NhZ2Uoe3R5cGU6XCJ1cGRhdGVNYWluXCIsIGNvZGU6Y29kZX0pO1xuXG4gIHBvc3RzID0gYXdhaXQgbG9hZFBvc3RzKHVzZXJJRCk7XG5cbiAgbGV0IHdlYnNvY2tldCA9IGNvbm5lY3RXZWJzb2NrZXQodXNlcklEKTtcbiAgaW5pdE9mZmxpbmUoKTtcbiAgaW5pdEJ1dHRvbnModXNlcklELCBwb3N0cyk7XG4gIC8vIGRlYnVnZ2VyO1xuXG4gIHRpbWVyU3RhcnQoKTtcbiAgcmVuZGVyKHBvc3RzKTtcbiAgbGV0IHJlbmRlclRpbWUgPSB0aW1lckRlbHRhKCk7XG5cbiAgbG9nKGByZW5kZXIgdG9vazogJHtyZW5kZXJUaW1lLnRvRml4ZWQoMil9bXNgKTtcblxuICBsb2coYG1lbW9yeSB1c2VkOiAkeygocGVyZm9ybWFuY2UgYXMgYW55KS5tZW1vcnkudXNlZEpTSGVhcFNpemUgLyAxMDI0IC8gMTAyNCkudG9GaXhlZCgyKX1NYmApXG59XG5cbmZ1bmN0aW9uIHJlbmRlcihwb3N0czogUG9zdFtdKSB7XG4gIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICBsZXQgY29udGVudERpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29udGVudFwiKTtcbiAgaWYgKCFjb250ZW50RGl2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gIH1cbiAgY29udGVudERpdi5pbm5lckhUTUwgPSBcIlwiO1xuICBsZXQgY291bnQgPSAwO1xuXG5cbiAgZm9yIChsZXQgaSA9IHBvc3RzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgbGV0IHBvc3REYXRhID0gcG9zdHNbaV07XG5cbiAgICBsZXQgcG9zdCA9IHJlbmRlclBvc3QocG9zdERhdGEpO1xuXG4gICAgaWYgKHBvc3QpIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKHBvc3QpO1xuICAgICAgY291bnQrKztcbiAgICB9XG4gICAgaWYgKGNvdW50ID4gMTAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuXG4gIGlmICghY29udGVudERpdikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGdldCBjb250ZW50IGRpdiFcIik7XG4gIH1cblxuICBjb250ZW50RGl2LmFwcGVuZENoaWxkKGZyYWdtZW50KTtcblxufVxuXG5mdW5jdGlvbiByZW5kZXJQb3N0KHBvc3Q6IFBvc3QpIHtcbiAgaWYgKCEocG9zdC5oYXNPd25Qcm9wZXJ0eShcInRleHRcIikpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUG9zdCBpcyBtYWxmb3JtZWQhXCIpO1xuICB9XG4gIGxldCBjb250YWluZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBsZXQgdGV4dERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGxldCB0aW1lc3RhbXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBsZXQgaHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaHJcIik7XG5cblxuICB0ZXh0RGl2LmlubmVySFRNTCA9IG1hcmtlZC5wYXJzZShwb3N0LnRleHQpO1xuICAvLyB0ZXh0RGl2LmlubmVySFRNTCA9IERPTVB1cmlmeS5zYW5pdGl6ZShtYXJrZWQucGFyc2UocG9zdC50ZXh0KSk7XG5cbiAgdGltZXN0YW1wRGl2LmlubmVyVGV4dCA9IGAke3Bvc3QucG9zdF90aW1lc3RhbXAudG9EYXRlU3RyaW5nKCl9YDtcbiAgdGltZXN0YW1wRGl2LnRpdGxlID0gYCR7cG9zdC5wb3N0X3RpbWVzdGFtcC50b0xvY2FsZVRpbWVTdHJpbmcoKX0gwrcgJHtwb3N0LnBvc3RfdGltZXN0YW1wLnRvRGF0ZVN0cmluZygpfWBcbiAgY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKGhyKTtcbiAgY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHRleHREaXYpO1xuXG4gIGlmICghKFwiaW1hZ2VfZGF0YVwiIGluIHBvc3QgJiYgcG9zdC5pbWFnZV9kYXRhKSkge1xuICAgIGNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aW1lc3RhbXBEaXYpO1xuICAgIHJldHVybiBjb250YWluZXJEaXY7XG4gICAgLy8gcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3Bvc3QuaW1hZ2VfZGF0YSBhcyBBcnJheUJ1ZmZlcl0sIHsgdHlwZTogJ2ltYWdlL2pwZycgfSk7XG4gIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gIGltYWdlLm9ubG9hZCA9ICgpID0+IHtcbiAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gIH07XG5cblxuICBpbWFnZS5zcmMgPSB1cmw7XG4gIC8vIGltYWdlLnNyYyA9IGltYWdlLnNyYyA9IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LFwiICsgcG9zdC5pbWFnZTtcbiAgaW1hZ2UuY2xhc3NOYW1lID0gXCJwb3N0SW1hZ2VcIjtcblxuICBjb250YWluZXJEaXYuYXBwZW5kQ2hpbGQoaW1hZ2UpO1xuICBjb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGltZXN0YW1wRGl2KTtcblxuICByZXR1cm4gY29udGFpbmVyRGl2O1xufVxuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgbWFpbik7XG4iXX0=
\ No newline at end of file
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNyYy9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFHdEUsaUJBQWlCO0FBQ2pCLHNDQUFzQztBQUN0Qyx1QkFBdUI7QUFFdkIsNEJBQTRCO0FBQzVCLGtCQUFrQjtBQUNsQixtQkFBbUI7QUFDbkIsaUJBQWlCO0FBQ2pCLGtCQUFrQjtBQUNsQixvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLElBQUk7QUFFSixNQUFNLElBQUk7SUFXUixZQUFZLE1BQWMsRUFBRSxTQUFpQixFQUFFLElBQVksRUFBRSxjQUFvQixFQUFFLFlBQWdDLElBQUksRUFBRSxlQUFpQyxJQUFJLEVBQUUsZUFBb0IsSUFBSTtRQUN0TCxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUVyQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUU1QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtJQUNyQywrQkFBK0I7SUFDL0IsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7SUFFbkQsMEJBQTBCO0lBQzFCLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztJQUV4RCw4QkFBOEI7SUFDOUIsSUFBSSxXQUFXLElBQUksZUFBZSxF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bkRhdGFiYXNlLCBnZXREYXRhLCBhZGREYXRhLCBhZGREYXRhQXJyYXkgfSBmcm9tIFwiLi9kYi5qc1wiXG5cbmRlY2xhcmUgbGV0IG1hcmtlZDogYW55O1xuLy8gbGV0IHBvc3RzOmFueTtcbi8vIGxldCBrZXlCYXNlID0gXCJkYW5kZWxpb25fcG9zdHNfdjFfXCJcbi8vIGxldCBrZXk6c3RyaW5nID0gXCJcIjtcblxuLy8gaW50ZXJmYWNlIFBvc3RUaW1lc3RhbXAge1xuLy8gICB5ZWFyOiBudW1iZXIsXG4vLyAgIG1vbnRoOiBudW1iZXIsXG4vLyAgIGRheTogbnVtYmVyLFxuLy8gICBob3VyOiBudW1iZXIsXG4vLyAgIG1pbnV0ZTogbnVtYmVyLFxuLy8gICBzZWNvbmQ6IG51bWJlcixcbi8vIH1cblxuY2xhc3MgUG9zdCB7XG4gIHBvc3RfdGltZXN0YW1wOiBEYXRlO1xuICBhdXRob3I6IHN0cmluZztcbiAgYXV0aG9yX2lkOiBzdHJpbmc7XG4gIHRleHQ6IHN0cmluZztcbiAgaW1hZ2VfZGF0YTogQXJyYXlCdWZmZXIgfCBudWxsO1xuXG5cbiAgaW1wb3J0ZWRGcm9tOiBcInR3aXR0ZXJcIiB8IG51bGw7XG4gIGltcG9ydFNvdXJjZTogYW55O1xuXG4gIGNvbnN0cnVjdG9yKGF1dGhvcjogc3RyaW5nLCBhdXRob3JfaWQ6IHN0cmluZywgdGV4dDogc3RyaW5nLCBwb3N0X3RpbWVzdGFtcDogRGF0ZSwgaW1hZ2VEYXRhOiBBcnJheUJ1ZmZlciB8IG51bGwgPSBudWxsLCBpbXBvcnRlZEZyb206IFwidHdpdHRlclwiIHwgbnVsbCA9IG51bGwsIGltcG9ydFNvdXJjZTogYW55ID0gbnVsbCkge1xuICAgIHRoaXMucG9zdF90aW1lc3RhbXAgPSBwb3N0X3RpbWVzdGFtcDtcblxuICAgIHRoaXMuYXV0aG9yID0gYXV0aG9yO1xuICAgIHRoaXMuYXV0aG9yX2lkID0gYXV0aG9yX2lkO1xuICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgdGhpcy5pbWFnZV9kYXRhID0gaW1hZ2VEYXRhO1xuXG4gICAgdGhpcy5pbXBvcnRlZEZyb20gPSBpbXBvcnRlZEZyb207XG4gICAgdGhpcy5pbXBvcnRTb3VyY2UgPSBpbXBvcnRTb3VyY2U7XG4gIH1cbn1cblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHtcbiAgLy8gVG90YWwgaGVpZ2h0IG9mIHRoZSBkb2N1bWVudFxuICBjb25zdCB0b3RhbFBhZ2VIZWlnaHQgPSBkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodDtcblxuICAvLyBDdXJyZW50IHNjcm9sbCBwb3NpdGlvblxuICBjb25zdCBzY3JvbGxQb2ludCA9IHdpbmRvdy5zY3JvbGxZICsgd2luZG93LmlubmVySGVpZ2h0O1xuXG4gIC8vIENoZWNrIGlmIHNjcm9sbGVkIHRvIGJvdHRvbVxuICBpZiAoc2Nyb2xsUG9pbnQgPj0gdG90YWxQYWdlSGVpZ2h0KSB7XG4gICAgY29uc29sZS5sb2coJ1Njcm9sbGVkIHRvIHRoZSBib3R0b20hJyk7XG4gICAgY29uc29sZS5sb2coc2Nyb2xsUG9pbnQsIHRvdGFsUGFnZUhlaWdodCk7XG4gICAgLy8gWW91IGNhbiBwZXJmb3JtIHlvdXIgYWN0aW9uIGhlcmVcbiAgfVxufSk7XG5cblxuZnVuY3Rpb24gaW5pdE1hcmtkb3duKCkge1xuICBjb25zdCByZW5kZXJlciA9IG5ldyBtYXJrZWQuUmVuZGVyZXIoKTtcbiAgcmVuZGVyZXIubGluayA9IChocmVmOiBhbnksIHRpdGxlOiBzdHJpbmcsIHRleHQ6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBgPGEgaHJlZj1cIiR7aHJlZn1cIiB0YXJnZXQ9XCJfYmxhbmtcIiR7dGl0bGUgPyBgIHRpdGxlPVwiJHt0aXRsZX1cImAgOiAnJ30+JHt0ZXh0fTwvYT5gO1xuICB9O1xuICBtYXJrZWQuc2V0T3B0aW9ucyh7IHJlbmRlcmVyOiByZW5kZXJlciB9KTtcbn1cblxuZnVuY3Rpb24gd2FpdE1zKGR1cmF0aW9uTXM6IG51bWJlcikge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGR1cmF0aW9uTXMpKTtcbn1cblxuZnVuY3Rpb24gdXVpZHY0KCkge1xuICByZXR1cm4gXCIxMDAwMDAwMC0xMDAwLTQwMDAtODAwMC0xMDAwMDAwMDAwMDBcIi5yZXBsYWNlKC9bMDE4XS9nLCAoYzogYW55KSA9PlxuICAgIChjIF4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxKSlbMF0gJiAxNSA+PiBjIC8gNCkudG9TdHJpbmcoMTYpXG4gICk7XG59XG5cbmxldCBsb2dMaW5lczogc3RyaW5nW10gPSBbXTtcbmxldCBsb2dMZW5ndGggPSAxMDtcbmZ1bmN0aW9uIGxvZyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgbG9nTGluZXMucHVzaChgJHtuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpfTogJHttZXNzYWdlfWApO1xuICBpZiAobG9nTGluZXMubGVuZ3RoID4gMTApIHtcbiAgICBsb2dMaW5lcyA9IGxvZ0xpbmVzLnNsaWNlKGxvZ0xpbmVzLmxlbmd0aCAtIGxvZ0xlbmd0aCk7XG4gIH1cbiAgbGV0IGxvZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibG9nXCIpO1xuICBpZiAoIWxvZykge1xuICAgIHRocm93IG5ldyBFcnJvcigpO1xuICB9XG4gIGxvZy5pbm5lclRleHQgPSBsb2dMaW5lcy5qb2luKFwiXFxuXCIpO1xufVxuXG5mdW5jdGlvbiBhcnJheUJ1ZmZlclRvQmFzZTY0KGJ1ZmZlcjogQXJyYXlCdWZmZXIpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfSk7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhVXJsID0gcmVhZGVyLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICBpZiAoIWRhdGFVcmwpIHtcbiAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgYmFzZTY0ID0gZGF0YVVybC5zcGxpdCgnLCcpWzFdO1xuICAgICAgcmVzb2x2ZShiYXNlNjQpO1xuICAgIH07XG5cbiAgICByZWFkZXIub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9O1xuXG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVUZXN0RGF0YSgpIHtcbiAgbGV0IHBvc3RzVGVzdERhdGEgPSBhd2FpdCAoYXdhaXQgZmV0Y2goXCIuL3Bvc3RzVGVzdERhdGEuanNvblwiKSkuanNvbigpO1xuXG4gIHJldHVybiBwb3N0c1Rlc3REYXRhO1xufVxuXG5sZXQgdGltZSA9IDA7XG5cbmZ1bmN0aW9uIHRpbWVyU3RhcnQoKSB7XG4gIHRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcbn1cblxuZnVuY3Rpb24gdGltZXJEZWx0YSgpIHtcbiAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpIC0gdGltZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0Rml4ZWRUd2VldFRleHQoZW50cnk6IGFueSkge1xuXG5cbiAgbGV0IGZ1bGxUZXh0ID0gZW50cnkudHdlZXQuZnVsbF90ZXh0O1xuXG4gIGxldCBsaW5rTWFya2Rvd24gPSBcIlwiO1xuICBmb3IgKGNvbnN0IHVybCBvZiBlbnRyeS50d2VldC5lbnRpdGllcy51cmxzKSB7XG4gICAgbGlua01hcmtkb3duID0gYFske3VybC5kaXNwbGF5X3VybH1dKCR7dXJsLmV4cGFuZGVkX3VybH0pYDtcbiAgICBmdWxsVGV4dCA9IGZ1bGxUZXh0LnJlcGxhY2UodXJsLnVybCwgbGlua01hcmtkb3duKTtcbiAgfVxuXG4gIHJldHVybiBmdWxsVGV4dFxufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVUZXN0RGF0YTIodXNlcklEOiBzdHJpbmcpIHtcbiAgbG9nKFwiSW1wb3J0aW5nIHR3ZWV0IGFyY2hpdmVcIilcbiAgbGV0IHBvc3RzVGVzdERhdGE6IGFueVtdID0gW107XG5cbiAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCIuL3R3ZWV0cy5qc1wiKTtcbiAgbGV0IHR3ZWV0c1RleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gIHR3ZWV0c1RleHQgPSB0d2VldHNUZXh0LnJlcGxhY2UoXCJ3aW5kb3cuWVRELnR3ZWV0cy5wYXJ0MFwiLCBcIndpbmRvdy50d2VldERhdGFcIik7XG5cbiAgbmV3IEZ1bmN0aW9uKHR3ZWV0c1RleHQpKCk7XG5cblxuICAvLyBsZXQgdHdlZXRzID0gSlNPTi5wYXJzZSh0d2VldEpTT04pO1xuICBsZXQgY291bnQgPSAwO1xuXG4gIGZvciAobGV0IGVudHJ5IG9mICh3aW5kb3cgYXMgYW55KS50d2VldERhdGEpIHtcbiAgICAvLyBpZiAoZW50cnkudHdlZXQuaGFzT3duUHJvcGVydHkoXCJpbl9yZXBseV90b19zY3JlZW5fbmFtZVwiKSB8fCBlbnRyeS50d2VldC5yZXR3ZWV0ZWQgfHwgZW50cnkudHdlZXQuZnVsbF90ZXh0LnN0YXJ0c1dpdGgoXCJSVFwiKSkge1xuICAgIC8vICAgY29udGludWU7XG4gICAgLy8gfVxuXG4gICAgbGV0IG1lZGlhVVJMOiBzdHJpbmcgPSBlbnRyeS50d2VldD8uZW50aXRpZXM/Lm1lZGlhPy5bMF0/Lm1lZGlhX3VybDtcbiAgICBsZXQgaXNJbWFnZSA9IGZhbHNlO1xuICAgIGlmIChtZWRpYVVSTCkge1xuICAgICAgaXNJbWFnZSA9IG1lZGlhVVJMLmluY2x1ZGVzKCdqcGcnKTtcbiAgICB9XG5cbiAgICBsZXQgaW1hZ2VEYXRhID0gbnVsbDtcbiAgICBpZiAoaXNJbWFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gobWVkaWFVUkwpO1xuICAgICAgICBhd2FpdCB3YWl0TXMoMTAwKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgaW1hZ2VEYXRhID0gYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhpbWFnZURhdGEpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgIH1cblxuICAgIH1cblxuICAgIGxldCB0aW1lU3RhbXAgPSBuZXcgRGF0ZShlbnRyeS50d2VldC5jcmVhdGVkX2F0KTtcbiAgICBsZXQgdHdlZXRUZXh0ID0gYXdhaXQgZ2V0Rml4ZWRUd2VldFRleHQoZW50cnkpO1xuICAgIGxldCBuZXdQb3N0ID0gbmV3IFBvc3QoJ2JvYmJ5ZGlnaXRhbGVzJywgdXNlcklELCB0d2VldFRleHQsIHRpbWVTdGFtcCwgaW1hZ2VEYXRhLCAndHdpdHRlcicsIGVudHJ5KTtcblxuICAgIHBvc3RzVGVzdERhdGEucHVzaChuZXdQb3N0KTtcblxuICAgIGNvdW50Kys7XG4gICAgaWYgKGNvdW50ICUgMTAwID09PSAwKSB7XG4gICAgICBsb2coYEltcG9ydGVkICR7Y291bnR9IHBvc3RzLi4uYCk7XG4gICAgICAvLyByZW5kZXIocG9zdHNUZXN0RGF0YSk7XG4gICAgfVxuXG4gICAgLy8gaWYgKGNvdW50ID09IDEwMC0xKSB7XG4gICAgLy8gICBicmVhaztcbiAgICAvLyB9XG5cbiAgfVxuICByZXR1cm4gcG9zdHNUZXN0RGF0YTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlVGVzdERhdGEzKHVzZXJJRDogc3RyaW5nKSB7XG4gIGxldCBwb3N0cyA9IGF3YWl0IChhd2FpdCAoZmV0Y2goJy4vcG9zdHMuanNvbicpKSkuanNvbigpO1xuXG4gIHJldHVybiBwb3N0cztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJTZXJ2aWNlV29ya2VyKCkge1xuICBpZiAoIShcInNlcnZpY2VXb3JrZXJcIiBpbiBuYXZpZ2F0b3IpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHJlZ2lzdHJhdGlvbnMgPSBhd2FpdCBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5nZXRSZWdpc3RyYXRpb25zKCk7XG4gIGlmIChyZWdpc3RyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZyhcIlNlcnZpY2Ugd29ya2VyIGFscmVhZHkgcmVnaXN0ZXJlZC5cIik7XG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvbnNbMF07XG4gIH1cblxuICBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlclxuICAgIC5yZWdpc3RlcihcIi9zdy5qc1wiKVxuICAgIC50aGVuKChyZWdpc3RyYXRpb24pID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKFwiU2VydmljZSBXb3JrZXIgcmVnaXN0ZXJlZCB3aXRoIHNjb3BlOlwiLCByZWdpc3RyYXRpb24uc2NvcGUpO1xuICAgICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJTZXJ2aWNlIFdvcmtlciByZWdpc3RyYXRpb24gZmFpbGVkOlwiLCBlcnJvcik7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZFBvc3QodXNlcklEOiBzdHJpbmcsIHBvc3RzOiBQb3N0W10sIHBvc3RUZXh0OiBzdHJpbmcpIHtcbiAgaWYgKCh0eXBlb2YgcG9zdFRleHQgIT09IFwic3RyaW5nXCIpIHx8IHBvc3RUZXh0Lmxlbmd0aCA9PT0gMCkge1xuICAgIGxvZyhcIk5vdCBwb3N0aW5nIGFuIGVtcHR5IHN0cmluZy4uLlwiKVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBwb3N0ID0gbmV3IFBvc3QoYGJvYmJ5ZGlnaXRhbGVzYCwgdXNlcklELCBwb3N0VGV4dCwgbmV3IERhdGUoKSk7XG5cbiAgcG9zdHMucHVzaChwb3N0KTtcbiAgLy8gbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShwb3N0cykpO1xuICBhZGREYXRhKHVzZXJJRCwgcG9zdClcblxuICByZW5kZXIocG9zdHMpO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUlEKCkge1xuICBpZiAoc2VsZi5jcnlwdG8uaGFzT3duUHJvcGVydHkoXCJyYW5kb21VVUlEXCIpKSB7XG4gICAgcmV0dXJuIHNlbGYuY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgfVxuXG4gIHJldHVybiB1dWlkdjQoKTtcbn1cblxuZnVuY3Rpb24gZ2V0VXNlcklEKCkge1xuICBsZXQgaWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImRhbmRlbGlvbl9pZFwiKTtcblxuICBpZiAoIWlkKSB7XG4gICAgaWQgPSBnZW5lcmF0ZUlEKCk7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJkYW5kZWxpb25faWRcIiwgaWQpO1xuICB9XG5cbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiBjb25uZWN0V2Vic29ja2V0KHVzZXJJRDogc3RyaW5nKSB7XG4gIGxldCB3ZWJzb2NrZXQgPSBuZXcgV2ViU29ja2V0KGB3czovLyR7d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lfToke3dpbmRvdy5sb2NhdGlvbi5wb3J0fS93c2ApO1xuXG4gIHdlYnNvY2tldC5vbm9wZW4gPSBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgbG9nKFwiV2Vic29ja2V0OiBDT05ORUNURURcIik7XG4gICAgd2Vic29ja2V0LnNlbmQoYHtcIm1lc3NhZ2VUeXBlXCI6XCJjb25uZWN0XCIsIFwiaWRcIjogXCIke3VzZXJJRH1cIn1gKTtcblxuICAgIGxldCB3ZWJzb2NrZXRQaW5nSW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCk9Pnt3ZWJzb2NrZXQuc2VuZChge1wibWVzc2FnZVR5cGVcIjpcInBpbmdcIiwgXCJpZFwiOiBcIiR7dXNlcklEfVwifWApO30sIDUwMDApXG4gIH07XG5cbiAgd2Vic29ja2V0Lm9uY2xvc2UgPSBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgbG9nKFwiV2Vic29ja2V0OiBESVNDT05ORUNURURcIik7XG4gIH07XG5cbiAgd2Vic29ja2V0Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChldnQpIHtcbiAgICBsb2coJ1dlYnNvY2tldDogUkVTUE9OU0U6ICcgKyBldnQuZGF0YSk7XG4gIH07XG5cbiAgd2Vic29ja2V0Lm9uZXJyb3IgPSBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgbG9nKCdXZWJzb2NrZXQ6IEVSUk9SOiAnICsgZXZ0KTtcbiAgfTtcblxuICByZXR1cm4gd2Vic29ja2V0O1xufVxuXG5mdW5jdGlvbiBzZXRGb250KGZvbnROYW1lOiBzdHJpbmcsIGZvbnRTaXplOiBzdHJpbmcpIHtcblxuICBsZXQgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250ZW50Jyk7XG5cbiAgaWYgKCFjb250ZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29udGVudC5zdHlsZS5mb250RmFtaWx5ID0gZm9udE5hbWU7XG4gIGNvbnRlbnQuc3R5bGUuZm9udFNpemUgPSBmb250U2l6ZTtcblxuICBsZXQgdGV4dEFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGV4dGFyZWFfcG9zdCcpO1xuICBpZiAoIXRleHRBcmVhKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGV4dEFyZWEuc3R5bGUuZm9udEZhbWlseSA9IGZvbnROYW1lO1xuICB0ZXh0QXJlYS5zdHlsZS5mb250U2l6ZSA9IGZvbnRTaXplO1xufVxuXG5mdW5jdGlvbiBpbml0T2ZmbGluZSgpIHtcbiAgLy8gRXZlbnQgbGlzdGVuZXIgZm9yIGdvaW5nIG9mZmxpbmVcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29mZmxpbmUnLCAoKSA9PiB7IGxvZyhcIm9mZmxpbmVcIikgfSk7XG5cbiAgLy8gRXZlbnQgbGlzdGVuZXIgZm9yIGdvaW5nIG9ubGluZVxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb25saW5lJywgKCkgPT4geyBsb2coXCJvbmxpbmVcIikgfSk7XG5cbiAgbG9nKGBPbmxpbmUgc3RhdHVzOiAke25hdmlnYXRvci5vbkxpbmUgPyBcIm9ubGluZVwiIDogXCJvZmZsaW5lXCJ9YClcblxufVxuXG5mdW5jdGlvbiBpbml0QnV0dG9ucyh1c2VySUQ6IHN0cmluZywgcG9zdHM6IFBvc3RbXSkge1xuICBsZXQgZm9udDFCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJ1dHRvbl9mb250MVwiKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgbGV0IGZvbnQyQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJidXR0b25fZm9udDJcIikgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG5cbiAgZm9udDFCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IHNldEZvbnQoJ0Jvb2tlcmx5JywgJzE2cHgnKSB9KTtcbiAgZm9udDJCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IHNldEZvbnQoJ1ZpcmdpbCcsICcyNHB4JykgfSk7XG5cblxuICBsZXQgcG9zdEJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYnV0dG9uX3Bvc3RcIikgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIGxldCBwb3N0VGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidGV4dGFyZWFfcG9zdFwiKSBhcyBIVE1MVGV4dEFyZWFFbGVtZW50O1xuXG4gIGlmICghKHBvc3RCdXR0b24gJiYgcG9zdFRleHQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gIH1cblxuICBwb3N0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgYWRkUG9zdCh1c2VySUQsIHBvc3RzLCBwb3N0VGV4dC52YWx1ZSk7XG4gICAgcG9zdFRleHQudmFsdWUgPSBcIlwiO1xuICB9KTtcblxufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkUG9zdHModXNlcklEOiBzdHJpbmcpIHtcblxuICB0aW1lclN0YXJ0KCk7XG4gIGxldCBwb3N0czogYW55ID0gYXdhaXQgZ2V0RGF0YSh1c2VySUQsIG5ldyBEYXRlKDIwMjIsIDgpLCBuZXcgRGF0ZSgpKTtcblxuICBpZiAocG9zdHMubGVuZ3RoID4gMCkge1xuICAgIGxvZyhgTG9hZGVkICR7cG9zdHMubGVuZ3RofSBwb3N0cyBpbiAke3RpbWVyRGVsdGEoKS50b0ZpeGVkKDIpfW1zYCk7XG4gICAgcmV0dXJuIHBvc3RzO1xuICB9XG5cbiAgcG9zdHMgPSBhd2FpdCBjcmVhdGVUZXN0RGF0YTIodXNlcklEKTtcblxuICBsb2coXCJBZGRpbmcgdGVzdCBkYXRhLi4uXCIpO1xuICBhZGREYXRhQXJyYXkodXNlcklELCBwb3N0cyk7XG4gIHJldHVybiBhd2FpdCBnZXREYXRhKHVzZXJJRCwgbmV3IERhdGUoMjAyMiwgOCksIG5ldyBEYXRlKCkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICBsZXQgcG9zdHM6IFBvc3RbXSA9IFtdO1xuICBsZXQgdGltZSA9IDA7IGBgXG4gIGxldCBkZWx0YSA9IDA7XG5cbiAgbGV0IHVybFBhcmFtcyA9IChuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSkuc2VhcmNoUGFyYW1zO1xuXG4gIGlmICh1cmxQYXJhbXMuZ2V0KFwic3dcIikgPT09IFwidHJ1ZVwiKSB7XG4gICAgbGV0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHJlZ2lzdGVyU2VydmljZVdvcmtlcigpO1xuICB9XG5cbiAgbGV0IHVzZXJJRCA9IGdldFVzZXJJRCgpO1xuICBsb2coYFlvdXIgdXNlciBJRCBpczogJHt1c2VySUR9YCk7XG5cbiAgaWYgKG5hdmlnYXRvci5zdG9yYWdlICYmIG5hdmlnYXRvci5zdG9yYWdlLnBlcnNpc3QgJiYgIW5hdmlnYXRvci5zdG9yYWdlLnBlcnNpc3RlZCkge1xuICAgIGNvbnN0IGlzUGVyc2lzdGVkID0gYXdhaXQgbmF2aWdhdG9yLnN0b3JhZ2UucGVyc2lzdCgpO1xuICAgIGxvZyhgUGVyc2lzdGVkIHN0b3JhZ2UgZ3JhbnRlZDogJHtpc1BlcnNpc3RlZH1gKTtcbiAgfVxuXG4gIGxvZyhgUGVyc2lzdGVkOiAkeyhhd2FpdCBuYXZpZ2F0b3I/LnN0b3JhZ2U/LnBlcnNpc3RlZCgpKT8udG9TdHJpbmcoKX1gKTtcblxuICBpbml0TWFya2Rvd24oKTtcblxuICAvLyBsZXQgbWFpbiA9IGF3YWl0IGZldGNoKFwiL21haW4uanNcIik7XG4gIC8vIGxldCBjb2RlID0gYXdhaXQgbWFpbi50ZXh0KCk7XG4gIC8vICAgY29uc29sZS5sb2coY29kZSk7XG4gIC8vICAgcmVnaXN0cmF0aW9uLmFjdGl2ZS5wb3N0TWVzc2FnZSh7dHlwZTpcInVwZGF0ZU1haW5cIiwgY29kZTpjb2RlfSk7XG5cbiAgcG9zdHMgPSBhd2FpdCBsb2FkUG9zdHModXNlcklEKTtcblxuICBsZXQgd2Vic29ja2V0ID0gY29ubmVjdFdlYnNvY2tldCh1c2VySUQpO1xuICBpbml0T2ZmbGluZSgpO1xuICBpbml0QnV0dG9ucyh1c2VySUQsIHBvc3RzKTtcbiAgLy8gZGVidWdnZXI7XG5cbiAgdGltZXJTdGFydCgpO1xuICByZW5kZXIocG9zdHMpO1xuICBsZXQgcmVuZGVyVGltZSA9IHRpbWVyRGVsdGEoKTtcblxuICBsb2coYHJlbmRlciB0b29rOiAke3JlbmRlclRpbWUudG9GaXhlZCgyKX1tc2ApO1xuXG4gIGxvZyhgbWVtb3J5IHVzZWQ6ICR7KChwZXJmb3JtYW5jZSBhcyBhbnkpLm1lbW9yeS51c2VkSlNIZWFwU2l6ZSAvIDEwMjQgLyAxMDI0KS50b0ZpeGVkKDIpfU1iYClcbn1cblxuZnVuY3Rpb24gcmVuZGVyKHBvc3RzOiBQb3N0W10pIHtcbiAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gIGxldCBjb250ZW50RGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb250ZW50XCIpO1xuICBpZiAoIWNvbnRlbnREaXYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgfVxuICBjb250ZW50RGl2LmlubmVySFRNTCA9IFwiXCI7XG4gIGxldCBjb3VudCA9IDA7XG5cblxuICBmb3IgKGxldCBpID0gcG9zdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBsZXQgcG9zdERhdGEgPSBwb3N0c1tpXTtcblxuICAgIGxldCBwb3N0ID0gcmVuZGVyUG9zdChwb3N0RGF0YSk7XG5cbiAgICBpZiAocG9zdCkge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQocG9zdCk7XG4gICAgICBjb3VudCsrO1xuICAgIH1cbiAgICBpZiAoY291bnQgPiAxMDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG5cbiAgaWYgKCFjb250ZW50RGl2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZ2V0IGNvbnRlbnQgZGl2IVwiKTtcbiAgfVxuXG4gIGNvbnRlbnREaXYuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuXG59XG5cbmZ1bmN0aW9uIHJlbmRlclBvc3QocG9zdDogUG9zdCkge1xuICBpZiAoIShwb3N0Lmhhc093blByb3BlcnR5KFwidGV4dFwiKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJQb3N0IGlzIG1hbGZvcm1lZCFcIik7XG4gIH1cbiAgbGV0IGNvbnRhaW5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGxldCB0ZXh0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgbGV0IHRpbWVzdGFtcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGxldCBociA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJoclwiKTtcblxuXG4gIHRleHREaXYuaW5uZXJIVE1MID0gbWFya2VkLnBhcnNlKHBvc3QudGV4dCk7XG4gIC8vIHRleHREaXYuaW5uZXJIVE1MID0gRE9NUHVyaWZ5LnNhbml0aXplKG1hcmtlZC5wYXJzZShwb3N0LnRleHQpKTtcblxuICB0aW1lc3RhbXBEaXYuaW5uZXJUZXh0ID0gYCR7cG9zdC5wb3N0X3RpbWVzdGFtcC50b0RhdGVTdHJpbmcoKX1gO1xuICB0aW1lc3RhbXBEaXYudGl0bGUgPSBgJHtwb3N0LnBvc3RfdGltZXN0YW1wLnRvTG9jYWxlVGltZVN0cmluZygpfSDCtyAke3Bvc3QucG9zdF90aW1lc3RhbXAudG9EYXRlU3RyaW5nKCl9YFxuICBjb250YWluZXJEaXYuYXBwZW5kQ2hpbGQoaHIpO1xuICBjb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGV4dERpdik7XG5cbiAgaWYgKCEoXCJpbWFnZV9kYXRhXCIgaW4gcG9zdCAmJiBwb3N0LmltYWdlX2RhdGEpKSB7XG4gICAgY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHRpbWVzdGFtcERpdik7XG4gICAgcmV0dXJuIGNvbnRhaW5lckRpdjtcbiAgICAvLyByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbcG9zdC5pbWFnZV9kYXRhIGFzIEFycmF5QnVmZmVyXSwgeyB0eXBlOiAnaW1hZ2UvanBnJyB9KTtcbiAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgfTtcblxuXG4gIGltYWdlLnNyYyA9IHVybDtcbiAgLy8gaW1hZ2Uuc3JjID0gaW1hZ2Uuc3JjID0gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsXCIgKyBwb3N0LmltYWdlO1xuICBpbWFnZS5jbGFzc05hbWUgPSBcInBvc3RJbWFnZVwiO1xuXG4gIGNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZChpbWFnZSk7XG4gIGNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aW1lc3RhbXBEaXYpO1xuXG4gIHJldHVybiBjb250YWluZXJEaXY7XG59XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCBtYWluKTtcbiJdfQ==
\ No newline at end of file
diff --git a/src/main.ts b/src/main.ts
index 3983da0..509411d 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -38,6 +38,21 @@ class Post {
}
}
+window.addEventListener('scroll', () => {
+ // Total height of the document
+ const totalPageHeight = document.body.scrollHeight;
+
+ // Current scroll position
+ const scrollPoint = window.scrollY + window.innerHeight;
+
+ // Check if scrolled to bottom
+ if (scrollPoint >= totalPageHeight) {
+ console.log('Scrolled to the bottom!');
+ console.log(scrollPoint, totalPageHeight);
+ // You can perform your action here
+ }
+});
+
function initMarkdown() {
const renderer = new marked.Renderer();
@@ -252,6 +267,8 @@ function connectWebsocket(userID: string) {
websocket.onopen = function (evt) {
log("Websocket: CONNECTED");
websocket.send(`{"messageType":"connect", "id": "${userID}"}`);
+
+ let websocketPingInterval = window.setInterval(()=>{websocket.send(`{"messageType":"ping", "id": "${userID}"}`);}, 5000)
};
websocket.onclose = function (evt) {
@@ -269,15 +286,24 @@ function connectWebsocket(userID: string) {
return websocket;
}
-function setFont(fontName: string) {
+function setFont(fontName: string, fontSize: string) {
+
+ let content = document.getElementById('content');
+
+ if (!content) {
+ return;
+ }
+
+ content.style.fontFamily = fontName;
+ content.style.fontSize = fontSize;
- document.body.style.fontFamily = fontName;
let textArea = document.getElementById('textarea_post');
if (!textArea) {
return;
}
textArea.style.fontFamily = fontName;
+ textArea.style.fontSize = fontSize;
}
function initOffline() {
@@ -295,8 +321,8 @@ function initButtons(userID: string, posts: Post[]) {
let font1Button = document.getElementById("button_font1") as HTMLButtonElement;
let font2Button = document.getElementById("button_font2") as HTMLButtonElement;
- font1Button.addEventListener('click', () => { setFont('Bookerly'); });
- font2Button.addEventListener('click', () => { setFont('Virgil') });
+ font1Button.addEventListener('click', () => { setFont('Bookerly', '16px') });
+ font2Button.addEventListener('click', () => { setFont('Virgil', '24px') });
let postButton = document.getElementById("button_post") as HTMLButtonElement;
@@ -349,7 +375,7 @@ async function main() {
log(`Persisted storage granted: ${isPersisted}`);
}
- log(`Persisted: ${(await navigator.storage.persisted()).toString()}`);
+ log(`Persisted: ${(await navigator?.storage?.persisted())?.toString()}`);
initMarkdown();