dcl-npc-toolkit
Version:
A collection of tools for creating Non-Player-Characters (NPCs). These are capable of having conversations with the player, and play different animations.
390 lines • 57.4 kB
JavaScript
import { Color4 } from '@dcl/sdk/math';
import ReactEcs, { UiEntity } from '@dcl/sdk/react-ecs';
import { buttonClick, displayButton, displayDialog, displayFirstButtonContainer, displayImage, displayPortrait, displaySecondButtonContainer, displaySkipable, getButtonText, getFontSize, getButtonFontSize, getImage, getImageAtlasMapping, getLeftClickTheme, getPortrait, getText, getTextColor, getTextPosition, getTheme, handleDialogClick, imageHeight, imageWidth, portraitHeight, portraitWidth, positionImageX, positionImageY, positionPortaitX, positionPortaitY, realHeight, realWidth, skipDialogs, getWindowHeight } from './dialog';
import { sourcesComponentsCoordinates } from './uiResources';
import { activeNPC } from './npc';
export let lightTheme = 'https://decentraland.org/images/ui/light-atlas-v3.png';
export let darkTheme = 'https://decentraland.org/images/ui/dark-atlas-v3.png';
export let bubblesTexture = 'https://decentraland.org/images/ui/dialog-bubbles.png';
export let section = {
...sourcesComponentsCoordinates.backgrounds.NPCDialog,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let skipButtonSection = {
...sourcesComponentsCoordinates.buttons.F,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let skipButtonSectionBlack = {
...sourcesComponentsCoordinates.buttons.FBlack,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let leftClickSection = {
...sourcesComponentsCoordinates.icons.ClickWhite,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let leftClickSectionbBlack = {
...sourcesComponentsCoordinates.icons.ClickDark,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let primaryButtonSection = {
...sourcesComponentsCoordinates.buttons.E,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let secondaryButtonSection = {
...sourcesComponentsCoordinates.buttons.F,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let darkButtonSection = {
...sourcesComponentsCoordinates.buttons.buttonF,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let darkButtonCorner = {
...sourcesComponentsCoordinates.buttons.buttonFCorner,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let darkButtonEdge = {
...sourcesComponentsCoordinates.buttons.buttonFEdge,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let redButtonSection = {
...sourcesComponentsCoordinates.buttons.buttonE,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let redButtonCorner = {
...sourcesComponentsCoordinates.buttons.buttonECorner,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let redButtonEdge = {
...sourcesComponentsCoordinates.buttons.buttonEEdge,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export const COLOR_DIALOG_BG_LIGHT = Color4.create(1, 1, 1, 1);
export const COLOR_DIALOG_BG_DARK = Color4.create(0.243, 0.220, 0.286, 1);
export const COLOR_PRIMARY_BUTTON = Color4.create(0.953, 0.180, 0.357, 1);
export const COLOR_SECONDARY_BUTTON = Color4.create(0.243, 0.220, 0.286, 1);
export const COLOR_BUTTON_TEXT = Color4.White();
const COLOR_KEY_ICON_BG_LIGHT = Color4.White();
const COLOR_KEY_ICON_BORDER_LIGHT = Color4.create(0.78, 0.78, 0.80, 1);
const COLOR_KEY_ICON_TEXT_LIGHT = Color4.create(0.15, 0.15, 0.18, 1);
const COLOR_KEY_ICON_BG_DARK = Color4.create(0.243, 0.220, 0.286, 1);
const COLOR_KEY_ICON_BORDER_DARK = Color4.create(0.78, 0.78, 0.80, 1);
const COLOR_KEY_ICON_TEXT_DARK = Color4.White();
function isDarkTheme() {
return getTheme() === darkTheme;
}
function getDialogBgColor() {
return isDarkTheme() ? COLOR_DIALOG_BG_DARK : COLOR_DIALOG_BG_LIGHT;
}
function getKeyIconBgColor() {
return isDarkTheme() ? COLOR_KEY_ICON_BG_DARK : COLOR_KEY_ICON_BG_LIGHT;
}
function getKeyIconBorderColor() {
return isDarkTheme() ? COLOR_KEY_ICON_BORDER_DARK : COLOR_KEY_ICON_BORDER_LIGHT;
}
function getKeyIconTextColor() {
return isDarkTheme() ? COLOR_KEY_ICON_TEXT_DARK : COLOR_KEY_ICON_TEXT_LIGHT;
}
const HOVER_BRIGHTEN = 0.1;
function brighten(color, amount = HOVER_BRIGHTEN) {
return Color4.create(Math.min(1, color.r + amount), Math.min(1, color.g + amount), Math.min(1, color.b + amount), color.a);
}
let hoveredButton = null;
function buttonColor(buttonIdx, base) {
return hoveredButton === buttonIdx ? brighten(base) : base;
}
const DIALOG_WIDTH = 700;
const DIALOG_HEIGHT = 284;
const BUTTON_HEIGHT = 45;
const BUTTON_RADIUS = 12;
const DIALOG_RADIUS = 20;
const KEY_ICON_SIZE = 25;
const KEY_ICON_RADIUS = 6;
const SKIP_KEY_ICON_SIZE = 15;
export const NpcUtilsUi = () => {
const width = realWidth(DIALOG_WIDTH);
const height = realHeight(DIALOG_HEIGHT);
return (ReactEcs.createElement(UiEntity, { uiTransform: {
display: displayDialog() ? 'flex' : 'none',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'center',
positionType: 'absolute',
position: { bottom: '10%', left: '50%' },
margin: { top: -height / 2, left: -width / 2 },
padding: { top: 40, bottom: 40 },
width,
height: typeof (getWindowHeight()) === 'number' ? getWindowHeight() : 'auto',
minHeight: 25
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
positionType: 'absolute',
position: { top: 0, left: 0 },
width: '100%',
height: '100%',
borderRadius: DIALOG_RADIUS
}, uiBackground: {
color: getDialogBgColor()
}, onMouseDown: () => {
handleDialogClick();
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
display: displayPortrait() ? 'flex' : 'none',
width: portraitWidth(),
height: portraitHeight(),
positionType: 'absolute',
position: {
bottom: positionPortaitY(),
left: positionPortaitX()
}
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getPortrait()
}
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
display: displayImage() ? 'flex' : 'none',
width: imageWidth(),
height: imageHeight(),
positionType: 'absolute',
position: { bottom: positionImageY(), right: positionImageX() }
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getImage()
}
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
display: displaySkipable() ? 'flex' : 'none',
width: SKIP_KEY_ICON_SIZE,
height: SKIP_KEY_ICON_SIZE,
alignItems: 'center',
justifyContent: 'center',
positionType: 'absolute',
position: { bottom: '7%', left: '25%' },
borderRadius: 3,
borderWidth: 1,
borderColor: getKeyIconBorderColor()
}, uiBackground: {
color: getKeyIconBgColor()
}, uiText: {
value: 'F',
color: getKeyIconTextColor(),
fontSize: 10
}, onMouseDown: () => {
skipDialogs(activeNPC);
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
display: 'flex',
positionType: 'absolute',
alignSelf: 'center',
position: { left: '110%' }
}, uiText: {
value: 'Skip',
color: getTextColor(),
fontSize: 12
} })),
ReactEcs.createElement(UiEntity, { uiTransform: {
display: 'flex',
width: 24,
height: 36,
positionType: 'absolute',
position: { bottom: '5%', right: '2%' }
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(getLeftClickTheme())
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
height: 'auto',
width: 'auto',
alignSelf: 'flex-start',
alignItems: 'flex-start',
justifyContent: 'flex-start',
flexDirection: 'row',
position: getTextPosition(),
display: 'flex',
flexGrow: 1,
minHeight: 100
}, uiText: {
value: getText(),
color: getTextColor(),
fontSize: getFontSize(),
textAlign: 'middle-left'
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: 300,
height: 50,
alignItems: 'center',
flexDirection: 'row',
justifyContent: 'space-around',
display: displayFirstButtonContainer() ? 'flex' : 'none',
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
display: displayButton(1) ? 'flex' : 'none',
width: 'auto',
maxWidth: 300,
height: BUTTON_HEIGHT,
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'flex-start',
margin: { right: '5%' },
padding: { left: 8, right: 16 },
borderRadius: BUTTON_RADIUS
}, uiBackground: {
color: buttonColor(0, COLOR_SECONDARY_BUTTON)
}, onMouseDown: () => {
buttonClick(0);
}, onMouseEnter: () => { hoveredButton = 0; }, onMouseLeave: () => { if (hoveredButton === 0)
hoveredButton = null; } },
ReactEcs.createElement(UiEntity, { uiTransform: {
width: KEY_ICON_SIZE,
height: KEY_ICON_SIZE,
alignItems: 'center',
justifyContent: 'center',
borderRadius: KEY_ICON_RADIUS,
borderWidth: 1,
borderColor: getKeyIconBorderColor()
}, uiBackground: {
color: getKeyIconBgColor()
}, uiText: {
value: 'F',
color: getKeyIconTextColor(),
fontSize: 14
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: 'auto',
overflow: 'hidden',
maxWidth: 217,
padding: { left: 10, right: 5 }
}, uiText: {
value: getButtonText(0),
color: COLOR_BUTTON_TEXT,
fontSize: getButtonFontSize(0),
textAlign: 'middle-left',
textWrap: 'nowrap'
} })),
ReactEcs.createElement(UiEntity, { uiTransform: {
display: displayButton(2) ? 'flex' : 'none',
width: 'auto',
maxWidth: 300,
height: BUTTON_HEIGHT,
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'flex-start',
padding: { left: 8, right: 16 },
borderRadius: BUTTON_RADIUS
}, uiBackground: {
color: buttonColor(1, COLOR_PRIMARY_BUTTON)
}, onMouseDown: () => {
buttonClick(1);
}, onMouseEnter: () => { hoveredButton = 1; }, onMouseLeave: () => { if (hoveredButton === 1)
hoveredButton = null; } },
ReactEcs.createElement(UiEntity, { uiTransform: {
width: KEY_ICON_SIZE,
height: KEY_ICON_SIZE,
alignItems: 'center',
justifyContent: 'center',
borderRadius: KEY_ICON_RADIUS,
borderWidth: 1,
borderColor: getKeyIconBorderColor()
}, uiBackground: {
color: getKeyIconBgColor()
}, uiText: {
value: 'E',
color: getKeyIconTextColor(),
fontSize: 14
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: 'auto',
maxWidth: 217,
overflow: 'hidden',
padding: { left: 10, right: 5 }
}, uiText: {
value: getButtonText(1),
color: COLOR_BUTTON_TEXT,
fontSize: getButtonFontSize(1),
textAlign: 'middle-left',
textWrap: 'nowrap'
} }))),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: 300,
height: 50,
alignItems: 'center',
flexDirection: 'row',
justifyContent: 'space-around',
margin: { top: 20 },
display: displaySecondButtonContainer() ? 'flex' : 'none',
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
display: displayButton(3) ? 'flex' : 'none',
width: 'auto',
maxWidth: 300,
overflow: 'hidden',
height: BUTTON_HEIGHT,
alignItems: 'center',
justifyContent: 'center',
margin: { right: '5%' },
padding: { left: 20, right: 20 },
borderRadius: BUTTON_RADIUS
}, uiBackground: {
color: buttonColor(3, COLOR_SECONDARY_BUTTON)
}, onMouseDown: () => {
buttonClick(3);
}, onMouseEnter: () => { hoveredButton = 3; }, onMouseLeave: () => { if (hoveredButton === 3)
hoveredButton = null; } },
ReactEcs.createElement(UiEntity, { uiTransform: {
width: 'auto',
maxWidth: 252,
overflow: 'hidden',
}, uiText: {
value: getButtonText(2),
color: COLOR_BUTTON_TEXT,
fontSize: getButtonFontSize(2),
textAlign: 'middle-center',
textWrap: 'nowrap'
} })),
ReactEcs.createElement(UiEntity, { uiTransform: {
display: displayButton(4) ? 'flex' : 'none',
width: 'auto',
maxWidth: 300,
overflow: 'hidden',
height: BUTTON_HEIGHT,
alignItems: 'center',
justifyContent: 'center',
padding: { left: 20, right: 20 },
borderRadius: BUTTON_RADIUS
}, uiBackground: {
color: buttonColor(4, COLOR_SECONDARY_BUTTON)
}, onMouseDown: () => {
buttonClick(4);
}, onMouseEnter: () => { hoveredButton = 4; }, onMouseLeave: () => { if (hoveredButton === 4)
hoveredButton = null; } },
ReactEcs.createElement(UiEntity, { uiTransform: {
width: 'auto',
maxWidth: 252,
overflow: 'hidden',
}, uiText: {
value: getButtonText(3),
color: COLOR_BUTTON_TEXT,
fontSize: getButtonFontSize(3),
textAlign: 'middle-center',
textWrap: 'nowrap'
} })))));
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdWkudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDdEMsT0FBTyxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUN2RCxPQUFPLEVBQ0wsV0FBVyxFQUNYLGFBQWEsRUFDYixhQUFhLEVBQ2IsMkJBQTJCLEVBQzNCLFlBQVksRUFDWixlQUFlLEVBQ2YsNEJBQTRCLEVBQzVCLGVBQWUsRUFDZixhQUFhLEVBQ2IsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixRQUFRLEVBQ1Isb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQixXQUFXLEVBQ1gsT0FBTyxFQUNQLFlBQVksRUFDWixlQUFlLEVBQ2YsUUFBUSxFQUNSLGlCQUFpQixFQUNqQixXQUFXLEVBQ1gsVUFBVSxFQUNWLGNBQWMsRUFDZCxhQUFhLEVBQ2IsY0FBYyxFQUNkLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixTQUFTLEVBQ1QsV0FBVyxFQUNYLGVBQWUsRUFDaEIsTUFBTSxVQUFVLENBQUE7QUFDakIsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFFakMsTUFBTSxDQUFDLElBQUksVUFBVSxHQUFHLHVEQUF1RCxDQUFBO0FBQy9FLE1BQU0sQ0FBQyxJQUFJLFNBQVMsR0FBRyxzREFBc0QsQ0FBQTtBQUU3RSxNQUFNLENBQUMsSUFBSSxjQUFjLEdBQUcsdURBQXVELENBQUE7QUFNbkYsTUFBTSxDQUFDLElBQUksT0FBTyxHQUFHO0lBQ25CLEdBQUcsNEJBQTRCLENBQUMsV0FBVyxDQUFDLFNBQVM7SUFDckQsV0FBVyxFQUFFLDRCQUE0QixDQUFDLFdBQVc7SUFDckQsVUFBVSxFQUFFLDRCQUE0QixDQUFDLFVBQVU7Q0FDcEQsQ0FBQTtBQUVELE1BQU0sQ0FBQyxJQUFJLGlCQUFpQixHQUFHO0lBQzdCLEdBQUcsNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsV0FBVyxFQUFFLDRCQUE0QixDQUFDLFdBQVc7SUFDckQsVUFBVSxFQUFFLDRCQUE0QixDQUFDLFVBQVU7Q0FDcEQsQ0FBQTtBQUVELE1BQU0sQ0FBQyxJQUFJLHNCQUFzQixHQUFHO0lBQ2xDLEdBQUcsNEJBQTRCLENBQUMsT0FBTyxDQUFDLE1BQU07SUFDOUMsV0FBVyxFQUFFLDRCQUE0QixDQUFDLFdBQVc7SUFDckQsVUFBVSxFQUFFLDRCQUE0QixDQUFDLFVBQVU7Q0FDcEQsQ0FBQTtBQUVELE1BQU0sQ0FBQyxJQUFJLGdCQUFnQixHQUFHO0lBQzVCLEdBQUcsNEJBQTRCLENBQUMsS0FBSyxDQUFDLFVBQVU7SUFDaEQsV0FBVyxFQUFFLDRCQUE0QixDQUFDLFdBQVc7SUFDckQsVUFBVSxFQUFFLDRCQUE0QixDQUFDLFVBQVU7Q0FDcEQsQ0FBQTtBQUVELE1BQU0sQ0FBQyxJQUFJLHNCQUFzQixHQUFHO0lBQ2xDLEdBQUcsNEJBQTRCLENBQUMsS0FBSyxDQUFDLFNBQVM7SUFDL0MsV0FBVyxFQUFFLDRCQUE0QixDQUFDLFdBQVc7SUFDckQsVUFBVSxFQUFFLDRCQUE0QixDQUFDLFVBQVU7Q0FDcEQsQ0FBQTtBQUVELE1BQU0sQ0FBQyxJQUFJLG9CQUFvQixHQUFHO0lBQ2hDLEdBQUcsNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsV0FBVyxFQUFFLDRCQUE0QixDQUFDLFdBQVc7SUFDckQsVUFBVSxFQUFFLDRCQUE0QixDQUFDLFVBQVU7Q0FDcEQsQ0FBQTtBQUVELE1BQU0sQ0FBQyxJQUFJLHNCQUFzQixHQUFHO0lBQ2xDLEdBQUcsNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsV0FBVyxFQUFFLDRCQUE0QixDQUFDLFdBQVc7SUFDckQsVUFBVSxFQUFFLDRCQUE0QixDQUFDLFVBQVU7Q0FDcEQs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R0FBRyxJQUFJLENBQUEsQ0FBQyxDQUFDO2dCQUVyRSx1QkFBQyxRQUFRLElBQ1AsV0FBVyxFQUFFO3dCQUNYLEtBQUssRUFBRSxNQUFNO3dCQUNiLFFBQVEsRUFBRSxHQUFHO3dCQUNiLFFBQVEsRUFBRSxRQUFRO3FCQUNuQixFQUNELE1BQU0sRUFBRTt3QkFDTixLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQzt3QkFDdkIsS0FBSyxFQUFFLGlCQUFpQjt3QkFDeEIsUUFBUSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQzt3QkFDOUIsU0FBUyxFQUFFLGVBQWU7d0JBQzFCLFFBQVEsRUFBRSxRQUFRO3FCQUNuQixHQUNELENBQ08sQ0FDRixDQUNGLENBQ1osQ0FBQTtBQUNILENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbG9yNCB9IGZyb20gJ0BkY2wvc2RrL21hdGgnXG5pbXBvcnQgUmVhY3RFY3MsIHsgVWlFbnRpdHkgfSBmcm9tICdAZGNsL3Nkay9yZWFjdC1lY3MnXG5pbXBvcnQge1xuICBidXR0b25DbGljayxcbiAgZGlzcGxheUJ1dHRvbixcbiAgZGlzcGxheURpYWxvZyxcbiAgZGlzcGxheUZpcnN0QnV0dG9uQ29udGFpbmVyLFxuICBkaXNwbGF5SW1hZ2UsXG4gIGRpc3BsYXlQb3J0cmFpdCxcbiAgZGlzcGxheVNlY29uZEJ1dHRvbkNvbnRhaW5lcixcbiAgZGlzcGxheVNraXBhYmxlLFxuICBnZXRCdXR0b25UZXh0LFxuICBnZXRGb250U2l6ZSxcbiAgZ2V0QnV0dG9uRm9udFNpemUsXG4gIGdldEltYWdlLFxuICBnZXRJbWFnZUF0bGFzTWFwcGluZyxcbiAgZ2V0TGVmdENsaWNrVGhlbWUsXG4gIGdldFBvcnRyYWl0LFxuICBnZXRUZXh0LFxuICBnZXRUZXh0Q29sb3IsXG4gIGdldFRleHRQb3NpdGlvbixcbiAgZ2V0VGhlbWUsXG4gIGhhbmRsZURpYWxvZ0NsaWNrLFxuICBpbWFnZUhlaWdodCxcbiAgaW1hZ2VXaWR0aCxcbiAgcG9ydHJhaXRIZWlnaHQsXG4gIHBvcnRyYWl0V2lkdGgsXG4gIHBvc2l0aW9uSW1hZ2VYLFxuICBwb3NpdGlvbkltYWdlWSxcbiAgcG9zaXRpb25Qb3J0YWl0WCxcbiAgcG9zaXRpb25Qb3J0YWl0WSxcbiAgcmVhbEhlaWdodCxcbiAgcmVhbFdpZHRoLFxuICBza2lwRGlhbG9ncyxcbiAgZ2V0V2luZG93SGVpZ2h0XG59IGZyb20gJy4vZGlhbG9nJ1xuaW1wb3J0IHsgc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcyB9IGZyb20gJy4vdWlSZXNvdXJjZXMnXG5pbXBvcnQgeyBhY3RpdmVOUEMgfSBmcm9tICcuL25wYydcblxuZXhwb3J0IGxldCBsaWdodFRoZW1lID0gJ2h0dHBzOi8vZGVjZW50cmFsYW5kLm9yZy9pbWFnZXMvdWkvbGlnaHQtYXRsYXMtdjMucG5nJ1xuZXhwb3J0IGxldCBkYXJrVGhlbWUgPSAnaHR0cHM6Ly9kZWNlbnRyYWxhbmQub3JnL2ltYWdlcy91aS9kYXJrLWF0bGFzLXYzLnBuZydcblxuZXhwb3J0IGxldCBidWJibGVzVGV4dHVyZSA9ICdodHRwczovL2RlY2VudHJhbGFuZC5vcmcvaW1hZ2VzL3VpL2RpYWxvZy1idWJibGVzLnBuZydcblxuLy8gTGVnYWN5IHNlY3Rpb24gZXhwb3J0cyBwcmVzZXJ2ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBUaGUgbGlicmFyeSBub1xuLy8gbG9uZ2VyIHJlbmRlcnMgdGhlIFVJIGZyb20gdGhlc2UgYXRsYXMgc2xpY2VzIOKAlCBiYWNrZ3JvdW5kcyBhbmQgYnV0dG9ucyBhcmVcbi8vIG5vdyBkcmF3biB3aXRoIHNvbGlkIGNvbG9ycyBhbmQgYm9yZGVyUmFkaXVzIOKAlCBidXQgZXh0ZXJuYWwgY29kZSB0aGF0XG4vLyBpbXBvcnRzIHRoZW0gd2lsbCBzdGlsbCByZXNvbHZlLlxuZXhwb3J0IGxldCBzZWN0aW9uID0ge1xuICAuLi5zb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmJhY2tncm91bmRzLk5QQ0RpYWxvZyxcbiAgYXRsYXNIZWlnaHQ6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNIZWlnaHQsXG4gIGF0bGFzV2lkdGg6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNXaWR0aFxufVxuXG5leHBvcnQgbGV0IHNraXBCdXR0b25TZWN0aW9uID0ge1xuICAuLi5zb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmJ1dHRvbnMuRixcbiAgYXRsYXNIZWlnaHQ6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNIZWlnaHQsXG4gIGF0bGFzV2lkdGg6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNXaWR0aFxufVxuXG5leHBvcnQgbGV0IHNraXBCdXR0b25TZWN0aW9uQmxhY2sgPSB7XG4gIC4uLnNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYnV0dG9ucy5GQmxhY2ssXG4gIGF0bGFzSGVpZ2h0OiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzSGVpZ2h0LFxuICBhdGxhc1dpZHRoOiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzV2lkdGhcbn1cblxuZXhwb3J0IGxldCBsZWZ0Q2xpY2tTZWN0aW9uID0ge1xuICAuLi5zb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmljb25zLkNsaWNrV2hpdGUsXG4gIGF0bGFzSGVpZ2h0OiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzSGVpZ2h0LFxuICBhdGxhc1dpZHRoOiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzV2lkdGhcbn1cblxuZXhwb3J0IGxldCBsZWZ0Q2xpY2tTZWN0aW9uYkJsYWNrID0ge1xuICAuLi5zb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmljb25zLkNsaWNrRGFyayxcbiAgYXRsYXNIZWlnaHQ6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNIZWlnaHQsXG4gIGF0bGFzV2lkdGg6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNXaWR0aFxufVxuXG5leHBvcnQgbGV0IHByaW1hcnlCdXR0b25TZWN0aW9uID0ge1xuICAuLi5zb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmJ1dHRvbnMuRSxcbiAgYXRsYXNIZWlnaHQ6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNIZWlnaHQsXG4gIGF0bGFzV2lkdGg6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNXaWR0aFxufVxuXG5leHBvcnQgbGV0IHNlY29uZGFyeUJ1dHRvblNlY3Rpb24gPSB7XG4gIC4uLnNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYnV0dG9ucy5GLFxuICBhdGxhc0hlaWdodDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc0hlaWdodCxcbiAgYXRsYXNXaWR0aDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc1dpZHRoXG59XG5cbmV4cG9ydCBsZXQgZGFya0J1dHRvblNlY3Rpb24gPSB7XG4gIC4uLnNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYnV0dG9ucy5idXR0b25GLFxuICBhdGxhc0hlaWdodDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc0hlaWdodCxcbiAgYXRsYXNXaWR0aDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc1dpZHRoXG59XG5cbmV4cG9ydCBsZXQgZGFya0J1dHRvbkNvcm5lciA9IHtcbiAgLi4uc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5idXR0b25zLmJ1dHRvbkZDb3JuZXIsXG4gIGF0bGFzSGVpZ2h0OiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzSGVpZ2h0LFxuICBhdGxhc1dpZHRoOiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzV2lkdGhcbn1cblxuZXhwb3J0IGxldCBkYXJrQnV0dG9uRWRnZSA9IHtcbiAgLi4uc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5idXR0b25zLmJ1dHRvbkZFZGdlLFxuICBhdGxhc0hlaWdodDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc0hlaWdodCxcbiAgYXRsYXNXaWR0aDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc1dpZHRoXG59XG5cbmV4cG9ydCBsZXQgcmVkQnV0dG9uU2VjdGlvbiA9IHtcbiAgLi4uc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5idXR0b25zLmJ1dHRvbkUsXG4gIGF0bGFzSGVpZ2h0OiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzSGVpZ2h0LFxuICBhdGxhc1dpZHRoOiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzV2lkdGhcbn1cblxuZXhwb3J0IGxldCByZWRCdXR0b25Db3JuZXIgPSB7XG4gIC4uLnNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYnV0dG9ucy5idXR0b25FQ29ybmVyLFxuICBhdGxhc0hlaWdodDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc0hlaWdodCxcbiAgYXRsYXNXaWR0aDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc1dpZHRoXG59XG5cbmV4cG9ydCBsZXQgcmVkQnV0dG9uRWRnZSA9IHtcbiAgLi4uc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5idXR0b25zLmJ1dHRvbkVFZGdlLFxuICBhdGxhc0hlaWdodDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc0hlaWdodCxcbiAgYXRsYXNXaWR0aDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc1dpZHRoXG59XG5cbi8vIENvbG9yIHBhbGV0dGUgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIGF0bGFzIHRleHR1cmVzLlxuZXhwb3J0IGNvbnN0IENPTE9SX0RJQUxPR19CR19MSUdIVCA9IENvbG9yNC5jcmVhdGUoMSwgMSwgMSwgMSlcbmV4cG9ydCBjb25zdCBDT0xPUl9ESUFMT0dfQkdfREFSSyA9IENvbG9yNC5jcmVhdGUoMC4yNDMsIDAuMjIwLCAwLjI4NiwgMSlcbmV4cG9ydCBjb25zdCBDT0xPUl9QUklNQVJZX0JVVFRPTiA9IENvbG9yNC5jcmVhdGUoMC45NTMsIDAuMTgwLCAwLjM1NywgMSlcbmV4cG9ydCBjb25zdCBDT0xPUl9TRUNPTkRBUllfQlVUVE9OID0gQ29sb3I0LmNyZWF0ZSgwLjI0MywgMC4yMjAsIDAuMjg2LCAxKVxuZXhwb3J0IGNvbnN0IENPTE9SX0JVVFRPTl9URVhUID0gQ29sb3I0LldoaXRlKClcblxuY29uc3QgQ09MT1JfS0VZX0lDT05fQkdfTElHSFQgPSBDb2xvcjQuV2hpdGUoKVxuY29uc3QgQ09MT1JfS0VZX0lDT05fQk9SREVSX0xJR0hUID0gQ29sb3I0LmNyZWF0ZSgwLjc4LCAwLjc4LCAwLjgwLCAxKVxuY29uc3QgQ09MT1JfS0VZX0lDT05fVEVYVF9MSUdIVCA9IENvbG9yNC5jcmVhdGUoMC4xNSwgMC4xNSwgMC4xOCwgMSlcblxuY29uc3QgQ09MT1JfS0VZX0lDT05fQkdfREFSSyA9IENvbG9yNC5jcmVhdGUoMC4yNDMsIDAuMjIwLCAwLjI4NiwgMSlcbmNvbnN0IENPTE9SX0tFWV9JQ09OX0JPUkRFUl9EQVJLID0gQ29sb3I0LmNyZWF0ZSgwLjc4LCAwLjc4LCAwLjgwLCAxKVxuY29uc3QgQ09MT1JfS0VZX0lDT05fVEVYVF9EQVJLID0gQ29sb3I0LldoaXRlKClcblxuZnVuY3Rpb24gaXNEYXJrVGhlbWUoKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRUaGVtZSgpID09PSBkYXJrVGhlbWVcbn1cblxuZnVuY3Rpb24gZ2V0RGlhbG9nQmdDb2xvcigpOiBDb2xvcjQge1xuICByZXR1cm4gaXNEYXJrVGhlbWUoKSA/IENPTE9SX0RJQUxPR19CR19EQVJLIDogQ09MT1JfRElBTE9HX0JHX0xJR0hUXG59XG5cbmZ1bmN0aW9uIGdldEtleUljb25CZ0NvbG9yKCk6IENvbG9yNCB7XG4gIHJldHVybiBpc0RhcmtUaGVtZSgpID8gQ09MT1JfS0VZX0lDT05fQkdfREFSSyA6IENPTE9SX0tFWV9JQ09OX0JHX0xJR0hUXG59XG5cbmZ1bmN0aW9uIGdldEtleUljb25Cb3JkZXJDb2xvcigpOiBDb2xvcjQge1xuICByZXR1cm4gaXNEYXJrVGhlbWUoKSA/IENPTE9SX0tFWV9JQ09OX0JPUkRFUl9EQVJLIDogQ09MT1JfS0VZX0lDT05fQk9SREVSX0xJR0hUXG59XG5cbmZ1bmN0aW9uIGdldEtleUljb25UZXh0Q29sb3IoKTogQ29sb3I0IHtcbiAgcmV0dXJuIGlzRGFya1RoZW1lKCkgPyBDT0xPUl9LRVlfSUNPTl9URVhUX0RBUksgOiBDT0xPUl9LRVlfSUNPTl9URVhUX0xJR0hUXG59XG5cbmNvbnN0IEhPVkVSX0JSSUdIVEVOID0gMC4xXG5cbmZ1bmN0aW9uIGJyaWdodGVuKGNvbG9yOiBDb2xvcjQsIGFtb3VudDogbnVtYmVyID0gSE9WRVJfQlJJR0hURU4pOiBDb2xvcjQge1xuICByZXR1cm4gQ29sb3I0LmNyZWF0ZShcbiAgICBNYXRoLm1pbigxLCBjb2xvci5yICsgYW1vdW50KSxcbiAgICBNYXRoLm1pbigxLCBjb2xvci5nICsgYW1vdW50KSxcbiAgICBNYXRoLm1pbigxLCBjb2xvci5iICsgYW1vdW50KSxcbiAgICBjb2xvci5hXG4gIClcbn1cblxubGV0IGhvdmVyZWRCdXR0b246IG51bWJlciB8IG51bGwgPSBudWxsXG5cbmZ1bmN0aW9uIGJ1dHRvbkNvbG9yKGJ1dHRvbklkeDogbnVtYmVyLCBiYXNlOiBDb2xvcjQpOiBDb2xvcjQge1xuICByZXR1cm4gaG92ZXJlZEJ1dHRvbiA9PT0gYnV0dG9uSWR4ID8gYnJpZ2h0ZW4oYmFzZSkgOiBiYXNlXG59XG5cbmNvbnN0IERJQUxPR19XSURUSCA9IDcwMFxuY29uc3QgRElBTE9HX0hFSUdIVCA9IDI4NFxuY29uc3QgQlVUVE9OX0hFSUdIVCA9IDQ1XG5jb25zdCBCVVRUT05fUkFESVVTID0gMTJcbmNvbnN0IERJQUxPR19SQURJVVMgPSAyMFxuY29uc3QgS0VZX0lDT05fU0laRSA9IDI1XG5jb25zdCBLRVlfSUNPTl9SQURJVVMgPSA2XG5jb25zdCBTS0lQX0tFWV9JQ09OX1NJWkUgPSAxNVxuXG5leHBvcnQgY29uc3QgTnBjVXRpbHNVaSA9ICgpID0+IHtcblxuICBjb25zdCB3aWR0aCA9IHJlYWxXaWR0aChESUFMT0dfV0lEVEgpXG4gIGNvbnN0IGhlaWdodCA9IHJlYWxIZWlnaHQoRElBTE9HX0hFSUdIVClcblxuICByZXR1cm4gKFxuICAgIDxVaUVudGl0eVxuICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgZGlzcGxheTogZGlzcGxheURpYWxvZygpID8gJ2ZsZXgnIDogJ25vbmUnLFxuICAgICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgcG9zaXRpb25UeXBlOiAnYWJzb2x1dGUnLFxuICAgICAgICBwb3NpdGlvbjogeyBib3R0b206ICcxMCUnLCBsZWZ0OiAnNTAlJyB9LFxuICAgICAgICBtYXJnaW46IHsgdG9wOiAtaGVpZ2h0IC8gMiwgbGVmdDogLXdpZHRoIC8gMiB9LFxuICAgICAgICBwYWRkaW5nOiB7IHRvcDogNDAsIGJvdHRvbTogNDAgfSxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodDogdHlwZW9mIChnZXRXaW5kb3dIZWlnaHQoKSkgPT09ICdudW1iZXInID8gZ2V0V2luZG93SGVpZ2h0KCkgYXMgbnVtYmVyIDogJ2F1dG8nLFxuICAgICAgICBtaW5IZWlnaHQ6IDI1XG4gICAgICB9fVxuICAgID5cbiAgICAgIDxVaUVudGl0eVxuICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgIHBvc2l0aW9uVHlwZTogJ2Fic29sdXRlJyxcbiAgICAgICAgICBwb3NpdGlvbjogeyB0b3A6IDAsIGxlZnQ6IDAgfSxcbiAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogRElBTE9HX1JBRElVU1xuICAgICAgICB9fVxuICAgICAgICB1aUJhY2tncm91bmQ9e3tcbiAgICAgICAgICBjb2xvcjogZ2V0RGlhbG9nQmdDb2xvcigpXG4gICAgICAgIH19XG4gICAgICAgIG9uTW91c2VEb3duPXsoKSA9PiB7XG4gICAgICAgICAgaGFuZGxlRGlhbG9nQ2xpY2soKVxuICAgICAgICB9fVxuICAgICAgLz5cblxuICAgICAgPFVpRW50aXR5XG4gICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgZGlzcGxheTogZGlzcGxheVBvcnRyYWl0KCkgPyAnZmxleCcgOiAnbm9uZScsXG4gICAgICAgICAgd2lkdGg6IHBvcnRyYWl0V2lkdGgoKSxcbiAgICAgICAgICBoZWlnaHQ6IHBvcnRyYWl0SGVpZ2h0KCksXG4gICAgICAgICAgcG9zaXRpb25UeXBlOiAnYWJzb2x1dGUnLFxuICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICBib3R0b206IHBvc2l0aW9uUG9ydGFpdFkoKSxcbiAgICAgICAgICAgIGxlZnQ6IHBvc2l0aW9uUG9ydGFpdFgoKVxuICAgICAgICAgIH1cbiAgICAgICAgfX1cbiAgICAgICAgdWlCYWNrZ3JvdW5kPXt7XG4gICAgICAgICAgdGV4dHVyZU1vZGU6ICdzdHJldGNoJyxcbiAgICAgICAgICB0ZXh0dXJlOiB7XG4gICAgICAgICAgICBzcmM6IGdldFBvcnRyYWl0KClcbiAgICAgICAgICB9XG4gICAgICAgIH19XG4gICAgICAvPlxuXG4gICAgICA8VWlFbnRpdHlcbiAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICBkaXNwbGF5OiBkaXNwbGF5SW1hZ2UoKSA/ICdmbGV4JyA6ICdub25lJyxcbiAgICAgICAgICB3aWR0aDogaW1hZ2VXaWR0aCgpLFxuICAgICAgICAgIGhlaWdodDogaW1hZ2VIZWlnaHQoKSxcbiAgICAgICAgICBwb3NpdGlvblR5cGU6ICdhYnNvbHV0ZScsXG4gICAgICAgICAgcG9zaXRpb246IHsgYm90dG9tOiBwb3NpdGlvbkltYWdlWSgpLCByaWdodDogcG9zaXRpb25JbWFnZVgoKSB9XG4gICAgICAgIH19XG4gICAgICAgIHVpQmFja2dyb3VuZD17e1xuICAgICAgICAgIHRleHR1cmVNb2RlOiAnc3RyZXRjaCcsXG4gICAgICAgICAgdGV4dHVyZToge1xuICAgICAgICAgICAgc3JjOiBnZXRJbWFnZSgpXG4gICAgICAgICAgfVxuICAgICAgICB9fVxuICAgICAgLz5cblxuICAgICAgPFVpRW50aXR5XG4gICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgZGlzcGxheTogZGlzcGxheVNraXBhYmxlKCkgPyAnZmxleCcgOiAnbm9uZScsXG4gICAgICAgICAgd2lkdGg6IFNLSVBfS0VZX0lDT05fU0laRSxcbiAgICAgICAgICBoZWlnaHQ6IFNLSVBfS0VZX0lDT05fU0laRSxcbiAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgcG9zaXRpb25UeXBlOiAnYWJzb2x1dGUnLFxuICAgICAgICAgIHBvc2l0aW9uOiB7IGJvdHRvbTogJzclJywgbGVmdDogJzI1JScgfSxcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IDMsXG4gICAgICAgICAgYm9yZGVyV2lkdGg6IDEsXG4gICAgICAgICAgYm9yZGVyQ29sb3I6IGdldEtleUljb25Cb3JkZXJDb2xvcigpXG4gICAgICAgIH19XG4gICAgICAgIHVpQmFja2dyb3VuZD17e1xuICAgICAgICAgIGNvbG9yOiBnZXRLZXlJY29uQmdDb2xvcigpXG4gICAgICAgIH19XG4gICAgICAgIHVpVGV4dD17e1xuICAgICAgICAgIHZhbHVlOiAnRicsXG4gICAgICAgICAgY29sb3I6IGdldEtleUljb25UZXh0Q29sb3IoKSxcbiAgICAgICAgICBmb250U2l6ZTogMTBcbiAgICAgICAgfX1cbiAgICAgICAgb25Nb3VzZURvd249eygpID0+IHtcbiAgICAgICAgICBza2lwRGlhbG9ncyhhY3RpdmVOUEMpXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIDxVaUVudGl0eVxuICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICBwb3NpdGlvblR5cGU6ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICBhbGlnblNlbGY6ICdjZW50ZXInLFxuICAgICAgICAgICAgcG9zaXRpb246IHsgbGVmdDogJzExMCUnIH1cbiAgICAgICAgICB9fVxuICAgICAgICAgIHVpVGV4dD17e1xuICAgICAgICAgICAgdmFsdWU6ICdTa2lwJyxcbiAgICAgICAgICAgIGNvbG9yOiBnZXRUZXh0Q29sb3IoKSxcbiAgICAgICAgICAgIGZvbnRTaXplOiAxMlxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICA8L1VpRW50aXR5PlxuXG4gICAgICA8VWlFbnRpdHlcbiAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICAgIGhlaWdodDogMzYsXG4gICAgICAgICAgcG9zaXRpb25UeXBlOiAnYWJzb2x1dGUnLFxuICAgICAgICAgIHBvc2l0aW9uOiB7IGJvdHRvbTogJzUlJywgcmlnaHQ6ICcyJScgfVxuICAgICAgICB9fVxuICAgICAgICB1aUJhY2tncm91bmQ9e3tcbiAgICAgICAgICB0ZXh0dXJlTW9kZTogJ3N0cmV0Y2gnLFxuICAgICAgICAgIHRleHR1cmU6IHtcbiAgICAgICAgICAgIHNyYzogZ2V0VGhlbWUoKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXZzOiBnZXRJbWFnZUF0bGFzTWFwcGluZyhnZXRMZWZ0Q2xpY2tUaGVtZSgpKVxuICAgICAgICB9fVxuICAgICAgLz5cblxuICAgICAgPFVpRW50aXR5XG4gICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgaGVpZ2h0OiAnYXV0bycsXG4gICAgICAgICAgd2lkdGg6ICdhdXRvJyxcbiAgICAgICAgICBhbGlnblNlbGY6ICdmbGV4LXN0YXJ0JyxcbiAgICAgICAgICBhbGlnbkl0ZW1zOiAnZmxleC1zdGFydCcsXG4gICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdmbGV4LXN0YXJ0JyxcbiAgICAgICAgICBmbGV4RGlyZWN0aW9uOiAncm93JyxcbiAgICAgICAgICBwb3NpdGlvbjogZ2V0VGV4dFBvc2l0aW9uKCksXG4gICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgIGZsZXhHcm93OiAxLFxuICAgICAgICAgIG1pbkhlaWdodDogMTAwXG4gICAgICAgIH19XG4gICAgICAgIHVpVGV4dD17e1xuICAgICAgICAgIHZhbHVlOiBnZXRUZXh0KCksXG4gICAgICAgICAgY29sb3I6IGdldFRleHRDb2xvcigpLFxuICAgICAgICAgIGZvbnRTaXplOiBnZXRGb250U2l6ZSgpLFxuICAgICAgICAgIHRleHRBbGlnbjogJ21pZGRsZS1sZWZ0J1xuICAgICAgICB9fVxuICAgICAgLz5cblxuICAgICAgPFVpRW50aXR5XG4gICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgd2lkdGg6IDMwMCxcbiAgICAgICAgICBoZWlnaHQ6IDUwLFxuICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdyb3cnLFxuICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYXJvdW5kJyxcbiAgICAgICAgICBkaXNwbGF5OiBkaXNwbGF5Rmlyc3RCdXR0b25Db250YWluZXIoKSA/ICdmbGV4JyA6ICdub25lJyxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgey8qIEJ1dHRvbjEgKFRvcC1MZWZ0KSDigJQgc2Vjb25kYXJ5L2Rhcmsgd2l0aCBGIGtleSBwcm9tcHQgKi99XG4gICAgICAgIDxVaUVudGl0eVxuICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICBkaXNwbGF5OiBkaXNwbGF5QnV0dG9uKDEpID8gJ2ZsZXgnIDogJ25vbmUnLFxuICAgICAgICAgICAgd2lkdGg6ICdhdXRvJyxcbiAgICAgICAgICAgIG1heFdpZHRoOiAzMDAsXG4gICAgICAgICAgICBoZWlnaHQ6IEJVVFRPTl9IRUlHSFQsXG4gICAgICAgICAgICBmbGV4RGlyZWN0aW9uOiAncm93JyxcbiAgICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdmbGV4LXN0YXJ0JyxcbiAgICAgICAgICAgIG1hcmdpbjogeyByaWdodDogJzUlJyB9LFxuICAgICAgICAgICAgcGFkZGluZzogeyBsZWZ0OiA4LCByaWdodDogMTYgfSxcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogQlVUVE9OX1JBRElVU1xuICAgICAgICAgIH19XG4gICAgICAgICAgdWlCYWNrZ3JvdW5kPXt7XG4gICAgICAgICAgICBjb2xvcjogYnV0dG9uQ29sb3IoMCwgQ09MT1JfU0VDT05EQVJZX0JVVFRPTilcbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uTW91c2VEb3duPXsoKSA9PiB7XG4gICAgICAgICAgICBidXR0b25DbGljaygwKVxuICAgICAgICAgIH19XG4gICAgICAgICAgb25Nb3VzZUVudGVyPXsoKSA9PiB7IGhvdmVyZWRCdXR0b24gPSAwIH19XG4gICAgICAgICAgb25Nb3VzZUxlYXZlPXsoKSA9PiB7IGlmIChob3ZlcmVkQnV0dG9uID09PSAwKSBob3ZlcmVkQnV0dG9uID0gbnVsbCB9fVxuICAgICAgICA+XG4gICAgICAgICAgPFVpRW50aXR5XG4gICAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgICB3aWR0aDogS0VZX0lDT05fU0laRSxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBLRVlfSUNPTl9TSVpFLFxuICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IEtFWV9JQ09OX1JBRElVUyxcbiAgICAgICAgICAgICAgYm9yZGVyV2lkdGg6IDEsXG4gICAgICAgICAgICAgIGJvcmRlckNvbG9yOiBnZXRLZXlJY29uQm9yZGVyQ29sb3IoKVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHVpQmFja2dyb3VuZD17e1xuICAgICAgICAgICAgICBjb2xvcjogZ2V0S2V5SWNvbkJnQ29sb3IoKVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHVpVGV4dD17e1xuICAgICAgICAgICAgICB2YWx1ZTogJ0YnLFxuICAgICAgICAgICAgICBjb2xvcjogZ2V0S2V5SWNvblRleHRDb2xvcigpLFxuICAgICAgICAgICAgICBmb250U2l6ZTogMTRcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8VWlFbnRpdHlcbiAgICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICAgIHdpZHRoOiAnYXV0bycsXG4gICAgICAgICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgICAgICAgbWF4V2lkdGg6IDIxNyxcbiAgICAgICAgICAgICAgcGFkZGluZzogeyBsZWZ0OiAxMCwgcmlnaHQ6IDUgfVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHVpVGV4dD17e1xuICAgICAgICAgICAgICB2YWx1ZTogZ2V0QnV0dG9uVGV4dCgwKSxcbiAgICAgICAgICAgICAgY29sb3I6IENPTE9SX0JVVFRPTl9URVhULFxuICAgICAgICAgICAgICBmb250U2l6ZTogZ2V0QnV0dG9uRm9udFNpemUoMCksXG4gICAgICAgICAgICAgIHRleHRBbGlnbjogJ21pZGRsZS1sZWZ0JyxcbiAgICAgICAgICAgICAgdGV4dFdyYXA6ICdub3dyYXAnXG4gICAgICAgICAgICB9fVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvVWlFbnRpdHk+XG5cbiAgICAgICAgey8qIEJ1dHRvbjIgKFRvcC1SaWdodCkg4oCUIHByaW1hcnkvcmVkIHdpdGggRSBrZXkgcHJvbXB0ICovfVxuICAgICAgICA8VWlFbnRpdHlcbiAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgZGlzcGxheTogZGlzcGxheUJ1dHRvbigyKSA/ICdmbGV4JyA6ICdub25lJyxcbiAgICAgICAgICAgIHdpZHRoOiAnYXV0bycsXG4gICAgICAgICAgICBtYXhXaWR0aDogMzAwLFxuICAgICAgICAgICAgaGVpZ2h0OiBCVVRUT05fSEVJR0hULFxuICAgICAgICAgICAgZmxleERpcmVjdGlvbjogJ3JvdycsXG4gICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnZmxleC1zdGFydCcsXG4gICAgICAgICAgICBwYWRkaW5nOiB7IGxlZnQ6IDgsIHJpZ2h0OiAxNiB9LFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBCVVRUT05fUkFESVVTXG4gICAgICAgICAgfX1cbiAgICAgICAgICB1aUJhY2tncm91bmQ9e3tcbiAgICAgICAgICAgIGNvbG9yOiBidXR0b25Db2xvcigxLCBDT0xPUl9QUklNQVJZX0JVVFRPTilcbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uTW91c2VEb3duPXsoKSA9PiB7XG4gICAgICAgICAgICBidXR0b25DbGljaygxKVxuICAgICAgICAgIH19XG4gICAgICAgICAgb25Nb3VzZUVudGVyPXsoKSA9PiB7IGhvdmVyZWRCdXR0b24gPSAxIH19XG4gICAgICAgICAgb25Nb3VzZUxlYXZlPXsoKSA9PiB7IGlmIChob3ZlcmVkQnV0dG9uID09PSAxKSBob3ZlcmVkQnV0dG9uID0gbnVsbCB9fVxuICAgICAgICA+XG4gICAgICAgICAgPFVpRW50aXR5XG4gICAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgICB3aWR0aDogS0VZX0lDT05fU0laRSxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBLRVlfSUNPTl9TSVpFLFxuICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IEtFWV9JQ09OX1JBRElVUyxcbiAgICAgICAgICAgICAgYm9yZGVyV2lkdGg6IDEsXG4gICAgICAgICAgICAgIGJvcmRlckNvbG9yOiBnZXRLZXlJY29uQm9yZGVyQ29sb3IoKVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHVpQmFja2dyb3VuZD17e1xuICAgICAgICAgICAgICBjb2xvcjogZ2V0S2V5SWNvbkJnQ29sb3IoKVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHVpVGV4dD17e1xuICAgICAgICAgICAgICB2YWx1ZTogJ0UnLFxuICAgICAgICAgICAgICBjb2xvcjogZ2V0S2V5SWNvblRleHRDb2xvcigpLFxuICAgICAgICAgICAgICBmb250U2l6ZTogMTRcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8VWlFbnRpdHlcbiAgICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICAgIHdpZHRoOiAnYXV0bycsXG4gICAgICAgICAgICAgIG1heFdpZHRoOiAyMTcsXG4gICAgICAgICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgICAgICAgcGFkZGluZzogeyBsZWZ0OiAxMCwgcmlnaHQ6IDUgfVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHVpVGV4dD17e1xuICAgICAgICAgICAgICB2YWx1ZTogZ2V0QnV0dG9uVGV4dCgxKSxcbiAgICAgICAgICAgICAgY29sb3I6IENPTE9SX0JVVFRPTl9URVhULFxuICAgICAgICAgICAgICBmb250U2l6ZTogZ2V0QnV0dG9uRm9udFNpemUoMSksXG4gICAgICAgICAgICAgIHRleHRBbGlnbjogJ21pZGRsZS1sZWZ0JyxcbiAgICAgICAgICAgICAgdGV4dFdyYXA6ICdub3dyYXAnXG4gICAgICAgICAgICB9fVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvVWlFbnRpdHk+XG4gICAgICA8L1VpRW50aXR5PlxuXG4gICAgICB7LyogU2Vjb25kIHJvdyBvZiBidXR0b25zICovfVxuICAgICAgPFVpRW50aXR5XG4gICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgd2lkdGg6IDMwMCxcbiAgICAgICAgICBoZWlnaHQ6IDUwLFxuICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdyb3cnLFxuICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYXJvdW5kJyxcbiAgICAgICAgICBtYXJnaW46IHsgdG9wOiAyMCB9LFxuICAgICAgICAgIGRpc3BsYXk6IGRpc3BsYXlTZWNvbmRCdXR0b25Db250YWluZXIoKSA/ICdmbGV4JyA6ICdub25lJyxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgey8qIEJ1dHRvbjMg4oCUIHNlY29uZGFyeS9kYXJrLCBubyBrZXkgcHJvbXB0ICovfVxuICAgICAgICA8VWlFbnRpdHlcbiAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgZGlzcGxheTogZGlzcGxheUJ1dHRvbigzKSA/ICdmbGV4JyA6ICdub25lJyxcbiAgICAgICAgICAgIHdpZHRoOiAnYXV0bycsXG4gICAgICAgICAgICBtYXhXaWR0aDogMzAwLFxuICAgICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICAgICAgaGVpZ2h0OiBCVVRUT05fSEVJR0hULFxuICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgICBtYXJnaW46IHsgcmlnaHQ6ICc1JScgfSxcbiAgICAgICAgICAgIHBhZGRpbmc6IHsgbGVmdDogMjAsIHJpZ2h0OiAyMCB9LFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBCVVRUT05fUkFESVVTXG4gICAgICAgICAgfX1cbiAgICAgICAgICB1aUJhY2tncm91bmQ9e3tcbiAgICAgICAgICAgIGNvbG9yOiBidXR0b25Db2xvcigzLCBDT0xPUl9TRUNPTkRBUllfQlVUVE9OKVxuICAgICAgICAgIH19XG4gICAgICAgICAgb25Nb3VzZURvd249eygpID0+IHtcbiAgICAgICAgICAgIGJ1dHRvbkNsaWNrKDMpXG4gICAgICAgICAgfX1cbiAgICAgICAgICBvbk1vdXNlRW50ZXI9eygpID0+IHsgaG92ZXJlZEJ1dHRvbiA9IDMgfX1cbiAgICAgICAgICBvbk1vdXNlTGVhdmU9eygpID0+IHsgaWYgKGhvdmVyZWRCdXR0b24gPT09IDMpIGhvdmVyZWRCdXR0b24gPSBudWxsIH19XG4gICAgICAgID5cbiAgICAgICAgICA8VWlFbnRpdHlcbiAgICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICAgIHdpZHRoOiAnYXV0bycsXG4gICAgICAgICAgICAgIG1heFdpZHRoOiAyNTIsXG4gICAgICAgICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICB1aVRleHQ9e3tcbiAgICAgICAgICAgICAgdmFsdWU6IGdldEJ1dHRvblRleHQoMiksXG4gICAgICAgICAgICAgIGNvbG9yOiBDT0xPUl9CVVRUT05fVEVYVCxcbiAgICAgICAgICAgICAgZm9udFNpemU6IGdldEJ1dHRvbkZvbnRTaXplKDIpLFxuICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdtaWRkbGUtY2VudGVyJyxcbiAgICAgICAgICAgICAgdGV4dFdyYXA6ICdub3dyYXAnXG4gICAgICAgICAgICB9fVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvVWlFbnRpdHk+XG5cbiAgICAgICAgey8qIEJ1dHRvbjQg4oCUIHNlY29uZGFyeS9kYXJrLCBubyBrZXkgcHJvbXB0ICovfVxuICAgICAgICA8VWlFbnRpdHlcbiAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgZGlzcGxheTogZGlzcGxheUJ1dHRvbig0KSA/ICdmbGV4JyA6ICdub25lJyxcbiAgICAgICAgICAgIHdpZHRoOiAnYXV0bycsXG4gICAgICAgICAgICBtYXhXaWR0aDogMzAwLFxuICAgICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICAgICAgaGVpZ2h0OiBCVVRUT05fSEVJR0hULFxuICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgICBwYWRkaW5nOiB7IGxlZnQ6IDIwLCByaWdodDogMjAgfSxcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogQlVUVE9OX1JBRElVU1xuICAgICAgICAgIH19XG4gICAgICAgICAgdWlCYWNrZ3JvdW5kPXt7XG4gICAgICAgICAgICBjb2xvcjogYnV0dG9uQ29sb3IoNCwgQ09MT1JfU0VDT05EQVJZX0JVVFRPTilcbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uTW91c2VEb3duPXsoKSA9PiB7XG4gICAgICAgICAgICBidXR0b25DbGljayg0KVxuICAgICAgICAgIH19XG4gICAgICAgICAgb25Nb3VzZUVudGVyPXsoKSA9PiB7IGhvdmVyZWRCdXR0b24gPSA0IH19XG4gICAgICAgICAgb25Nb3VzZUxlYXZlPXsoKSA9PiB7IGlmIChob3ZlcmVkQnV0dG9uID09PSA0KSBob3ZlcmVkQnV0dG9uID0gbnVsbCB9fVxuICAgICAgICA+XG4gICAgICAgICAgPFVpRW50aXR5XG4gICAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgICB3aWR0aDogJ2F1dG8nLFxuICAgICAgICAgICAgICBtYXhXaWR0aDogMjUyLFxuICAgICAgICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgdWlUZXh0PXt7XG4gICAgICAgICAgICAgIHZhbHVlOiBnZXRCdXR0b25UZXh0KDMpLFxuICAgICAgICAgICAgICBjb2xvcjogQ09MT1JfQlVUVE9OX1RFWFQsXG4gICAgICAgICAgICAgIGZvbnRTaXplOiBnZXRCdXR0b25Gb250U2l6ZSgzKSxcbiAgICAgICAgICAgICAgdGV4dEFsaWduOiAnbWlkZGxlLWNlbnRlcicsXG4gICAgICAgICAgICAgIHRleHRXcmFwOiAnbm93cmFwJ1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L1VpRW50aXR5PlxuICAgICAgPC9VaUVudGl0eT5cbiAgICA8L1VpRW50aXR5PlxuICApXG59XG4iXX0=