sdk7-npc-utils
Version:
A collection of helpers to make it easier to build a Decentraland scene using the SDK 7.
179 lines • 23.3 kB
JavaScript
import { AudioSource, engine } from "@dcl/sdk/ecs";
import { activeNPC, npcDataComponent } from "./npc";
import { IsTypingDialog } from "./components";
import { NPCState } from "./types";
export const npcDialogComponent = new Map();
export const npcDialogTypingSystems = new Map();
export var ConfirmMode;
(function (ConfirmMode) {
ConfirmMode[ConfirmMode["Confirm"] = 0] = "Confirm";
ConfirmMode[ConfirmMode["Cancel"] = 1] = "Cancel";
ConfirmMode[ConfirmMode["Next"] = 2] = "Next";
ConfirmMode[ConfirmMode["Button3"] = 3] = "Button3";
ConfirmMode[ConfirmMode["Button4"] = 4] = "Button4";
})(ConfirmMode || (ConfirmMode = {}));
export function addDialog(npc, sound) {
console.log('adding dialog for npc', npc);
npcDialogComponent.set(npc, {
typing: true,
visible: false,
visibleText: "",
visibleChars: 0,
fullText: "",
timer: 0,
speed: 30,
script: [],
index: 0,
sound: sound ? sound : undefined,
soundPlayer: sound ? engine.addEntity() : undefined,
fontSize: 22
});
}
export function getText() {
return activeNPC == 0 || !npcDialogComponent.has(activeNPC) ? "" : npcDialogComponent.get(activeNPC).visibleText;
}
export function getFontSize() {
return activeNPC == 0 || !npcDialogComponent.has(activeNPC) ? 22 : npcDialogComponent.get(activeNPC).fontSize;
}
export function displayDialog() {
return activeNPC == 0 || !npcDialogComponent.has(activeNPC) ? false : npcDialogComponent.get(activeNPC).visible;
}
export function closeDialog(npc) {
let dialogData = npcDialogComponent.get(npc);
dialogData.visible = false;
dialogData.typing = false;
dialogData.visibleText = "";
dialogData.visibleChars = 0;
dialogData.fullText = "";
dialogData.timer = 0;
dialogData.index = 0;
dialogData.script = [];
}
export function talk(npc, dialog, startIndex, duration) {
npcDataComponent.get(npc).introduced = true;
console.log('trying to talk npc');
if (npcDialogComponent.has(npc)) {
console.log('we have npc dialog compoentn for ', npc);
npcDataComponent.get(npc).state = NPCState.TALKING;
openDialog(npc, dialog, startIndex ? startIndex : 0);
}
}
function openDialog(npc, dialog, startIndex) {
let dialogData = npcDialogComponent.get(npc);
dialogData.script = addLineBreaks(dialog);
dialogData.index = startIndex;
let currentText = dialog[startIndex] ? dialog[startIndex] : { text: '' };
if (currentText.audio) {
AudioSource.createOrReplace(dialogData.soundPlayer, {
audioClipUrl: currentText.audio,
loop: false,
playing: false
});
let audio = AudioSource.getMutable(dialogData.soundPlayer);
audio.volume = 0.5;
audio.playing = true;
}
else if (dialogData.sound) {
AudioSource.createOrReplace(dialogData.soundPlayer, {
audioClipUrl: dialogData.sound,
loop: false,
playing: false
});
let audio = AudioSource.getMutable(dialogData.soundPlayer);
audio.volume = 0.5;
audio.playing = true;
}
beginTyping(npc);
}
function beginTyping(npc) {
console.log('begin typing for npc', npc);
let dialogData = npcDialogComponent.get(npc);
dialogData.fullText = dialogData.script[dialogData.index].text;
dialogData.visible = true;
dialogData.typing = true;
dialogData.visibleText = "";
dialogData.visibleChars = 0;
dialogData.timer = 0;
dialogData.openTime = Math.floor(Date.now());
if (dialogData.script[dialogData.index].fontSize) {
dialogData.fontSize = dialogData.script[dialogData.index].fontSize;
}
if (dialogData.script[dialogData.index].hasOwnProperty("typeSpeed")) {
dialogData.speed = dialogData.script[dialogData.index].typeSpeed;
}
else {
dialogData.speed = 30;
}
if (dialogData.speed <= 0) {
rushText(npc);
}
else {
if (!IsTypingDialog.has(npc)) {
IsTypingDialog.create(npc);
}
}
}
function addLineBreaks(dialog) {
let cleaned = [];
dialog.forEach((d) => {
d.text = lineBreak(d.text, 50);
cleaned.push(d);
});
return cleaned;
}
function lineBreak(text, maxLineLength) {
const words = text.split(' ');
let currentLine = '';
const lines = [];
for (const word of words) {
if (currentLine.length + word.length + 1 <= maxLineLength) {
currentLine += `${word} `;
}
else {
lines.push(currentLine.trim());
currentLine = `${word} `;
}
}
lines.push(currentLine.trim());
return lines.join('\n');
}
export function handleDialogClick() {
let npc = activeNPC;
if (npcDialogComponent.has(npc)) {
let dialogData = npcDialogComponent.get(npc);
if (!dialogData.visible || (Math.floor(Date.now()) - dialogData.openTime < 100))
return;
if (dialogData.typing) {
rushText(npc);
}
else {
confirmText(npc, ConfirmMode.Next);
}
}
}
function rushText(npc) {
let dialogData = npcDialogComponent.get(npc);
dialogData.typing = false;
dialogData.timer = 0;
dialogData.visibleChars = dialogData.fullText.length;
dialogData.visibleText = dialogData.fullText;
}
function confirmText(npc, mode) {
let dialogData = npcDialogComponent.get(npc);
dialogData.openTime = Math.floor(Date.now());
let currentText = dialogData.script[dialogData.index];
if (mode == ConfirmMode.Next) {
if (!currentText.isQuestion) {
if (currentText.triggeredByNext) {
currentText.triggeredByNext();
}
if (currentText.isEndOfDialog) {
closeDialog(npc);
return;
}
dialogData.index++;
}
beginTyping(npc);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RpYWxvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFVLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMzRCxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUMsT0FBTyxFQUFVLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUUzQyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBcUIsSUFBSSxHQUFHLEVBQUUsQ0FBQTtBQUM3RCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBcUIsSUFBSSxHQUFHLEVBQUUsQ0FBQTtBQUVqRSxNQUFNLENBQU4sSUFBWSxXQU1UO0FBTkgsV0FBWSxXQUFXO0lBQ25CLG1EQUFXLENBQUE7SUFDWCxpREFBVSxDQUFBO0lBQ1YsNkNBQVEsQ0FBQTtJQUNSLG1EQUFXLENBQUE7SUFDWCxtREFBVyxDQUFBO0FBQ2IsQ0FBQyxFQU5TLFdBQVcsS0FBWCxXQUFXLFFBTXBCO0FBRUgsTUFBTSxVQUFVLFNBQVMsQ0FBQyxHQUFVLEVBQUUsS0FBYTtJQUMvQyxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLEdBQUcsQ0FBQyxDQUFBO0lBQ3pDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDeEIsTUFBTSxFQUFDLElBQUk7UUFDWCxPQUFPLEVBQUMsS0FBSztRQUNiLFdBQVcsRUFBQyxFQUFFO1FBQ2QsWUFBWSxFQUFDLENBQUM7UUFDZCxRQUFRLEVBQUMsRUFBRTtRQUNYLEtBQUssRUFBQyxDQUFDO1FBQ1AsS0FBSyxFQUFDLEVBQUU7UUFDUixNQUFNLEVBQUMsRUFBRTtRQUNULEtBQUssRUFBQyxDQUFDO1FBQ1AsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMs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YUFDNUI7WUFDRCxJQUFJLFdBQVcsQ0FBQyxhQUFhLEVBQUU7Z0JBQy9CLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDaEIsT0FBTTthQUNMO1lBQ0QsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFBO1NBQ3JCO1FBRUQsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0tBQ25CO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF1ZGlvU291cmNlLCBFbnRpdHksIGVuZ2luZSB9IGZyb20gXCJAZGNsL3Nkay9lY3NcIjtcbmltcG9ydCB7IGFjdGl2ZU5QQywgbnBjRGF0YUNvbXBvbmVudCB9IGZyb20gXCIuL25wY1wiO1xuaW1wb3J0IHsgSXNUeXBpbmdEaWFsb2cgfSBmcm9tIFwiLi9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBoYW5kbGVEaWFsb2dUeXBpbmcgfSBmcm9tIFwiLi9zeXN0ZW1zXCI7XG5pbXBvcnQgeyBEaWFsb2csIE5QQ1N0YXRlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IG5wY0RpYWxvZ0NvbXBvbmVudDogTWFwPEVudGl0eSwgYW55PiA9IG5ldyBNYXAoKVxuZXhwb3J0IGNvbnN0IG5wY0RpYWxvZ1R5cGluZ1N5c3RlbXM6IE1hcDxFbnRpdHksIGFueT4gPSBuZXcgTWFwKClcblxuZXhwb3J0IGVudW0gQ29uZmlybU1vZGUge1xuICAgIENvbmZpcm0gPSAwLFxuICAgIENhbmNlbCA9IDEsXG4gICAgTmV4dCA9IDIsXG4gICAgQnV0dG9uMyA9IDMsXG4gICAgQnV0dG9uNCA9IDRcbiAgfVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkRGlhbG9nKG5wYzpFbnRpdHksIHNvdW5kPzpzdHJpbmcpe1xuICAgIGNvbnNvbGUubG9nKCdhZGRpbmcgZGlhbG9nIGZvciBucGMnLCBucGMpXG4gICAgbnBjRGlhbG9nQ29tcG9uZW50LnNldChucGMsIHtcbiAgICAgICAgdHlwaW5nOnRydWUsXG4gICAgICAgIHZpc2libGU6ZmFsc2UsXG4gICAgICAgIHZpc2libGVUZXh0OlwiXCIsXG4gICAgICAgIHZpc2libGVDaGFyczowLFxuICAgICAgICBmdWxsVGV4dDpcIlwiLFxuICAgICAgICB0aW1lcjowLFxuICAgICAgICBzcGVlZDozMCxcbiAgICAgICAgc2NyaXB0OltdLFxuICAgICAgICBpbmRleDowLFxuICAgICAgICBzb3VuZDogc291bmQgPyBzb3VuZCA6IHVuZGVmaW5lZCxcbiAgICAgICAgc291bmRQbGF5ZXI6IHNvdW5kID8gZW5naW5lLmFkZEVudGl0eSgpIDogdW5kZWZpbmVkLFxuICAgICAgICBmb250U2l6ZToyMlxuICAgIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXh0KCl7XG4gICAgcmV0dXJuIGFjdGl2ZU5QQyA9PSAwIHx8ICFucGNEaWFsb2dDb21wb25lbnQuaGFzKGFjdGl2ZU5QQyBhcyBFbnRpdHkpID8gXCJcIiA6IG5wY0RpYWxvZ0NvbXBvbmVudC5nZXQoYWN0aXZlTlBDIGFzIEVudGl0eSkudmlzaWJsZVRleHRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvbnRTaXplKCl7XG4gICAgcmV0dXJuIGFjdGl2ZU5QQyA9PSAwIHx8ICFucGNEaWFsb2dDb21wb25lbnQuaGFzKGFjdGl2ZU5QQyBhcyBFbnRpdHkpID8gMjIgOiBucGNEaWFsb2dDb21wb25lbnQuZ2V0KGFjdGl2ZU5QQyBhcyBFbnRpdHkpLmZvbnRTaXplXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNwbGF5RGlhbG9nKCl7XG4gICAgcmV0dXJuIGFjdGl2ZU5QQyA9PSAwIHx8ICFucGNEaWFsb2dDb21wb25lbnQuaGFzKGFjdGl2ZU5QQyBhcyBFbnRpdHkpID8gZmFsc2UgOiAgbnBjRGlhbG9nQ29tcG9uZW50LmdldChhY3RpdmVOUEMgYXMgRW50aXR5KS52aXNpYmxlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9zZURpYWxvZyhucGM6RW50aXR5KXtcbiAgICBsZXQgZGlhbG9nRGF0YSA9IG5wY0RpYWxvZ0NvbXBvbmVudC5nZXQobnBjKVxuICAgIGRpYWxvZ0RhdGEudmlzaWJsZSA9IGZhbHNlXG4gICAgZGlhbG9nRGF0YS50eXBpbmcgPSBmYWxzZVxuICAgIGRpYWxvZ0RhdGEudmlzaWJsZVRleHQgPSBcIlwiXG4gICAgZGlhbG9nRGF0YS52aXNpYmxlQ2hhcnMgPSAwXG4gICAgZGlhbG9nRGF0YS5mdWxsVGV4dCA9IFwiXCJcbiAgICBkaWFsb2dEYXRhLnRpbWVyID0gMFxuICAgIGRpYWxvZ0RhdGEuaW5kZXggPSAwXG4gICAgZGlhbG9nRGF0YS5zY3JpcHQgPSBbXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFsayhucGM6RW50aXR5LCBkaWFsb2c6RGlhbG9nW10sIHN0YXJ0SW5kZXg/Om51bWJlciwgZHVyYXRpb24/Om51bWJlcil7XG4gICAgbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKS5pbnRyb2R1Y2VkID0gdHJ1ZVxuICAgIGNvbnNvbGUubG9nKCd0cnlpbmcgdG8gdGFsayBucGMnKVxuICAgIGlmKG5wY0RpYWxvZ0NvbXBvbmVudC5oYXMobnBjKSl7XG4gICAgICAgIGNvbnNvbGUubG9nKCd3ZSBoYXZlIG5wYyBkaWFsb2cgY29tcG9lbnRuIGZvciAnLCBucGMpXG4gICAgICAgIG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYykuc3RhdGUgPSBOUENTdGF0ZS5UQUxLSU5HXG4gICAgICAgIG9wZW5EaWFsb2cobnBjLGRpYWxvZywgc3RhcnRJbmRleCA/IHN0YXJ0SW5kZXggOiAwKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gb3BlbkRpYWxvZyhucGM6RW50aXR5LCBkaWFsb2c6YW55W10sIHN0YXJ0SW5kZXg6bnVtYmVyKXtcbiAgICBsZXQgZGlhbG9nRGF0YSA9IG5wY0RpYWxvZ0NvbXBvbmVudC5nZXQobnBjKVxuICAgIGRpYWxvZ0RhdGEuc2NyaXB0ID0gYWRkTGluZUJyZWFrcyhkaWFsb2cpXG4gICAgZGlhbG9nRGF0YS5pbmRleCA9IHN0YXJ0SW5kZXhcbiAgICBcbiAgICBsZXQgY3VycmVudFRleHQ6IERpYWxvZyA9IGRpYWxvZ1tzdGFydEluZGV4XSA/IGRpYWxvZ1tzdGFydEluZGV4XSA6IHsgdGV4dDogJycgfVxuXG4gICAgaWYgKGN1cnJlbnRUZXh0LmF1ZGlvKSB7XG4gICAgICAgIEF1ZGlvU291cmNlLmNyZWF0ZU9yUmVwbGFjZShkaWFsb2dEYXRhLnNvdW5kUGxheWVyLCB7XG4gICAgICAgICAgICBhdWRpb0NsaXBVcmw6IGN1cnJlbnRUZXh0LmF1ZGlvLFxuICAgICAgICAgICAgbG9vcDogZmFsc2UsXG4gICAgICAgICAgICBwbGF5aW5nOiBmYWxzZVxuICAgICAgICB9KVxuICAgICAgICBsZXQgYXVkaW8gPSBBdWRpb1NvdXJjZS5nZXRNdXRhYmxlKGRpYWxvZ0RhdGEuc291bmRQbGF5ZXIpXG4gICAgICAgIGF1ZGlvLnZvbHVtZSA9IDAuNVxuICAgICAgICBhdWRpby5wbGF5aW5nID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAoZGlhbG9nRGF0YS5zb3VuZCkge1xuICAgICAgICBBdWRpb1NvdXJjZS5jcmVhdGVPclJlcGxhY2UoZGlhbG9nRGF0YS5zb3VuZFBsYXllciwge1xuICAgICAgICAgICAgYXVkaW9DbGlwVXJsOiBkaWFsb2dEYXRhLnNvdW5kLFxuICAgICAgICAgICAgbG9vcDogZmFsc2UsXG4gICAgICAgICAgICBwbGF5aW5nOiBmYWxzZVxuICAgICAgICB9KVxuICAgICAgICBsZXQgYXVkaW8gPSBBdWRpb1NvdXJjZS5nZXRNdXRhYmxlKGRpYWxvZ0RhdGEuc291bmRQbGF5ZXIpXG4gICAgICAgIGF1ZGlvLnZvbHVtZSA9IDAuNVxuICAgICAgICBhdWRpby5wbGF5aW5nID0gdHJ1ZVxuICAgIH1cblxuXG4gICAgLy9UT0RPXG4gICAgLy9zZXQgcG9ydHJhaXRcbiAgICAvL3NldCBpbWFnZSBvbiB0aGUgcmlnaHRcbiAgICAvL3NldCB0ZXh0XG4gICAgLy9nbG9iYWwgYnV0dG9uIGFjdGlvbnNcblxuICAgIGJlZ2luVHlwaW5nKG5wYylcbn1cblxuZnVuY3Rpb24gYmVnaW5UeXBpbmcobnBjOkVudGl0eSl7XG4gICAgY29uc29sZS5sb2coJ2JlZ2luIHR5cGluZyBmb3IgbnBjJywgbnBjKVxuICAgIGxldCBkaWFsb2dEYXRhID0gbnBjRGlhbG9nQ29tcG9uZW50LmdldChucGMpXG4gICAgZGlhbG9nRGF0YS5mdWxsVGV4dCA9IGRpYWxvZ0RhdGEuc2NyaXB0W2RpYWxvZ0RhdGEuaW5kZXhdLnRleHRcbiAgICBkaWFsb2dEYXRhLnZpc2libGUgPSB0cnVlXG4gICAgZGlhbG9nRGF0YS50eXBpbmcgPSB0cnVlXG4gICAgZGlhbG9nRGF0YS52aXNpYmxlVGV4dCA9IFwiXCJcbiAgICBkaWFsb2dEYXRhLnZpc2libGVDaGFycyA9IDBcbiAgICBkaWFsb2dEYXRhLnRpbWVyID0gMFxuICAgIGRpYWxvZ0RhdGEub3BlblRpbWUgPSBNYXRoLmZsb29yKERhdGUubm93KCkpXG4gICAgaWYoZGlhbG9nRGF0YS5zY3JpcHRbZGlhbG9nRGF0YS5pbmRleF0uZm9udFNpemUpe1xuICAgICAgICBkaWFsb2dEYXRhLmZvbnRTaXplID0gZGlhbG9nRGF0YS5zY3JpcHRbZGlhbG9nRGF0YS5pbmRleF0uZm9udFNpemVcbiAgICB9XG4gICAgXG4gICAgaWYoZGlhbG9nRGF0YS5zY3JpcHRbZGlhbG9nRGF0YS5pbmRleF0uaGFzT3duUHJvcGVydHkoXCJ0eXBlU3BlZWRcIikpe1xuICAgICAgICBkaWFsb2dEYXRhLnNwZWVkID0gZGlhbG9nRGF0YS5zY3JpcHRbZGlhbG9nRGF0YS5pbmRleF0udHlwZVNwZWVkXG4gICAgfVxuICAgIGVsc2V7XG4gICAgICAgIGRpYWxvZ0RhdGEuc3BlZWQgPSAzMFxuICAgIH1cblxuICAgIGlmKGRpYWxvZ0RhdGEuc3BlZWQgPD0gMCl7XG4gICAgICAgIHJ1c2hUZXh0KG5wYylcbiAgICB9XG4gICAgZWxzZXtcbiAgICAgICAgaWYoIUlzVHlwaW5nRGlhbG9nLmhhcyhucGMpKXtcbiAgICAgICAgICAgIElzVHlwaW5nRGlhbG9nLmNyZWF0ZShucGMpXG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgLy8gaWYoIW5wY0RpYWxvZ1R5cGluZ1N5c3RlbXMuaGFzKG5wYykpe1xuICAgICAgICAvLyAgICAgbnBjRGlhbG9nVHlwaW5nU3lzdGVtcy5zZXQobnBjLGVuZ2luZS5hZGRTeXN0ZW0oaGFuZGxlRGlhbG9nVHlwaW5nKSlcbiAgICAgICAgLy8gfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gYWRkTGluZUJyZWFrcyhkaWFsb2c6RGlhbG9nW10pe1xuICAgIGxldCBjbGVhbmVkOkRpYWxvZ1tdID0gW11cbiAgICBkaWFsb2cuZm9yRWFjaCgoZCk9PntcbiAgICAgICAgZC50ZXh0ID0gbGluZUJyZWFrKGQudGV4dCwgNTApXG4gICAgICAgIGNsZWFuZWQucHVzaChkKVxuICAgIH0pXG4gICAgcmV0dXJuIGNsZWFuZWRcbn1cblxuZnVuY3Rpb24gbGluZUJyZWFrKHRleHQ6IHN0cmluZywgbWF4TGluZUxlbmd0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCB3b3JkcyA9IHRleHQuc3BsaXQoJyAnKTtcbiAgICBsZXQgY3VycmVudExpbmUgPSAnJztcbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuICBcbiAgICBmb3IgKGNvbnN0IHdvcmQgb2Ygd29yZHMpIHtcbiAgICAgIGlmIChjdXJyZW50TGluZS5sZW5ndGggKyB3b3JkLmxlbmd0aCArIDEgPD0gbWF4TGluZUxlbmd0aCkge1xuICAgICAgICBjdXJyZW50TGluZSArPSBgJHt3b3JkfSBgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChjdXJyZW50TGluZS50cmltKCkpO1xuICAgICAgICBjdXJyZW50TGluZSA9IGAke3dvcmR9IGA7XG4gICAgICB9XG4gICAgfVxuICAgIGxpbmVzLnB1c2goY3VycmVudExpbmUudHJpbSgpKTtcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVEaWFsb2dDbGljaygpe1xuICAgIGxldCBucGMgPSBhY3RpdmVOUEMgYXMgRW50aXR5XG4gICAgaWYobnBjRGlhbG9nQ29tcG9uZW50LmhhcyhucGMpKXtcbiAgICAgICAgbGV0IGRpYWxvZ0RhdGEgPSBucGNEaWFsb2dDb21wb25lbnQuZ2V0KG5wYylcbiAgICAgICAgaWYoIWRpYWxvZ0RhdGEudmlzaWJsZSB8fCAoTWF0aC5mbG9vcihEYXRlLm5vdygpKSAtIGRpYWxvZ0RhdGEub3BlblRpbWUgIDwgMTAwKSkgcmV0dXJuXG4gICAgICAgIFxuICAgICAgICBpZihkaWFsb2dEYXRhLnR5cGluZyl7XG4gICAgICAgICAgICBydXNoVGV4dChucGMpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIGNvbmZpcm1UZXh0KG5wYywgQ29uZmlybU1vZGUuTmV4dClcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcnVzaFRleHQobnBjOkVudGl0eSl7XG4gICAgbGV0IGRpYWxvZ0RhdGEgPSBucGNEaWFsb2dDb21wb25lbnQuZ2V0KG5wYylcbiAgICBkaWFsb2dEYXRhLnR5cGluZyA9IGZhbHNlXG4gICAgZGlhbG9nRGF0YS50aW1lciA9IDBcbiAgICBkaWFsb2dEYXRhLnZpc2libGVDaGFycyA9IGRpYWxvZ0RhdGEuZnVsbFRleHQubGVuZ3RoXG4gICAgZGlhbG9nRGF0YS52aXNpYmxlVGV4dCA9IGRpYWxvZ0RhdGEuZnVsbFRleHRcbiAgICAvL2VuZ2luZS5yZW1vdmVTeXN0ZW0obnBjRGlhbG9nVHlwaW5nU3lzdGVtcy5nZXQobnBjKSlcbn1cbmZ1bmN0aW9uIGNvbmZpcm1UZXh0KG5wYzpFbnRpdHksIG1vZGU6IENvbmZpcm1Nb2RlKTogdm9pZCB7XG4gICAgbGV0IGRpYWxvZ0RhdGEgPSBucGNEaWFsb2dDb21wb25lbnQuZ2V0KG5wYylcbiAgICBkaWFsb2dEYXRhLm9wZW5UaW1lID0gTWF0aC5mbG9vcihEYXRlLm5vdygpKVxuXG4gICAgbGV0IGN1cnJlbnRUZXh0ID0gZGlhbG9nRGF0YS5zY3JpcHRbZGlhbG9nRGF0YS5pbmRleF1cbiAgICAvLyBVcGRhdGUgYWN0aXZlIHRleHRcbiAgICBpZiAobW9kZSA9PSBDb25maXJtTW9kZS5OZXh0KSB7XG4gICAgICAgIGlmICghY3VycmVudFRleHQuaXNRdWVzdGlvbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRUZXh0LnRyaWdnZXJlZEJ5TmV4dCkge1xuICAgICAgICAgICAgY3VycmVudFRleHQudHJpZ2dlcmVkQnlOZXh0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXJyZW50VGV4dC5pc0VuZE9mRGlhbG9nKSB7XG4gICAgICAgICAgICBjbG9zZURpYWxvZyhucGMpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpYWxvZ0RhdGEuaW5kZXgrK1xuICAgICAgICB9XG5cbiAgICAgICAgYmVnaW5UeXBpbmcobnBjKVxuICAgIH1cbn0iXX0=