dcl-npc-toolkit-ai-version
Version:
A collection of tools for creating Non-Player-Characters (NPCs). These are capable of having conversations with the player, and play different animations. AI usage is added atop of it
543 lines • 86.7 kB
JavaScript
import * as utils from '@dcl-sdk/utils';
import { AudioSource, engine } from "@dcl/sdk/ecs";
import { activeNPC, clearNPC, closeDialogWindow, isActiveNpcSet, npcDataComponent, setActiveNPC, stopWalking } from "./npc";
import { IsTypingDialog } from "./components";
import { NPCState } from "./types";
import { leftClickSection, leftClickSectionbBlack, lightTheme, section, skipButtonSection, skipButtonSectionBlack } from './ui';
import { getBubbleTextLength } from './bubble';
import { Color4 } from '@dcl/sdk/math';
export const npcDialogComponent = new Map();
export const npcDialogTypingSystems = new Map();
export const npcDialogInputListener = 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 let UIscaleMultiplier = 0.75;
let portraitXPos = -50 * UIscaleMultiplier;
let portraitYPos = 20 * UIscaleMultiplier;
let imageXPos = 350 * UIscaleMultiplier;
let imageYPos = 50 * UIscaleMultiplier;
let portraitScale = 256 * UIscaleMultiplier;
let imageScale = 256 * UIscaleMultiplier;
let textSize = 24 * UIscaleMultiplier;
let textYPos = 10 * UIscaleMultiplier;
let buttonWidth = 174 * UIscaleMultiplier;
let buttonHeight = 46 * UIscaleMultiplier;
let buttonTextSize = 20 * UIscaleMultiplier;
let button1XPos = 150 * UIscaleMultiplier;
let button2XPos = -80 * UIscaleMultiplier;
let button3XPos = -80 * UIscaleMultiplier;
let button4XPos = 150 * UIscaleMultiplier;
let button1YPos = -65 * UIscaleMultiplier;
let button2YPos = -65 * UIscaleMultiplier;
let button1YPos4 = -20 * UIscaleMultiplier;
let button2YPos4 = -20 * UIscaleMultiplier;
let button3YPos = -80 * UIscaleMultiplier;
let button4YPos = -80 * UIscaleMultiplier;
let skipButtonXPos = -300 * UIscaleMultiplier;
let skipButtonYPos = -100 * UIscaleMultiplier;
let buttonIconWidth = 26 * UIscaleMultiplier;
let buttonIconHeight = 26 * UIscaleMultiplier;
export function addDialog(npc, sound, defaultPortrait) {
console.log('adding dialog for npc', npc);
npcDialogComponent.set(npc, {
typing: true,
visible: false,
visibleText: "",
visibleChars: 0,
fullText: "",
timer: 0,
speed: 30,
originalScript: [],
script: [],
index: 0,
sound: sound ? sound : undefined,
soundPlayer: sound ? engine.addEntity() : undefined,
fontSize: 22,
isQuestion: false,
buttons: 0,
displayPortrait: defaultPortrait ? true : false,
defaultPortrait: defaultPortrait ? defaultPortrait : null,
defaultPortraitTexture: defaultPortrait ? defaultPortrait.path : lightTheme,
currentPortrait: defaultPortrait ? defaultPortrait.path : lightTheme,
portraitWidth: defaultPortrait && defaultPortrait.width ? defaultPortrait.width * UIscaleMultiplier : portraitScale,
portraitHeight: defaultPortrait && defaultPortrait.height ? defaultPortrait.height * UIscaleMultiplier : portraitScale,
portraitX: defaultPortrait && defaultPortrait.offsetX ? defaultPortrait.offsetX * UIscaleMultiplier + portraitXPos : portraitXPos,
portraitY: defaultPortrait && defaultPortrait.offsetY ? defaultPortrait.offsetY * UIscaleMultiplier + portraitYPos : portraitYPos,
portaitSHeight: defaultPortrait && defaultPortrait.section && defaultPortrait.section.sourceHeight ? defaultPortrait.section.sourceHeight : 256,
portraitSWidth: defaultPortrait && defaultPortrait.section && defaultPortrait.section.sourceWidth ? defaultPortrait.section.sourceWidth : 256,
portaitSTop: defaultPortrait && defaultPortrait.section && defaultPortrait.section.sourceTop ? defaultPortrait.section.sourceTop : 0,
portraitSLeft: defaultPortrait && defaultPortrait.section && defaultPortrait.section.sourceLeft ? defaultPortrait.section.sourceLeft : 0
});
}
export function displayImage() {
return !isActiveNpcSet() ? false : npcDialogComponent.get(activeNPC).displayImage;
}
export function displayPortrait() {
return !isActiveNpcSet() ? false : npcDialogComponent.get(activeNPC).displayPortrait;
}
export function displaySkipable() {
return !isActiveNpcSet() ? false : npcDialogComponent.get(activeNPC).skipable;
}
export function getSkipableTheme() {
return !isActiveNpcSet() ? skipButtonSectionBlack : npcDataComponent.get(activeNPC).theme == lightTheme ? skipButtonSectionBlack : skipButtonSection;
}
export function getLeftClickTheme() {
return !isActiveNpcSet() ? leftClickSection : npcDataComponent.get(activeNPC).theme == lightTheme ? leftClickSection : leftClickSectionbBlack;
}
export function positionTextX() {
return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).positionX;
}
export function positionTextY() {
return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).positionY;
}
export function positionPortaitX() {
return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).portraitX;
}
export function positionPortaitY() {
return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).portraitY;
}
export function portraitWidth() {
return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).portraitWidth;
}
export function portraitHeight() {
return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).portraitHeight;
}
export function positionImageX() {
return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).imageX;
}
export function positionImageY() {
return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).imageY;
}
export function imageWidth() {
return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).imageWidth;
}
export function imageHeight() {
return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).imageHeight;
}
export function getPortrait() {
return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).currentPortrait;
}
export function getImage() {
return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).dialogImageTexture;
}
export function getText() {
return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).visibleText;
}
export function getTextColor() {
return !isActiveNpcSet() ? Color4.Black() : npcDataComponent.get(activeNPC).theme == lightTheme ? Color4.Black() : Color4.White();
}
export function getTheme() {
return !isActiveNpcSet() ? lightTheme : npcDataComponent.get(activeNPC).theme;
}
export function getButtonText(button) {
let text = "";
if (activeNPC != 0 && npcDialogComponent.has(activeNPC)) {
let dialogData = npcDialogComponent.get(activeNPC);
if (dialogData.isQuestion && dialogData.buttons > button) {
text = dialogData.script[dialogData.index].buttons[button].label;
}
}
return text;
}
export function getbuttonSize(button) {
let ButtonSize;
if (activeNPC != 0 && npcDialogComponent.has(activeNPC)) {
let dialogData = npcDialogComponent.get(activeNPC);
if (dialogData.isQuestion && dialogData.buttons > button) {
if (dialogData.script[dialogData.index].buttons[button].size !== undefined) {
ButtonSize = dialogData.script[dialogData.index].buttons[button]?.size;
}
}
}
return ButtonSize;
}
export function getFontSize() {
return !isActiveNpcSet() ? 22 : npcDialogComponent.get(activeNPC).fontSize;
}
export function getButtonFontSize(button) {
let ButtonFontSize = 0;
if (activeNPC != 0 && npcDialogComponent.has(activeNPC)) {
let dialogData = npcDialogComponent.get(activeNPC);
if (dialogData.isQuestion && dialogData.buttons > button) {
if (dialogData.script[dialogData.index].buttons[button].fontSize !== undefined) {
ButtonFontSize = dialogData.script[dialogData.index].buttons[button]?.fontSize;
}
else {
ButtonFontSize = 16;
}
}
}
return ButtonFontSize;
}
export function displayDialog() {
return !isActiveNpcSet() ? false : npcDialogComponent.get(activeNPC).visible;
}
export function getWindowHeight() {
let windowHeights;
if (activeNPC != 0 && npcDialogComponent.has(activeNPC)) {
let dialogData = npcDialogComponent.get(activeNPC);
if (dialogData.isQuestion) {
if (dialogData.script[dialogData.index].windowHeight !== undefined) {
windowHeights = dialogData.script[dialogData.index]?.windowHeight;
}
}
}
return windowHeights;
}
export function displayButton(button) {
return !isActiveNpcSet() ? false : npcDialogComponent.get(activeNPC).isQuestion && npcDialogComponent.get(activeNPC).buttons >= button;
}
export function displayFirstButtonContainer() {
return !isActiveNpcSet() ? false : npcDialogComponent.get(activeNPC).isQuestion && npcDialogComponent.get(activeNPC).buttons >= 1;
}
export function displaySecondButtonContainer() {
return !isActiveNpcSet() ? false : npcDialogComponent.get(activeNPC).isQuestion && npcDialogComponent.get(activeNPC).buttons >= 3;
}
export function getTextPosition() {
return !isActiveNpcSet() ? { top: 0, left: 0 } : { top: npcDialogComponent.get(activeNPC).margin + npcDialogComponent.get(activeNPC).positionY, left: npcDialogComponent.get(activeNPC).positionX };
}
export function buttonClick(button) {
if (isActiveNpcSet()) {
confirmText(activeNPC, button);
}
}
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.length = 0;
dialogData.buttons = 0;
dialogData.margin = 0;
dialogData.displayPortrait = false;
dialogData.skipable = false;
dialogData.displayImage = false;
console.log('dialog data is now ', dialogData);
if (IsTypingDialog.has(npc)) {
IsTypingDialog.deleteFrom(npc);
}
clearNPC();
}
export function checkAddedLibFunction(num) {
return (num * 2);
}
export function talk(npc, dialog, startIndex, duration) {
npcDataComponent.get(npc).introduced = true;
if (npcDialogComponent.has(npc)) {
setActiveNPC(npc);
if (npcDataComponent.get(npc).state == NPCState.FOLLOWPATH) {
console.log("speaking dialog, need to stop path");
stopWalking(npc);
}
npcDataComponent.get(npc).state = NPCState.TALKING;
let index;
if (!startIndex) {
index = 0;
}
else if (typeof startIndex === 'number') {
index = startIndex;
}
else {
index = findDialogByName(dialog, startIndex);
}
openDialog(npc, dialog, index);
}
}
export function openDialog(npc, dialog, startIndex) {
console.log('script to talk is', dialog);
let dialogData = npcDialogComponent.get(npc);
dialogData.script = dialog.slice();
dialogData.index = startIndex;
console.log('dialog data is now', dialogData);
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);
}
export function addLineBreak(text, bubble) {
return lineBreak(text, bubble ? getBubbleTextLength(text) : 45);
}
function beginTyping(npc) {
let dialogData = npcDialogComponent.get(npc);
dialogData.fullText = addLineBreak(dialogData.script[dialogData.index].text);
dialogData.visible = true;
dialogData.typing = true;
dialogData.visibleText = "";
dialogData.visibleChars = 0;
dialogData.timer = 0;
dialogData.isQuestion = false;
dialogData.buttons = 0;
dialogData.displayPortrait = false;
dialogData.displayImage = false;
dialogData.skipable = false;
let currentText = dialogData.script[dialogData.index] ? dialogData.script[dialogData.index] : { text: '' };
if (currentText.portrait) {
dialogData.currentPortrait = currentText.portrait.path;
dialogData.portraitX = currentText.portrait.offsetX
? currentText.portrait.offsetX * UIscaleMultiplier + portraitXPos
: portraitXPos;
dialogData.portraitY = currentText.portrait.offsetY
? currentText.portrait.offsetY * UIscaleMultiplier + portraitYPos
: portraitYPos;
dialogData.portraitWidth = currentText.portrait.width ? currentText.portrait.width * UIscaleMultiplier : portraitScale;
dialogData.portraitHeight = currentText.portrait.height ? currentText.portrait.height * UIscaleMultiplier : portraitScale;
dialogData.displayPortrait = true;
}
else if (dialogData.defaultPortrait) {
dialogData.currentPortrait = dialogData.defaultPortraitTexture;
dialogData.displayPortrait = true;
}
else {
dialogData.displayPortrait = false;
}
if (dialogData.script[dialogData.index].isQuestion) {
dialogData.buttons = dialogData.script[dialogData.index].buttons.length;
if (dialogData.buttons >= 3) {
dialogData.margin = -25;
}
else if (dialogData.buttons >= 1) {
dialogData.margin = -25;
}
console.log(dialogData);
utils.timers.setTimeout(function () {
console.log('setting question to true');
dialogData.isQuestion = true;
}, 700);
}
dialogData.openTime = Math.floor(Date.now());
if (dialogData.script[dialogData.index].fontSize) {
dialogData.fontSize = dialogData.script[dialogData.index].fontSize;
}
if (dialogData.script[dialogData.index].skipable) {
dialogData.skipable = true;
}
else {
dialogData.skipable = false;
}
if (dialogData.script[dialogData.index].image) {
dialogData.dialogImageTexture = dialogData.script[dialogData.index].image.path;
dialogData.imageX = dialogData.script[dialogData.index].image.offsetX ? dialogData.script[dialogData.index].image.offsetX * UIscaleMultiplier + imageXPos : -40;
dialogData.imageY = dialogData.script[dialogData.index].image.offsetY ? dialogData.script[dialogData.index].image.offsetY * UIscaleMultiplier + imageYPos : 40;
dialogData.imageHeight = dialogData.script[dialogData.index].image.height ? dialogData.script[dialogData.index].height * UIscaleMultiplier : imageScale;
dialogData.imageWidth = dialogData.script[dialogData.index].image.width ? dialogData.script[dialogData.index].width * UIscaleMultiplier : imageScale;
dialogData.displayImage = true;
}
dialogData.positionX = dialogData.script[dialogData.index].offsetX ? dialogData.script[dialogData.index].offsetX * UIscaleMultiplier : '22%';
dialogData.positionY = dialogData.script[dialogData.index].offsetY ? dialogData.script[dialogData.index].offsetY * UIscaleMultiplier + textYPos : textYPos;
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);
}
}
}
export function addLineBreaks(dialog, bubble) {
let cleaned = dialog.slice();
cleaned.forEach((d) => {
d.text = lineBreak(d.text, bubble ? getBubbleTextLength(d.text) : 50);
});
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() {
console.log('handling click');
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);
}
}
}
export function rushText(npc) {
let dialogData = npcDialogComponent.get(npc);
dialogData.typing = false;
dialogData.timer = 0;
dialogData.visibleChars = dialogData.fullText.length;
dialogData.visibleText = dialogData.fullText;
}
export function confirmText(npc, mode) {
console.log('confirm text');
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++;
}
}
if (mode == ConfirmMode.Confirm) {
if (currentText.buttons && currentText.buttons.length >= 1) {
if (typeof currentText.buttons[0].goToDialog === 'number') {
dialogData.index = currentText.buttons[0].goToDialog;
}
if (currentText.buttons[0].triggeredActions) {
currentText.buttons[0].triggeredActions();
}
}
}
if (mode == ConfirmMode.Cancel) {
if (currentText.buttons && currentText.buttons.length >= 1) {
if (typeof currentText.buttons[1].goToDialog === 'number') {
dialogData.index = currentText.buttons[1].goToDialog;
}
if (currentText.buttons[1].triggeredActions) {
currentText.buttons[1].triggeredActions();
}
}
}
if (mode == ConfirmMode.Button3) {
if (currentText.buttons && currentText.buttons.length >= 1) {
if (typeof currentText.buttons[2].goToDialog === 'number') {
dialogData.index = currentText.buttons[2].goToDialog;
}
if (currentText.buttons[2].triggeredActions) {
currentText.buttons[2].triggeredActions();
}
}
}
if (mode == ConfirmMode.Button4) {
if (currentText.buttons && currentText.buttons.length >= 1) {
if (typeof currentText.buttons[3].goToDialog === 'number') {
dialogData.index = currentText.buttons[3].goToDialog;
}
if (currentText.buttons[3].triggeredActions) {
currentText.buttons[3].triggeredActions();
}
}
}
beginTyping(npc);
}
export function skipDialogs(npc) {
let dialogData = npcDialogComponent.get(npc);
if (!dialogData.visible || +Date.now() - dialogData.openTime < 100)
return;
while (dialogData.script[dialogData.index] &&
dialogData.script[dialogData.index].skipable &&
dialogData.script[dialogData.index].isQuestion) {
if (dialogData.script[dialogData.index].triggeredByNext) {
dialogData.script[dialogData.index].triggeredByNext();
}
if (dialogData.script[dialogData.index].skipable &&
dialogData.script[dialogData.index].isEndOfDialog) {
closeDialogWindow(npc);
return;
}
dialogData.index += 1;
}
confirmText(npc, ConfirmMode.Next);
}
export function getImageAtlasMapping(data) {
if (!data)
return [];
const { atlasWidth, atlasHeight, sourceWidth, sourceHeight, sourceTop, sourceLeft, } = data;
return [
sourceLeft / atlasWidth, (atlasHeight - sourceTop - sourceHeight) / atlasHeight,
sourceLeft / atlasWidth, (atlasHeight - sourceTop) / atlasHeight,
(sourceLeft + sourceWidth) / atlasWidth, (atlasHeight - sourceTop) / atlasHeight,
(sourceLeft + sourceWidth) / atlasWidth, (atlasHeight - sourceTop - sourceHeight) / atlasHeight,
];
}
export function realWidth(width) {
return width ? width : section.sourceWidth;
}
export function realHeight(height) {
return height ? height : section.sourceHeight;
}
export function findDialogByName(dialogs, name) {
for (let i = 0; i < dialogs.length; i++) {
if (dialogs[i].name && dialogs[i].name == name) {
return i;
}
}
return 0;
}
export function closeTag(dialogData, newChars) {
if (dialogData.visibleChars == 0 || newChars == 0)
return;
let openTag = false;
let closeTag = false;
for (let i = dialogData.visibleChars - newChars; i < dialogData.visibleChars; i++) {
if (!openTag) {
if (dialogData.fullText.substr(i, 1) == '<') {
openTag = true;
}
}
else {
if (dialogData.fullText.substr(i, 1) == '>') {
closeTag = true;
}
}
}
if (!openTag || closeTag) {
return;
}
while (dialogData.visibleChars < dialogData.fullText.length && dialogData.fullText.substr(dialogData.visibleChars - 1, 1) != '>') {
dialogData.visibleChars += 1;
}
return;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RpYWxvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFBO0FBRXZDLE9BQU8sRUFBRSxXQUFXLEVBQVUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFjLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQVksV0FBVyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ2xKLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUMsT0FBTyxFQUFxQixRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHNCQUFzQixFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEksT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHdkMsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUE7QUFDN0QsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUE7QUFDakUsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQW9CLElBQUksR0FBRyxFQUFFLENBQUE7QUFFaEUsTUFBTSxDQUFOLElBQVksV0FNVDtBQU5ILFdBQVksV0FBVztJQUNuQixtREFBVyxDQUFBO0lBQ1gsaURBQVUsQ0FBQTtJQUNWLDZDQUFRLENBQUE7SUFDUixtREFBVyxDQUFBO0lBQ1gsbURBQVcsQ0FBQTtBQUNiLENBQUMsRUFOUyxXQUFXLEtBQVgsV0FBVyxRQU1wQjtBQUVILE1BQU0sQ0FBQyxJQUFJ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QUssQ0FBQyxDQUFDLFFBQVEsRUFBQyxDQUFDO1FBQy9DLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFBO0lBQzVCLENBQUM7U0FDRyxDQUFDO1FBQ0gsVUFBVSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUE7SUFDN0IsQ0FBQztJQUVELElBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFDLENBQUM7UUFDNUMsVUFBVSxDQUFDLGtCQUFrQixHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUE7UUFDOUUsVUFBVSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFDL0osVUFBVSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQzlKLFVBQVUsQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxVQUFVLENB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QUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQzVDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtZQUMzQyxDQUFDO1FBQ0gsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLElBQUksSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0IsSUFBSSxXQUFXLENBQUMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzNELElBQUksT0FBTyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDMUQsVUFBVSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQTtZQUN0RCxDQUFDO1lBT0QsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQzVDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtZQUMzQyxDQUFDO1FBQ0gsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLElBQUksSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDOUIsSUFBSSxXQUFXLENBQUMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzNELElBQUksT0FBTyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDMUQsVUFBVSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQTtZQUN0RCxDQUFDO1lBT0QsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQzVDLFdBQVcsQ0FBQyxPQUFPLENB