From 7ae29a603072a9d00981a0ad569614829ea77cd4 Mon Sep 17 00:00:00 2001 From: Michael Shanks Date: Fri, 31 Jan 2020 23:11:50 +0000 Subject: [PATCH] #24 - Control Flow (#79) * removed binding references to array type * refactored initialiseChildren into seperate file * render function, with code blocks - tested simple cases * few mores tests for control flow * md components - getting TestApp to work * new render wrapper - bug fix * client: providing access to component root elements * code editor working * code editor improvements --- .../bootstrap-components/dist/generators.js | 2 +- packages/builder/package.json | 1 + .../src/builderStore/buildCodeForScreens.js | 35 + packages/builder/src/builderStore/store.js | 28 +- .../builder/src/builderStore/store.js.orig | 799 ++++++++++++++++++ .../src/common/Icons/CircleIndicator.svelte | 3 + packages/builder/src/common/Icons/index.js | 3 +- .../builder/src/common/Icons/index.js.orig | 12 + packages/builder/src/index.html | 2 + packages/builder/src/main.js | 2 + .../src/userInterface/CodeEditor.svelte | 158 ++-- .../src/userInterface/ComponentPanel.svelte | 25 +- .../userInterface/ComponentPanel.svelte.orig | 149 ++++ .../userInterface/CurrentItemPreview.svelte | 3 + .../src/userInterface/PropsView.svelte | 2 +- .../src/userInterface/PropsView.svelte.orig | 74 ++ .../builder/tests/buildCodeForScreen.spec.js | 64 ++ packages/client/src/index.js | 2 + .../client/src/render/initialiseChildren.js | 2 +- packages/client/src/render/renderComponent.js | 2 +- packages/server/utilities/builder/buildApp.js | 5 +- .../standard-components/dist/generators.js | 2 +- 22 files changed, 1276 insertions(+), 99 deletions(-) create mode 100644 packages/builder/src/builderStore/buildCodeForScreens.js create mode 100644 packages/builder/src/builderStore/store.js.orig create mode 100644 packages/builder/src/common/Icons/CircleIndicator.svelte create mode 100644 packages/builder/src/common/Icons/index.js.orig create mode 100644 packages/builder/src/userInterface/ComponentPanel.svelte.orig create mode 100644 packages/builder/src/userInterface/PropsView.svelte.orig create mode 100644 packages/builder/tests/buildCodeForScreen.spec.js diff --git a/packages/bootstrap-components/dist/generators.js b/packages/bootstrap-components/dist/generators.js index 6f18e32cae..1021b09753 100644 --- a/packages/bootstrap-components/dist/generators.js +++ b/packages/bootstrap-components/dist/generators.js @@ -447,4 +447,4 @@ const navItem = ({record}) => ({ }); export { app, forms, indexTables, recordHomePageComponents as recordHomepages }; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9ycy5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL2dlbmVyYXRvcnMvYnV0dG9uR2VuZXJhdG9ycy5qcyIsIi4uL3NyYy9nZW5lcmF0b3JzL2Zvcm1zR2VuZXJhdG9yLmpzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2V0UmVjb3JkUGF0aC5qcyIsIi4uL3NyYy9nZW5lcmF0b3JzL2luZGV4VGFibGVzR2VuZXJhdG9yLmpzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVjb3JkSG9tZVBhZ2VHZW5lcmF0b3IuanMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9zZWxlY3RlZE5hdkNvbnRlbnRHZW5lcmF0b3IuanMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hcHBHZW5lcmF0b3IuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGJ1dHRvbnMgPSAoKSA9PiBbXG4gICAge1xuICAgICAgICBuYW1lOiBcImNvbW1vbi9QcmltYXJ5IEJ1dHRvblwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJCb290c3RyYXAgcHJpbWFyeSBidXR0b24gXCIsXG4gICAgICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2J1dHRvblwiLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJjb21tb24vRGVmYXVsdCBCdXR0b25cIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiQm9vdHN0cmFwIGRlZmF1bHQgYnV0dG9uXCIsXG4gICAgICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2J1dHRvblwiLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcImJ0biBidG4tc2Vjb25kYXJ5XCJcbiAgICAgICAgfVxuICAgIH1cbl0iLCJpbXBvcnQge2J1dHRvbnN9IGZyb20gXCIuL2J1dHRvbkdlbmVyYXRvcnNcIjtcblxuZXhwb3J0IGNvbnN0IGZvcm1zID0gKHtyZWNvcmRzLCBpbmRleGVzLCBoZWxwZXJzfSkgPT4gXG4gICAgW1xuICAgICAgICAuLi5yZWNvcmRzLm1hcChyb290KSxcbiAgICAgICAgLi4uYnV0dG9ucyh7cmVjb3JkcywgaW5kZXhlcywgaGVscGVyc30pXG4gICAgXTtcblxuZXhwb3J0IGNvbnN0IGZvcm1OYW1lID0gcmVjb3JkID0+ICBgJHtyZWNvcmQubmFtZX0vJHtyZWNvcmQubmFtZX0gRm9ybWA7XG5cbmNvbnN0IHJvb3QgPSByZWNvcmQgPT4gKHtcbiAgICBuYW1lOiBmb3JtTmFtZShyZWNvcmQpLFxuICAgIGRlc2NyaXB0aW9uOiBgQ29udHJvbCBmb3IgY3JlYXRpbmcvdXBkYXRpbmcgJyR7cmVjb3JkLm5vZGVLZXkoKX0nIGAsXG4gICAgaW5oZXJpdHM6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvZGl2XCIsXG4gICAgcHJvcHM6IHtcbiAgICAgICAgY2xhc3NOYW1lOlwicC0xXCIsXG4gICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvaDNcIixcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogYEVkaXQgJHtyZWNvcmQubmFtZX1gLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmb3JtKHJlY29yZCksXG4gICAgICAgICAgICBzYXZlQ2FuY2VsQnV0dG9ucyhyZWNvcmQpXG4gICAgICAgIF1cbiAgICB9XG59KSBcblxuY29uc3QgZm9ybSA9IHJlY29yZCA9PiAoe1xuICAgIGNvbXBvbmVudDoge1xuICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2Zvcm1cIixcbiAgICAgICAgZm9ybUNvbnRyb2xzOiBcbiAgICAgICAgICAgIHJlY29yZC5maWVsZHMubWFwKGYgPT4gZm9ybUNvbnRyb2wocmVjb3JkLCBmKSlcbiAgICB9XG59KVxuXG5jb25zdCBmb3JtQ29udHJvbCA9IChyZWNvcmQsIGZpZWxkKSA9PiB7XG4gICAgaWYoZmllbGQudHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBmaWVsZC50eXBlT3B0aW9ucy52YWx1ZXMgJiYgZmllbGQudHlwZU9wdGlvbnMudmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuICh7XG4gICAgICAgICAgICBjb250cm9sOiB7XG4gICAgICAgICAgICAgICAgX2NvbXBvbmVudDogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy9zZWxlY3RcIixcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBmaWVsZC50eXBlT3B0aW9ucy52YWx1ZXMubWFwKHYgPT4gKHtpZDp2LCB2YWx1ZTp2fSkpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgIFwiIyNiYnN0YXRlXCI6YCR7cmVjb3JkLm5hbWV9LiR7ZmllbGQubmFtZX1gLFxuICAgICAgICAgICAgICAgICAgICBcIiMjYmJzb3VyY2VcIjpcInN0b3JlXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhYmVsOiBmaWVsZC5sYWJlbFxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gKHtcbiAgICAgICAgICAgIGNvbnRyb2w6IHtcbiAgICAgICAgICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2lucHV0XCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgXCIjI2Jic3RhdGVcIjpgJHtyZWNvcmQubmFtZX0uJHtmaWVsZC5uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgIFwiIyNiYnNvdXJjZVwiOlwic3RvcmVcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImZvcm0tY29udHJvbFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IGZpZWxkLnR5cGUgPT09IFwic3RyaW5nXCIgPyBcInRleHRcIlxuICAgICAgICAgICAgICAgICAgICA6IGZpZWxkLnR5cGUgPT09IFwiZGF0ZXRpbWVcIiA/IFwiZGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIDogZmllbGQudHlwZSA9PT0gXCJudW1iZXJcIiA/IFwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcInRleHRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhYmVsOiBmaWVsZC5sYWJlbFxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmNvbnN0IHNhdmVDYW5jZWxCdXR0b25zID0gKHJlY29yZCkgPT4gKHtcbiAgICBjb21wb25lbnQ6IHtcbiAgICAgICAgX2NvbXBvbmVudDogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy9zdGFja3BhbmVsXCIsXG4gICAgICAgIGRpcmVjdGlvbjogXCJob3Jpem9udGFsXCIsXG4gICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICBwYWRkZWRQYW5lbEZvckJ1dHRvbih7XG4gICAgICAgICAgICAgICAgX2NvbXBvbmVudDogXCJjb21tb24vUHJpbWFyeSBCdXR0b25cIixcbiAgICAgICAgICAgICAgICBjb250ZW50VGV4dDogYFNhdmUgJHtyZWNvcmQubmFtZX1gLFxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6IFsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIyNldmVudEhhbmRsZXJUeXBlXCI6IFwiU2F2ZSBSZWNvcmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVBhdGg6IGAke3JlY29yZC5uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIyNldmVudEhhbmRsZXJUeXBlXCI6IFwiU2V0IFN0YXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogYGlzRWRpdGluZyR7cmVjb3JkLm5hbWV9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogXCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwYWRkZWRQYW5lbEZvckJ1dHRvbih7XG4gICAgICAgICAgICAgICAgX2NvbXBvbmVudDogXCJjb21tb24vRGVmYXVsdCBCdXR0b25cIixcbiAgICAgICAgICAgICAgICBjb250ZW50VGV4dDogYENhbmNlbGAsXG4gICAgICAgICAgICAgICAgb25DbGljazogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcIiMjZXZlbnRIYW5kbGVyVHlwZVwiOiBcIlNldCBTdGF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGBpc0VkaXRpbmcke3JlY29yZC5uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIF1cbiAgICB9XG59KVxuXG5jb25zdCBwYWRkZWRQYW5lbEZvckJ1dHRvbiA9IChidXR0b24pID0+ICh7XG4gICAgY29udHJvbDoge1xuICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2RpdlwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiYnRuLWdyb3VwXCIsXG4gICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiBidXR0b25cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH1cbn0pO1xuXG4iLCJleHBvcnQgY29uc3QgZ2V0UmVjb3JkUGF0aCA9IChyZWNvcmQpID0+IHtcblxuICAgIGNvbnN0IHBhcnRzID0gW107XG5cbiAgICBjb25zdCBhZGQgPSAoY3VycmVudCkgPT4ge1xuICAgICAgICBwYXJ0cy5wdXNoKGN1cnJlbnQubmFtZSk7XG4gICAgICAgIGlmKGN1cnJlbnQucGFyZW50KCkudHlwZSA9PT0gXCJyb290XCIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZChjdXJyZW50LnBhcmVudCgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHMucmV2ZXJzZSgpLmpvaW4oXCIvXCIpO1xufSIsImltcG9ydCB7IGdldFJlY29yZFBhdGggfSBmcm9tIFwiLi9nZXRSZWNvcmRQYXRoXCI7XG5cbmV4cG9ydCBjb25zdCBpbmRleFRhYmxlcyA9ICh7aW5kZXhlcywgaGVscGVyc30pID0+IFxuICAgIGluZGV4ZXMubWFwKGkgPT4gaW5kZXhUYWJsZShpLCBoZWxwZXJzKSk7XG5cbmNvbnN0IGV4Y2x1ZGVkQ29sdW1ucyA9IFtcImlkXCIsIFwiaXNOZXdcIiwgXCJrZXlcIiwgXCJ0eXBlXCIsIFwic29ydEtleVwiXTtcblxuZXhwb3J0IGNvbnN0IGluZGV4VGFibGVQcm9wcyA9IChpbmRleCwgaGVscGVycykgPT4gKHtcbiAgICBkYXRhOiB7XG4gICAgICAgIFwiIyNiYnN0YXRlXCI6aW5kZXgubm9kZUtleSgpLFxuICAgICAgICBcIiMjYmJzb3VyY2VcIjpcInN0b3JlXCJcbiAgICB9LFxuICAgIHRhYmxlQ2xhc3M6IFwidGFibGUgdGFibGUtaG92ZXJcIixcbiAgICB0aGVhZENsYXNzOiBcInRoZWFkLWRhcmtcIixcbiAgICBjb2x1bW5zOiBoZWxwZXJzXG4gICAgICAgICAgICAgICAgLmluZGV4U2NoZW1hKGluZGV4KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoYyA9PiAhZXhjbHVkZWRDb2x1bW5zLmluY2x1ZGVzKGMubmFtZSkpXG4gICAgICAgICAgICAgICAgLm1hcChjb2x1bW4pLFxuICAgIG9uUm93Q2xpY2s6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgXCIjI2V2ZW50SGFuZGxlclR5cGVcIjogXCJTZXQgU3RhdGVcIixcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICBwYXRoOiBgc2VsZWN0ZWRyb3dfJHtpbmRleC5uYW1lfWAsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgXCIjI2Jic3RhdGVcIjogXCJrZXlcIixcbiAgICAgICAgICAgICAgICAgICAgXCIjI2Jic291cmNlXCI6IFwiZXZlbnRcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICBdXG59KTtcblxuZXhwb3J0IGNvbnN0IGdldEluZGV4VGFibGVOYW1lID0gKGluZGV4LCByZWNvcmQpID0+IHtcbiAgICByZWNvcmQgPSByZWNvcmQgXG4gICAgICAgICAgICAgfHwgaW5kZXgucGFyZW50KCkudHlwZSA9PT0gXCJyZWNvcmRcIiA/IGluZGV4LnBhcmVudCgpIDogbnVsbDtcbiAgICBcbiAgICByZXR1cm4gKHJlY29yZFxuICAgICAgICAgICAgPyBgJHtnZXRSZWNvcmRQYXRoKHJlY29yZCl9LyR7aW5kZXgubmFtZX0gVGFibGVgXG4gICAgICAgICAgICA6IGAke2luZGV4Lm5hbWV9IFRhYmxlYCk7XG59XG5cbmNvbnN0IGluZGV4VGFibGUgPSAoaW5kZXgsIGhlbHBlcnMpID0+ICh7XG4gICAgbmFtZTogZ2V0SW5kZXhUYWJsZU5hbWUoaW5kZXgpLFxuICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL3RhYmxlXCIsXG4gICAgcHJvcHM6IGluZGV4VGFibGVQcm9wcyhpbmRleCwgaGVscGVycylcbn0pO1xuXG5jb25zdCBjb2x1bW4gPSAoY29sKSA9PiAoe1xuICAgIHRpdGxlOiBjb2wubmFtZSxcbiAgICB2YWx1ZToge1xuICAgICAgICBcIiMjYmJzdGF0ZVwiOiBjb2wubmFtZSxcbiAgICAgICAgXCIjI2Jic291cmNlXCI6XCJjb250ZXh0XCJcbiAgICB9XG59KSIsImltcG9ydCB7XG4gICAgZ2V0SW5kZXhUYWJsZU5hbWUsIGluZGV4VGFibGVzXG59IGZyb20gXCIuL2luZGV4VGFibGVzR2VuZXJhdG9yXCI7XG5cbmltcG9ydCB7XG4gICAgYnV0dG9uc1xufSBmcm9tIFwiLi9idXR0b25HZW5lcmF0b3JzXCI7XG5cbmV4cG9ydCBjb25zdCByZWNvcmRIb21lUGFnZUNvbXBvbmVudHMgPSAoe2luZGV4ZXMsIHJlY29yZHMsIGhlbHBlcnN9KSA9PiBcbiAgICBbICAgXG4gICAgICAgIC4uLnJlY29yZEhvbWVwYWdlcyh7aW5kZXhlcywgcmVjb3Jkc30pXG4gICAgICAgICAgLm1hcChjb21wb25lbnQpLFxuXG4gICAgICAgIC4uLnJlY29yZEhvbWVwYWdlcyh7aW5kZXhlcywgcmVjb3Jkc30pXG4gICAgICAgICAgICAubWFwKGhvbWVQYWdlQnV0dG9ucyksXG4gICAgICAgIFxuICAgICAgICAuLi5pbmRleFRhYmxlcyh7aW5kZXhlcywgcmVjb3JkcywgaGVscGVyc30pLFxuXG4gICAgICAgIC4uLmJ1dHRvbnMoe2luZGV4ZXMsIGJ1dHRvbnMsIGhlbHBlcnN9KVxuICAgIF1cblxuXG5jb25zdCBmaW5kSW5kZXhGb3JSZWNvcmQgPSAoaW5kZXhlcywgcmVjb3JkKSA9PiB7XG4gICAgY29uc3QgZm9yUmVjb3JkID0gaW5kZXhlcy5maWx0ZXIoaSA9PiBpLmFsbG93ZWRSZWNvcmROb2RlSWRzLmluY2x1ZGVzKHJlY29yZC5ub2RlSWQpKTtcbiAgICBpZihmb3JSZWNvcmQubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgaWYoZm9yUmVjb3JkLmxlbmd0aCA9PT0gMSkgcmV0dXJuIGZvclJlY29yZFswXTtcbiAgICBjb25zdCBub01hcCA9IGZvclJlY29yZC5maWx0ZXIoaSA9PiAhaS5maWx0ZXIgfHwgIWkuZmlsdGVyLnRyaW0oKSk7XG4gICAgaWYobm9NYXAubGVuZ3RoID09PSAwKSBmb3JSZWNvcmRbMF07XG4gICAgcmV0dXJuIG5vTWFwWzBdO1xufVxuXG5leHBvcnQgY29uc3QgcmVjb3JkSG9tZXBhZ2VzID0gKHtpbmRleGVzLCByZWNvcmRzfSkgPT4gXG4gICAgcmVjb3Jkcy5maWx0ZXIociA9PiByLnBhcmVudCgpLnR5cGUgPT09IFwicm9vdFwiKVxuICAgICAgICAubWFwKHIgPT4oe1xuICAgICAgICAgICAgcmVjb3JkOnIsIFxuICAgICAgICAgICAgaW5kZXg6ZmluZEluZGV4Rm9yUmVjb3JkKGluZGV4ZXMsIHIpXG4gICAgICAgIH0pKVxuICAgICAgICAuZmlsdGVyKHIgPT4gci5pbmRleCk7XG5cblxuZXhwb3J0IGNvbnN0ICBob21lcGFnZUNvbXBvbmVudE5hbWUgPSAocmVjb3JkKSA9PiBcbiAgICBgJHtyZWNvcmQubmFtZX0vJHtyZWNvcmQubmFtZX0gaG9tZXBhZ2VgO1xuXG5jb25zdCBjb21wb25lbnQgPSAoe3JlY29yZCwgaW5kZXh9KSA9PiAoe1xuICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2RpdlwiLFxuICAgIG5hbWU6IGhvbWVwYWdlQ29tcG9uZW50TmFtZShyZWNvcmQpLFxuICAgIHByb3BzOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJkLWZsZXggZmxleC1jb2x1bW4gaC0xMDBcIixcbiAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudDogYCR7cmVjb3JkLm5hbWV9L2hvbWVwYWdlIGJ1dHRvbnNgLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IGdldEluZGV4VGFibGVOYW1lKGluZGV4KVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImZsZXgtZ293LTEgb3ZlcmZsb3ctYXV0b1wiXG4gICAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIG9uTG9hZDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwiIyNldmVudEhhbmRsZXJUeXBlXCI6IFwiU2V0IFN0YXRlXCIsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiBgaXNFZGl0aW5nJHtyZWNvcmQubmFtZX1gLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogXCJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCIjI2V2ZW50SGFuZGxlclR5cGVcIjogXCJMaXN0IFJlY29yZHNcIixcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlUGF0aDogaW5kZXgubm9kZUtleSgpLFxuICAgICAgICAgICAgICAgICAgICBpbmRleEtleTogaW5kZXgubm9kZUtleSgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfVxuXG59KTtcblxuY29uc3QgaG9tZVBhZ2VCdXR0b25zID0gKHtpbmRleCwgcmVjb3JkfSkgPT4gKHtcbiAgICBpbmhlcml0czogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy9kaXZcIixcbiAgICBuYW1lOiBgJHtyZWNvcmQubmFtZX0vaG9tZXBhZ2UgYnV0dG9uc2AsXG4gICAgcHJvcHM6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcImJ0bi10b29sYmFyIG10LTQgbWItMlwiLFxuICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDoge1xuICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2RpdlwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiYnRuLWdyb3VwIG1yLTNcIixcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudDogXCJjb21tb24vRGVmYXVsdCBCdXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFRleHQ6IGBDcmVhdGUgJHtyZWNvcmQubmFtZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIjI2V2ZW50SGFuZGxlclR5cGVcIjogXCJHZXQgTmV3IFJlY29yZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVQYXRoOiByZWNvcmQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbktleTogYC8ke3JlY29yZC5jb2xsZWN0aW9uTmFtZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZFJlY29yZFR5cGU6IHJlY29yZC5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIjI2V2ZW50SGFuZGxlclR5cGVcIjogXCJTZXQgU3RhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGBpc0VkaXRpbmcke3JlY29yZC5uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IFwiY29tbW9uL0RlZmF1bHQgQnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUZXh0OiBgUmVmcmVzaGAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiMjZXZlbnRIYW5kbGVyVHlwZVwiOiBcIkxpc3QgUmVjb3Jkc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVQYXRoOiBpbmRleC5ub2RlS2V5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4S2V5OiBpbmRleC5ub2RlS2V5KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDoge1xuICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2lmXCIsXG4gICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogYCRzdG9yZS5zZWxlY3RlZHJvd18ke2luZGV4Lm5hbWV9ICYmICRzdG9yZS5zZWxlY3RlZHJvd18ke2luZGV4Lm5hbWV9Lmxlbmd0aCA+IDBgLFxuICAgICAgICAgICAgICAgICAgICB0aGVuQ29tcG9uZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2RpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImJ0bi1ncm91cFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudDogXCJjb21tb24vRGVmYXVsdCBCdXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUZXh0OiBgRWRpdCAke3JlY29yZC5uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiMjZXZlbnRIYW5kbGVyVHlwZVwiOiBcIkxvYWQgUmVjb3JkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlUGF0aDogcmVjb3JkLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRLZXk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiMjYmJzdGF0ZVwiIDogYHNlbGVjdGVkcm93XyR7aW5kZXgubmFtZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIyNzb3VyY2VcIjogXCJzdG9yZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIyNldmVudEhhbmRsZXJUeXBlXCI6IFwiU2V0IFN0YXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGBpc0VkaXRpbmcke3JlY29yZC5uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogXCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IFwiY29tbW9uL0RlZmF1bHQgQnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VGV4dDogYERlbGV0ZSAke3JlY29yZC5uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiMjZXZlbnRIYW5kbGVyVHlwZVwiOiBcIkRlbGV0ZSBSZWNvcmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkS2V5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIjI2Jic3RhdGVcIiA6IGBzZWxlY3RlZHJvd18ke2luZGV4Lm5hbWV9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiMjc291cmNlXCI6IFwic3RvcmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfVxufSkiLCJpbXBvcnQgeyBcbiAgICByZWNvcmRIb21lcGFnZXMsIFxuICAgIGhvbWVwYWdlQ29tcG9uZW50TmFtZSxcbiAgICByZWNvcmRIb21lUGFnZUNvbXBvbmVudHNcbn0gZnJvbSBcIi4vcmVjb3JkSG9tZVBhZ2VHZW5lcmF0b3JcIjtcbmltcG9ydCB7IGZvcm1OYW1lLCBmb3JtcyB9IGZyb20gXCIuL2Zvcm1zR2VuZXJhdG9yXCI7XG5cbmV4cG9ydCBjb25zdCBzZWxlY3ROYXZDb250ZW50ID0gKHtpbmRleGVzLCByZWNvcmRzLCBoZWxwZXJzfSkgPT4gXG4gICAgW1xuICAgICAgICAuLi5yZWNvcmRIb21lcGFnZXMoe2luZGV4ZXMsIHJlY29yZHN9KVxuICAgICAgICAgICAgLm1hcChjb21wb25lbnQpLFxuXG4gICAgICAgIC4uLnJlY29yZEhvbWVQYWdlQ29tcG9uZW50cyh7aW5kZXhlcywgcmVjb3JkcywgaGVscGVyc30pLFxuXG4gICAgICAgIC4uLmZvcm1zKHtpbmRleGVzLCByZWNvcmRzLCBoZWxwZXJzfSlcblxuICAgIF1cblxuXG5leHBvcnQgY29uc3QgbmF2Q29udGVudENvbXBvbmVudE5hbWUgPSByZWNvcmQgPT5cbiAgICBgJHtyZWNvcmQubmFtZX0vJHtyZWNvcmQubmFtZX0gTmF2IENvbnRlbnRgO1xuXG5jb25zdCBjb21wb25lbnQgPSAoe3JlY29yZCwgaW5kZXh9KSA9PiAoe1xuICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2lmXCIsXG4gICAgZGVzY3JpcHRpb246IGB0aGUgY29tcG9uZW50IHRoYXQgZ2V0cyBkaXNwbGF5ZWQgd2hlbiB0aGUgJHtyZWNvcmQuY29sbGVjdGlvbk5hbWV9IG5hdiBpcyBzZWxlY3RlZGAsXG4gICAgbmFtZTogbmF2Q29udGVudENvbXBvbmVudE5hbWUocmVjb3JkKSxcbiAgICBwcm9wczoge1xuICAgICAgICBjb25kaXRpb246IGAkc3RvcmUuaXNFZGl0aW5nJHtyZWNvcmQubmFtZX1gLFxuICAgICAgICB0aGVuQ29tcG9uZW50OiB7XG4gICAgICAgICAgICBfY29tcG9uZW50OiBmb3JtTmFtZShyZWNvcmQpXG4gICAgICAgIH0sXG4gICAgICAgIGVsc2VDb21wb25lbnQ6IHtcbiAgICAgICAgICAgIF9jb21wb25lbnQ6IGhvbWVwYWdlQ29tcG9uZW50TmFtZShyZWNvcmQpXG4gICAgICAgIH1cbiAgICB9XG59KTsiLCJpbXBvcnQgeyBuYXZDb250ZW50Q29tcG9uZW50TmFtZSwgc2VsZWN0TmF2Q29udGVudCB9IGZyb20gXCIuL3NlbGVjdGVkTmF2Q29udGVudEdlbmVyYXRvclwiO1xuaW1wb3J0IHsgcmVjb3JkSG9tZXBhZ2VzIH0gZnJvbSBcIi4vcmVjb3JkSG9tZVBhZ2VHZW5lcmF0b3JcIjtcbmV4cG9ydCBjb25zdCBhcHAgPSAoe3JlY29yZHMsIGluZGV4ZXMsIGhlbHBlcnN9KSA9PiBbXG4gICAge1xuICAgICAgICBuYW1lOiBcIkFwcGxpY2F0aW9uIFJvb3RcIixcbiAgICAgICAgaW5oZXJpdHM6IFwiQGJ1ZGliYXNlL2Jvb3RzdHJhcC1jb21wb25lbnRzL25hdlwiLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgaXRlbXM6IHJlY29yZEhvbWVwYWdlcyh7aW5kZXhlcywgcmVjb3Jkc30pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAobmF2SXRlbSksXG4gICAgICAgICAgICBvcmllbnRhdGlvbjogXCJob3Jpem9udGFsXCIsXG4gICAgICAgICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIixcbiAgICAgICAgICAgIGZpbGw6IGZhbHNlLFxuICAgICAgICAgICAgcGlsbHM6IHRydWUsXG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW06IHtcbiAgICAgICAgICAgICAgICBcIiMjYmJzdGF0ZVwiOlwic2VsZWN0ZWROYXZcIixcbiAgICAgICAgICAgICAgICBcIiMjYmJzdGF0ZWZhbGxiYWNrXCI6YCR7cmVjb3Jkc1swXS5uYW1lfWAsXG4gICAgICAgICAgICAgICAgXCIjI2Jic291cmNlXCI6IFwic3RvcmVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJwLTNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiTG9naW5cIixcbiAgICAgICAgaW5oZXJpdHM6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvbG9naW5cIixcbiAgICAgICAgcHJvcHM6IHt9XG4gICAgfSxcbiAgICAuLi5zZWxlY3ROYXZDb250ZW50KHtyZWNvcmRzLCBpbmRleGVzLCBoZWxwZXJzfSlcbl1cblxuXG5leHBvcnQgY29uc3QgbmF2SXRlbSA9ICh7cmVjb3JkfSkgPT4gKHtcbiAgICB0aXRsZTogcmVjb3JkLmNvbGxlY3Rpb25OYW1lLFxuICAgIGNvbXBvbmVudCA6IHtcbiAgICAgICAgX2NvbXBvbmVudDogbmF2Q29udGVudENvbXBvbmVudE5hbWUocmVjb3JkKVxuICAgIH1cbn0pXG5cbiJdLCJuYW1lcyI6WyJjb21wb25lbnQiXSwibWFwcGluZ3MiOiJBQUFPLE1BQU0sT0FBTyxHQUFHLE1BQU07QUFDN0IsSUFBSTtBQUNKLFFBQVEsSUFBSSxFQUFFLHVCQUF1QjtBQUNyQyxRQUFRLFdBQVcsRUFBRSwyQkFBMkI7QUFDaEQsUUFBUSxRQUFRLEVBQUUsc0NBQXNDO0FBQ3hELFFBQVEsS0FBSyxFQUFFO0FBQ2YsWUFBWSxTQUFTLEVBQUUsaUJBQWlCO0FBQ3hDLFNBQVM7QUFDVCxLQUFLO0FBQ0wsSUFBSTtBQUNKLFFBQVEsSUFBSSxFQUFFLHVCQUF1QjtBQUNyQyxRQUFRLFdBQVcsRUFBRSwwQkFBMEI7QUFDL0MsUUFBUSxRQUFRLEVBQUUsc0NBQXNDO0FBQ3hELFFBQVEsS0FBSyxFQUFFO0FBQ2YsWUFBWSxTQUFTLEVBQUUsbUJBQW1CO0FBQzFDLFNBQVM7QUFDVCxLQUFLO0FBQ0w7O0FDZlksTUFBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FB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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9ycy5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL2dlbmVyYXRvcnMvYnV0dG9uR2VuZXJhdG9ycy5qcyIsIi4uL3NyYy9nZW5lcmF0b3JzL2Zvcm1zR2VuZXJhdG9yLmpzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2V0UmVjb3JkUGF0aC5qcyIsIi4uL3NyYy9nZW5lcmF0b3JzL2luZGV4VGFibGVzR2VuZXJhdG9yLmpzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVjb3JkSG9tZVBhZ2VHZW5lcmF0b3IuanMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9zZWxlY3RlZE5hdkNvbnRlbnRHZW5lcmF0b3IuanMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hcHBHZW5lcmF0b3IuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGJ1dHRvbnMgPSAoKSA9PiBbXHJcbiAgICB7XHJcbiAgICAgICAgbmFtZTogXCJjb21tb24vUHJpbWFyeSBCdXR0b25cIixcclxuICAgICAgICBkZXNjcmlwdGlvbjogXCJCb290c3RyYXAgcHJpbWFyeSBidXR0b24gXCIsXHJcbiAgICAgICAgaW5oZXJpdHM6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvYnV0dG9uXCIsXHJcbiAgICAgICAgcHJvcHM6IHtcclxuICAgICAgICAgICAgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBuYW1lOiBcImNvbW1vbi9EZWZhdWx0IEJ1dHRvblwiLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkJvb3RzdHJhcCBkZWZhdWx0IGJ1dHRvblwiLFxyXG4gICAgICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2J1dHRvblwiLFxyXG4gICAgICAgIHByb3BzOiB7XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJidG4gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5dIiwiaW1wb3J0IHtidXR0b25zfSBmcm9tIFwiLi9idXR0b25HZW5lcmF0b3JzXCI7XHJcblxyXG5leHBvcnQgY29uc3QgZm9ybXMgPSAoe3JlY29yZHMsIGluZGV4ZXMsIGhlbHBlcnN9KSA9PiBcclxuICAgIFtcclxuICAgICAgICAuLi5yZWNvcmRzLm1hcChyb290KSxcclxuICAgICAgICAuLi5idXR0b25zKHtyZWNvcmRzLCBpbmRleGVzLCBoZWxwZXJzfSlcclxuICAgIF07XHJcblxyXG5leHBvcnQgY29uc3QgZm9ybU5hbWUgPSByZWNvcmQgPT4gIGAke3JlY29yZC5uYW1lfS8ke3JlY29yZC5uYW1lfSBGb3JtYDtcclxuXHJcbmNvbnN0IHJvb3QgPSByZWNvcmQgPT4gKHtcclxuICAgIG5hbWU6IGZvcm1OYW1lKHJlY29yZCksXHJcbiAgICBkZXNjcmlwdGlvbjogYENvbnRyb2wgZm9yIGNyZWF0aW5nL3VwZGF0aW5nICcke3JlY29yZC5ub2RlS2V5KCl9JyBgLFxyXG4gICAgaW5oZXJpdHM6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvZGl2XCIsXHJcbiAgICBwcm9wczoge1xyXG4gICAgICAgIGNsYXNzTmFtZTpcInAtMVwiLFxyXG4gICAgICAgIGNoaWxkcmVuOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDoge1xyXG4gICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvaDNcIixcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBgRWRpdCAke3JlY29yZC5uYW1lfWAsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGZvcm0ocmVjb3JkKSxcclxuICAgICAgICAgICAgc2F2ZUNhbmNlbEJ1dHRvbnMocmVjb3JkKVxyXG4gICAgICAgIF1cclxuICAgIH1cclxufSkgXHJcblxyXG5jb25zdCBmb3JtID0gcmVjb3JkID0+ICh7XHJcbiAgICBjb21wb25lbnQ6IHtcclxuICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2Zvcm1cIixcclxuICAgICAgICBmb3JtQ29udHJvbHM6IFxyXG4gICAgICAgICAgICByZWNvcmQuZmllbGRzLm1hcChmID0+IGZvcm1Db250cm9sKHJlY29yZCwgZikpXHJcbiAgICB9XHJcbn0pXHJcblxyXG5jb25zdCBmb3JtQ29udHJvbCA9IChyZWNvcmQsIGZpZWxkKSA9PiB7XHJcbiAgICBpZihmaWVsZC50eXBlID09PSBcInN0cmluZ1wiICYmIGZpZWxkLnR5cGVPcHRpb25zLnZhbHVlcyAmJiBmaWVsZC50eXBlT3B0aW9ucy52YWx1ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHJldHVybiAoe1xyXG4gICAgICAgICAgICBjb250cm9sOiB7XHJcbiAgICAgICAgICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL3NlbGVjdFwiLFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uczogZmllbGQudHlwZU9wdGlvbnMudmFsdWVzLm1hcCh2ID0+ICh7aWQ6diwgdmFsdWU6dn0pKSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgXCIjI2Jic3RhdGVcIjpgJHtyZWNvcmQubmFtZX0uJHtmaWVsZC5uYW1lfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgXCIjI2Jic291cmNlXCI6XCJzdG9yZVwiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGxhYmVsOiBmaWVsZC5sYWJlbFxyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gKHtcclxuICAgICAgICAgICAgY29udHJvbDoge1xyXG4gICAgICAgICAgICAgICAgX2NvbXBvbmVudDogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy9pbnB1dFwiLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcclxuICAgICAgICAgICAgICAgICAgICBcIiMjYmJzdGF0ZVwiOmAke3JlY29yZC5uYW1lfS4ke2ZpZWxkLm5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICBcIiMjYmJzb3VyY2VcIjpcInN0b3JlXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiZm9ybS1jb250cm9sXCIsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBmaWVsZC50eXBlID09PSBcInN0cmluZ1wiID8gXCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICA6IGZpZWxkLnR5cGUgPT09IFwiZGF0ZXRpbWVcIiA/IFwiZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgOiBmaWVsZC50eXBlID09PSBcIm51bWJlclwiID8gXCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0XCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbGFiZWw6IGZpZWxkLmxhYmVsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IHNhdmVDYW5jZWxCdXR0b25zID0gKHJlY29yZCkgPT4gKHtcclxuICAgIGNvbXBvbmVudDoge1xyXG4gICAgICAgIF9jb21wb25lbnQ6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvc3RhY2twYW5lbFwiLFxyXG4gICAgICAgIGRpcmVjdGlvbjogXCJob3Jpem9udGFsXCIsXHJcbiAgICAgICAgY2hpbGRyZW46IFtcclxuICAgICAgICAgICAgcGFkZGVkUGFuZWxGb3JCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgX2NvbXBvbmVudDogXCJjb21tb24vUHJpbWFyeSBCdXR0b25cIixcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRUZXh0OiBgU2F2ZSAke3JlY29yZC5uYW1lfWAsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiBbICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCIjI2V2ZW50SGFuZGxlclR5cGVcIjogXCJTYXZlIFJlY29yZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVBhdGg6IGAke3JlY29yZC5uYW1lfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCIjI2V2ZW50SGFuZGxlclR5cGVcIjogXCJTZXQgU3RhdGVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogYGlzRWRpdGluZyR7cmVjb3JkLm5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcIlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBwYWRkZWRQYW5lbEZvckJ1dHRvbih7XHJcbiAgICAgICAgICAgICAgICBfY29tcG9uZW50OiBcImNvbW1vbi9EZWZhdWx0IEJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgY29udGVudFRleHQ6IGBDYW5jZWxgLFxyXG4gICAgICAgICAgICAgICAgb25DbGljazogW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCIjI2V2ZW50SGFuZGxlclR5cGVcIjogXCJTZXQgU3RhdGVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogYGlzRWRpdGluZyR7cmVjb3JkLm5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcIlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG59KVxyXG5cclxuY29uc3QgcGFkZGVkUGFuZWxGb3JCdXR0b24gPSAoYnV0dG9uKSA9PiAoe1xyXG4gICAgY29udHJvbDoge1xyXG4gICAgICAgIF9jb21wb25lbnQ6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvZGl2XCIsXHJcbiAgICAgICAgY2xhc3NOYW1lOiBcImJ0bi1ncm91cFwiLFxyXG4gICAgICAgIGNoaWxkcmVuOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogYnV0dG9uXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICB9XHJcbn0pO1xyXG5cclxuIiwiZXhwb3J0IGNvbnN0IGdldFJlY29yZFBhdGggPSAocmVjb3JkKSA9PiB7XHJcblxyXG4gICAgY29uc3QgcGFydHMgPSBbXTtcclxuXHJcbiAgICBjb25zdCBhZGQgPSAoY3VycmVudCkgPT4ge1xyXG4gICAgICAgIHBhcnRzLnB1c2goY3VycmVudC5uYW1lKTtcclxuICAgICAgICBpZihjdXJyZW50LnBhcmVudCgpLnR5cGUgPT09IFwicm9vdFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGFkZChjdXJyZW50LnBhcmVudCgpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGFydHMucmV2ZXJzZSgpLmpvaW4oXCIvXCIpO1xyXG59IiwiaW1wb3J0IHsgZ2V0UmVjb3JkUGF0aCB9IGZyb20gXCIuL2dldFJlY29yZFBhdGhcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBpbmRleFRhYmxlcyA9ICh7aW5kZXhlcywgaGVscGVyc30pID0+IFxyXG4gICAgaW5kZXhlcy5tYXAoaSA9PiBpbmRleFRhYmxlKGksIGhlbHBlcnMpKTtcclxuXHJcbmNvbnN0IGV4Y2x1ZGVkQ29sdW1ucyA9IFtcImlkXCIsIFwiaXNOZXdcIiwgXCJrZXlcIiwgXCJ0eXBlXCIsIFwic29ydEtleVwiXTtcclxuXHJcbmV4cG9ydCBjb25zdCBpbmRleFRhYmxlUHJvcHMgPSAoaW5kZXgsIGhlbHBlcnMpID0+ICh7XHJcbiAgICBkYXRhOiB7XHJcbiAgICAgICAgXCIjI2Jic3RhdGVcIjppbmRleC5ub2RlS2V5KCksXHJcbiAgICAgICAgXCIjI2Jic291cmNlXCI6XCJzdG9yZVwiXHJcbiAgICB9LFxyXG4gICAgdGFibGVDbGFzczogXCJ0YWJsZSB0YWJsZS1ob3ZlclwiLFxyXG4gICAgdGhlYWRDbGFzczogXCJ0aGVhZC1kYXJrXCIsXHJcbiAgICBjb2x1bW5zOiBoZWxwZXJzXHJcbiAgICAgICAgICAgICAgICAuaW5kZXhTY2hlbWEoaW5kZXgpXHJcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGMgPT4gIWV4Y2x1ZGVkQ29sdW1ucy5pbmNsdWRlcyhjLm5hbWUpKVxyXG4gICAgICAgICAgICAgICAgLm1hcChjb2x1bW4pLFxyXG4gICAgb25Sb3dDbGljazogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgXCIjI2V2ZW50SGFuZGxlclR5cGVcIjogXCJTZXQgU3RhdGVcIixcclxuICAgICAgICAgICAgcGFyYW1ldGVyczoge1xyXG4gICAgICAgICAgICAgICAgcGF0aDogYHNlbGVjdGVkcm93XyR7aW5kZXgubmFtZX1gLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcclxuICAgICAgICAgICAgICAgICAgICBcIiMjYmJzdGF0ZVwiOiBcImtleVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiIyNiYnNvdXJjZVwiOiBcImV2ZW50XCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9XHJcbiAgICBdXHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldEluZGV4VGFibGVOYW1lID0gKGluZGV4LCByZWNvcmQpID0+IHtcclxuICAgIHJlY29yZCA9IHJlY29yZCBcclxuICAgICAgICAgICAgIHx8IGluZGV4LnBhcmVudCgpLnR5cGUgPT09IFwicmVjb3JkXCIgPyBpbmRleC5wYXJlbnQoKSA6IG51bGw7XHJcbiAgICBcclxuICAgIHJldHVybiAocmVjb3JkXHJcbiAgICAgICAgICAgID8gYCR7Z2V0UmVjb3JkUGF0aChyZWNvcmQpfS8ke2luZGV4Lm5hbWV9IFRhYmxlYFxyXG4gICAgICAgICAgICA6IGAke2luZGV4Lm5hbWV9IFRhYmxlYCk7XHJcbn1cclxuXHJcbmNvbnN0IGluZGV4VGFibGUgPSAoaW5kZXgsIGhlbHBlcnMpID0+ICh7XHJcbiAgICBuYW1lOiBnZXRJbmRleFRhYmxlTmFtZShpbmRleCksXHJcbiAgICBpbmhlcml0czogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy90YWJsZVwiLFxyXG4gICAgcHJvcHM6IGluZGV4VGFibGVQcm9wcyhpbmRleCwgaGVscGVycylcclxufSk7XHJcblxyXG5jb25zdCBjb2x1bW4gPSAoY29sKSA9PiAoe1xyXG4gICAgdGl0bGU6IGNvbC5uYW1lLFxyXG4gICAgdmFsdWU6IHtcclxuICAgICAgICBcIiMjYmJzdGF0ZVwiOiBjb2wubmFtZSxcclxuICAgICAgICBcIiMjYmJzb3VyY2VcIjpcImNvbnRleHRcIlxyXG4gICAgfVxyXG59KSIsImltcG9ydCB7XHJcbiAgICBnZXRJbmRleFRhYmxlTmFtZSwgaW5kZXhUYWJsZXNcclxufSBmcm9tIFwiLi9pbmRleFRhYmxlc0dlbmVyYXRvclwiO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIGJ1dHRvbnNcclxufSBmcm9tIFwiLi9idXR0b25HZW5lcmF0b3JzXCI7XHJcblxyXG5leHBvcnQgY29uc3QgcmVjb3JkSG9tZVBhZ2VDb21wb25lbnRzID0gKHtpbmRleGVzLCByZWNvcmRzLCBoZWxwZXJzfSkgPT4gXHJcbiAgICBbICAgXHJcbiAgICAgICAgLi4ucmVjb3JkSG9tZXBhZ2VzKHtpbmRleGVzLCByZWNvcmRzfSlcclxuICAgICAgICAgIC5tYXAoY29tcG9uZW50KSxcclxuXHJcbiAgICAgICAgLi4ucmVjb3JkSG9tZXBhZ2VzKHtpbmRleGVzLCByZWNvcmRzfSlcclxuICAgICAgICAgICAgLm1hcChob21lUGFnZUJ1dHRvbnMpLFxyXG4gICAgICAgIFxyXG4gICAgICAgIC4uLmluZGV4VGFibGVzKHtpbmRleGVzLCByZWNvcmRzLCBoZWxwZXJzfSksXHJcblxyXG4gICAgICAgIC4uLmJ1dHRvbnMoe2luZGV4ZXMsIGJ1dHRvbnMsIGhlbHBlcnN9KVxyXG4gICAgXVxyXG5cclxuXHJcbmNvbnN0IGZpbmRJbmRleEZvclJlY29yZCA9IChpbmRleGVzLCByZWNvcmQpID0+IHtcclxuICAgIGNvbnN0IGZvclJlY29yZCA9IGluZGV4ZXMuZmlsdGVyKGkgPT4gaS5hbGxvd2VkUmVjb3JkTm9kZUlkcy5pbmNsdWRlcyhyZWNvcmQubm9kZUlkKSk7XHJcbiAgICBpZihmb3JSZWNvcmQubGVuZ3RoID09PSAwKSByZXR1cm47XHJcbiAgICBpZihmb3JSZWNvcmQubGVuZ3RoID09PSAxKSByZXR1cm4gZm9yUmVjb3JkWzBdO1xyXG4gICAgY29uc3Qgbm9NYXAgPSBmb3JSZWNvcmQuZmlsdGVyKGkgPT4gIWkuZmlsdGVyIHx8ICFpLmZpbHRlci50cmltKCkpO1xyXG4gICAgaWYobm9NYXAubGVuZ3RoID09PSAwKSBmb3JSZWNvcmRbMF07XHJcbiAgICByZXR1cm4gbm9NYXBbMF07XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCByZWNvcmRIb21lcGFnZXMgPSAoe2luZGV4ZXMsIHJlY29yZHN9KSA9PiBcclxuICAgIHJlY29yZHMuZmlsdGVyKHIgPT4gci5wYXJlbnQoKS50eXBlID09PSBcInJvb3RcIilcclxuICAgICAgICAubWFwKHIgPT4oe1xyXG4gICAgICAgICAgICByZWNvcmQ6ciwgXHJcbiAgICAgICAgICAgIGluZGV4OmZpbmRJbmRleEZvclJlY29yZChpbmRleGVzLCByKVxyXG4gICAgICAgIH0pKVxyXG4gICAgICAgIC5maWx0ZXIociA9PiByLmluZGV4KTtcclxuXHJcblxyXG5leHBvcnQgY29uc3QgIGhvbWVwYWdlQ29tcG9uZW50TmFtZSA9IChyZWNvcmQpID0+IFxyXG4gICAgYCR7cmVjb3JkLm5hbWV9LyR7cmVjb3JkLm5hbWV9IGhvbWVwYWdlYDtcclxuXHJcbmNvbnN0IGNvbXBvbmVudCA9ICh7cmVjb3JkLCBpbmRleH0pID0+ICh7XHJcbiAgICBpbmhlcml0czogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy9kaXZcIixcclxuICAgIG5hbWU6IGhvbWVwYWdlQ29tcG9uZW50TmFtZShyZWNvcmQpLFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgICBjbGFzc05hbWU6IFwiZC1mbGV4IGZsZXgtY29sdW1uIGgtMTAwXCIsXHJcbiAgICAgICAgY2hpbGRyZW46IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudDogYCR7cmVjb3JkLm5hbWV9L2hvbWVwYWdlIGJ1dHRvbnNgLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHtcclxuICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50OiBnZXRJbmRleFRhYmxlTmFtZShpbmRleClcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiZmxleC1nb3ctMSBvdmVyZmxvdy1hdXRvXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgb25Mb2FkOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFwiIyNldmVudEhhbmRsZXJUeXBlXCI6IFwiU2V0IFN0YXRlXCIsXHJcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogYGlzRWRpdGluZyR7cmVjb3JkLm5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBcIiMjZXZlbnRIYW5kbGVyVHlwZVwiOiBcIkxpc3QgUmVjb3Jkc1wiLFxyXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlUGF0aDogaW5kZXgubm9kZUtleSgpLFxyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4S2V5OiBpbmRleC5ub2RlS2V5KClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxuY29uc3QgaG9tZVBhZ2VCdXR0b25zID0gKHtpbmRleCwgcmVjb3JkfSkgPT4gKHtcclxuICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2RpdlwiLFxyXG4gICAgbmFtZTogYCR7cmVjb3JkLm5hbWV9L2hvbWVwYWdlIGJ1dHRvbnNgLFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgICBjbGFzc05hbWU6IFwiYnRuLXRvb2xiYXIgbXQtNCBtYi0yXCIsXHJcbiAgICAgICAgY2hpbGRyZW46IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudDogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy9kaXZcIixcclxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiYnRuLWdyb3VwIG1yLTNcIixcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50OiBcImNvbW1vbi9EZWZhdWx0IEJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUZXh0OiBgQ3JlYXRlICR7cmVjb3JkLm5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIyNldmVudEhhbmRsZXJUeXBlXCI6IFwiR2V0IE5ldyBSZWNvcmRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVBhdGg6IHJlY29yZC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25LZXk6IGAvJHtyZWNvcmQuY29sbGVjdGlvbk5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZFJlY29yZFR5cGU6IHJlY29yZC5uYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiMjZXZlbnRIYW5kbGVyVHlwZVwiOiBcIlNldCBTdGF0ZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGBpc0VkaXRpbmcke3JlY29yZC5uYW1lfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IFwiY29tbW9uL0RlZmF1bHQgQnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFRleHQ6IGBSZWZyZXNoYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIyNldmVudEhhbmRsZXJUeXBlXCI6IFwiTGlzdCBSZWNvcmRzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVQYXRoOiBpbmRleC5ub2RlS2V5KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhLZXk6IGluZGV4Lm5vZGVLZXkoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHtcclxuICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2lmXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBgJHN0b3JlLnNlbGVjdGVkcm93XyR7aW5kZXgubmFtZX0gJiYgJHN0b3JlLnNlbGVjdGVkcm93XyR7aW5kZXgubmFtZX0ubGVuZ3RoID4gMGAsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhlbkNvbXBvbmVudDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2RpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiYnRuLWdyb3VwXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IFwiY29tbW9uL0RlZmF1bHQgQnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUZXh0OiBgRWRpdCAke3JlY29yZC5uYW1lfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiMjZXZlbnRIYW5kbGVyVHlwZVwiOiBcIkxvYWQgUmVjb3JkXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVBhdGg6IHJlY29yZC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRLZXk6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIyNiYnN0YXRlXCIgOiBgc2VsZWN0ZWRyb3dfJHtpbmRleC5uYW1lfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiMjc291cmNlXCI6IFwic3RvcmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIjI2V2ZW50SGFuZGxlclR5cGVcIjogXCJTZXQgU3RhdGVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGBpc0VkaXRpbmcke3JlY29yZC5uYW1lfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IFwiY29tbW9uL0RlZmF1bHQgQnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUZXh0OiBgRGVsZXRlICR7cmVjb3JkLm5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIyNldmVudEhhbmRsZXJUeXBlXCI6IFwiRGVsZXRlIFJlY29yZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkS2V5OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiMjYmJzdGF0ZVwiIDogYHNlbGVjdGVkcm93XyR7aW5kZXgubmFtZX1gLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIjI3NvdXJjZVwiOiBcInN0b3JlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgIH1cclxufSkiLCJpbXBvcnQgeyBcclxuICAgIHJlY29yZEhvbWVwYWdlcywgXHJcbiAgICBob21lcGFnZUNvbXBvbmVudE5hbWUsXHJcbiAgICByZWNvcmRIb21lUGFnZUNvbXBvbmVudHNcclxufSBmcm9tIFwiLi9yZWNvcmRIb21lUGFnZUdlbmVyYXRvclwiO1xyXG5pbXBvcnQgeyBmb3JtTmFtZSwgZm9ybXMgfSBmcm9tIFwiLi9mb3Jtc0dlbmVyYXRvclwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IHNlbGVjdE5hdkNvbnRlbnQgPSAoe2luZGV4ZXMsIHJlY29yZHMsIGhlbHBlcnN9KSA9PiBcclxuICAgIFtcclxuICAgICAgICAuLi5yZWNvcmRIb21lcGFnZXMoe2luZGV4ZXMsIHJlY29yZHN9KVxyXG4gICAgICAgICAgICAubWFwKGNvbXBvbmVudCksXHJcblxyXG4gICAgICAgIC4uLnJlY29yZEhvbWVQYWdlQ29tcG9uZW50cyh7aW5kZXhlcywgcmVjb3JkcywgaGVscGVyc30pLFxyXG5cclxuICAgICAgICAuLi5mb3Jtcyh7aW5kZXhlcywgcmVjb3JkcywgaGVscGVyc30pXHJcblxyXG4gICAgXVxyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBuYXZDb250ZW50Q29tcG9uZW50TmFtZSA9IHJlY29yZCA9PlxyXG4gICAgYCR7cmVjb3JkLm5hbWV9LyR7cmVjb3JkLm5hbWV9IE5hdiBDb250ZW50YDtcclxuXHJcbmNvbnN0IGNvbXBvbmVudCA9ICh7cmVjb3JkLCBpbmRleH0pID0+ICh7XHJcbiAgICBpbmhlcml0czogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy9pZlwiLFxyXG4gICAgZGVzY3JpcHRpb246IGB0aGUgY29tcG9uZW50IHRoYXQgZ2V0cyBkaXNwbGF5ZWQgd2hlbiB0aGUgJHtyZWNvcmQuY29sbGVjdGlvbk5hbWV9IG5hdiBpcyBzZWxlY3RlZGAsXHJcbiAgICBuYW1lOiBuYXZDb250ZW50Q29tcG9uZW50TmFtZShyZWNvcmQpLFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgICBjb25kaXRpb246IGAkc3RvcmUuaXNFZGl0aW5nJHtyZWNvcmQubmFtZX1gLFxyXG4gICAgICAgIHRoZW5Db21wb25lbnQ6IHtcclxuICAgICAgICAgICAgX2NvbXBvbmVudDogZm9ybU5hbWUocmVjb3JkKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZWxzZUNvbXBvbmVudDoge1xyXG4gICAgICAgICAgICBfY29tcG9uZW50OiBob21lcGFnZUNvbXBvbmVudE5hbWUocmVjb3JkKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufSk7IiwiaW1wb3J0IHsgbmF2Q29udGVudENvbXBvbmVudE5hbWUsIHNlbGVjdE5hdkNvbnRlbnQgfSBmcm9tIFwiLi9zZWxlY3RlZE5hdkNvbnRlbnRHZW5lcmF0b3JcIjtcclxuaW1wb3J0IHsgcmVjb3JkSG9tZXBhZ2VzIH0gZnJvbSBcIi4vcmVjb3JkSG9tZVBhZ2VHZW5lcmF0b3JcIjtcclxuZXhwb3J0IGNvbnN0IGFwcCA9ICh7cmVjb3JkcywgaW5kZXhlcywgaGVscGVyc30pID0+IFtcclxuICAgIHtcclxuICAgICAgICBuYW1lOiBcIkFwcGxpY2F0aW9uIFJvb3RcIixcclxuICAgICAgICBpbmhlcml0czogXCJAYnVkaWJhc2UvYm9vdHN0cmFwLWNvbXBvbmVudHMvbmF2XCIsXHJcbiAgICAgICAgcHJvcHM6IHtcclxuICAgICAgICAgICAgaXRlbXM6IHJlY29yZEhvbWVwYWdlcyh7aW5kZXhlcywgcmVjb3Jkc30pXHJcbiAgICAgICAgICAgICAgICAgICAgLm1hcChuYXZJdGVtKSxcclxuICAgICAgICAgICAgb3JpZW50YXRpb246IFwiaG9yaXpvbnRhbFwiLFxyXG4gICAgICAgICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIixcclxuICAgICAgICAgICAgZmlsbDogZmFsc2UsXHJcbiAgICAgICAgICAgIHBpbGxzOiB0cnVlLFxyXG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW06IHtcclxuICAgICAgICAgICAgICAgIFwiIyNiYnN0YXRlXCI6XCJzZWxlY3RlZE5hdlwiLFxyXG4gICAgICAgICAgICAgICAgXCIjI2Jic3RhdGVmYWxsYmFja1wiOmAke3JlY29yZHNbMF0ubmFtZX1gLFxyXG4gICAgICAgICAgICAgICAgXCIjI2Jic291cmNlXCI6IFwic3RvcmVcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjbGFzc05hbWU6IFwicC0zXCJcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIG5hbWU6IFwiTG9naW5cIixcclxuICAgICAgICBpbmhlcml0czogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy9sb2dpblwiLFxyXG4gICAgICAgIHByb3BzOiB7fVxyXG4gICAgfSxcclxuICAgIC4uLnNlbGVjdE5hdkNvbnRlbnQoe3JlY29yZHMsIGluZGV4ZXMsIGhlbHBlcnN9KVxyXG5dXHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IG5hdkl0ZW0gPSAoe3JlY29yZH0pID0+ICh7XHJcbiAgICB0aXRsZTogcmVjb3JkLmNvbGxlY3Rpb25OYW1lLFxyXG4gICAgY29tcG9uZW50IDoge1xyXG4gICAgICAgIF9jb21wb25lbnQ6IG5hdkNvbnRlbnRDb21wb25lbnROYW1lKHJlY29yZClcclxuICAgIH1cclxufSlcclxuXHJcbiJdLCJuYW1lcyI6WyJjb21wb25lbnQiXSwibWFwcGluZ3MiOiJBQUFPLE1BQU0sT0FBTyxHQUFHLE1BQU07SUFDekI7UUFDSSxJQUFJLEVBQUUsdUJBQXVCO1FBQzdCLFdBQVcsRUFBRSwyQkFBMkI7UUFDeEMsUUFBUSxFQUFFLHNDQUFzQztRQUNoRCxLQUFLLEVBQUU7WUFDSCxTQUFTLEVBQUUsaUJBQWlCO1NBQy9CO0tBQ0o7SUFDRDtRQUNJLElBQUksRUFBRSx1QkFBdUI7UUFDN0IsV0FBVyxFQUFFLDBCQUEwQjtRQUN2QyxRQUFRLEVBQUUsc0NBQXNDO1FBQ2hELEtBQUssRUFBRTtZQUNILFNBQVMsRUFBRSxtQkFBbUI7U0FDakM7S0FDSjs7O0NBQ0osRENmVyxNQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUM7SUFDN0M7UUFDSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMs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 diff --git a/packages/builder/package.json b/packages/builder/package.json index 9595da46f6..904a609ca6 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -36,6 +36,7 @@ "dependencies": { "@budibase/client": "^0.0.16", "@nx-js/compiler-util": "^2.0.0", + "codemirror": "^5.51.0", "date-fns": "^1.29.0", "feather-icons": "^4.21.0", "flatpickr": "^4.5.7", diff --git a/packages/builder/src/builderStore/buildCodeForScreens.js b/packages/builder/src/builderStore/buildCodeForScreens.js new file mode 100644 index 0000000000..fdd2c8d797 --- /dev/null +++ b/packages/builder/src/builderStore/buildCodeForScreens.js @@ -0,0 +1,35 @@ + + +const buildCodeForSingleScreen = (screen) => { + let code = ""; + const walkProps = (props) => { + if(props._code && props._code.trim().length > 0) { + code += buildComponentCode(props) + } + + if(!props._children) return; + + for(let child of props._children) { + walkProps(child); + } + } + + walkProps(screen.props); + + return code; +} + +export const buildCodeForScreens = screens => { + let allfunctions = ""; + for(let screen of screens) { + allfunctions += buildCodeForSingleScreen(screen); + } + + return (`return ({ ${allfunctions} });`); +} + +const buildComponentCode = (componentProps) => +`"${componentProps._id}" : (render, context) => { +${componentProps._code} +}, +`; \ No newline at end of file diff --git a/packages/builder/src/builderStore/store.js b/packages/builder/src/builderStore/store.js index c9dc3da87b..7e52a0e881 100644 --- a/packages/builder/src/builderStore/store.js +++ b/packages/builder/src/builderStore/store.js @@ -22,6 +22,7 @@ import { import { loadLibs, loadLibUrls, loadGeneratorLibs } from "./loadComponentLibraries"; +import { buildCodeForScreens } from "./buildCodeForScreens"; import { uuid } from './uuid'; import { generate_screen_css } from './generate_css'; @@ -97,6 +98,7 @@ export const getStore = () => { store.selectComponent = selectComponent(store); store.setComponentProp = setComponentProp(store); store.setComponentStyle = setComponentStyle(store); + store.setComponentCode = setComponentCode(store); return store; } @@ -669,7 +671,8 @@ const savePackage = (store, s) => { s.components, s.screens, s.pages.unauthenticated.appBody) - } + }, + uiFunctions: buildCodeForScreens(s.screens) }; const data = { @@ -687,6 +690,7 @@ const setCurrentScreen = store => screenName => { s.currentFrontEndItem = screen; s.currentFrontEndType = "screen"; s.currentComponentInfo = getScreenInfo(s.components, screen); + setCurrentScreenFunctions(s); return s; }) } @@ -695,8 +699,9 @@ const setCurrentPage = store => pageName => { store.update(s => { s.currentFrontEndType = "page"; s.currentPageName = pageName; + setCurrentScreenFunctions(s); return s; - }) + }); } const addChildComponent = store => component => { @@ -770,3 +775,22 @@ const setComponentStyle = store => (type, name, value) => { return s; }) } + +const setComponentCode = store => (code) => { + store.update(s => { + s.currentComponentInfo._code = code; + + setCurrentScreenFunctions(s); + // save without messing with the store + _save(s.appname, s.currentFrontEndItem, store, s) + + return s; + }) +} + +const setCurrentScreenFunctions = (s) => { + s.currentScreenFunctions = + s.currentFrontEndItem === "screen" + ? buildCodeForScreens([s.currentFrontEndItem]) + : "({});"; +} diff --git a/packages/builder/src/builderStore/store.js.orig b/packages/builder/src/builderStore/store.js.orig new file mode 100644 index 0000000000..9c753a180e --- /dev/null +++ b/packages/builder/src/builderStore/store.js.orig @@ -0,0 +1,799 @@ +import { + hierarchy as hierarchyFunctions, +} from "../../../core/src"; +import { + filter, cloneDeep, sortBy, + map, last, keys, concat, keyBy, + find, isEmpty, values, +} from "lodash/fp"; +import { + pipe, getNode, validate, + constructHierarchy, templateApi +} from "../common/core"; +import { writable } from "svelte/store"; +import { defaultPagesObject } from "../userInterface/pagesParsing/defaultPagesObject" +import { buildPropsHierarchy } from "../userInterface/pagesParsing/buildPropsHierarchy" +import api from "./api"; +import { isRootComponent, getExactComponent } from "../userInterface/pagesParsing/searchComponents"; +import { rename } from "../userInterface/pagesParsing/renameScreen"; +import { + getNewComponentInfo, getScreenInfo, +} from "../userInterface/pagesParsing/createProps"; +import { + loadLibs, loadLibUrls, loadGeneratorLibs +} from "./loadComponentLibraries"; +<<<<<<< HEAD +import { buildCodeForScreens } from "./buildCodeForScreens"; +======= +import { uuid } from './uuid'; +import { generate_screen_css } from './generate_css'; +>>>>>>> master + +let appname = ""; + +export const getStore = () => { + + const initial = { + apps: [], + appname: "", + hierarchy: {}, + actions: [], + triggers: [], + pages: defaultPagesObject(), + mainUi: {}, + unauthenticatedUi: {}, + components: [], + currentFrontEndItem: null, + currentComponentInfo: null, + currentFrontEndType: "none", + currentPageName: "", + currentComponentProps: null, + currentNodeIsNew: false, + errors: [], + activeNav: "database", + isBackend: true, + hasAppPackage: false, + accessLevels: { version: 0, levels: [] }, + currentNode: null, + libraries: null, + showSettings: false, + useAnalytics: true, + }; + + const store = writable(initial); + + store.initialise = initialise(store, initial); + store.newChildRecord = newRecord(store, false); + store.newRootRecord = newRecord(store, true); + store.selectExistingNode = selectExistingNode(store); + store.newChildIndex = newIndex(store, false); + store.newRootIndex = newIndex(store, true); + store.saveCurrentNode = saveCurrentNode(store); + store.importAppDefinition = importAppDefinition(store); + store.deleteCurrentNode = deleteCurrentNode(store); + store.saveField = saveField(store); + store.deleteField = deleteField(store); + store.saveAction = saveAction(store); + store.deleteAction = deleteAction(store); + store.saveTrigger = saveTrigger(store); + store.deleteTrigger = deleteTrigger(store); + store.saveLevel = saveLevel(store); + store.deleteLevel = deleteLevel(store); + store.setActiveNav = setActiveNav(store); + store.saveScreen = saveScreen(store); + store.refreshComponents = refreshComponents(store); + store.addComponentLibrary = addComponentLibrary(store); + store.renameScreen = renameScreen(store); + store.deleteScreen = deleteScreen(store); + store.setCurrentScreen = setCurrentScreen(store); + store.setCurrentPage = setCurrentPage(store); + store.createScreen = createScreen(store); + store.removeComponentLibrary = removeComponentLibrary(store); + store.addStylesheet = addStylesheet(store); + store.removeStylesheet = removeStylesheet(store); + store.savePage = savePage(store); + store.showFrontend = showFrontend(store); + store.showBackend = showBackend(store); + store.showSettings = showSettings(store); + store.useAnalytics = useAnalytics(store); + store.createGeneratedComponents = createGeneratedComponents(store); + store.addChildComponent = addChildComponent(store); + store.selectComponent = selectComponent(store); + store.setComponentProp = setComponentProp(store); + store.setComponentStyle = setComponentStyle(store); + store.setComponentCode = setComponentCode(store); + return store; +} + +export default getStore; + +const initialise = (store, initial) => async () => { + + appname = window.location.hash + ? last(window.location.hash.substr(1).split("/")) + : ""; + + if (!appname) { + initial.apps = await api.get(`/_builder/api/apps`).then(r => r.json()); + initial.hasAppPackage = false; + store.set(initial); + return initial; + } + + const pkg = await api.get(`/_builder/api/${appname}/appPackage`) + .then(r => r.json()); + + initial.libraries = await loadLibs(appname, pkg); + initial.generatorLibraries = await loadGeneratorLibs(appname, pkg); + initial.loadLibraryUrls = () => loadLibUrls(appname, pkg); + initial.appname = appname; + initial.pages = pkg.pages; + initial.hasAppPackage = true; + initial.hierarchy = pkg.appDefinition.hierarchy; + initial.accessLevels = pkg.accessLevels; + initial.screens = values(pkg.screens); + initial.generators = generatorsArray(pkg.components.generators); + initial.components = values(pkg.components.components); + initial.actions = values(pkg.appDefinition.actions); + initial.triggers = pkg.appDefinition.triggers; + + if (!!initial.hierarchy && !isEmpty(initial.hierarchy)) { + initial.hierarchy = constructHierarchy(initial.hierarchy); + const shadowHierarchy = createShadowHierarchy(initial.hierarchy); + if (initial.currentNode !== null) + initial.currentNode = getNode( + shadowHierarchy, initial.currentNode.nodeId + ); + } + + store.set(initial); + return initial; +} + +const generatorsArray = generators => + pipe(generators, [ + keys, + filter(k => k !== "_lib"), + map(k => generators[k]) + ]); + + +const showSettings = store => show => { + store.update(s => { + s.showSettings = !s.showSettings; + return s; + }); +} + +const useAnalytics = store => useAnalytics => { + store.update(s => { + s.useAnalytics = !s.useAnalytics; + return s; + }); +} + +const showBackend = store => () => { + store.update(s => { + s.isBackend = true; + return s; + }) +} + +const showFrontend = store => () => { + store.update(s => { + s.isBackend = false; + return s; + }) +} + +const newRecord = (store, useRoot) => () => { + store.update(s => { + s.currentNodeIsNew = true; + const shadowHierarchy = createShadowHierarchy(s.hierarchy); + parent = useRoot ? shadowHierarchy + : getNode( + shadowHierarchy, + s.currentNode.nodeId); + s.errors = []; + s.currentNode = templateApi(shadowHierarchy) + .getNewRecordTemplate(parent, "", true); + return s; + }); +} + + +const selectExistingNode = (store) => (nodeId) => { + store.update(s => { + const shadowHierarchy = createShadowHierarchy(s.hierarchy); + s.currentNode = getNode( + shadowHierarchy, nodeId + ); + s.currentNodeIsNew = false; + s.errors = []; + s.activeNav = "database"; + return s; + }) +} + +const newIndex = (store, useRoot) => () => { + store.update(s => { + s.currentNodeIsNew = true; + s.errors = []; + const shadowHierarchy = createShadowHierarchy(s.hierarchy); + parent = useRoot ? shadowHierarchy + : getNode( + shadowHierarchy, + s.currentNode.nodeId); + + s.currentNode = templateApi(shadowHierarchy) + .getNewIndexTemplate(parent); + return s; + }); +} + +const saveCurrentNode = (store) => () => { + store.update(s => { + + const errors = validate.node(s.currentNode); + s.errors = errors; + if (errors.length > 0) { + return s; + } + + const parentNode = getNode( + s.hierarchy, s.currentNode.parent().nodeId); + + const existingNode = getNode( + s.hierarchy, s.currentNode.nodeId); + + let index = parentNode.children.length; + if (!!existingNode) { + // remove existing + index = existingNode.parent().children.indexOf(existingNode); + existingNode.parent().children = pipe(existingNode.parent().children, [ + filter(c => c.nodeId !== existingNode.nodeId) + ]); + } + + // should add node into existing hierarchy + const cloned = cloneDeep(s.currentNode); + templateApi(s.hierarchy).constructNode( + parentNode, + cloned + ); + + const newIndexOfchild = child => { + if (child === cloned) return index; + const currentIndex = parentNode.children.indexOf(child); + return currentIndex >= index ? currentIndex + 1 : currentIndex; + } + + parentNode.children = pipe(parentNode.children, [ + sortBy(newIndexOfchild) + ]); + + if (!existingNode && s.currentNode.type === "record") { + const defaultIndex = templateApi(s.hierarchy) + .getNewIndexTemplate(cloned.parent()); + defaultIndex.name = `all_${cloned.collectionName}`; + defaultIndex.allowedRecordNodeIds = [cloned.nodeId]; + } + + s.currentNodeIsNew = false; + + savePackage(store, s); + + return s; + }); +} + +const importAppDefinition = store => appDefinition => { + store.update(s => { + s.hierarchy = appDefinition.hierarchy; + s.currentNode = appDefinition.hierarchy.children.length > 0 + ? appDefinition.hierarchy.children[0] + : null; + s.actions = appDefinition.actions; + s.triggers = appDefinition.triggers; + s.currentNodeIsNew = false; + return s; + }); +} + +const deleteCurrentNode = store => () => { + store.update(s => { + const nodeToDelete = getNode(s.hierarchy, s.currentNode.nodeId); + s.currentNode = hierarchyFunctions.isRoot(nodeToDelete.parent()) + ? find(n => n != s.currentNode) + (s.hierarchy.children) + : nodeToDelete.parent(); + if (hierarchyFunctions.isRecord(nodeToDelete)) { + nodeToDelete.parent().children = filter(c => c.nodeId !== nodeToDelete.nodeId) + (nodeToDelete.parent().children); + } else { + nodeToDelete.parent().indexes = filter(c => c.nodeId !== nodeToDelete.nodeId) + (nodeToDelete.parent().indexes); + } + s.errors = []; + savePackage(store, s); + return s; + }); +} + +const saveField = databaseStore => (field) => { + databaseStore.update(db => { + db.currentNode.fields = filter(f => f.name !== field.name) + (db.currentNode.fields); + + templateApi(db.hierarchy).addField(db.currentNode, field); + return db; + }); +} + + +const deleteField = databaseStore => field => { + databaseStore.update(db => { + db.currentNode.fields = filter(f => f.name !== field.name) + (db.currentNode.fields); + + return db; + }); +} + + +const saveAction = store => (newAction, isNew, oldAction = null) => { + store.update(s => { + + const existingAction = isNew + ? null + : find(a => a.name === oldAction.name)(s.actions); + + if (existingAction) { + s.actions = pipe(s.actions, [ + map(a => a === existingAction ? newAction : a) + ]); + } else { + s.actions.push(newAction); + } + savePackage(store, s); + return s; + }); +} + +const deleteAction = store => action => { + store.update(s => { + s.actions = filter(a => a.name !== action.name)(s.actions); + savePackage(store, s); + return s; + }); +} + +const saveTrigger = store => (newTrigger, isNew, oldTrigger = null) => { + store.update(s => { + + const existingTrigger = isNew + ? null + : find(a => a.name === oldTrigger.name)(s.triggers); + + if (existingTrigger) { + s.triggers = pipe(s.triggers, [ + map(a => a === existingTrigger ? newTrigger : a) + ]); + } else { + s.triggers.push(newTrigger); + } + savePackage(store, s); + return s; + }); +} + +const deleteTrigger = store => trigger => { + store.update(s => { + s.triggers = filter(t => t.name !== trigger.name)(s.triggers); + return s; + }); +} + +const incrementAccessLevelsVersion = (s) => + s.accessLevels.version = (s.accessLevels.version || 0) + 1; + +const saveLevel = store => (newLevel, isNew, oldLevel = null) => { + store.update(s => { + + const levels = s.accessLevels.levels; + + const existingLevel = isNew + ? null + : find(a => a.name === oldLevel.name)(levels); + + if (existingLevel) { + s.accessLevels.levels = pipe(levels, [ + map(a => a === existingLevel ? newLevel : a) + ]); + } else { + s.accessLevels.levels.push(newLevel); + } + + incrementAccessLevelsVersion(s); + + savePackage(store, s); + return s; + }); +} + +const deleteLevel = store => level => { + store.update(s => { + s.accessLevels.levels = filter(t => t.name !== level.name)(s.accessLevels.levels); + incrementAccessLevelsVersion(s); + savePackage(store, s); + return s; + }); +} + +const setActiveNav = store => navName => { + store.update(s => { + s.activeNav = navName; + return s; + }); +} + +const createShadowHierarchy = hierarchy => + constructHierarchy(JSON.parse(JSON.stringify(hierarchy))); + +const saveScreen = store => (screen) => { + store.update(s => { + return _saveScreen(store, s, screen); + }) +}; + +const _saveScreen = (store, s, screen) => { + const screens = pipe(s.screens, [ + filter(c => c.name !== screen.name), + concat([screen]) + ]); + + s.screens = screens; + s.currentFrontEndItem = screen; + s.currentComponentInfo = getScreenInfo( + s.components, screen); + + api.post(`/_builder/api/${s.appname}/screen`, screen) + .then(() => savePackage(store, s)); + + return s; +} + +const _save = (appname, screen, store, s) => + api.post(`/_builder/api/${appname}/screen`, screen) + .then(() => savePackage(store, s)); + +const createScreen = store => (screenName, layoutComponentName) => { + store.update(s => { + const newComponentInfo = getNewComponentInfo( + s.components, layoutComponentName, screenName); + + s.currentFrontEndItem = newComponentInfo.component; + s.currentComponentInfo = newComponentInfo; + s.currentFrontEndType = "screen"; + + return _saveScreen(store, s, newComponentInfo.component); + }); +}; + +const createGeneratedComponents = store => components => { + store.update(s => { + s.components = [...s.components, ...components]; + s.screens = [...s.screens, ...components]; + + const doCreate = async () => { + for (let c of components) { + await api.post(`/_builder/api/${s.appname}/screen`, c); + } + + await savePackage(store, s); + } + + doCreate(); + + return s; + }); +}; + +const deleteScreen = store => name => { + store.update(s => { + + const components = pipe(s.components, [ + filter(c => c.name !== name) + ]); + + const screens = pipe(s.screens, [ + filter(c => c.name !== name) + ]); + + s.components = components; + s.screens = screens; + if (s.currentFrontEndItem.name === name) { + s.currentFrontEndItem = null; + s.currentFrontEndType = ""; + } + + api.delete(`/_builder/api/${s.appname}/screen/${name}`); + + return s; + }) +} + +const renameScreen = store => (oldname, newname) => { + store.update(s => { + + const { + screens, pages, error, changedScreens + } = rename(s.pages, s.screens, oldname, newname); + + if (error) { + // should really do something with this + return s; + } + + s.screens = screens; + s.pages = pages; + if (s.currentFrontEndItem.name === oldname) + s.currentFrontEndItem.name = newname; + + const saveAllChanged = async () => { + for (let screenName of changedScreens) { + const changedScreen + = getExactComponent(screens, screenName); + await api.post(`/_builder/api/${s.appname}/screen`, changedScreen); + } + } + + api.patch(`/_builder/api/${s.appname}/screen`, { + oldname, newname + }) + .then(() => saveAllChanged()) + .then(() => { + savePackage(store, s); + }); + + return s; + }) +} + +const savePage = store => async page => { + store.update(s => { + if (s.currentFrontEndType !== "page" || !s.currentPageName) { + return s; + } + + s.pages[s.currentPageName] = page; + savePackage(store, s); + return s; + }); +} + +const addComponentLibrary = store => async lib => { + + const response = + await api.get(`/_builder/api/${appname}/componentlibrary?lib=${encodeURI(lib)}`, undefined, false); + + const success = response.status === 200; + + const error = response.status === 404 + ? `Could not find library ${lib}` + : success + ? "" + : response.statusText; + + const components = success + ? await response.json() + : []; + + store.update(s => { + if (success) { + + const componentsArray = []; + for (let c in components) { + componentsArray.push(components[c]); + } + + s.components = pipe(s.components, [ + filter(c => !c.name.startsWith(`${lib}/`)), + concat(componentsArray) + ]); + + s.pages.componentLibraries.push(lib); + savePackage(store, s); + } + + return s; + }) +} + +const removeComponentLibrary = store => lib => { + store.update(s => { + + + s.pages.componentLibraries = filter(l => l !== lib)( + s.pages.componentLibraries); + savePackage(store, s); + + + return s; + }) +} + +const addStylesheet = store => stylesheet => { + store.update(s => { + s.pages.stylesheets.push(stylesheet); + savePackage(store, s); + return s; + }) +} + +const removeStylesheet = store => stylesheet => { + store.update(s => { + s.pages.stylesheets = filter(s => s !== stylesheet)(s.pages.stylesheets); + savePackage(store, s); + return s; + }); +} + +const refreshComponents = store => async () => { + + const componentsAndGenerators = + await api.get(`/_builder/api/${db.appname}/components`).then(r => r.json()); + + const components = pipe(componentsAndGenerators.components, [ + keys, + map(k => ({ ...componentsAndGenerators[k], name: k })) + ]); + + store.update(s => { + s.components = pipe(s.components, [ + filter(c => !isRootComponent(c)), + concat(components) + ]); + s.generators = componentsAndGenerators.generators; + return s; + }); +}; + +const savePackage = (store, s) => { + + const appDefinition = { + hierarchy: s.hierarchy, + triggers: s.triggers, + actions: keyBy("name")(s.actions), + props: { + main: buildPropsHierarchy( + s.components, + s.screens, + s.pages.main.appBody), + unauthenticated: buildPropsHierarchy( + s.components, + s.screens, + s.pages.unauthenticated.appBody) + }, + uiFunctions: buildCodeForScreens(s.screens) + }; + + const data = { + appDefinition, + accessLevels: s.accessLevels, + pages: s.pages, + } + + return api.post(`/_builder/api/${s.appname}/appPackage`, data); +} + +const setCurrentScreen = store => screenName => { + store.update(s => { + const screen = getExactComponent(s.screens, screenName); + s.currentFrontEndItem = screen; + s.currentFrontEndType = "screen"; + s.currentComponentInfo = getScreenInfo(s.components, screen); + setCurrentScreenFunctions(s); + return s; + }) +} + +const setCurrentPage = store => pageName => { + store.update(s => { + s.currentFrontEndType = "page"; + s.currentPageName = pageName; + setCurrentScreenFunctions(s); + return s; + }); +} + +const addChildComponent = store => component => { + + store.update(s => { + const newComponent = getNewComponentInfo( + s.components, component); + + let children = s.currentComponentInfo.component ? + s.currentComponentInfo.component.props._children : + s.currentComponentInfo._children; + + const component_definition = Object.assign( + cloneDeep(newComponent.fullProps), { + _component: component, + _styles: { position: {}, layout: {} }, + _id: uuid() + }) + + if (children) { + if (s.currentComponentInfo.component) { + s.currentComponentInfo.component.props._children = children.concat(component_definition); + } else { + s.currentComponentInfo._children = children.concat(component_definition) + } + } else { + if (s.currentComponentInfo.component) { + s.currentComponentInfo.component.props._children = [component_definition]; + } else { + s.currentComponentInfo._children = [component_definition] + } + } + + _saveScreen(store, s, s.currentFrontEndItem); + + _saveScreen(store, s, s.currentFrontEndItem); + + return s; + }) +} + +const selectComponent = store => component => { + store.update(s => { + s.currentComponentInfo = component; + return s; + }) + +} + +const setComponentProp = store => (name, value) => { + store.update(s => { + const current_component = s.currentComponentInfo; + s.currentComponentInfo[name] = value; + _saveScreen(store, s, s.currentFrontEndItem); + s.currentComponentInfo = current_component; + return s; + }) +} + +const setComponentStyle = store => (type, name, value) => { + store.update(s => { + if (!s.currentComponentInfo._styles) { + s.currentComponentInfo._styles = {}; + } + s.currentComponentInfo._styles[type][name] = value; + s.currentFrontEndItem._css = generate_screen_css(s.currentFrontEndItem.props._children) + + // save without messing with the store + _save(s.appname, s.currentFrontEndItem, store, s) + + return s; + }) +} + +const setComponentCode = store => (code) => { + store.update(s => { + s.currentComponentInfo._code = code; + + setCurrentScreenFunctions(s); + // save without messing with the store + _save(s.appname, s.currentFrontEndItem, store, s) + + return s; + }) +} + +const setCurrentScreenFunctions = (s) => { + s.currentScreenFunctions = + s.currentFrontEndItem === "screen" + ? buildCodeForScreens([s.currentFrontEndItem]) + : "({});"; +} diff --git a/packages/builder/src/common/Icons/CircleIndicator.svelte b/packages/builder/src/common/Icons/CircleIndicator.svelte new file mode 100644 index 0000000000..9c0fe034f4 --- /dev/null +++ b/packages/builder/src/common/Icons/CircleIndicator.svelte @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/builder/src/common/Icons/index.js b/packages/builder/src/common/Icons/index.js index c00ebb3ce4..2aeb386bd7 100644 --- a/packages/builder/src/common/Icons/index.js +++ b/packages/builder/src/common/Icons/index.js @@ -4,5 +4,6 @@ export { default as TerminalIcon } from './Terminal.svelte'; export { default as InputIcon } from './Input.svelte'; export { default as ImageIcon } from './Image.svelte'; export { default as ArrowDownIcon } from './ArrowDown.svelte'; -export { default as EventsIcon } from './Events.svelte'; +export { default as CircleIndicator } from './CircleIndicator.svelte'; export { default as PencilIcon } from './Pencil.svelte'; +export { default as EventsIcon } from './Events.svelte'; \ No newline at end of file diff --git a/packages/builder/src/common/Icons/index.js.orig b/packages/builder/src/common/Icons/index.js.orig new file mode 100644 index 0000000000..69f195a161 --- /dev/null +++ b/packages/builder/src/common/Icons/index.js.orig @@ -0,0 +1,12 @@ +export { default as LayoutIcon } from './Layout.svelte'; +export { default as PaintIcon } from './Paint.svelte'; +export { default as TerminalIcon } from './Terminal.svelte'; +export { default as InputIcon } from './Input.svelte'; +export { default as ImageIcon } from './Image.svelte'; +export { default as ArrowDownIcon } from './ArrowDown.svelte'; +<<<<<<< HEAD +export { default as CircleIndicator } from './CircleIndicator.svelte'; +======= +export { default as EventsIcon } from './Events.svelte'; +export { default as PencilIcon } from './Pencil.svelte'; +>>>>>>> master diff --git a/packages/builder/src/index.html b/packages/builder/src/index.html index 184103a067..8ce642e160 100644 --- a/packages/builder/src/index.html +++ b/packages/builder/src/index.html @@ -8,6 +8,8 @@ + + diff --git a/packages/builder/src/main.js b/packages/builder/src/main.js index 723e771208..9c2a6b5066 100644 --- a/packages/builder/src/main.js +++ b/packages/builder/src/main.js @@ -10,6 +10,8 @@ import "/assets/budibase-logo.png"; import "/assets/budibase-logo-only.png"; import "uikit/dist/css/uikit.min.css"; import "uikit/dist/js/uikit.min.js"; +import "codemirror/lib/codemirror.css"; +import 'codemirror/theme/monokai.css'; const app = new App({ target: document.getElementById("app") diff --git a/packages/builder/src/userInterface/CodeEditor.svelte b/packages/builder/src/userInterface/CodeEditor.svelte index f4f2d7aa93..dbe87d8eff 100644 --- a/packages/builder/src/userInterface/CodeEditor.svelte +++ b/packages/builder/src/userInterface/CodeEditor.svelte @@ -1,47 +1,83 @@ -

Code

-

Use the code box below to add snippets of javascript to enhance your webapp

+
+
-
- +
+
+ {"}"} +
+
+
+ + + + + + diff --git a/packages/builder/src/userInterface/ComponentPanel.svelte b/packages/builder/src/userInterface/ComponentPanel.svelte index d4d982f2e2..1de496bb1a 100644 --- a/packages/builder/src/userInterface/ComponentPanel.svelte +++ b/packages/builder/src/userInterface/ComponentPanel.svelte @@ -2,12 +2,13 @@ import PropsView from "./PropsView.svelte"; import { store } from "../builderStore"; import IconButton from "../common/IconButton.svelte"; - import { LayoutIcon, PaintIcon, TerminalIcon, EventsIcon } from '../common/Icons/'; + import { LayoutIcon, PaintIcon, TerminalIcon, CircleIndicator, EventsIcon } from '../common/Icons/'; import CodeEditor from './CodeEditor.svelte'; import LayoutEditor from './LayoutEditor.svelte'; import EventsEditor from "./EventsEditor"; let current_view = 'props'; + let codeEditor; $: component = $store.currentComponentInfo; $: originalName = component.name; @@ -34,7 +35,12 @@
  • -
  • @@ -54,10 +60,13 @@ {:else if current_view === 'events'} - {:else} - {/if} + + {:else}

    This is a screen, this will be dealt with later

    @@ -113,6 +122,7 @@ li button { padding: 12px; outline: none; cursor: pointer; + position: relative; } .selected { @@ -120,4 +130,11 @@ li button { background: var(--background-button)!important; } +.button-indicator { + position: absolute; + top: 8px; + right: 10px; + color: var(--button-text); +} + diff --git a/packages/builder/src/userInterface/ComponentPanel.svelte.orig b/packages/builder/src/userInterface/ComponentPanel.svelte.orig new file mode 100644 index 0000000000..88464032da --- /dev/null +++ b/packages/builder/src/userInterface/ComponentPanel.svelte.orig @@ -0,0 +1,149 @@ + + +
    +
      +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    + + {#if !componentInfo.component} +
    + + {#if current_view === 'props'} + + {:else if current_view === 'layout'} + +<<<<<<< HEAD +======= + {:else if current_view === 'events'} + + {:else} + +>>>>>>> master + {/if} + + + +
    + {:else} +

    This is a screen, this will be dealt with later

    + {/if} + +
    + + + diff --git a/packages/builder/src/userInterface/CurrentItemPreview.svelte b/packages/builder/src/userInterface/CurrentItemPreview.svelte index bb586aa474..84420c7bdd 100644 --- a/packages/builder/src/userInterface/CurrentItemPreview.svelte +++ b/packages/builder/src/userInterface/CurrentItemPreview.svelte @@ -24,6 +24,7 @@ hierarchy: $store.hierarchy, appRootPath: "" }; + @@ -39,6 +40,8 @@ ${stylesheetLinks} + +
    + +
    + {#each propDefs as [prop_name, prop_value], index} + +
    + + + +
    + + {/each} + +
    + +
    + + + diff --git a/packages/builder/tests/buildCodeForScreen.spec.js b/packages/builder/tests/buildCodeForScreen.spec.js new file mode 100644 index 0000000000..4d6282ee81 --- /dev/null +++ b/packages/builder/tests/buildCodeForScreen.spec.js @@ -0,0 +1,64 @@ +import { buildCodeForScreens } from "../src/builderStore/buildCodeForScreens"; + +describe("buildCodeForScreen",() => { + + it("should package _code into runnable function, for simple screen props", () => { + const screen = { + props: { + _id: "1234", + _code: "render('render argument');" + } + } + + let renderArg; + const render = (arg) => { + renderArg = arg; + } + const uiFunctions = getFunctions(screen); + + const targetfunction = uiFunctions[screen.props._id]; + expect(targetfunction).toBeDefined(); + + targetfunction(render); + + expect(renderArg).toBe("render argument"); + + }); + + it("should package _code into runnable function, for _children ", () => { + const screen = { + props: { + _id: "parent", + _code: "render('parent argument');", + _children: [ + { + _id: "child1", + _code: "render('child 1 argument');" + }, + { + _id: "child2", + _code: "render('child 2 argument');" + } + ] + } + } + + let renderArg; + const render = (arg) => { + renderArg = arg; + } + const uiFunctions = getFunctions(screen); + + const targetfunction = uiFunctions["child2"]; + expect(targetfunction).toBeDefined(); + + targetfunction(render); + + expect(renderArg).toBe("child 2 argument"); + + }) + +}); + +const getFunctions = (screen) => + new Function(buildCodeForScreens([screen]))(); diff --git a/packages/client/src/index.js b/packages/client/src/index.js index 7114cde443..8da1657cf6 100644 --- a/packages/client/src/index.js +++ b/packages/client/src/index.js @@ -6,6 +6,8 @@ export const loadBudibase = async ({ window, localStorage, uiFunctions }) => { const appDefinition = window["##BUDIBASE_APPDEFINITION##"]; + const uiFunctionsFromWindow = window["##BUDIBASE_APPDEFINITION##"]; + uiFunctions = uiFunctionsFromWindow || uiFunctions; const userFromStorage = localStorage.getItem("budibase:user") diff --git a/packages/client/src/render/initialiseChildren.js b/packages/client/src/render/initialiseChildren.js index a466b9dcaf..3c6cec74ae 100644 --- a/packages/client/src/render/initialiseChildren.js +++ b/packages/client/src/render/initialiseChildren.js @@ -48,7 +48,7 @@ export const _initialiseChildren = (initialiseOpts) => parentNode: treeNode, componentConstructor,uiFunctions, htmlElement, anchor, initialProps, - bb, document}); + bb}); for(let comp of renderedComponentsThisIteration) { comp.unsubscribe = bind(comp.component); diff --git a/packages/client/src/render/renderComponent.js b/packages/client/src/render/renderComponent.js index ea8e2e281d..ea91045546 100644 --- a/packages/client/src/render/renderComponent.js +++ b/packages/client/src/render/renderComponent.js @@ -2,7 +2,7 @@ export const renderComponent = ({ componentConstructor, uiFunctions, htmlElement, anchor, props, - initialProps, bb, document, + initialProps, bb, parentNode}) => { const func = initialProps._id diff --git a/packages/server/utilities/builder/buildApp.js b/packages/server/utilities/builder/buildApp.js index f2791c29f8..76a0ef9342 100644 --- a/packages/server/utilities/builder/buildApp.js +++ b/packages/server/utilities/builder/buildApp.js @@ -83,11 +83,9 @@ const buildIndexHtml = async (config, appname, appPath, pages, pageName) => { const buildClientAppDefinition = async (config, appname, appdefinition, appPath, pages, pageName) => { - const appPublicPath = publicPath(appPath, pageName); const appRootPath = rootPath(config, appname); - const componentLibraries = []; @@ -129,6 +127,7 @@ const buildClientAppDefinition = async (config, appname, appdefinition, appPath, } await writeFile(filename, - `window['##BUDIBASE_APPDEFINITION##'] = ${JSON.stringify(clientAppDefObj)}`); +`window['##BUDIBASE_APPDEFINITION##'] = ${JSON.stringify(clientAppDefObj)}; +window['##BUDIBASE_UIFUNCTIONS##'] = ${appdefinition.uiFunctions}`); } \ No newline at end of file diff --git a/packages/standard-components/dist/generators.js b/packages/standard-components/dist/generators.js index 921321c87a..7fd547ea88 100644 --- a/packages/standard-components/dist/generators.js +++ b/packages/standard-components/dist/generators.js @@ -204,4 +204,4 @@ const buttons = () => [ ]; export { app, buttons, forms, headers, indexTables, nav }; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9ycy5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL2dlbmVyYXRvcnMvaGVhZGVyc0dlbmVyYXRvci5qcyIsIi4uL3NyYy9nZW5lcmF0b3JzL2Zvcm1zR2VuZXJhdG9yLmpzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaW5kZXhUYWJsZXNHZW5lcmF0b3IuanMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9uYXZHZW5lcmF0b3IuanMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hcHBHZW5lcmF0b3IuanMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idXR0b25zR2VuZXJhdG9yLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBoZWFkZXJzID0gKCkgPT4gW1xuICAgIHtcbiAgICAgICAgbmFtZTogXCJjb21tb24vSDFcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiSGVhZGVyIDFcIixcbiAgICAgICAgaW5oZXJpdHM6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvdGV4dFwiLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgZm9udDogXCIyMHB0XCIsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJjb21tb24vSDJcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiSGVhZGVyIDJcIixcbiAgICAgICAgaW5oZXJpdHM6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvdGV4dFwiLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgZm9udDogXCIxNXB0XCIsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJjb21tb24vSDNcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiSGVhZGVyIDNcIixcbiAgICAgICAgaW5oZXJpdHM6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvdGV4dFwiLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgZm9udDogXCIxMnB0IGJvbGRcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcImNvbW1vbi9INFwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJIZWFkZXIgNFwiLFxuICAgICAgICBpbmhlcml0czogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy90ZXh0XCIsXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBmb250OiBcIjEwcHQgYm9sZFwiLFxuICAgICAgICB9XG4gICAgfVxuXSIsImltcG9ydCB7aGVhZGVyc30gZnJvbSBcIi4vaGVhZGVyc0dlbmVyYXRvclwiO1xuXG5leHBvcnQgY29uc3QgZm9ybXMgPSAoe3JlY29yZHMsIGluZGV4ZXN9KSA9PiBcbiAgICBbLi4uaGVhZGVycyh7cmVjb3JkcywgaW5kZXhlc30pLFxuICAgIC4uLnJlY29yZHMubWFwKHJvb3QpXTtcblxuY29uc3Qgcm9vdCA9IHJlY29yZCA9PiAoe1xuICAgIG5hbWU6IGAke3JlY29yZC5uYW1lfSBGb3JtYCxcbiAgICBkZXNjcmlwdGlvbjogYEFsbCBmaWVsZHMgb24gcmVjb3JkICcke3JlY29yZC5ub2RlS2V5KCl9JyBgLFxuICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL3N0YWNrcGFuZWxcIixcbiAgICBwcm9wczoge1xuICAgICAgICBkaXJlY3Rpb246IFwidmVydGljYWxcIixcbiAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250cm9sOiB7XG4gICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IFwiY29tbW9uL0gxXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBgRWRpdCAke3JlY29yZC5uYW1lfWAsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZvcm0ocmVjb3JkKSxcbiAgICAgICAgICAgIHNhdmVDYW5jZWxCdXR0b25zKHJlY29yZClcbiAgICAgICAgXVxuICAgIH1cbn0pIFxuXG5jb25zdCBmb3JtID0gcmVjb3JkID0+ICh7XG4gICAgY29udHJvbDoge1xuICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2Zvcm1cIixcbiAgICAgICAgZm9ybUNvbnRyb2xzOiBcbiAgICAgICAgICAgIHJlY29yZC5maWVsZHMubWFwKGYgPT4gKHtcbiAgICAgICAgICAgICAgICBsYWJlbDogZi5sYWJlbCxcbiAgICAgICAgICAgICAgICBjb250cm9sOiB7XG4gICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvdGV4dGJveFwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCIjI2Jic3RhdGVcIjpgY3VycmVudCR7cmVjb3JkLm5hbWV9LiR7Zi5uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIiMjYmJzb3VyY2VcIjpcInN0b3JlXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKVxuICAgIH1cbn0pXG5cbmNvbnN0IHNhdmVDYW5jZWxCdXR0b25zID0gKHJlY29yZCkgPT4gKHtcbiAgICBjb250cm9sOiB7XG4gICAgICAgIF9jb21wb25lbnQ6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvc3RhY2twYW5lbFwiLFxuICAgICAgICBkaXJlY3Rpb246IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgcGFkZGVkUGFuZWxGb3JCdXR0b24oe1xuICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IFwiY29tbW9uL1ByaW1hcnkgQnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgY29udGVudFRleHQ6IGBTYXZlICR7cmVjb3JkLm5hbWV9YCxcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiBbICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcIiMjZXZlbnRIYW5kbGVyVHlwZVwiOiBcIlNhdmUgUmVjb3JkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVQYXRoOiBgY3VycmVudCR7cmVjb3JkLm5hbWV9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcGFkZGVkUGFuZWxGb3JCdXR0b24oe1xuICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IFwiY29tbW9uL1NlY29uZGFyeSBCdXR0b25cIixcbiAgICAgICAgICAgICAgICBjb250ZW50VGV4dDogYENhbmNlbGAsXG4gICAgICAgICAgICAgICAgb25DbGljazogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcIiMjZXZlbnRIYW5kbGVyVHlwZVwiOiBcIlNhdmUgUmVjb3JkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVQYXRoOiBgY3VycmVudCR7cmVjb3JkLm5hbWV9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIF1cbiAgICB9XG59KVxuXG5jb25zdCBwYWRkZWRQYW5lbEZvckJ1dHRvbiA9IChidXR0b24pID0+ICh7XG4gICAgY29udHJvbDoge1xuICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL3BhbmVsXCIsXG4gICAgICAgIHBhZGRpbmc6IFwiMjBweFwiLFxuICAgICAgICBjb21wb25lbnQ6IGJ1dHRvblxuICAgIH1cbn0pO1xuXG4iLCJleHBvcnQgY29uc3QgaW5kZXhUYWJsZXMgPSAoe2luZGV4ZXMsIGhlbHBlcnN9KSA9PiBcbiAgICBpbmRleGVzLmZpbHRlcihpID0+IGkucGFyZW50KCkudHlwZSA9PT0gXCJyb290XCIpXG4gICAgICAgICAgIC5tYXAoaSA9PiBpbmRleFRhYmxlKGksIGhlbHBlcnMpKTtcblxuZXhwb3J0IGNvbnN0IGluZGV4VGFibGVQcm9wcyA9IChpbmRleCwgaGVscGVycykgPT4gKHtcbiAgICBkYXRhOiB7XG4gICAgICAgIFwiIyNiYnN0YXRlXCI6aW5kZXgubm9kZUtleSgpLFxuICAgICAgICBcIiMjYmJzb3VyY2VcIjpcInN0b3JlXCJcbiAgICB9LFxuICAgIGNvbHVtbnM6IGhlbHBlcnMuaW5kZXhTY2hlbWEoaW5kZXgpLm1hcChjb2x1bW4pXG59KTtcblxuY29uc3QgaW5kZXhUYWJsZSA9IChpbmRleCwgaGVscGVycykgPT4gKHtcbiAgICBuYW1lOiBgdGFibGVzLyR7aW5kZXgubmFtZX0gVGFibGVgLFxuICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL3RhYmxlXCIsXG4gICAgcHJvcHM6IGluZGV4VGFibGVQcm9wcyhpbmRleCwgaGVscGVycylcbn0pO1xuXG5jb25zdCBjb2x1bW4gPSAoY29sKSA9PiAoe1xuICAgIHRpdGxlOiBjb2wubmFtZSxcbiAgICB2YWx1ZToge1xuICAgICAgICBcIiMjYmJzdGF0ZVwiOiBjb2wubmFtZSxcbiAgICAgICAgXCIjI2Jic291cmNlXCI6XCJjb250ZXh0XCJcbiAgICB9XG59KSIsImltcG9ydCB7aW5kZXhUYWJsZXN9IGZyb20gXCIuL2luZGV4VGFibGVzR2VuZXJhdG9yXCI7XG5cbmV4cG9ydCBjb25zdCBuYXYgPSAoe3JlY29yZHMsIGluZGV4ZXMsIGhlbHBlcnN9KSA9PiBbXG4gICAge1xuICAgICAgICBuYW1lOiBcIkFwcGxpY2F0aW9uIFJvb3RcIixcbiAgICAgICAgaW5oZXJpdHM6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvbmF2XCIsXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBpdGVtczogaW5kZXhlc1xuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGkgPT4gaS5wYXJlbnQoKS50eXBlID09PSBcInJvb3RcIilcbiAgICAgICAgICAgICAgICAgICAgLm1hcChuYXZJdGVtKSxcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbToge1xuICAgICAgICAgICAgICAgIFwiIyNiYnN0YXRlXCI6IFwic2VsZWN0ZWROYXZcIixcbiAgICAgICAgICAgICAgICBcIiMjYmJzdGF0ZWZhbGxiYWNrXCI6IHJlY29yZHNbMF0uY29sbGVjdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgXCIjI2Jic291cmNlXCI6XCJzdG9yZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSxcbiAgICAuLi5pbmRleFRhYmxlcyh7cmVjb3JkcywgaW5kZXhlcywgaGVscGVyc30pXG5dXG5cblxuZXhwb3J0IGNvbnN0IG5hdkl0ZW0gPSAoaW5kZXgpID0+ICh7XG4gICAgdGl0bGU6IGluZGV4Lm5hbWUsXG4gICAgY29tcG9uZW50IDoge1xuICAgICAgICBfY29tcG9uZW50OiBgdGFibGVzLyR7aW5kZXgubmFtZX0gVGFibGVgXG4gICAgfVxufSlcblxuIiwiaW1wb3J0IHsgZm9ybXMgfSBmcm9tIFwiLi9mb3Jtc0dlbmVyYXRvclwiO1xuaW1wb3J0IHsgbmF2IH0gZnJvbSBcIi4vbmF2R2VuZXJhdG9yXCI7XG5cbmV4cG9ydCBjb25zdCBhcHAgPSAocGFyYW1zKSA9PiB7XG5cbiAgICByZXR1cm4gW1xuICAgICAgICAuLi5uYXYocGFyYW1zKSxcbiAgICAgICAgLi4uZm9ybXMocGFyYW1zKVxuICAgIF07XG59XG5cbiIsImV4cG9ydCBjb25zdCBidXR0b25zID0gKCkgPT4gW1xuICAgIHtcbiAgICAgICAgbmFtZTogXCJjb21tb24vUHJpbWFyeSBCdXR0b25cIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiYSBzdHlsZWQgYnV0dG9uXCIsXG4gICAgICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2J1dHRvblwiLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgcGFkZGluZzogXCI1cHggN3B4XCIsXG4gICAgICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICNFRUVcIixcbiAgICAgICAgICAgIGNvbG9yOiBcIiM1RjYzNjhcIixcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IFwiIyNmMmYyZjJcIixcbiAgICAgICAgICAgIGhvdmVyQ29sb3I6IFwiYmxhY2tcIixcbiAgICAgICAgICAgIGhvdmVyQmFja2dyb3VuZDogXCIjY2NjY2NjXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcImNvbW1vbi9TZWNvbmRhcnkgQnV0dG9uXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcImEgc3R5bGVkIGJ1dHRvblwiLFxuICAgICAgICBpbmhlcml0czogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy9idXR0b25cIixcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIHBhZGRpbmc6IFwiNXB4IDdweFwiLFxuICAgICAgICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjRUVFXCIsXG4gICAgICAgICAgICBjb2xvcjogXCIjNUY2MzY4XCIsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBcIiMjZjJmMmYyXCIsXG4gICAgICAgICAgICBob3ZlckNvbG9yOiBcImJsYWNrXCIsXG4gICAgICAgICAgICBob3ZlckJhY2tncm91bmQ6IFwiI2NjY2NjY1wiXG4gICAgICAgIH1cbiAgICB9XG5dIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFZLE1BQUMsT0FBTyxHQUFHLE1BQU07QUFDN0IsSUFBSTtBQUNKLFFBQVEsSUFB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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9ycy5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL2dlbmVyYXRvcnMvaGVhZGVyc0dlbmVyYXRvci5qcyIsIi4uL3NyYy9nZW5lcmF0b3JzL2Zvcm1zR2VuZXJhdG9yLmpzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaW5kZXhUYWJsZXNHZW5lcmF0b3IuanMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9uYXZHZW5lcmF0b3IuanMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hcHBHZW5lcmF0b3IuanMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idXR0b25zR2VuZXJhdG9yLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBoZWFkZXJzID0gKCkgPT4gW1xyXG4gICAge1xyXG4gICAgICAgIG5hbWU6IFwiY29tbW9uL0gxXCIsXHJcbiAgICAgICAgZGVzY3JpcHRpb246IFwiSGVhZGVyIDFcIixcclxuICAgICAgICBpbmhlcml0czogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy90ZXh0XCIsXHJcbiAgICAgICAgcHJvcHM6IHtcclxuICAgICAgICAgICAgZm9udDogXCIyMHB0XCIsXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBuYW1lOiBcImNvbW1vbi9IMlwiLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkhlYWRlciAyXCIsXHJcbiAgICAgICAgaW5oZXJpdHM6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvdGV4dFwiLFxyXG4gICAgICAgIHByb3BzOiB7XHJcbiAgICAgICAgICAgIGZvbnQ6IFwiMTVwdFwiLFxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgbmFtZTogXCJjb21tb24vSDNcIixcclxuICAgICAgICBkZXNjcmlwdGlvbjogXCJIZWFkZXIgM1wiLFxyXG4gICAgICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL3RleHRcIixcclxuICAgICAgICBwcm9wczoge1xyXG4gICAgICAgICAgICBmb250OiBcIjEycHQgYm9sZFwiLFxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgbmFtZTogXCJjb21tb24vSDRcIixcclxuICAgICAgICBkZXNjcmlwdGlvbjogXCJIZWFkZXIgNFwiLFxyXG4gICAgICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL3RleHRcIixcclxuICAgICAgICBwcm9wczoge1xyXG4gICAgICAgICAgICBmb250OiBcIjEwcHQgYm9sZFwiLFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXSIsImltcG9ydCB7aGVhZGVyc30gZnJvbSBcIi4vaGVhZGVyc0dlbmVyYXRvclwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZvcm1zID0gKHtyZWNvcmRzLCBpbmRleGVzfSkgPT4gXHJcbiAgICBbLi4uaGVhZGVycyh7cmVjb3JkcywgaW5kZXhlc30pLFxyXG4gICAgLi4ucmVjb3Jkcy5tYXAocm9vdCldO1xyXG5cclxuY29uc3Qgcm9vdCA9IHJlY29yZCA9PiAoe1xyXG4gICAgbmFtZTogYCR7cmVjb3JkLm5hbWV9IEZvcm1gLFxyXG4gICAgZGVzY3JpcHRpb246IGBBbGwgZmllbGRzIG9uIHJlY29yZCAnJHtyZWNvcmQubm9kZUtleSgpfScgYCxcclxuICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL3N0YWNrcGFuZWxcIixcclxuICAgIHByb3BzOiB7XHJcbiAgICAgICAgZGlyZWN0aW9uOiBcInZlcnRpY2FsXCIsXHJcbiAgICAgICAgY2hpbGRyZW46IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IFwiY29tbW9uL0gxXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGBFZGl0ICR7cmVjb3JkLm5hbWV9YCxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZm9ybShyZWNvcmQpLFxyXG4gICAgICAgICAgICBzYXZlQ2FuY2VsQnV0dG9ucyhyZWNvcmQpXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG59KSBcclxuXHJcbmNvbnN0IGZvcm0gPSByZWNvcmQgPT4gKHtcclxuICAgIGNvbnRyb2w6IHtcclxuICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2Zvcm1cIixcclxuICAgICAgICBmb3JtQ29udHJvbHM6IFxyXG4gICAgICAgICAgICByZWNvcmQuZmllbGRzLm1hcChmID0+ICh7XHJcbiAgICAgICAgICAgICAgICBsYWJlbDogZi5sYWJlbCxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2w6IHtcclxuICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL3RleHRib3hcIixcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIiMjYmJzdGF0ZVwiOmBjdXJyZW50JHtyZWNvcmQubmFtZX0uJHtmLm5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCIjI2Jic291cmNlXCI6XCJzdG9yZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSlcclxuICAgIH1cclxufSlcclxuXHJcbmNvbnN0IHNhdmVDYW5jZWxCdXR0b25zID0gKHJlY29yZCkgPT4gKHtcclxuICAgIGNvbnRyb2w6IHtcclxuICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL3N0YWNrcGFuZWxcIixcclxuICAgICAgICBkaXJlY3Rpb246IFwiaG9yaXpvbnRhbFwiLFxyXG4gICAgICAgIGNoaWxkcmVuOiBbXHJcbiAgICAgICAgICAgIHBhZGRlZFBhbmVsRm9yQnV0dG9uKHtcclxuICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IFwiY29tbW9uL1ByaW1hcnkgQnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50VGV4dDogYFNhdmUgJHtyZWNvcmQubmFtZX1gLFxyXG4gICAgICAgICAgICAgICAgb25DbGljazogWyAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIyNldmVudEhhbmRsZXJUeXBlXCI6IFwiU2F2ZSBSZWNvcmRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVQYXRoOiBgY3VycmVudCR7cmVjb3JkLm5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHBhZGRlZFBhbmVsRm9yQnV0dG9uKHtcclxuICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IFwiY29tbW9uL1NlY29uZGFyeSBCdXR0b25cIixcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRUZXh0OiBgQ2FuY2VsYCxcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIyNldmVudEhhbmRsZXJUeXBlXCI6IFwiU2F2ZSBSZWNvcmRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVQYXRoOiBgY3VycmVudCR7cmVjb3JkLm5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICBdXHJcbiAgICB9XHJcbn0pXHJcblxyXG5jb25zdCBwYWRkZWRQYW5lbEZvckJ1dHRvbiA9IChidXR0b24pID0+ICh7XHJcbiAgICBjb250cm9sOiB7XHJcbiAgICAgICAgX2NvbXBvbmVudDogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy9wYW5lbFwiLFxyXG4gICAgICAgIHBhZGRpbmc6IFwiMjBweFwiLFxyXG4gICAgICAgIGNvbXBvbmVudDogYnV0dG9uXHJcbiAgICB9XHJcbn0pO1xyXG5cclxuIiwiZXhwb3J0IGNvbnN0IGluZGV4VGFibGVzID0gKHtpbmRleGVzLCBoZWxwZXJzfSkgPT4gXHJcbiAgICBpbmRleGVzLmZpbHRlcihpID0+IGkucGFyZW50KCkudHlwZSA9PT0gXCJyb290XCIpXHJcbiAgICAgICAgICAgLm1hcChpID0+IGluZGV4VGFibGUoaSwgaGVscGVycykpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGluZGV4VGFibGVQcm9wcyA9IChpbmRleCwgaGVscGVycykgPT4gKHtcclxuICAgIGRhdGE6IHtcclxuICAgICAgICBcIiMjYmJzdGF0ZVwiOmluZGV4Lm5vZGVLZXkoKSxcclxuICAgICAgICBcIiMjYmJzb3VyY2VcIjpcInN0b3JlXCJcclxuICAgIH0sXHJcbiAgICBjb2x1bW5zOiBoZWxwZXJzLmluZGV4U2NoZW1hKGluZGV4KS5tYXAoY29sdW1uKVxyXG59KTtcclxuXHJcbmNvbnN0IGluZGV4VGFibGUgPSAoaW5kZXgsIGhlbHBlcnMpID0+ICh7XHJcbiAgICBuYW1lOiBgdGFibGVzLyR7aW5kZXgubmFtZX0gVGFibGVgLFxyXG4gICAgaW5oZXJpdHM6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvdGFibGVcIixcclxuICAgIHByb3BzOiBpbmRleFRhYmxlUHJvcHMoaW5kZXgsIGhlbHBlcnMpXHJcbn0pO1xyXG5cclxuY29uc3QgY29sdW1uID0gKGNvbCkgPT4gKHtcclxuICAgIHRpdGxlOiBjb2wubmFtZSxcclxuICAgIHZhbHVlOiB7XHJcbiAgICAgICAgXCIjI2Jic3RhdGVcIjogY29sLm5hbWUsXHJcbiAgICAgICAgXCIjI2Jic291cmNlXCI6XCJjb250ZXh0XCJcclxuICAgIH1cclxufSkiLCJpbXBvcnQge2luZGV4VGFibGVzfSBmcm9tIFwiLi9pbmRleFRhYmxlc0dlbmVyYXRvclwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IG5hdiA9ICh7cmVjb3JkcywgaW5kZXhlcywgaGVscGVyc30pID0+IFtcclxuICAgIHtcclxuICAgICAgICBuYW1lOiBcIkFwcGxpY2F0aW9uIFJvb3RcIixcclxuICAgICAgICBpbmhlcml0czogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy9uYXZcIixcclxuICAgICAgICBwcm9wczoge1xyXG4gICAgICAgICAgICBpdGVtczogaW5kZXhlc1xyXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoaSA9PiBpLnBhcmVudCgpLnR5cGUgPT09IFwicm9vdFwiKVxyXG4gICAgICAgICAgICAgICAgICAgIC5tYXAobmF2SXRlbSksXHJcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbToge1xyXG4gICAgICAgICAgICAgICAgXCIjI2Jic3RhdGVcIjogXCJzZWxlY3RlZE5hdlwiLFxyXG4gICAgICAgICAgICAgICAgXCIjI2Jic3RhdGVmYWxsYmFja1wiOiByZWNvcmRzWzBdLmNvbGxlY3Rpb25OYW1lLFxyXG4gICAgICAgICAgICAgICAgXCIjI2Jic291cmNlXCI6XCJzdG9yZVwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgfSxcclxuICAgIC4uLmluZGV4VGFibGVzKHtyZWNvcmRzLCBpbmRleGVzLCBoZWxwZXJzfSlcclxuXVxyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBuYXZJdGVtID0gKGluZGV4KSA9PiAoe1xyXG4gICAgdGl0bGU6IGluZGV4Lm5hbWUsXHJcbiAgICBjb21wb25lbnQgOiB7XHJcbiAgICAgICAgX2NvbXBvbmVudDogYHRhYmxlcy8ke2luZGV4Lm5hbWV9IFRhYmxlYFxyXG4gICAgfVxyXG59KVxyXG5cclxuIiwiaW1wb3J0IHsgZm9ybXMgfSBmcm9tIFwiLi9mb3Jtc0dlbmVyYXRvclwiO1xyXG5pbXBvcnQgeyBuYXYgfSBmcm9tIFwiLi9uYXZHZW5lcmF0b3JcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBhcHAgPSAocGFyYW1zKSA9PiB7XHJcblxyXG4gICAgcmV0dXJuIFtcclxuICAgICAgICAuLi5uYXYocGFyYW1zKSxcclxuICAgICAgICAuLi5mb3JtcyhwYXJhbXMpXHJcbiAgICBdO1xyXG59XHJcblxyXG4iLCJleHBvcnQgY29uc3QgYnV0dG9ucyA9ICgpID0+IFtcclxuICAgIHtcclxuICAgICAgICBuYW1lOiBcImNvbW1vbi9QcmltYXJ5IEJ1dHRvblwiLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcImEgc3R5bGVkIGJ1dHRvblwiLFxyXG4gICAgICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2J1dHRvblwiLFxyXG4gICAgICAgIHByb3BzOiB7XHJcbiAgICAgICAgICAgIHBhZGRpbmc6IFwiNXB4IDdweFwiLFxyXG4gICAgICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICNFRUVcIixcclxuICAgICAgICAgICAgY29sb3I6IFwiIzVGNjM2OFwiLFxyXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBcIiMjZjJmMmYyXCIsXHJcbiAgICAgICAgICAgIGhvdmVyQ29sb3I6IFwiYmxhY2tcIixcclxuICAgICAgICAgICAgaG92ZXJCYWNrZ3JvdW5kOiBcIiNjY2NjY2NcIlxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgbmFtZTogXCJjb21tb24vU2Vjb25kYXJ5IEJ1dHRvblwiLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcImEgc3R5bGVkIGJ1dHRvblwiLFxyXG4gICAgICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2J1dHRvblwiLFxyXG4gICAgICAgIHByb3BzOiB7XHJcbiAgICAgICAgICAgIHBhZGRpbmc6IFwiNXB4IDdweFwiLFxyXG4gICAgICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICNFRUVcIixcclxuICAgICAgICAgICAgY29sb3I6IFwiIzVGNjM2OFwiLFxyXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBcIiMjZjJmMmYyXCIsXHJcbiAgICAgICAgICAgIGhvdmVyQ29sb3I6IFwiYmxhY2tcIixcclxuICAgICAgICAgICAgaG92ZXJCYWNrZ3JvdW5kOiBcIiNjY2NjY2NcIlxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBWSxNQUFDLE9BQU8sR0FBRyxNQUFNO0lBQ3pCO1FBQ0ksSUFBSSxFQUFFLFdBQVc7UUFDakIsV0FBVyxFQUFFLFVBQVU7UUFDdkIsUUFBUSxFQUFFLG9DQUFvQztRQUM5QyxLQUFLLEVBQUU7WUFDSCxJQUFJLEVBQUUsTUFBTTtTQUNmO0tBQ0o7SUFDRDtRQUNJLElBQUksRUFBRSxXQUFXO1FBQ2pCLFdBQVcsRUFBRSxVQUFVO1FBQ3ZCLFFBQVEsRUFBRSxvQ0FBb0M7UUFDOUMsS0FBSyxFQUFFO1lBQ0gsSUFBSSxFQUFFLE1BQU07U0FDZjtLQUNKO0lBQ0Q7UUFDSSxJQUFJLEVBQUUsV0FBVztRQUNqQixXQUFXLEVBQUUsVUFBVTtRQUN2QixRQUFRLEVBQUUsb0NBQW9DO1FBQzlDLEtBQUssRUFBRTtZQUNILElBQUksRUFBRSxXQUFXO1NBQ3BCO0tBQ0o7SUFDRDtRQUNJLElBQUksRUFBRSxXQUFXO1FBQ2pCLFdBQVcsRUFBRSxVQUFVO1FBQ3ZCLFFBQVEsRUFBRSxvQ0FBb0M7UUFDOUMsS0FBSyxFQUFFO1lBQ0gsSUFBSSxFQUFFLFdBQVc7U0FDcEI7S0FDSjs7O0NBQ0osREMvQlcsTUFBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxP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